From 729c7fd0041147a17366741164f7b47e75dfd6b4 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 9 Sep 2016 18:31:48 -0600 Subject: [PATCH] Prepare for higher half --- arch/x86_64/src/linker.ld | 1 + arch/x86_64/src/paging/mod.rs | 8 +++++++- bootloader/x86_64/startup-x86_64.asm | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/x86_64/src/linker.ld b/arch/x86_64/src/linker.ld index c5e3a9dee..c1ac87511 100644 --- a/arch/x86_64/src/linker.ld +++ b/arch/x86_64/src/linker.ld @@ -1,6 +1,7 @@ ENTRY(kstart) OUTPUT_FORMAT(elf64-x86-64) +/* KERNEL_OFFSET = 0xfffffe8000100000; */ KERNEL_OFFSET = 0x100000; SECTIONS { diff --git a/arch/x86_64/src/paging/mod.rs b/arch/x86_64/src/paging/mod.rs index 0c48f7ad7..505591698 100644 --- a/arch/x86_64/src/paging/mod.rs +++ b/arch/x86_64/src/paging/mod.rs @@ -21,6 +21,9 @@ pub const ENTRY_COUNT: usize = 512; /// Size of pages pub const PAGE_SIZE: usize = 4096; +/// Offset of kernel from physical +pub const KERNEL_OFFSET: usize = 0xfffffe8000000000; + /// Initialize paging pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable { extern { @@ -66,7 +69,10 @@ pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable { let start_frame = Frame::containing_address(PhysicalAddress::new(start)); let end_frame = Frame::containing_address(PhysicalAddress::new(end - 1)); for frame in Frame::range_inclusive(start_frame, end_frame) { - mapper.identity_map(frame, flags); + mapper.identity_map(frame.clone(), flags); + + let page = Page::containing_address(VirtualAddress::new(frame.start_address().get() + KERNEL_OFFSET)); + mapper.map_to(page, frame, flags); } } }; diff --git a/bootloader/x86_64/startup-x86_64.asm b/bootloader/x86_64/startup-x86_64.asm index 95c01e2dc..f5f9bc6a7 100644 --- a/bootloader/x86_64/startup-x86_64.asm +++ b/bootloader/x86_64/startup-x86_64.asm @@ -58,8 +58,9 @@ startup_arch: rep stosd xor edi, edi - ;Link first PML4 to PDP + ;Link first PML4 and third to last PML4 to PDP mov DWORD [es:edi], 0x71000 | 1 << 1 | 1 + mov DWORD [es:edi + 509*8], 0x71000 | 1 << 1 | 1 add edi, 0x1000 ;Link last PML4 to PML4 mov DWORD [es:edi - 8], 0x70000 | 1 << 1 | 1