x86, realmode: Move SMP trampoline to unified realmode code
Migrated SMP trampoline code to the real mode blob. SMP trampoline code is not yet removed from .x86_trampoline because it is needed by the wakeup code. [ hpa: always enable compiling startup_32_smp in head_32.S... it is only a few instructions which go into .init on UP builds, and it makes the rest of the code less #ifdef ugly. ] Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@intel.com> Link: http://lkml.kernel.org/r/1336501366-28617-6-git-send-email-jarkko.sakkinen@intel.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:

committed by
H. Peter Anvin

parent
5a8c9aebe0
commit
48927bbb97
@@ -57,7 +57,7 @@
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/idle.h>
|
||||
#include <asm/trampoline.h>
|
||||
#include <asm/realmode.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/numa.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -73,6 +73,8 @@
|
||||
#include <asm/smpboot_hooks.h>
|
||||
#include <asm/i8259.h>
|
||||
|
||||
#include <asm/realmode.h>
|
||||
|
||||
/* State of each CPU */
|
||||
DEFINE_PER_CPU(int, cpu_state) = { 0 };
|
||||
|
||||
@@ -662,8 +664,12 @@ static void __cpuinit announce_cpu(int cpu, int apicid)
|
||||
*/
|
||||
static int __cpuinit do_boot_cpu(int apicid, int cpu)
|
||||
{
|
||||
volatile u32 *trampoline_status =
|
||||
(volatile u32 *) __va(real_mode_header.trampoline_status);
|
||||
/* start_ip had better be page-aligned! */
|
||||
unsigned long start_ip = real_mode_header.trampoline_data;
|
||||
|
||||
unsigned long boot_error = 0;
|
||||
unsigned long start_ip;
|
||||
int timeout;
|
||||
struct create_idle c_idle = {
|
||||
.cpu = cpu,
|
||||
@@ -713,9 +719,6 @@ do_rest:
|
||||
initial_code = (unsigned long)start_secondary;
|
||||
stack_start = c_idle.idle->thread.sp;
|
||||
|
||||
/* start_ip had better be page-aligned! */
|
||||
start_ip = trampoline_address();
|
||||
|
||||
/* So we see what's up */
|
||||
announce_cpu(cpu, apicid);
|
||||
|
||||
@@ -778,8 +781,7 @@ do_rest:
|
||||
pr_debug("CPU%d: has booted.\n", cpu);
|
||||
} else {
|
||||
boot_error = 1;
|
||||
if (*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status)
|
||||
== 0xA5A5A5A5)
|
||||
if (*trampoline_status == 0xA5A5A5A5)
|
||||
/* trampoline started but...? */
|
||||
pr_err("CPU%d: Stuck ??\n", cpu);
|
||||
else
|
||||
@@ -805,7 +807,7 @@ do_rest:
|
||||
}
|
||||
|
||||
/* mark "stuck" area as not stuck */
|
||||
*(volatile u32 *)TRAMPOLINE_SYM(trampoline_status) = 0;
|
||||
*trampoline_status = 0;
|
||||
|
||||
if (get_uv_system_type() != UV_NON_UNIQUE_APIC) {
|
||||
/*
|
||||
|
Reference in New Issue
Block a user