[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] EFI Xen unstable crashes on Dell E6410 when calling efi_get_time.



On Wed, Oct 22, 2014 at 11:22:17AM +0100, Jan Beulich wrote:
> >>> On 22.10.14 at 11:45, <andrew.cooper3@xxxxxxxxxx> wrote:
> > On 22/10/14 01:29, Marcos E. Matsunaga wrote:
> >> I went out and got the serial cable. Attached is the full output.
> >>
> >>
> >> On 10/21/2014 05:06 PM, Marcos E. Matsunaga wrote:
> >>> Folks,
> >>>
> >>> I am trying to boot Xen using efibootmgr on a Dell E6410 laptop with
> >>> 4GB RAM, running an Intel I5 dual core with VT and all the
> >>> virtualization options enabled.
> >>>
> >>> It crashes almost immediately. I am working on getting the serial
> >>> console up so that I can get a more detailed stack.
> >>>
> >>> A screenshot of the console is attached.
> >>>
> >>> The xen.cfg file is:
> >>>
> >>> [global]
> >>> default=xen
> >>>
> >>> [xen]
> >>> options=console=vga,com1 com1=115200,8n1 dom0_max_vcpus=2 vga="qxl"
> >>> kernel=vmlinuz-3.8.13-48.el7uek.Other_EFI_v1.x86_64
> >>> root=UUID=917bfc7f-8d9c-4acf-a98a-a9f558daccf2  ro console=hvc0
> >>> enforcing=0 biosdevname=0 earlyprintk=xen nomodeset
> >>> ramdisk=initramfs-3.8.13-48.el7uek.Other_EFI_v1.x86_64.img
> >>>
> >>>
> >>> The codepath is "(gdb) x/20i get_cmos_time
> >>>    0xffff82d080188825 <get_cmos_time>:  push   %rbp
> >>>    0xffff82d080188826 <get_cmos_time+1>:        mov %rsp,%rbp
> >>>    0xffff82d080188829 <get_cmos_time+4>:        push   %r12
> >>>    0xffff82d08018882b <get_cmos_time+6>:        push   %rbx
> >>>    0xffff82d08018882c <get_cmos_time+7>:        cmpb
> >>> $0x0,0xb620d(%rip)        # 0xffff82d08023ea40 <efi_enabled>
> >>>    0xffff82d080188833 <get_cmos_time+14>:       je 0xffff82d080188843
> >>> <get_cmos_time+30>
> >>>    0xffff82d080188835 <get_cmos_time+16>:       callq
> >>> 0xffff82d080100069 <efi_get_time>"
> >>>
> >>
> > 
> > Ok - there are two separate bugs here.
> > 
> > The first is that we call into the efi runtime via efi_rs->GetTime, and
> > a pagefault happens for the instruction at 0x00000000db25a33d for the
> > virtual address 0x00000000fed1f410
> > 
> > The memory map looks quite weird, but the faulting address is covered in
> > this range.
> > 
> > (XEN)  00000fed1c000-00000fed1ffff type=11 attr=8000000000000000

type 11 is 
> > 
> > So I would expect it to be mapped into the EFI pagetables.
> 
> Then you must have missed
> 
> (XEN) Unknown cachability for MFNs 0xfed1c-0xfed1f
> 
> which means no mapping got established (as we don't know what
> cachability attributes to give to it).
> 
> This is a firmware bug.

Could we use the UC- by default? Looking at the Linux code
(efi_enter_virtual_mode_generic, it will pick 'efi_ioremap' which
calls 'ioremap' (which calls ioremap_nocache)


diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index f272171..d567675 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -1160,9 +1160,13 @@ void __init efi_init_memory(void)
             prot |= _PAGE_PWT | _PAGE_PCD | MAP_SMALL_PAGES;
         else
         {
-            printk(XENLOG_ERR "Unknown cachability for MFNs %#lx-%#lx\n",
-                   smfn, emfn - 1);
-            continue;
+            printk(XENLOG_ERR "Unknown cachability for MFNs %#lx-%#lx %s\n",
+                   smfn, emfn - 1,
+                   desc->Type == EfiMemoryMappedIO ? "using UC-" : "");
+            if ( desc->type == EfiMemoryMappedIO )
+                prot |= _PAGE_PWT | _PAGE_PCD | MAP_SMALL_PAGES;
+            else
+                continue;
         }
 
         if ( desc->Attribute & EFI_MEMORY_WP )
> 
> > The EFI code is a mix of #ifdefs.  Can you confirm whether you are
> > compiling with USE_SET_VIRTUAL_ADDRESS_MAP or not?
> 
> No-one should be altering these, their presence is purely for
> documentation purposes.

The build was just a pure 'make' so whatever the default ones are.
> 
> > The second is that once the pagefault has happened, we trap back into
> > Xen and attempt to do a pagetable walk, falling over an assertion in
> > map_domain_page().
> > 
> > For EFI calls, we run on the efi pagetables, not the idle pagetables, so
> > I am not surprised that the assertion has failed.  I suspect that the
> > pagefault hander for hypervisor faults needs to become wise to the fact
> > that we may receive a fault when calling into the firmware.  As all the
> > efi pagetables are xenheap pages, there is nothing conceptually wrong
> > with using map_domain_page() to do the walk.
> 
> I'm not sure it's worth taking care of this special case. But yes, if
> we really want to, extending the condition to also consider
> efi_l4_pgtable would seem the right thing to do.
> 
> Jan
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.