diff options
| author | Jeremy Fitzhardinge <jeremy@goop.org> | 2009-02-09 15:05:49 -0500 |
|---|---|---|
| committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-10-20 19:22:27 -0400 |
| commit | 1246ae0bb992f106a245eea2b8dd901ced868e7a (patch) | |
| tree | 93d34437d2e34a4d7f6933c286e3b58a3e5c86b0 | |
| parent | eba3ff8b99863bcc9e66b8d528e4750229e29693 (diff) | |
xen: add variable hypercall caller
Allow non-constant hypercall to be called, for privcmd.
[ Impact: make arbitrary hypercalls; needed for privcmd ]
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
| -rw-r--r-- | arch/x86/include/asm/xen/hypercall.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h index 7fda040a76cd..a3c28ae4025b 100644 --- a/arch/x86/include/asm/xen/hypercall.h +++ b/arch/x86/include/asm/xen/hypercall.h | |||
| @@ -200,6 +200,23 @@ extern struct { char _entry[32]; } hypercall_page[]; | |||
| 200 | (type)__res; \ | 200 | (type)__res; \ |
| 201 | }) | 201 | }) |
| 202 | 202 | ||
| 203 | static inline long | ||
| 204 | privcmd_call(unsigned call, | ||
| 205 | unsigned long a1, unsigned long a2, | ||
| 206 | unsigned long a3, unsigned long a4, | ||
| 207 | unsigned long a5) | ||
| 208 | { | ||
| 209 | __HYPERCALL_DECLS; | ||
| 210 | __HYPERCALL_5ARG(a1, a2, a3, a4, a5); | ||
| 211 | |||
| 212 | asm volatile("call *%[call]" | ||
| 213 | : __HYPERCALL_5PARAM | ||
| 214 | : [call] "a" (&hypercall_page[call]) | ||
| 215 | : __HYPERCALL_CLOBBER5); | ||
| 216 | |||
| 217 | return (long)__res; | ||
| 218 | } | ||
| 219 | |||
| 203 | static inline int | 220 | static inline int |
| 204 | HYPERVISOR_set_trap_table(struct trap_info *table) | 221 | HYPERVISOR_set_trap_table(struct trap_info *table) |
| 205 | { | 222 | { |
