Index: kernel/arch/ppc32/src/exception.S
===================================================================
--- kernel/arch/ppc32/src/exception.S	(revision 087129655518818663e2409b7ecc056ac1470f17)
+++ kernel/arch/ppc32/src/exception.S	(revision 07e28f85b1f999b56eed801d80fd58294df652a4)
@@ -254,20 +254,29 @@
 .org 0x4000
 jump_to_kernel:
+	mfsrr1 r5
+	andi. r5, r5, MSR_PR
+	bne 1f
+		# Previous mode was kernel.
+		# We can construct a proper frame linkage.
+		
+		mfsrr0 r12
+		stw r12, ISTATE_OFFSET_LR_FRAME(sp)
+		mfsprg2 r12
+		stw r12, ISTATE_OFFSET_SP_FRAME(sp)
+	1:
+
 	lis r12, iret@ha
 	addi r12, r12, iret@l
 	mtlr r12
-	
+
 	lis r12, exc_dispatch@ha
 	addi r12, r12, exc_dispatch@l
 	mtsrr0 r12
-	
+
+	mfmsr r12
 	mfsrr1 r5
-
-	andi. r5, r5, MSR_PR
-
 	andi. r5, r5, MSR_FP
-	mfmsr r12
 	or r12, r12, r5		# Propagate MSR_FP from SRR1 to MSR
-	ori r12, r12, (MSR_IR | MSR_DR)@l
+	ori r12, r12, (MSR_IR | MSR_DR)
 	mtsrr1 r12
 	
@@ -290,5 +299,5 @@
 	mfmsr r12
 	or r12, r12, r0		# Propagate MSR_FP from SRR1 to MSR
-	ori r12, r12, (MSR_IR | MSR_DR)@l
+	ori r12, r12, (MSR_IR | MSR_DR)
 	mtsrr1 r12
 	
