mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
3059621361
commit
4597226a35
3 files changed
+20
-2
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||