summaryrefslogtreecommitdiffhomepage
path: root/dev/ZBAKit/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/ZBAKit/src')
-rw-r--r--dev/ZBAKit/src/BootThread.cc20
-rw-r--r--dev/ZBAKit/src/HEL/AMD64/BootAPI.S8
-rw-r--r--dev/ZBAKit/src/HEL/AMD64/BootMain.cc4
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();
}