QEMU-Devel Archive on lore.kernel.org
 help / color / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Thomas Huth" <thuth@redhat.com>,
	alex.bennee@linaro.org,
	"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PATCH v4 11/11] disas/capstone: Add skipdata hook for s390x
Date: Mon, 21 Sep 2020 10:41:18 -0700
Message-ID: <20200921174118.39352-12-richard.henderson@linaro.org> (raw)
In-Reply-To: <20200921174118.39352-1-richard.henderson@linaro.org>

It is always possible to tell the length of an insn, even if the
actual insn is unknown.  Skip the correct number of bytes, so that
we stay in sync with the instruction stream.

Acked-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 disas/capstone.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/disas/capstone.c b/disas/capstone.c
index b48f83958d..0a9ef9c892 100644
--- a/disas/capstone.c
+++ b/disas/capstone.c
@@ -16,6 +16,39 @@
  */
 static __thread cs_insn *cap_insn;
 
+/*
+ * The capstone library always skips 2 bytes for S390X.
+ * This is less than ideal, since we can tell from the first two bits
+ * the size of the insn and thus stay in sync with the insn stream.
+ */
+static size_t CAPSTONE_API
+cap_skipdata_s390x_cb(const uint8_t *code, size_t code_size,
+                      size_t offset, void *user_data)
+{
+    size_t ilen;
+
+    /* See get_ilen() in target/s390x/internal.h.  */
+    switch (code[offset] >> 6) {
+    case 0:
+        ilen = 2;
+        break;
+    case 1:
+    case 2:
+        ilen = 4;
+        break;
+    default:
+        ilen = 6;
+        break;
+    }
+
+    return ilen;
+}
+
+static const cs_opt_skipdata cap_skipdata_s390x = {
+    .mnemonic = ".byte",
+    .callback = cap_skipdata_s390x_cb
+};
+
 /*
  * Initialize the Capstone library.
  *
@@ -42,13 +75,20 @@ static cs_err cap_disas_start(disassemble_info *info, csh *handle)
     /* "Disassemble" unknown insns as ".byte W,X,Y,Z".  */
     cs_option(*handle, CS_OPT_SKIPDATA, CS_OPT_ON);
 
-    if (info->cap_arch == CS_ARCH_X86) {
+    switch (info->cap_arch) {
+    case CS_ARCH_SYSZ:
+        cs_option(*handle, CS_OPT_SKIPDATA_SETUP,
+                  (uintptr_t)&cap_skipdata_s390x);
+        break;
+
+    case CS_ARCH_X86:
         /*
          * We don't care about errors (if for some reason the library
          * is compiled without AT&T syntax); the user will just have
          * to deal with the Intel syntax.
          */
         cs_option(*handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
+        break;
     }
 
     /* Allocate temp space for cs_disasm_iter.  */
-- 
2.25.1



  parent reply index

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-21 17:41 [PATCH v4 00/11] capstone + disassembler patches Richard Henderson
2020-09-21 17:41 ` [PATCH v4 01/11] capstone: Convert Makefile bits to meson bits Richard Henderson
2020-09-21 19:17   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 02/11] capstone: Update to upstream "next" branch Richard Henderson
2020-09-21 19:18   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 03/11] capstone: Require version 4.0 from a system library Richard Henderson
2020-09-21 19:19   ` Alex Bennée
2020-09-22 10:33   ` Philippe Mathieu-Daudé
2020-09-21 17:41 ` [PATCH v4 04/11] disas: Move host asm annotations to tb_gen_code Richard Henderson
2020-09-21 19:29   ` Alex Bennée
2020-09-21 19:53     ` Richard Henderson
2020-09-22  8:26       ` Philippe Mathieu-Daudé
2020-09-22  9:50         ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 05/11] disas: Clean up CPUDebug initialization Richard Henderson
2020-09-21 19:32   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 06/11] disas: Use qemu/bswap.h for bfd endian loads Richard Henderson
2020-09-21 19:33   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 07/11] disas: Cleanup plugin_disas Richard Henderson
2020-09-22 10:38   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 08/11] disas: Configure capstone for aarch64 host without libvixl Richard Henderson
2020-09-22 10:48   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 09/11] disas: Split out capstone code to disas/capstone.c Richard Henderson
2020-09-22 10:50   ` Alex Bennée
2020-09-21 17:41 ` [PATCH v4 10/11] disas: Enable capstone disassembly for s390x Richard Henderson
2020-09-22 10:58   ` Alex Bennée
2020-09-21 17:41 ` Richard Henderson [this message]
2020-09-22 10:59   ` [PATCH v4 11/11] disas/capstone: Add skipdata hook " Alex Bennée
2020-09-22  0:50 ` [PATCH v4 00/11] capstone + disassembler patches no-reply

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=20200921174118.39352-12-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=f4bug@amsat.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    /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