diff options
| author | Amlal <amlalelmahrouss@icloud.com> | 2024-04-23 07:03:05 +0000 |
|---|---|---|
| committer | Amlal <amlalelmahrouss@icloud.com> | 2024-04-23 07:03:05 +0000 |
| commit | 3cd65eae51017c242dfdce26693395b016d7856f (patch) | |
| tree | a49b25fcf9776ce916b0ab3b795f475f113d9873 /Private/Source | |
| parent | 09e1c9738bc5dce28a6e181ebc585f0dea01f109 (diff) | |
| parent | 80c4a0ad8ff603036d5582d799c74840d5de806d (diff) | |
Merged in MHR-11 (pull request #2)
MHR-11
Diffstat (limited to 'Private/Source')
| -rw-r--r-- | Private/Source/PEFCodeManager.cxx | 37 | ||||
| -rw-r--r-- | Private/Source/ProcessScheduler.cxx | 6 | ||||
| -rw-r--r-- | Private/Source/ProcessTeam.cxx | 6 |
3 files changed, 31 insertions, 18 deletions
diff --git a/Private/Source/PEFCodeManager.cxx b/Private/Source/PEFCodeManager.cxx index 2f60f085..6ff5730d 100644 --- a/Private/Source/PEFCodeManager.cxx +++ b/Private/Source/PEFCodeManager.cxx @@ -6,12 +6,12 @@ #include <KernelKit/DebugOutput.hpp> #include <KernelKit/FileManager.hpp> +#include <KernelKit/KernelHeap.hpp> #include <KernelKit/PEFCodeManager.hxx> #include <KernelKit/ProcessScheduler.hpp> #include <NewKit/Defines.hpp> #include <NewKit/ErrorID.hpp> #include <NewKit/KernelCheck.hpp> -#include <KernelKit/KernelHeap.hpp> #include <NewKit/OwnPtr.hpp> #include <NewKit/String.hpp> @@ -44,10 +44,11 @@ PEFLoader::PEFLoader(const VoidPtr blob) : fCachedBlob(nullptr) { /// @brief PEF loader constructor. /// @param path the filesystem path. -PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fBad(false) { +PEFLoader::PEFLoader(const Char *path) + : fCachedBlob(nullptr), fBad(false), fFatBinary(false) { OwnPtr<FileStream<Char>> file; - file.New(const_cast<Char*>(path), kRestrictRB); + file.New(const_cast<Char *>(path), kRestrictRB); if (StringBuilder::Equals(file->MIME(), this->MIME())) { fPath = StringBuilder::Construct(path).Leak(); @@ -60,12 +61,17 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fBad(false) { container->Magic[0] == kPefMagic[0] && container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && - container->Magic[3] == kPefMagic[3] && container->Abi == kPefAbi) { - if (container->Kind != kPefKindObject && - container->Kind != kPefKindDebug) { - kcout << "CodeManager: Info: Good executable. can proceed.\n"; - return; - } + container->Magic[3] == kPefMagic[3] && + container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { + return; + } else if (container->Magic[4] == kPefMagic[0] && + container->Magic[3] == kPefMagic[1] && + container->Magic[2] == kPefMagic[2] && + container->Magic[1] == kPefMagic[3] && + container->Magic[0] == kPefMagic[0] && container->Abi == kPefAbi) { + /// This is a fat binary. + this->fFatBinary = true; + return; } kcout << "CodeManager: Warning: Executable format error!\n"; @@ -102,7 +108,7 @@ VoidPtr PEFLoader::FindSymbol(const char *name, Int32 kind) { break; } case kPefZero: { - errOrSym = StringBuilder::Construct(".page_zero$"); + errOrSym = StringBuilder::Construct(".zero64$"); break; } default: @@ -122,9 +128,14 @@ VoidPtr PEFLoader::FindSymbol(const char *name, Int32 kind) { for (SizeT index = 0; index < container->Count; ++index) { if (StringBuilder::Equals(container_header->Name, errOrSym.Leak().Leak().CData())) { - if (container_header->Kind == kind) + if (container_header->Kind == kind) { + if (container_header->Cpu != Detail::rt_get_pef_platform()) { + if (!this->fFatBinary) return nullptr; + } + return (VoidPtr)(static_cast<UIntPtr *>(fCachedBlob) + container_header->Offset); + } } } @@ -156,7 +167,9 @@ bool execute_from_image(PEFLoader &exec) noexcept { Ref<ProcessHeader> refProc = proc; proc.Kind = ProcessHeader::kUserKind; - rt_copy_memory(exec.FindSymbol(kPefAppnameCommandHdr, kPefData), proc.Name, rt_string_len((const Char*)exec.FindSymbol(kPefAppnameCommandHdr, kPefData))); + rt_copy_memory(exec.FindSymbol(kPefAppnameCommandHdr, kPefData), proc.Name, + rt_string_len((const Char *)exec.FindSymbol( + kPefAppnameCommandHdr, kPefData))); return ProcessScheduler::Shared().Leak().Add(refProc); } diff --git a/Private/Source/ProcessScheduler.cxx b/Private/Source/ProcessScheduler.cxx index 202dcec5..6d766d27 100644 --- a/Private/Source/ProcessScheduler.cxx +++ b/Private/Source/ProcessScheduler.cxx @@ -6,7 +6,7 @@ /***********************************************************************************/ /// @file ProcessScheduler.cxx -/// @brief ProcessHeader Scheduler API. +/// @brief Process scheduler. /***********************************************************************************/ #include <KernelKit/ProcessScheduler.hpp> @@ -146,7 +146,7 @@ void ProcessHeader::Exit(Int32 exit_code) { SizeT ProcessScheduler::Add(Ref<ProcessHeader> &process) { if (!process) return -1; - + if (!process.Leak().Image) { if (process.Leak().Kind != ProcessHeader::kLibKind) { return -kErrorNoEntrypoint; @@ -225,7 +225,7 @@ Ref<ProcessScheduler> ProcessScheduler::Shared() { } /// @brief Gets current running process. -/// @return +/// @return Ref<ProcessHeader> &ProcessScheduler::GetCurrent() { return mTeam.AsRef(); } PID &ProcessHelper::GetCurrentPID() { diff --git a/Private/Source/ProcessTeam.cxx b/Private/Source/ProcessTeam.cxx index df4cd55d..dea603dc 100644 --- a/Private/Source/ProcessTeam.cxx +++ b/Private/Source/ProcessTeam.cxx @@ -6,18 +6,18 @@ /***********************************************************************************/ /// @file ProcessTeam.cxx -/// @brief Process Team API. +/// @brief Process teams. /***********************************************************************************/ #include <KernelKit/ProcessScheduler.hpp> namespace NewOS { /// @brief Process list array getter. -/// @return +/// @return MutableArray<Ref<ProcessHeader>>& ProcessTeam::AsArray() { return mProcessList; } /// @brief Current process getter. -/// @return +/// @return Ref<ProcessHeader>& ProcessTeam::AsRef() { return mCurrentProcess; } } // namespace NewOS |
