From 05a22b85cec038fc3a804050dc3a3c62e748b389 Mon Sep 17 00:00:00 2001 From: Nathan Wagner Date: Mon, 24 Oct 2016 20:30:13 -0500 Subject: [PATCH] ioport assembly routines --- ioport.h | 21 ++++++++++++++ ioport.s | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 ioport.h create mode 100644 ioport.s diff --git a/ioport.h b/ioport.h new file mode 100644 index 0000000..a1ba6c6 --- /dev/null +++ b/ioport.h @@ -0,0 +1,21 @@ +#ifndef IOPORT_H_ +#define IOPORT_H_ + +#include + +uint8_t outport8(uint16_t port, uint8_t value) ; +uint16_t outport16(uint16_t port, uint16_t value) ; +uint32_t outport32(uint16_t port, uint32_t value) ; +uint8_t inport8(uint16_t port) ; +uint16_t inport16(uint16_t port) ; +uint32_t inport32(uint16_t port) ; + +/* TODO use int, uint32_t ? */ +void outport_buf8(uint64_t bufelems, uint8_t *buf, uint16_t port); +void outport_buf16(uint64_t bufelems, uint16_t *buf, uint16_t port); +void outport_buf32(uint64_t bufelems, uint32_t *buf, uint16_t port); +void inport_buf8(uint64_t bufelems, uint8_t *buf, uint16_t port); +void inport_buf16(uint64_t bufelems, uint16_t *buf, uint16_t port); +void inport_buf32(uint64_t bufelems, uint32_t *buf, uint16_t port); + +#endif diff --git a/ioport.s b/ioport.s new file mode 100644 index 0000000..7e15f43 --- /dev/null +++ b/ioport.s @@ -0,0 +1,88 @@ +global outport8:function +global outport16:function +global outport32:function +global inport8:function +global inport16:function +global inport32:function +global outport_buf8:function +global outport_buf16:function +global outport_buf32:function +global inport_buf8:function +global inport_buf16:function +global inport_buf32:function + +; rdi = buf len +; rsi = buffer address +; rdx = port addr + +inport_buf8: + mov rcx, rdi + cld + rep insb + ret + +inport_buf16: + mov rcx, rdi + cld + rep insw + ret + +inport_buf32: + mov rcx, rdi + cld + rep insd + ret + +outport_buf8: + mov rcx, rdi + cld + rep outsb + ret + +outport_buf16: + mov rcx, rdi + cld + rep outsw + ret + +outport_buf32: + mov rcx, rdi + cld + rep outsd + ret + +outport8: + mov rdx, rdi + mov rax, rsi + and rax, 0xff + out dx, al + ret + +outport16: + mov rdx, rdi + mov rax, rsi + and rax, 0xffff + out dx, ax + ret + +outport32: + mov rdx, rdi + mov rax, rsi + and rax, 0xffffffff + out dx, eax + ret + +inport8: + mov rdx, rdi + in al, dx + ret + +inport16: + mov rdx, rdi + in ax, dx + ret + +inport32: + mov rdx, rdi + in eax, dx + ret -- 2.40.0