#include #include #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; }