• Gleb Natapov's avatar
    KVM: VMX: return correct segment limit and flags for CS/SS registers in real mode · c6ad1153
    Gleb Natapov authored
    VMX without unrestricted mode cannot virtualize real mode, so if
    emulate_invalid_guest_state=0 kvm uses vm86 mode to approximate
    it. Sometimes, when guest moves from protected mode to real mode, it
    leaves segment descriptors in a state not suitable for use by vm86 mode
    virtualization, so we keep shadow copy of segment descriptors for internal
    use and load fake register to VMCS for guest entry to succeed. Till
    now we kept shadow for all segments except SS and CS (for SS and CS we
    returned parameters directly from VMCS), but since commit a5625189
    emulator enforces segment limits in real mode. This causes #GP during move
    from protected mode to real mode when emulator fetches first instruction
    after moving to real mode since it uses incorrect CS base and limit to
    linearize the %rip. Fix by keeping shadow for SS and CS too.
    Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>