iPXE
xen.h
Go to the documentation of this file.
1 #ifndef _BITS_XEN_H
2 #define _BITS_XEN_H
3 
4 /** @file
5  *
6  * Xen interface
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 /* Hypercall registers */
13 #ifdef __x86_64__
14 #define XEN_REG1 "rdi"
15 #define XEN_REG2 "rsi"
16 #define XEN_REG3 "rdx"
17 #define XEN_REG4 "r10"
18 #define XEN_REG5 "r8"
19 #else
20 #define XEN_REG1 "ebx"
21 #define XEN_REG2 "ecx"
22 #define XEN_REG3 "edx"
23 #define XEN_REG4 "esi"
24 #define XEN_REG5 "edi"
25 #endif
26 
27 /** A hypercall entry point */
28 struct xen_hypercall {
29  /** Code generated by hypervisor */
31 } __attribute__ (( packed ));
32 
33 /**
34  * Issue hypercall with one argument
35  *
36  * @v xen Xen hypervisor
37  * @v hypercall Hypercall number
38  * @v arg1 First argument
39  * @ret retval Return value
40  */
41 static inline __attribute__ (( always_inline )) unsigned long
42 xen_hypercall_1 ( struct xen_hypervisor *xen, unsigned int hypercall,
43  unsigned long arg1 ) {
44  register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
45  unsigned long retval;
46 
47  __asm__ __volatile__ ( "call *%2"
48  : "=a" ( retval ), "+r" ( reg1 )
49  : "r" ( &xen->hypercall[hypercall] )
51  "memory" );
52  return retval;
53 }
54 
55 /**
56  * Issue hypercall with two arguments
57  *
58  * @v xen Xen hypervisor
59  * @v hypercall Hypercall number
60  * @v arg1 First argument
61  * @v arg2 Second argument
62  * @ret retval Return value
63  */
64 static inline __attribute__ (( always_inline )) unsigned long
65 xen_hypercall_2 ( struct xen_hypervisor *xen, unsigned int hypercall,
66  unsigned long arg1, unsigned long arg2 ) {
67  register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
68  register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
69  unsigned long retval;
70 
71  __asm__ __volatile__ ( "call *%3"
72  : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 )
73  : "r" ( &xen->hypercall[hypercall] )
74  : XEN_REG3, XEN_REG4, XEN_REG5, "memory" );
75  return retval;
76 }
77 
78 /**
79  * Issue hypercall with three arguments
80  *
81  * @v xen Xen hypervisor
82  * @v hypercall Hypercall number
83  * @v arg1 First argument
84  * @v arg2 Second argument
85  * @v arg3 Third argument
86  * @ret retval Return value
87  */
88 static inline __attribute__ (( always_inline )) unsigned long
89 xen_hypercall_3 ( struct xen_hypervisor *xen, unsigned int hypercall,
90  unsigned long arg1, unsigned long arg2, unsigned long arg3 ) {
91  register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
92  register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
93  register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
94  unsigned long retval;
95 
96  __asm__ __volatile__ ( "call *%4"
97  : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
98  "+r" ( reg3 )
99  : "r" ( &xen->hypercall[hypercall] )
100  : XEN_REG4, XEN_REG5, "memory" );
101  return retval;
102 }
103 
104 /**
105  * Issue hypercall with four arguments
106  *
107  * @v xen Xen hypervisor
108  * @v hypercall Hypercall number
109  * @v arg1 First argument
110  * @v arg2 Second argument
111  * @v arg3 Third argument
112  * @v arg4 Fourth argument
113  * @ret retval Return value
114  */
115 static inline __attribute__ (( always_inline )) unsigned long
116 xen_hypercall_4 ( struct xen_hypervisor *xen, unsigned int hypercall,
117  unsigned long arg1, unsigned long arg2, unsigned long arg3,
118  unsigned long arg4 ) {
119  register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
120  register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
121  register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
122  register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
123  unsigned long retval;
124 
125  __asm__ __volatile__ ( "call *%5"
126  : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
127  "+r" ( reg3 ), "+r" ( reg4 )
128  : "r" ( &xen->hypercall[hypercall] )
129  : XEN_REG5, "memory" );
130  return retval;
131 }
132 
133 /**
134  * Issue hypercall with five arguments
135  *
136  * @v xen Xen hypervisor
137  * @v hypercall Hypercall number
138  * @v arg1 First argument
139  * @v arg2 Second argument
140  * @v arg3 Third argument
141  * @v arg4 Fourth argument
142  * @v arg5 Fifth argument
143  * @ret retval Return value
144  */
145 static inline __attribute__ (( always_inline )) unsigned long
146 xen_hypercall_5 ( struct xen_hypervisor *xen, unsigned int hypercall,
147  unsigned long arg1, unsigned long arg2, unsigned long arg3,
148  unsigned long arg4, unsigned long arg5 ) {
149  register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
150  register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
151  register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
152  register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
153  register unsigned long reg5 asm ( XEN_REG5 ) = arg5;
154  unsigned long retval;
155 
156  __asm__ __volatile__ ( "call *%6"
157  : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
158  "+r" ( reg3 ), "+r" ( reg4 ), "+r" ( reg5 )
159  : "r" ( &xen->hypercall[hypercall] )
160  : "memory" );
161  return retval;
162 }
163 
164 #endif /* _BITS_XEN_H */
#define XEN_REG2
Definition: xen.h:21
static unsigned int unsigned long unsigned long unsigned long unsigned long arg4
Definition: xen.h:118
static unsigned int hypercall
Definition: xen.h:42
A hypercall entry point.
Definition: xen.h:28
static unsigned int unsigned long arg1
Definition: xen.h:43
A Xen hypervisor.
Definition: xen.h:51
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
__asm__ __volatile__("call *%2" :"=a"(retval), "+r"(reg1) :"r"(&xen->hypercall[hypercall]) :XEN_REG2, XEN_REG3, XEN_REG4, XEN_REG5, "memory")
struct xen_hypercall * hypercall
Hypercall table.
Definition: xen.h:53
#define XEN_REG1
Definition: xen.h:20
unsigned char uint8_t
Definition: stdint.h:10
struct xen_hypercall __attribute__((packed))
unsigned long retval
Definition: xen.h:45
uint8_t code[32]
Code generated by hypervisor.
Definition: xen.h:30
__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")
static unsigned int unsigned long unsigned long unsigned long unsigned long unsigned long arg5
Definition: xen.h:148
#define XEN_REG5
Definition: xen.h:24
static unsigned int unsigned long unsigned long arg2
Definition: xen.h:66
#define XEN_REG4
Definition: xen.h:23
static unsigned int unsigned long unsigned long unsigned long arg3
Definition: xen.h:90
#define XEN_REG3
Definition: xen.h:22