summaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-20 21:42:28 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-20 23:44:40 -0400
commitd00bd3d0fcafa0a36225ce55dd31b03b619570eb (patch)
tree540191f961b95b06307261e6a1cd6149ce18426b /kernel/include
parentmove kspin to use ms, add ata_report (diff)
downloadcomus-d00bd3d0fcafa0a36225ce55dd31b03b619570eb.tar.gz
comus-d00bd3d0fcafa0a36225ce55dd31b03b619570eb.tar.bz2
comus-d00bd3d0fcafa0a36225ce55dd31b03b619570eb.zip
dont use in[s] instructions or rep in c
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/comus/asm.h39
1 files changed, 34 insertions, 5 deletions
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 <stdint.h>
+#include <stddef.h>
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);