162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) 2019 Arm Ltd. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __KVM_ARM_HYPERCALLS_H
562306a36Sopenharmony_ci#define __KVM_ARM_HYPERCALLS_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <asm/kvm_emulate.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciint kvm_smccc_call_handler(struct kvm_vcpu *vcpu);
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic inline u32 smccc_get_function(struct kvm_vcpu *vcpu)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	return vcpu_get_reg(vcpu, 0);
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic inline unsigned long smccc_get_arg1(struct kvm_vcpu *vcpu)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	return vcpu_get_reg(vcpu, 1);
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline unsigned long smccc_get_arg2(struct kvm_vcpu *vcpu)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	return vcpu_get_reg(vcpu, 2);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline unsigned long smccc_get_arg3(struct kvm_vcpu *vcpu)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	return vcpu_get_reg(vcpu, 3);
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic inline void smccc_set_retval(struct kvm_vcpu *vcpu,
3262306a36Sopenharmony_ci				    unsigned long a0,
3362306a36Sopenharmony_ci				    unsigned long a1,
3462306a36Sopenharmony_ci				    unsigned long a2,
3562306a36Sopenharmony_ci				    unsigned long a3)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	vcpu_set_reg(vcpu, 0, a0);
3862306a36Sopenharmony_ci	vcpu_set_reg(vcpu, 1, a1);
3962306a36Sopenharmony_ci	vcpu_set_reg(vcpu, 2, a2);
4062306a36Sopenharmony_ci	vcpu_set_reg(vcpu, 3, a3);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct kvm_one_reg;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_civoid kvm_arm_init_hypercalls(struct kvm *kvm);
4662306a36Sopenharmony_civoid kvm_arm_teardown_hypercalls(struct kvm *kvm);
4762306a36Sopenharmony_ciint kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu);
4862306a36Sopenharmony_ciint kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices);
4962306a36Sopenharmony_ciint kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
5062306a36Sopenharmony_ciint kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciint kvm_vm_smccc_has_attr(struct kvm *kvm, struct kvm_device_attr *attr);
5362306a36Sopenharmony_ciint kvm_vm_smccc_set_attr(struct kvm *kvm, struct kvm_device_attr *attr);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#endif
56