From: John Hodge Date: Sun, 13 Feb 2011 04:28:04 +0000 (+0800) Subject: Fixed a bug where stack was accessed after address space switch X-Git-Tag: rel0.07~4 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;ds=inline;h=22e816cf8f9562e10f42d5cb6c4a9b63e6f35ba3;p=tpg%2Facess2.git Fixed a bug where stack was accessed after address space switch --- 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 }