aboutsummaryrefslogtreecommitdiff
path: root/arch/i386/sys
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/sys')
-rw-r--r--arch/i386/sys/control.h24
-rw-r--r--arch/i386/sys/cpuid.h35
-rw-r--r--arch/i386/sys/io.h92
-rw-r--r--arch/i386/sys/syscall.h8
4 files changed, 159 insertions, 0 deletions
diff --git a/arch/i386/sys/control.h b/arch/i386/sys/control.h
new file mode 100644
index 0000000..89ab067
--- /dev/null
+++ b/arch/i386/sys/control.h
@@ -0,0 +1,24 @@
+#pragma once
+
+static __inline__ void
+abort()
+{
+ /* Symbol h is already defined?
+__asm__(R"(cli
+h: hlt
+jmp h)");
+*/
+ __asm__("cli; hlt");
+}
+
+static __inline__ void
+enable_interrupts()
+{
+ __asm__("sti");
+}
+
+static __inline__ void
+disable_interrupts()
+{
+ __asm__("cli");
+}
diff --git a/arch/i386/sys/cpuid.h b/arch/i386/sys/cpuid.h
new file mode 100644
index 0000000..6613967
--- /dev/null
+++ b/arch/i386/sys/cpuid.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <cpuid.h>
+
+struct CPUVersion {
+ unsigned int stepping : 4;
+ unsigned int model : 4;
+ unsigned int family : 4;
+ unsigned int type : 2;
+ unsigned int __unused_1 : 2;
+ unsigned int model_ex : 4;
+ unsigned int family_ex : 8;
+ unsigned int __unused_2 : 4;
+} __attribute__((packed, aligned(__alignof__(unsigned int))));
+/* FIXME _Static_assert(sizeof(struct CPUVersion) == sizeof(unsigned int), "cpuid version struct size"); */
+
+unsigned int
+family(const struct CPUVersion v)
+{
+ if (v.family == 0x0f) return v.family + v.family_ex;
+ else
+ return v.family;
+}
+
+unsigned int
+model(const struct CPUVersion v)
+{
+ switch (v.family) {
+ case 0x06:
+ case 0x0f:
+ return ((unsigned int)v.model_ex << 4) | v.model;
+ default:
+ return v.model;
+ }
+}
diff --git a/arch/i386/sys/io.h b/arch/i386/sys/io.h
new file mode 100644
index 0000000..4ff5d85
--- /dev/null
+++ b/arch/i386/sys/io.h
@@ -0,0 +1,92 @@
+#pragma once
+
+/* port listings */
+enum UART {
+ COM1 = 0x3f8,
+ COM2 = 0x2f8,
+ COM3 = 0x3e8,
+ COM4 = 0x2e8,
+ COM5 = 0x5f8,
+ COM6 = 0x4f8,
+ COM7 = 0x5e8,
+ COM8 = 0x4e8
+};
+
+static __inline__ void
+outb(unsigned char val, unsigned short port)
+{
+ __asm__("outb %0,%1" : : "a"(val), "dN"(port));
+}
+
+static __inline__ void
+outw(unsigned short val, unsigned short port)
+{
+ __asm__("outw %0,%1" : : "a"(val), "dN"(port));
+}
+
+static __inline__ void
+outl(unsigned int val, unsigned short port)
+{
+ __asm__("outl %0,%1" : : "a"(val), "dN"(port));
+}
+
+static __inline__ unsigned char
+inb(unsigned short port)
+{
+ unsigned char val;
+ __asm__("inb %1,%0" : "=a"(val) : "dN"(port));
+ return val;
+}
+
+static __inline__ unsigned short
+inw(unsigned short port)
+{
+ unsigned short val;
+ __asm__("inw %1,%0" : "=a"(val) : "dN"(port));
+ return val;
+}
+
+static __inline__ unsigned int
+inl(unsigned short port)
+{
+ unsigned int val;
+ __asm__("inl %1,%0" : "=a"(val) : "dN"(port));
+ return val;
+}
+
+static __inline__ void
+outsb(unsigned short port, const void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; outsb" : "+S"(__buf), "+c"(__n) : "d"(port));
+}
+
+static __inline__ void
+outsw(unsigned short port, const void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; outsw" : "+S"(__buf), "+c"(__n) : "d"(port));
+}
+
+static __inline__ void
+outsl(unsigned short port, const void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; outsl" : "+S"(__buf), "+c"(__n) : "d"(port));
+}
+
+static __inline__ void
+insb(unsigned short port, void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; insb" : "+D"(__buf), "+c"(__n) : "d"(port));
+}
+
+static __inline__ void
+insw(unsigned short port, void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; insw" : "+D"(__buf), "+c"(__n) : "d"(port));
+}
+
+static __inline__ void
+insl(unsigned short port, void *__buf, unsigned long __n)
+{
+ __asm__("cld; rep; insl" : "+D"(__buf), "+c"(__n) : "d"(port));
+}
+
diff --git a/arch/i386/sys/syscall.h b/arch/i386/sys/syscall.h
new file mode 100644
index 0000000..9e62c89
--- /dev/null
+++ b/arch/i386/sys/syscall.h
@@ -0,0 +1,8 @@
+#pragma once
+
+static inline int
+syscall(int number)
+{
+ asm volatile("int $0x80");
+ return 0;
+}