aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/acpi.cc
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-25 12:41:24 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-25 12:41:24 +0200
commit7db6db5ae64e7ab2626bbd898c63f58e053dc1a6 (patch)
treeaac3b4b8755acbea397709a00611642c2534f053 /src/drivers/acpi.cc
parent657372f1be95393b76a54f258ba3f937b4073abe (diff)
Debug multiboot, enable apic and ACPI table parsing
Diffstat (limited to 'src/drivers/acpi.cc')
-rw-r--r--src/drivers/acpi.cc64
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