A bit of ACPI code cleanup
This commit is contained in:
parent
9d9515c399
commit
7648358078
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
Loading…
x
Reference in New Issue
Block a user