diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-21 08:50:57 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-11-21 08:51:40 +0100 |
| commit | 6ed8a39c1bd3083297b41e981a2bf4bdbe2abd1f (patch) | |
| tree | 183713eb331a92e4e1ce061263cf91a208c7c400 /dev/ZKAKit/src | |
| parent | 50439432a85976605dbb18e3cd2161f888d2e17d (diff) | |
IMP: Add UserProcessImage structure to hold the code/entrypoint of the process.
IMP: Use IDLLObject instead of IPEFDLLObject.
IMP: Refactor DeviceInterface to IDeviceObject.
ADD: rt_jump_to_address when you want to use a custom stack.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit/src')
| -rw-r--r-- | dev/ZKAKit/src/CodeMgr.cc | 14 | ||||
| -rw-r--r-- | dev/ZKAKit/src/DriveMgr.cc | 5 | ||||
| -rw-r--r-- | dev/ZKAKit/src/IPEFDLLObject.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/KString.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/src/PEFCodeMgr.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Stop.cc | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Storage/ATADeviceInterface.cc | 6 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 45 |
10 files changed, 35 insertions, 57 deletions
diff --git a/dev/ZKAKit/src/CodeMgr.cc b/dev/ZKAKit/src/CodeMgr.cc index 5b5d471b..a4502f58 100644 --- a/dev/ZKAKit/src/CodeMgr.cc +++ b/dev/ZKAKit/src/CodeMgr.cc @@ -16,16 +16,14 @@ namespace Kernel /// @return if the process was started or not. ProcessID rtl_create_process(MainKind main, const Char* process_name) noexcept { - kcout << "Validating process header...\r"; - - if (!main) - return No; + if (!main || + !process_name || + *process_name == 0) + return kProcessInvalidID; UserProcess* process_hdr = new UserProcess(); - kcout << "Setting-up process data...\r"; - - process_hdr->Code = reinterpret_cast<VoidPtr>(main); + process_hdr->Image.fCode = reinterpret_cast<VoidPtr>(main); process_hdr->Kind = UserProcess::kExectuableKind; process_hdr->StackSize = kib_cast(16); @@ -33,8 +31,6 @@ namespace Kernel ProcessID id = UserProcessScheduler::The().Spawn(process_hdr); - delete process_hdr; - return id; } } // namespace Kernel diff --git a/dev/ZKAKit/src/DriveMgr.cc b/dev/ZKAKit/src/DriveMgr.cc index 024d1d76..b609c2f7 100644 --- a/dev/ZKAKit/src/DriveMgr.cc +++ b/dev/ZKAKit/src/DriveMgr.cc @@ -145,7 +145,7 @@ namespace Kernel trait.fInit = io_drv_unimplemented; trait.fDriveKind = io_drv_kind; - kcout << "Construct: " << trait.fName << ".\r"; + kcout << "Construct: " << trait.fName << "\r"; return trait; } @@ -206,9 +206,6 @@ namespace Kernel Detail::ioi_detect_drive(&trait); - while (YES) - ; - return trait; } } // namespace Kernel diff --git a/dev/ZKAKit/src/IPEFDLLObject.cc b/dev/ZKAKit/src/IPEFDLLObject.cc index fb9ef7f0..b72421d8 100644 --- a/dev/ZKAKit/src/IPEFDLLObject.cc +++ b/dev/ZKAKit/src/IPEFDLLObject.cc @@ -60,7 +60,7 @@ EXTERN_C IDLL rtl_init_dll(UserProcess* header) } dll_obj->Get()->fImageObject = - header->ExecImg; + header->Image.fBlob; if (!dll_obj->Get()->fImageObject) { diff --git a/dev/ZKAKit/src/KString.cc b/dev/ZKAKit/src/KString.cc index aa287f15..767bf4c2 100644 --- a/dev/ZKAKit/src/KString.cc +++ b/dev/ZKAKit/src/KString.cc @@ -100,7 +100,7 @@ namespace Kernel return ("?"); const Char* boolean_expr = i ? "YES" : "NO"; - char* ret = (char*)cAlloca((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt)); + Char* ret = (Char*)rtl_alloca((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt)); if (!ret) return ("?"); @@ -159,8 +159,8 @@ namespace Kernel if (!fmt || !fmt2) return ("?"); - char* ret = - (char*)cAlloca(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt)); + Char* ret = + (Char*)rtl_alloca(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt)); if (!ret) return ("?"); diff --git a/dev/ZKAKit/src/PEFCodeMgr.cc b/dev/ZKAKit/src/PEFCodeMgr.cc index 0568b998..0a787e57 100644 --- a/dev/ZKAKit/src/PEFCodeMgr.cc +++ b/dev/ZKAKit/src/PEFCodeMgr.cc @@ -251,13 +251,13 @@ namespace Kernel auto errOrStart = exec.FindStart(); if (errOrStart.Error() != kErrorSuccess) - return No; + return kProcessInvalidID; STATIC UserProcess proc; proc.Kind = procKind; - proc.ExecImg = errOrStart.Leak().Leak(); - proc.ExecImg = exec.GetBlob().Leak().Leak(); + proc.Image.fCode = errOrStart.Leak().Leak(); + proc.Image.fBlob = exec.GetBlob().Leak().Leak(); proc.StackSize = *(UIntPtr*)exec.FindSymbol(kPefStackSizeSymbol, kPefData); proc.MemoryLimit = *(UIntPtr*)exec.FindSymbol(kPefHeapSizeSymbol, kPefData); proc.PTime = 0UL; diff --git a/dev/ZKAKit/src/Stop.cc b/dev/ZKAKit/src/Stop.cc index 1374c842..391449d6 100644 --- a/dev/ZKAKit/src/Stop.cc +++ b/dev/ZKAKit/src/Stop.cc @@ -14,7 +14,7 @@ #include <Modules/FB/FB.h> #include <Modules/FB/Text.h> -#define kWebsiteURL "https://www.el-mahrouss-logic.com/zka-os/help/" +#define kWebsiteURL "https://www.el-mahrouss-logic.com/metal-os/help/" /* Each error code is attributed with an ID, which will prompt a string onto the * screen. Wait for debugger... */ @@ -31,7 +31,7 @@ namespace Kernel auto panic_text = RGB(0xff, 0xff, 0xff); - auto start_y = 30; + auto start_y = 50; auto x = 10; CGDrawString("Kernel Panic!", start_y, x, panic_text); diff --git a/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc b/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc index 9a591aaf..34b436e7 100644 --- a/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc +++ b/dev/ZKAKit/src/Storage/AHCIDeviceInterface.cc @@ -15,7 +15,7 @@ using namespace Kernel; AHCIDeviceInterface::AHCIDeviceInterface(void (*Out)(MountpointInterface* outpacket), void (*In)(MountpointInterface* inpacket), void (*Cleanup)(void)) - : DeviceInterface(Out, In), fCleanup(Cleanup) + : IDeviceObject(Out, In), fCleanup(Cleanup) { } diff --git a/dev/ZKAKit/src/Storage/ATADeviceInterface.cc b/dev/ZKAKit/src/Storage/ATADeviceInterface.cc index 9d23894d..e80dd533 100644 --- a/dev/ZKAKit/src/Storage/ATADeviceInterface.cc +++ b/dev/ZKAKit/src/Storage/ATADeviceInterface.cc @@ -16,7 +16,7 @@ ATADeviceInterface::ATADeviceInterface( void (*Out)(MountpointInterface* outpacket), void (*In)(MountpointInterface* inpacket), void (*Cleanup)(void)) - : DeviceInterface(Out, In), fCleanup(Cleanup) + : IDeviceObject(Out, In), fCleanup(Cleanup) { } @@ -57,7 +57,7 @@ ATADeviceInterface& ATADeviceInterface::operator<<(MountpointInterface* Data) } } - return (ATADeviceInterface&)DeviceInterface<MountpointInterface*>::operator<<( + return (ATADeviceInterface&)IDeviceObject<MountpointInterface*>::operator<<( Data); } @@ -83,6 +83,6 @@ ATADeviceInterface& ATADeviceInterface::operator>>(MountpointInterface* Data) } } - return (ATADeviceInterface&)DeviceInterface<MountpointInterface*>::operator>>( + return (ATADeviceInterface&)IDeviceObject<MountpointInterface*>::operator>>( Data); } diff --git a/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc b/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc index 89ce4fb2..860c0a95 100644 --- a/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc +++ b/dev/ZKAKit/src/Storage/NVMEDeviceInterface.cc @@ -11,7 +11,7 @@ namespace Kernel NVMEDeviceInterface::NVMEDeviceInterface(void (*out)(MountpointInterface* outpacket), void (*in)(MountpointInterface* inpacket), void (*cleanup)(void)) - : DeviceInterface(out, in), fCleanup(cleanup) + : IDeviceObject(out, in), fCleanup(cleanup) { } diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 8694b449..79e07385 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -40,11 +40,7 @@ namespace Kernel STATIC UserProcessScheduler kProcessScheduler; - UserProcess::UserProcess(VoidPtr start_image) - : Code(start_image) - { - } - + UserProcess::UserProcess() = default; UserProcess::~UserProcess() = default; /// @brief Gets the last exit code. @@ -278,23 +274,24 @@ namespace Kernel HAL::mm_free_bitmap(this->VMRegister); //! Delete image if not done already. - if (this->Code && mm_is_valid_heap(this->Code)) - mm_delete_heap(this->Code); + if (this->Image.fCode && mm_is_valid_heap(this->Image.fCode)) + mm_delete_heap(this->Image.fCode); - if (this->ExecImg && mm_is_valid_heap(this->ExecImg)) - mm_delete_heap(this->ExecImg); + if (this->Image.fBlob && mm_is_valid_heap(this->Image.fBlob)) + mm_delete_heap(this->Image.fBlob); if (this->StackFrame && mm_is_valid_heap(this->StackFrame)) mm_delete_heap((VoidPtr)this->StackFrame); - this->ExecImg = nullptr; - this->Code = nullptr; + this->Image.fBlob = nullptr; + this->Image.fCode = nullptr; this->StackFrame = nullptr; if (this->Kind == kExectuableDLLKind) { Bool success = false; - rtl_fini_dll(this, this->PefDLLDelegate, &success); + + rtl_fini_dll(this, reinterpret_cast<IPEFDLLObject*>(this->PefDLLDelegate), &success); if (!success) { @@ -318,10 +315,10 @@ namespace Kernel ProcessID UserProcessScheduler::Spawn(UserProcess* process) { - if (*process->Name == 0) + if (!process || + *process->Name == 0) { - Char process_name[] = "Process (Unnamed)"; - rt_copy_memory((VoidPtr)process_name, process->Name, rt_string_len(process_name)); + return kProcessInvalidID; } #ifdef __ZKA_AMD64__ @@ -391,7 +388,6 @@ namespace Kernel UserProcessScheduler& UserProcessScheduler::The() { - kcout << "Return user scheduler object.\r"; return kProcessScheduler; } @@ -466,7 +462,7 @@ namespace Kernel kcout << "Switch to '" << process.Name << "'.\r"; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Code, &process.StackReserve[process.StackSize - 1], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image.fCode, &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId)) { process.Crash(); @@ -522,7 +518,7 @@ namespace Kernel if (process.Status == ProcessStatusKind::kInvalid) return No; - if (!process.Code) + if (!process.Image.fCode) return No; return process.PTime < 1; @@ -537,17 +533,7 @@ namespace Kernel { return kProcessScheduler.Run(); } - - /***********************************************************************************/ - /** - * @brief Initializes the scheduler. - */ - /***********************************************************************************/ - Void UserProcessHelper::InitScheduler() - { - /// TODO: code to init scheduler here. - } - + /***********************************************************************************/ /** * \brief Does a context switch in a CPU. @@ -588,7 +574,6 @@ namespace Kernel //////////////////////////////////////////////////////////// /// Rollback on fail. /// //////////////////////////////////////////////////////////// - /// if (!ret) { HardwareThreadScheduler::The()[index].Leak()->fPTime = prev_ptime; |
