diff options
Diffstat (limited to 'arch/x86/include/asm/xen')
| -rw-r--r-- | arch/x86/include/asm/xen/hypercall.h | 17 | ||||
| -rw-r--r-- | arch/x86/include/asm/xen/page.h | 12 | 
2 files changed, 27 insertions, 2 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[];  	(type)__res;							\  }) +static inline long +privcmd_call(unsigned call, +	     unsigned long a1, unsigned long a2, +	     unsigned long a3, unsigned long a4, +	     unsigned long a5) +{ +	__HYPERCALL_DECLS; +	__HYPERCALL_5ARG(a1, a2, a3, a4, a5); + +	asm volatile("call *%[call]" +		     : __HYPERCALL_5PARAM +		     : [call] "a" (&hypercall_page[call]) +		     : __HYPERCALL_CLOBBER5); + +	return (long)__res; +} +  static inline int  HYPERVISOR_set_trap_table(struct trap_info *table)  { diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index bf5f7d32bd08..dd8c1414b3d5 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h @@ -37,14 +37,21 @@ typedef struct xpaddr {  extern unsigned long get_phys_to_machine(unsigned long pfn); -extern void set_phys_to_machine(unsigned long pfn, unsigned long mfn); +extern bool set_phys_to_machine(unsigned long pfn, unsigned long mfn);  static inline unsigned long pfn_to_mfn(unsigned long pfn)  { +	unsigned long mfn; +  	if (xen_feature(XENFEAT_auto_translated_physmap))  		return pfn; -	return get_phys_to_machine(pfn) & ~FOREIGN_FRAME_BIT; +	mfn = get_phys_to_machine(pfn); + +	if (mfn != INVALID_P2M_ENTRY) +		mfn &= ~FOREIGN_FRAME_BIT; + +	return mfn;  }  static inline int phys_to_machine_mapping_valid(unsigned long pfn) @@ -159,6 +166,7 @@ static inline pte_t __pte_ma(pteval_t x)  #define pgd_val_ma(x)	((x).pgd) +void xen_set_domain_pte(pte_t *ptep, pte_t pteval, unsigned domid);  xmaddr_t arbitrary_virt_to_machine(void *address);  unsigned long arbitrary_virt_to_mfn(void *vaddr); |