Index: arch/ia32/src/boot/boot.S
===================================================================
--- arch/ia32/src/boot/boot.S	(revision 8ccec3c161d21bb34fa69cec1fd8d025f1a5e72e)
+++ arch/ia32/src/boot/boot.S	(revision 66def8d85720069e272ce3e7173a3b965e56b072)
@@ -1,4 +1,5 @@
 #
 # Copyright (C) 2001-2004 Jakub Jermar
+# Copyright (C) 2005-2006 Martin Decky
 # All rights reserved.
 #
@@ -32,4 +33,6 @@
 #include <arch/pm.h>
 
+#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE)
+
 .section K_TEXT_START, "ax"
 
@@ -39,18 +42,18 @@
 .code32
 .align 4
+.global multiboot_image_start
 multiboot_header:
 	.long MULTIBOOT_HEADER_MAGIC
 	.long MULTIBOOT_HEADER_FLAGS
 	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)	# checksum
-	.long multiboot_header + BOOT_OFFSET
-	.long unmapped_ktext_start + BOOT_OFFSET
+	.long multiboot_header
+	.long unmapped_ktext_start
 	.long 0
 	.long 0
-	.long multiboot_image_start + BOOT_OFFSET
+	.long multiboot_image_start
 	
 multiboot_image_start:
-	movl $BOOTSTRAP_OFFSET - 0x400, %esp				# initialize stack pointer
-	
-	lgdt protected_bootstrap_gdtr - 0x80000000			# initialize Global Descriptor Table register
+	movl $START_STACK, %esp			# initialize stack pointer
+	lgdt KA2PA(bootstrap_gdtr)		# initialize Global Descriptor Table register
 
 	movw $KDATA, %cx
@@ -58,18 +61,12 @@
 	movw %cx, %gs
 	movw %cx, %fs
-	movw %cx, %ds							# kernel data + stack
+	movw %cx, %ds					# kernel data + stack
 	movw %cx, %ss
 	
-	jmpl $KTEXT, $multiboot_meeting_point + BOOT_OFFSET
+	jmpl $KTEXT, $multiboot_meeting_point
 	multiboot_meeting_point:
 	
 	pushl %ebx							# save parameters from GRUB
 	pushl %eax
-	
-	movl $BOOTSTRAP_OFFSET + BOOT_OFFSET, %esi
-	movl $BOOTSTRAP_OFFSET, %edi
-	movl $_hardcoded_unmapped_size, %ecx
-	cld
-	rep movsb
 	
 	call map_kernel							# map kernel and turn paging on
@@ -171,5 +168,17 @@
 	invalid_boot:
 	
-	call main_bsp - BOOT_OFFSET					# never returns
+#ifdef CONFIG_SMP
+	
+	# copy AP bootstrap routines below 1 MB
+	
+	movl $BOOT_OFFSET, %esi
+	movl $AP_BOOT_OFFSET, %edi
+	movl $_hardcoded_unmapped_size, %ecx
+	cld
+	rep movsb
+	
+#endif
+	
+	call main_bsp								# never returns
 
 	cli
@@ -215,8 +224,2 @@
 page_directory:
 	.space 4096, 0
-
-.global real_bootstrap_gdtr_boot
-real_bootstrap_gdtr_boot:
-	.word selector(GDT_ITEMS)
-	.long KA2PA(gdt)-BOOT_OFFSET
-
