[PATCH] LoongArch: KVM: Fix FPU register width issue with user access API

Bibo Mao posted 1 patch 5 days, 3 hours ago
arch/loongarch/kvm/vcpu.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
[PATCH] LoongArch: KVM: Fix FPU register width issue with user access API
Posted by Bibo Mao 5 days, 3 hours ago
At the beginning, only 64 bit FPU is supported. With FPU register
get interface, 64 bit FPU data is copied to user space, the same with
FPU set API. However with LSX and LASX supported in later, there should
be FPU data copied with bigger width. Here fixes this issue, copy the
whole 256 bit FPU data to user space.

Fixes: db1ecca22edf ("LoongArch: KVM: Add LSX (128bit SIMD) support")
Cc: stable@vger.kernel.org
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 arch/loongarch/kvm/vcpu.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
index e28084c49e68..2e40386f8686 100644
--- a/arch/loongarch/kvm/vcpu.c
+++ b/arch/loongarch/kvm/vcpu.c
@@ -1312,7 +1312,7 @@ int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 	fpu->fcc = vcpu->arch.fpu.fcc;
 	fpu->fcsr = vcpu->arch.fpu.fcsr;
 	for (i = 0; i < NUM_FPU_REGS; i++)
-		memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], FPU_REG_WIDTH / 64);
+		memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], sizeof(union fpureg));
 
 	return 0;
 }
@@ -1324,7 +1324,7 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
 	vcpu->arch.fpu.fcc = fpu->fcc;
 	vcpu->arch.fpu.fcsr = fpu->fcsr;
 	for (i = 0; i < NUM_FPU_REGS; i++)
-		memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], FPU_REG_WIDTH / 64);
+		memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], sizeof(union fpureg));
 
 	return 0;
 }

base-commit: e43ffb69e0438cddd72aaa30898b4dc446f664f8
-- 
2.39.3
Re: [PATCH] LoongArch: KVM: Fix FPU register width issue with user access API
Posted by Huacai Chen 1 day ago
Applied, thanks.

Huacai

On Wed, Jun 3, 2026 at 10:34 AM Bibo Mao <maobibo@loongson.cn> wrote:
>
> At the beginning, only 64 bit FPU is supported. With FPU register
> get interface, 64 bit FPU data is copied to user space, the same with
> FPU set API. However with LSX and LASX supported in later, there should
> be FPU data copied with bigger width. Here fixes this issue, copy the
> whole 256 bit FPU data to user space.
>
> Fixes: db1ecca22edf ("LoongArch: KVM: Add LSX (128bit SIMD) support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>  arch/loongarch/kvm/vcpu.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
> index e28084c49e68..2e40386f8686 100644
> --- a/arch/loongarch/kvm/vcpu.c
> +++ b/arch/loongarch/kvm/vcpu.c
> @@ -1312,7 +1312,7 @@ int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
>         fpu->fcc = vcpu->arch.fpu.fcc;
>         fpu->fcsr = vcpu->arch.fpu.fcsr;
>         for (i = 0; i < NUM_FPU_REGS; i++)
> -               memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], FPU_REG_WIDTH / 64);
> +               memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], sizeof(union fpureg));
>
>         return 0;
>  }
> @@ -1324,7 +1324,7 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
>         vcpu->arch.fpu.fcc = fpu->fcc;
>         vcpu->arch.fpu.fcsr = fpu->fcsr;
>         for (i = 0; i < NUM_FPU_REGS; i++)
> -               memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], FPU_REG_WIDTH / 64);
> +               memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], sizeof(union fpureg));
>
>         return 0;
>  }
>
> base-commit: e43ffb69e0438cddd72aaa30898b4dc446f664f8
> --
> 2.39.3
>
>