From 8a4890a9e5752ef94eb683c0fef3a3b8ba38a05a Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Tue, 15 Jul 2025 10:17:54 +0800 Subject: [PATCH] [ARCH/AARCH64] Update Hypercall API Signed-off-by: GuEe-GUI <2991707448@qq.com> --- libcpu/aarch64/common/hypercall.c | 30 ++++++++++++++++++++--- libcpu/aarch64/common/include/hypercall.h | 22 ++++++++++++----- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/libcpu/aarch64/common/hypercall.c b/libcpu/aarch64/common/hypercall.c index 73b64d5aae..74bd9a00be 100644 --- a/libcpu/aarch64/common/hypercall.c +++ b/libcpu/aarch64/common/hypercall.c @@ -1,16 +1,40 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-02-24 GuEe-GUI first version + * 2023-02-21 GuEe-GUI update API */ #include -rt_err_t rt_hv_stage2_map(unsigned long paddr, unsigned long size) +rt_err_t rt_hv_version(rt_uint32_t *out_version) { - return rt_hw_hypercall(120, paddr & (~4095), (paddr & (~4095)) + size, (1 << 0) | (1 << 1) | (1 << 4), 0, 0, 0, 0); + if (out_version) + { + *out_version = rt_hw_hypercall(HYPERCALL_START + 0, 0, 0, 0, 0, 0, 0, 0); + + if ((int)*out_version < 0) + { + return *out_version; + } + } + + return -RT_EINVAL; +} + +rt_err_t rt_hv_debug(rt_uint32_t id, rt_uint32_t argc, + rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2, + rt_ubase_t arg3, rt_ubase_t arg4) +{ + return rt_hw_hypercall(HYPERCALL_START + 1, id, + arg0, arg1, arg2, arg3, arg4, argc); +} + +rt_err_t rt_hv_console(char c) +{ + return rt_hw_hypercall(HYPERCALL_START + 2, c, 0, 0, 0, 0, 0, 0); } diff --git a/libcpu/aarch64/common/include/hypercall.h b/libcpu/aarch64/common/include/hypercall.h index e9599d7f78..1c69294a87 100644 --- a/libcpu/aarch64/common/include/hypercall.h +++ b/libcpu/aarch64/common/include/hypercall.h @@ -1,27 +1,37 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-02-24 GuEe-GUI first version + * 2023-02-21 GuEe-GUI update API */ #ifndef __HYPERCALL_H__ #define __HYPERCALL_H__ #include +#include + +#define HYPERCALL_START 0xc5000000 /* HVC64 */ +#define HYPERCALL_END 0xc500ffff /* HVC64 */ rt_inline rt_uint32_t rt_hw_hypercall(rt_uint32_t w0, rt_uint64_t x1, rt_uint64_t x2, rt_uint64_t x3, rt_uint64_t x4, rt_uint64_t x5, rt_uint64_t x6, rt_uint32_t w7) { - register rt_uint64_t ret __asm__ ("x0"); - __asm__ volatile ("hvc #0"); + struct arm_smccc_res_t res; - return (rt_uint32_t)ret; + arm_smccc_hvc(w0, x1, x2, x3, x4, x5, x6, w7, &res, RT_NULL); + + return res.a0; } -rt_err_t rt_hv_stage2_map(unsigned long paddr, unsigned long size); +rt_err_t rt_hv_version(rt_uint32_t *out_version); +rt_err_t rt_hv_debug(rt_uint32_t id, rt_uint32_t argc, + rt_ubase_t arg0, rt_ubase_t arg1, rt_ubase_t arg2, + rt_ubase_t arg3, rt_ubase_t arg4); +rt_err_t rt_hv_console(char c); -#endif +#endif /* __HYPERCALL_H__ */