Re: [PATCH v2 07/30] KVM: PPC: Book3S PR: add C function wrapper for _kvmppc_save/restore_tm()
flat view
From: Simon Guo <hidden>
Date: 2018-05-15 12:41:25
Also in:
kvm
On Tue, May 15, 2018 at 04:05:48PM +1000, Paul Mackerras wrote:
On Wed, Feb 28, 2018 at 01:37:14AM +0800, wei.guo.simon@gmail.com wrote:quoted
From: Simon Guo <redacted> 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: Simon Guo <redacted>Some relatively minor comments below:quoted
diff --git a/arch/powerpc/kvm/tm.S b/arch/powerpc/kvm/tm.S index 2d6fe5b..269dd11 100644 --- a/arch/powerpc/kvm/tm.S +++ b/arch/powerpc/kvm/tm.S@@ -35,7 +35,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)@@ -149,6 +149,52 @@ _GLOBAL(kvmppc_save_tm) blr /* + * _kvmppc_save_tm() 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)The comment doesn't match the actual function name.
I will correct that. Thanks for point it out.
quoted
+ 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: * - r3 pointing to the vcpu struct.@@ -158,7 +204,7 @@ _GLOBAL(kvmppc_save_tm) * 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)@@ -186,6 +232,7 @@ _GLOBAL(kvmppc_restore_tm) rldicl. r5, r5, 64 - MSR_TS_S_LG, 62 beqlr /* TM not active in guest */ std r1, HSTATE_SCRATCH2(r13) + std r3, HSTATE_SCRATCH1(r13)Why do we need to save r3 here and restore it below?
I think it is a legacy change when I did TM save/restore on each trap from guest to host. It can be removed now.
quoted
/* Make sure the failure summary is set, otherwise we'll program check * when we trechkpt. It's possible that this might have been not set@@ -262,6 +309,7 @@ _GLOBAL(kvmppc_restore_tm) ld r29, HSTATE_DSCR(r13) mtspr SPRN_DSCR, r29 #endif + ld r3, HSTATE_SCRATCH1(r13) ld r1, HSTATE_SCRATCH2(r13) ld r2, PACATMSCRATCH(r13)@@ -273,4 +321,47 @@ _GLOBAL(kvmppc_restore_tm) mtlr r0 blr +/* + * _kvmppc_restore_tm() 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)Again, comment doesn't match the actual function name.
I will correct that. Thanks, - Simon