interrupts, timer, keyboard, segments, lots of kernel code
[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 #define CALLER_EIP(eip) \
11         asm volatile( \
12                 "mov (%%esp), %0\n\t" \
13                 : "=a" ((uint32_t)eip))
14
15 static inline uint8_t inb(uint16_t port)
16 {
17         uint8_t res;
18         asm volatile (
19                 "inb %1, %0\n\t"
20                 : "=a" (res)
21                 : "dN" (port));
22         return res;
23 }
24
25 static inline uint16_t inw(uint16_t port)
26 {
27         uint16_t res;
28         asm volatile (
29                 "inw %1, %0\n\t"
30                 : "=a" (res)
31                 : "dN" (port));
32         return res;
33 }
34
35 static inline uint32_t inl(uint16_t port)
36 {
37         uint32_t res;
38         asm volatile (
39                 "inl %1, %0\n\t"
40                 : "=a" (res)
41                 : "dN" (port));
42         return res;
43 }
44
45 #define outb(src, port) \
46         asm volatile( \
47                 "outb %0, %1\n\t" \
48                 :: "a" ((uint8_t)(src)), "dN" ((uint16_t)(port)))
49
50 #define outw(src, port) \
51         asm volatile( \
52                 "outw %0, %1\n\t" \
53                 :: "a" ((uint16_t)(src)), "dN" ((uint16_t)(port)))
54
55 #define outl(src, port) \
56         asm volatile( \
57                 "outl %0, %1\n\t" \
58                 :: "a" ((uint32_t)(src)), "dN" ((uint16_t)(port)))
59
60 #define iodelay() outb(0, 0x80)
61
62
63 #endif  /* ASMOPS_H_ */