On 10/12/2019 07:52, Jan Beulich wrote:
> On 09.12.2019 17:42, Andrew Cooper wrote:
>> On 09/12/2019 15:20, Jan Beulich wrote:
>>> On 06.12.2019 20:34, Andrew Cooper wrote:
>>>> +Objects
>>>> +~~~~~~~
>>>> +
>>>> +To begin with, most object files are compiled and linked.  This includes 
>>>> the
>>>> +Multiboot 1 and 2 headers and entrypoints, including the Multiboot 2 tags 
>>>> for
>>>> +EFI extensions.  When ``CONFIG_PVH_GUEST`` is selected at build time, this
>>>> +includes the PVH entrypoint and associated ELF notes.
>>>> +
>>>> +Depending on whether the compiler supports 
>>>> ``__attribute__((__ms_abi__))`` or
>>>> +not, either an EFI stub is included which nops/fails applicable setup 
>>>> calls,
>>>> +or full EFI support is included.
>>> Perhaps also mention that the linker needs to support the necessary
>>> binary output format? And perhaps "setup and runtime calls"?
>> Link time behaviour is (deliberately) in a later section.
> I realize(d) this, but the statement above is simply not true without
> also mentioning required linker capabilities: The object files won't
> have "full EFI support included" in this case. So I'd expect a "see
> also" here at the very least.

Note how XEN_BUILD_EFI and XEN_BUILD_PE are different, one by compiler
support for ms_abi, and one by linker support for i386pep.

Linker support for i386pep is not required at all to get EFI support in
Xen.  This is how the MB2+EFI path is constructed.


>
>>>> +Protocols and entrypoints
>>>> +~~~~~~~~~~~~~~~~~~~~~~~~~
>>>> +
>>>> +All headers and tags are built in ``xen/arch/x86/boot/head.S``
>>>> +
>>>> +The Multiboot 1 headers request aligned modules and memory information.  
>>>> Entry
>>>> +is via the start of the binary image, which is the ``start`` symbol.  This
>>>> +entrypoint must be started in 32bit mode.
>>>> +
>>>> +The Multiboot 2 headers are more flexible, and in addition request that 
>>>> the
>>>> +image be loaded as high as possible below the 4G boundary, with 2M 
>>>> alignment.
>>>> +Entry is still via the ``start`` symbol as with MB1.
>>> Perhaps explicitly (re)state this is in 32-bit mode?
>>>
>>>> +Headers for the EFI MB2 extensions are also present.  These request that
>>>> +``ExitBootServices()`` not be called, and register ``__efi_mb2_start`` as 
>>>> an
>>>> +alternative entrypoint, entered in 64bit mode.
>>>> +
>>>> +If ``CONFIG_PVH_GUEST`` was selected at build time, an Elf note is 
>>>> included
>>>> +which indicates the ability to use the PVH boot protocol, and registers
>>>> +``__pvh_start`` as the entrypoint, entered in 32bit mode.
>>>> +
>>>> +
>>>> +xen.gz
>>>> +~~~~~~
>>>> +
>>>> +The objects are linked together to form ``xen-syms`` which is an ELF64
>>>> +executable with full debugging symbols.  ``xen.gz`` is formed by stripping
>>>> +``xen-syms``, then repackaging the result as an ELF32 object with a single
>>>> +load section at 2MB, and ``gzip``-ing the result.  Despite the ELF32 
>>>> having a
>>>> +fixed load address, its contents are relocatable.
>>> This is a little ambiguous I guess - most of the code is PIC and as
>>> such relocatable, but not in a way a boot loader could arrange for.
>> I don't follow your concern.
>>
>> Everything which needs to be is position independent (subject to being
>> loaded on a 2M boundary IIRC), and this property is requested by the MB2
>> header.
> Oh, sorry, it had been too many years of sym_phys() before it became
> sym_offs(). You're right.

Yeah - it was fixed in the MB1 days, but this is no longer the case.

>
>>>> +Any bootloader which unzips the binary and follows the ELF headers will 
>>>> place
>>>> +it at the 2M boundary and jump to ``start`` which is the identified entry
>>>> +point.  However, Xen depends on being entered with the MB1 or MB2 
>>>> protocols,
>>>> +and will terminate otherwise.
>>>> +
>>>> +The MB2+EFI entrypoint depends on being entered with the MB2 protocol, and
>>>> +will terminate if the entry protocol is wrong, or if EFI details aren't
>>>> +provided, or if EFI Boot Services are not available.
>>>> +
>>>> +
>>>> +xen.efi
>>>> +~~~~~~~
>>>> +
>>>> +When a PEI-capable toolchain is found, the objects are linked together 
>>>> and a
>>>> +PE64 binary is created.  It can be run directly from the EFI shell, and 
>>>> has
>>> I think it's commonly called PE32+, not PE64.
>> Ok., because by definition, it can stack.
> How does stacking come into play here?

Mis-paste on my behalf (that text was an early version discussing
chainloading).  That should have ended at ok.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to