diff options
Diffstat (limited to 'arch/powerpc/kvm')
| -rw-r--r-- | arch/powerpc/kvm/Kconfig | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/Makefile | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_vio.c | 23 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_rm_xive.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 27 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_xive.c | 5 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_xive.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/irq.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/powerpc.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kvm/trace.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/trace_book3s.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/trace_booke.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/trace_hv.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/trace_pr.h | 1 | 
14 files changed, 49 insertions, 19 deletions
| diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 0c52cb5d43f5..b12b8eb39c29 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # KVM configuration  # diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile index 381a6ec0ff3b..85ba80de7133 100644 --- a/arch/powerpc/kvm/Makefile +++ b/arch/powerpc/kvm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile for Kernel-based Virtual Machine module  # diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c index 8f2da8bba737..4dffa611376d 100644 --- a/arch/powerpc/kvm/book3s_64_vio.c +++ b/arch/powerpc/kvm/book3s_64_vio.c @@ -478,28 +478,30 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,  		return ret;  	dir = iommu_tce_direction(tce); + +	idx = srcu_read_lock(&vcpu->kvm->srcu); +  	if ((dir != DMA_NONE) && kvmppc_gpa_to_ua(vcpu->kvm, -			tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) -		return H_PARAMETER; +			tce & ~(TCE_PCI_READ | TCE_PCI_WRITE), &ua, NULL)) { +		ret = H_PARAMETER; +		goto unlock_exit; +	}  	entry = ioba >> stt->page_shift;  	list_for_each_entry_lockless(stit, &stt->iommu_tables, next) { -		if (dir == DMA_NONE) { +		if (dir == DMA_NONE)  			ret = kvmppc_tce_iommu_unmap(vcpu->kvm,  					stit->tbl, entry); -		} else { -			idx = srcu_read_lock(&vcpu->kvm->srcu); +		else  			ret = kvmppc_tce_iommu_map(vcpu->kvm, stit->tbl,  					entry, ua, dir); -			srcu_read_unlock(&vcpu->kvm->srcu, idx); -		}  		if (ret == H_SUCCESS)  			continue;  		if (ret == H_TOO_HARD) -			return ret; +			goto unlock_exit;  		WARN_ON_ONCE(1);  		kvmppc_clear_tce(stit->tbl, entry); @@ -507,7 +509,10 @@ long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,  	kvmppc_tce_put(stt, entry, tce); -	return H_SUCCESS; +unlock_exit: +	srcu_read_unlock(&vcpu->kvm->srcu, idx); + +	return ret;  }  EXPORT_SYMBOL_GPL(kvmppc_h_put_tce); diff --git a/arch/powerpc/kvm/book3s_hv_rm_xive.c b/arch/powerpc/kvm/book3s_hv_rm_xive.c index 5b81a807d742..174d75e476fa 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_xive.c +++ b/arch/powerpc/kvm/book3s_hv_rm_xive.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/kernel.h>  #include <linux/kvm_host.h>  #include <linux/err.h> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 17936f82d3c7..42639fba89e8 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -989,13 +989,14 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)  	beq	no_xive  	ld	r11, VCPU_XIVE_SAVED_STATE(r4)  	li	r9, TM_QW1_OS -	stdcix	r11,r9,r10  	eieio +	stdcix	r11,r9,r10  	lwz	r11, VCPU_XIVE_CAM_WORD(r4)  	li	r9, TM_QW1_OS + TM_WORD2  	stwcix	r11,r9,r10  	li	r9, 1  	stw	r9, VCPU_XIVE_PUSHED(r4) +	eieio  no_xive:  #endif /* CONFIG_KVM_XICS */ @@ -1121,6 +1122,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)  BEGIN_FTR_SECTION  	mtspr	SPRN_PPR, r0  END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) + +/* Move canary into DSISR to check for later */ +BEGIN_FTR_SECTION +	li	r0, 0x7fff +	mtspr	SPRN_HDSISR, r0 +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) +  	ld	r0, VCPU_GPR(R0)(r4)  	ld	r4, VCPU_GPR(R4)(r4) @@ -1303,6 +1311,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)  	bne	3f  BEGIN_FTR_SECTION  	PPC_MSGSYNC +	lwsync  END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)  	lbz	r0, HSTATE_HOST_IPI(r13)  	cmpwi	r0, 0 @@ -1393,8 +1402,8 @@ guest_exit_cont:		/* r9 = vcpu, r12 = trap, r13 = paca */  	cmpldi	cr0, r10, 0  	beq	1f  	/* First load to pull the context, we ignore the value */ -	lwzx	r11, r7, r10  	eieio +	lwzx	r11, r7, r10  	/* Second load to recover the context state (Words 0 and 1) */  	ldx	r11, r6, r10  	b	3f @@ -1402,8 +1411,8 @@ guest_exit_cont:		/* r9 = vcpu, r12 = trap, r13 = paca */  	cmpldi	cr0, r10, 0  	beq	1f  	/* First load to pull the context, we ignore the value */ -	lwzcix	r11, r7, r10  	eieio +	lwzcix	r11, r7, r10  	/* Second load to recover the context state (Words 0 and 1) */  	ldcix	r11, r6, r10  3:	std	r11, VCPU_XIVE_SAVED_STATE(r9) @@ -1413,6 +1422,7 @@ guest_exit_cont:		/* r9 = vcpu, r12 = trap, r13 = paca */  	stw	r10, VCPU_XIVE_PUSHED(r9)  	stb	r10, (VCPU_XIVE_SAVED_STATE+3)(r9)  	stb	r0, (VCPU_XIVE_SAVED_STATE+4)(r9) +	eieio  1:  #endif /* CONFIG_KVM_XICS */  	/* Save more register state  */ @@ -1956,9 +1966,14 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)  kvmppc_hdsi:  	ld	r3, VCPU_KVM(r9)  	lbz	r0, KVM_RADIX(r3) -	cmpwi	r0, 0  	mfspr	r4, SPRN_HDAR  	mfspr	r6, SPRN_HDSISR +BEGIN_FTR_SECTION +	/* Look for DSISR canary. If we find it, retry instruction */ +	cmpdi	r6, 0x7fff +	beq	6f +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) +	cmpwi	r0, 0  	bne	.Lradix_hdsi		/* on radix, just save DAR/DSISR/ASDR */  	/* HPTE not found fault or protection fault? */  	andis.	r0, r6, (DSISR_NOHPTE | DSISR_PROTFAULT)@h @@ -2776,6 +2791,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)  	PPC_MSGCLR(6)  	/* see if it's a host IPI */  	li	r3, 1 +BEGIN_FTR_SECTION +	PPC_MSGSYNC +	lwsync +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)  	lbz	r0, HSTATE_HOST_IPI(r13)  	cmpwi	r0, 0  	bnelr diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c index 13304622ab1c..bf457843e032 100644 --- a/arch/powerpc/kvm/book3s_xive.c +++ b/arch/powerpc/kvm/book3s_xive.c @@ -622,7 +622,7 @@ int kvmppc_xive_get_xive(struct kvm *kvm, u32 irq, u32 *server,  		return -EINVAL;  	state = &sb->irq_state[idx];  	arch_spin_lock(&sb->lock); -	*server = state->guest_server; +	*server = state->act_server;  	*priority = state->guest_priority;  	arch_spin_unlock(&sb->lock); @@ -1331,7 +1331,7 @@ static int xive_get_source(struct kvmppc_xive *xive, long irq, u64 addr)  	xive->saved_src_count++;  	/* Convert saved state into something compatible with xics */ -	val = state->guest_server; +	val = state->act_server;  	prio = state->saved_scan_prio;  	if (prio == MASKED) { @@ -1507,7 +1507,6 @@ static int xive_set_source(struct kvmppc_xive *xive, long irq, u64 addr)  	/* First convert prio and mark interrupt as untargetted */  	act_prio = xive_prio_from_guest(guest_prio);  	state->act_priority = MASKED; -	state->guest_server = server;  	/*  	 * We need to drop the lock due to the mutex below. Hopefully diff --git a/arch/powerpc/kvm/book3s_xive.h b/arch/powerpc/kvm/book3s_xive.h index 5938f7644dc1..6ba63f8e8a61 100644 --- a/arch/powerpc/kvm/book3s_xive.h +++ b/arch/powerpc/kvm/book3s_xive.h @@ -35,7 +35,6 @@ struct kvmppc_xive_irq_state {  	struct xive_irq_data *pt_data;	/* XIVE Pass-through associated data */  	/* Targetting as set by guest */ -	u32 guest_server;		/* Current guest selected target */  	u8 guest_priority;		/* Guest set priority */  	u8 saved_priority;		/* Saved priority when masking */ diff --git a/arch/powerpc/kvm/irq.h b/arch/powerpc/kvm/irq.h index 3f1be85a83bc..e6463f866abc 100644 --- a/arch/powerpc/kvm/irq.h +++ b/arch/powerpc/kvm/irq.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __IRQ_H  #define __IRQ_H diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 3480faaf1ef8..ee279c7f4802 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -644,8 +644,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)  		break;  #endif  	case KVM_CAP_PPC_HTM: -		r = cpu_has_feature(CPU_FTR_TM_COMP) && -		    is_kvmppc_hv_enabled(kvm); +		r = cpu_has_feature(CPU_FTR_TM_COMP) && hv_enabled;  		break;  	default:  		r = 0; diff --git a/arch/powerpc/kvm/trace.h b/arch/powerpc/kvm/trace.h index 2e0e67ef3544..491b0f715d6b 100644 --- a/arch/powerpc/kvm/trace.h +++ b/arch/powerpc/kvm/trace.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_KVM_H diff --git a/arch/powerpc/kvm/trace_book3s.h b/arch/powerpc/kvm/trace_book3s.h index f647ce0f428b..f3b23759e017 100644 --- a/arch/powerpc/kvm/trace_book3s.h +++ b/arch/powerpc/kvm/trace_book3s.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_TRACE_KVM_BOOK3S_H)  #define _TRACE_KVM_BOOK3S_H diff --git a/arch/powerpc/kvm/trace_booke.h b/arch/powerpc/kvm/trace_booke.h index 7ec534d1db9f..ac640e81fdc5 100644 --- a/arch/powerpc/kvm/trace_booke.h +++ b/arch/powerpc/kvm/trace_booke.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_TRACE_KVM_BOOKE_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_KVM_BOOKE_H diff --git a/arch/powerpc/kvm/trace_hv.h b/arch/powerpc/kvm/trace_hv.h index ebc6dd449556..bcfe8a987f6a 100644 --- a/arch/powerpc/kvm/trace_hv.h +++ b/arch/powerpc/kvm/trace_hv.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_TRACE_KVM_HV_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_KVM_HV_H diff --git a/arch/powerpc/kvm/trace_pr.h b/arch/powerpc/kvm/trace_pr.h index d44f324184fb..85785a370c0e 100644 --- a/arch/powerpc/kvm/trace_pr.h +++ b/arch/powerpc/kvm/trace_pr.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #if !defined(_TRACE_KVM_PR_H) || defined(TRACE_HEADER_MULTI_READ)  #define _TRACE_KVM_PR_H |