diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-25 12:41:24 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-25 12:41:24 +0200 |
| commit | 7db6db5ae64e7ab2626bbd898c63f58e053dc1a6 (patch) | |
| tree | aac3b4b8755acbea397709a00611642c2534f053 /src/drivers/acpi.cc | |
| parent | 657372f1be95393b76a54f258ba3f937b4073abe (diff) | |
Debug multiboot, enable apic and ACPI table parsing
Diffstat (limited to 'src/drivers/acpi.cc')
| -rw-r--r-- | src/drivers/acpi.cc | 64 |
1 files changed, 64 insertions, 0 deletions
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<size;i++){ + checksum+=data_p[i]; + } + return (checksum!=0); +}
\ No newline at end of file |
