vga text output and libc expansion
[3sys] / sys1 / kern / src / asmutil.h
1 #ifndef ASMUTIL_H_
2 #define ASMUTIL_H_
3
4 #include <stdint.h>
5
6 /* inline assembly utility macros */
7
8 #define enable_intr() asm volatile("sti")
9 #define disable_intr() asm volatile("cli")
10
11 #define set_intr_state(en) \
12         do { if(en) enable_intr(); else disable_intr(); } while(0)
13
14 static inline int get_intr_state(void)
15 {
16         int res;
17         asm volatile (
18                 "\r\tpushf"
19                 "\r\tpop %0"
20                 : "=r"(res));
21         return (res >> 9) & 1;  /* IF is bit 9 of eflags */
22 }
23
24 #define outp(port, val) \
25         asm volatile("out %%al, %%dx" :: "d"(port), "a"((unsigned char)val))
26 #define outp16(port, val) \
27         asm volatile("out %%ax, %%dx" :: "d"(port), "a"((unsigned short)val))
28
29 static inline uint8_t inp(int port)
30 {
31         uint8_t res;
32         asm volatile("in %%dx, %%al" : "=a"(res) : "d"(port));
33         return res;
34 }
35
36 static inline uint16_t inp16(int port)
37 {
38         uint16_t res;
39         asm volatile("in %%dx, %%ax" : "=a"(res) : "d"(port));
40         return res;
41 }
42
43
44 #endif  /* ASMUTIL_H_ */