Find and read ACPI tables
This commit is contained in:
parent
20ae7d56b3
commit
f0e6a35941
@ -7,6 +7,7 @@
|
|||||||
#include <interrupts.h>
|
#include <interrupts.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <scheduler.h>
|
#include <scheduler.h>
|
||||||
|
#include <smp.h>
|
||||||
|
|
||||||
void thread_function()
|
void thread_function()
|
||||||
{
|
{
|
||||||
@ -30,6 +31,8 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data)
|
|||||||
|
|
||||||
cpu_init();
|
cpu_init();
|
||||||
|
|
||||||
|
acpi_init();
|
||||||
|
|
||||||
struct process *p1 = new_process((void (*)(void))0x10000);
|
struct process *p1 = new_process((void (*)(void))0x10000);
|
||||||
procmm_brk(p1, (void *)0x10100);
|
procmm_brk(p1, (void *)0x10100);
|
||||||
memcpy_to_p4(p1->P4, (void *)0x10000, (void *)(uintptr_t)thread_function, 100);
|
memcpy_to_p4(p1->P4, (void *)0x10000, (void *)(uintptr_t)thread_function, 100);
|
||||||
|
81
src/kernel/drivers/acpi.c
Normal file
81
src/kernel/drivers/acpi.c
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#include <smp.h>
|
||||||
|
#include <memory.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
struct rsdp
|
||||||
|
{
|
||||||
|
uint8_t signature[8];
|
||||||
|
uint8_t checksum;
|
||||||
|
uint8_t OEMID[6];
|
||||||
|
uint8_t revision;
|
||||||
|
uint32_t rsdt;
|
||||||
|
uint32_t length;
|
||||||
|
uint64_t xsdt;
|
||||||
|
uint8_t checksum2;
|
||||||
|
uint8_t _[3];
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
struct sdt
|
||||||
|
{
|
||||||
|
uint8_t signature[4];
|
||||||
|
uint32_t len;
|
||||||
|
uint8_t revision;
|
||||||
|
uint8_t checksum;
|
||||||
|
uint8_t OEMID[6];
|
||||||
|
uint8_t table_ID[8];
|
||||||
|
uint32_t OEM_revision;
|
||||||
|
uint32_t creator;
|
||||||
|
uint32_t creator_rev;
|
||||||
|
uint8_t data[];
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
static struct rsdp *find_rsdp()
|
||||||
|
{
|
||||||
|
uintptr_t ebda_start = *(uint16_t *)P2V(0x40e);
|
||||||
|
uintptr_t ebda_end = ebda_start + 1024;
|
||||||
|
|
||||||
|
void *p = P2V(ebda_start);
|
||||||
|
while(p < P2V(ebda_end))
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parse_sdt(struct sdt *sdt, uint8_t revision)
|
||||||
|
{
|
||||||
|
uint32_t *p32 = (void *)sdt->data;
|
||||||
|
uint64_t *p64 = (void *)sdt->data;
|
||||||
|
int entries = (sdt->len - sizeof(struct sdt)) / (revision ? 8 : 4);
|
||||||
|
for(int i = 0; i < entries; i++)
|
||||||
|
{
|
||||||
|
struct sdt *table = P2V(revision ? p64[i] : p32[i]);
|
||||||
|
debug_info("Found table: ");
|
||||||
|
debug_putsn((char *)table->signature, 4);
|
||||||
|
debug_printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void acpi_init()
|
||||||
|
{
|
||||||
|
struct rsdp *rsdp = find_rsdp();
|
||||||
|
struct sdt *s = P2V(rsdp->revision ? rsdp->xsdt : rsdp->rsdt);
|
||||||
|
parse_sdt(s, rsdp->revision);
|
||||||
|
}
|
3
src/kernel/include/smp.h
Normal file
3
src/kernel/include/smp.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void acpi_init();
|
Loading…
x
Reference in New Issue
Block a user