From 7db6db5ae64e7ab2626bbd898c63f58e053dc1a6 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 25 Apr 2021 12:41:24 +0200 Subject: Debug multiboot, enable apic and ACPI table parsing --- src/drivers/acpi.cc | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/drivers/acpi.hpp | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/drivers/acpi.cc create mode 100644 src/drivers/acpi.hpp (limited to 'src/drivers') diff --git a/src/drivers/acpi.cc b/src/drivers/acpi.cc new file mode 100644 index 0000000..bb48ba4 --- /dev/null +++ b/src/drivers/acpi.cc @@ -0,0 +1,64 @@ +#include "acpi.hpp" +#include "core/paging.hpp" +#include "drivers/framebuffer.hpp" +#include "libs/stdio.hpp" +#include "libs/string.hpp" + +// TODO: ALL! + + +char acpi_load_madt(void* rsdp_p){ + // Load RSDP + RSDP rsdp; + memcpy(rsdp_p, &rsdp, sizeof(rsdp)); + if(rsdp.signature!=ACPI_RSDP_SIGNATURE){ + printk("Invalid RSDP signature\n"); + return 1; + } + if(acpi_checksum(rsdp_p, 20)){ + printk("Wrong RSDP Signature\n\n"); + return 1; + } + printk("ACPI Revision %d detected!\n",rsdp.revision); + + // Load RSDT + RSDT rsdt; + + paging_allocate_addr(kpml4,(u64)rsdp.rsdt_addr,(u64)rsdp.rsdt_addr,PAGING_OPT_P|PAGING_OPT_RW); + memcpy((void*)rsdp.rsdt_addr, &rsdt, sizeof(rsdt)); + rsdt.first_entry_addr_ptr=rsdp.rsdt_addr+36; + + if(rsdt.header.signature !=ACPI_RSDT_SIGNATURE){ + printk("Invalid RSDT signature\n"); + return 1; + } + if(acpi_checksum((void*)rsdp.rsdt_addr, rsdt.header.length)){ + printk("Wrong RSDT Signature\n"); + return 1; + } + + // Locate MADT + for(int i=0;i<10;i++){ + u32 *addr=(u32*)(rsdt.first_entry_addr_ptr+i*4); + u64 header_p_i=*addr; + ACPI_TABLE_HEADER header; + paging_allocate_addr(kpml4,header_p_i,header_p_i,PAGING_OPT_P|PAGING_OPT_RW); + memcpy((void*)header_p_i, &header, sizeof(header)); + if(header.signature==ACPI_MADT_SIGNATURE){ + printk("MADT found!"); + } + } + + + + return 0; +} + +char acpi_checksum(void* p, char size){ + char checksum=0; + char* data_p=(char*)p; + for(int i=0;i