extern int GetCPUNum(void); // start.asm
extern Uint32 gaInitPageDir[1024]; // start.asm
extern char Kernel_Stack_Top[];
-extern tSpinlock glThreadListLock;
+extern tShortSpinlock glThreadListLock;
extern int giNumCPUs;
extern int giNextTID;
extern tThread gThreadZero;
extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags);
extern void Isr8(void); // Double Fault
-extern void Proc_ReturnToUser(void);
+extern void Proc_ReturnToUser(tVAddr Handler, Uint Argument);
// === PROTOTYPES ===
void ArchThreads_Init(void);
Uint tmpEbp, oldEsp = esp;
// Set CR3
+ #if USE_PAE
+ # warning "PAE Unimplemented"
+ #else
newThread->MemState.CR3 = cur->MemState.CR3;
+ #endif
// Create new KStack
newThread->KernelStack = MM_NewKStack();
__asm__ __volatile__ ("mov %0, %%db0" : : "r" (newThread) );
#if USE_MP
// ACK the interrupt
- if(GetCPUNum())
+ if( GetCPUNum() )
gpMP_LocalAPIC->EOI.Val = 0;
else
#endif
// Set EIP as parent
new->SavedState.EIP = eip;
// Mark as active
- new->Status = THREAD_STAT_ACTIVE;
Threads_AddActive( new );
return new->TID;
{
// Rewinds the stack and calls the user function
// Never returns
- __asm__ __volatile__ ("mov %0, %%ebp;\n\tcall Proc_ReturnToUser" :: "r"(Thread->FaultHandler));
+ Proc_ReturnToUser( Thread->FaultHandler, Thread->CurFaultNum );
for(;;);
}