iPXE
x86_io.h File Reference

iPXE I/O API for x86 More...

Go to the source code of this file.

Macros

#define IOAPI_PREFIX_x86   __x86_
#define X86_READX(_api_func, _type)
#define X86_WRITEX(_api_func, _type)
#define X86_INX(_insn_suffix, _type, _reg_prefix)
#define X86_OUTX(_insn_suffix, _type, _reg_prefix)

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static __always_inline unsigned long IOAPI_INLINE (x86, phys_to_bus)(unsigned long phys_addr)
static __always_inline unsigned long IOAPI_INLINE (x86, bus_to_phys)(unsigned long bus_addr)
 X86_READX (readb, uint8_t)
 X86_READX (readw, uint16_t)
 X86_READX (readl, uint32_t)
 X86_WRITEX (writeb, uint8_t)
 X86_WRITEX (writew, uint16_t)
 X86_WRITEX (writel, uint32_t)
 X86_INX (b, uint8_t, "b")
 X86_INX (w, uint16_t, "w")
 X86_INX (l, uint32_t, "k")
 X86_OUTX (b, uint8_t, "b")
 X86_OUTX (w, uint16_t, "w")
 X86_OUTX (l, uint32_t, "k")
static __always_inline void IOAPI_INLINE (x86, iodelay)(void)
static __always_inline void IOAPI_INLINE (x86, mb)(void)

Detailed Description

iPXE I/O API for x86

x86 uses direct pointer dereferences for accesses to memory-mapped I/O space, and the inX/outX instructions for accesses to port-mapped I/O space.

64-bit atomic accesses (readq() and writeq()) use MMX instructions under i386, and will crash original Pentium and earlier CPUs. Fortunately, no hardware that requires atomic 64-bit accesses will physically fit into a machine with such an old CPU anyway.

Definition in file x86_io.h.

Macro Definition Documentation

◆ IOAPI_PREFIX_x86

#define IOAPI_PREFIX_x86   __x86_

Definition at line 24 of file x86_io.h.

◆ X86_READX

#define X86_READX ( _api_func,
_type )
Value:
static inline __always_inline _type \
IOAPI_INLINE ( x86, _api_func ) ( volatile _type *io_addr ) { \
return *io_addr; \
}
#define __always_inline
Declare a function to be always inline.
Definition compiler.h:611

Definition at line 52 of file x86_io.h.

52#define X86_READX( _api_func, _type ) \
53static inline __always_inline _type \
54IOAPI_INLINE ( x86, _api_func ) ( volatile _type *io_addr ) { \
55 return *io_addr; \
56}

◆ X86_WRITEX

#define X86_WRITEX ( _api_func,
_type )
Value:
static inline __always_inline void \
IOAPI_INLINE ( x86, _api_func ) ( _type data, \
volatile _type *io_addr ) { \
*io_addr = data; \
}
uint8_t data[48]
Additional event data.
Definition ena.h:11

Definition at line 64 of file x86_io.h.

64#define X86_WRITEX( _api_func, _type ) \
65static inline __always_inline void \
66IOAPI_INLINE ( x86, _api_func ) ( _type data, \
67 volatile _type *io_addr ) { \
68 *io_addr = data; \
69}

◆ X86_INX

#define X86_INX ( _insn_suffix,
_type,
_reg_prefix )
Value:
static inline __always_inline _type \
IOAPI_INLINE ( x86, in ## _insn_suffix ) ( volatile _type *io_addr ) { \
_type data; \
__asm__ __volatile__ ( "in" #_insn_suffix " %w1, %" _reg_prefix "0" \
: "=a" ( data ) : "Nd" ( io_addr ) ); \
return data; \
} \
static inline __always_inline void \
IOAPI_INLINE ( x86, ins ## _insn_suffix ) ( volatile _type *io_addr, \
_type *data, \
unsigned int count ) { \
unsigned int discard_D; \
__asm__ __volatile__ ( "rep ins" #_insn_suffix \
: "=D" ( discard_D ) \
: "d" ( io_addr ), "c" ( count ), \
"0" ( data ) ); \
}
__be32 in[4]
Definition CIB_PRM.h:7
__asm__ __volatile__("call *%9" :"=a"(result), "=c"(discard_ecx), "=d"(discard_edx) :"d"(0), "a"(code), "b"(0), "c"(in_phys), "D"(0), "S"(out_phys), "m"(hypercall))
void * discard_D
Definition bigint.h:32
static unsigned int count
Number of entries.
Definition dwmac.h:220
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")

Definition at line 82 of file x86_io.h.

82#define X86_INX( _insn_suffix, _type, _reg_prefix ) \
83static inline __always_inline _type \
84IOAPI_INLINE ( x86, in ## _insn_suffix ) ( volatile _type *io_addr ) { \
85 _type data; \
86 __asm__ __volatile__ ( "in" #_insn_suffix " %w1, %" _reg_prefix "0" \
87 : "=a" ( data ) : "Nd" ( io_addr ) ); \
88 return data; \
89} \
90static inline __always_inline void \
91IOAPI_INLINE ( x86, ins ## _insn_suffix ) ( volatile _type *io_addr, \
92 _type *data, \
93 unsigned int count ) { \
94 unsigned int discard_D; \
95 __asm__ __volatile__ ( "rep ins" #_insn_suffix \
96 : "=D" ( discard_D ) \
97 : "d" ( io_addr ), "c" ( count ), \
98 "0" ( data ) ); \
99}

