39
39
#include <linux/string.h>
40
40
#include <linux/types.h>
41
41
#include <linux/pgtable.h>
42
+ #include <linux/instrumentation.h>
42
43
43
44
#include <trace/events/xen.h>
44
45
46
+ #include <asm/alternative.h>
45
47
#include <asm/page.h>
46
48
#include <asm/smap.h>
47
49
#include <asm/nospec-branch.h>
@@ -91,9 +93,17 @@ extern struct { char _entry[32]; } hypercall_page[];
91
93
void xen_hypercall_func (void );
92
94
DECLARE_STATIC_CALL (xen_hypercall , xen_hypercall_func );
93
95
94
- #define __HYPERCALL "call hypercall_page+%c[offset]"
95
- #define __HYPERCALL_ENTRY (x ) \
96
- [offset] "i" (__HYPERVISOR_##x * sizeof(hypercall_page[0]))
96
+ #ifdef MODULE
97
+ #define __ADDRESSABLE_xen_hypercall
98
+ #else
99
+ #define __ADDRESSABLE_xen_hypercall __ADDRESSABLE_ASM_STR(__SCK__xen_hypercall)
100
+ #endif
101
+
102
+ #define __HYPERCALL \
103
+ __ADDRESSABLE_xen_hypercall \
104
+ "call __SCT__xen_hypercall"
105
+
106
+ #define __HYPERCALL_ENTRY (x ) "a" (x)
97
107
98
108
#ifdef CONFIG_X86_32
99
109
#define __HYPERCALL_RETREG "eax"
@@ -151,7 +161,7 @@ DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
151
161
__HYPERCALL_0ARG(); \
152
162
asm volatile (__HYPERCALL \
153
163
: __HYPERCALL_0PARAM \
154
- : __HYPERCALL_ENTRY(name) \
164
+ : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name) \
155
165
: __HYPERCALL_CLOBBER0); \
156
166
(type)__res; \
157
167
})
@@ -162,7 +172,7 @@ DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
162
172
__HYPERCALL_1ARG(a1); \
163
173
asm volatile (__HYPERCALL \
164
174
: __HYPERCALL_1PARAM \
165
- : __HYPERCALL_ENTRY(name) \
175
+ : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name) \
166
176
: __HYPERCALL_CLOBBER1); \
167
177
(type)__res; \
168
178
})
@@ -173,7 +183,7 @@ DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
173
183
__HYPERCALL_2ARG(a1, a2); \
174
184
asm volatile (__HYPERCALL \
175
185
: __HYPERCALL_2PARAM \
176
- : __HYPERCALL_ENTRY(name) \
186
+ : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name) \
177
187
: __HYPERCALL_CLOBBER2); \
178
188
(type)__res; \
179
189
})
@@ -184,7 +194,7 @@ DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
184
194
__HYPERCALL_3ARG(a1, a2, a3); \
185
195
asm volatile (__HYPERCALL \
186
196
: __HYPERCALL_3PARAM \
187
- : __HYPERCALL_ENTRY(name) \
197
+ : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name) \
188
198
: __HYPERCALL_CLOBBER3); \
189
199
(type)__res; \
190
200
})
@@ -195,7 +205,7 @@ DECLARE_STATIC_CALL(xen_hypercall, xen_hypercall_func);
195
205
__HYPERCALL_4ARG(a1, a2, a3, a4); \
196
206
asm volatile (__HYPERCALL \
197
207
: __HYPERCALL_4PARAM \
198
- : __HYPERCALL_ENTRY(name) \
208
+ : __HYPERCALL_ENTRY(__HYPERVISOR_ ## name) \
199
209
: __HYPERCALL_CLOBBER4); \
200
210
(type)__res; \
201
211
})
@@ -209,12 +219,9 @@ xen_single_call(unsigned int call,
209
219
__HYPERCALL_DECLS ;
210
220
__HYPERCALL_5ARG (a1 , a2 , a3 , a4 , a5 );
211
221
212
- if (call >= PAGE_SIZE / sizeof (hypercall_page [0 ]))
213
- return - EINVAL ;
214
-
215
- asm volatile (CALL_NOSPEC
222
+ asm volatile (__HYPERCALL
216
223
: __HYPERCALL_5PARAM
217
- : [ thunk_target ] "a" ( & hypercall_page [ call ] )
224
+ : __HYPERCALL_ENTRY ( call )
218
225
: __HYPERCALL_CLOBBER5 );
219
226
220
227
return (long )__res ;
0 commit comments