diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2022-09-11 11:23:55 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2024-05-07 08:52:12 +0200 |
commit | 445457693cbb5bf50765d5d29ca35dd357f8dbaa (patch) | |
tree | b97c09636b49b63b9bdc6157f0dc59f37e4a448c /target | |
parent | 8b5de7ea562ff142b324d996bad4118248b7274f (diff) |
target/i386: reintroduce debugging mechanism
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'target')
-rw-r--r-- | target/i386/tcg/decode-new.c.inc | 3 | ||||
-rw-r--r-- | target/i386/tcg/translate.c | 27 |
2 files changed, 30 insertions, 0 deletions
diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.c.inc index 426c459412..3fc6485d74 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -1689,6 +1689,9 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b) X86DecodeFunc decode_func = decode_root; uint8_t cc_live; +#ifdef CONFIG_USER_ONLY + if (limit) { --limit; } +#endif s->has_modrm = false; next_byte: diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index f018d6303a..6a0c74c225 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -2969,6 +2969,9 @@ static void gen_sty_env_A0(DisasContext *s, int offset, bool align) tcg_gen_qemu_st_i128(t, s->tmp0, mem_index, mop); } +static bool first = true; +static unsigned long limit; + #include "decode-new.h" #include "emit.c.inc" #include "decode-new.c.inc" @@ -3124,15 +3127,39 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) prefixes = 0; + if (first) { + const char *limit_str = getenv("QEMU_I386_LIMIT"); + limit = limit_str ? atol(limit_str) : -1; + first = false; + } + bool use_new = true; +#ifdef CONFIG_USER_ONLY + use_new &= limit > 0; +#endif + next_byte: s->prefix = prefixes; b = x86_ldub_code(env, s); /* Collect prefixes. */ switch (b) { default: +#ifndef CONFIG_USER_ONLY + use_new &= b <= limit; +#endif + if (use_new && 0) { + disas_insn_new(s, cpu, b); + return true; + } break; case 0x0f: b = x86_ldub_code(env, s) + 0x100; +#ifndef CONFIG_USER_ONLY + use_new &= b <= limit; +#endif + if (use_new && 0) { + disas_insn_new(s, cpu, b); + return true; + } break; case 0xf3: prefixes |= PREFIX_REPZ; |