xen: fix 64-bit hypercall variants
64-bit guests can pass 64-bit quantities in a single argument, so fix up the hypercalls. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
7077c33d81
commit
ca15f20f11
1 changed files with 31 additions and 29 deletions
|
@ -223,12 +223,12 @@ static inline int
|
|||
HYPERVISOR_update_va_mapping(unsigned long va, pte_t new_val,
|
||||
unsigned long flags)
|
||||
{
|
||||
unsigned long pte_hi = 0;
|
||||
#ifdef CONFIG_X86_PAE
|
||||
pte_hi = new_val.pte_high;
|
||||
#endif
|
||||
return _hypercall4(int, update_va_mapping, va,
|
||||
new_val.pte_low, pte_hi, flags);
|
||||
if (sizeof(new_val) == sizeof(long))
|
||||
return _hypercall3(int, update_va_mapping, va,
|
||||
new_val.pte, flags);
|
||||
else
|
||||
return _hypercall4(int, update_va_mapping, va,
|
||||
new_val.pte, new_val.pte >> 32, flags);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
@ -281,12 +281,13 @@ static inline int
|
|||
HYPERVISOR_update_va_mapping_otherdomain(unsigned long va, pte_t new_val,
|
||||
unsigned long flags, domid_t domid)
|
||||
{
|
||||
unsigned long pte_hi = 0;
|
||||
#ifdef CONFIG_X86_PAE
|
||||
pte_hi = new_val.pte_high;
|
||||
#endif
|
||||
return _hypercall5(int, update_va_mapping_otherdomain, va,
|
||||
new_val.pte_low, pte_hi, flags, domid);
|
||||
if (sizeof(new_val) == sizeof(long))
|
||||
return _hypercall4(int, update_va_mapping_otherdomain, va,
|
||||
new_val.pte, flags, domid);
|
||||
else
|
||||
return _hypercall5(int, update_va_mapping_otherdomain, va,
|
||||
new_val.pte, new_val.pte >> 32,
|
||||
flags, domid);
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
@ -327,14 +328,14 @@ MULTI_update_va_mapping(struct multicall_entry *mcl, unsigned long va,
|
|||
{
|
||||
mcl->op = __HYPERVISOR_update_va_mapping;
|
||||
mcl->args[0] = va;
|
||||
#ifdef CONFIG_X86_PAE
|
||||
mcl->args[1] = new_val.pte_low;
|
||||
mcl->args[2] = new_val.pte_high;
|
||||
#else
|
||||
mcl->args[1] = new_val.pte_low;
|
||||
mcl->args[2] = 0;
|
||||
#endif
|
||||
mcl->args[3] = flags;
|
||||
if (sizeof(new_val) == sizeof(long)) {
|
||||
mcl->args[1] = new_val.pte;
|
||||
mcl->args[2] = flags;
|
||||
} else {
|
||||
mcl->args[1] = new_val.pte;
|
||||
mcl->args[2] = new_val.pte >> 32;
|
||||
mcl->args[3] = flags;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -354,15 +355,16 @@ MULTI_update_va_mapping_otherdomain(struct multicall_entry *mcl, unsigned long v
|
|||
{
|
||||
mcl->op = __HYPERVISOR_update_va_mapping_otherdomain;
|
||||
mcl->args[0] = va;
|
||||
#ifdef CONFIG_X86_PAE
|
||||
mcl->args[1] = new_val.pte_low;
|
||||
mcl->args[2] = new_val.pte_high;
|
||||
#else
|
||||
mcl->args[1] = new_val.pte_low;
|
||||
mcl->args[2] = 0;
|
||||
#endif
|
||||
mcl->args[3] = flags;
|
||||
mcl->args[4] = domid;
|
||||
if (sizeof(new_val) == sizeof(long)) {
|
||||
mcl->args[1] = new_val.pte;
|
||||
mcl->args[2] = flags;
|
||||
mcl->args[3] = domid;
|
||||
} else {
|
||||
mcl->args[1] = new_val.pte;
|
||||
mcl->args[2] = new_val.pte >> 32;
|
||||
mcl->args[3] = flags;
|
||||
mcl->args[4] = domid;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
Loading…
Reference in a new issue