Index: arch/ia32/src/smp/ap.S
===================================================================
--- arch/ia32/src/smp/ap.S	(revision 6153749a78decbb64be28612ff10ab2897c4beea)
+++ arch/ia32/src/smp/ap.S	(revision c0b45fa002ea4e833eba5897c34d7a0eb5699c1e)
@@ -70,4 +70,6 @@
 	call map_kernel					# map kernel and turn paging on
 	
+	addl $0x80000000, %esp			# PA2KA(ctx.sp)
+	
 	jmpl $KTEXT, $main_ap
 
Index: arch/ia32/src/smp/smp.c
===================================================================
--- arch/ia32/src/smp/smp.c	(revision 6153749a78decbb64be28612ff10ab2897c4beea)
+++ arch/ia32/src/smp/smp.c	(revision c0b45fa002ea4e833eba5897c34d7a0eb5699c1e)
@@ -144,19 +144,17 @@
 		memcpy(gdt_new, gdt, GDT_ITEMS*sizeof(struct descriptor));
 		memsetb((__address)(&gdt_new[TSS_DES]), sizeof(struct descriptor), 0);
-		real_bootstrap_gdtr.base = KA2PA((__address) gdt_new);
+		((struct ptr_16_32 *) PA2KA((__address) &real_bootstrap_gdtr))->base = KA2PA((__address) gdt_new);
 		gdtr.base = (__address) gdt_new;
 
 		if (l_apic_send_init_ipi(ops->cpu_apic_id(i))) {
 			/*
-		         * There may be just one AP being initialized at
+			 * There may be just one AP being initialized at
 			 * the time. After it comes completely up, it is
 			 * supposed to wake us up.
-		         */
+			 */
 			if (waitq_sleep_timeout(&ap_completion_wq, 1000000, SYNCH_BLOCKING) == ESYNCH_TIMEOUT)
 				printf("%s: waiting for cpu%d (APIC ID = %d) timed out\n", __FUNCTION__, config.cpu_active > i ? config.cpu_active : i, ops->cpu_apic_id(i));
-		}
-		else {
+		} else
 			printf("INIT IPI for l_apic%d failed\n", ops->cpu_apic_id(i));
-		}
 	}
 
