diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/acpi.cc | 64 | ||||
| -rw-r--r-- | src/drivers/acpi.hpp | 43 |
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); + |
