[PATCH 21/26] KVM: PPC: Book3S PR: adds emulation for treclaim.

Paul Mackerras paulus at ozlabs.org
Tue Jan 23 20:23:23 AEDT 2018


On Thu, Jan 11, 2018 at 06:11:34PM +0800, wei.guo.simon at gmail.com wrote:
> From: Simon Guo <wei.guo.simon at gmail.com>
> 
> This patch adds support for "treclaim." emulation when PR KVM guest
> executes treclaim. and traps to host.
> 
> We will firstly doing treclaim. and save TM checkpoint and doing
> treclaim. Then it is necessary to update vcpu current reg content
> with checkpointed vals. When rfid into guest again, those vcpu
> current reg content(now the checkpoint vals) will be loaded into
> regs.
> 
> Signed-off-by: Simon Guo <wei.guo.simon at gmail.com>
> ---
>  arch/powerpc/include/asm/reg.h    |  4 +++
>  arch/powerpc/kvm/book3s_emulate.c | 66 ++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 69 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> index 6c293bc..b3bcf6b 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -244,12 +244,16 @@
>  #define SPRN_TEXASR	0x82	/* Transaction EXception & Summary */
>  #define SPRN_TEXASRU	0x83	/* ''	   ''	   ''	 Upper 32  */
>  #define TEXASR_FC_LG	(63 - 7)	/* Failure Code */
> +#define TEXASR_AB_LG	(63 - 31)	/* Abort */
> +#define TEXASR_SU_LG	(63 - 32)	/* Suspend */
>  #define TEXASR_HV_LG	(63 - 34)	/* Hypervisor state*/
>  #define TEXASR_PR_LG	(63 - 35)	/* Privilege level */
>  #define TEXASR_FS_LG	(63 - 36)	/* failure summary */
>  #define TEXASR_EX_LG	(63 - 37)	/* TFIAR exact bit */
>  #define TEXASR_ROT_LG	(63 - 38)	/* ROT bit */
>  #define TEXASR_FC	(ASM_CONST(0xFF) << TEXASR_FC_LG)
> +#define TEXASR_AB	__MASK(TEXASR_AB_LG)
> +#define TEXASR_SU	__MASK(TEXASR_SU_LG)
>  #define TEXASR_HV	__MASK(TEXASR_HV_LG)
>  #define TEXASR_PR	__MASK(TEXASR_PR_LG)
>  #define TEXASR_FS	__MASK(TEXASR_FS_LG)

It would be good to collect up all the modifications you need to make
to reg.h into a single patch at the beginning of the patch series --
that will make it easier to merge it all.

> diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
> index 1eb1900..51c0e20 100644
> --- a/arch/powerpc/kvm/book3s_emulate.c
> +++ b/arch/powerpc/kvm/book3s_emulate.c

[snip]

> @@ -127,6 +130,42 @@ void kvmppc_copyfrom_vcpu_tm(struct kvm_vcpu *vcpu)
>  	vcpu->arch.vrsave = vcpu->arch.vrsave_tm;
>  }
>  
> +static void kvmppc_emulate_treclaim(struct kvm_vcpu *vcpu, int ra_val)
> +{
> +	unsigned long guest_msr = kvmppc_get_msr(vcpu);
> +	int fc_val = ra_val ? ra_val : 1;
> +
> +	kvmppc_save_tm_pr(vcpu);
> +
> +	preempt_disable();
> +	kvmppc_copyfrom_vcpu_tm(vcpu);
> +	preempt_enable();
> +
> +	/*
> +	 * treclaim need quit to non-transactional state.
> +	 */
> +	guest_msr &= ~(MSR_TS_MASK);
> +	kvmppc_set_msr(vcpu, guest_msr);
> +
> +	preempt_disable();
> +	tm_enable();
> +	vcpu->arch.texasr = mfspr(SPRN_TEXASR);
> +	vcpu->arch.texasr &= ~TEXASR_FC;
> +	vcpu->arch.texasr |= ((u64)fc_val << TEXASR_FC_LG);

You're doing failure recording here unconditionally, but the
architecture says that treclaim. only does failure recording if
TEXASR_FS is not already set.

> +	vcpu->arch.texasr &= ~(TEXASR_PR | TEXASR_HV);
> +	if (kvmppc_get_msr(vcpu) & MSR_PR)
> +		vcpu->arch.texasr |= TEXASR_PR;
> +
> +	if (kvmppc_get_msr(vcpu) & MSR_HV)
> +		vcpu->arch.texasr |= TEXASR_HV;
> +
> +	vcpu->arch.tfiar = kvmppc_get_pc(vcpu);
> +	mtspr(SPRN_TEXASR, vcpu->arch.texasr);
> +	mtspr(SPRN_TFIAR, vcpu->arch.tfiar);
> +	tm_disable();
> +	preempt_enable();
> +}
>  #endif

Paul.


More information about the Linuxppc-dev mailing list