From f90033e0e1b9b1fbebe7d80eadfa6cf3b76c6389 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 13 Apr 2021 20:38:54 -0600 Subject: [PATCH] Use PHYS_OFFSET instead of KERNEL_OFFSET to refer to the physmap --- src/acpi/madt.rs | 2 +- src/arch/x86_64/consts.rs | 5 +++++ src/arch/x86_64/device/ioapic.rs | 7 ++++--- src/arch/x86_64/device/local_apic.rs | 4 ++-- src/arch/x86_64/device/serial.rs | 6 +++--- src/arch/x86_64/graphical_debug/mod.rs | 6 +++--- src/arch/x86_64/idt.rs | 4 ++-- src/syscall/process.rs | 9 +++++++++ 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/acpi/madt.rs b/src/acpi/madt.rs index c65c9ea..7a32a07 100644 --- a/src/acpi/madt.rs +++ b/src/acpi/madt.rs @@ -79,7 +79,7 @@ impl Madt { CPU_COUNT.fetch_add(1, Ordering::SeqCst); // Allocate a stack - let stack_start = allocate_frames(64).expect("no more frames in acpi stack_start").start_address().data() + crate::KERNEL_OFFSET; + let stack_start = allocate_frames(64).expect("no more frames in acpi stack_start").start_address().data() + crate::PHYS_OFFSET; let stack_end = stack_start + 64 * 4096; let ap_ready = (TRAMPOLINE + 8) as *mut u64; diff --git a/src/arch/x86_64/consts.rs b/src/arch/x86_64/consts.rs index 5409caf..9524852 100644 --- a/src/arch/x86_64/consts.rs +++ b/src/arch/x86_64/consts.rs @@ -27,6 +27,11 @@ /// Size of kernel percpu variables pub const KERNEL_PERCPU_SIZE: usize = 64 * 1024; // 64 KB + /// Offset of physmap + // This needs to match RMM's PHYS_OFFSET + pub const PHYS_OFFSET: usize = 0xFFFF_8000_0000_0000; + pub const PHYS_PML4: usize = (PHYS_OFFSET & PML4_MASK)/PML4_SIZE; + /// Offset to user image pub const USER_OFFSET: usize = 0; pub const USER_PML4: usize = (USER_OFFSET & PML4_MASK)/PML4_SIZE; diff --git a/src/arch/x86_64/device/ioapic.rs b/src/arch/x86_64/device/ioapic.rs index c4feff7..c9b3d68 100644 --- a/src/arch/x86_64/device/ioapic.rs +++ b/src/arch/x86_64/device/ioapic.rs @@ -233,8 +233,9 @@ pub fn src_overrides() -> &'static [Override] { #[cfg(feature = "acpi")] pub unsafe fn handle_ioapic(active_table: &mut ActivePageTable, madt_ioapic: &'static MadtIoApic) { // map the I/O APIC registers + let frame = Frame::containing_address(PhysicalAddress::new(madt_ioapic.address as usize)); - let page = Page::containing_address(VirtualAddress::new(madt_ioapic.address as usize + crate::KERNEL_OFFSET)); + let page = Page::containing_address(VirtualAddress::new(madt_ioapic.address as usize + crate::PHYS_OFFSET)); assert_eq!(active_table.translate_page(page), None); @@ -370,13 +371,13 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { } } fn get_override(irq: u8) -> Option<&'static Override> { - src_overrides().iter().find(|over| over.bus_irq == irq) + src_overrides().iter().find(|over| over.bus_irq == irq) } fn resolve(irq: u8) -> u32 { get_override(irq).map_or(u32::from(irq), |over| over.gsi) } fn find_ioapic(gsi: u32) -> Option<&'static IoApic> { - ioapics().iter().find(|apic| gsi >= apic.gsi_start && gsi < apic.gsi_start + u32::from(apic.count)) + ioapics().iter().find(|apic| gsi >= apic.gsi_start && gsi < apic.gsi_start + u32::from(apic.count)) } pub unsafe fn mask(irq: u8) { diff --git a/src/arch/x86_64/device/local_apic.rs b/src/arch/x86_64/device/local_apic.rs index e878c12..d416944 100644 --- a/src/arch/x86_64/device/local_apic.rs +++ b/src/arch/x86_64/device/local_apic.rs @@ -43,12 +43,12 @@ pub fn bsp_apic_id() -> Option { impl LocalApic { unsafe fn init(&mut self, active_table: &mut ActivePageTable) { - self.address = (rdmsr(IA32_APIC_BASE) as usize & 0xFFFF_0000) + crate::KERNEL_OFFSET; + self.address = (rdmsr(IA32_APIC_BASE) as usize & 0xFFFF_0000) + crate::PHYS_OFFSET; self.x2 = CpuId::new().get_feature_info().unwrap().has_x2apic(); if ! self.x2 { let page = Page::containing_address(VirtualAddress::new(self.address)); - let frame = Frame::containing_address(PhysicalAddress::new(self.address - crate::KERNEL_OFFSET)); + let frame = Frame::containing_address(PhysicalAddress::new(self.address - crate::PHYS_OFFSET)); let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); result.flush(active_table); } diff --git a/src/arch/x86_64/device/serial.rs b/src/arch/x86_64/device/serial.rs index c378e6e..280125b 100644 --- a/src/arch/x86_64/device/serial.rs +++ b/src/arch/x86_64/device/serial.rs @@ -19,7 +19,7 @@ pub unsafe fn init() { #[cfg(feature = "lpss_debug")] { // TODO: Make this configurable - let address = crate::KERNEL_OFFSET + 0xFE032000; + let address = crate::PHYS_OFFSET + 0xFE032000; { use crate::paging::{ActivePageTable, Page, VirtualAddress, entry::EntryFlags}; @@ -27,13 +27,13 @@ pub unsafe fn init() { let mut active_table = ActivePageTable::new(); let page = Page::containing_address(VirtualAddress::new(address)); - let frame = Frame::containing_address(PhysicalAddress::new(address - crate::KERNEL_OFFSET)); + let frame = Frame::containing_address(PhysicalAddress::new(address - crate::PHYS_OFFSET)); let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); result.flush(&mut active_table); } let lpss = SerialPort::>::new( - crate::KERNEL_OFFSET + 0xFE032000 + crate::PHYS_OFFSET + 0xFE032000 ); lpss.init(); diff --git a/src/arch/x86_64/graphical_debug/mod.rs b/src/arch/x86_64/graphical_debug/mod.rs index 369fc4e..ea2fe04 100644 --- a/src/arch/x86_64/graphical_debug/mod.rs +++ b/src/arch/x86_64/graphical_debug/mod.rs @@ -27,7 +27,7 @@ pub fn init(active_table: &mut ActivePageTable) { let physbaseptr; { - let mode_info_addr = 0x5200 + crate::KERNEL_OFFSET; + let mode_info_addr = 0x5200 + crate::PHYS_OFFSET; let mode_info = unsafe { &*(mode_info_addr as *const VBEModeInfo) }; width = mode_info.xresolution as usize; height = mode_info.yresolution as usize; @@ -39,13 +39,13 @@ pub fn init(active_table: &mut ActivePageTable) { { let size = width * height; - let onscreen = physbaseptr + crate::KERNEL_OFFSET; + let onscreen = physbaseptr + crate::PHYS_OFFSET; { let mut flush_all = MapperFlushAll::new(); let start_page = Page::containing_address(VirtualAddress::new(onscreen)); let end_page = Page::containing_address(VirtualAddress::new(onscreen + size * 4)); for page in Page::range_inclusive(start_page, end_page) { - let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data() - crate::KERNEL_OFFSET)); + let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data() - crate::PHYS_OFFSET)); let flags = EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::HUGE_PAGE; let result = active_table.map_to(page, frame, flags); flush_all.consume(result); diff --git a/src/arch/x86_64/idt.rs b/src/arch/x86_64/idt.rs index 58ff7ff..1e516ad 100644 --- a/src/arch/x86_64/idt.rs +++ b/src/arch/x86_64/idt.rs @@ -171,14 +171,14 @@ pub unsafe fn init_generic(is_bsp: bool, idt: &mut Idt) { let frames = crate::memory::allocate_frames(page_count) .expect("failed to allocate pages for backup interrupt stack"); - // Map them linearly, i.e. KERNEL_OFFSET + physaddr. + // Map them linearly, i.e. PHYS_OFFSET + physaddr. let base_address = { use crate::memory::{Frame, PhysicalAddress}; use crate::paging::{ActivePageTable, Page, VirtualAddress}; use crate::paging::entry::EntryFlags; let mut active_table = ActivePageTable::new(); - let base_virtual_address = VirtualAddress::new(frames.start_address().data() + crate::KERNEL_OFFSET); + let base_virtual_address = VirtualAddress::new(frames.start_address().data() + crate::PHYS_OFFSET); for i in 0..page_count { let virtual_address = VirtualAddress::new(base_virtual_address.data() + i * crate::memory::PAGE_SIZE); diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 0adbabd..61642d7 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -369,6 +369,15 @@ pub fn clone(flags: CloneFlags, stack_base: usize) -> Result { }); } + // Copy physmap mapping + { + let frame = active_table.p4()[crate::PHYS_PML4].pointed_frame().expect("physmap not mapped"); + let flags = active_table.p4()[crate::PHYS_PML4].flags(); + active_table.with(&mut new_table, &mut temporary_page, |mapper| { + mapper.p4_mut()[crate::PHYS_PML4].set(frame, flags); + }); + } + if let Some(fx) = kfx_opt.take() { context.arch.set_fx(fx.as_ptr() as usize); context.kfx = Some(fx);