[PATCH v6 08/33] KVM: arm64: Use accessor functions for core regs

Marc Zyngier maz at kernel.org
Thu Aug 13 02:56:37 PDT 2026


On Wed, 12 Aug 2026 16:36:04 +0100,
Steffen Eiden <seiden at linux.ibm.com> wrote:
> 
> Instead of accessing the value directly use assessor function that

s/assessor function/accessors/

> abstract the actual location of the register values. Add a helper
> function to reset fpsimd registers. Enable other KVM implementations to
> reuse this code.

to reuse this code by overloading the accessors.

> 
> No functional changes.
> 
> Signed-off-by: Steffen Eiden <seiden at linux.ibm.com>
> ---
>  arch/arm64/include/asm/kvm_emulate.h | 34 ++++++++++++++++++++++++++--
>  arch/arm64/kvm/guest.c               | 16 ++++++-------
>  2 files changed, 40 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
> index 8603766c1b4d..b31d50bdf59e 100644
> --- a/arch/arm64/include/asm/kvm_emulate.h
> +++ b/arch/arm64/include/asm/kvm_emulate.h
> @@ -141,6 +141,31 @@ static __always_inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcpu)
>  	return (unsigned long *)&vcpu->arch.ctxt.regs.pstate;
>  }
>  
> +static __always_inline unsigned long *vcpu_sp_el0(struct kvm_vcpu *vcpu)
> +{
> +	return (unsigned long *)&vcpu->arch.ctxt.regs.sp;
> +}
> +
> +static __always_inline u64 *vcpu_sp_el1(struct kvm_vcpu *vcpu)
> +{
> +	return __ctxt_sys_reg(&vcpu->arch.ctxt, SP_EL1);
> +}
> +
> +static __always_inline __u128 *vcpu_vreg(struct kvm_vcpu *vcpu, int n)
> +{
> +	return &vcpu->arch.ctxt.fp_regs.vregs[n];
> +}
> +
> +static __always_inline __u32 *vcpu_fpsr(struct kvm_vcpu *vcpu)
> +{
> +	return &vcpu->arch.ctxt.fp_regs.fpsr;
> +}
> +
> +static __always_inline __u32 *vcpu_fpcr(struct kvm_vcpu *vcpu)
> +{
> +	return &vcpu->arch.ctxt.fp_regs.fpcr;
> +}
> +
>  static __always_inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu)
>  {
>  	return !!(*vcpu_cpsr(vcpu) & PSR_MODE32_BIT);
> @@ -737,6 +762,11 @@ static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu)
>  	}
>  }
>  
> +static inline void kvm_reset_fpsimd(struct kvm_vcpu *vcpu)
> +{
> +	memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs));
> +}
> +
>  /* Reset a vcpu's core registers. */
>  static inline void kvm_reset_vcpu_core(struct kvm_vcpu *vcpu)
>  {
> @@ -752,8 +782,8 @@ static inline void kvm_reset_vcpu_core(struct kvm_vcpu *vcpu)
>  	/* Reset core registers */
>  	memset(vcpu_gp_regs(vcpu), 0, sizeof(vcpu_gp_regs(vcpu)));
>  	*vcpu_pc(vcpu) = 0;
> -	vcpu->arch.ctxt.regs.sp = 0;
> -	memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs));
> +	*vcpu_sp_el0(vcpu) = 0;
> +	kvm_reset_fpsimd(vcpu);
>  	vcpu->arch.ctxt.spsr_abt = 0;
>  	vcpu->arch.ctxt.spsr_und = 0;
>  	vcpu->arch.ctxt.spsr_irq = 0;
> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
> index b01d6622b872..773f6c8e5026 100644
> --- a/arch/arm64/kvm/guest.c
> +++ b/arch/arm64/kvm/guest.c
> @@ -134,19 +134,19 @@ static void *core_reg_addr(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
>  	     KVM_REG_ARM_CORE_REG(regs.regs[30]):
>  		off -= KVM_REG_ARM_CORE_REG(regs.regs[0]);
>  		off /= 2;
> -		return &vcpu->arch.ctxt.regs.regs[off];
> +		return &vcpu_gp_regs(vcpu)[off];

Doesn't this belong to the previous patch?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.



More information about the linux-arm-kernel mailing list