Find RSD Table in early BIOS memory
Adding functions and structures to read the RSD.
This commit is contained in:
parent
2621399349
commit
72008b0a7a
46
src/kernel/drivers/rsdp/rsdp.cpp
Normal file
46
src/kernel/drivers/rsdp/rsdp.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#include "rsdp.h"
|
||||||
|
|
||||||
|
void printRSD(RSDPTR* rsd){
|
||||||
|
printf("Signature: ");
|
||||||
|
for(int i = 0; i < 8; i++){
|
||||||
|
kterm_put(rsd->signature[i]);
|
||||||
|
}
|
||||||
|
kterm_put('\n');
|
||||||
|
|
||||||
|
printf("OEMID: ");
|
||||||
|
for(int i =0; i < 6 ; i++){
|
||||||
|
kterm_put (rsd->OEMID[i]);
|
||||||
|
}
|
||||||
|
kterm_put('\n');
|
||||||
|
|
||||||
|
printf("Revision: %d\n", rsd->Revision);
|
||||||
|
printf("RSDT Address: 0x%x\n", rsd->RsdtAddress );
|
||||||
|
}
|
||||||
|
|
||||||
|
RSDPTR* FindRSD(){
|
||||||
|
char* memory_byte = (char*) 0x000f2e14;
|
||||||
|
const void* string = "RSD PTR ";
|
||||||
|
|
||||||
|
for( ; (uint32_t) memory_byte < 0x0100000; memory_byte+=10){
|
||||||
|
if( memcmp(memory_byte , string , 8 ) == 0 ) {
|
||||||
|
printf("RSD PTR found at 0x%x !\n", memory_byte);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printRSD((RSDPTR*) memory_byte);
|
||||||
|
return (RSDPTR*) memory_byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RSDT* getRSDT(RSDPTR* rsd){
|
||||||
|
|
||||||
|
RSDT* rsdt = (RSDT*) rsd->RsdtAddress;
|
||||||
|
|
||||||
|
printf("OEMID: ");
|
||||||
|
for(int i = 0; i < 6; i++){
|
||||||
|
kterm_put(rsdt->header.OEMID[i]);
|
||||||
|
}
|
||||||
|
kterm_put('\n');
|
||||||
|
return rsdt;
|
||||||
|
}
|
36
src/kernel/drivers/rsdp/rsdp.h
Normal file
36
src/kernel/drivers/rsdp/rsdp.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "./../../tty/kterm.h"
|
||||||
|
#include "../../../libc/include/mem.h"
|
||||||
|
struct RSDPTR {
|
||||||
|
char signature[8];
|
||||||
|
uint8_t Checksum ;
|
||||||
|
char OEMID [6];
|
||||||
|
uint8_t Revision;
|
||||||
|
uint32_t RsdtAddress;
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
struct ACPISDTHeader{
|
||||||
|
char Signature[4];
|
||||||
|
uint32_t Length;
|
||||||
|
uint8_t CheckSum;
|
||||||
|
char OEMID[6];
|
||||||
|
char OEMTableID[8];
|
||||||
|
uint32_t OEMRevision;
|
||||||
|
uint32_t CreatorID;
|
||||||
|
uint32_t CreatorRevision;
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
|
struct RSDT{
|
||||||
|
struct ACPISDTHeader header;
|
||||||
|
uint32_t PointerToSDT[]; // Length of array : (header.Length - sizeof(header))/ 4
|
||||||
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
|
//NOTE: only scans EBDA enough to find RSD PTR in QEMU
|
||||||
|
RSDPTR* FindRSD();
|
||||||
|
|
||||||
|
void printRSD(RSDPTR* rsd);
|
||||||
|
|
||||||
|
RSDT* getRSDT(RSDPTR* rsd);
|
Loading…
x
Reference in New Issue
Block a user