18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/kernel.h>
78c2ecf20Sopenharmony_ci#include <linux/kvm_host.h>
88c2ecf20Sopenharmony_ci#include <linux/kvm_para.h>
98c2ecf20Sopenharmony_ci#include <asm/fpu.h>
108c2ecf20Sopenharmony_ci#include <asm/lbt.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* FPU/LSX context management */
138c2ecf20Sopenharmony_civoid __kvm_save_fpu(struct loongarch_fpu *fpu);
148c2ecf20Sopenharmony_civoid __kvm_restore_fpu(struct loongarch_fpu *fpu);
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_civoid kvm_save_fpu(struct kvm_vcpu *cpu)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	return __kvm_save_fpu(&cpu->arch.fpu);
198c2ecf20Sopenharmony_ci}
208c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_save_fpu);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_civoid kvm_restore_fpu(struct kvm_vcpu *cpu)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	return __kvm_restore_fpu(&cpu->arch.fpu);
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_fpu);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LSX
298c2ecf20Sopenharmony_civoid __kvm_save_lsx(struct loongarch_fpu *fpu);
308c2ecf20Sopenharmony_civoid __kvm_restore_lsx(struct loongarch_fpu *fpu);
318c2ecf20Sopenharmony_civoid __kvm_restore_lsx_upper(struct loongarch_fpu *fpu);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_civoid kvm_save_lsx(struct kvm_vcpu *cpu)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	return __kvm_save_lsx(&cpu->arch.fpu);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_save_lsx);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_civoid kvm_restore_lsx(struct kvm_vcpu *cpu)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	return __kvm_restore_lsx(&cpu->arch.fpu);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_lsx);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_civoid kvm_restore_lsx_upper(struct kvm_vcpu *cpu)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	return __kvm_restore_lsx_upper(&cpu->arch.fpu);
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_lsx_upper);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#endif
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LSX
548c2ecf20Sopenharmony_civoid __kvm_save_lasx(struct loongarch_fpu *fpu);
558c2ecf20Sopenharmony_civoid __kvm_restore_lasx(struct loongarch_fpu *fpu);
568c2ecf20Sopenharmony_civoid __kvm_restore_lasx_upper(struct loongarch_fpu *fpu);
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_civoid kvm_save_lasx(struct kvm_vcpu *cpu)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	return __kvm_save_lasx(&cpu->arch.fpu);
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_save_lasx);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_civoid kvm_restore_lasx(struct kvm_vcpu *cpu)
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	return __kvm_restore_lasx(&cpu->arch.fpu);
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_lasx);
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_civoid kvm_restore_lasx_upper(struct kvm_vcpu *cpu)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	return _restore_lasx_upper(&cpu->arch.fpu);
738c2ecf20Sopenharmony_ci}
748c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_lasx_upper);
758c2ecf20Sopenharmony_ci#endif
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LBT
788c2ecf20Sopenharmony_civoid kvm_restore_lbt(struct kvm_vcpu *cpu)
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	restore_lbt_registers(&cpu->arch.lbt);
818c2ecf20Sopenharmony_ci}
828c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_restore_lbt);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_civoid kvm_save_lbt(struct kvm_vcpu *cpu)
858c2ecf20Sopenharmony_ci{
868c2ecf20Sopenharmony_ci	save_lbt_registers(&cpu->arch.lbt);
878c2ecf20Sopenharmony_ci}
888c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_save_lbt);
898c2ecf20Sopenharmony_ci#endif
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_enter_guest);
938c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(kvm_exception_entry);
948c2ecf20Sopenharmony_ci
95