Read and save data from MADT

This commit is contained in:
Thomas Lovén 2018-02-23 22:19:47 +01:00
parent f0e6a35941
commit 9d9515c399
2 changed files with 94 additions and 0 deletions

View File

@ -29,6 +29,43 @@ struct sdt
uint8_t data[];
}__attribute__((packed));
struct madt
{
uint32_t lic_address;
uint32_t flags;
uint8_t data[];
}__attribute__((packed));
struct madt_entry
{
uint8_t type;
uint8_t len;
union{
struct {
uint8_t id;
uint8_t apic;
uint32_t flags;
}__attribute__((packed)) lapic;
struct {
uint8_t id;
uint8_t _;
uint32_t addr;
uint32_t base;
}__attribute__((packed)) ioapic;
struct {
uint8_t bus;
uint8_t source;
uint32_t target;
uint16_t flags;
}__attribute__((packed)) interrupt;
};
}__attribute__((packed));
#define MADT_CPU 0
#define MADT_IOAPIC 1
#define MADT_INT 2
struct acpi_info acpi_info = {0};
static struct rsdp *find_rsdp()
{
uintptr_t ebda_start = *(uint16_t *)P2V(0x40e);
@ -59,6 +96,38 @@ static struct rsdp *find_rsdp()
return 0;
}
static void parse_madt(struct madt *madt, uint32_t len)
{
uintptr_t end = (uintptr_t)madt + len;
struct madt_entry *e = (void *)madt->data;
debug_info("Local Interrupt Controller: %x\n", madt->lic_address);
while((uintptr_t)e < end)
{
int i;
switch(e->type)
{
case MADT_CPU:
i = acpi_info.num_cpus;
acpi_info.cpu[i].id = e->lapic.id;
acpi_info.cpu[i].apic = e->lapic.apic;
acpi_info.num_cpus++;
break;
case MADT_IOAPIC:
i = acpi_info.num_ioapic;
acpi_info.ioapic[i].id = e->ioapic.id;
acpi_info.ioapic[i].addr = e->ioapic.addr;
acpi_info.ioapic[i].base = e->ioapic.base;
acpi_info.num_ioapic++;
break;
case MADT_INT:
acpi_info.int_map[e->interrupt.source] = e->interrupt.target;
break;
}
debug_info(" MADT: type:%d len:%d\n", e->type, e->len);
e = incptr(e, e->len);
}
}
static void parse_sdt(struct sdt *sdt, uint8_t revision)
{
uint32_t *p32 = (void *)sdt->data;
@ -70,6 +139,8 @@ static void parse_sdt(struct sdt *sdt, uint8_t revision)
debug_info("Found table: ");
debug_putsn((char *)table->signature, 4);
debug_printf("\n");
if(!memcmp(table->signature, "APIC", 4))
parse_madt((void *)table->data, table->len);
}
}

View File

@ -1,3 +1,26 @@
#pragma once
#include <stdint.h>
#define MAX_CPUS 16
#define MAX_IOAPIC 4
struct acpi_info
{
int num_cpus;
struct {
uint8_t id;
uint8_t apic;
} cpu[MAX_CPUS];
int num_ioapic;
struct {
uint8_t id;
uint32_t addr;
uint32_t base;
} ioapic[MAX_IOAPIC];
uint32_t int_map[255];
};
extern struct acpi_info acpi_info;
void acpi_init();