[PATCH v3 1/4] LoongArch: KVM: Add separate KVM_REQ_LBT_LOAD request bit
From: Bibo Mao
Date: Tue Jun 02 2026 - 03:51:04 EST
There are different structures with LBT and FPU register restore,
with LBT the structure is vcpu::arch::lbt, with FPU the structure
is vcpu::arch::fpu. And FPU/LSX/LASX saving and restoring share
the common structure vcpu::arch::fpu.
New request bit KVM_REQ_LBT_LOAD is used for LBT register restore,
and rename KVM_REQ_AUX_LOAD with KVM_REQ_FPU_LOAD for FPU register
restore.
Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx>
---
arch/loongarch/include/asm/kvm_host.h | 3 ++-
arch/loongarch/kvm/exit.c | 12 +++++-------
arch/loongarch/kvm/vcpu.c | 8 ++++----
3 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/arch/loongarch/include/asm/kvm_host.h b/arch/loongarch/include/asm/kvm_host.h
index 776bc487a705..e76a49d4233b 100644
--- a/arch/loongarch/include/asm/kvm_host.h
+++ b/arch/loongarch/include/asm/kvm_host.h
@@ -38,7 +38,8 @@
#define KVM_REQ_TLB_FLUSH_GPA KVM_ARCH_REQ(0)
#define KVM_REQ_STEAL_UPDATE KVM_ARCH_REQ(1)
#define KVM_REQ_PMU KVM_ARCH_REQ(2)
-#define KVM_REQ_AUX_LOAD KVM_ARCH_REQ(3)
+#define KVM_REQ_FPU_LOAD KVM_ARCH_REQ(3)
+#define KVM_REQ_LBT_LOAD KVM_ARCH_REQ(4)
#define KVM_GUESTDBG_SW_BP_MASK \
(KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP)
diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c
index 3b95cd0f989b..b839c989d3dc 100644
--- a/arch/loongarch/kvm/exit.c
+++ b/arch/loongarch/kvm/exit.c
@@ -756,7 +756,7 @@ static int kvm_handle_fpu_disabled(struct kvm_vcpu *vcpu, int ecode)
}
vcpu->arch.aux_ldtype = KVM_LARCH_FPU;
- kvm_make_request(KVM_REQ_AUX_LOAD, vcpu);
+ kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
return RESUME_GUEST;
}
@@ -798,7 +798,7 @@ static int kvm_handle_lsx_disabled(struct kvm_vcpu *vcpu, int ecode)
kvm_queue_exception(vcpu, EXCCODE_INE, 0);
else {
vcpu->arch.aux_ldtype = KVM_LARCH_LSX;
- kvm_make_request(KVM_REQ_AUX_LOAD, vcpu);
+ kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
}
return RESUME_GUEST;
@@ -818,7 +818,7 @@ static int kvm_handle_lasx_disabled(struct kvm_vcpu *vcpu, int ecode)
kvm_queue_exception(vcpu, EXCCODE_INE, 0);
else {
vcpu->arch.aux_ldtype = KVM_LARCH_LASX;
- kvm_make_request(KVM_REQ_AUX_LOAD, vcpu);
+ kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
}
return RESUME_GUEST;
@@ -828,10 +828,8 @@ static int kvm_handle_lbt_disabled(struct kvm_vcpu *vcpu, int ecode)
{
if (!kvm_guest_has_lbt(&vcpu->arch))
kvm_queue_exception(vcpu, EXCCODE_INE, 0);
- else {
- vcpu->arch.aux_ldtype = KVM_LARCH_LBT;
- kvm_make_request(KVM_REQ_AUX_LOAD, vcpu);
- }
+ else
+ kvm_make_request(KVM_REQ_LBT_LOAD, vcpu);
return RESUME_GUEST;
}
diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
index e28084c49e68..c28aa37f37a9 100644
--- a/arch/loongarch/kvm/vcpu.c
+++ b/arch/loongarch/kvm/vcpu.c
@@ -239,7 +239,7 @@ static void kvm_late_check_requests(struct kvm_vcpu *vcpu)
vcpu->arch.flush_gpa = INVALID_GPA;
}
- if (kvm_check_request(KVM_REQ_AUX_LOAD, vcpu)) {
+ if (kvm_check_request(KVM_REQ_FPU_LOAD, vcpu)) {
switch (vcpu->arch.aux_ldtype) {
case KVM_LARCH_FPU:
kvm_own_fpu(vcpu);
@@ -250,15 +250,15 @@ static void kvm_late_check_requests(struct kvm_vcpu *vcpu)
case KVM_LARCH_LASX:
kvm_own_lasx(vcpu);
break;
- case KVM_LARCH_LBT:
- kvm_own_lbt(vcpu);
- break;
default:
break;
}
vcpu->arch.aux_ldtype = 0;
}
+
+ if (kvm_check_request(KVM_REQ_LBT_LOAD, vcpu))
+ kvm_own_lbt(vcpu);
}
/*
--
2.39.3