patch-1.3.31 linux/arch/i386/boot/compressed/head.S

Next file: linux/arch/i386/boot/setup.S
Previous file: linux/arch/i386/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v1.3.30/linux/arch/i386/boot/compressed/head.S linux/arch/i386/boot/compressed/head.S
@@ -9,7 +9,12 @@
  *
  * NOTE!!! Startup happens at absolute address 0x00001000, which is also where
  * the page directory will exist. The startup code will be overwritten by
- * the page directory.
+ * the page directory. [According to comments etc elsewhere on a compressed
+ * kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
+ *
+ * In SMP mode we keep this page safe. Really we ought to shuffle things and
+ * put the trampoline here. - AC. An SMP trampoline enters with %cx holding
+ * the stack base.
  *
  * Page 0 is deliberately kept safe, since System Management Mode code in 
  * laptops may need to access the BIOS data stored there.  This is also
@@ -19,10 +24,12 @@
 .text
 
 #define __ASSEMBLY__
+#include <linux/config.h>
 #include <linux/linkage.h>
 #include <asm/segment.h>
 
 	.globl startup_32
+	
 startup_32:
 	cld
 	cli
@@ -31,6 +38,24 @@
 	mov %ax,%es
 	mov %ax,%fs
 	mov %ax,%gs
+#ifdef CONFIG_SMP
+	orw %bx,%bx			# What state are we in BX=1 for SMP
+					# 0 for boot
+	jz  2f				# Initial boot
+
+/*
+ *	We are trampolining an SMP processor
+ */
+	mov %ax,%ss
+	xorl %eax,%eax			# Back to 0
+	mov  %cx,%ax			# SP low 16 bits
+	movl %eax,%esp
+	pushl 0				# Clear NT
+	popfl
+	ljmp $(KERNEL_CS), $0x100000    # Into C and sanity
+
+2:
+#endif
 	lss SYMBOL_NAME(stack_start),%esp
 	xorl %eax,%eax
 1:	incl %eax		# check that A20 really IS enabled
@@ -58,4 +83,6 @@
  * Do the decompression, and jump to the new kernel..
  */
 	call SYMBOL_NAME(decompress_kernel)
+	xorl %ebx,%ebx
 	ljmp $(KERNEL_CS), $0x100000
+

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov with Sam's (original) version
of this