#include "acpi.hpp" #include "core/paging.hpp" #include "libs/stdio.hpp" #include "libs/string.hpp" RSDP rsdp; RSDT rsdt; IOAPIC ioapic; char acpi_init(void* rsdp_p){ printk("Init ACPI... "); // Load 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"); return 1; } printk("ACPI Revision %d detected. ",rsdp.revision); // Load sub tables if(acpi_load_rsdt()) return 1; if(acpi_load_madt()) return 1; print("\n"); return 0; } char acpi_load_rsdt(){ PAGE_MAP(rsdp.rsdt_addr,rsdp.rsdt_addr,PAGING_OPT_DEFAULTS); // 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; } if(acpi_checksum((void*)rsdp.rsdt_addr, rsdt.header.length)){ 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