feat/kernel: implemented madt_init
This commit is contained in:
parent
1f70ada525
commit
aeda945087
3 changed files with 47 additions and 7 deletions
|
@ -175,14 +175,11 @@ void emk_entry(void)
|
|||
acpi_init();
|
||||
log_early("Initialized ACPI");
|
||||
|
||||
acpi_madt_t *madt = (acpi_madt_t *)acpi_find_table("APIC");
|
||||
if (!madt)
|
||||
{
|
||||
kpanic(NULL, "Failed to find MADT table");
|
||||
}
|
||||
|
||||
log_early("Found MADT at %p", madt);
|
||||
/* Setup MADT */
|
||||
madt_init();
|
||||
log_early("Initialized APIC");
|
||||
|
||||
/* Setup SMP */
|
||||
if (!mp_request.response)
|
||||
{
|
||||
kpanic(NULL, "Failed to get MP request");
|
||||
|
|
41
kernel/src/sys/acpi/madt.c
Normal file
41
kernel/src/sys/acpi/madt.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
/* EMK 1.0 Copyright (c) 2025 Piraterna */
|
||||
#include <sys/acpi/madt.h>
|
||||
#include <sys/acpi.h>
|
||||
#include <sys/kpanic.h>
|
||||
|
||||
acpi_madt_ioapic_t *madt_ioapic_list[256] = {0};
|
||||
acpi_madt_ioapic_src_ovr_t *madt_iso_list[256] = {0};
|
||||
|
||||
uint32_t madt_ioapic_len = 0;
|
||||
uint32_t madt_iso_len = 0;
|
||||
|
||||
uint64_t *lapic_addr = 0;
|
||||
|
||||
void madt_init()
|
||||
{
|
||||
acpi_madt_t *madt = (acpi_madt_t *)acpi_find_table("APIC");
|
||||
if (!madt)
|
||||
{
|
||||
kpanic(NULL, "Failed to find MADT table");
|
||||
}
|
||||
|
||||
uint64_t offset = 0;
|
||||
int i = 0;
|
||||
while (1)
|
||||
{
|
||||
if (offset > madt->sdt.length - sizeof(acpi_madt_t))
|
||||
break;
|
||||
|
||||
acpi_madt_entry_t *entry = (acpi_madt_entry_t *)(madt->table + offset);
|
||||
|
||||
if (entry->type == 0)
|
||||
i++;
|
||||
else if (entry->type == MADT_ENTRY_IOAPIC)
|
||||
madt_ioapic_list[madt_ioapic_len++] = (acpi_madt_ioapic_t *)entry;
|
||||
else if (entry->type == MADT_ENTRY_IOAPIC_SRC_OVR)
|
||||
madt_iso_list[madt_iso_len++] = (acpi_madt_ioapic_src_ovr_t *)entry;
|
||||
else if (entry->type == MADT_ENTRY_LAPIC_ADDR_OVR)
|
||||
lapic_addr = (uint64_t *)((acpi_madt_lapic_addr_ovr_t *)entry)->lapic_addr;
|
||||
offset += entry->length;
|
||||
}
|
||||
}
|
|
@ -93,4 +93,6 @@ typedef struct acpi_madt_lx2apic
|
|||
uint32_t acpi_id; /* ACPI ID */
|
||||
} __attribute__((packed)) acpi_madt_lx2apic_t;
|
||||
|
||||
void madt_init();
|
||||
|
||||
#endif // MADT_H
|
Loading…
Add table
Add a link
Reference in a new issue