Kernel: Add better support for bootloaders loading the kernel
Before I assumed that bootloaders loaded the kernel at physical address 0, but this patch kinda allows loading to different addresses. This still doesn't fully work as kernel bootstrap paging relies on kernel being loaded at 0
This commit is contained in:
@@ -254,7 +254,7 @@ acpi_release_global_lock:
|
||||
return *s_instance;
|
||||
}
|
||||
|
||||
static bool is_rsdp(uintptr_t rsdp_addr)
|
||||
static bool is_rsdp(vaddr_t rsdp_addr)
|
||||
{
|
||||
const RSDP* rsdp = (const RSDP*)rsdp_addr;
|
||||
|
||||
@@ -287,7 +287,7 @@ acpi_release_global_lock:
|
||||
return &g_boot_info.rsdp;
|
||||
|
||||
// Look in main BIOS area below 1 MB
|
||||
for (uintptr_t addr = P2V(0x000E0000); addr < P2V(0x000FFFFF); addr += 16)
|
||||
for (vaddr_t addr = 0x000E0000 + KERNEL_OFFSET; addr < 0x000FFFFF + KERNEL_OFFSET; addr += 16)
|
||||
if (is_rsdp(addr))
|
||||
return reinterpret_cast<const RSDP*>(addr);
|
||||
return nullptr;
|
||||
|
||||
@@ -66,6 +66,8 @@ namespace Kernel
|
||||
memcpy(&g_boot_info.rsdp, &rsdp, BAN::Math::min<uint32_t>(rsdp.length, sizeof(g_boot_info.rsdp)));
|
||||
}
|
||||
}
|
||||
|
||||
g_boot_info.kernel_paddr = 0;
|
||||
}
|
||||
|
||||
static BAN::StringView get_early_boot_command_line_multiboot2(uint32_t info)
|
||||
@@ -104,6 +106,8 @@ namespace Kernel
|
||||
g_boot_info.memory_map_entries[i].length = mmap_entry.length;
|
||||
g_boot_info.memory_map_entries[i].type = mmap_entry.type;
|
||||
}
|
||||
|
||||
g_boot_info.kernel_paddr = banan_bootloader_info.kernel_paddr;
|
||||
}
|
||||
|
||||
static BAN::StringView get_early_boot_command_line_banan_bootloader(uint32_t info)
|
||||
|
||||
@@ -40,8 +40,8 @@ namespace Kernel
|
||||
continue;
|
||||
|
||||
paddr_t start = entry.address;
|
||||
if (start < V2P(g_kernel_end))
|
||||
start = V2P(g_kernel_end);
|
||||
if (start < (vaddr_t)g_kernel_end - KERNEL_OFFSET + g_boot_info.kernel_paddr)
|
||||
start = (vaddr_t)g_kernel_end - KERNEL_OFFSET + g_boot_info.kernel_paddr;
|
||||
if (auto rem = start % PAGE_SIZE)
|
||||
start += PAGE_SIZE - rem;
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
#include <BAN/Errors.h>
|
||||
#include <kernel/kprint.h>
|
||||
#include <kernel/BootInfo.h>
|
||||
#include <kernel/Memory/kmalloc.h>
|
||||
|
||||
#include <kernel/Thread.h>
|
||||
|
||||
#define MB (1 << 20)
|
||||
|
||||
extern uint8_t g_kernel_end[];
|
||||
@@ -424,7 +423,7 @@ BAN::Optional<Kernel::paddr_t> kmalloc_paddr_of(Kernel::vaddr_t vaddr)
|
||||
using namespace Kernel;
|
||||
|
||||
if ((vaddr_t)s_kmalloc_storage <= vaddr && vaddr < (vaddr_t)s_kmalloc_storage + sizeof(s_kmalloc_storage))
|
||||
return V2P(vaddr);
|
||||
return vaddr - KERNEL_OFFSET + g_boot_info.kernel_paddr;
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user