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 Signed-off-by: Sascha Bischoff --- 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; \ 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; \ }) -- 2.34.1