Commit 8f57adac authored by Anup Patel's avatar Anup Patel Committed by Anup Patel
Browse files

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: default avatarAnup Patel <apatel@ventanamicro.com>
Reviewed-by: default avatarAtish Patra <atishp@rivosinc.com>
Link: https://lore.kernel.org/r/20241020194734.58686-5-apatel@ventanamicro.com


Signed-off-by: default avatarAnup Patel <anup@brainfault.org>
parent b922307a
Loading
Loading
Loading
Loading
+40 −12
Original line number Diff line number Diff line
@@ -11,11 +11,7 @@
#include <asm/asm-offsets.h>
#include <asm/csr.h>

	.text
	.altmacro
	.option norelax

SYM_FUNC_START(__kvm_riscv_switch_to)
.macro SAVE_HOST_GPRS
	/* Save Host GPRs (except A0 and T0-T6) */
	REG_S	ra, (KVM_ARCH_HOST_RA)(a0)
	REG_S	sp, (KVM_ARCH_HOST_SP)(a0)
@@ -40,10 +36,12 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
	REG_S	s9, (KVM_ARCH_HOST_S9)(a0)
	REG_S	s10, (KVM_ARCH_HOST_S10)(a0)
	REG_S	s11, (KVM_ARCH_HOST_S11)(a0)
.endm

.macro SAVE_HOST_AND_RESTORE_GUEST_CSRS __resume_addr
	/* Load Guest CSR values */
	REG_L	t0, (KVM_ARCH_GUEST_SSTATUS)(a0)
	la	t1, .Lkvm_switch_return
	la	t1, \__resume_addr
	REG_L	t2, (KVM_ARCH_GUEST_SEPC)(a0)

	/* Save Host and Restore Guest SSTATUS */
@@ -62,7 +60,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
	REG_S	t0, (KVM_ARCH_HOST_SSTATUS)(a0)
	REG_S	t1, (KVM_ARCH_HOST_STVEC)(a0)
	REG_S	t3, (KVM_ARCH_HOST_SSCRATCH)(a0)
.endm

.macro RESTORE_GUEST_GPRS
	/* Restore Guest GPRs (except A0) */
	REG_L	ra, (KVM_ARCH_GUEST_RA)(a0)
	REG_L	sp, (KVM_ARCH_GUEST_SP)(a0)
@@ -97,13 +97,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)

	/* Restore Guest A0 */
	REG_L	a0, (KVM_ARCH_GUEST_A0)(a0)
.endm

	/* Resume Guest */
	sret

	/* Back to Host */
	.align 2
.Lkvm_switch_return:
.macro SAVE_GUEST_GPRS
	/* Swap Guest A0 with SSCRATCH */
	csrrw	a0, CSR_SSCRATCH, a0

@@ -138,7 +134,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
	REG_S	t4, (KVM_ARCH_GUEST_T4)(a0)
	REG_S	t5, (KVM_ARCH_GUEST_T5)(a0)
	REG_S	t6, (KVM_ARCH_GUEST_T6)(a0)
.endm

.macro SAVE_GUEST_AND_RESTORE_HOST_CSRS
	/* Load Host CSR values */
	REG_L	t0, (KVM_ARCH_HOST_STVEC)(a0)
	REG_L	t1, (KVM_ARCH_HOST_SSCRATCH)(a0)
@@ -160,7 +158,9 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
	REG_S	t1, (KVM_ARCH_GUEST_A0)(a0)
	REG_S	t2, (KVM_ARCH_GUEST_SSTATUS)(a0)
	REG_S	t3, (KVM_ARCH_GUEST_SEPC)(a0)
.endm

.macro RESTORE_HOST_GPRS
	/* Restore Host GPRs (except A0 and T0-T6) */
	REG_L	ra, (KVM_ARCH_HOST_RA)(a0)
	REG_L	sp, (KVM_ARCH_HOST_SP)(a0)
@@ -185,6 +185,34 @@ SYM_FUNC_START(__kvm_riscv_switch_to)
	REG_L	s9, (KVM_ARCH_HOST_S9)(a0)
	REG_L	s10, (KVM_ARCH_HOST_S10)(a0)
	REG_L	s11, (KVM_ARCH_HOST_S11)(a0)
.endm

	.text
	.altmacro
	.option norelax

	/*
	 * Parameters:
	 * A0 <= Pointer to struct kvm_vcpu_arch
	 */
SYM_FUNC_START(__kvm_riscv_switch_to)
	SAVE_HOST_GPRS

	SAVE_HOST_AND_RESTORE_GUEST_CSRS .Lkvm_switch_return

	RESTORE_GUEST_GPRS

	/* Resume Guest using SRET */
	sret

	/* Back to Host */
	.align 2
.Lkvm_switch_return:
	SAVE_GUEST_GPRS

	SAVE_GUEST_AND_RESTORE_HOST_CSRS

	RESTORE_HOST_GPRS

	/* Return to C code */
	ret