diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-26 12:37:34 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-26 12:37:34 +0200 |
| commit | 9dc527b3be9d493dcf8cf1baf78477373eb5990d (patch) | |
| tree | 0b32c28e57fc5a6a3e6210d9a601dfdbfe246cd8 /src/drivers/acpi.cc | |
| parent | 7db6db5ae64e7ab2626bbd898c63f58e053dc1a6 (diff) | |
Enable psf font for framebuffer display
Diffstat (limited to 'src/drivers/acpi.cc')
| -rw-r--r-- | src/drivers/acpi.cc | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/src/drivers/acpi.cc b/src/drivers/acpi.cc index bb48ba4..9c25202 100644 --- a/src/drivers/acpi.cc +++ b/src/drivers/acpi.cc @@ -1,33 +1,40 @@ #include "acpi.hpp" #include "core/paging.hpp" -#include "drivers/framebuffer.hpp" #include "libs/stdio.hpp" #include "libs/string.hpp" -// TODO: ALL! +RSDP rsdp; +RSDT rsdt; +IOAPIC ioapic; +char acpi_init(void* rsdp_p){ + printk("Init ACPI... "); -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"); + printk("Wrong RSDP Signature\n"); return 1; } - printk("ACPI Revision %d detected!\n",rsdp.revision); + printk("ACPI Revision %d detected. ",rsdp.revision); - // Load RSDT - RSDT rsdt; + // Load sub tables + if(acpi_load_rsdt()) + return 1; + if(acpi_load_madt()) + return 1; + print("\n"); + return 0; +} - paging_allocate_addr(kpml4,(u64)rsdp.rsdt_addr,(u64)rsdp.rsdt_addr,PAGING_OPT_P|PAGING_OPT_RW); +char acpi_load_rsdt(){ + PAGING_MAP(rsdp.rsdt_addr); // Ensure page is accessible 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; @@ -36,22 +43,38 @@ char acpi_load_madt(void* rsdp_p){ printk("Wrong RSDT Signature\n"); return 1; } + printk("RSDT loaded. "); + return 0; +} +char acpi_load_madt(){ + int n_entry=(rsdt.header.length-36)/4; // Locate MADT - for(int i=0;i<10;i++){ + for(int i=0;i<n_entry;i++){ u32 *addr=(u32*)(rsdt.first_entry_addr_ptr+i*4); - u64 header_p_i=*addr; + // Load header 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)); + PAGING_MAP(*addr); + memcpy((void*)*addr, &header, sizeof(header)); + // Check if it is MADT if(header.signature==ACPI_MADT_SIGNATURE){ - printk("MADT found!"); + printk("MADT found. "); + int int_ctrl_location=0; + while(int_ctrl_location<(header.length-44)){ + u32 cur_addr=(*addr)+44+int_ctrl_location; + INT_CTRL_HEADER int_header; + memcpy((void*)cur_addr, &int_header, sizeof(int_header)); + if(int_header.type==1){ + printk("APIC Detected."); + memcpy((void*)cur_addr, &ioapic, sizeof(ioapic)); + return 0; + } + int_ctrl_location+=int_header.length; + } + } } - - - - return 0; + return 1; } char acpi_checksum(void* p, char size){ |
