Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / arch / x86 / include / bits / xen.h
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 );
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 */
30         uint8_t code[32];
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] )
50                                : XEN_REG2, XEN_REG3, XEN_REG4, XEN_REG5,
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 */