Skip to content
  • Konrad Rzeszutek Wilk's avatar
    x86-64, xen, mmu: Provide an early version of write_cr3. · 0cc9129d
    Konrad Rzeszutek Wilk authored
    With commit 8170e6be
    
     ("x86, 64bit: Use a #PF handler to materialize
    early mappings on demand") we started hitting an early bootup crash
    where the Xen hypervisor would inform us that:
    
        (XEN) d7:v0: unhandled page fault (ec=0000)
        (XEN) Pagetable walk from ffffea000005b2d0:
        (XEN)  L4[0x1d4] = 0000000000000000 ffffffffffffffff
        (XEN) domain_crash_sync called from entry.S
        (XEN) Domain 7 (vcpu#0) crashed on cpu#3:
        (XEN) ----[ Xen-4.2.0  x86_64  debug=n  Not tainted ]----
    
    .. that Xen was unable to context switch back to dom0.
    
    Looking at the calling stack we find:
    
        [<ffffffff8103feba>] xen_get_user_pgd+0x5a  <--
        [<ffffffff8103feba>] xen_get_user_pgd+0x5a
        [<ffffffff81042d27>] xen_write_cr3+0x77
        [<ffffffff81ad2d21>] init_mem_mapping+0x1f9
        [<ffffffff81ac293f>] setup_arch+0x742
        [<ffffffff81666d71>] printk+0x48
    
    We are trying to figure out whether we need to up-date the user PGD as
    well.  Please keep in mind that under 64-bit PV guests we have a limited
    amount of rings: 0 for the Hypervisor, and 1 for both the Linux kernel
    and user-space.  As such the Linux pvops'fied version of write_cr3
    checks if it has to update the user-space cr3 as well.
    
    That clearly is not needed during early bootup.  The recent changes (see
    above git commit) streamline the x86 page table allocation to be much
    simpler (And also incidentally the #PF handler ends up in spirit being
    similar to how the Xen toolstack sets up the initial page-tables).
    
    The fix is to have an early-bootup version of cr3 that just loads the
    kernel %cr3.  The later version - which also handles user-page
    modifications will be used after the initial page tables have been
    setup.
    
    [ hpa: removed a redundant #ifdef and made the new function __init.
      Also note that x86-32 already has such an early xen_write_cr3. ]
    
    Tested-by: default avatar"H. Peter Anvin" <hpa@zytor.com>
    Reported-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Link: http://lkml.kernel.org/r/1361579812-23709-1-git-send-email-konrad.wilk@oracle.com
    
    
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0cc9129d