Index: arch/ia32/src/boot/boot.S
===================================================================
--- arch/ia32/src/boot/boot.S	(revision b6d20a7ab3933967cc26974eb45f1330e641959c)
+++ arch/ia32/src/boot/boot.S	(revision 4533601fda687d5bb82b7297dab6960ee8eddd68)
@@ -108,4 +108,7 @@
 	movw %ax, %ss
 	
+	jmpl $KTEXT, $multiboot_meeting_point
+	multiboot_meeting_point:
+	
 	call map_kernel							# map kernel and turn paging on
 	
Index: arch/ia32/src/pm.c
===================================================================
--- arch/ia32/src/pm.c	(revision b6d20a7ab3933967cc26974eb45f1330e641959c)
+++ arch/ia32/src/pm.c	(revision 4533601fda687d5bb82b7297dab6960ee8eddd68)
@@ -73,6 +73,5 @@
 struct ptr_16_32 bsp_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt - BOOT_OFFSET) };
 struct ptr_16_32 ap_bootstrap_gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
-struct ptr_16_32 gdtr = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
-struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) };
+struct ptr_16_32 gdtr = { .limit = sizeof(gdt), .base = (__address) gdt };
 
 void gdt_setbase(struct descriptor *d, __address base)
@@ -167,12 +166,11 @@
 void pm_init(void)
 {
-	struct descriptor *gdt_p = (struct descriptor *) PA2KA(gdtr.base);
-
+	struct descriptor *gdt_p = (struct descriptor *) gdtr.base;
+	struct ptr_16_32 idtr;
 
 	/*
 	 * Update addresses in GDT and IDT to their virtual counterparts.
 	 */
-	if (config.cpu_active == 1)
-		gdtr.base = (__address) gdt;
+	idtr.limit = sizeof(idt);
 	idtr.base = (__address) idt;
 	__asm__ volatile ("lgdt %0\n" : : "m" (gdtr));
