From 7355ae1671b385825cafc1d36b3080d41f171867 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 23 Dec 2020 09:46:34 -0700 Subject: [PATCH] Hack to ensure kernel is mapped even if it uses reserved memory --- src/arch/x86_64/rmm.rs | 9 ++++++++- src/arch/x86_64/start.rs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/arch/x86_64/rmm.rs b/src/arch/x86_64/rmm.rs index 8717d08..d208b88 100644 --- a/src/arch/x86_64/rmm.rs +++ b/src/arch/x86_64/rmm.rs @@ -167,9 +167,11 @@ pub unsafe fn mapper_current() -> PageMapper<'static, X8664Arch, LockedAllocator PageMapper::current(&mut FRAME_ALLOCATOR) } -pub unsafe fn init(kernel_end: usize) { +pub unsafe fn init(kernel_base: usize, kernel_size: usize) { type A = X8664Arch; + let kernel_size_aligned = ((kernel_size + (A::PAGE_SIZE - 1))/A::PAGE_SIZE) * A::PAGE_SIZE; + let kernel_end = kernel_base + kernel_size_aligned; println!("kernel_end: {:X}", kernel_end); // Copy memory map from bootloader location, and page align it @@ -214,6 +216,11 @@ pub unsafe fn init(kernel_end: usize) { area_i += 1; } + //TODO: this is a hack to ensure kernel is mapped, even if it uses invalid memory. We need to + //properly utilize the firmware memory map and not assume 0x100000 and onwards is free + AREAS[area_i].base = PhysicalAddress::new(kernel_base); + AREAS[area_i].size = kernel_size_aligned; + println!("bump_offset: {:X}", bump_offset); let allocator = inner::(&AREAS, bump_offset); diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs index 664dfcf..7f28eaa 100644 --- a/src/arch/x86_64/start.rs +++ b/src/arch/x86_64/start.rs @@ -107,7 +107,7 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! { idt::init(); // Initialize RMM - crate::arch::rmm::init(kernel_base + ((kernel_size + 4095)/4096) * 4096); + crate::arch::rmm::init(kernel_base, kernel_size); // Initialize paging let (mut active_table, tcb_offset) = paging::init(0);