10 FILE_LICENCE ( GPL2_OR_LATER );
12 /* Hypercall registers */
14 #define XEN_REG1 "rdi"
15 #define XEN_REG2 "rsi"
16 #define XEN_REG3 "rdx"
17 #define XEN_REG4 "r10"
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"
27 /** A hypercall entry point */
28 struct xen_hypercall {
29 /** Code generated by hypervisor */
31 } __attribute__ (( packed ));
34 * Issue hypercall with one argument
36 * @v xen Xen hypervisor
37 * @v hypercall Hypercall number
38 * @v arg1 First argument
39 * @ret retval Return value
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;
47 __asm__ __volatile__ ( "call *%2"
48 : "=a" ( retval ), "+r" ( reg1 )
49 : "r" ( &xen->hypercall[hypercall] )
50 : XEN_REG2, XEN_REG3, XEN_REG4, XEN_REG5,
56 * Issue hypercall with two arguments
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
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;
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" );
79 * Issue hypercall with three arguments
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
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;
96 __asm__ __volatile__ ( "call *%4"
97 : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
99 : "r" ( &xen->hypercall[hypercall] )
100 : XEN_REG4, XEN_REG5, "memory" );
105 * Issue hypercall with four arguments
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
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;
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" );
134 * Issue hypercall with five arguments
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
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;
156 __asm__ __volatile__ ( "call *%6"
157 : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
158 "+r" ( reg3 ), "+r" ( reg4 ), "+r" ( reg5 )
159 : "r" ( &xen->hypercall[hypercall] )
164 #endif /* _BITS_XEN_H */