aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2017-03-05 23:16:05 +0100
committerRobin Krahl <robin.krahl@ireas.org>2017-03-05 23:17:59 +0100
commit1f0ea8244fb80966280bd8ecee6a797130592d27 (patch)
treef1224a47a09942f16e7a8aa341ca3189d0b23c64 /arch/x86_64
parentf01e48444829cce9eec25f4562778da0ed4ae66c (diff)
downloadgarmos-1f0ea8244fb80966280bd8ecee6a797130592d27.tar.gz
garmos-1f0ea8244fb80966280bd8ecee6a797130592d27.tar.bz2
arch: add port set, port get and additional register set functions
Add regset16 and regset32 to the existing regset8 in arch.h, and prtset{8,16,32} and prtget{8,16,32} to access ports.
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/arch.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/arch/x86_64/arch.c b/arch/x86_64/arch.c
index 68f59fe..0479a52 100644
--- a/arch/x86_64/arch.c
+++ b/arch/x86_64/arch.c
@@ -15,8 +15,62 @@
#include <garmos/arch.h>
#include <garmos/types.h>
+void prtset8(const uint16_t port, const uint8_t val)
+{
+ asm volatile("outb %0, %1" : : "a" (val), "Nd" (port));
+}
+
+void prtset16(const uint16_t port, const uint16_t val)
+{
+ asm volatile("outw %0, %1" : : "a" (val), "Nd" (port));
+}
+
+void prtset32(const uint16_t port, const uint32_t val)
+{
+ asm volatile("outl %0, %1" : : "a" (val), "Nd" (port));
+}
+
+uint8_t prtget8(const uint16_t port)
+{
+ uint8_t res;
+
+ asm volatile("inb %1, %0" : "=a" (res) : "Nd" (port));
+
+ return res;
+}
+
+uint16_t prtget16(const uint16_t port)
+{
+ uint16_t res;
+
+ asm volatile("inw %1, %0" : "=a" (res) : "Nd" (port));
+
+ return res;
+}
+
+uint32_t prtget32(const uint16_t port)
+{
+ uint32_t res;
+
+ asm volatile("inl %1, %0" : "=a" (res) : "Nd" (port));
+
+ return res;
+}
+
void regset8(const uint32_t reg, const uint8_t val)
{
volatile uint8_t *p = (volatile uint8_t *) reg;
*p = val;
}
+
+void regset16(const uint32_t reg, const uint16_t val)
+{
+ volatile uint16_t *p = (volatile uint16_t *) reg;
+ *p = val;
+}
+
+void regset32(const uint32_t reg, const uint32_t val)
+{
+ volatile uint32_t *p = (volatile uint32_t *) reg;
+ *p = val;
+}