There are three FPU types FPU/LSX/LASX, which represents FPU64, FPU128
and FPU256, and now lazy FPU method is used with FPU enabling. There are
three different HW FPU exception code with different FPU type.
The exising method is to enable specified FPU type with responding FPU
exeception. Supposing application uses FPU64 and FPU256, there will be
FPU256 exception when FPU256 type is used.
Here enable FPU with the max VM supported type directly, so it can avoid
unnecessary FPU exception in future if further FPU type is used.
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
/* Which auxiliary state is loaded (KVM_LARCH_*) */
unsigned int aux_inuse;
- unsigned int aux_ldtype;
/* FPU state */
struct loongarch_fpu fpu FPU_ALIGN;
return RESUME_HOST;
}
- vcpu->arch.aux_ldtype = KVM_LARCH_FPU;
kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
return RESUME_GUEST;
{
if (!kvm_guest_has_lsx(&vcpu->arch))
kvm_queue_exception(vcpu, EXCCODE_INE, 0);
- else {
- vcpu->arch.aux_ldtype = KVM_LARCH_LSX;
+ else
kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
- }
return RESUME_GUEST;
}
{
if (!kvm_guest_has_lasx(&vcpu->arch))
kvm_queue_exception(vcpu, EXCCODE_INE, 0);
- else {
- vcpu->arch.aux_ldtype = KVM_LARCH_LASX;
+ else
kvm_make_request(KVM_REQ_FPU_LOAD, vcpu);
- }
return RESUME_GUEST;
}
}
if (kvm_check_request(KVM_REQ_FPU_LOAD, vcpu)) {
- switch (vcpu->arch.aux_ldtype) {
- case KVM_LARCH_FPU:
- kvm_own_fpu(vcpu);
- break;
- case KVM_LARCH_LSX:
- kvm_own_lsx(vcpu);
- break;
- case KVM_LARCH_LASX:
+ if (kvm_guest_has_lasx(&vcpu->arch))
kvm_own_lasx(vcpu);
- break;
- default:
- break;
- }
-
- vcpu->arch.aux_ldtype = 0;
+ else if (kvm_guest_has_lsx(&vcpu->arch))
+ kvm_own_lsx(vcpu);
+ else if (kvm_guest_has_fpu(&vcpu->arch))
+ kvm_own_fpu(vcpu);
}
if (kvm_check_request(KVM_REQ_LBT_LOAD, vcpu))