This patch fixes the problem of secondary cpus not coming up over a reboot. This problem was seen when a kernel compiled for non default (16MB) location is booted. Signed-off-by: Vivek Goyal --- linux-2.6.10-rc3-mm1-changes-root/arch/i386/kernel/trampoline.S | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) diff -puN arch/i386/kernel/trampoline.S~boot_ap_for_nondefault_kernel arch/i386/kernel/trampoline.S --- linux-2.6.10-rc3-mm1-changes/arch/i386/kernel/trampoline.S~boot_ap_for_nondefault_kernel 2004-12-22 16:36:50.000000000 +0530 +++ linux-2.6.10-rc3-mm1-changes-root/arch/i386/kernel/trampoline.S 2004-12-22 16:47:54.000000000 +0530 @@ -51,8 +51,14 @@ r_base = . movl $0xA5A5A5A5, trampoline_data - r_base # write marker for master knows we're running + /* GDT tables in non default location kernel can be beyond 16MB and + * lgdt will not be able to load the address as in real mode default + * operand size is 16bit. Use lgdtl instead to force operand size + * to 32 bit. + */ + lidt boot_idt - r_base # load idt with 0, 0 - lgdt boot_gdt - r_base # load gdt with whatever is appropriate + lgdtl boot_gdt - r_base # load gdt with whatever is appropriate xor %ax, %ax inc %ax # protected mode (PE) bit _