• R
    xen/pvh: Set X86_CR0_WP and others in CR0 (v2) · c9f6e997
    Roger Pau Monne 提交于
    otherwise we will get for some user-space applications
    that use 'clone' with CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID
    end up hitting an assert in glibc manifested by:
    
    general protection ip:7f80720d364c sp:7fff98fd8a80 error:0 in
    libc-2.13.so[7f807209e000+180000]
    
    This is due to the nature of said operations which sets and clears
    the PID.  "In the successful one I can see that the page table of
    the parent process has been updated successfully to use a
    different physical page, so the write of the tid on
    that page only affects the child...
    
    On the other hand, in the failed case, the write seems to happen before
    the copy of the original page is done, so both the parent and the child
    end up with the same value (because the parent copies the page after
    the write of the child tid has already happened)."
    (Roger's analysis). The nature of this is due to the Xen's commit
    of 51e2cac257ec8b4080d89f0855c498cbbd76a5e5
    "x86/pvh: set only minimal cr0 and cr4 flags in order to use paging"
    the CR0_WP was removed so COW features of the Linux kernel were not
    operating properly.
    
    While doing that also update the rest of the CR0 flags to be inline
    with what a baremetal Linux kernel would set them to.
    
    In 'secondary_startup_64' (baremetal Linux) sets:
    
    X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | X86_CR0_NE | X86_CR0_WP |
    X86_CR0_AM | X86_CR0_PG
    
    The hypervisor for HVM type guests (which PVH is a bit) sets:
    X86_CR0_PE | X86_CR0_ET | X86_CR0_TS
    For PVH it specifically sets:
    X86_CR0_PG
    
    Which means we need to set the rest: X86_CR0_MP | X86_CR0_NE  |
    X86_CR0_WP | X86_CR0_AM to have full parity.
    Signed-off-by: NRoger Pau Monne <roger.pau@citrix.com>
    Signed-off-by: NMukesh Rathor <mukesh.rathor@oracle.com>
    Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    [v1: Took out the cr4 writes to be a seperate patch]
    [v2: 0-DAY kernel found xen_setup_gdt to be missing a static]
    c9f6e997
enlighten.c 44.2 KB