acpi - start implementing acpi

This commit is contained in:
RaphProductions 2025-05-14 20:32:26 +02:00
parent 31e53e88b9
commit 4d52bac946
4 changed files with 76 additions and 114 deletions

View file

@ -73,11 +73,9 @@ void kmain(void) {
gdt_init(&kstack[8192]);
idt_init();
fpu_activate();
sse_init();
pmm_init();
vmm_init();
kernel_vma_context = vma_create_context(vmm_kernel_pm);
if (!kernel_vma_context) {
log("kernel - vma ctx creation failed. halting\n");
@ -86,9 +84,10 @@ void kmain(void) {
asm("hlt");
}
acpi_init();
syscall_init();
pit_init(1000);
sched_init();
//pit_init(1000);
//sched_init();
//vfs_init();

View file

@ -3,48 +3,38 @@
#include "sys/log.h"
#include <mm/memop.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/acpi.h>
#include <sys/errhnd/panic.h>
__attribute__((
used,
section(".limine_requests"))) static volatile struct limine_rsdp_request
rsdp_req = {.revision = 0, .id = LIMINE_RSDP_REQUEST};
rsdp_t *rsdp;
int acpi_available = 0;
static int __acpi_uses_xsdt = 0;
static void *__acpi_rsdt_ptr;
int is_xsdt = 0;
xsdt_t *xsdt;
rsdt_t *rsdt;
int item_count = 0;
void *acpi_find_table(const char *name) {
if (!__acpi_uses_xsdt) {
acpi_rsdt *rsdt = (acpi_rsdt *)__acpi_rsdt_ptr;
uint32_t entries = (rsdt->sdt.len - sizeof(rsdt->sdt)) / 4;
static int acpi_validate_rsdp(char *byte_array, size_t size) {
uint32_t sum = 0;
for (int i = 0; i < size; i++) {
sum += byte_array[i];
}
return (sum & 0xFF) == 0;
}
void *acpi_find_table(char *sign, int sign_size) {
if (!acpi_available)
return NULL;
if (is_xsdt) {
for (int i = 0; i < item_count; i++) {
uint64_t *lst =
(uint64_t *)HIGHER_HALF((uint64_t)xsdt->PointerToOtherSDT);
acpi_table_header_t *ptr = (acpi_table_header_t *)HIGHER_HALF(lst[i]);
if (!memcmp(ptr->Signature, sign, sign_size))
return (void *)ptr;
for (uint32_t i = 0; i < entries; i++) {
acpi_sdt *sdt = (acpi_sdt *)HIGHER_HALF(*((uint32_t *)rsdt->table + i));
if (!memcmp(sdt->sign, name, 4))
return (void *)sdt;
}
} else {
for (int i = 0; i < item_count; i++) {
acpi_table_header_t *ptr = (acpi_table_header_t *)HIGHER_HALF(
(uint64_t)rsdt->PointerToOtherSDT[i]);
if (!memcmp(ptr->Signature, sign, sign_size))
return (void *)ptr;
return NULL;
}
acpi_xsdt *xsdt = (acpi_xsdt *)__acpi_rsdt_ptr;
uint32_t entries = (xsdt->sdt.len - sizeof(xsdt->sdt)) / 8;
for (uint32_t i = 0; i < entries; i++) {
acpi_sdt *sdt = (acpi_sdt *)HIGHER_HALF(*((uint64_t *)xsdt->table + i));
if (!memcmp(sdt->sign, name, 4)) {
return (void *)sdt;
}
}
@ -52,44 +42,17 @@ void *acpi_find_table(char *sign, int sign_size) {
}
void acpi_init() {
rsdp_t *rsdp = (rsdp_t *)HIGHER_HALF(rsdp_req.response->address);
acpi_rsdp *rsdp = (acpi_rsdp *)rsdp_req.response->address;
if (!rsdp) {
log("acpi - not available: RSDP is NULL!\n");
if (memcmp(rsdp->sign, "RSD PTR", 7))
panic("acpi: Invalid RSDP signature!");
if (rsdp->revision != 0) {
__acpi_uses_xsdt = 1;
acpi_xsdp *xsdp = (acpi_xsdp *)rsdp;
__acpi_rsdt_ptr = (acpi_xsdt *)HIGHER_HALF((uint64_t)xsdp->xsdt_addr);
return;
}
if (rsdp->rev < 2) {
if (!acpi_validate_rsdp((char *)rsdp, sizeof(rsdp_t))) {
log("acpi - not available: Was the RSDP hijacked?\n");
return;
}
rsdt = (rsdt_t *)HIGHER_HALF((uint64_t)rsdp->rsdt_addr);
log("acpi - RSDT found at %p\n", rsdt);
item_count = (rsdt->h.Length - sizeof(acpi_table_header_t)) / 4;
log("acpi - RSDT contains %d entries\n", item_count);
} else {
is_xsdt = 1;
if (!acpi_validate_rsdp((char *)rsdp, sizeof(xsdp_t))) {
log("acpi - not available: Was the XSDP hijacked?\n");
return;
}
xsdt = (xsdt_t *)HIGHER_HALF((uint64_t)((xsdp_t *)rsdp)->xsdt_addr);
log("acpi - XSDT found at %p\n", xsdt);
item_count = (xsdt->h.Length - sizeof(acpi_table_header_t)) / 8;
log("acpi - XSDT contains %d entries\n", item_count);
}
acpi_available = 1;
void *fadt = acpi_find_table("FACP", 4);
if (!fadt) {
log("acpi - FADT not found\n");
acpi_available = 0;
return;
} else {
log("acpi - FADT found at %p\n", fadt);
log("acpi - ACPI initialized successfully\n");
}
__acpi_rsdt_ptr = (acpi_rsdt *)HIGHER_HALF((uint64_t)rsdp->rsdt_addr);
}

View file

@ -5,47 +5,48 @@
#define ACPI_RSDP_SIGNATURE "RSD PTR "
#define ACPI_RSDP_SIGNATURE_LEN 7
typedef struct __acpi_table_header {
char Signature[4];
uint32_t Length;
uint8_t Revision;
uint8_t Checksum;
char OEMID[6];
char OEMTableID[8];
uint32_t OEMRevision;
uint32_t CreatorID;
uint32_t CreatorRevision;
} acpi_table_header_t;
typedef struct __rsdp {
char signature[8];
uint8_t chksum;
char oemid[6];
uint8_t rev;
typedef struct {
char sign[8];
uint8_t checksum;
char oem_id[6];
uint8_t revision;
uint32_t rsdt_addr;
} __attribute__((packed)) rsdp_t;
} __attribute__((packed)) acpi_rsdp;
typedef struct __xsdp {
char signature[8];
uint8_t chksum;
char oemid[6];
uint8_t rev;
uint32_t rsdt_addr; // deprecated since version 2.0
typedef struct {
char sign[8];
uint8_t checksum;
char oem_id[6];
uint8_t revision;
uint32_t resv;
uint32_t len;
uint32_t length;
uint64_t xsdt_addr;
uint8_t chksum_ex;
uint8_t reserved[3];
} __attribute__((packed)) xsdp_t;
uint8_t extended_checksum;
uint8_t resv1[3];
} __attribute__((packed)) acpi_xsdp;
typedef struct __rsdt {
acpi_table_header_t h;
uint32_t *PointerToOtherSDT;
} rsdt_t;
typedef struct {
char sign[4];
uint32_t len;
uint8_t revision;
uint8_t checksum;
char oem_id[6];
char oem_table_id[8];
uint32_t oem_revision;
uint32_t creator_id;
uint32_t creator_revision;
} __attribute__((packed)) acpi_sdt;
typedef struct __xsdt {
acpi_table_header_t h;
uint64_t *PointerToOtherSDT;
} xsdt_t;
typedef struct {
acpi_sdt sdt;
char table[];
} acpi_rsdt;
typedef struct {
acpi_sdt sdt;
char table[];
} acpi_xsdt;
void *acpi_find_table(const char *name);
void acpi_init();

View file

@ -39,14 +39,13 @@ void idt_init() {
idt_set_descriptor(vector, isr_stub_table[vector], 0xEE);
vectors[vector] = 1;
pic_init();
pic_unmask_irq(1);
pic_unmask_irq(8);
// Do not use the legacy PIC.
//pic_init();
//pic_unmask_irq(1);
//pic_unmask_irq(8);
__asm__ volatile("lidt %0" : : "m"(idtr)); // load the new IDT
__asm__ volatile("sti"); // set the interrupt flag
// logln(progress, "kinit stage 1", "IDT initialized! Time to receive
// interrupts!\n");
log("idt - initialized\n");
}