Initial revision
[pintos-anon] / src / threads / io.h
1 #ifndef PORTIO_H
2 #define PORTIO_H 1
3
4 #include <stddef.h>
5 #include <stdint.h>
6
7 static inline uint8_t
8 inb(uint16_t port)
9 {
10   uint8_t data;
11   asm volatile ("inb %w1,%0" : "=a" (data) : "d" (port));
12   return data;
13 }
14
15 static inline void
16 insb(uint16_t port, void *addr, size_t cnt)
17 {
18   asm volatile ("cld\n\trepne\n\tinsb"                  :
19                 "=D" (addr), "=c" (cnt)         :
20                 "d" (port), "0" (addr), "1" (cnt)       :
21                 "memory", "cc");
22 }
23
24 static inline uint16_t
25 inw(uint16_t port)
26 {
27   uint16_t data;
28   asm volatile ("inw %w1,%0" : "=a" (data) : "d" (port));
29   return data;
30 }
31
32 static inline void
33 insw(uint16_t port, void *addr, size_t cnt)
34 {
35   asm volatile ("cld\n\trepne\n\tinsw" :
36                 "=D" (addr), "=c" (cnt) :
37                 "d" (port), "0" (addr), "1" (cnt) :
38                 "memory", "cc");
39 }
40
41 static inline uint32_t
42 inl(uint16_t port)
43 {
44   uint32_t data;
45   asm volatile ("inl %w1,%0" : "=a" (data) : "d" (port));
46   return data;
47 }
48
49 static inline void
50 insl(uint16_t port, void *addr, size_t cnt)
51 {
52   asm volatile ("cld\n\trepne\n\tinsl" :
53                 "=D" (addr), "=c" (cnt) :
54                 "d" (port), "0" (addr), "1" (cnt) :
55                 "memory", "cc");
56 }
57
58 static inline void
59 outb(uint16_t port, uint8_t data)
60 {
61   asm volatile ("outb %0,%w1" : : "a" (data), "d" (port));
62 }
63
64 static inline void
65 outsb(uint16_t port, const void *addr, size_t cnt)
66 {
67   asm volatile ("cld\n\trepne\n\toutsb" :
68                 "=S" (addr), "=c" (cnt) :
69                 "d" (port), "0" (addr), "1" (cnt) :
70                 "cc");
71 }
72
73 static inline void
74 outw(uint16_t port, uint16_t data)
75 {
76   asm volatile ("outw %0,%w1" : : "a" (data), "d" (port));
77 }
78
79 static inline void
80 outsw(uint16_t port, const void *addr, size_t cnt)
81 {
82   asm volatile ("cld\n\trepne\n\toutsw" :
83                 "=S" (addr), "=c" (cnt) :
84                 "d" (port), "0" (addr), "1" (cnt) :
85                 "cc");
86 }
87
88 static inline void
89 outl(uint16_t port, uint32_t data)
90 {
91   asm volatile ("outl %0,%w1" : : "a" (data), "d" (port));
92 }
93
94 #endif /* io.h */