From 22e816cf8f9562e10f42d5cb6c4a9b63e6f35ba3 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Sun, 13 Feb 2011 12:28:04 +0800
Subject: [PATCH] Fixed a bug where stack was accessed after address space
 switch

---
 Kernel/arch/x86/proc.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/Kernel/arch/x86/proc.c b/Kernel/arch/x86/proc.c
index 55b9b170..7366520f 100644
--- a/Kernel/arch/x86/proc.c
+++ b/Kernel/arch/x86/proc.c
@@ -925,13 +925,6 @@ void Proc_Scheduler(int CPU)
 	// Update Kernel Stack pointer
 	gTSSs[CPU].ESP0 = thread->KernelStack-4;
 	
-	// Set address space
-	#if USE_PAE
-	# error "Todo: Implement PAE Address space switching"
-	#else
-	__asm__ __volatile__ ("mov %0, %%cr3" : : "a" (thread->MemState.CR3));
-	#endif
-	
 	#if 0
 	if(thread->SavedState.ESP > 0xC0000000
 	&& thread->SavedState.ESP < thread->KernelStack-0x2000) {
@@ -939,14 +932,20 @@ void Proc_Scheduler(int CPU)
 	}
 	#endif
 	
+	#if USE_PAE
+	# error "Todo: Implement PAE Address space switching"
+	#else
 	// Switch threads
 	__asm__ __volatile__ (
+		"mov %4, %%cr3\n\t"	// Set address space
 		"mov %1, %%esp\n\t"	// Restore ESP
 		"mov %2, %%ebp\n\t"	// and EBP
 		"jmp *%3" : :	// And return to where we saved state (Proc_Clone or Proc_Scheduler)
 		"a"(SWITCH_MAGIC), "b"(thread->SavedState.ESP),
-		"d"(thread->SavedState.EBP), "c"(thread->SavedState.EIP)
+		"d"(thread->SavedState.EBP), "c"(thread->SavedState.EIP),
+		"r"(thread->MemState.CR3)
 		);
+	#endif
 	for(;;);	// Shouldn't reach here
 }
 
-- 
GitLab