1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Copyright (c) 2023 MediaTek Inc.
- */
- #include <linux/arm-smccc.h>
- #include <linux/err.h>
- #include <linux/uaccess.h>
- #include <linux/gzvm.h>
- #include <linux/gzvm_drv.h>
- #include "gzvm_arch_common.h"
- int gzvm_arch_vcpu_update_one_reg(struct gzvm_vcpu *vcpu, __u64 reg_id,
- bool is_write, __u64 *data)
- {
- struct arm_smccc_res res;
- unsigned long a1;
- int ret;
- a1 = assemble_vm_vcpu_tuple(vcpu->gzvm->vm_id, vcpu->vcpuid);
- if (!is_write) {
- ret = gzvm_hypcall_wrapper(MT_HVC_GZVM_GET_ONE_REG,
- a1, reg_id, 0, 0, 0, 0, 0, &res);
- if (ret == 0)
- *data = res.a1;
- } else {
- ret = gzvm_hypcall_wrapper(MT_HVC_GZVM_SET_ONE_REG,
- a1, reg_id, *data, 0, 0, 0, 0, &res);
- }
- return ret;
- }
- int gzvm_arch_vcpu_run(struct gzvm_vcpu *vcpu, __u64 *exit_reason)
- {
- struct arm_smccc_res res;
- unsigned long a1;
- int ret;
- a1 = assemble_vm_vcpu_tuple(vcpu->gzvm->vm_id, vcpu->vcpuid);
- ret = gzvm_hypcall_wrapper(MT_HVC_GZVM_RUN, a1, 0, 0, 0, 0, 0,
- 0, &res);
- *exit_reason = res.a1;
- return ret;
- }
- int gzvm_arch_destroy_vcpu(u16 vm_id, int vcpuid)
- {
- struct arm_smccc_res res;
- unsigned long a1;
- a1 = assemble_vm_vcpu_tuple(vm_id, vcpuid);
- gzvm_hypcall_wrapper(MT_HVC_GZVM_DESTROY_VCPU, a1, 0, 0, 0, 0, 0, 0,
- &res);
- return 0;
- }
- /**
- * gzvm_arch_create_vcpu() - Call smc to gz hypervisor to create vcpu
- * @vm_id: vm id
- * @vcpuid: vcpu id
- * @run: Virtual address of vcpu->run
- *
- * Return: The wrapper helps caller to convert geniezone errno to Linux errno.
- */
- int gzvm_arch_create_vcpu(u16 vm_id, int vcpuid, void *run)
- {
- struct arm_smccc_res res;
- unsigned long a1, a2;
- int ret;
- a1 = assemble_vm_vcpu_tuple(vm_id, vcpuid);
- a2 = (__u64)virt_to_phys(run);
- ret = gzvm_hypcall_wrapper(MT_HVC_GZVM_CREATE_VCPU, a1, a2, 0, 0, 0, 0,
- 0, &res);
- return ret;
- }
|