• A
    target-i386: Fix lcall/ljmp to call gate in IA-32e mode · 0aca0605
    Andrew Oates 提交于
    Currently call gates are always treated as 32-bit gates.  In IA-32e mode
    (either compatibility or 64-bit submode), system segment descriptors are
    always 64-bit.  Treating them as 32-bit has the expected unfortunate
    effect: only the lower 32 bits of the offset are loaded, the stack
    pointer is truncated, a bad new stack pointer is loaded from the TSS (if
    switching privilege levels), etc.
    
    This change adds support for 64-bit call gate to the lcall and ljmp
    instructions.  Additionally, there should be a check for non-canonical
    stack pointers, but I've omitted that since there doesn't seem to be
    checks for non-canonical addresses in this code elsewhere.
    
    I've left the raise_exception_err_ra lines unwapped at 80 columns to
    match the style in the rest of the file.
    Signed-off-by: NAndrew Oates <aoates@google.com>
    Message-Id: <20180819181725.34098-1-andrew@andrewoates.com>
    Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
    0aca0605
seg_helper.c 90.9 KB