Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions libcpu/aarch64/common/hypercall.c
Original file line number Diff line number Diff line change
@@ -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);
}
22 changes: 16 additions & 6 deletions libcpu/aarch64/common/include/hypercall.h
Original file line number Diff line number Diff line change
@@ -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__ */