|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v14 4/9] x86: add multiboot2 protocol support for EFI platforms
>>> On 02.02.17 at 23:01, <daniel.kiper@xxxxxxxxxx> wrote:
> This way Xen can be loaded on EFI platforms using GRUB2 and
> other boot loaders which support multiboot2 protocol.
>
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
> v14 - suggestions/fixes:
> - mark .init.data section as writable; by the way we must change
> similar definition in xen/arch/x86/boot/x86_64.S because otherwise
> compiler complains about section types conflicts
Did you observe a problem here, or was this just based on memory
from having seen such in other cases? I ask because I doubt there
would be any problem here, as the compiler isn't involved: This is
assembly code, and iirc you validly talk about a compiler diagnostic.
Hence the wrong attributes want correcting, but in a separate
patch.
> .section .init.text, "ax", @progbits
>
> bad_cpu:
> mov $(sym_phys(.Lbad_cpu_msg)),%esi # Error message
> - jmp print_err
> + jmp .Lget_vtb
> not_multiboot:
> mov $(sym_phys(.Lbad_ldr_msg)),%esi # Error message
> -print_err:
> - mov $0xB8000,%edi # VGA framebuffer
> -1: mov (%esi),%bl
> + jmp .Lget_vtb
> +.Lmb2_no_st:
> + mov $(sym_phys(.Lbad_ldr_nst)),%esi # Error message
> + jmp .Lget_vtb
> +.Lmb2_no_ih:
> + mov $(sym_phys(.Lbad_ldr_nih)),%esi # Error message
> + jmp .Lget_vtb
> +.Lmb2_no_bs:
> + mov $(sym_phys(.Lbad_ldr_nbs)),%esi # Error message
> + xor %edi,%edi # No VGA text buffer
> + jmp .Lsend_chr
> +.Lmb2_efi_ia_32:
> + mov $(sym_phys(.Lbad_efi_msg)),%esi # Error message
> + xor %edi,%edi # No VGA text buffer
> + jmp .Lsend_chr
I continue to have problems to understand when you use / don't use
the VGA buffer here: I think at the very least we want a comment as
to when which of the two models applies. The situation isn't being
helped by .Lmb2_no_bs reachable via two paths (one neighboring a
use of .Lmb2_efi_ia_32, and another neighboring uses of
.Lmb2_no_st and .Lmb2_no_ih). Since you zap vga_text_buffer in
the EFI case, couldn't you simply use that one instead of clearing
%edi here?
> +void __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle,
> + EFI_SYSTEM_TABLE *SystemTable)
> +{
> + static const CHAR16 __initconst err[] =
> + L"Xen does not have EFI code build in!\r\nSystem halted!\r\n";
> + SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr;
> +
> + StdErr = SystemTable->StdErr ? SystemTable->StdErr : SystemTable->ConOut;
> +
> + /*
> + * Print error message and halt the system.
> + *
> + * We have to open code MS x64 calling convention
> + * in assembly because here this convention may
> + * not be directly supported by C compiler.
> + */
> + asm volatile(
> + " call *%2 \n"
> + "0: hlt \n"
> + " jmp 0b \n"
> + : "+c" (StdErr) : "d" (err), "rm" (StdErr->OutputString)
> + : "rax", "r8", "r9", "r10", "r11", "memory");
Regardless of the hlt I think this would better be correct: As done
in various other places, you simply need to indicate "=d" as a
(dummy) output; since you clobber StdErr anyway, you could
simply use that one:
asm volatile(
" call *%2 \n"
"0: hlt \n"
" jmp 0b \n"
: "+c" (StdErr), "=d" (StdErr) : "1" (err), "rm" (StdErr->OutputString)
: "rax", "r8", "r9", "r10", "r11", "memory");
Otherwise I'd ask for consistency, i.e. for %rcx to be an input only,
too.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |