From 1c3b37123cef3fa9c69099bc6228d7b4a082ee90 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 1 Apr 2025 10:38:27 +0200 Subject: ahci, boot: bump, and working on a patch. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/BootThread.cc | 23 +++++++++++++++++++---- dev/boot/src/New+Delete.cc | 11 ++++++++++- 2 files changed, 29 insertions(+), 5 deletions(-) (limited to 'dev/boot/src') diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index 3341601a..aac3c931 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -83,6 +83,8 @@ namespace Boot auto numPages = opt_header_ptr->SizeOfImage / cPageSize; BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress); + fStack = new UInt8[mib_cast(16)]; + LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->SizeOfOptionalHeader); constexpr auto sectionForCode = ".text"; @@ -93,7 +95,19 @@ namespace Boot { LDR_SECTION_HEADER_PTR sect = §Ptr[sectIndex]; - SetMem((VoidPtr)(loadStartAddress + sect->VirtualAddress), 0, sect->SizeOfRawData); + auto sz = sect->VirtualSize; + + if (sect->SizeOfRawData > 0) + sz = sect->SizeOfRawData; + + SetMem((VoidPtr)(loadStartAddress + sect->VirtualAddress), 0, sz); + + if (sect->SizeOfRawData > 0) + { + CopyMem((VoidPtr)(loadStartAddress + sect->VirtualAddress), + (VoidPtr)((UIntPtr)fBlob + sect->PointerToRawData), + sect->SizeOfRawData); + } if (StrCmp(sectionForCode, sect->Name) == 0) { @@ -152,8 +166,6 @@ namespace Boot { writer.Write("BootZ: Invalid Executable.\r"); } - - fStack = new UInt8[mib_cast(16)]; } /// @note handover header has to be valid! @@ -175,7 +187,10 @@ namespace Boot if (own_stack) { - rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]); + UInt8* aligned_stack = &fStack[mib_cast(16)]; + aligned_stack = (UInt8*)((UIntPtr)aligned_stack & ~0xF); + + rt_jump_to_address(fStartAddress, fHandover, aligned_stack); } else { diff --git a/dev/boot/src/New+Delete.cc b/dev/boot/src/New+Delete.cc index b7941e29..b9982923 100644 --- a/dev/boot/src/New+Delete.cc +++ b/dev/boot/src/New+Delete.cc @@ -19,7 +19,7 @@ void* operator new(size_t sz) void* buf = nullptr; while (BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf) != kEfiOk) - BS->FreePool(buf); + ; return buf; } @@ -39,6 +39,9 @@ void* operator new[](size_t sz) /// @param buf the object. void operator delete(void* buf) { + if (!buf) + return; + BS->FreePool(buf); } @@ -46,6 +49,9 @@ void operator delete(void* buf) /// @param buf the object. void operator delete[](void* buf) { + if (!buf) + return; + BS->FreePool(buf); } @@ -54,6 +60,9 @@ void operator delete[](void* buf) /// @param size it's size. void operator delete(void* buf, size_t size) { + if (!buf) + return; + BS->FreePool(buf); } -- cgit v1.2.3