aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/arch.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/arch.c')
-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;
+}