From 3ce4b68fc3f1ad9ead503bb3f69bff11b4a3183a Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 7 Jan 2025 08:33:01 +0100 Subject: FIX: KAN-12 (EPM GPF) ADD: Dylib object instead of DLL objects. ADD: Introduce CoreGfx instead of GfxMgr. Signed-off-by: Amlal El Mahrouss --- dev/Kernel/src/DriveMgr.cc | 44 +++++++------- dev/Kernel/src/FS/NeFS.cc | 5 +- dev/Kernel/src/IDLLObject.cc | 15 ----- dev/Kernel/src/IDylibObject.cc | 15 +++++ dev/Kernel/src/IPEFDLLObject.cc | 103 --------------------------------- dev/Kernel/src/IPEFDylibObject.cc | 103 +++++++++++++++++++++++++++++++++ dev/Kernel/src/UserProcessScheduler.cc | 4 +- 7 files changed, 143 insertions(+), 146 deletions(-) delete mode 100644 dev/Kernel/src/IDLLObject.cc create mode 100644 dev/Kernel/src/IDylibObject.cc delete mode 100644 dev/Kernel/src/IPEFDLLObject.cc create mode 100644 dev/Kernel/src/IPEFDylibObject.cc (limited to 'dev/Kernel/src') diff --git a/dev/Kernel/src/DriveMgr.cc b/dev/Kernel/src/DriveMgr.cc index 8e8d5ab2..8ac5bdff 100644 --- a/dev/Kernel/src/DriveMgr.cc +++ b/dev/Kernel/src/DriveMgr.cc @@ -154,34 +154,34 @@ namespace Kernel return trait; } - namespace Detail + namespace Detect { - Void ioi_detect_drive(DriveTrait* trait) + Void io_detect_drive(DriveTrait& trait) { - static EPM_BOOT_BLOCK block_struct; + EPM_BOOT_BLOCK block_struct; - trait->fPacket.fPacketLba = kEPMBootBlockLba; - trait->fPacket.fPacketSize = sizeof(EPM_BOOT_BLOCK); - trait->fPacket.fPacketContent = &block_struct; + trait.fPacket.fPacketLba = kEPMBootBlockLba; + trait.fPacket.fPacketSize = sizeof(EPM_BOOT_BLOCK); + trait.fPacket.fPacketContent = &block_struct; - rt_copy_memory((VoidPtr) "fs/detect-packet", trait->fPacket.fPacketMime, + rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime, rt_string_len("fs/detect-packet")); - trait->fInit(&trait->fPacket); + trait.fInit(&trait.fPacket); - trait->fInput(&trait->fPacket); + trait.fInput(&trait.fPacket); - if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait->fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0) + if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait.fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0) { - trait->fPacket.fPacketReadOnly = NO; - trait->fKind = kMassStorageDisc | kEPMDrive; + trait.fPacket.fPacketReadOnly = NO; + trait.fKind = kMassStorageDisc | kEPMDrive; kcout << "Formatted Disk is EPM (Mass Storage)\r"; } else { - trait->fPacket.fPacketReadOnly = YES; - trait->fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive; + trait.fPacket.fPacketReadOnly = YES; + trait.fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive; kcout << "Scheme Found: " << block_struct.Name << endl; @@ -189,12 +189,12 @@ namespace Kernel kcout << "Disk partition is unknown (Read Only)\r"; } - rt_copy_memory((VoidPtr) "*/*", trait->fPacket.fPacketMime, + rt_copy_memory((VoidPtr) "*/*", trait.fPacket.fPacketMime, rt_string_len("*/*")); - trait->fPacket.fPacketLba = 0; - trait->fPacket.fPacketSize = 0UL; - trait->fPacket.fPacketContent = nullptr; + trait.fPacket.fPacketLba = 0; + trait.fPacket.fPacketSize = 0UL; + trait.fPacket.fPacketContent = nullptr; } } // namespace Detail @@ -202,9 +202,9 @@ namespace Kernel /// @return the new drive. (returns kEPMDrive if EPM formatted) DriveTrait io_construct_main_drive() noexcept { - DriveTrait trait{}; + DriveTrait trait; - const auto kMainDrive = "/Mount/OS:"; + constexpr auto kMainDrive = "/Mount/OS:"; rt_copy_memory((VoidPtr)kMainDrive, trait.fName, rt_string_len(kMainDrive)); @@ -216,9 +216,9 @@ namespace Kernel trait.fInit = io_drv_init; trait.fDriveKind = io_drv_kind; - kcout << "Detecting partition scheme of: " << trait.fName << ".\r"; + Detect::io_detect_drive(trait); - Detail::ioi_detect_drive(&trait); + kcout << "Detecting partition scheme of: " << trait.fName << ".\r"; return trait; } diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc index b0a7c6c6..902b57a8 100644 --- a/dev/Kernel/src/FS/NeFS.cc +++ b/dev/Kernel/src/FS/NeFS.cc @@ -1055,10 +1055,7 @@ namespace Kernel::Detail kcout << "Creating A:\r"; kDiskMountpoint.A() = io_construct_main_drive(); - kDiskMountpoint.B() = io_construct_blank_drive(); - kDiskMountpoint.C() = io_construct_blank_drive(); - kDiskMountpoint.D() = io_construct_blank_drive(); - + kcout << "Creating A: [ OK ]\r"; return true; diff --git a/dev/Kernel/src/IDLLObject.cc b/dev/Kernel/src/IDLLObject.cc deleted file mode 100644 index f0129eca..00000000 --- a/dev/Kernel/src/IDLLObject.cc +++ /dev/null @@ -1,15 +0,0 @@ -/* - * ======================================================== - * - * minoskrnl - * Copyright (C) 2024, Theater Quality Corp, all rights reserved., all rights reserved. - * - * ======================================================== - */ - -#include -#include - -#include - -using namespace Kernel; diff --git a/dev/Kernel/src/IDylibObject.cc b/dev/Kernel/src/IDylibObject.cc new file mode 100644 index 00000000..27e2d14f --- /dev/null +++ b/dev/Kernel/src/IDylibObject.cc @@ -0,0 +1,15 @@ +/* + * ======================================================== + * + * minoskrnl + * Copyright (C) 2024, Theater Quality Corp, all rights reserved., all rights reserved. + * + * ======================================================== + */ + +#include +#include + +#include + +using namespace Kernel; diff --git a/dev/Kernel/src/IPEFDLLObject.cc b/dev/Kernel/src/IPEFDLLObject.cc deleted file mode 100644 index 1b8d2451..00000000 --- a/dev/Kernel/src/IPEFDLLObject.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* - * ======================================================== - * - * minoskrnl - * Copyright (C) 2024, Theater Quality Corp, all rights reserved., all rights reserved. - * - * ======================================================== - */ - -#include -#include -#include -#include -#include -#include - -/* ------------------------------------------- - - Revision History: - - 01/02/24: Reworked dll ABI, expect a rtl_init_dylib and - rtl_fini_dylib (amlel) 15/02/24: Breaking changes, changed the name of the - routines. (amlel) - - 07/28/24: Replace rt_library_free with rtl_fini_dylib - - 10/8/24: FIX: Fix log comment. - - ------------------------------------------- */ - -using namespace Kernel; - -/***********************************************************************************/ -/// @file IPEFDLLObject.cc -/// @brief PEF's DLL runtime. -/***********************************************************************************/ - -/***********************************************************************************/ -/** @brief Library initializer. */ -/***********************************************************************************/ - -EXTERN_C IDLL rtl_init_dylib(UserThread& header) -{ - IDLL dll_obj = tls_new_class(); - - if (!dll_obj) - { - header.Crash(); - return nullptr; - } - - dll_obj->Mount(tls_new_class()); - - if (!dll_obj->Get()) - { - tls_delete_class(dll_obj); - header.Crash(); - - return nullptr; - } - - dll_obj->Get()->ImageObject = - header.Image.fBlob; - - if (!dll_obj->Get()->ImageObject) - { - tls_delete_class(dll_obj); - header.Crash(); - - return nullptr; - } - - dll_obj->Get()->ImageEntrypointOffset = - dll_obj->Load(kPefStart, rt_string_len(kPefStart, 0), kPefCode); - - return dll_obj; -} - -/***********************************************************************************/ -/** @brief Frees the dll_obj. */ -/** @note Please check if the dll_obj got freed! */ -/** @param dll_obj The dll_obj to free. */ -/** @param successful Reports if successful or not. */ -/***********************************************************************************/ - -EXTERN_C Void rtl_fini_dylib(UserThread& header, IDLL dll_obj, Bool* successful) -{ - MUST_PASS(successful); - - // sanity check (will also trigger a bug check if this fails) - if (dll_obj == nullptr) - { - *successful = false; - header.Crash(); - } - - delete dll_obj->Get(); - delete dll_obj; - - dll_obj = nullptr; - - *successful = true; -} diff --git a/dev/Kernel/src/IPEFDylibObject.cc b/dev/Kernel/src/IPEFDylibObject.cc new file mode 100644 index 00000000..1e2831ef --- /dev/null +++ b/dev/Kernel/src/IPEFDylibObject.cc @@ -0,0 +1,103 @@ +/* + * ======================================================== + * + * minoskrnl + * Copyright (C) 2024, Theater Quality Corp, all rights reserved., all rights reserved. + * + * ======================================================== + */ + +#include +#include +#include +#include +#include +#include + +/* ------------------------------------------- + + Revision History: + + 01/02/24: Reworked dll ABI, expect a rtl_init_dylib and + rtl_fini_dylib (amlel) 15/02/24: Breaking changes, changed the name of the + routines. (amlel) + + 07/28/24: Replace rt_library_free with rtl_fini_dylib + + 10/8/24: FIX: Fix log comment. + + ------------------------------------------- */ + +using namespace Kernel; + +/***********************************************************************************/ +/// @file IPEFDylibObject.cc +/// @brief PEF's Dylib runtime. +/***********************************************************************************/ + +/***********************************************************************************/ +/** @brief Library initializer. */ +/***********************************************************************************/ + +EXTERN_C IDylib rtl_init_dylib(UserThread& thread) +{ + IDylib dll_obj = tls_new_class(); + + if (!dll_obj) + { + thread.Crash(); + return nullptr; + } + + dll_obj->Mount(new IPEFDylibObject::DLL_TRAITS()); + + if (!dll_obj->Get()) + { + tls_delete_class(dll_obj); + thread.Crash(); + + return nullptr; + } + + dll_obj->Get()->ImageObject = + thread.Image.fBlob; + + if (!dll_obj->Get()->ImageObject) + { + tls_delete_class(dll_obj); + thread.Crash(); + + return nullptr; + } + + dll_obj->Get()->ImageEntrypointOffset = + dll_obj->Load(kPefStart, rt_string_len(kPefStart, 0), kPefCode); + + return dll_obj; +} + +/***********************************************************************************/ +/** @brief Frees the dll_obj. */ +/** @note Please check if the dll_obj got freed! */ +/** @param dll_obj The dll_obj to free. */ +/** @param successful Reports if successful or not. */ +/***********************************************************************************/ + +EXTERN_C Void rtl_fini_dylib(UserThread& thread, IDylib dll_obj, Bool* successful) +{ + MUST_PASS(successful); + + // sanity check (will also trigger a bug check if this fails) + if (dll_obj == nullptr) + { + *successful = false; + thread.Crash(); + } + + delete dll_obj->Get(); + delete dll_obj; + + dll_obj = nullptr; + + *successful = true; +} diff --git a/dev/Kernel/src/UserProcessScheduler.cc b/dev/Kernel/src/UserProcessScheduler.cc index 55d3474b..6cd7fb0b 100644 --- a/dev/Kernel/src/UserProcessScheduler.cc +++ b/dev/Kernel/src/UserProcessScheduler.cc @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include #include @@ -252,7 +252,7 @@ namespace Kernel { Bool success = false; - rtl_fini_dylib(*this, reinterpret_cast(this->DylibDelegate), &success); + rtl_fini_dylib(*this, reinterpret_cast(this->DylibDelegate), &success); if (!success) { -- cgit v1.2.3