From 6ed8a39c1bd3083297b41e981a2bf4bdbe2abd1f Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 21 Nov 2024 08:50:57 +0100 Subject: 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 --- dev/ZBAKit/src/BootThread.cc | 20 ++++++++++++++++---- dev/ZBAKit/src/HEL/AMD64/BootAPI.S | 8 ++++++++ dev/ZBAKit/src/HEL/AMD64/BootMain.cc | 4 ++-- 3 files changed, 26 insertions(+), 6 deletions(-) (limited to 'dev/ZBAKit/src') 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 #include -// 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(fStartAddress)(handover); + fHandover = handover; + + if (own_stack) + rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(8) - 1]); + else + { + delete [] fStack; + reinterpret_cast(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(); } -- cgit v1.2.3