From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Thomas Huth" <thuth@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PATCH v3 10/10] disas/capstone: Add skipdata hook for s390x
Date: Thu, 17 Sep 2020 16:57:20 -0700 [thread overview]
Message-ID: <20200917235720.2685978-11-richard.henderson@linaro.org> (raw)
In-Reply-To: <20200917235720.2685978-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
prev parent reply other threads:[~2020-09-18 0:06 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-17 23:57 [PATCH v3 00/10] capstone + disassembler patches Richard Henderson
2020-09-17 23:57 ` [PATCH v3 01/10] capstone: Convert Makefile bits to meson bits Richard Henderson
2020-09-18 8:12 ` 罗勇刚(Yonggang Luo)
2020-09-18 8:13 ` Paolo Bonzini
2020-09-18 8:42 ` 罗勇刚(Yonggang Luo)
2020-09-18 12:58 ` Paolo Bonzini
2020-09-18 13:02 ` 罗勇刚(Yonggang Luo)
2020-09-21 10:54 ` Alex Bennée
2020-09-21 11:05 ` Alex Bennée
2020-09-21 12:50 ` 罗勇刚(Yonggang Luo)
2020-09-21 13:12 ` Paolo Bonzini
2020-09-17 23:57 ` [PATCH v3 02/10] capstone: Update to upstream "next" branch Richard Henderson
2020-09-17 23:57 ` [PATCH v3 03/10] disas: Move host asm annotations to tb_gen_code Richard Henderson
2020-09-17 23:57 ` [PATCH v3 04/10] disas: Clean up CPUDebug initialization Richard Henderson
2020-09-17 23:57 ` [PATCH v3 05/10] disas: Use qemu/bswap.h for bfd endian loads Richard Henderson
2020-09-17 23:57 ` [PATCH v3 06/10] disas: Cleanup plugin_disas Richard Henderson
2020-09-17 23:57 ` [PATCH v3 07/10] disas: Configure capstone for aarch64 host without libvixl Richard Henderson
2020-09-18 8:08 ` Philippe Mathieu-Daudé
2020-09-17 23:57 ` [PATCH v3 08/10] disas: Split out capstone code to disas/capstone.c Richard Henderson
2020-09-17 23:57 ` [PATCH v3 09/10] disas: Enable capstone disassembly for s390x Richard Henderson
2020-09-17 23:57 ` Richard Henderson [this message]
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=20200917235720.2685978-11-richard.henderson@linaro.org \
--to=richard.henderson@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
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).