A bit of ACPI code cleanup

This commit is contained in:
Thomas Lovén 2018-03-13 12:51:45 +01:00
parent 9d9515c399
commit 7648358078
3 changed files with 46 additions and 37 deletions

View File

@ -7,7 +7,7 @@
#include <interrupts.h> #include <interrupts.h>
#include <process.h> #include <process.h>
#include <scheduler.h> #include <scheduler.h>
#include <smp.h> #include <acpi.h>
void thread_function() void thread_function()
{ {

View File

@ -1,7 +1,9 @@
#include <smp.h> #include <acpi.h>
#include <memory.h> #include <memory.h>
#include <debug.h> #include <debug.h>
#define packed __attribute__((packed))
struct rsdp struct rsdp
{ {
uint8_t signature[8]; uint8_t signature[8];
@ -13,7 +15,8 @@ struct rsdp
uint64_t xsdt; uint64_t xsdt;
uint8_t checksum2; uint8_t checksum2;
uint8_t _[3]; uint8_t _[3];
}__attribute__((packed)); }packed;
#define RSDP_SIGNATURE "RSD PTR "
struct sdt struct sdt
{ {
@ -27,14 +30,15 @@ struct sdt
uint32_t creator; uint32_t creator;
uint32_t creator_rev; uint32_t creator_rev;
uint8_t data[]; uint8_t data[];
}__attribute__((packed)); }packed;
#define MADT_SIGNATURE "APIC"
struct madt struct madt
{ {
uint32_t lic_address; uint32_t lic_address;
uint32_t flags; uint32_t flags;
uint8_t data[]; uint8_t data[];
}__attribute__((packed)); }packed;
struct madt_entry struct madt_entry
{ {
uint8_t type; uint8_t type;
@ -44,21 +48,21 @@ struct madt_entry
uint8_t id; uint8_t id;
uint8_t apic; uint8_t apic;
uint32_t flags; uint32_t flags;
}__attribute__((packed)) lapic; }packed lapic;
struct { struct {
uint8_t id; uint8_t id;
uint8_t _; uint8_t _;
uint32_t addr; uint32_t addr;
uint32_t base; uint32_t base;
}__attribute__((packed)) ioapic; }packed ioapic;
struct { struct {
uint8_t bus; uint8_t bus;
uint8_t source; uint8_t source;
uint32_t target; uint32_t target;
uint16_t flags; uint16_t flags;
}__attribute__((packed)) interrupt; }packed interrupt;
}; };
}__attribute__((packed)); }packed;
#define MADT_CPU 0 #define MADT_CPU 0
#define MADT_IOAPIC 1 #define MADT_IOAPIC 1
@ -66,32 +70,29 @@ struct madt_entry
struct acpi_info acpi_info = {0}; struct acpi_info acpi_info = {0};
static void *scan_rsdp(uint64_t start, uint64_t end)
{
void *p = P2V(start);
while(p < P2V(end))
{
if(!memcmp(p, RSDP_SIGNATURE, 8))
return p;
p = incptr(p, 16);
}
return 0;
}
static struct rsdp *find_rsdp() static struct rsdp *find_rsdp()
{ {
uintptr_t ebda_start = *(uint16_t *)P2V(0x40e); // Scan the Extended BIOS Data Area
uintptr_t ebda_end = ebda_start + 1024; uint16_t *ebda_ptr = P2V(0x40e);
uint64_t ebda = *ebda_ptr << 4;
void *p = scan_rsdp(ebda, ebda+1024);
if(p) return p;
void *p = P2V(ebda_start); // Scan 0xE0000 - 0xFFFFF
while(p < P2V(ebda_end)) p = scan_rsdp(0xE0000, 0xFFFFF);
{ if(p) return p;
if(!memcmp(p, "RSD PTR ", 8))
{
debug_info("RSDP found at:%x\n", p);
return p;
}
p = incptr(p, 16);
}
p = P2V(0xE0000);
while(p < P2V(0xFFFFF))
{
if(!memcmp(p, "RSD PTR ", 8))
{
debug_info("RSDP found at:%x\n", p);
return p;
}
p = incptr(p, 16);
}
return 0; return 0;
} }
@ -106,20 +107,25 @@ static void parse_madt(struct madt *madt, uint32_t len)
int i; int i;
switch(e->type) switch(e->type)
{ {
case MADT_CPU: case MADT_CPU: // APIC descriptor (corresponds to unique cpu core)
// Check if cpu is enabled
if(!(e->lapic.id & 1)) break;
// Add to list
i = acpi_info.num_cpus; i = acpi_info.num_cpus;
acpi_info.cpu[i].id = e->lapic.id; acpi_info.cpu[i].id = e->lapic.id;
acpi_info.cpu[i].apic = e->lapic.apic; acpi_info.cpu[i].apic = e->lapic.apic;
acpi_info.num_cpus++; acpi_info.num_cpus++;
break; break;
case MADT_IOAPIC:
case MADT_IOAPIC: // IOAPIC descriptor
i = acpi_info.num_ioapic; i = acpi_info.num_ioapic;
acpi_info.ioapic[i].id = e->ioapic.id; acpi_info.ioapic[i].id = e->ioapic.id;
acpi_info.ioapic[i].addr = e->ioapic.addr; acpi_info.ioapic[i].addr = e->ioapic.addr;
acpi_info.ioapic[i].base = e->ioapic.base; acpi_info.ioapic[i].base = e->ioapic.base;
acpi_info.num_ioapic++; acpi_info.num_ioapic++;
break; break;
case MADT_INT:
case MADT_INT: // Interrupt remap
acpi_info.int_map[e->interrupt.source] = e->interrupt.target; acpi_info.int_map[e->interrupt.source] = e->interrupt.target;
break; break;
} }
@ -136,10 +142,12 @@ static void parse_sdt(struct sdt *sdt, uint8_t revision)
for(int i = 0; i < entries; i++) for(int i = 0; i < entries; i++)
{ {
struct sdt *table = P2V(revision ? p64[i] : p32[i]); struct sdt *table = P2V(revision ? p64[i] : p32[i]);
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))
if(!memcmp(table->signature, MADT_SIGNATURE, 4))
parse_madt((void *)table->data, table->len); parse_madt((void *)table->data, table->len);
} }
} }

View File

@ -19,8 +19,9 @@ struct acpi_info
uint32_t base; uint32_t base;
} ioapic[MAX_IOAPIC]; } ioapic[MAX_IOAPIC];
uint32_t int_map[255]; uint32_t int_map[256];
}; };
extern struct acpi_info acpi_info; extern struct acpi_info acpi_info;
void acpi_init(); void acpi_init();
int get_cpu();