Commit 87b26801 authored by Andrew Scull's avatar Andrew Scull Committed by Marc Zyngier
Browse files

KVM: arm64: Simplify __kvm_hyp_init HVC detection



The arguments for __do_hyp_init are now passed with a pointer to a
struct which means there are scratch registers available for use. Thanks
to this, we no longer need to use clever, but hard to read, tricks that
avoid the need for scratch registers when checking for the
__kvm_hyp_init HVC.

Tested-by: default avatarDavid Brazdil <dbrazdil@google.com>
Signed-off-by: default avatarAndrew Scull <ascull@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210125145415.122439-2-ascull@google.com
parent 19c329f6
Loading
Loading
Loading
Loading
+4 −11
Original line number Original line Diff line number Diff line
@@ -55,17 +55,10 @@ __do_hyp_init:
	cmp	x0, #HVC_STUB_HCALL_NR
	cmp	x0, #HVC_STUB_HCALL_NR
	b.lo	__kvm_handle_stub_hvc
	b.lo	__kvm_handle_stub_hvc


	// We only actively check bits [24:31], and everything
	mov	x3, #KVM_HOST_SMCCC_FUNC(__kvm_hyp_init)
	// else has to be zero, which we check at build time.
	cmp	x0, x3
#if (KVM_HOST_SMCCC_FUNC(__kvm_hyp_init) & 0xFFFFFFFF00FFFFFF)
	b.eq	1f
#error Unexpected __KVM_HOST_SMCCC_FUNC___kvm_hyp_init value

#endif

	ror	x0, x0, #24
	eor	x0, x0, #((KVM_HOST_SMCCC_FUNC(__kvm_hyp_init) >> 24) & 0xF)
	ror	x0, x0, #4
	eor	x0, x0, #((KVM_HOST_SMCCC_FUNC(__kvm_hyp_init) >> 28) & 0xF)
	cbz	x0, 1f
	mov	x0, #SMCCC_RET_NOT_SUPPORTED
	mov	x0, #SMCCC_RET_NOT_SUPPORTED
	eret
	eret