1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4 */ 5 6 #include <linux/kernel.h> 7 #include <linux/kvm_host.h> 8 #include <linux/kvm_para.h> 9 #include <asm/fpu.h> 10 #include <asm/lbt.h> 11 12 /* FPU/LSX context management */ 13 void __kvm_save_fpu(struct loongarch_fpu *fpu); 14 void __kvm_restore_fpu(struct loongarch_fpu *fpu); 15 kvm_save_fpu(struct kvm_vcpu *cpu)16void kvm_save_fpu(struct kvm_vcpu *cpu) 17 { 18 return __kvm_save_fpu(&cpu->arch.fpu); 19 } 20 EXPORT_SYMBOL_GPL(kvm_save_fpu); 21 kvm_restore_fpu(struct kvm_vcpu *cpu)22void kvm_restore_fpu(struct kvm_vcpu *cpu) 23 { 24 return __kvm_restore_fpu(&cpu->arch.fpu); 25 } 26 EXPORT_SYMBOL_GPL(kvm_restore_fpu); 27 28 #ifdef CONFIG_CPU_HAS_LSX 29 void __kvm_save_lsx(struct loongarch_fpu *fpu); 30 void __kvm_restore_lsx(struct loongarch_fpu *fpu); 31 void __kvm_restore_lsx_upper(struct loongarch_fpu *fpu); 32 kvm_save_lsx(struct kvm_vcpu *cpu)33void kvm_save_lsx(struct kvm_vcpu *cpu) 34 { 35 return __kvm_save_lsx(&cpu->arch.fpu); 36 } 37 EXPORT_SYMBOL_GPL(kvm_save_lsx); 38 kvm_restore_lsx(struct kvm_vcpu *cpu)39void kvm_restore_lsx(struct kvm_vcpu *cpu) 40 { 41 return __kvm_restore_lsx(&cpu->arch.fpu); 42 } 43 EXPORT_SYMBOL_GPL(kvm_restore_lsx); 44 kvm_restore_lsx_upper(struct kvm_vcpu *cpu)45void kvm_restore_lsx_upper(struct kvm_vcpu *cpu) 46 { 47 return __kvm_restore_lsx_upper(&cpu->arch.fpu); 48 } 49 EXPORT_SYMBOL_GPL(kvm_restore_lsx_upper); 50 51 #endif 52 53 #ifdef CONFIG_CPU_HAS_LSX 54 void __kvm_save_lasx(struct loongarch_fpu *fpu); 55 void __kvm_restore_lasx(struct loongarch_fpu *fpu); 56 void __kvm_restore_lasx_upper(struct loongarch_fpu *fpu); 57 kvm_save_lasx(struct kvm_vcpu *cpu)58void kvm_save_lasx(struct kvm_vcpu *cpu) 59 { 60 return __kvm_save_lasx(&cpu->arch.fpu); 61 } 62 EXPORT_SYMBOL_GPL(kvm_save_lasx); 63 kvm_restore_lasx(struct kvm_vcpu *cpu)64void kvm_restore_lasx(struct kvm_vcpu *cpu) 65 { 66 return __kvm_restore_lasx(&cpu->arch.fpu); 67 } 68 EXPORT_SYMBOL_GPL(kvm_restore_lasx); 69 kvm_restore_lasx_upper(struct kvm_vcpu *cpu)70void kvm_restore_lasx_upper(struct kvm_vcpu *cpu) 71 { 72 return _restore_lasx_upper(&cpu->arch.fpu); 73 } 74 EXPORT_SYMBOL_GPL(kvm_restore_lasx_upper); 75 #endif 76 77 #ifdef CONFIG_CPU_HAS_LBT kvm_restore_lbt(struct kvm_vcpu *cpu)78void kvm_restore_lbt(struct kvm_vcpu *cpu) 79 { 80 restore_lbt_registers(&cpu->arch.lbt); 81 } 82 EXPORT_SYMBOL_GPL(kvm_restore_lbt); 83 kvm_save_lbt(struct kvm_vcpu *cpu)84void kvm_save_lbt(struct kvm_vcpu *cpu) 85 { 86 save_lbt_registers(&cpu->arch.lbt); 87 } 88 EXPORT_SYMBOL_GPL(kvm_save_lbt); 89 #endif 90 91 92 EXPORT_SYMBOL_GPL(kvm_enter_guest); 93 EXPORT_SYMBOL_GPL(kvm_exception_entry); 94 95