lkml.org 
[lkml]   [2012]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[RFC PATCH -tip 05/16] x86: Disassemble x86-64 only instructions
From
Date
Support x86-64 only instructions on disassembler.
For example, syscall and sysret.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu@gmail.com>
---
arch/x86/lib/mnemonic.c | 23 +++++++++++++++++++++--
arch/x86/tools/gen-insn-mnemonic-x86.awk | 11 +++++++++--
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/arch/x86/lib/mnemonic.c b/arch/x86/lib/mnemonic.c
index 0c375fb..dfd1aab 100644
--- a/arch/x86/lib/mnemonic.c
+++ b/arch/x86/lib/mnemonic.c
@@ -1,10 +1,29 @@
#include <linux/kernel.h>
+#include <linux/string.h>
#include <asm/insn.h>
#include <asm/disasm.h>

/* Define mnemonic lookup table */
#include "mnemonic-tables.c"

+static const char *get_variant(const char *fmt, struct insn *insn)
+{
+ const char *p;
+
+ if (!fmt)
+ goto out;
+
+ if (insn->x86_64) {
+ p = strstr(fmt, "%6");
+ if (!p)
+ goto out;
+ fmt = strchr(p, ':') + 1;
+ } else if (strstr(fmt, "%6") == fmt)
+ fmt = NULL;
+out:
+ return fmt;
+}
+
const char *get_mnemonic_format(struct insn *insn, const char **grp)
{
insn_attr_t attr;
@@ -39,7 +58,7 @@ const char *get_mnemonic_format(struct insn *insn, const char **grp)
table = mnemonic_escape_tables[n][0];
}
if (table)
- ret = table[idx];
+ ret = get_variant(table[idx], insn);

/* Solve groups */
if (grp && inat_is_group(attr)) {
@@ -51,7 +70,7 @@ const char *get_mnemonic_format(struct insn *insn, const char **grp)
else
table = mnemonic_group_tables[n][0];
idx = X86_MODRM_REG(idx);
- *grp = table[idx];
+ *grp = get_variant(table[idx], insn);
}
}
return ret;
diff --git a/arch/x86/tools/gen-insn-mnemonic-x86.awk b/arch/x86/tools/gen-insn-mnemonic-x86.awk
index 2714f2f..14fca68 100644
--- a/arch/x86/tools/gen-insn-mnemonic-x86.awk
+++ b/arch/x86/tools/gen-insn-mnemonic-x86.awk
@@ -49,6 +49,7 @@ BEGIN {
regs_expr = "^[ABCDESR][0-9A-Z]"
vregs_expr = "^[re][0-9A-Z]"

+ only64_expr = "\\(o64\\)"
lprefix1_expr = "\\(66\\)"
lprefix2_expr = "\\(F3\\)"
lprefix3_expr = "\\(F2\\)"
@@ -254,6 +255,7 @@ function get_operand(opnd, i,count,f8,opnds) {
ext = null
flags = null
opnd = null
+ pfx = ""
# parse one opcode
if (match($i, opnd_expr))
opnd = get_operand($(i++))
@@ -283,10 +285,15 @@ function get_operand(opnd, i,count,f8,opnds) {
opcode = "call"
if (match(opcode, "^ret.*"))
opcode = "ret"
+
+ # additional flags
+ if (match(ext, only64_expr))
+ pfx = "%6:"
+
if (length(opnd) != 0)
- flags = "\"" opcode " " opnd "\""
+ flags = "\"" pfx opcode " " opnd "\""
else
- flags = "\"" opcode "\""
+ flags = "\"" pfx opcode "\""

if (length(flags) == 0)
continue


\
 
 \ /
  Last update: 2012-04-01 18:05    [from the cache]
©2003-2011 Jasper Spaans