11
11
#include <asm/asm-offsets.h>
12
12
#include <asm/csr.h>
13
13
14
- .text
15
- .altmacro
16
- .option norelax
17
-
18
- SYM_FUNC_START (__kvm_riscv_switch_to)
14
+ .macro SAVE_HOST_GPRS
19
15
/* Save Host GPRs (except A0 and T0-T6) */
20
16
REG_S ra, (KVM_ARCH_HOST_RA)(a0 )
21
17
REG_S sp , (KVM_ARCH_HOST_SP)(a0 )
@@ -40,10 +36,12 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
40
36
REG_S s9, (KVM_ARCH_HOST_S9)(a0 )
41
37
REG_S s10, (KVM_ARCH_HOST_S10)(a0 )
42
38
REG_S s11, (KVM_ARCH_HOST_S11)(a0 )
39
+ .endm
43
40
41
+ .macro SAVE_HOST_AND_RESTORE_GUEST_CSRS __resume_addr
44
42
/* Load Guest CSR values */
45
43
REG_L t0, (KVM_ARCH_GUEST_SSTATUS)(a0 )
46
- la t1, .Lkvm_switch_return
44
+ la t1, \__resume_addr
47
45
REG_L t2, (KVM_ARCH_GUEST_SEPC)(a0 )
48
46
49
47
/* Save Host and Restore Guest SSTATUS */
@@ -62,7 +60,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
62
60
REG_S t0, (KVM_ARCH_HOST_SSTATUS)(a0 )
63
61
REG_S t1, (KVM_ARCH_HOST_STVEC)(a0 )
64
62
REG_S t3, (KVM_ARCH_HOST_SSCRATCH)(a0 )
63
+ .endm
65
64
65
+ .macro RESTORE_GUEST_GPRS
66
66
/* Restore Guest GPRs (except A0) */
67
67
REG_L ra, (KVM_ARCH_GUEST_RA)(a0 )
68
68
REG_L sp , (KVM_ARCH_GUEST_SP)(a0 )
@@ -97,13 +97,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
97
97
98
98
/* Restore Guest A0 */
99
99
REG_L a0 , (KVM_ARCH_GUEST_A0)(a0 )
100
+ .endm
100
101
101
- /* Resume Guest */
102
- sret
103
-
104
- /* Back to Host */
105
- .align 2
106
- .Lkvm_switch_return:
102
+ .macro SAVE_GUEST_GPRS
107
103
/* Swap Guest A0 with SSCRATCH */
108
104
csrrw a0 , CSR_SSCRATCH, a0
109
105
@@ -138,7 +134,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
138
134
REG_S t4, (KVM_ARCH_GUEST_T4)(a0 )
139
135
REG_S t5, (KVM_ARCH_GUEST_T5)(a0 )
140
136
REG_S t6, (KVM_ARCH_GUEST_T6)(a0 )
137
+ .endm
141
138
139
+ .macro SAVE_GUEST_AND_RESTORE_HOST_CSRS
142
140
/* Load Host CSR values */
143
141
REG_L t0, (KVM_ARCH_HOST_STVEC)(a0 )
144
142
REG_L t1, (KVM_ARCH_HOST_SSCRATCH)(a0 )
@@ -160,7 +158,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
160
158
REG_S t1, (KVM_ARCH_GUEST_A0)(a0 )
161
159
REG_S t2, (KVM_ARCH_GUEST_SSTATUS)(a0 )
162
160
REG_S t3, (KVM_ARCH_GUEST_SEPC)(a0 )
161
+ .endm
163
162
163
+ .macro RESTORE_HOST_GPRS
164
164
/* Restore Host GPRs (except A0 and T0-T6) */
165
165
REG_L ra, (KVM_ARCH_HOST_RA)(a0 )
166
166
REG_L sp , (KVM_ARCH_HOST_SP)(a0 )
@@ -185,6 +185,34 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
185
185
REG_L s9, (KVM_ARCH_HOST_S9)(a0 )
186
186
REG_L s10, (KVM_ARCH_HOST_S10)(a0 )
187
187
REG_L s11, (KVM_ARCH_HOST_S11)(a0 )
188
+ .endm
189
+
190
+ .text
191
+ .altmacro
192
+ .option norelax
193
+
194
+ /*
195
+ * Parameters:
196
+ * A0 <= Pointer to struct kvm_vcpu_arch
197
+ */
198
+ SYM_FUNC_START (__kvm_riscv_switch_to)
199
+ SAVE_HOST_GPRS
200
+
201
+ SAVE_HOST_AND_RESTORE_GUEST_CSRS .Lkvm_switch_return
202
+
203
+ RESTORE_GUEST_GPRS
204
+
205
+ /* Resume Guest using SRET */
206
+ sret
207
+
208
+ /* Back to Host */
209
+ .align 2
210
+ .Lkvm_switch_return:
211
+ SAVE_GUEST_GPRS
212
+
213
+ SAVE_GUEST_AND_RESTORE_HOST_CSRS
214
+
215
+ RESTORE_HOST_GPRS
188
216
189
217
/* Return to C code */
190
218
ret
0 commit comments