summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Sources
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-22 11:02:34 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-06-22 11:02:34 +0200
commitefd60f780ba66b363dc564b99a09b60163b9edcb (patch)
treeddb8b4564cabc0578cedc0b2b2ec4941a9b3e35a /Kernel/Sources
parentafb57783942238da489de6677941ecc64f9d8929 (diff)
IMP: Support fork based operations inside the file manager, update PEF
loader to load from forks, we might need a non-fork loader class though. Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel/Sources')
-rw-r--r--Kernel/Sources/FileManager.cxx38
-rw-r--r--Kernel/Sources/PEFCodeManager.cxx46
2 files changed, 57 insertions, 27 deletions
diff --git a/Kernel/Sources/FileManager.cxx b/Kernel/Sources/FileManager.cxx
index ee285ae1..9f81c260 100644
--- a/Kernel/Sources/FileManager.cxx
+++ b/Kernel/Sources/FileManager.cxx
@@ -81,6 +81,26 @@ namespace NewOS
/// @return
Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, Int32 flags, SizeT size)
{
+ auto dataForkName = kNewFSDataFork;
+ this->Write(dataForkName, node, data, flags, size);
+ }
+
+ /// @brief Read from filesystem fork.
+ /// @param node the catalog node.
+ /// @param flags the flags with it.
+ /// @param sz the size to read.
+ /// @return
+ VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz)
+ {
+ auto dataForkName = kNewFSDataFork;
+ return this->Read(dataForkName, node, flags, sz);
+ }
+
+ Void NewFilesystemManager::Write(_Input const Char* name,
+ _Input NodePtr node, _Input VoidPtr data,
+ _Input Int32 flags,
+ _Input SizeT size)
+ {
if (!size ||
size > kNewFSForkSize)
return;
@@ -90,19 +110,15 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = kNewFSDataFork;
-
if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size,
- dataForkName);
+ name);
}
- /// @brief Read from filesystem fork.
- /// @param node the catalog node.
- /// @param flags the flags with it.
- /// @param sz the size to read.
- /// @return
- VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz)
+ _Output VoidPtr NewFilesystemManager::Read(_Input const Char* name,
+ _Input NodePtr node,
+ _Input Int32 flags,
+ _Input SizeT sz)
{
if (sz > kNewFSForkSize)
return nullptr;
@@ -112,11 +128,9 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = kNewFSDataFork;
-
if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz,
- dataForkName);
+ name);
return nullptr;
}
diff --git a/Kernel/Sources/PEFCodeManager.cxx b/Kernel/Sources/PEFCodeManager.cxx
index e259885b..f8b50e56 100644
--- a/Kernel/Sources/PEFCodeManager.cxx
+++ b/Kernel/Sources/PEFCodeManager.cxx
@@ -5,7 +5,6 @@
------------------------------------------- */
#include <KernelKit/DebugOutput.hpp>
-#include <KernelKit/FileManager.hpp>
#include <KernelKit/KernelHeap.hpp>
#include <KernelKit/PEFCodeManager.hxx>
#include <KernelKit/ProcessScheduler.hxx>
@@ -49,15 +48,15 @@ namespace NewOS
PEFLoader::PEFLoader(const Char* path)
: fCachedBlob(nullptr), fBad(false), fFatBinary(false)
{
- OwnPtr<FileStream<Char>> file;
+ fFile.New(const_cast<Char*>(path), cRestrictRB);
- file.New(const_cast<Char*>(path), kRestrictRB);
-
- if (StringBuilder::Equals(file->MIME(), this->MIME()))
+ if (StringBuilder::Equals(fFile->MIME(), this->MIME()))
{
fPath = StringBuilder::Construct(path).Leak();
- fCachedBlob = file->Read();
+ auto cPefHeader = "PEFContainer";
+
+ fCachedBlob = fFile->Read(cPefHeader);
PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob);
@@ -85,7 +84,7 @@ namespace NewOS
fBad = true;
ke_delete_ke_heap(fCachedBlob);
-
+
fCachedBlob = nullptr;
}
}
@@ -95,6 +94,8 @@ namespace NewOS
{
if (fCachedBlob)
ke_delete_ke_heap(fCachedBlob);
+
+ fFile.Delete();
}
VoidPtr PEFLoader::FindSymbol(const char* name, Int32 kind)
@@ -104,8 +105,12 @@ namespace NewOS
PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob);
- PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>(
- (UIntPtr)fCachedBlob + sizeof(PEFContainer));
+ StringView cPefHeaderStr = StringBuilder::Construct("PEFContainerHeader:").Leak().Leak();
+ cPefHeaderStr += name;
+
+ auto blob = fFile->Read(cPefHeaderStr.CData());
+
+ PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>(blob);
constexpr auto cMangleCharacter = '$';
const char* cContainerKinds[] = {".code64", ".data64", ".zero64", nullptr};
@@ -114,15 +119,18 @@ namespace NewOS
switch (kind)
{
- case kPefCode: {
+ case kPefCode:
+ {
errOrSym = StringBuilder::Construct(cContainerKinds[0]); // code symbol.
break;
}
- case kPefData: {
+ case kPefData:
+ {
errOrSym = StringBuilder::Construct(cContainerKinds[1]); // data symbol.
break;
}
- case kPefZero: {
+ case kPefZero:
+ {
errOrSym = StringBuilder::Construct(cContainerKinds[2]); // block starting symbol.
break;
}
@@ -152,15 +160,23 @@ namespace NewOS
if (container_header->Cpu != Detail::rt_get_pef_platform())
{
if (!this->fFatBinary)
+ {
+ ke_delete_ke_heap(blob);
return nullptr;
+ }
}
- return (VoidPtr)(static_cast<UIntPtr*>(fCachedBlob) +
- container_header->Offset);
+ Char* blobRet = new Char[container_header->Size];
+
+ rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size);
+
+ ke_delete_ke_heap(blob);
+ return blobRet;
}
}
}
-
+
+ ke_delete_ke_heap(blob);
return nullptr;
}