From 6df7c4ebd55f2eb48dd0f3ac1d9904d4ab3d92dc Mon Sep 17 00:00:00 2001 From: Vlad-Robert Baciu Date: Sat, 11 Jan 2025 18:46:27 +0200 Subject: [PATCH] Use IA32_APIC_BASE MSR to get LAPIC address instead of the MADT --- kernel-src/arch/x86-64/apic.c | 8 ++------ kernel-src/include/x86-64/arch/msr.h | 1 + 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/kernel-src/arch/x86-64/apic.c b/kernel-src/arch/x86-64/apic.c index 5651a604..43d17b69 100644 --- a/kernel-src/arch/x86-64/apic.c +++ b/kernel-src/arch/x86-64/apic.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -262,12 +263,7 @@ void arch_apic_init() { // map LAPIC to virtual memory - struct acpi_madt_lapic_address_override *lapic64 = getentry(ACPI_MADT_ENTRY_TYPE_LAPIC_ADDRESS_OVERRIDE, 0); - - void *paddr = lapic64 ? (void *)lapic64->address : (void *)(uint64_t)madt->local_interrupt_controller_address; - - if (lapic64) - printf("\e[94mUsing 64 bit override for the local APIC address\n\e[0m"); + void *paddr = (void *) rdmsr(MSR_IA32APICBASE); lapic_address = vmm_map(NULL, PAGE_SIZE, VMM_FLAGS_PHYSICAL, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, paddr); __assert(lapic_address); diff --git a/kernel-src/include/x86-64/arch/msr.h b/kernel-src/include/x86-64/arch/msr.h index c0a656f2..db12efcd 100644 --- a/kernel-src/include/x86-64/arch/msr.h +++ b/kernel-src/include/x86-64/arch/msr.h @@ -3,6 +3,7 @@ #include +#define MSR_IA32APICBASE 0x1B #define MSR_EFER 0xC0000080 #define MSR_STAR 0xC0000081 #define MSR_LSTAR 0xC0000082