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