x86/boot: Rationalise stack handling during early boot

The top (numerically higher addresses) of cpu0_stack[] contains the BSP's
cpu_info block.  Logic in Xen expects this to be initialised to 0, but this
area of stack is also used during early boot.

Update the head.S code to avoid using the cpu_info block.  Additionally,
update the stack_start variable to match, which avoids __high_start() and
efi_arch_post_exit_boot() needing to make the adjustment manually.

Finally, leave a big warning by the BIOS BSS initialisation, because it is by
no means obvious that the stack doesn't survive the REP STOS.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2020-01-09 14:29:53 +00:00
1 parent 09488b2bb7
commit fae249d234
4 files changed
+18 -14

No files matched your search

+7 -3
View File
@@ -400,7 +400,7 @@ __pvh_start:
sub $sym_offs(1b), %esi
/* Set up stack. */
lea STACK_SIZE + sym_esi(cpu0_stack), %esp
lea STACK_SIZE - CPUINFO_sizeof + sym_esi(cpu0_stack), %esp
mov %ebx, sym_esi(pvh_start_info_pa)
@@ -447,7 +447,7 @@ __start:
sub $sym_offs(1b), %esi
/* Set up stack. */
lea STACK_SIZE + sym_esi(cpu0_stack), %esp
lea STACK_SIZE - CPUINFO_sizeof + sym_esi(cpu0_stack), %esp
/* Bootloaders may set multiboot{1,2}.mem_lower to a nonzero value. */
xor %edx,%edx
@@ -616,7 +616,11 @@ trampoline_setup:
cmpb $0,sym_fs(efi_platform)
jnz 1f
/* Initialize BSS (no nasty surprises!). */
/*
* Initialise the BSS.
*
* !!! WARNING - also zeroes the current stack !!!
*/
lea sym_esi(__bss_start), %edi
lea sym_esi(__bss_end), %ecx
sub %edi,%ecx
+1 -2
View File
@@ -16,7 +16,6 @@ ENTRY(__high_start)
mov %rcx,%cr4
mov stack_start(%rip),%rsp
or $(STACK_SIZE-CPUINFO_sizeof),%rsp
/* Reset EFLAGS (subsumes CLI and CLD). */
pushq $0
@@ -42,7 +41,7 @@ multiboot_ptr:
.long 0
GLOBAL(stack_start)
.quad cpu0_stack
.quad cpu0_stack + STACK_SIZE - CPUINFO_sizeof
.section .data.page_aligned, "aw", @progbits
.align PAGE_SIZE, 0
+8 -7
View File
@@ -249,23 +249,24 @@ static void __init noreturn efi_arch_post_exit_boot(void)
"or $"__stringify(X86_CR4_PGE)", %[cr4]\n\t"
"mov %[cr4], %%cr4\n\t"
#endif
"movabs $__start_xen, %[rip]\n\t"
"lgdt boot_gdtr(%%rip)\n\t"
"mov stack_start(%%rip), %%rsp\n\t"
"mov %[ds], %%ss\n\t"
"mov %[ds], %%ds\n\t"
"mov %[ds], %%es\n\t"
"mov %[ds], %%fs\n\t"
"mov %[ds], %%gs\n\t"
"movl %[cs], 8(%%rsp)\n\t"
"mov %[rip], (%%rsp)\n\t"
"lretq %[stkoff]-16"
/* Jump to higher mappings. */
"mov stack_start(%%rip), %%rsp\n\t"
"movabs $__start_xen, %[rip]\n\t"
"push %[cs]\n\t"
"push %[rip]\n\t"
"lretq"
: [rip] "=&r" (efer/* any dead 64-bit variable */),
[cr4] "+&r" (cr4)
: [cr3] "r" (idle_pg_table),
[cs] "ir" (__HYPERVISOR_CS),
[cs] "i" (__HYPERVISOR_CS),
[ds] "r" (__HYPERVISOR_DS),
[stkoff] "i" (STACK_SIZE - sizeof(struct cpu_info)),
"D" (&mbi)
: "memory" );
unreachable();
+2 -2
View File
@@ -554,7 +554,7 @@ static int do_boot_cpu(int apicid, int cpu)
printk("Booting processor %d/%d eip %lx\n",
cpu, apicid, start_eip);
stack_start = stack_base[cpu];
stack_start = stack_base[cpu] + STACK_SIZE - sizeof(struct cpu_info);
/* This grunge runs the startup process for the targeted processor. */
@@ -1084,7 +1084,7 @@ void __init smp_prepare_cpus(void)
boot_cpu_physical_apicid = get_apic_id();
x86_cpu_to_apicid[0] = boot_cpu_physical_apicid;
stack_base[0] = stack_start;
stack_base[0] = (void *)((unsigned long)stack_start & ~(STACK_SIZE - 1));
rc = setup_cpu_root_pgt(0);
if ( rc )
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.