x86/boot: Annotate the Real Mode entry points

... because its already hard enough to follow.  Cross reference the locations
in C which set the entrypoints up, and state the alignment requirements and
entry conditions.

Drop a redundant .align 16, and panic() in do_boot_cpu() if the AP trampoline
isn't set up properly rather than blindly continuing and letting the APs
execute junk, or shifting part of the address into unrelated fields in ICR.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2019-05-13 10:35:38 +01:00
1 parent 3059621361
commit 4597226a35
3 files changed
+20 -2

No files matched your search

+7
View File
@@ -38,6 +38,13 @@
.code16
/*
* do_boot_cpu() programs the Startup-IPI to point here. Due to the SIPI
* format, the relocated entrypoint must be 4k aligned.
*
* It is entered in Real Mode, with %cs = trampoline_realmode_entry >> 4 and
* %ip = 0.
*/
GLOBAL(trampoline_realmode_entry)
mov %cs,%ax
mov %ax,%ds
+9 -1
View File
@@ -2,7 +2,15 @@
#define wakesym(sym) (sym - wakeup_start)
.align 16
/*
* acpi_sleep_prepare() programs the S3 wakeup vector to point here.
*
* The ACPI spec says that we shall be entered in Real Mode with:
* %cs = wakeup_start >> 4
* %ip = wakeup_start & 0xf
*
* As wakeup_start is 16-byte aligned, %ip is 0 in practice.
*/
ENTRY(wakeup_start)
cli
cld
+4 -1
View File
@@ -548,9 +548,12 @@ static int do_boot_cpu(int apicid, int cpu)
booting_cpu = cpu;
/* start_eip had better be page-aligned! */
start_eip = setup_trampoline();
/* start_eip needs be page aligned, and below the 1M boundary. */
if ( start_eip & ~0xff000 )
panic("AP trampoline %#lx not suitably positioned\n", start_eip);
/* So we see what's up */
if ( opt_cpu_info )
printk("Booting processor %d/%d eip %lx\n",
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.