• Stephan Bärwolf's avatar
    KVM: x86: fix missing checks in syscall emulation · b9a6939d
    Stephan Bärwolf authored
    commit c2226fc9 upstream
    
    On hosts without this patch, 32bit guests will crash (and 64bit guests
    may behave in a wrong way) for example by simply executing following
    nasm-demo-application:
    
    [bits 32]
    global _start
    SECTION .text
    _start: syscall
    
    (I tested it with winxp and linux - both always crashed)
    
    Disassembly of section .text:
    
    00000000 <_start>:
       0:   0f 05                   syscall
    
    The reason seems a missing "invalid opcode"-trap (int6) for the
    syscall opcode "0f05", which is not available on Intel CPUs
    within non-longmodes, as also on some AMD CPUs within legacy-mode.
    (depending on CPU vendor, MSR_EFER and cpuid)
    
    Because previous mentioned OSs may not engage corresponding
    syscall target-registers (STAR, LSTAR, CSTAR), they remain
    NULL and (non trapping) syscalls are leading to multiple
    faults and finally crashs.
    
    Depending on the architecture (AMD or Intel) pretended by
    guests, various checks according to vendor's documentation
    are implemented to overcome the current issue and behave
    like the CPUs physical counterparts.
    
    [mtosatti: cleanup/beautify code]
    
    [bwh: Backport to 2.6.32:
     - Add the prerequisite read of EFER
     - Return -1 in the error cases rather than invoking emulate_ud()
       directly
     - Adjust context]
    [dannf: fix build by passing x86_emulate_ops through each call]
    Signed-off-by: default avatarStephan Baerwolf <stephan.baerwolf@tu-ilmenau.de>
    Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
    b9a6939d
emulate.c 68.3 KB