#include #include #include #include #include #include #include #include #include #include #include #include #include #include uacpi_status uacpi_kernel_get_rsdp(uacpi_phys_addr* out_rsdp_address) { *out_rsdp_address = (uacpi_phys_addr)acpi_rsdp_addr; return UACPI_STATUS_OK; } void* uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) { uintptr_t aligned_addr = ALIGN_DOWN(addr, arch_mem_page_size()); uintptr_t difference = addr - aligned_addr; size_t aligned_len = ALIGN_UP(len + difference, arch_mem_page_size()); uintptr_t vaddr = vm_alloc(aligned_len); if (!vaddr) return nullptr; for (size_t i = 0; i < aligned_len; i += arch_mem_page_size()) { pmap_map(&kernel_vma.pmap, vaddr + i, aligned_addr + i, PROT_READ | PROT_WRITE, CACHE_ANY); } return (void*)(vaddr + difference); } void uacpi_kernel_unmap(void* addr, uacpi_size len) { // TODO } static enum log_level acpi_log_level(uacpi_log_level lvl) { switch (lvl) { case UACPI_LOG_ERROR: return LOG_ERR; case UACPI_LOG_WARN: return LOG_WARN; case UACPI_LOG_INFO: return LOG_INFO; default: return LOG_DEBUG; } } void uacpi_kernel_log(uacpi_log_level lvl, const uacpi_char* msg, ...) { va_list args; va_start(args, msg); log_vwrite_prefixed(acpi_log_level(lvl), "acpi: ", msg, args); va_end(args); } void uacpi_kernel_vlog(uacpi_log_level lvl, const uacpi_char* msg, uacpi_va_list args) { log_vwrite_prefixed(acpi_log_level(lvl), "acpi: ", msg, args); }