#include <hal_proc.h>
// === FLAGS ===
-#define DEBUG_TRACE_SWITCH 1
+#define DEBUG_TRACE_SWITCH 0
#define BREAK_ON_SWITCH 0 // Break into bochs debugger on a task switch
// === CONSTANTS ===
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);
__asm__ __volatile__("sti");
#endif
MM_FinishVirtualInit();
- Log("Multithreading started");
+ Log_Log("Proc", "Multithreading started");
}
/**
#endif
}
+/*
+ *
+ */
+void Proc_ClearThread(tThread *Thread)
+{
+ Log_Warning("Proc", "TODO: Nuke address space etc");
+}
+
+/**
+ * \brief Create a new kernel thread
+ */
int Proc_NewKThread(void (*Fcn)(void*), void *Data)
{
Uint rsp;
tThread *newThread, *cur;
cur = Proc_GetCurThread();
- newThread = Threads_CloneTCB(NULL, 0);
+ newThread = Threads_CloneTCB(0);
if(!newThread) return -1;
// Set CR3
}
// Create new TCB
- newThread = Threads_CloneTCB(NULL, Flags);
+ newThread = Threads_CloneTCB(Flags);
if(!newThread) return -1;
// Save core machine state
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
- // DEBUG
+ // DEBUG
+ #if 0
Log("New (Clone) %p, rsp = %p, cr3 = %p", rip, newThread->SavedState.RSP, newThread->MemState.CR3);
{
Uint cr3;
__asm__ __volatile__ ("mov %%cr3, %0" : "=r" (cr3));
Log("Current CR3 = 0x%x, PADDR(RSP) = 0x%x", cr3, MM_GetPhysAddr(newThread->SavedState.RSP));
}
+ #endif
// /DEBUG
// Lock list and add to active
for( ; i < USER_STACK_SZ/0x1000; i++ )
{
tPAddr alloc = MM_Allocate( base + (i<<12) );
- Log_Debug("Proc", "Proc_MakeUserStack: alloc = %P", alloc);
if( !alloc )
{
// Error
}
-/**
- * \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);
}
CS, SS);
Threads_Exit(0, -1);
}
- Log("Proc_StartProcess: (SS=%x, Stack=%p, Flags=%x, CS=%x, IP=%p)",
- SS, Stack, Flags, CS, IP);
- MM_DumpTables(0, USER_MAX);
+// Log("Proc_StartProcess: (SS=%x, Stack=%p, Flags=%x, CS=%x, IP=%p)", SS, Stack, Flags, CS, IP);
+// MM_DumpTables(0, USER_MAX);
if(CS == 0x1B)
{
// 32-bit return
return ;
#if DEBUG_TRACE_SWITCH
- LogF("\nSwitching to task %i, CR3 = 0x%x, RIP = %p, RSP = %p, KStack = %p\n",
- nextthread->TID,
+ LogF("\nSwitching to task CR3 = 0x%x, RIP = %p, RSP = %p - %i (%s)\n",
nextthread->MemState.CR3,
nextthread->SavedState.RIP,
nextthread->SavedState.RSP,
- nextthread->KernelStack
+ nextthread->TID,
+ nextthread->ThreadName
);
#endif