1111#include <asm/asm-offsets.h>
1212#include <asm/csr.h>
1313
14- .text
15- .altmacro
16- .option norelax
17-
18- SYM_FUNC_START (__kvm_riscv_switch_to)
14+ .macro SAVE_HOST_GPRS
1915 /* Save Host GPRs (except A0 and T0-T6) */
2016 REG_S ra, (KVM_ARCH_HOST_RA)(a0 )
2117 REG_S sp , (KVM_ARCH_HOST_SP)(a0 )
@@ -40,10 +36,12 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
4036 REG_S s9, (KVM_ARCH_HOST_S9)(a0 )
4137 REG_S s10, (KVM_ARCH_HOST_S10)(a0 )
4238 REG_S s11, (KVM_ARCH_HOST_S11)(a0 )
39+ .endm
4340
41+ .macro SAVE_HOST_AND_RESTORE_GUEST_CSRS __resume_addr
4442 /* Load Guest CSR values */
4543 REG_L t0, (KVM_ARCH_GUEST_SSTATUS)(a0 )
46- la t1, .Lkvm_switch_return
44+ la t1, \__resume_addr
4745 REG_L t2, (KVM_ARCH_GUEST_SEPC)(a0 )
4846
4947 /* Save Host and Restore Guest SSTATUS */
@@ -62,7 +60,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
6260 REG_S t0, (KVM_ARCH_HOST_SSTATUS)(a0 )
6361 REG_S t1, (KVM_ARCH_HOST_STVEC)(a0 )
6462 REG_S t3, (KVM_ARCH_HOST_SSCRATCH)(a0 )
63+ .endm
6564
65+ .macro RESTORE_GUEST_GPRS
6666 /* Restore Guest GPRs (except A0) */
6767 REG_L ra, (KVM_ARCH_GUEST_RA)(a0 )
6868 REG_L sp , (KVM_ARCH_GUEST_SP)(a0 )
@@ -97,13 +97,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
9797
9898 /* Restore Guest A0 */
9999 REG_L a0 , (KVM_ARCH_GUEST_A0)(a0 )
100+ .endm
100101
101- /* Resume Guest */
102- sret
103-
104- /* Back to Host */
105- .align 2
106- .Lkvm_switch_return:
102+ .macro SAVE_GUEST_GPRS
107103 /* Swap Guest A0 with SSCRATCH */
108104 csrrw a0 , CSR_SSCRATCH, a0
109105
@@ -138,7 +134,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
138134 REG_S t4, (KVM_ARCH_GUEST_T4)(a0 )
139135 REG_S t5, (KVM_ARCH_GUEST_T5)(a0 )
140136 REG_S t6, (KVM_ARCH_GUEST_T6)(a0 )
137+ .endm
141138
139+ .macro SAVE_GUEST_AND_RESTORE_HOST_CSRS
142140 /* Load Host CSR values */
143141 REG_L t0, (KVM_ARCH_HOST_STVEC)(a0 )
144142 REG_L t1, (KVM_ARCH_HOST_SSCRATCH)(a0 )
@@ -160,7 +158,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
160158 REG_S t1, (KVM_ARCH_GUEST_A0)(a0 )
161159 REG_S t2, (KVM_ARCH_GUEST_SSTATUS)(a0 )
162160 REG_S t3, (KVM_ARCH_GUEST_SEPC)(a0 )
161+ .endm
163162
163+ .macro RESTORE_HOST_GPRS
164164 /* Restore Host GPRs (except A0 and T0-T6) */
165165 REG_L ra, (KVM_ARCH_HOST_RA)(a0 )
166166 REG_L sp , (KVM_ARCH_HOST_SP)(a0 )
@@ -185,6 +185,34 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
185185 REG_L s9, (KVM_ARCH_HOST_S9)(a0 )
186186 REG_L s10, (KVM_ARCH_HOST_S10)(a0 )
187187 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
188216
189217 /* Return to C code */
190218 ret
0 commit comments