Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca15f20f authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar
Browse files

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: default avatarJeremy 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: default avatarIngo Molnar <mingo@elte.hu>
parent 7077c33d
Loading
Loading
Loading
Loading
+31 −29
Original line number Diff line number Diff line
@@ -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
	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_low, pte_hi, flags);
				   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
	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_low, pte_hi, flags, domid);
				   new_val.pte, new_val.pte >> 32,
				   flags, domid);
}

static inline int
@@ -327,15 +328,15 @@ 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
	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
MULTI_grant_table_op(struct multicall_entry *mcl, unsigned int cmd,
@@ -354,16 +355,17 @@ 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
	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
MULTI_update_descriptor(struct multicall_entry *mcl, u64 maddr,