Skip to content

Commit 84be421

Browse files
zhaotianrui-loongsonchenhuacai
authored andcommitted
LoongArch: KVM: Implement fpu operations for vcpu
Implement LoongArch fpu related interface for vcpu, such as get fpu, set fpu, own fpu and lose fpu, etc. Reviewed-by: Bibo Mao <[email protected]> Tested-by: Huacai Chen <[email protected]> Signed-off-by: Tianrui Zhao <[email protected]> Signed-off-by: Huacai Chen <[email protected]>
1 parent f6deff3 commit 84be421

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

arch/loongarch/kvm/vcpu.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,62 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
402402
return r;
403403
}
404404

405+
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
406+
{
407+
int i = 0;
408+
409+
fpu->fcc = vcpu->arch.fpu.fcc;
410+
fpu->fcsr = vcpu->arch.fpu.fcsr;
411+
for (i = 0; i < NUM_FPU_REGS; i++)
412+
memcpy(&fpu->fpr[i], &vcpu->arch.fpu.fpr[i], FPU_REG_WIDTH / 64);
413+
414+
return 0;
415+
}
416+
417+
int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
418+
{
419+
int i = 0;
420+
421+
vcpu->arch.fpu.fcc = fpu->fcc;
422+
vcpu->arch.fpu.fcsr = fpu->fcsr;
423+
for (i = 0; i < NUM_FPU_REGS; i++)
424+
memcpy(&vcpu->arch.fpu.fpr[i], &fpu->fpr[i], FPU_REG_WIDTH / 64);
425+
426+
return 0;
427+
}
428+
429+
/* Enable FPU and restore context */
430+
void kvm_own_fpu(struct kvm_vcpu *vcpu)
431+
{
432+
preempt_disable();
433+
434+
/* Enable FPU */
435+
set_csr_euen(CSR_EUEN_FPEN);
436+
437+
kvm_restore_fpu(&vcpu->arch.fpu);
438+
vcpu->arch.aux_inuse |= KVM_LARCH_FPU;
439+
trace_kvm_aux(vcpu, KVM_TRACE_AUX_RESTORE, KVM_TRACE_AUX_FPU);
440+
441+
preempt_enable();
442+
}
443+
444+
/* Save context and disable FPU */
445+
void kvm_lose_fpu(struct kvm_vcpu *vcpu)
446+
{
447+
preempt_disable();
448+
449+
if (vcpu->arch.aux_inuse & KVM_LARCH_FPU) {
450+
kvm_save_fpu(&vcpu->arch.fpu);
451+
vcpu->arch.aux_inuse &= ~KVM_LARCH_FPU;
452+
trace_kvm_aux(vcpu, KVM_TRACE_AUX_SAVE, KVM_TRACE_AUX_FPU);
453+
454+
/* Disable FPU */
455+
clear_csr_euen(CSR_EUEN_FPEN);
456+
}
457+
458+
preempt_enable();
459+
}
460+
405461
int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id)
406462
{
407463
return 0;

0 commit comments

Comments
 (0)