◆ X86_OUTX

#define X86_OUTX ( _insn_suffix,
_type,
_reg_prefix )
Value:
static inline __always_inline void \
IOAPI_INLINE ( x86, out ## _insn_suffix ) ( _type data, \
volatile _type *io_addr ) { \
__asm__ __volatile__ ( "out" #_insn_suffix " %" _reg_prefix "0, %w1" \
: : "a" ( data ), "Nd" ( io_addr ) ); \
} \
static inline __always_inline void \
IOAPI_INLINE ( x86, outs ## _insn_suffix ) ( volatile _type *io_addr, \
const _type *data, \
unsigned int count ) { \
unsigned int discard_S; \
__asm__ __volatile__ ( "rep outs" #_insn_suffix \
: "=S" ( discard_S ) \
: "d" ( io_addr ), "c" ( count ), \
"0" ( data ) ); \
}
__be32 out[4]
Definition CIB_PRM.h:8
void * discard_S
Definition bigint.h:66

Definition at line 104 of file x86_io.h.

104#define X86_OUTX( _insn_suffix, _type, _reg_prefix ) \
105static inline __always_inline void \
106IOAPI_INLINE ( x86, out ## _insn_suffix ) ( _type data, \
107 volatile _type *io_addr ) { \
108 __asm__ __volatile__ ( "out" #_insn_suffix " %" _reg_prefix "0, %w1" \
109 : : "a" ( data ), "Nd" ( io_addr ) ); \
110} \
111static inline __always_inline void \
112IOAPI_INLINE ( x86, outs ## _insn_suffix ) ( volatile _type *io_addr, \
113 const _type *data, \
114 unsigned int count ) { \
115 unsigned int discard_S; \
116 __asm__ __volatile__ ( "rep outs" #_insn_suffix \
117 : "=S" ( discard_S ) \
118 : "d" ( io_addr ), "c" ( count ), \
119 "0" ( data ) ); \
120}

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ IOAPI_INLINE() [1/4]

__always_inline unsigned long IOAPI_INLINE ( x86 ,
phys_to_bus  )
inlinestatic

Definition at line 38 of file x86_io.h.

38 {
39 return phys_addr;
40}

References phys_to_bus().

◆ IOAPI_INLINE() [2/4]

__always_inline unsigned long IOAPI_INLINE ( x86 ,
bus_to_phys  )
inlinestatic

Definition at line 43 of file x86_io.h.

43 {
44 return bus_addr;
45}
static __always_inline void unsigned long bus_addr
Definition pcibios.h:156

References bus_addr, and bus_to_phys().

◆ X86_READX() [1/3]

X86_READX ( readb ,
uint8_t  )

References readb.

◆ X86_READX() [2/3]

X86_READX ( readw ,
uint16_t  )

References readw.

◆ X86_READX() [3/3]

X86_READX ( readl ,
uint32_t  )

References readl, and readq.

◆ X86_WRITEX() [1/3]

X86_WRITEX ( writeb ,
uint8_t  )

References writeb.

◆ X86_WRITEX() [2/3]

X86_WRITEX ( writew ,
uint16_t  )

References writew.

◆ X86_WRITEX() [3/3]

X86_WRITEX ( writel ,
uint32_t  )

References writel, and writeq.

◆ X86_INX() [1/3]

X86_INX ( b ,
uint8_t ,
"b"  )

◆ X86_INX() [2/3]

X86_INX ( w ,
uint16_t ,
"w"  )

◆ X86_INX() [3/3]

X86_INX ( l ,
uint32_t ,
"k"  )

References l.

◆ X86_OUTX() [1/3]

X86_OUTX ( b ,
uint8_t ,
"b"  )

◆ X86_OUTX() [2/3]

X86_OUTX ( w ,
uint16_t ,
"w"  )

◆ X86_OUTX() [3/3]

X86_OUTX ( l ,
uint32_t ,
"k"  )

References __always_inline, and l.

◆ IOAPI_INLINE() [3/4]

__always_inline void IOAPI_INLINE ( x86 ,
iodelay  )
inlinestatic

Definition at line 131 of file x86_io.h.

131 {
132 __asm__ __volatile__ ( "outb %al, $0x80" );
133}

References __asm__(), __volatile__(), and iodelay().

◆ IOAPI_INLINE() [4/4]

__always_inline void IOAPI_INLINE ( x86 ,
mb  )
inlinestatic

Definition at line 141 of file x86_io.h.

141 {
142 __asm__ __volatile__ ( "lock; addl $0, 0(%%esp)" : : : "memory" );
143}

References __asm__(), __volatile__(), and mb().