From f7f722f81cbe3d27e449b8e246edeedb528dc45c Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Fri, 21 Jan 2022 21:38:03 +0100 Subject: [PATCH] Don't use identity mapping for ACPI. This is so that any process can use pointers to ACPI tables, since they now point to the universally-accessible KERNEL_OFFSET+physaddr virtual addresses. --- src/acpi/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index c75c78b..45c384d 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -30,23 +30,23 @@ mod rsdp; pub fn get_sdt(sdt_address: usize, active_table: &mut ActivePageTable) -> &'static Sdt { { - let page = Page::containing_address(VirtualAddress::new(sdt_address)); + let page = Page::containing_address(VirtualAddress::new(sdt_address + crate::KERNEL_OFFSET)); if active_table.translate_page(page).is_none() { - let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data())); + let frame = Frame::containing_address(PhysicalAddress::new(sdt_address)); let result = active_table.map_to(page, frame, PageFlags::new()); result.flush(); } } - let sdt = unsafe { &*(sdt_address as *const Sdt) }; + let sdt = unsafe { &*((sdt_address + crate::KERNEL_OFFSET) as *const Sdt) }; // Map extra SDT frames if required { - let start_page = Page::containing_address(VirtualAddress::new(sdt_address + 4096)); - let end_page = Page::containing_address(VirtualAddress::new(sdt_address + sdt.length as usize)); + let start_page = Page::containing_address(VirtualAddress::new(sdt_address + 4096 + crate::KERNEL_OFFSET)); + let end_page = Page::containing_address(VirtualAddress::new(sdt_address + sdt.length as usize + crate::KERNEL_OFFSET)); for page in Page::range_inclusive(start_page, end_page) { if active_table.translate_page(page).is_none() { - let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data())); + let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().data() - crate::KERNEL_OFFSET)); let result = active_table.map_to(page, frame, PageFlags::new()); result.flush(); } @@ -125,7 +125,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable, already_supplied_rsdps: O rxsdt.map_all(active_table); for sdt_address in rxsdt.iter() { - let sdt = &*(sdt_address as *const Sdt); + let sdt = &*((sdt_address + crate::KERNEL_OFFSET) as *const Sdt); let signature = get_sdt_signature(sdt); if let Some(ref mut ptrs) = *(SDT_POINTERS.write()) {