• Nadav Amit's avatar
    KVM: x86: Emulator performs privilege checks on __linearize · a7315d2f
    Nadav Amit authored
    When segment is accessed, real hardware does not perform any privilege level
    checks.  In contrast, KVM emulator does. This causes some discrepencies from
    real hardware. For instance, reading from readable code segment may fail due to
    incorrect segment checks. In addition, it introduces unnecassary overhead.
    
    To reference Intel SDM 5.5 ("Privilege Levels"): "Privilege levels are checked
    when the segment selector of a segment descriptor is loaded into a segment
    register." The SDM never mentions privilege level checks during memory access,
    except for loading far pointers in section 5.10 ("Pointer Validation"). Those
    are actually segment selector loads and are emulated in the similarily (i.e.,
    regardless to __linearize checks).
    
    This behavior was also checked using sysexit. A data-segment whose DPL=0 was
    loaded, and after sysexit (CPL=3) it is still accessible.
    
    Therefore, all the privilege level checks in __linearize are removed.
    Signed-off-by: default avatarNadav Amit <namit@cs.technion.ac.il>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    a7315d2f
emulate.c 130 KB