From: Yoshinori Sato <ysato@users.sourceforge.jp> To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, imammedo@redhat.com, Richard Henderson <richard.henderson@linaro.org>, Yoshinori Sato <ysato@users.sourceforge.jp>, philmd@redhat.com Subject: [Qemu-devel] [PATCH v23 12/22] target/rx: Collect all bytes during disassembly Date: Sat, 17 Aug 2019 16:36:18 +0900 Message-ID: <20190817073628.94473-13-ysato@users.sourceforge.jp> (raw) In-Reply-To: <20190817073628.94473-1-ysato@users.sourceforge.jp> From: Richard Henderson <richard.henderson@linaro.org> Collected, to be used in the next patch. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp> Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp> Message-Id: <20190607091116.49044-23-ysato@users.sourceforge.jp> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/rx/disas.c | 62 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/target/rx/disas.c b/target/rx/disas.c index ebc1a44249..5a32a87534 100644 --- a/target/rx/disas.c +++ b/target/rx/disas.c @@ -25,43 +25,59 @@ typedef struct DisasContext { disassemble_info *dis; uint32_t addr; uint32_t pc; + uint8_t len; + uint8_t bytes[8]; } DisasContext; static uint32_t decode_load_bytes(DisasContext *ctx, uint32_t insn, - int i, int n) + int i, int n) { - bfd_byte buf; + uint32_t addr = ctx->addr; + + g_assert(ctx->len == i); + g_assert(n <= ARRAY_SIZE(ctx->bytes)); + while (++i <= n) { - ctx->dis->read_memory_func(ctx->addr++, &buf, 1, ctx->dis); - insn |= buf << (32 - i * 8); + ctx->dis->read_memory_func(addr++, &ctx->bytes[i - 1], 1, ctx->dis); + insn |= ctx->bytes[i - 1] << (32 - i * 8); } + ctx->addr = addr; + ctx->len = n; + return insn; } static int32_t li(DisasContext *ctx, int sz) { - int32_t addr; - bfd_byte buf[4]; - addr = ctx->addr; + uint32_t addr = ctx->addr; + uintptr_t len = ctx->len; switch (sz) { case 1: + g_assert(len + 1 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 1; - ctx->dis->read_memory_func(addr, buf, 1, ctx->dis); - return (int8_t)buf[0]; + ctx->len += 1; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 1, ctx->dis); + return (int8_t)ctx->bytes[len]; case 2: + g_assert(len + 2 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 2; - ctx->dis->read_memory_func(addr, buf, 2, ctx->dis); - return ldsw_le_p(buf); + ctx->len += 2; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 2, ctx->dis); + return ldsw_le_p(ctx->bytes + len); case 3: + g_assert(len + 3 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 3; - ctx->dis->read_memory_func(addr, buf, 3, ctx->dis); - return (int8_t)buf[2] << 16 | lduw_le_p(buf); + ctx->len += 3; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 3, ctx->dis); + return (int8_t)ctx->bytes[len + 2] << 16 | lduw_le_p(ctx->bytes + len); case 0: + g_assert(len + 4 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 4; - ctx->dis->read_memory_func(addr, buf, 4, ctx->dis); - return ldl_le_p(buf); + ctx->len += 4; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 4, ctx->dis); + return ldl_le_p(ctx->bytes + len); default: g_assert_not_reached(); } @@ -110,7 +126,7 @@ static const char psw[] = { static void rx_index_addr(DisasContext *ctx, char out[8], int ld, int mi) { uint32_t addr = ctx->addr; - uint8_t buf[2]; + uintptr_t len = ctx->len; uint16_t dsp; switch (ld) { @@ -119,14 +135,18 @@ static void rx_index_addr(DisasContext *ctx, char out[8], int ld, int mi) out[0] = '\0'; return; case 1: + g_assert(len + 1 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 1; - ctx->dis->read_memory_func(addr, buf, 1, ctx->dis); - dsp = buf[0]; + ctx->len += 1; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 1, ctx->dis); + dsp = ctx->bytes[len]; break; case 2: + g_assert(len + 2 <= ARRAY_SIZE(ctx->bytes)); ctx->addr += 2; - ctx->dis->read_memory_func(addr, buf, 2, ctx->dis); - dsp = lduw_le_p(buf); + ctx->len += 2; + ctx->dis->read_memory_func(addr, ctx->bytes + len, 2, ctx->dis); + dsp = lduw_le_p(ctx->bytes + len); break; default: g_assert_not_reached(); @@ -1392,8 +1412,10 @@ int print_insn_rx(bfd_vma addr, disassemble_info *dis) DisasContext ctx; uint32_t insn; int i; + ctx.dis = dis; ctx.pc = ctx.addr = addr; + ctx.len = 0; insn = decode_load(&ctx); if (!decode(&ctx, insn)) { -- 2.11.0
next prev parent reply index Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-17 7:36 [Qemu-devel] [PATCH v23 00/22] Add RX archtecture support Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 01/22] MAINTAINERS: Add RX Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 02/22] qemu/bitops.h: Add extract8 and extract16 Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 03/22] hw/registerfields.h: Add 8bit and 16bit register macros Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 04/22] target/rx: TCG translation Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 05/22] target/rx: TCG helper Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 06/22] target/rx: CPU definition Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 07/22] target/rx: RX disassembler Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 08/22] target/rx: Disassemble rx_index_addr into a string Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 09/22] target/rx: Replace operand with prt_ldmi in disassembler Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 10/22] target/rx: Use prt_ldmi for XCHG_mr disassembly Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 11/22] target/rx: Emit all disassembly in one prt() Yoshinori Sato 2019-08-17 7:36 ` Yoshinori Sato [this message] 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 13/22] target/rx: Dump bytes for each insn during disassembly Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 14/22] hw/intc: RX62N interrupt controller (ICUa) Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 15/22] hw/timer: RX62N internal timer modules Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 16/22] hw/char: RX62N serial communication interface (SCI) Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 17/22] hw/rx: RX Target hardware definition Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 18/22] hw/rx: Honor -accel qtest Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 19/22] hw/rx: Restrict the RX62N microcontroller to the RX62N CPU core Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 20/22] Add rx-softmmu Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 21/22] BootLinuxConsoleTest: Test the RX-Virt machine Yoshinori Sato 2019-08-17 7:36 ` [Qemu-devel] [PATCH v23 22/22] target/rx: remove unused functions Yoshinori Sato 2019-08-21 10:23 ` Philippe Mathieu-Daudé 2019-08-21 14:33 ` Yoshinori Sato 2019-08-17 8:07 ` [Qemu-devel] [PATCH v23 00/22] Add RX archtecture support no-reply 2019-08-17 8:22 ` no-reply 2019-08-17 8:37 ` no-reply 2019-08-17 8:53 ` no-reply 2019-08-17 9:09 ` no-reply 2019-08-17 9:23 ` no-reply 2019-08-17 9:39 ` no-reply 2019-08-17 9:48 ` no-reply 2019-08-21 9:28 ` Yoshinori Sato 2019-08-21 10:28 ` Philippe Mathieu-Daudé 2019-09-02 15:02 ` Philippe Mathieu-Daudé
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=20190817073628.94473-13-ysato@users.sourceforge.jp \ --to=ysato@users.sourceforge.jp \ --cc=imammedo@redhat.com \ --cc=peter.maydell@linaro.org \ --cc=philmd@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=richard.henderson@linaro.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
QEMU-Devel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/qemu-devel/0 qemu-devel/git/0.git git clone --mirror https://lore.kernel.org/qemu-devel/1 qemu-devel/git/1.git git clone --mirror https://lore.kernel.org/qemu-devel/2 qemu-devel/git/2.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 qemu-devel qemu-devel/ https://lore.kernel.org/qemu-devel \ qemu-devel@nongnu.org public-inbox-index qemu-devel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.nongnu.qemu-devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git