aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/acpi.cc64
-rw-r--r--src/drivers/acpi.hpp43
2 files changed, 107 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
diff --git a/src/drivers/acpi.hpp b/src/drivers/acpi.hpp
new file mode 100644
index 0000000..7bbcdb0
--- /dev/null
+++ b/src/drivers/acpi.hpp
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "include/boucane.hpp"
+
+#define ACPI_RSDP_SIGNATURE 0x2052545020445352
+#define ACPI_RSDT_SIGNATURE 0x54445352
+#define ACPI_MADT_SIGNATURE 0x43495041
+
+typedef struct RSDP {
+ u64 signature;
+ u8 checksum;
+ u64 oemid:48;
+ u8 revision;
+ u32 rsdt_addr;
+ u32 length;
+} __attribute__((packed)) RSDP;
+
+typedef struct ACPI_TABLE_HEADER {
+ u32 signature;
+ u32 length;
+ u8 revision;
+ u8 checksum;
+ u64 oemid:48;
+ u64 oem_table_id;
+ u32 oem_revision;
+ u32 creator_id;
+ u32 creator_revision;
+} __attribute__((packed)) ACPI_TABLE_HEADER;
+
+typedef struct RSDT {
+ ACPI_TABLE_HEADER header;
+ u32 first_entry_addr_ptr;
+} __attribute__((packed)) RSDT;
+
+typedef struct INT_CTRL_HEADER {
+ u8 type;
+ u8 length;
+} __attribute__((packed)) INT_CTRL_HEADER;
+
+
+char acpi_load_madt(void* rsdp_p);
+char acpi_checksum(void* p, char size);
+