More hardware support

This commit is contained in:
Baptiste Wicht 2016-07-23 13:42:35 +02:00
parent c752e65bb3
commit e147ad8758
2 changed files with 69 additions and 0 deletions

View File

@ -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);
}

View File

@ -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"