--- /dev/null
+#ifndef IOPORT_H_
+#define IOPORT_H_
+
+#include <stdint.h>
+
+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
--- /dev/null
+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