• Ricardo Neri's avatar
    x86/mpx: Do not use SIB.index if its value is 100b and ModRM.mod is not 11b · ff9d7802
    Ricardo Neri authored
    Section 2.2.1.2 of the Intel 64 and IA-32 Architectures Software
    Developer's Manual volume 2A states that when ModRM.mod !=11b and
    ModRM.rm = 100b indexed register-indirect addressing is used. In other
    words, a SIB byte follows the ModRM byte. In the specific case of
    SIB.index = 100b, the scale*index portion of the computation of the
    effective address is null. To signal callers of this particular situation,
    get_reg_offset() can return -EDOM (-EINVAL continues to indicate that an
    error when decoding the SIB byte).
    
    An example of this situation can be the following instruction:
    
       8b 4c 23 80       mov -0x80(%rbx,%riz,1),%rcx
       ModRM:            0x4c [mod:1b][reg:1b][rm:100b]
       SIB:              0x23 [scale:0b][index:100b][base:11b]
       Displacement:     0x80  (1-byte, as per ModRM.mod = 1b)
    
    The %riz 'register' indicates a null index.
    
    In long mode, a REX prefix may be used. When a REX prefix is present,
    REX.X adds a fourth bit to the register selection of SIB.index. This gives
    the ability to refer to all the 16 general purpose registers. When REX.X is
    1b and SIB.index is 100b, the index is indicated in %r12. In our example,
    this would look like:
    
       42 8b 4c 23 80    mov -0x80(%rbx,%r12,1),%rcx
       REX:              0x42 [W:0b][R:0b][X:1b][B:0b]
       ModRM:            0x4c [mod:1b][reg:1b][rm:100b]
       SIB:              0x23 [scale:0b][.X: 1b, index:100b][.B:0b, base:11b]
       Displacement:     0x80  (1-byte, as per ModRM.mod = 1b)
    
    %r12 is a valid register to use in the scale*index part of the effective
    address computation.
    Signed-off-by: default avatarRicardo Neri <ricardo.neri-calderon@linux.intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: Adan Hawthorn <adanhawthorn@gmail.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: ricardo.neri@intel.com
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: Huang Rui <ray.huang@amd.com>
    Cc: Qiaowei Ren <qiaowei.ren@intel.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Jiri Slaby <jslaby@suse.cz>
    Cc: Nathan Howard <liverlint@gmail.com>
    Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com>
    Cc: Chris Metcalf <cmetcalf@mellanox.com>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Colin Ian King <colin.king@canonical.com>
    Cc: Chen Yucong <slaoub@gmail.com>
    Cc: Adam Buchbinder <adam.buchbinder@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Joe Perches <joe@perches.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Link: https://lkml.kernel.org/r/1509135945-13762-8-git-send-email-ricardo.neri-calderon@linux.intel.com
    ff9d7802
mpx.c 29.3 KB