1
0
Fork 0

feat/kernel: implemented madt_init

This commit is contained in:
Kevin Alavik 2025-05-16 19:32:32 +02:00
parent 1f70ada525
commit aeda945087
Signed by: cmpsb
GPG key ID: 10D1CC0526FDC6D7
3 changed files with 47 additions and 7 deletions

View file

@ -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");

View 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;
}
}

View file

@ -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