Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit caa3be92 authored by Simon Guo's avatar Simon Guo Committed by Paul Mackerras
Browse files

KVM: PPC: Book3S PR: Add C function wrapper for _kvmppc_save/restore_tm()



Currently __kvmppc_save/restore_tm() APIs can only be invoked from
assembly function. This patch adds C function wrappers for them so
that they can be safely called from C function.

Signed-off-by: default avatarSimon Guo <wei.guo.simon@gmail.com>
Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
parent 7f386af7
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -141,7 +141,13 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip);
void pnv_power9_force_smt4_catch(void);
void pnv_power9_force_smt4_release(void);

/* Transaction memory related */
void tm_enable(void);
void tm_disable(void);
void tm_abort(uint8_t cause);

struct kvm_vcpu;
void _kvmppc_restore_tm_pr(struct kvm_vcpu *vcpu, u64 guest_msr);
void _kvmppc_save_tm_pr(struct kvm_vcpu *vcpu, u64 guest_msr);

#endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */
+3 −3
Original line number Diff line number Diff line
@@ -3138,12 +3138,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
kvmppc_save_tm_hv:
	/* See if we need to handle fake suspend mode */
BEGIN_FTR_SECTION
	b	kvmppc_save_tm
	b	__kvmppc_save_tm
END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)

	lbz	r0, HSTATE_FAKE_SUSPEND(r13) /* Were we fake suspended? */
	cmpwi	r0, 0
	beq	kvmppc_save_tm
	beq	__kvmppc_save_tm

	/* The following code handles the fake_suspend = 1 case */
	mflr	r0
@@ -3228,7 +3228,7 @@ kvmppc_restore_tm_hv:
	 * fake-suspend mode, or emulate a TM rollback.
	 */
BEGIN_FTR_SECTION
	b	kvmppc_restore_tm
	b	__kvmppc_restore_tm
END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
	mflr	r0
	std	r0, PPC_LR_STKOFF(r1)
+92 −2
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
 * This can modify all checkpointed registers, but
 * restores r1, r2 before exit.
 */
_GLOBAL(kvmppc_save_tm)
_GLOBAL(__kvmppc_save_tm)
	mflr	r0
	std	r0, PPC_LR_STKOFF(r1)

@@ -156,6 +156,52 @@ END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_HV_ASSIST)
	mtlr	r0
	blr

/*
 * _kvmppc_save_tm_pr() is a wrapper around __kvmppc_save_tm(), so that it can
 * be invoked from C function by PR KVM only.
 */
_GLOBAL(_kvmppc_save_tm_pr)
	mflr	r5
	std	r5, PPC_LR_STKOFF(r1)
	stdu    r1, -SWITCH_FRAME_SIZE(r1)
	SAVE_NVGPRS(r1)

	/* save MSR since TM/math bits might be impacted
	 * by __kvmppc_save_tm().
	 */
	mfmsr	r5
	SAVE_GPR(5, r1)

	/* also save DSCR/CR so that it can be recovered later */
	mfspr   r6, SPRN_DSCR
	SAVE_GPR(6, r1)

	mfcr    r7
	stw     r7, _CCR(r1)

	bl	__kvmppc_save_tm

	ld      r7, _CCR(r1)
	mtcr	r7

	REST_GPR(6, r1)
	mtspr   SPRN_DSCR, r6

	/* need preserve current MSR's MSR_TS bits */
	REST_GPR(5, r1)
	mfmsr   r6
	rldicl  r6, r6, 64 - MSR_TS_S_LG, 62
	rldimi  r5, r6, MSR_TS_S_LG, 63 - MSR_TS_T_LG
	mtmsrd  r5

	REST_NVGPRS(r1)
	addi    r1, r1, SWITCH_FRAME_SIZE
	ld	r5, PPC_LR_STKOFF(r1)
	mtlr	r5
	blr

EXPORT_SYMBOL_GPL(_kvmppc_save_tm_pr);

/*
 * Restore transactional state and TM-related registers.
 * Called with:
@@ -166,7 +212,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_HV_ASSIST)
 * This potentially modifies all checkpointed registers.
 * It restores r1, r2 from the PACA.
 */
_GLOBAL(kvmppc_restore_tm)
_GLOBAL(__kvmppc_restore_tm)
	mflr	r0
	std	r0, PPC_LR_STKOFF(r1)

@@ -279,4 +325,48 @@ _GLOBAL(kvmppc_restore_tm)
	ld	r0, PPC_LR_STKOFF(r1)
	mtlr	r0
	blr

/*
 * _kvmppc_restore_tm_pr() is a wrapper around __kvmppc_restore_tm(), so that it
 * can be invoked from C function by PR KVM only.
 */
_GLOBAL(_kvmppc_restore_tm_pr)
	mflr	r5
	std	r5, PPC_LR_STKOFF(r1)
	stdu    r1, -SWITCH_FRAME_SIZE(r1)
	SAVE_NVGPRS(r1)

	/* save MSR to avoid TM/math bits change */
	mfmsr	r5
	SAVE_GPR(5, r1)

	/* also save DSCR/CR so that it can be recovered later */
	mfspr   r6, SPRN_DSCR
	SAVE_GPR(6, r1)

	mfcr    r7
	stw     r7, _CCR(r1)

	bl	__kvmppc_restore_tm

	ld      r7, _CCR(r1)
	mtcr	r7

	REST_GPR(6, r1)
	mtspr   SPRN_DSCR, r6

	/* need preserve current MSR's MSR_TS bits */
	REST_GPR(5, r1)
	mfmsr   r6
	rldicl  r6, r6, 64 - MSR_TS_S_LG, 62
	rldimi  r5, r6, MSR_TS_S_LG, 63 - MSR_TS_T_LG
	mtmsrd  r5

	REST_NVGPRS(r1)
	addi    r1, r1, SWITCH_FRAME_SIZE
	ld	r5, PPC_LR_STKOFF(r1)
	mtlr	r5
	blr

EXPORT_SYMBOL_GPL(_kvmppc_restore_tm_pr);
#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */