67 lines
1.7 KiB
C
67 lines
1.7 KiB
C
#include <zinnia/acpi.h>
|
|
#include <zinnia/console.h>
|
|
#include <zinnia/init.h>
|
|
#include <zinnia/mmio.h>
|
|
#include <zinnia/pmap.h>
|
|
#include <zinnia/print.h>
|
|
#include <zinnia/utils.h>
|
|
#include <zinnia/virt.h>
|
|
#include <zinnia/vma.h>
|
|
#include <arch/mem.h>
|
|
#include <stdarg.h>
|
|
#include <uacpi/kernel_api.h>
|
|
#include <uacpi/status.h>
|
|
#include <uacpi/types.h>
|
|
|
|
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);
|
|
}
|