Debug multiboot, enable apic and ACPI table parsing
This commit is contained in:
parent
657372f1be
commit
7db6db5ae6
17 changed files with 226 additions and 19 deletions
64
src/drivers/acpi.cc
Normal file
64
src/drivers/acpi.cc
Normal file
|
@ -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);
|
||||
}
|
43
src/drivers/acpi.hpp
Normal file
43
src/drivers/acpi.hpp
Normal file
|
@ -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);
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue