From d00bd3d0fcafa0a36225ce55dd31b03b619570eb Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sun, 20 Apr 2025 21:42:28 -0400 Subject: dont use in[s] instructions or rep in c --- kernel/include/comus/asm.h | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'kernel/include') diff --git a/kernel/include/comus/asm.h b/kernel/include/comus/asm.h index 08b61e2..c7597e7 100644 --- a/kernel/include/comus/asm.h +++ b/kernel/include/comus/asm.h @@ -1,6 +1,7 @@ #pragma once #include +#include static inline uint8_t inb(uint16_t port) { @@ -9,11 +10,23 @@ static inline uint8_t inb(uint16_t port) return ret; } +static inline void rep_inb(uint16_t port, uint8_t *buffer, size_t count) +{ + while (count--) + *(buffer++) = inb(port); +} + static inline void outb(uint16_t port, uint8_t val) { __asm__ volatile("outb %0, %1" : : "a"(val), "Nd"(port)); } +static inline void rep_outb(uint16_t port, uint8_t *buffer, size_t count) +{ + while (count--) + outb(port, *(buffer++)); +} + static inline uint16_t inw(uint16_t port) { uint16_t ret; @@ -21,11 +34,23 @@ static inline uint16_t inw(uint16_t port) return ret; } +static inline void rep_inw(uint16_t port, uint16_t *buffer, size_t count) +{ + while (count--) + *(buffer++) = inw(port); +} + static inline void outw(uint16_t port, uint16_t val) { __asm__ volatile("outw %0, %1" : : "a"(val), "Nd"(port)); } +static inline void rep_outw(uint16_t port, uint16_t *buffer, size_t count) +{ + while (count--) + outw(port, *(buffer++)); +} + static inline uint32_t inl(uint16_t port) { uint32_t ret; @@ -33,12 +58,10 @@ static inline uint32_t inl(uint16_t port) return ret; } -static inline void insl(uint16_t port, uint32_t *buffer, uint32_t count) +static inline void rep_inl(uint16_t port, uint32_t *buffer, size_t count) { - while (count--) { - __asm__ volatile("inl %1, %0" : "=a"(*buffer) : "Nd"(port)); - buffer++; - } + while (count--) + *(buffer++) = inl(port); } static inline void outl(uint16_t port, uint32_t val) @@ -46,6 +69,12 @@ static inline void outl(uint16_t port, uint32_t val) __asm__ volatile("outl %0, %1" : : "a"(val), "Nd"(port)); } +static inline void rep_outl(uint16_t port, uint32_t *buffer, size_t count) +{ + while (count--) + outl(port, *(buffer++)); +} + static inline void io_wait(void) { outb(0x80, 0); -- cgit v1.2.3-freya