summaryrefslogtreecommitdiffhomepage
path: root/Private/Source
diff options
context:
space:
mode:
authorAmlal <amlalelmahrouss@icloud.com>2024-04-23 07:03:05 +0000
committerAmlal <amlalelmahrouss@icloud.com>2024-04-23 07:03:05 +0000
commit3cd65eae51017c242dfdce26693395b016d7856f (patch)
treea49b25fcf9776ce916b0ab3b795f475f113d9873 /Private/Source
parent09e1c9738bc5dce28a6e181ebc585f0dea01f109 (diff)
parent80c4a0ad8ff603036d5582d799c74840d5de806d (diff)
Merged in MHR-11 (pull request #2)
MHR-11
Diffstat (limited to 'Private/Source')
-rw-r--r--Private/Source/PEFCodeManager.cxx37
-rw-r--r--Private/Source/ProcessScheduler.cxx6
-rw-r--r--Private/Source/ProcessTeam.cxx6
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