summaryrefslogtreecommitdiffhomepage
path: root/dev/boot/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/boot/src')
-rw-r--r--dev/boot/src/BootThread.cc23
-rw-r--r--dev/boot/src/New+Delete.cc11
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 = &sectPtr[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);
}