stos/amd64: cpu: Save Local APIC base in MCB

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-26 20:31:09 +00:00
parent 38310e4f23
commit fd30fc5e04
2 changed files with 26 additions and 2 deletions
+24 -2
View File
@@ -10,6 +10,9 @@
#include <machine/lapicreg.h> #include <machine/lapicreg.h>
#include <machine/msr.h> #include <machine/msr.h>
#include <machine/cpuid.h> #include <machine/cpuid.h>
#include <drivers/acpi/tables.h>
#include <drivers/acpi/acpi.h>
#include <mm/vmm.h>
#include <ex/trace.h> #include <ex/trace.h>
#include <ke/knot.h> #include <ke/knot.h>
#include <stdef.h> #include <stdef.h>
@@ -57,13 +60,32 @@ LapicEnable(VOID)
VOID VOID
MdLapicInit(KPCR *Kpcr) MdLapicInit(KPCR *Kpcr)
{ {
ACPI_MADT *Madt;
MCB *Mcb;
if (Kpcr == NULL) { if (Kpcr == NULL) {
KeKnot(KNOT_MISC, "failed to initialize lapic driver\n"); KeKnot(
KNOT_MISC,
"lapic: failed to initialize lapic driver\n"
);
} }
if (!LapicIsSupported()) { if (!LapicIsSupported()) {
KeKnot(KNOT_MISSING_HARDWARE, "local apic not supported\n"); KeKnot(
KNOT_MISSING_HARDWARE,
"lapic: local apic not supported\n"
);
} }
/* Obtain the ACPI MADT table */
Madt = AcpiQuery("APIC");
if (Madt == NULL) {
KeKnot(KNOT_MISC, "lapic: could not obtain MADT\n");
}
Mcb = &Kpcr->Mcb;
Mcb->LapicBase = PMA_TO_VMA((UPTR)Madt->LapicAddr);
/* Enable the Local APIC */
LapicEnable(); LapicEnable();
} }
+2
View File
@@ -17,10 +17,12 @@
* *
* @ModelId: Processor model ID * @ModelId: Processor model ID
* @FamilyId: Processor family ID * @FamilyId: Processor family ID
* @LapicBase: Local APIC MMIO base
*/ */
typedef struct { typedef struct {
UCHAR ModelId; UCHAR ModelId;
USHORT FamilyId : 12; USHORT FamilyId : 12;
VOID *LapicBase;
} MCB; } MCB;
#endif /* !_MACHINE_MCB_H_ */ #endif /* !_MACHINE_MCB_H_ */