|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v13 4/9] x86: add multiboot2 protocol support for EFI platforms
>>> On 25.01.17 at 23:49, <daniel.kiper@xxxxxxxxxx> wrote:
> On Wed, Jan 25, 2017 at 04:20:30PM -0600, Doug Goldstein wrote:
>> This is a huge change and would really be helpful to have the diff of
>> what's changed to work from.
>
> Please look below...
Thanks for providing this - I'll comment this rather than the full patch:
> @@ -123,6 +116,15 @@ efi_platform:
> .Lbad_ldr_nih: .asciz "ERR: EFI ImageHandle is not provided by bootloader!"
> .Lbad_efi_msg: .asciz "ERR: EFI IA-32 platforms are not supported!"
>
> + .section .init.data, "a", @progbits
This needs to be a writable section.
> @@ -170,6 +172,12 @@ not_multiboot:
> .code64
>
> __efi64_mb2_start:
> + /*
> + * Multiboot2 spec says that here CPU is in 64-bit mode. However,
> there
> + * is also guarantee that all code and data is always put by the
> bootloader
> + * below 4 GiB. Hence, we can safely use in most cases 32-bit
> addressing.
> + */
"use 32-bit addressing" is misleading: I don't think you use any such,
since - as pointed out during earlier review - this would needlessly
cause 0x67 prefixes to be emitted. Instead what you mean is that
we can safely truncate addresses.
> @@ -180,7 +188,7 @@ __efi64_mb2_start:
> je .Lefi_multiboot2_proto
>
> /* Jump to not_multiboot after switching CPU to x86_32 mode. */
> - lea not_multiboot(%rip),%edi
> + lea not_multiboot(%rip),%r15d
In cases like this, where a REX prefix is needed anyway, please
use the full register unless you strictly need it zero-extended
from 32 bits.
> + /* Align the stack as UEFI spec requires. */
> + add $15,%rsp
> + and $~15,%rsp
How come you _add_ something here first? Simply do the AND and
be done. Also please extend the comment along the lines of what
I had asked for before: To warn of future changes to the number
of items pushed onto the stack below.
> @@ -280,13 +286,13 @@ run_bs:
>
> pop %rdi
>
> + /* Align the stack as UEFI spec requires. */
> + push %rdi
Please combine the two into "mov (%rsp), %rdi" and make the
comment say "Keep the stack aligned; don't pop a single item
off it" or some such.
> @@ -424,26 +433,44 @@ trampoline_bios_setup:
> cmp %ecx,%edx /* compare with BDA value */
> cmovb %edx,%ecx /* and use the smaller */
>
> - /* Reserve memory for the trampoline. */
> - sub $((MB_TRAMPOLINE_SIZE+MB_TRAMPOLINE_STACK_SIZE)>>4),%ecx
> + /* Reserve memory for the trampoline and the low-memory stack. */
> + sub $((TRAMPOLINE_SPACE+TRAMPOLINE_STACK_SPACE)>>4),%ecx
>
> /* From arch/x86/smpboot.c: start_eip had better be page-aligned! */
> xor %cl, %cl
>
> trampoline_setup:
> - /* Save trampoline address for later use. */
> shl $4, %ecx
> mov %ecx,sym_phys(trampoline_phys)
>
> + /* Get topmost low-memory stack address. */
> + add $TRAMPOLINE_SPACE,%ecx
The top-most address of the stack is
%ecx + TRAMPOLINE_SPACE + TRAMPOLINE_STACK_SPACE - 1.
Please don't add misleading comments.
> /* Save the Multiboot info struct (after relocation) for later use.
> */
> mov $sym_phys(cpu0_stack)+1024,%esp
> - push %ecx /* Boot trampoline address. */
> + push %ecx /* Topmost low-memory stack address. */
> push %ebx /* Multiboot information address. */
> push %eax /* Multiboot magic. */
> call reloc
> mov %eax,sym_phys(multiboot_ptr)
>
> /*
> + * Now trampoline_phys points to the following structure (lowest
> + * address is at the top):
> + *
> + * +------------------------+
> + * | TRAMPOLINE_SPACE |
> + * +- - - - - - - - - - - - +
> + * | mbi struct |
> + * +------------------------+
> + * | TRAMPOLINE_STACK_SPACE |
> + * +------------------------+
> + *
> + * mbi struct lives at the end of TRAMPOLINE_SPACE. The rest of
> + * TRAMPOLINE_SPACE is reserved for trampoline code and data.
> + */
Please can you clarify here that the MBI data grows downwards
from the beginning of the stack to the end of the trampoline?
> @@ -696,8 +699,8 @@ paddr_t __init efi_multiboot2(EFI_HANDLE ImageHandle,
> EFI_SYSTEM_TABLE *SystemTa
>
> efi_exit_boot(ImageHandle, SystemTable);
>
> - /* Return highest allocated memory address below 1 MiB. */
> - return cfg.addr + cfg.size;
> + /* Return trampoline address. */
> + return trampoline_phys;
> }
With this it would be less confusing if you move the trampoline_setup
label down a few more lines. Perhaps the function here could then
return void.
> --- a/xen/arch/x86/efi/stub.c
> +++ b/xen/arch/x86/efi/stub.c
> @@ -20,7 +20,8 @@
> paddr_t __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle,
> EFI_SYSTEM_TABLE *SystemTable)
> {
> - CHAR16 *err = L"Xen does not have EFI code build in!!!\r\nSystem
> halted!!!\r\n";
> + static const CHAR16 __initconst err[] =
> + L"(XEN) Xen does not have EFI code build in!\r\n(XEN) System
> halted!\r\n";
Why did you add these (XEN) prefixes?
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -334,5 +334,5 @@ ASSERT(IS_ALIGNED(trampoline_end, 4), "trampoline_end
> misaligned")
> ASSERT(IS_ALIGNED(__bss_start, 8), "__bss_start misaligned")
> ASSERT(IS_ALIGNED(__bss_end, 8), "__bss_end misaligned")
>
> -ASSERT((trampoline_end - trampoline_start) < MB_TRAMPOLINE_SIZE,
> +ASSERT((trampoline_end - trampoline_start) < TRAMPOLINE_SPACE,
> "not enough room for trampoline")
Didn't you mean to make sure there are at least two pages for
MBI data?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |