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
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_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 */
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 */
42static inline __attribute__ (( always_inline )) unsigned long
43xen_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 */
65static inline __attribute__ (( always_inline )) unsigned long
66xen_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 */
89static inline __attribute__ (( always_inline )) unsigned long
90xen_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 */
116static inline __attribute__ (( always_inline )) unsigned long
117xen_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 */
146static inline __attribute__ (( always_inline )) unsigned long
147xen_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 */
unsigned char uint8_t
Definition stdint.h:10
unsigned long retval
Definition xen.h:46
static unsigned int unsigned long unsigned long arg2
Definition xen.h:67
static unsigned int unsigned long unsigned long unsigned long unsigned long arg4
Definition xen.h:119
#define XEN_REG5
Definition xen.h:25
__asm__ __volatile__("call *%2" :"=a"(retval), "+r"(reg1) :"r"(&xen->hypercall[hypercall]) :XEN_REG2, XEN_REG3, XEN_REG4, XEN_REG5, "memory")
#define XEN_REG4
Definition xen.h:24
#define XEN_REG3
Definition xen.h:23
static unsigned int unsigned long arg1
Definition xen.h:44
static unsigned int hypercall
Definition xen.h:43
static unsigned int unsigned long unsigned long unsigned long arg3
Definition xen.h:91
#define XEN_REG2
Definition xen.h:22
#define XEN_REG1
Definition xen.h:21
static unsigned int unsigned long unsigned long unsigned long unsigned long unsigned long arg5
Definition xen.h:149
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
__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")
A hypercall entry point.
Definition xen.h:29
uint8_t code[32]
Code generated by hypervisor.
Definition xen.h:31
A Xen hypervisor.
Definition xen.h:51
struct xen_hypercall * hypercall
Hypercall table.
Definition xen.h:53