diff options
Diffstat (limited to 'arch/powerpc/include/asm/kvm_host.h')
| -rw-r--r-- | arch/powerpc/include/asm/kvm_host.h | 125 | 
1 files changed, 92 insertions, 33 deletions
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 33283532e9d..bb66d8b8efd 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -63,20 +63,17 @@ extern void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);  #endif -/* We don't currently support large pages. */ -#define KVM_HPAGE_GFN_SHIFT(x)	0 -#define KVM_NR_PAGE_SIZES	1 -#define KVM_PAGES_PER_HPAGE(x)	(1UL<<31) -  #define HPTEG_CACHE_NUM			(1 << 15)  #define HPTEG_HASH_BITS_PTE		13  #define HPTEG_HASH_BITS_PTE_LONG	12  #define HPTEG_HASH_BITS_VPTE		13  #define HPTEG_HASH_BITS_VPTE_LONG	5 +#define HPTEG_HASH_BITS_VPTE_64K	11  #define HPTEG_HASH_NUM_PTE		(1 << HPTEG_HASH_BITS_PTE)  #define HPTEG_HASH_NUM_PTE_LONG		(1 << HPTEG_HASH_BITS_PTE_LONG)  #define HPTEG_HASH_NUM_VPTE		(1 << HPTEG_HASH_BITS_VPTE)  #define HPTEG_HASH_NUM_VPTE_LONG	(1 << HPTEG_HASH_BITS_VPTE_LONG) +#define HPTEG_HASH_NUM_VPTE_64K		(1 << HPTEG_HASH_BITS_VPTE_64K)  /* Physical Address Mask - allowed range of real mode RAM access */  #define KVM_PAM			0x0fffffffffffffffULL @@ -89,6 +86,9 @@ struct lppaca;  struct slb_shadow;  struct dtl_entry; +struct kvmppc_vcpu_book3s; +struct kvmppc_book3s_shadow_vcpu; +  struct kvm_vm_stat {  	u32 remote_tlb_flush;  }; @@ -224,15 +224,15 @@ struct revmap_entry {  #define KVMPPC_GOT_PAGE		0x80  struct kvm_arch_memory_slot { -#ifdef CONFIG_KVM_BOOK3S_64_HV +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE  	unsigned long *rmap;  	unsigned long *slot_phys; -#endif /* CONFIG_KVM_BOOK3S_64_HV */ +#endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */  };  struct kvm_arch {  	unsigned int lpid; -#ifdef CONFIG_KVM_BOOK3S_64_HV +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE  	unsigned long hpt_virt;  	struct revmap_entry *revmap;  	unsigned int host_lpid; @@ -256,7 +256,10 @@ struct kvm_arch {  	cpumask_t need_tlb_flush;  	struct kvmppc_vcore *vcores[KVM_MAX_VCORES];  	int hpt_cma_alloc; -#endif /* CONFIG_KVM_BOOK3S_64_HV */ +#endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ +#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE +	struct mutex hpt_mutex; +#endif  #ifdef CONFIG_PPC_BOOK3S_64  	struct list_head spapr_tce_tables;  	struct list_head rtas_tokens; @@ -267,6 +270,7 @@ struct kvm_arch {  #ifdef CONFIG_KVM_XICS  	struct kvmppc_xics *xics;  #endif +	struct kvmppc_ops *kvm_ops;  };  /* @@ -284,6 +288,7 @@ struct kvmppc_vcore {  	int n_woken;  	int nap_count;  	int napping_threads; +	int first_vcpuid;  	u16 pcpu;  	u16 last_cpu;  	u8 vcore_state; @@ -294,6 +299,12 @@ struct kvmppc_vcore {  	u64 stolen_tb;  	u64 preempt_tb;  	struct kvm_vcpu *runner; +	struct kvm *kvm; +	u64 tb_offset;		/* guest timebase - host timebase */ +	ulong lpcr; +	u32 arch_compat; +	ulong pcr; +	ulong dpdes;		/* doorbell state (POWER8) */  };  #define VCORE_ENTRY_COUNT(vc)	((vc)->entry_exit_count & 0xff) @@ -328,6 +339,7 @@ struct kvmppc_pte {  	bool may_read		: 1;  	bool may_write		: 1;  	bool may_execute	: 1; +	u8 page_size;		/* MMU_PAGE_xxx */  };  struct kvmppc_mmu { @@ -340,7 +352,8 @@ struct kvmppc_mmu {  	/* book3s */  	void (*mtsrin)(struct kvm_vcpu *vcpu, u32 srnum, ulong value);  	u32  (*mfsrin)(struct kvm_vcpu *vcpu, u32 srnum); -	int  (*xlate)(struct kvm_vcpu *vcpu, gva_t eaddr, struct kvmppc_pte *pte, bool data); +	int  (*xlate)(struct kvm_vcpu *vcpu, gva_t eaddr, +		      struct kvmppc_pte *pte, bool data, bool iswrite);  	void (*reset_msr)(struct kvm_vcpu *vcpu);  	void (*tlbie)(struct kvm_vcpu *vcpu, ulong addr, bool large);  	int  (*esid_to_vsid)(struct kvm_vcpu *vcpu, ulong esid, u64 *vsid); @@ -360,6 +373,7 @@ struct kvmppc_slb {  	bool large	: 1;	/* PTEs are 16MB */  	bool tb		: 1;	/* 1TB segment */  	bool class	: 1; +	u8 base_page_size;	/* MMU_PAGE_xxx */  };  # ifdef CONFIG_PPC_FSL_BOOK3E @@ -377,17 +391,6 @@ struct kvmppc_slb {  #define KVMPPC_EPR_USER		1 /* exit to userspace to fill EPR */  #define KVMPPC_EPR_KERNEL	2 /* in-kernel irqchip */ -struct kvmppc_booke_debug_reg { -	u32 dbcr0; -	u32 dbcr1; -	u32 dbcr2; -#ifdef CONFIG_KVM_E500MC -	u32 dbcr4; -#endif -	u64 iac[KVMPPC_BOOKE_MAX_IAC]; -	u64 dac[KVMPPC_BOOKE_MAX_DAC]; -}; -  #define KVMPPC_IRQ_DEFAULT	0  #define KVMPPC_IRQ_MPIC		1  #define KVMPPC_IRQ_XICS		2 @@ -402,12 +405,15 @@ struct kvm_vcpu_arch {  	int slb_max;		/* 1 + index of last valid entry in slb[] */  	int slb_nr;		/* total number of entries in SLB */  	struct kvmppc_mmu mmu; +	struct kvmppc_vcpu_book3s *book3s; +#endif +#ifdef CONFIG_PPC_BOOK3S_32 +	struct kvmppc_book3s_shadow_vcpu *shadow_vcpu;  #endif  	ulong gpr[32]; -	u64 fpr[32]; -	u64 fpscr; +	struct thread_fp_state fp;  #ifdef CONFIG_SPE  	ulong evr[32]; @@ -416,12 +422,7 @@ struct kvm_vcpu_arch {  	u64 acc;  #endif  #ifdef CONFIG_ALTIVEC -	vector128 vr[32]; -	vector128 vscr; -#endif - -#ifdef CONFIG_VSX -	u64 vsr[64]; +	struct thread_vr_state vr;  #endif  #ifdef CONFIG_KVM_BOOKE_HV @@ -448,6 +449,9 @@ struct kvm_vcpu_arch {  	ulong pc;  	ulong ctr;  	ulong lr; +#ifdef CONFIG_PPC_BOOK3S +	ulong tar; +#endif  	ulong xer;  	u32 cr; @@ -457,12 +461,32 @@ struct kvm_vcpu_arch {  	ulong guest_owned_ext;  	ulong purr;  	ulong spurr; +	ulong ic; +	ulong vtb;  	ulong dscr;  	ulong amr;  	ulong uamor; +	ulong iamr;  	u32 ctrl; +	u32 dabrx;  	ulong dabr; +	ulong dawr; +	ulong dawrx; +	ulong ciabr;  	ulong cfar; +	ulong ppr; +	ulong pspb; +	ulong fscr; +	ulong shadow_fscr; +	ulong ebbhr; +	ulong ebbrr; +	ulong bescr; +	ulong csigr; +	ulong tacr; +	ulong tcscr; +	ulong acop; +	ulong wort; +	ulong shadow_srr1;  #endif  	u32 vrsave; /* also USPRG0 */  	u32 mmucr; @@ -496,8 +520,33 @@ struct kvm_vcpu_arch {  	u32 ccr1;  	u32 dbsr; -	u64 mmcr[3]; +	u64 mmcr[5];  	u32 pmc[8]; +	u32 spmc[2]; +	u64 siar; +	u64 sdar; +	u64 sier; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +	u64 tfhar; +	u64 texasr; +	u64 tfiar; + +	u32 cr_tm; +	u64 lr_tm; +	u64 ctr_tm; +	u64 amr_tm; +	u64 ppr_tm; +	u64 dscr_tm; +	u64 tar_tm; + +	ulong gpr_tm[32]; + +	struct thread_fp_state fp_tm; + +	struct thread_vr_state vr_tm; +	u32 vrsave_tm; /* also USPRG0 */ + +#endif  #ifdef CONFIG_KVM_EXIT_TIMING  	struct mutex exit_timing_lock; @@ -516,6 +565,7 @@ struct kvm_vcpu_arch {  #ifdef CONFIG_PPC_BOOK3S  	ulong fault_dar;  	u32 fault_dsisr; +	unsigned long intr_msr;  #endif  #ifdef CONFIG_BOOKE @@ -531,10 +581,14 @@ struct kvm_vcpu_arch {  	u32 eptcfg;  	u32 epr;  	u32 crit_save; -	struct kvmppc_booke_debug_reg dbg_reg; +	/* guest debug registers*/ +	struct debug_reg dbg_reg; +	/* hardware visible debug registers when in guest state */ +	struct debug_reg shadow_dbg_reg;  #endif  	gpa_t paddr_accessed;  	gva_t vaddr_accessed; +	pgd_t *pgdir;  	u8 io_gpr; /* GPR used as IO source/target */  	u8 mmio_is_bigendian; @@ -572,8 +626,12 @@ struct kvm_vcpu_arch {  	wait_queue_head_t cpu_run;  	struct kvm_vcpu_arch_shared *shared; +#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_KVM_BOOK3S_PR_POSSIBLE) +	bool shared_big_endian; +#endif  	unsigned long magic_page_pa; /* phys addr to map the magic page to */  	unsigned long magic_page_ea; /* effect. addr to map the magic page to */ +	bool disable_kernel_nx;  	int irq_type;		/* one of KVM_IRQ_* */  	int irq_cpu_id; @@ -582,7 +640,7 @@ struct kvm_vcpu_arch {  	struct kvmppc_icp *icp; /* XICS presentation controller */  #endif -#ifdef CONFIG_KVM_BOOK3S_64_HV +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE  	struct kvm_vcpu_arch_shared shregs;  	unsigned long pgfault_addr; @@ -592,7 +650,6 @@ struct kvm_vcpu_arch {  	struct list_head run_list;  	struct task_struct *run_task;  	struct kvm_run *kvm_run; -	pgd_t *pgdir;  	spinlock_t vpa_update_lock;  	struct kvmppc_vpa vpa; @@ -608,6 +665,8 @@ struct kvm_vcpu_arch {  #endif  }; +#define VCPU_FPR(vcpu, i)	(vcpu)->arch.fp.fpr[i][TS_FPROFFSET] +  /* Values for vcpu->arch.state */  #define KVMPPC_VCPU_NOTREADY		0  #define KVMPPC_VCPU_RUNNABLE		1  | 
