extern Uint SaveState(Uint *RSP, Uint *Regs);
extern Uint Proc_CloneInt(Uint *RSP, Uint *CR3);
extern void NewTaskHeader(void); // Actually takes cdecl args
+extern void Proc_InitialiseSSE(void);
+extern void Proc_SaveSSE(Uint DestPtr);
+extern void Proc_DisableSSE(void);
extern Uint64 gInitialPML4[512]; // start.asm
-extern tShortSpinlock glThreadListLock;
extern int giNumCPUs;
extern int giNextTID;
extern int giTotalTickets;
void Proc_IdleTask(void *unused);
//void Proc_Start(void);
//tThread *Proc_GetCurThread(void);
- int Proc_NewKThread(void (*Fcn)(void*), void *Data);
+// int Proc_NewKThread(void (*Fcn)(void*), void *Data);
// int Proc_Clone(Uint *Err, Uint Flags);
// int Proc_SpawnWorker(void);
Uint Proc_MakeUserStack(void);
Warning("Oh, hell, Unable to allocate PPD for Thread#0");
}
+ Proc_InitialiseSSE();
+
Log_Log("Proc", "Multithreading initialised");
}
#endif
}
+/*
+ *
+ */
+void Proc_ClearThread(tThread *Thread)
+{
+ Log_Warning("Proc", "TODO: Nuke address space etc");
+}
+
/**
* \brief Create a new kernel thread
*/
newThread->SavedState.RSP = rsp;
newThread->SavedState.RIP = (Uint)&NewTaskHeader;
+ newThread->SavedState.SSE = NULL;
// Log("New (KThread) %p, rsp = %p\n", newThread->SavedState.RIP, newThread->SavedState.RSP);
// MAGIC_BREAK();
if(rip == 0) return 0; // Child
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
+ newThread->SavedState.SSE = NULL;
// DEBUG
#if 0
new->SavedState.RSP = new->KernelStack - sizeof(stack_contents);
new->SavedState.RIP = (Uint)&NewTaskHeader;
+ new->SavedState.SSE = NULL;
// Log("New (Worker) %p, rsp = %p\n", new->SavedState.RIP, new->SavedState.RSP);
return base + USER_STACK_SZ;
}
-
void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataSize)
{
- Uint *stack = (void*)Proc_MakeUserStack();
- char **envp;
+ Uint *stack;
int i;
- Uint delta;
+ char **envp = NULL;
Uint16 ss, cs;
- LOG("stack = 0x%x", stack);
// Copy Arguments
- stack = (void*)( Proc_MakeUserStack() - DataSize );
+ stack = (void*)Proc_MakeUserStack();
+ if(!stack) {
+ Log_Error("Proc", "Unable to create user stack!");
+ Threads_Exit(0, -1);
+ }
+ stack -= (DataSize+7)/8;
memcpy( stack, ArgV, DataSize );
free(ArgV);
// Adjust Arguments and environment
- delta = (Uint)stack - (Uint)ArgV;
- ArgV = (char**)stack;
- for( i = 0; ArgV[i]; i++ ) ArgV[i] += delta;
- envp = &ArgV[i+1];
- for( i = 0; envp[i]; i++ ) envp[i] += delta;
+ if(DataSize)
+ {
+ Uint delta = (Uint)stack - (Uint)ArgV;
+ ArgV = (char**)stack;
+ for( i = 0; ArgV[i]; i++ ) ArgV[i] += delta;
+ envp = &ArgV[i+1];
+ for( i = 0; envp[i]; i++ ) envp[i] += delta;
+ }
// User Mode Segments
// 0x2B = 64-bit
gTSSs[cpu].RSP0 = nextthread->KernelStack-4;
__asm__ __volatile__ ("mov %0, %%db0" : : "r" (nextthread));
+ // Save FPU/MMX/XMM/SSE state
+ if( curthread->SavedState.SSE )
+ {
+ Proc_SaveSSE( ((Uint)curthread->SavedState.SSE + 0xF) & ~0xF );
+ curthread->SavedState.bSSEModified = 0;
+ Proc_DisableSSE();
+ }
+
SwitchTasks(
nextthread->SavedState.RSP, &curthread->SavedState.RSP,
nextthread->SavedState.RIP, &curthread->SavedState.RIP,