00001
00002
00010
00011
00012
00013
00014
00015
00016 #ifndef _L4UTIL_PORT_IO_H
00017 #define _L4UTIL_PORT_IO_H
00018
00019
00020 #include <l4/sys/l4int.h>
00021 #include <l4/sys/compiler.h>
00022
00023
00024
00025
00026
00029 EXTERN_C_BEGIN
00030
00038 L4_INLINE l4_uint8_t
00039 l4util_in8(l4_uint16_t port);
00040
00048 L4_INLINE l4_uint16_t
00049 l4util_in16(l4_uint16_t port);
00050
00058 L4_INLINE l4_uint32_t
00059 l4util_in32(l4_uint16_t port);
00060
00070 L4_INLINE void
00071 l4util_ins8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
00072
00082 L4_INLINE void
00083 l4util_ins16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
00084
00094 L4_INLINE void
00095 l4util_ins32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count);
00096
00104 L4_INLINE void
00105 l4util_out8(l4_uint8_t value, l4_uint16_t port);
00106
00114 L4_INLINE void
00115 l4util_out16(l4_uint16_t value, l4_uint16_t port);
00116
00124 L4_INLINE void
00125 l4util_out32(l4_uint32_t value, l4_uint16_t port);
00126
00131 L4_INLINE void
00132 l4util_iodelay(void);
00133
00134 EXTERN_C_END
00135
00136
00137
00138
00139
00140
00141 L4_INLINE l4_uint8_t
00142 l4util_in8(l4_uint16_t port)
00143 {
00144 l4_uint8_t value;
00145 asm volatile ("inb %w1, %b0" : "=a" (value) : "Nd" (port));
00146 return value;
00147 }
00148
00149 L4_INLINE l4_uint16_t
00150 l4util_in16(l4_uint16_t port)
00151 {
00152 l4_uint16_t value;
00153 asm volatile ("inw %w1, %w0" : "=a" (value) : "Nd" (port));
00154 return value;
00155 }
00156
00157 L4_INLINE l4_uint32_t
00158 l4util_in32(l4_uint16_t port)
00159 {
00160 l4_uint32_t value;
00161 asm volatile ("inl %w1, %0" : "=a" (value) : "Nd" (port));
00162 return value;
00163 }
00164
00165 L4_INLINE void
00166 l4util_ins8(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
00167 {
00168 l4_umword_t dummy1, dummy2;
00169 asm volatile ("rep insb" : "=D"(dummy1), "=c"(dummy2)
00170 : "d" (port), "D" (addr), "c"(count)
00171 : "memory");
00172 }
00173
00174 L4_INLINE void
00175 l4util_ins16(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
00176 {
00177 l4_umword_t dummy1, dummy2;
00178 asm volatile ("rep insw" : "=D"(dummy1), "=c"(dummy2)
00179 : "d" (port), "D" (addr), "c"(count)
00180 : "memory");
00181 }
00182
00183 L4_INLINE void
00184 l4util_ins32(l4_uint16_t port, l4_umword_t addr, l4_umword_t count)
00185 {
00186 l4_umword_t dummy1, dummy2;
00187 asm volatile ("rep insl" : "=D"(dummy1), "=c"(dummy2)
00188 : "d" (port), "D" (addr), "c"(count)
00189 : "memory");
00190 }
00191
00192 L4_INLINE void
00193 l4util_out8(l4_uint8_t value, l4_uint16_t port)
00194 {
00195 asm volatile ("outb %b0, %w1" : : "a" (value), "Nd" (port));
00196 }
00197
00198 L4_INLINE void
00199 l4util_out16(l4_uint16_t value, l4_uint16_t port)
00200 {
00201 asm volatile ("outw %w0, %w1" : : "a" (value), "Nd" (port));
00202 }
00203
00204 L4_INLINE void
00205 l4util_out32(l4_uint32_t value, l4_uint16_t port)
00206 {
00207 asm volatile ("outl %0, %w1" : : "a" (value), "Nd" (port));
00208 }
00209
00210 L4_INLINE void
00211 l4util_iodelay(void)
00212 {
00213 asm volatile ("outb %al,$0x80");
00214 }
00215
00216 #endif
00217