Commit 860a4c3d authored by David Brazdil's avatar David Brazdil Committed by Marc Zyngier
Browse files

KVM: arm64: Move skip_host_instruction to adjust_pc.h



Move function for skipping host instruction in the host trap handler to
a header file containing analogical helpers for guests.

Signed-off-by: default avatarDavid Brazdil <dbrazdil@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201208142452.87237-7-dbrazdil@google.com
parent e6829e03
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -59,4 +59,13 @@ static inline void __adjust_pc(struct kvm_vcpu *vcpu)
	}
}

/*
 * Skip an instruction while host sysregs are live.
 * Assumes host is always 64-bit.
 */
static inline void kvm_skip_host_instr(void)
{
	write_sysreg_el2(read_sysreg_el2(SYS_ELR) + 4, SYS_ELR);
}

#endif
+2 −10
Original line number Diff line number Diff line
@@ -157,11 +157,6 @@ static void default_host_smc_handler(struct kvm_cpu_context *host_ctxt)
	__kvm_hyp_host_forward_smc(host_ctxt);
}

static void skip_host_instruction(void)
{
	write_sysreg_el2(read_sysreg_el2(SYS_ELR) + 4, SYS_ELR);
}

static void handle_host_smc(struct kvm_cpu_context *host_ctxt)
{
	bool handled;
@@ -170,11 +165,8 @@ static void handle_host_smc(struct kvm_cpu_context *host_ctxt)
	if (!handled)
		default_host_smc_handler(host_ctxt);

	/*
	 * Unlike HVC, the return address of an SMC is the instruction's PC.
	 * Move the return address past the instruction.
	 */
	skip_host_instruction();
	/* SMC was trapped, move ELR past the current PC. */
	kvm_skip_host_instr();
}

void handle_trap(struct kvm_cpu_context *host_ctxt)