diff options
Diffstat (limited to 'arch/powerpc/kvm/44x_tlb.c')
| -rw-r--r-- | arch/powerpc/kvm/44x_tlb.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c index 5f3cff83e08..0deef1082e0 100644 --- a/arch/powerpc/kvm/44x_tlb.c +++ b/arch/powerpc/kvm/44x_tlb.c @@ -268,7 +268,7 @@ static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x,  	trace_kvm_stlb_inval(stlb_index);  } -void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) +void kvmppc_mmu_destroy_44x(struct kvm_vcpu *vcpu)  {  	struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);  	int i; @@ -319,7 +319,6 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr,  	if (is_error_page(new_page)) {  		printk(KERN_ERR "Couldn't get guest page for gfn %llx!\n",  			(unsigned long long)gfn); -		kvm_release_page_clean(new_page);  		return;  	}  	hpaddr = page_to_phys(new_page); @@ -387,8 +386,10 @@ static void kvmppc_44x_invalidate(struct kvm_vcpu *vcpu,  	}  } -void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode) +void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr)  { +	int usermode = vcpu->arch.shared->msr & MSR_PR; +  	vcpu->arch.shadow_pid = !usermode;  } @@ -440,6 +441,7 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws)  	struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);  	struct kvmppc_44x_tlbe *tlbe;  	unsigned int gtlb_index; +	int idx;  	gtlb_index = kvmppc_get_gpr(vcpu, ra);  	if (gtlb_index >= KVM44x_GUEST_TLB_SIZE) { @@ -472,6 +474,8 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws)  		return EMULATE_FAIL;  	} +	idx = srcu_read_lock(&vcpu->kvm->srcu); +  	if (tlbe_is_host_safe(vcpu, tlbe)) {  		gva_t eaddr;  		gpa_t gpaddr; @@ -488,6 +492,8 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws)  		kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index);  	} +	srcu_read_unlock(&vcpu->kvm->srcu, idx); +  	trace_kvm_gtlb_write(gtlb_index, tlbe->tid, tlbe->word0, tlbe->word1,  			     tlbe->word2);  | 
