diff options
| -rw-r--r-- | dev/kernel/KernelKit/PEFCodeMgr.h | 4 | ||||
| -rw-r--r-- | dev/kernel/src/PEFCodeMgr.cc | 61 |
2 files changed, 29 insertions, 36 deletions
diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h index 899a1869..d61aa863 100644 --- a/dev/kernel/KernelKit/PEFCodeMgr.h +++ b/dev/kernel/KernelKit/PEFCodeMgr.h @@ -63,8 +63,8 @@ class PEFLoader : public LoaderInterface { Ref<KString> fPath; VoidPtr fCachedBlob; - bool fFatBinary; - bool fBad; + BOOL fFatBinary{}; + BOOL fBad{}; }; namespace Utils { diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 71e4e232..d61a3cab 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -78,10 +78,9 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { return; - } else if (container->Magic[0] == kPefMagicFat[0] && - container->Magic[1] == kPefMagicFat[1] && container->Magic[2] == kPefMagicFat[2] && - container->Magic[3] == kPefMagicFat[3] && container->Magic[4] == kPefMagicFat[4] && - container->Abi == kPefAbi) { + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && + container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && + container->Magic[4] == kPefMagicFat[4] && container->Abi == kPefAbi) { /// This is a fat binary, treat it as such. this->fFatBinary = true; return; @@ -111,9 +110,7 @@ PEFLoader::~PEFLoader() { /// @param kind kind of symbol we want. /***********************************************************************************/ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) { - if (!fCachedBlob || fBad || !name) return ErrorOr<VoidPtr>{kErrorInvalidData}; - - PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob); + if (fBad || !name) return ErrorOr<VoidPtr>{kErrorInvalidData}; auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); @@ -152,44 +149,40 @@ ErrorOr<VoidPtr> PEFLoader::FindSymbol(const Char* name, Int32 kind) { } error_or_symbol.Leak().Leak() += name; - - for (SizeT index = 0; index < container->Count; ++index) { - if (KStringBuilder::Equals(container_header[index].Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header[index].Kind == kind) { - if (container_header[index].Cpu != Detail::ldr_get_platform()) { - if (!this->fFatBinary) { - mm_free_ptr(blob); - return ErrorOr<VoidPtr>{kErrorInvalidData}; - } + if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { + if (container_header->Kind == kind) { + if (container_header->Cpu != Detail::ldr_get_platform()) { + if (!this->fFatBinary) { + mm_free_ptr(blob); + return ErrorOr<VoidPtr>{kErrorInvalidData}; } + } - Char* container_blob_value = new Char[container_header[index].VMSize]; + Char* container_blob_value = new Char[container_header->VMSize]; - rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), - container_blob_value, container_header[index].VMSize, - container_header[index].VMSize); + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, + container_header->VMSize, container_header->VMSize); - mm_free_ptr(blob); + mm_free_ptr(blob); - kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - auto ret = 0; + auto ret = 0; - auto pages_count = (container_header[index].VMSize + kPageSize - 1) / kPageSize; + auto pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; - for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + (i_vm * kPageSize)), - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { + ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); - if (ret != kErrorSuccess) { - delete[] container_blob_value; - return ErrorOr<VoidPtr>{kErrorInvalidData}; - } + if (ret != kErrorSuccess) { + delete[] container_blob_value; + return ErrorOr<VoidPtr>{kErrorInvalidData}; } - - return ErrorOr<VoidPtr>{container_blob_value}; } + + return ErrorOr<VoidPtr>{container_blob_value}; } } |
