From f0e6a35941ab9087a77db3a1bf4b291c2c0b1cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Fri, 23 Feb 2018 13:31:55 +0100 Subject: [PATCH] Find and read ACPI tables --- src/kernel/boot/kmain.c | 3 ++ src/kernel/drivers/acpi.c | 81 +++++++++++++++++++++++++++++++++++++++ src/kernel/include/smp.h | 3 ++ 3 files changed, 87 insertions(+) create mode 100644 src/kernel/drivers/acpi.c create mode 100644 src/kernel/include/smp.h diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index dbbd180..7d3bd0a 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -7,6 +7,7 @@ #include #include #include +#include void thread_function() { @@ -30,6 +31,8 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) cpu_init(); + acpi_init(); + struct process *p1 = new_process((void (*)(void))0x10000); procmm_brk(p1, (void *)0x10100); memcpy_to_p4(p1->P4, (void *)0x10000, (void *)(uintptr_t)thread_function, 100); diff --git a/src/kernel/drivers/acpi.c b/src/kernel/drivers/acpi.c new file mode 100644 index 0000000..8ee5c0c --- /dev/null +++ b/src/kernel/drivers/acpi.c @@ -0,0 +1,81 @@ +#include +#include +#include + +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); +} diff --git a/src/kernel/include/smp.h b/src/kernel/include/smp.h new file mode 100644 index 0000000..2ab42f7 --- /dev/null +++ b/src/kernel/include/smp.h @@ -0,0 +1,3 @@ +#pragma once + +void acpi_init();