diff --git a/src/arch/x86_64/interrupts/apic.rs b/src/arch/x86_64/interrupts/apic.rs index 1c7ed7f..a9a23a1 100644 --- a/src/arch/x86_64/interrupts/apic.rs +++ b/src/arch/x86_64/interrupts/apic.rs @@ -1,4 +1,4 @@ -use crate::{drivers::acpi::SMP_REQUEST, hcf, libs::cell::OnceCell}; +use crate::{drivers::acpi::SMP_REQUEST, hcf, libs::cell::OnceCell, mem::HHDM_OFFSET}; use alloc::{sync::Arc, vec::Vec}; @@ -96,7 +96,7 @@ impl APIC { crate::log_info!("MADT located at: {:p}", core::ptr::addr_of!(madt)); - let mut lapic_ptr = madt.inner.local_apic_address as *mut u8; + let mut lapic_ptr = (madt.inner.local_apic_address as usize + *HHDM_OFFSET) as *mut u8; let mut io_apic = None; let mut io_apic_source_override = None; @@ -117,7 +117,8 @@ impl APIC { io_apic = Some(IOAPIC { ioapic_id: core::ptr::read_unaligned(ptr.add(2)), _reserved: core::ptr::read_unaligned(ptr.add(3)), - ptr: (core::ptr::read_unaligned(ptr.add(4).cast::())) as *mut u8, + ptr: (core::ptr::read_unaligned(ptr.add(4).cast::()) as usize + + *HHDM_OFFSET) as *mut u8, global_interrupt_base: core::ptr::read_unaligned(ptr.add(8).cast::()), }) }, @@ -132,8 +133,9 @@ impl APIC { }) }, 5 => { - lapic_ptr = - unsafe { core::ptr::read_unaligned(ptr.add(4).cast::()) } as *mut u8 + lapic_ptr = (unsafe { core::ptr::read_unaligned(ptr.add(4).cast::()) } + as usize + + *HHDM_OFFSET) as *mut u8 } _ => {} } diff --git a/src/drivers/acpi.rs b/src/drivers/acpi.rs index 87a765c..6d6b9a1 100644 --- a/src/drivers/acpi.rs +++ b/src/drivers/acpi.rs @@ -4,6 +4,7 @@ use limine::SmpRequest; use crate::{ arch::io::{inw, outb}, libs::cell::OnceCell, + mem::HHDM_OFFSET, }; pub static SMP_REQUEST: SmpRequest = SmpRequest::new(0); @@ -31,7 +32,9 @@ pub struct SDT<'a, T> { } impl<'a, T> SDT<'a, T> { - unsafe fn new(ptr: *const u8) -> Self { + unsafe fn new(mut ptr: *const u8) -> Self { + ptr = ptr.add(*HHDM_OFFSET); + let length = core::ptr::read_unaligned(ptr.add(4).cast::()); let data = core::slice::from_raw_parts(ptr, length as usize);