aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/arch.c54
-rw-r--r--include/garmos/arch.h18
2 files changed, 72 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;
+}
diff --git a/include/garmos/arch.h b/include/garmos/arch.h
index 1e57e06..0cee4c2 100644
--- a/include/garmos/arch.h
+++ b/include/garmos/arch.h
@@ -17,6 +17,24 @@
#include <garmos/types.h>
+/*
+ * The functions in this header depend on the architecture. They should be
+ * provided by objects from the architecture.
+ */
+
+/* write data to a port */
+void prtset8(const uint16_t port, const uint8_t val);
+void prtset16(const uint16_t port, const uint16_t val);;
+void prtset32(const uint16_t port, const uint32_t val);
+
+/* read data from a port */
+uint8_t prtget8(const uint16_t port);
+uint16_t prtget16(const uint16_t port);
+uint32_t prtget32(const uint16_t port);
+
+/* set a memory register */
void regset8(const uint32_t reg, const uint8_t val);
+void regset16(const uint32_t reg, const uint16_t val);
+void regset32(const uint32_t reg, const uint32_t val);
#endif