[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] x86/trampoline: Document how the trampoline is laid out
This is, to the best of my knowledge, accurate. I am providing no comment on how sane I believe it to be. At the time of writing, the sizes of the regions are: offset size AP: 0x0000 0x00b0 S3: 0x00b0 0x0140 Boot: 0x01f0 0x1780 Heap: 0x1970 0xe690 Stack: 0xf000 0x1000 and wakeup_stack overlays boot_edd_info. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> CC: Frediano Ziglio <frediano.ziglio@xxxxxxxxx> CC: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx> --- xen/arch/x86/include/asm/trampoline.h | 55 ++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/include/asm/trampoline.h b/xen/arch/x86/include/asm/trampoline.h index 8c1e0b48c2c9..d801bea400dc 100644 --- a/xen/arch/x86/include/asm/trampoline.h +++ b/xen/arch/x86/include/asm/trampoline.h @@ -37,12 +37,63 @@ * manually as part of placement. */ +/* + * Layout of the trampoline. Logical areas, in ascending order: + * + * 1) AP boot: + * + * The INIT-SIPI-SIPI entrypoint. This logic is stack-less so the identity + * mapping (which must be executable) can at least be Read Only. + * + * 2) S3 resume: + * + * The S3 wakeup logic may need to interact with the BIOS, so needs a + * stack. The stack pointer is set to trampoline_phys + 4k and clobbers an + * undefined part of the the boot trampoline. The stack is only used with + * paging disabled. + * + * 3) Boot trampoline: + * + * This region houses various data used by the AP/S3 paths too. The boot + * trampoline collects data from the BIOS (E820/EDD/EDID/etc), so needs a + * stack. The stack pointer is set to trampoline_phys + 64k and has 4k + * space reserved. + * + * 4) Heap space: + * + * The first 1k of heap space is statically allocated for VESA information. + * + * The remainder of the heap is used by reloc(), logic which is otherwise + * outside of the trampoline, to collect the bootloader metadata (cmdline, + * module list, etc). It does so with a bump allocator starting from the + * end of the heap and allocating backwards. + * + * 5) Boot stack: + * + * 4k of space is reserved for the boot stack, at trampoline_phys + 64k. + * + * Therefore, when placed, it looks somewhat like this: + * + * +--- trampoline_phys + * v + * |<-------------------------------64K------------------------------->| + * |<-----4K----->| |<---4K--->| + * +----+----+----+-+---------------------------------------+----------+ + * | AP | S3 | Boot | Heap | Stack | + * +----+----+------+---------------------------------------+----------+ + * ^ <~~^ ^ <~~^ <~~^ + * | | +- trampoline_end[] | | + * | +--- S3 Stack reloc() allocator -+ | + * +------------------ trampoline_start[] Boot Stack ------------+ + */ + #include <xen/compiler.h> #include <xen/types.h> /* - * Start and end of the trampoline section, as linked into Xen. It is within - * the .init section and reclaimed after boot. + * Start and end of the trampoline section, as linked into Xen. This covers + * the AP, S3 and Boot regions, but not the heap or stack. It is within the + * .init section and reclaimed after boot. */ /* SAF-0-safe */ extern char trampoline_start[], trampoline_end[]; base-commit: 38febce5b35a7a4391906499b2046f01ec0129ca -- 2.39.5
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |