diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_segment.S')
| -rw-r--r-- | arch/powerpc/kvm/book3s_segment.S | 31 | 
1 files changed, 29 insertions, 2 deletions
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S index 1abe4788191..acee37cde84 100644 --- a/arch/powerpc/kvm/book3s_segment.S +++ b/arch/powerpc/kvm/book3s_segment.S @@ -90,6 +90,15 @@ kvmppc_handler_trampoline_enter:  	LOAD_GUEST_SEGMENTS  #ifdef CONFIG_PPC_BOOK3S_64 +BEGIN_FTR_SECTION +	/* Save host FSCR */ +	mfspr	r8, SPRN_FSCR +	std	r8, HSTATE_HOST_FSCR(r13) +	/* Set FSCR during guest execution */ +	ld	r9, SVCPU_SHADOW_FSCR(r13) +	mtspr	SPRN_FSCR, r9 +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) +  	/* Some guests may need to have dcbz set to 32 byte length.  	 *  	 * Usually we ensure that by patching the guest's instructions @@ -161,8 +170,8 @@ kvmppc_handler_trampoline_enter_end:  .global kvmppc_handler_trampoline_exit  kvmppc_handler_trampoline_exit: -.global kvmppc_interrupt -kvmppc_interrupt: +.global kvmppc_interrupt_pr +kvmppc_interrupt_pr:  	/* Register usage at this point:  	 * @@ -255,6 +264,10 @@ BEGIN_FTR_SECTION  	cmpwi	r12, BOOK3S_INTERRUPT_H_EMUL_ASSIST  	beq-	ld_last_inst  END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) +BEGIN_FTR_SECTION +	cmpwi	r12, BOOK3S_INTERRUPT_FAC_UNAVAIL +	beq-	ld_last_inst +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)  #endif  	b	no_ld_last_inst @@ -311,6 +324,18 @@ no_ld_last_inst:  no_dcbz32_off: +BEGIN_FTR_SECTION +	/* Save guest FSCR on a FAC_UNAVAIL interrupt */ +	cmpwi	r12, BOOK3S_INTERRUPT_FAC_UNAVAIL +	bne+	no_fscr_save +	mfspr	r7, SPRN_FSCR +	std	r7, SVCPU_SHADOW_FSCR(r13) +no_fscr_save: +	/* Restore host FSCR */ +	ld	r8, HSTATE_HOST_FSCR(r13) +	mtspr	SPRN_FSCR, r8 +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) +  #endif /* CONFIG_PPC_BOOK3S_64 */  	/* @@ -361,6 +386,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)  	beqa	BOOK3S_INTERRUPT_DECREMENTER  	cmpwi	r12, BOOK3S_INTERRUPT_PERFMON  	beqa	BOOK3S_INTERRUPT_PERFMON +	cmpwi	r12, BOOK3S_INTERRUPT_DOORBELL +	beqa	BOOK3S_INTERRUPT_DOORBELL  	RFI  kvmppc_handler_trampoline_exit_end:  | 
