diff options
Diffstat (limited to 'dev/boot')
| -rw-r--r-- | dev/boot/src/BootThread.cc | 23 | ||||
| -rw-r--r-- | dev/boot/src/New+Delete.cc | 11 |
2 files changed, 29 insertions, 5 deletions
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); } |
