diff --git a/arch/x86_64/acpi.c b/arch/x86_64/acpi.c new file mode 100644 index 0000000..ac3e61e --- /dev/null +++ b/arch/x86_64/acpi.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include + +uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle* out_handle) { + uintptr_t end; + if (ckd_add(&end, base, len) || end > 0x10000) + return UACPI_STATUS_INVALID_ARGUMENT; + *out_handle = (uacpi_handle)(uintptr_t)base; + return UACPI_STATUS_OK; +} + +void uacpi_kernel_io_unmap(uacpi_handle handle) { + // Left intentionally blank. +} + +#define IO_READ(width, suffix) \ + uacpi_status uacpi_kernel_io_read##width(uacpi_handle handle, uacpi_size offset, uacpi_u##width* out_value) { \ + *out_value = asm_in##suffix((uintptr_t)handle + offset); \ + return UACPI_STATUS_OK; \ + } + +#define IO_WRITE(width, suffix) \ + uacpi_status uacpi_kernel_io_write##width(uacpi_handle handle, uacpi_size offset, uacpi_u##width in_value) { \ + asm_out##suffix((uintptr_t)handle + offset, in_value); \ + return UACPI_STATUS_OK; \ + } + +IO_READ(8, b) +IO_READ(16, w) +IO_READ(32, l) +IO_WRITE(8, b) +IO_WRITE(16, w) +IO_WRITE(32, l) diff --git a/arch/x86_64/meson.build b/arch/x86_64/meson.build index bdb743b..5a34550 100644 --- a/arch/x86_64/meson.build +++ b/arch/x86_64/meson.build @@ -27,3 +27,7 @@ kernel_sources += files( if kconfig.get('CONFIG_PCI', 'n') == 'y' kernel_sources += files('pci.c') endif + +if kconfig.get('CONFIG_ACPI', 'n') == 'y' + kernel_sources += files('acpi.c') +endif diff --git a/subprojects/uacpi b/subprojects/uacpi index f5f6cc2..686a9a5 160000 --- a/subprojects/uacpi +++ b/subprojects/uacpi @@ -1 +1 @@ -Subproject commit f5f6cc29f85dd5db0dd79c47700c8f3ebce18be4 +Subproject commit 686a9a52d9ad72690406d7cada82801377d5e2fa