aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/acpi.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/acpi.cc')
-rw-r--r--src/drivers/acpi.cc61
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){