summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuEe-GUI <[email protected]>2025-07-15 10:17:54 +0800
committerRbb666 <[email protected]>2025-07-16 12:52:51 +0800
commit8a4890a9e5752ef94eb683c0fef3a3b8ba38a05a (patch)
tree44c613cf5aaaae570cb88429cbf0cffb44b82458
parent5e03e07c430554860ad355f84db08758d9a5cc40 (diff)
[ARCH/AARCH64] Update Hypercall API
Signed-off-by: GuEe-GUI <[email protected]>
-rw-r--r--libcpu/aarch64/common/hypercall.c30
-rw-r--r--libcpu/aarch64/common/include/hypercall.h22
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 <hypercall.h>
-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 <rtdef.h>
+#include <smccc.h>
+
+#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;
+
+ arm_smccc_hvc(w0, x1, x2, x3, x4, x5, x6, w7, &res, RT_NULL);
- return (rt_uint32_t)ret;
+ 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__ */