• Sean Christopherson's avatar
    KVM: x86: Whitelist port 0x7e for pre-incrementing %rip · 8764ed55
    Sean Christopherson authored
    KVM's recent bug fix to update %rip after emulating I/O broke userspace
    that relied on the previous behavior of incrementing %rip prior to
    exiting to userspace.  When running a Windows XP guest on AMD hardware,
    Qemu may patch "OUT 0x7E" instructions in reaction to the OUT itself.
    Because KVM's old behavior was to increment %rip before exiting to
    userspace to handle the I/O, Qemu manually adjusted %rip to account for
    the OUT instruction.
    
    Arguably this is a userspace bug as KVM requires userspace to re-enter
    the kernel to complete instruction emulation before taking any other
    actions.  That being said, this is a bit of a grey area and breaking
    userspace that has worked for many years is bad.
    
    Pre-increment %rip on OUT to port 0x7e before exiting to userspace to
    hack around the issue.
    
    Fixes: 45def77e ("KVM: x86: update %rip after emulating IO")
    Reported-by: default avatarSimon Becherer <simon@becherer.de>
    Reported-and-tested-by: default avatarIakov Karpov <srid@rkmail.ru>
    Reported-by: default avatarGabriele Balducci <balducci@units.it>
    Reported-by: default avatarAntti Antinoja <reader@fennosys.fi>
    Cc: stable@vger.kernel.org
    Cc: Takashi Iwai <tiwai@suse.com>
    Cc: Jiri Slaby <jslaby@suse.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    8764ed55
x86.c 255 KB