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    [W:0.029 / U:31.940 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site