Read and save data from MADT
This commit is contained in:
parent
f0e6a35941
commit
9d9515c399
@ -29,6 +29,43 @@ struct sdt
|
|||||||
uint8_t data[];
|
uint8_t data[];
|
||||||
}__attribute__((packed));
|
}__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()
|
static struct rsdp *find_rsdp()
|
||||||
{
|
{
|
||||||
uintptr_t ebda_start = *(uint16_t *)P2V(0x40e);
|
uintptr_t ebda_start = *(uint16_t *)P2V(0x40e);
|
||||||
@ -59,6 +96,38 @@ static struct rsdp *find_rsdp()
|
|||||||
return 0;
|
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)
|
static void parse_sdt(struct sdt *sdt, uint8_t revision)
|
||||||
{
|
{
|
||||||
uint32_t *p32 = (void *)sdt->data;
|
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_info("Found table: ");
|
||||||
debug_putsn((char *)table->signature, 4);
|
debug_putsn((char *)table->signature, 4);
|
||||||
debug_printf("\n");
|
debug_printf("\n");
|
||||||
|
if(!memcmp(table->signature, "APIC", 4))
|
||||||
|
parse_madt((void *)table->data, table->len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,26 @@
|
|||||||
#pragma once
|
#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();
|
void acpi_init();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user