For now, we keep the global common_* symbols defined.
Reviewed-by: Brian Cain <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Link:
https://lore.kernel.org/qemu-devel/[email protected]
Signed-off-by: Pierrick Bouvier <[email protected]>
---
target/hexagon/common-semi-target.c | 65 ++++++++++++++++++++++++-----
target/hexagon/cpu.c | 2 +
target/hexagon/internal.h | 2 +
3 files changed, 59 insertions(+), 10 deletions(-)
diff --git a/target/hexagon/common-semi-target.c
b/target/hexagon/common-semi-target.c
index 210d33e54e2..da92ff298a2 100644
--- a/target/hexagon/common-semi-target.c
+++ b/target/hexagon/common-semi-target.c
@@ -8,44 +8,89 @@
#include "qemu/osdep.h"
#include "cpu.h"
-#include "cpu_helper.h"
#include "semihosting/common-semi.h"
+#include "internal.h"
-uint64_t common_semi_arg(CPUState *cs, int argno)
+static uint64_t hexagon_semi_arg(const CPUState *cs, int argno)
{
- CPUHexagonState *env = cpu_env(cs);
+ const CPUHexagonState *env = cpu_env(cs);
return env->gpr[HEX_REG_R00 + argno];
}
-void common_semi_set_ret(CPUState *cs, uint64_t ret)
+static void hexagon_semi_set_ret(CPUState *cs, uint64_t ret)
{
CPUHexagonState *env = cpu_env(cs);
env->gpr[HEX_REG_R00] = ret;
}
-void common_semi_set_err(CPUState *cs, int err)
+static void hexagon_semi_set_err(CPUState *cs, int err)
{
CPUHexagonState *env = cpu_env(cs);
env->gpr[HEX_REG_R01] = err;
}
-bool common_semi_sys_exit_is_extended(CPUState *cs)
+static bool hexagon_semi_is_64bit(const CPUState *cs)
{
return false;
}
+static bool hexagon_semi_sys_exit_is_extended(const CPUState *cs)
+{
+ return false;
+}
+
+static uint64_t hexagon_semi_stack_bottom(const CPUState *cs)
+{
+ const CPUHexagonState *env = cpu_env(cs);
+ return env->gpr[HEX_REG_SP];
+}
+
+static bool hexagon_semi_has_synccache(const CPUState *cs)
+{
+ return false;
+}
+
+const SemihostingCPUOps hexagon_semihosting_ops = {
+ .arg = hexagon_semi_arg,
+ .set_ret = hexagon_semi_set_ret,
+ .set_err = hexagon_semi_set_err,
+ .is_64bit = hexagon_semi_is_64bit,
+ .sys_exit_is_extended = hexagon_semi_sys_exit_is_extended,
+ .stack_bottom = hexagon_semi_stack_bottom,
+ .has_synccache = hexagon_semi_has_synccache,
+};
+
+uint64_t common_semi_arg(CPUState *cs, int argno)
+{
+ return hexagon_semi_arg(cs, argno);
+}
+
+void common_semi_set_ret(CPUState *cs, uint64_t ret)
+{
+ hexagon_semi_set_ret(cs, ret);
+}
+
+void common_semi_set_err(CPUState *cs, int err)
+{
+ hexagon_semi_set_err(cs, err);
+}
+
bool is_64bit_semihosting(CPUArchState *env)
{
- return false;
+ return hexagon_semi_is_64bit(env_cpu(env));
+}
+
+bool common_semi_sys_exit_is_extended(CPUState *cs)
+{
+ return hexagon_semi_sys_exit_is_extended(cs);
}
uint64_t common_semi_stack_bottom(CPUState *cs)
{
- CPUHexagonState *env = cpu_env(cs);
- return env->gpr[HEX_REG_SP];
+ return hexagon_semi_stack_bottom(cs);
}
bool common_semi_has_synccache(CPUArchState *env)
{
- return false;
+ return hexagon_semi_has_synccache(env_cpu(env));
}
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index 6550e7fa800..8bbd4647968 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -851,6 +851,8 @@ static void hexagon_cpu_class_init(ObjectClass *c, const
void *data)
#ifndef CONFIG_USER_ONLY
cc->sysemu_ops = &hexagon_sysemu_ops;
dc->vmsd = &vmstate_hexagon_cpu;
+ /* semihosting is only supported in system mode for Hexagon */
+ cc->semi_ops = &hexagon_semihosting_ops;
#endif
#ifdef CONFIG_TCG
cc->tcg_ops = &hexagon_tcg_ops;
diff --git a/target/hexagon/internal.h b/target/hexagon/internal.h
index 3ed83904eb7..073de10284e 100644
--- a/target/hexagon/internal.h
+++ b/target/hexagon/internal.h
@@ -34,6 +34,8 @@ void hexagon_debug_qreg(CPUHexagonState *env, int regnum);
void hexagon_debug(CPUHexagonState *env);
void hexagon_dump(CPUHexagonState *env, FILE *f, int flags);
+extern const struct SemihostingCPUOps hexagon_semihosting_ops;
+
extern const char * const hexagon_regnames[TOTAL_PER_THREAD_REGS];
#ifndef CONFIG_USER_ONLY
extern const char * const hexagon_sregnames[];
--
2.43.0