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)16 void 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)22 void 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)33 void 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)39 void 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)45 void 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)58 void 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)64 void 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)70 void 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)78 void 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)84 void 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