extern void NewTaskHeader(void); // Actually takes cdecl args
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);
#endif
}
+/*
+ *
+ */
+void Proc_ClearThread(tThread *Thread)
+{
+ Log_Warning("Proc", "TODO: Nuke address space etc");
+}
+
/**
* \brief Create a new kernel thread
*/
}
-/**
- * \fn void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize)
- * \brief Starts a user task
- */
-void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize)
+void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataSize)
{
- Uint *stack = (void*)Proc_MakeUserStack();
+ Uint *stack;
+ char **envp;
int i;
Uint delta;
Uint16 ss, cs;
- LOG("stack = 0x%x", stack);
// Copy Arguments
- stack = (void*)( (Uint)stack - DataSize );
+ stack = (void*)Proc_MakeUserStack();
+ if(!stack) {
+ Log_Error("Proc", "Unable to create user stack!");
+ Threads_Exit(0, -1);
+ }
+ stack -= (DataSize+7)/8;
+ LOG("stack = 0x%x", stack);
+ Log("stack = %p, DataSize = %i", stack, DataSize);
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;
- i ++;
- EnvP = &ArgV[i];
- for( i = 0; EnvP[i]; i++ ) EnvP[i] += delta;
+ envp = &ArgV[i+1];
+ for( i = 0; envp[i]; i++ ) envp[i] += delta;
// User Mode Segments
// 0x2B = 64-bit
ss = 0x23; cs = 0x2B;
// Arguments
- *--stack = (Uint)EnvP;
+ *--stack = (Uint)envp;
*--stack = (Uint)ArgV;
*--stack = (Uint)ArgC;
- while(*Bases)
- *--stack = *Bases++;
+ *--stack = Base;
Proc_StartProcess(ss, (Uint)stack, 0x202, cs, Entrypoint);
}