xref: /kernel/linux/linux-5.10/arch/loongarch/kvm/fpu.c (revision 8c2ecf20)
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 */
13void __kvm_save_fpu(struct loongarch_fpu *fpu);
14void __kvm_restore_fpu(struct loongarch_fpu *fpu);
15
16void kvm_save_fpu(struct kvm_vcpu *cpu)
17{
18	return __kvm_save_fpu(&cpu->arch.fpu);
19}
20EXPORT_SYMBOL_GPL(kvm_save_fpu);
21
22void kvm_restore_fpu(struct kvm_vcpu *cpu)
23{
24	return __kvm_restore_fpu(&cpu->arch.fpu);
25}
26EXPORT_SYMBOL_GPL(kvm_restore_fpu);
27
28#ifdef CONFIG_CPU_HAS_LSX
29void __kvm_save_lsx(struct loongarch_fpu *fpu);
30void __kvm_restore_lsx(struct loongarch_fpu *fpu);
31void __kvm_restore_lsx_upper(struct loongarch_fpu *fpu);
32
33void kvm_save_lsx(struct kvm_vcpu *cpu)
34{
35	return __kvm_save_lsx(&cpu->arch.fpu);
36}
37EXPORT_SYMBOL_GPL(kvm_save_lsx);
38
39void kvm_restore_lsx(struct kvm_vcpu *cpu)
40{
41	return __kvm_restore_lsx(&cpu->arch.fpu);
42}
43EXPORT_SYMBOL_GPL(kvm_restore_lsx);
44
45void kvm_restore_lsx_upper(struct kvm_vcpu *cpu)
46{
47	return __kvm_restore_lsx_upper(&cpu->arch.fpu);
48}
49EXPORT_SYMBOL_GPL(kvm_restore_lsx_upper);
50
51#endif
52
53#ifdef CONFIG_CPU_HAS_LSX
54void __kvm_save_lasx(struct loongarch_fpu *fpu);
55void __kvm_restore_lasx(struct loongarch_fpu *fpu);
56void __kvm_restore_lasx_upper(struct loongarch_fpu *fpu);
57
58void kvm_save_lasx(struct kvm_vcpu *cpu)
59{
60	return __kvm_save_lasx(&cpu->arch.fpu);
61}
62EXPORT_SYMBOL_GPL(kvm_save_lasx);
63
64void kvm_restore_lasx(struct kvm_vcpu *cpu)
65{
66	return __kvm_restore_lasx(&cpu->arch.fpu);
67}
68EXPORT_SYMBOL_GPL(kvm_restore_lasx);
69
70void kvm_restore_lasx_upper(struct kvm_vcpu *cpu)
71{
72	return _restore_lasx_upper(&cpu->arch.fpu);
73}
74EXPORT_SYMBOL_GPL(kvm_restore_lasx_upper);
75#endif
76
77#ifdef CONFIG_CPU_HAS_LBT
78void kvm_restore_lbt(struct kvm_vcpu *cpu)
79{
80	restore_lbt_registers(&cpu->arch.lbt);
81}
82EXPORT_SYMBOL_GPL(kvm_restore_lbt);
83
84void kvm_save_lbt(struct kvm_vcpu *cpu)
85{
86	save_lbt_registers(&cpu->arch.lbt);
87}
88EXPORT_SYMBOL_GPL(kvm_save_lbt);
89#endif
90
91
92EXPORT_SYMBOL_GPL(kvm_enter_guest);
93EXPORT_SYMBOL_GPL(kvm_exception_entry);
94
95