2016-03-04 14:07 GMT+01:00 Matt Fleming <m...@codeblueprint.co.uk>:
>
> It must have been a herculean effort to take photos of the screen
> while the buggy kernel booted. Thank you!
>
> I'm not really seeing anything jumping out as obviously wrong apart
> from the fact that we don't have all of EFI_CONVENTIONAL_MEMORY mapped
> in the buggy kernel.
>
> Could you try this patch?
>
> ---
>
> diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
> index 49e4dd4a1f58..f5e77d240ff1 100644
> --- a/arch/x86/platform/efi/efi_64.c
> +++ b/arch/x86/platform/efi/efi_64.c
> @@ -241,15 +241,6 @@ int __init efi_setup_page_tables(unsigned long 
> pa_memmap, unsigned num_pages)
>         efi_scratch.use_pgd = true;
>
>         /*
> -        * When making calls to the firmware everything needs to be 1:1
> -        * mapped and addressable with 32-bit pointers. Map the kernel
> -        * text and allocate a new stack because we can't rely on the
> -        * stack pointer being < 4GB.
> -        */
> -       if (!IS_ENABLED(CONFIG_EFI_MIXED))
> -               return 0;
> -
> -       /*
>          * Map all of RAM so that we can access arguments in the 1:1
>          * mapping when making EFI runtime calls.
>          */
> @@ -268,6 +259,15 @@ int __init efi_setup_page_tables(unsigned long 
> pa_memmap, unsigned num_pages)
>                 }
>         }
>
> +       /*
> +        * When making calls to the firmware everything needs to be 1:1
> +        * mapped and addressable with 32-bit pointers. Map the kernel
> +        * text and allocate a new stack because we can't rely on the
> +        * stack pointer being < 4GB.
> +        */
> +       if (!IS_ENABLED(CONFIG_EFI_MIXED))
> +               return 0;
> +
>         page = alloc_page(GFP_KERNEL|__GFP_DMA32);
>         if (!page)
>                 panic("Unable to allocate EFI runtime stack < 4GB\n");

Thanks for you suggestion.
Unfortunately, this patch doesn't make it works, the crash still
occurs (at the same RIP and traceback).

Using /dev/mem on a running system (with kernel 4.3), the memory
around RIP (0xaa9462ee) is :
aa9462d0  sub rsp,0x28
aa9462d4  lea rdx,[rip+0x2445] # 0xaa948720
aa9462db  mov ecx,0x4
aa9462e0  call func_aa9447c0  ; call to ConvertPointer(4, & 0xaa948720)
aa9462e5  mov r11,QWORD PTR [rip+0x2434] # 0xaa948720
aa9462ec  xor eax,eax
aa9462ee  mov BYTE PTR [r11+0x1],0x1
aa9462f3  add rsp,0x28
aa9462f7  ret

The QWORD at address 0xaa948720 is 0 though on the running system.

I will try to investigate more but I'm open to any printk / patch tests.

Alexis Murzeau

Reply via email to