2578467a8c0abb1ee7db60b1ae81b580ca746b23
[bootcensus] / src / asmops.h
1 #ifndef ASMOPS_H_
2 #define ASMOPS_H_
3
4 #include <inttypes.h>
5
6 #define enable_intr() asm volatile("sti")
7 #define disable_intr() asm volatile("cli")
8 #define halt_cpu() asm volatile("hlt")
9
10 static inline uint8_t inb(uint16_t port)
11 {
12         uint8_t res;
13         asm volatile (
14                 "inb %1, %0\n\t"
15                 : "=a" (res)
16                 : "dN" (port));
17         return res;
18 }
19
20 static inline uint16_t inw(uint16_t port)
21 {
22         uint16_t res;
23         asm volatile (
24                 "inw %1, %0\n\t"
25                 : "=a" (res)
26                 : "dN" (port));
27         return res;
28 }
29
30 static inline uint32_t inl(uint16_t port)
31 {
32         uint32_t res;
33         asm volatile (
34                 "inl %1, %0\n\t"
35                 : "=a" (res)
36                 : "dN" (port));
37         return res;
38 }
39
40 #define outb(src, port) \
41         asm volatile( \
42                 "outb %0, %1\n\t" \
43                 :: "a" ((uint8_t)(src)), "dN" ((uint16_t)(port)))
44
45 #define outw(src, port) \
46         asm volatile( \
47                 "outw %0, %1\n\t" \
48                 :: "a" ((uint16_t)(src)), "dN" ((uint16_t)(port)))
49
50 #define outl(src, port) \
51         asm volatile( \
52                 "outl %0, %1\n\t" \
53                 :: "a" ((uint32_t)(src)), "dN" ((uint16_t)(port)))
54
55 #define iodelay() outb(0, 0x80)
56
57
58 #endif  /* ASMOPS_H_ */