• Masami Hiramatsu's avatar
    x86/decoder: Fix bsr/bsf/jmpe decoding with operand-size prefix · 436d03fa
    Masami Hiramatsu authored
    Fix the x86 instruction decoder to decode bsr/bsf/jmpe with
    operand-size prefix (66h). This fixes the test case failure
    reported by Linus, attached below.
    
    bsf/bsr/jmpe have a special encoding. Opcode map in
    Intel Software Developers Manual vol2 says they have
    TZCNT/LZCNT variants if it has F3h prefix. However, there
    is no information if it has other 66h or F2h prefixes.
    Current instruction decoder supposes that those are
    bad instructions, but it actually accepts at least
    operand-size prefixes.
    
    H. Peter Anvin further explains:
    
     " TZCNT/LZCNT are F3 + BSF/BSR exactly because the F2 and
       F3 prefixes have historically been no-ops with most instructions.
       This allows software to unconditionally use the prefixed versions
       and get TZCNT/LZCNT on the processors that have them if they don't
       care about the difference. "
    
    This fixes errors reported by test_get_len:
    
      Warning: arch/x86/tools/test_get_len found difference at <em_bsf>:ffffffff81036d87
      Warning: ffffffff81036de5:	66 0f bc c2          	bsf    %dx,%ax
      Warning: objdump says 4 bytes, but insn_get_length() says 3
      Warning: arch/x86/tools/test_get_len found difference at <em_bsr>:ffffffff81036ea6
      Warning: ffffffff81036f04:	66 0f bd c2          	bsr    %dx,%ax
      Warning: objdump says 4 bytes, but insn_get_length() says 3
      Warning: decoded and checked 13298882 instructions with 2 warnings
    Reported-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Reported-by: default avatarPekka Enberg <penberg@kernel.org>
    Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: <yrl.pp-manager.tt@hitachi.com>
    Link: http://lkml.kernel.org/r/20120604150911.22338.43296.stgit@localhost.localdomainSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    436d03fa
x86-opcode-map.txt 23.5 KB