From e147ad875811f96e07a408cb81b6dd4ff298f18f Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 23 Jul 2016 13:42:35 +0200 Subject: [PATCH] More hardware support --- kernel/include/kernel_utils.hpp | 16 ++++++++++ kernel/src/thor_acpi.cpp | 53 +++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/kernel/include/kernel_utils.hpp b/kernel/include/kernel_utils.hpp index 3e3ba63a..59857a90 100644 --- a/kernel/include/kernel_utils.hpp +++ b/kernel/include/kernel_utils.hpp @@ -40,6 +40,16 @@ inline uint32_t in_dword(uint16_t _port){ return rv; } +inline uint64_t in_qword(uint16_t _port){ + uint64_t rv; + + asm volatile ("in %[data], %[port]" + : [data] "=a" (rv) + : [port] "dN" (_port)); + + return rv; +} + inline void out_byte (uint16_t _port, uint8_t _data){ asm volatile ("out %[port], %[data]" : /* No outputs */ @@ -58,6 +68,12 @@ inline void out_dword(uint16_t _port, uint32_t _data){ : [port] "dN" (_port), [data] "a" (_data)); } +inline void out_qword(uint16_t _port, uint64_t _data){ + asm volatile ("out %[port], %[data]" + : /* No outputs */ + : [port] "dN" (_port), [data] "a" (_data)); +} + inline uint16_t switch_endian_16(uint16_t nb) { return (nb>>8) | (nb<<8); } diff --git a/kernel/src/thor_acpi.cpp b/kernel/src/thor_acpi.cpp index b2d89d32..520b9dec 100644 --- a/kernel/src/thor_acpi.cpp +++ b/kernel/src/thor_acpi.cpp @@ -16,6 +16,7 @@ #include "scheduler.hpp" #include "virtual_allocator.hpp" #include "paging.hpp" +#include "kernel_utils.hpp" #include "mutex.hpp" #include "semaphore.hpp" @@ -187,4 +188,56 @@ ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE handle, UINT32 units){ return AE_OK; } +// Input / Output + +ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS port, UINT32* value, UINT32 width){ + switch (width) { + case 8: + *value = in_byte(port); + break; + + case 16: + *value = in_word(port); + break; + + case 32: + *value = in_dword(port); + break; + + case 64: + *value = in_qword(port); + break; + + default: + return AE_BAD_PARAMETER; + } + + return AE_OK; +} + +ACPI_STATUS AcpiOsWritePort(ACPI_IO_ADDRESS port, UINT32 value, UINT32 width){ + switch (width) { + case 8: + out_byte(port, value); + break; + + case 16: + out_word(port, value); + break; + + case 32: + out_dword(port, value); + break; + + case 64: + out_qword(port, value); + break; + + default: + return AE_BAD_PARAMETER; + } + + return AE_OK; +} + } //end of extern "C"