diff options
author | Robin Krahl <robin.krahl@ireas.org> | 2017-03-05 23:16:05 +0100 |
---|---|---|
committer | Robin Krahl <robin.krahl@ireas.org> | 2017-03-05 23:17:59 +0100 |
commit | 1f0ea8244fb80966280bd8ecee6a797130592d27 (patch) | |
tree | f1224a47a09942f16e7a8aa341ca3189d0b23c64 | |
parent | f01e48444829cce9eec25f4562778da0ed4ae66c (diff) | |
download | garmos-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.
-rw-r--r-- | arch/x86_64/arch.c | 54 | ||||
-rw-r--r-- | include/garmos/arch.h | 18 |
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 |