Skip to content

Commit 8f57ada

Browse files
committed
RISC-V: KVM: Break down the __kvm_riscv_switch_to() into macros
Break down the __kvm_riscv_switch_to() function into macros so that these macros can be later re-used by SBI NACL extension based low-level switch function. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com> Link: https://lore.kernel.org/r/20241020194734.58686-5-apatel@ventanamicro.com Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent b922307 commit 8f57ada

File tree

1 file changed

+40
-12
lines changed

1 file changed

+40
-12
lines changed

arch/riscv/kvm/vcpu_switch.S

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@
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

Comments
 (0)