From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: keithp@keithp.com, laurent@vivier.eu
Subject: [PATCH v2 1/2] target/m68k: Perform the semihosting test during translate
Date: Tue, 3 Oct 2023 15:36:23 -0700 [thread overview]
Message-ID: <20231003223624.1753000-2-richard.henderson@linaro.org> (raw)
In-Reply-To: <20231003223624.1753000-1-richard.henderson@linaro.org>
Replace EXCP_HALT_INSN by EXCP_SEMIHOSTING. Perform the pre-
and post-insn tests during translate, leaving only the actual
semihosting operation for the exception.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/m68k/cpu.h | 2 +-
target/m68k/op_helper.c | 14 ++-----------
target/m68k/translate.c | 45 +++++++++++++++++++++++++++++++++++++----
3 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
index 10697120f6..4549c28452 100644
--- a/target/m68k/cpu.h
+++ b/target/m68k/cpu.h
@@ -66,7 +66,7 @@
#define EXCP_MMU_ACCESS 58 /* MMU Access Level Violation Error */
#define EXCP_RTE 0x100
-#define EXCP_HALT_INSN 0x101
+#define EXCP_SEMIHOSTING 0x101
#define M68K_DTTR0 0
#define M68K_DTTR1 1
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index 1ce850bbc5..38eb85b8e7 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -202,18 +202,8 @@ static void cf_interrupt_all(CPUM68KState *env, int is_hw)
/* Return from an exception. */
cf_rte(env);
return;
- case EXCP_HALT_INSN:
- if (semihosting_enabled((env->sr & SR_S) == 0)
- && (env->pc & 3) == 0
- && cpu_lduw_code(env, env->pc - 4) == 0x4e71
- && cpu_ldl_code(env, env->pc) == 0x4e7bf000) {
- env->pc += 4;
- do_m68k_semihosting(env, env->dregs[0]);
- return;
- }
- cs->halted = 1;
- cs->exception_index = EXCP_HLT;
- cpu_loop_exit(cs);
+ case EXCP_SEMIHOSTING:
+ do_m68k_semihosting(env, env->dregs[0]);
return;
}
}
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
index ea7af25d50..e07b0b659d 100644
--- a/target/m68k/translate.c
+++ b/target/m68k/translate.c
@@ -26,12 +26,11 @@
#include "qemu/log.h"
#include "qemu/qemu-print.h"
#include "exec/translator.h"
-
#include "exec/helper-proto.h"
#include "exec/helper-gen.h"
-
#include "exec/log.h"
#include "fpu/softfloat.h"
+#include "semihosting/semihost.h"
#define HELPER_H "helper.h"
#include "exec/helper-info.c.inc"
@@ -1418,6 +1417,40 @@ static void gen_jmp_tb(DisasContext *s, int n, target_ulong dest,
s->base.is_jmp = DISAS_NORETURN;
}
+#ifndef CONFIG_USER_ONLY
+static bool semihosting_test(DisasContext *s)
+{
+ uint32_t test;
+
+ if (!semihosting_enabled(IS_USER(s))) {
+ return false;
+ }
+
+ /*
+ * "The semihosting instruction is immediately preceded by a
+ * nop aligned to a 4-byte boundary..."
+ * The preceding 2-byte (aligned) nop plus the 2-byte halt/bkpt
+ * means that we have advanced 4 bytes from the required nop.
+ */
+ if (s->pc % 4 != 0) {
+ return false;
+ }
+ test = cpu_lduw_code(s->env, s->pc - 4);
+ if (test != 0x4e71) {
+ return false;
+ }
+ /* "... and followed by an invalid sentinel instruction movec %sp,0." */
+ test = translator_ldl(s->env, &s->base, s->pc);
+ if (test != 0x4e7bf000) {
+ return false;
+ }
+
+ /* Consume the sentinel. */
+ s->pc += 4;
+ return true;
+}
+#endif /* !CONFIG_USER_ONLY */
+
DISAS_INSN(scc)
{
DisasCompare c;
@@ -4482,8 +4515,12 @@ DISAS_INSN(halt)
gen_exception(s, s->base.pc_next, EXCP_PRIVILEGE);
return;
}
-
- gen_exception(s, s->pc, EXCP_HALT_INSN);
+ if (semihosting_test(s)) {
+ gen_exception(s, s->pc, EXCP_SEMIHOSTING);
+ return;
+ }
+ tcg_gen_movi_i32(cpu_halted, 1);
+ gen_exception(s, s->pc, EXCP_HLT);
}
DISAS_INSN(stop)
--
2.34.1
next prev parent reply other threads:[~2023-10-03 22:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-03 22:36 [PATCH v2 0/2] target/m68k: Support semihosting on non-ColdFire targets Richard Henderson
2023-10-03 22:36 ` Richard Henderson [this message]
2023-10-03 22:36 ` [PATCH v2 2/2] " Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231003223624.1753000-2-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=keithp@keithp.com \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).