diff options
Diffstat (limited to 'arch/x86/include')
| -rw-r--r-- | arch/x86/include/asm/highmem.h | 11 | ||||
| -rw-r--r-- | arch/x86/include/asm/iomap.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/irq.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/kvm_emulate.h | 30 | ||||
| -rw-r--r-- | arch/x86/include/asm/kvm_host.h | 81 | ||||
| -rw-r--r-- | arch/x86/include/asm/kvm_para.h | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/msr-index.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/olpc.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/perf_event.h | 19 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable_32.h | 14 | ||||
| -rw-r--r-- | arch/x86/include/asm/pgtable_64.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/pvclock.h | 38 | ||||
| -rw-r--r-- | arch/x86/include/asm/smp.h | 9 | ||||
| -rw-r--r-- | arch/x86/include/asm/xen/hypercall.h | 17 | ||||
| -rw-r--r-- | arch/x86/include/asm/xen/page.h | 12 | 
15 files changed, 191 insertions, 58 deletions
| diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index 8caac76ac324..3bd04022fd0c 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h @@ -59,11 +59,12 @@ extern void kunmap_high(struct page *page);  void *kmap(struct page *page);  void kunmap(struct page *page); -void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot); -void *kmap_atomic(struct page *page, enum km_type type); -void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type); -void *kmap_atomic_pfn(unsigned long pfn, enum km_type type); -void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); + +void *kmap_atomic_prot(struct page *page, pgprot_t prot); +void *__kmap_atomic(struct page *page); +void __kunmap_atomic(void *kvaddr); +void *kmap_atomic_pfn(unsigned long pfn); +void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);  struct page *kmap_atomic_to_page(void *ptr);  #define flush_cache_kmaps()	do { } while (0) diff --git a/arch/x86/include/asm/iomap.h b/arch/x86/include/asm/iomap.h index c4191b3b7056..363e33eb6ec1 100644 --- a/arch/x86/include/asm/iomap.h +++ b/arch/x86/include/asm/iomap.h @@ -27,10 +27,10 @@  #include <asm/tlbflush.h>  void __iomem * -iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); +iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);  void -iounmap_atomic(void __iomem *kvaddr, enum km_type type); +iounmap_atomic(void __iomem *kvaddr);  int  iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot); diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 0bf5b0083650..13b0ebaa512f 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h @@ -21,10 +21,8 @@ static inline int irq_canonicalize(int irq)  #ifdef CONFIG_X86_32  extern void irq_ctx_init(int cpu); -extern void irq_ctx_exit(int cpu);  #else  # define irq_ctx_init(cpu) do { } while (0) -# define irq_ctx_exit(cpu) do { } while (0)  #endif  #define __ARCH_HAS_DO_SOFTIRQ diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index 1f99ecfc48e1..b36c6b3fe144 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h @@ -139,6 +139,7 @@ struct x86_emulate_ops {  	void (*set_segment_selector)(u16 sel, int seg, struct kvm_vcpu *vcpu);  	unsigned long (*get_cached_segment_base)(int seg, struct kvm_vcpu *vcpu);  	void (*get_gdt)(struct desc_ptr *dt, struct kvm_vcpu *vcpu); +	void (*get_idt)(struct desc_ptr *dt, struct kvm_vcpu *vcpu);  	ulong (*get_cr)(int cr, struct kvm_vcpu *vcpu);  	int (*set_cr)(int cr, ulong val, struct kvm_vcpu *vcpu);  	int (*cpl)(struct kvm_vcpu *vcpu); @@ -156,7 +157,10 @@ struct operand {  		unsigned long orig_val;  		u64 orig_val64;  	}; -	unsigned long *ptr; +	union { +		unsigned long *reg; +		unsigned long mem; +	} addr;  	union {  		unsigned long val;  		u64 val64; @@ -190,6 +194,7 @@ struct decode_cache {  	bool has_seg_override;  	u8 seg_override;  	unsigned int d; +	int (*execute)(struct x86_emulate_ctxt *ctxt);  	unsigned long regs[NR_VCPU_REGS];  	unsigned long eip;  	/* modrm */ @@ -197,17 +202,16 @@ struct decode_cache {  	u8 modrm_mod;  	u8 modrm_reg;  	u8 modrm_rm; -	u8 use_modrm_ea; +	u8 modrm_seg;  	bool rip_relative; -	unsigned long modrm_ea; -	void *modrm_ptr; -	unsigned long modrm_val;  	struct fetch_cache fetch;  	struct read_cache io_read;  	struct read_cache mem_read;  };  struct x86_emulate_ctxt { +	struct x86_emulate_ops *ops; +  	/* Register state before/after emulation. */  	struct kvm_vcpu *vcpu; @@ -220,12 +224,11 @@ struct x86_emulate_ctxt {  	/* interruptibility state, as a result of execution of STI or MOV SS */  	int interruptibility; -	bool restart; /* restart string instruction after writeback */ +	bool perm_ok; /* do not check permissions if true */  	int exception; /* exception that happens during emulation or -1 */  	u32 error_code; /* error code for exception */  	bool error_code_valid; -	unsigned long cr2; /* faulted address in case of #PF */  	/* decode cache */  	struct decode_cache decode; @@ -249,13 +252,14 @@ struct x86_emulate_ctxt {  #define X86EMUL_MODE_HOST X86EMUL_MODE_PROT64  #endif -int x86_decode_insn(struct x86_emulate_ctxt *ctxt, -		    struct x86_emulate_ops *ops); -int x86_emulate_insn(struct x86_emulate_ctxt *ctxt, -		     struct x86_emulate_ops *ops); +int x86_decode_insn(struct x86_emulate_ctxt *ctxt); +#define EMULATION_FAILED -1 +#define EMULATION_OK 0 +#define EMULATION_RESTART 1 +int x86_emulate_insn(struct x86_emulate_ctxt *ctxt);  int emulator_task_switch(struct x86_emulate_ctxt *ctxt, -			 struct x86_emulate_ops *ops,  			 u16 tss_selector, int reason,  			 bool has_error_code, u32 error_code); - +int emulate_int_real(struct x86_emulate_ctxt *ctxt, +		     struct x86_emulate_ops *ops, int irq);  #endif /* _ASM_X86_KVM_X86_EMULATE_H */ diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index c52e2eb40a1e..9e6fe391094e 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -236,10 +236,14 @@ struct kvm_pio_request {   */  struct kvm_mmu {  	void (*new_cr3)(struct kvm_vcpu *vcpu); +	void (*set_cr3)(struct kvm_vcpu *vcpu, unsigned long root); +	unsigned long (*get_cr3)(struct kvm_vcpu *vcpu);  	int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err); +	void (*inject_page_fault)(struct kvm_vcpu *vcpu);  	void (*free)(struct kvm_vcpu *vcpu);  	gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva, u32 access,  			    u32 *error); +	gpa_t (*translate_gpa)(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access);  	void (*prefetch_page)(struct kvm_vcpu *vcpu,  			      struct kvm_mmu_page *page);  	int (*sync_page)(struct kvm_vcpu *vcpu, @@ -249,13 +253,18 @@ struct kvm_mmu {  	int root_level;  	int shadow_root_level;  	union kvm_mmu_page_role base_role; +	bool direct_map;  	u64 *pae_root; +	u64 *lm_root;  	u64 rsvd_bits_mask[2][4]; + +	bool nx; + +	u64 pdptrs[4]; /* pae */  };  struct kvm_vcpu_arch { -	u64 host_tsc;  	/*  	 * rip and regs accesses must go through  	 * kvm_{register,rip}_{read,write} functions. @@ -272,7 +281,6 @@ struct kvm_vcpu_arch {  	unsigned long cr4_guest_owned_bits;  	unsigned long cr8;  	u32 hflags; -	u64 pdptrs[4]; /* pae */  	u64 efer;  	u64 apic_base;  	struct kvm_lapic *apic;    /* kernel irqchip context */ @@ -282,7 +290,41 @@ struct kvm_vcpu_arch {  	u64 ia32_misc_enable_msr;  	bool tpr_access_reporting; +	/* +	 * Paging state of the vcpu +	 * +	 * If the vcpu runs in guest mode with two level paging this still saves +	 * the paging mode of the l1 guest. This context is always used to +	 * handle faults. +	 */  	struct kvm_mmu mmu; + +	/* +	 * Paging state of an L2 guest (used for nested npt) +	 * +	 * This context will save all necessary information to walk page tables +	 * of the an L2 guest. This context is only initialized for page table +	 * walking and not for faulting since we never handle l2 page faults on +	 * the host. +	 */ +	struct kvm_mmu nested_mmu; + +	/* +	 * Pointer to the mmu context currently used for +	 * gva_to_gpa translations. +	 */ +	struct kvm_mmu *walk_mmu; + +	/* +	 * This struct is filled with the necessary information to propagate a +	 * page fault into the guest +	 */ +	struct { +		u64      address; +		unsigned error_code; +		bool     nested; +	} fault; +  	/* only needed in kvm_pv_mmu_op() path, but it's hot so  	 * put it here to avoid allocation */  	struct kvm_pv_mmu_op_buffer mmu_op_buffer; @@ -336,9 +378,15 @@ struct kvm_vcpu_arch {  	gpa_t time;  	struct pvclock_vcpu_time_info hv_clock; -	unsigned int hv_clock_tsc_khz; +	unsigned int hw_tsc_khz;  	unsigned int time_offset;  	struct page *time_page; +	u64 last_host_tsc; +	u64 last_guest_tsc; +	u64 last_kernel_ns; +	u64 last_tsc_nsec; +	u64 last_tsc_write; +	bool tsc_catchup;  	bool nmi_pending;  	bool nmi_injected; @@ -367,9 +415,9 @@ struct kvm_vcpu_arch {  };  struct kvm_arch { -	unsigned int n_free_mmu_pages; +	unsigned int n_used_mmu_pages;  	unsigned int n_requested_mmu_pages; -	unsigned int n_alloc_mmu_pages; +	unsigned int n_max_mmu_pages;  	atomic_t invlpg_counter;  	struct hlist_head mmu_page_hash[KVM_NUM_MMU_PAGES];  	/* @@ -394,8 +442,14 @@ struct kvm_arch {  	gpa_t ept_identity_map_addr;  	unsigned long irq_sources_bitmap; -	u64 vm_init_tsc;  	s64 kvmclock_offset; +	spinlock_t tsc_write_lock; +	u64 last_tsc_nsec; +	u64 last_tsc_offset; +	u64 last_tsc_write; +	u32 virtual_tsc_khz; +	u32 virtual_tsc_mult; +	s8 virtual_tsc_shift;  	struct kvm_xen_hvm_config xen_hvm_config; @@ -505,6 +559,7 @@ struct kvm_x86_ops {  	void (*queue_exception)(struct kvm_vcpu *vcpu, unsigned nr,  				bool has_error_code, u32 error_code,  				bool reinject); +	void (*cancel_injection)(struct kvm_vcpu *vcpu);  	int (*interrupt_allowed)(struct kvm_vcpu *vcpu);  	int (*nmi_allowed)(struct kvm_vcpu *vcpu);  	bool (*get_nmi_mask)(struct kvm_vcpu *vcpu); @@ -517,11 +572,16 @@ struct kvm_x86_ops {  	u64 (*get_mt_mask)(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio);  	int (*get_lpage_level)(void);  	bool (*rdtscp_supported)(void); +	void (*adjust_tsc_offset)(struct kvm_vcpu *vcpu, s64 adjustment); + +	void (*set_tdp_cr3)(struct kvm_vcpu *vcpu, unsigned long cr3);  	void (*set_supported_cpuid)(u32 func, struct kvm_cpuid_entry2 *entry);  	bool (*has_wbinvd_exit)(void); +	void (*write_tsc_offset)(struct kvm_vcpu *vcpu, u64 offset); +  	const struct trace_print_flags *exit_reasons_str;  }; @@ -544,7 +604,7 @@ void kvm_mmu_zap_all(struct kvm *kvm);  unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm);  void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages); -int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3); +int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3);  int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,  			  const void *val, int bytes); @@ -608,8 +668,11 @@ void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr);  void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);  void kvm_requeue_exception(struct kvm_vcpu *vcpu, unsigned nr);  void kvm_requeue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); -void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, -			   u32 error_code); +void kvm_inject_page_fault(struct kvm_vcpu *vcpu); +int kvm_read_guest_page_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, +			    gfn_t gfn, void *data, int offset, int len, +			    u32 access); +void kvm_propagate_fault(struct kvm_vcpu *vcpu);  bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl);  int kvm_pic_set_irq(void *opaque, int irq, int level); diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h index 05eba5e9a8e8..7b562b6184bc 100644 --- a/arch/x86/include/asm/kvm_para.h +++ b/arch/x86/include/asm/kvm_para.h @@ -158,6 +158,12 @@ static inline unsigned int kvm_arch_para_features(void)  	return cpuid_eax(KVM_CPUID_FEATURES);  } +#ifdef CONFIG_KVM_GUEST +void __init kvm_guest_init(void); +#else +#define kvm_guest_init() do { } while (0)  #endif +#endif /* __KERNEL__ */ +  #endif /* _ASM_X86_KVM_PARA_H */ diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 986f7790fdb2..3ea3dc487047 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -121,6 +121,7 @@  #define MSR_AMD64_IBSDCLINAD		0xc0011038  #define MSR_AMD64_IBSDCPHYSAD		0xc0011039  #define MSR_AMD64_IBSCTL		0xc001103a +#define MSR_AMD64_IBSBRTARGET		0xc001103b  /* Fam 10h MSRs */  #define MSR_FAM10H_MMIO_CONF_BASE	0xc0010058 @@ -198,6 +199,7 @@  #define MSR_IA32_TSC			0x00000010  #define MSR_IA32_PLATFORM_ID		0x00000017  #define MSR_IA32_EBL_CR_POWERON		0x0000002a +#define MSR_EBC_FREQUENCY_ID		0x0000002c  #define MSR_IA32_FEATURE_CONTROL        0x0000003a  #define FEATURE_CONTROL_LOCKED				(1<<0) diff --git a/arch/x86/include/asm/olpc.h b/arch/x86/include/asm/olpc.h index 101229b0d8ed..42a978c0c1b3 100644 --- a/arch/x86/include/asm/olpc.h +++ b/arch/x86/include/asm/olpc.h @@ -89,6 +89,8 @@ extern int olpc_ec_mask_unset(uint8_t bits);  /* EC commands */  #define EC_FIRMWARE_REV		0x08 +#define EC_WLAN_ENTER_RESET	0x35 +#define EC_WLAN_LEAVE_RESET	0x25  /* SCI source values */ diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index 6e742cc4251b..550e26b1dbb3 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h @@ -111,17 +111,18 @@ union cpuid10_edx {  #define X86_PMC_IDX_FIXED_BTS				(X86_PMC_IDX_FIXED + 16)  /* IbsFetchCtl bits/masks */ -#define IBS_FETCH_RAND_EN		(1ULL<<57) -#define IBS_FETCH_VAL			(1ULL<<49) -#define IBS_FETCH_ENABLE		(1ULL<<48) -#define IBS_FETCH_CNT			0xFFFF0000ULL -#define IBS_FETCH_MAX_CNT		0x0000FFFFULL +#define IBS_FETCH_RAND_EN	(1ULL<<57) +#define IBS_FETCH_VAL		(1ULL<<49) +#define IBS_FETCH_ENABLE	(1ULL<<48) +#define IBS_FETCH_CNT		0xFFFF0000ULL +#define IBS_FETCH_MAX_CNT	0x0000FFFFULL  /* IbsOpCtl bits */ -#define IBS_OP_CNT_CTL			(1ULL<<19) -#define IBS_OP_VAL			(1ULL<<18) -#define IBS_OP_ENABLE			(1ULL<<17) -#define IBS_OP_MAX_CNT			0x0000FFFFULL +#define IBS_OP_CNT_CTL		(1ULL<<19) +#define IBS_OP_VAL		(1ULL<<18) +#define IBS_OP_ENABLE		(1ULL<<17) +#define IBS_OP_MAX_CNT		0x0000FFFFULL +#define IBS_OP_MAX_CNT_EXT	0x007FFFFFULL	/* not a register bit mask */  #ifdef CONFIG_PERF_EVENTS  extern void init_hw_perf_events(void); diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h index 8abde9ec90bf..0c92113c4cb6 100644 --- a/arch/x86/include/asm/pgtable_32.h +++ b/arch/x86/include/asm/pgtable_32.h @@ -49,24 +49,14 @@ extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t);  #endif  #if defined(CONFIG_HIGHPTE) -#define __KM_PTE			\ -	(in_nmi() ? KM_NMI_PTE : 	\ -	 in_irq() ? KM_IRQ_PTE :	\ -	 KM_PTE0)  #define pte_offset_map(dir, address)					\ -	((pte_t *)kmap_atomic(pmd_page(*(dir)), __KM_PTE) +		\ +	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\  	 pte_index((address))) -#define pte_offset_map_nested(dir, address)				\ -	((pte_t *)kmap_atomic(pmd_page(*(dir)), KM_PTE1) +		\ -	 pte_index((address))) -#define pte_unmap(pte) kunmap_atomic((pte), __KM_PTE) -#define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) +#define pte_unmap(pte) kunmap_atomic((pte))  #else  #define pte_offset_map(dir, address)					\  	((pte_t *)page_address(pmd_page(*(dir))) + pte_index((address))) -#define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address))  #define pte_unmap(pte) do { } while (0) -#define pte_unmap_nested(pte) do { } while (0)  #endif  /* Clear a kernel PTE and flush it from the TLB */ diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index f96ac9bedf75..f86da20347f2 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h @@ -127,9 +127,7 @@ static inline int pgd_large(pgd_t pgd) { return 0; }  /* x86-64 always has all page tables mapped. */  #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address)) -#define pte_offset_map_nested(dir, address) pte_offset_kernel((dir), (address))  #define pte_unmap(pte) ((void)(pte))/* NOP */ -#define pte_unmap_nested(pte) ((void)(pte)) /* NOP */  #define update_mmu_cache(vma, address, ptep) do { } while (0) diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h index cd02f324aa6b..7f7e577a0e39 100644 --- a/arch/x86/include/asm/pvclock.h +++ b/arch/x86/include/asm/pvclock.h @@ -12,4 +12,42 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall,  			    struct pvclock_vcpu_time_info *vcpu,  			    struct timespec *ts); +/* + * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, + * yielding a 64-bit result. + */ +static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) +{ +	u64 product; +#ifdef __i386__ +	u32 tmp1, tmp2; +#endif + +	if (shift < 0) +		delta >>= -shift; +	else +		delta <<= shift; + +#ifdef __i386__ +	__asm__ ( +		"mul  %5       ; " +		"mov  %4,%%eax ; " +		"mov  %%edx,%4 ; " +		"mul  %5       ; " +		"xor  %5,%5    ; " +		"add  %4,%%eax ; " +		"adc  %5,%%edx ; " +		: "=A" (product), "=r" (tmp1), "=r" (tmp2) +		: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); +#elif defined(__x86_64__) +	__asm__ ( +		"mul %%rdx ; shrd $32,%%rdx,%%rax" +		: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); +#else +#error implement me! +#endif + +	return product; +} +  #endif /* _ASM_X86_PVCLOCK_H */ diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 4cfc90824068..4c2f63c7fc1b 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h @@ -50,7 +50,7 @@ struct smp_ops {  	void (*smp_prepare_cpus)(unsigned max_cpus);  	void (*smp_cpus_done)(unsigned max_cpus); -	void (*smp_send_stop)(void); +	void (*stop_other_cpus)(int wait);  	void (*smp_send_reschedule)(int cpu);  	int (*cpu_up)(unsigned cpu); @@ -73,7 +73,12 @@ extern struct smp_ops smp_ops;  static inline void smp_send_stop(void)  { -	smp_ops.smp_send_stop(); +	smp_ops.stop_other_cpus(0); +} + +static inline void stop_other_cpus(void) +{ +	smp_ops.stop_other_cpus(1);  }  static inline void smp_prepare_boot_cpu(void) 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); |