Files
my-os-project2/kernel/hal/x86_64/acpi.c
2025-08-22 12:37:48 +02:00

81 lines
1.9 KiB
C

#include <stddef.h>
#include <stdint.h>
#include "hal/hal.h"
#include "kprintf.h"
#include "dlmalloc/malloc.h"
#include "compiler/attr.h"
#include "acpi.h"
#include "assert.h"
#include "util/util.h"
#include "bootinfo/bootinfo.h"
#include "uacpi/uacpi.h"
#include "uacpi/acpi.h"
#include "apic.h"
struct acpi_madt *MADT = NULL;
// uACPI
void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char *s) {
char *t = NULL;
switch (lvl) {
case UACPI_LOG_INFO: t = "Info"; break;
case UACPI_LOG_WARN: t = "Warn"; break;
case UACPI_LOG_DEBUG: t = "Dbg"; break;
case UACPI_LOG_ERROR: t = "Err"; break;
case UACPI_LOG_TRACE: t = "Trc"; break;
}
LOG("uACPI", "%s %s", t, s);
}
void uacpi_kernel_unmap(void *addr, uacpi_size len) {
// .
}
void *uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) {
return (void *)(BOOT_INFO.hhdm_off + addr);
}
uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr *out) {
*out = BOOT_INFO.rsdp;
return UACPI_STATUS_OK;
}
void acpi_init(void) {
uacpi_status r;
size_t tmpbufsize = 0x1000;
void *tmpbuf = dlmalloc(tmpbufsize);
if (tmpbuf == NULL) {
ERR("hal", "could not allocate uACPI tmp buf\n");
hal_hang();
}
r = uacpi_setup_early_table_access(tmpbuf, tmpbufsize);
if (uacpi_unlikely_error(r)) {
ERR("hal", "uACPI init early table failed\n");
hal_hang();
}
LOG("hal", "acpi init\n");
}
uint8_t acpi_remapirq(uint8_t irq) {
uint64_t cur = (uint64_t)&MADT->entries;
uint64_t end = cur + MADT->hdr.length;
while (cur < end) {
struct acpi_entry_hdr *ent = (struct acpi_entry_hdr *)cur;
if (ent->type == ACPI_MADT_ENTRY_TYPE_INTERRUPT_SOURCE_OVERRIDE) {
struct acpi_madt_interrupt_source_override *override = (struct acpi_madt_interrupt_source_override *)ent;
if (override->source == irq) {
return override->gsi;
}
}
cur += ent->length;
}
return irq;
}