1 #ifndef _ASM_IO_H 2 #define _ASM_IO_H 3 4 #include <xen/vmap.h> 5 #include <xen/types.h> 6 7 #define readb(x) (*(const volatile uint8_t *)(x)) 8 #define readw(x) (*(const volatile uint16_t *)(x)) 9 #define readl(x) (*(const volatile uint32_t *)(x)) 10 #define readq(x) (*(const volatile uint64_t *)(x)) 11 #define writeb(d,x) (*(volatile uint8_t *)(x) = (d)) 12 #define writew(d,x) (*(volatile uint16_t *)(x) = (d)) 13 #define writel(d,x) (*(volatile uint32_t *)(x) = (d)) 14 #define writeq(d,x) (*(volatile uint64_t *)(x) = (d)) 15 16 #define __OUT1(s,x) \ 17 static inline void out##s(unsigned x value, unsigned short port) { 18 19 #define __OUT2(s,s1,s2) \ 20 __asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" 21 22 #define __OUT(s,s1,x) \ 23 __OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \ 24 __OUT1(s##_p,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port));} 25 26 #define __IN1(s) \ 27 static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v; 28 29 #define __IN2(s,s1,s2) \ 30 __asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" 31 32 #define __IN(s,s1,i...) \ 33 __IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \ 34 __IN1(s##_p) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } 35 36 #define RETURN_TYPE unsigned char 37 __IN(b,"") 38 #undef RETURN_TYPE 39 #define RETURN_TYPE unsigned short 40 __IN(w,"") 41 #undef RETURN_TYPE 42 #define RETURN_TYPE unsigned int 43 __IN(l,"") 44 #undef RETURN_TYPE 45 46 __OUT(b,"b",char) 47 __OUT(w,"w",short) 48 __OUT(l,,int) 49 50 /* 51 * Boolean indicator and function used to handle platform specific I/O port 52 * emulation. 53 */ 54 #define IOEMUL_QUIRK_STUB_BYTES 9 55 extern bool ioemul_handle_quirk; 56 struct cpu_user_regs; 57 unsigned int ioemul_handle_proliant_quirk( 58 uint8_t opcode, char *io_emul_stub, const struct cpu_user_regs *regs); 59 60 #endif 61