X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=3sys;a=blobdiff_plain;f=sys1%2Fkern%2Fsrc%2Fasmutil.h;fp=sys1%2Fkern%2Fsrc%2Fasmutil.h;h=fb852a17c416d605ba2aa357dbee2efd46533e62;hp=0000000000000000000000000000000000000000;hb=d49aa763f9b7c4ae66cf80f0cbfc3456789fc0ac;hpb=3e2e8a9156d288d230bbcd722bc91c4b3e4b21e1 diff --git a/sys1/kern/src/asmutil.h b/sys1/kern/src/asmutil.h new file mode 100644 index 0000000..fb852a1 --- /dev/null +++ b/sys1/kern/src/asmutil.h @@ -0,0 +1,44 @@ +#ifndef ASMUTIL_H_ +#define ASMUTIL_H_ + +#include + +/* 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_ */