--- /dev/null
+#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_ */