[PATCH v2 08/36] KVM: arm64: Introduce kvm_call_hyp_nvhe_res()

Sascha Bischoff Sascha.Bischoff at arm.com
Thu Jan 8 01:48:39 PST 2026


On Wed, 2026-01-07 at 10:30 +0000, Jonathan Cameron wrote:
> On Fri, 19 Dec 2025 15:52:38 +0000
> Sascha Bischoff <Sascha.Bischoff at arm.com> wrote:
> 
> > There are times when it is desirable to have more than one return
> > value for a hyp call. Split out kvm_call_hyp_nvhe_res from
> > kvm_call_hyp_nvhe such that it is possible to directly provide
> > struct
> > arm_smccc_res from the calling code. Thereby, additional return
> > values
> > can be stored in res.a2, etc.
> > 
> > Suggested-by: Marc Zyngier <maz at kernel.org>
> > Signed-off-by: Sascha Bischoff <sascha.bischoff at arm.com>
> One question inline, mostly because I'm curious rather than a
> suggestion
> to change anything
> 
> Reviewed-by: Jonathan Cameron <jonathan.cameron at huawei.com>
> 
> > ---
> >  arch/arm64/include/asm/kvm_host.h | 15 ++++++++++-----
> >  1 file changed, 10 insertions(+), 5 deletions(-)
> > 
> > diff --git a/arch/arm64/include/asm/kvm_host.h
> > b/arch/arm64/include/asm/kvm_host.h
> > index b552a1e03848c..971b153b0a3fa 100644
> > --- a/arch/arm64/include/asm/kvm_host.h
> > +++ b/arch/arm64/include/asm/kvm_host.h
> > @@ -1208,14 +1208,19 @@ void kvm_arm_resume_guest(struct kvm *kvm);
> >  #define vcpu_has_run_once(vcpu)	(!!READ_ONCE((vcpu)->pid))
> >  
> >  #ifndef __KVM_NVHE_HYPERVISOR__
> > -#define kvm_call_hyp_nvhe(f,
> > ...)						\
> > +#define kvm_call_hyp_nvhe_res(res, f,
> > ...)				\
> >  	({							
> > 	\
> > -		struct arm_smccc_res
> > res;				\
> > -
> > 									\
> > +		struct arm_smccc_res *__res =
> > res;			\
> 
> What's the purpose of the local variable? Type sanity check?
> Feels like typecheck() would make the intent clearer.
> Meh. Not used anywhere in arch/arm64 so maybe not.

Far less exciting, I'm afraid.

It is because of the text substitution that happens. The res here is
replaced with &res from kvm_call_hyp_nvhe() and we end up with &res-
>a0. Given that -> binds more tightly than &, we end up with the wrong
thing, and the compiler barfs.

An alternative would be to do:

	WARN_ON((res)->a0 != SMCCC_RET_SUCCESS);

This removes the need for the local variable. I've got no preference
for which version we go with.

Sascha

> 
> 
> 
> >  		arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(f),	
> > 	\
> > -				  ##__VA_ARGS__,
> > &res);			\
> > -		WARN_ON(res.a0 !=
> > SMCCC_RET_SUCCESS);			\
> > +				  ##__VA_ARGS__,
> > __res);		\
> > +		WARN_ON(__res->a0 !=
> > SMCCC_RET_SUCCESS);		\
> > +	})
> > +
> > +#define kvm_call_hyp_nvhe(f,
> > ...)					\
> > +	({							
> > 	\
> > +		struct arm_smccc_res
> > res;				\
> >  								
> > 	\
> > +		kvm_call_hyp_nvhe_res(&res, f,
> > ##__VA_ARGS__);		\
> >  		res.a1;					
> > 		\
> >  	})
> >  
> 



More information about the linux-arm-kernel mailing list