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/ZBAKit/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/ZBAKit/src')
| -rw-r--r-- | dev/ZBAKit/src/BootThread.cc | 20 | ||||
| -rw-r--r-- | dev/ZBAKit/src/HEL/AMD64/BootAPI.S | 8 | ||||
| -rw-r--r-- | dev/ZBAKit/src/HEL/AMD64/BootMain.cc | 4 |
3 files changed, 26 insertions, 6 deletions
diff --git a/dev/ZBAKit/src/BootThread.cc b/dev/ZBAKit/src/BootThread.cc index 2ff8f7df..6ce14877 100644 --- a/dev/ZBAKit/src/BootThread.cc +++ b/dev/ZBAKit/src/BootThread.cc @@ -15,13 +15,15 @@ #include <CFKit/Utils.h> #include <Modules/FB/Text.h> -// External boot services symbol. +/// @brief External boot services symbol. EXTERN EfiBootServices* BS; /// @note BThread doesn't parse the symbols so doesn't nullify them, .bss is though. namespace Boot { + EXTERN_C Void rt_jump_to_address(VoidPtr code, HEL::HANDOVER_INFO_HEADER* handover, UInt8* stack); + BThread::BThread(VoidPtr blob) : fBlob(blob), fStartAddress(nullptr) { @@ -158,12 +160,14 @@ namespace Boot } else { - writer.Write("ZBA: Invalid executable.\r"); + writer.Write("ZBA: INVALID EXECUTABLE.\r"); } + + fStack = new UInt8[mib_cast(8)]; } /// @note handover header has to be valid! - Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover) + Void BThread::Start(HEL::HANDOVER_INFO_HEADER* handover, Bool own_stack) { HEL::HandoverProc err_fn = [](HEL::HANDOVER_INFO_HEADER* rcx) -> void { CGDrawString("ZBA: INVALID IMAGE! ABORTING...", 50, 10, RGB(0xFF, 0xFF, 0xFF)); @@ -175,7 +179,15 @@ namespace Boot err_fn(handover); } - reinterpret_cast<HEL::HandoverProc>(fStartAddress)(handover); + fHandover = handover; + + if (own_stack) + rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(8) - 1]); + else + { + delete [] fStack; + reinterpret_cast<HEL::HandoverProc>(fStartAddress)(fHandover); + } } const Char* BThread::GetName() diff --git a/dev/ZBAKit/src/HEL/AMD64/BootAPI.S b/dev/ZBAKit/src/HEL/AMD64/BootAPI.S index 47f250f1..963ef46a 100644 --- a/dev/ZBAKit/src/HEL/AMD64/BootAPI.S +++ b/dev/ZBAKit/src/HEL/AMD64/BootAPI.S @@ -11,8 +11,16 @@ rt_jump_to_address: mov rbx, rcx mov rcx, rdx + push rbx + push rdx + mov rsp, r8 + push rax jmp rbx + pop rdx + pop rbx + pop rax + ret rt_reset_hardware: diff --git a/dev/ZBAKit/src/HEL/AMD64/BootMain.cc b/dev/ZBAKit/src/HEL/AMD64/BootMain.cc index cfc02837..404d8e3b 100644 --- a/dev/ZBAKit/src/HEL/AMD64/BootMain.cc +++ b/dev/ZBAKit/src/HEL/AMD64/BootMain.cc @@ -246,7 +246,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, syschk_thread->SetName("System Check (ZBA EFI Driver)"); } - syschk_thread->Start(handover_hdr); + syschk_thread->Start(handover_hdr, NO); // nullify these fields, to avoid being reused later. @@ -324,7 +324,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr ImageHandle, // Finally load the OS kernel. // ---------------------------------------------------- // - kernel_thread->Start(handover_hdr); + kernel_thread->Start(handover_hdr, YES); CANT_REACH(); } |
