vga text output and libc expansion
[3sys] / sys1 / kern / src / asmutil.h
diff --git a/sys1/kern/src/asmutil.h b/sys1/kern/src/asmutil.h
new file mode 100644 (file)
index 0000000..fb852a1
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef ASMUTIL_H_
+#define ASMUTIL_H_
+
+#include <stdint.h>
+
+/* inline assembly utility macros */
+
+#define enable_intr() asm volatile("sti")
+#define disable_intr() asm volatile("cli")
+
+#define set_intr_state(en) \
+       do { if(en) enable_intr(); else disable_intr(); } while(0)
+
+static inline int get_intr_state(void)
+{
+       int res;
+       asm volatile (
+               "\r\tpushf"
+               "\r\tpop %0"
+               : "=r"(res));
+       return (res >> 9) & 1;  /* IF is bit 9 of eflags */
+}
+
+#define outp(port, val) \
+       asm volatile("out %%al, %%dx" :: "d"(port), "a"((unsigned char)val))
+#define outp16(port, val) \
+       asm volatile("out %%ax, %%dx" :: "d"(port), "a"((unsigned short)val))
+
+static inline uint8_t inp(int port)
+{
+       uint8_t res;
+       asm volatile("in %%dx, %%al" : "=a"(res) : "d"(port));
+       return res;
+}
+
+static inline uint16_t inp16(int port)
+{
+       uint16_t res;
+       asm volatile("in %%dx, %%ax" : "=a"(res) : "d"(port));
+       return res;
+}
+
+
+#endif /* ASMUTIL_H_ */