X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=99fa7e60ffbbba1110098a93e746fff3ff8d571c;hb=717454930aa0e255517c68c837927deac49bd78e;hp=573947021382b9445b16dd0a1ee6b0ac0fd59267;hpb=25f7e9ab0f31ca486c0c981a406d381e160637a4;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.c b/Kernel/arch/x86_64/proc.c index 57394702..99fa7e60 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -42,9 +43,7 @@ extern int giNextTID; extern int giTotalTickets; extern int giNumActiveThreads; extern tThread gThreadZero; -//extern tThread *Threads_GetNextToRun(int CPU); extern void Threads_Dump(void); -extern tThread *Threads_CloneTCB(Uint *Err, Uint Flags); extern void Proc_ReturnToUser(void); extern int GetCPUNum(void); @@ -54,12 +53,17 @@ void ArchThreads_Init(void); void MP_StartAP(int CPU); void MP_SendIPI(Uint8 APICID, int Vector, int DeliveryMode); #endif -void Proc_Start(void); -tThread *Proc_GetCurThread(void); +//void Proc_Start(void); +//tThread *Proc_GetCurThread(void); void Proc_ChangeStack(void); - int Proc_Clone(Uint *Err, Uint Flags); +// int Proc_Clone(Uint *Err, Uint Flags); +// int Proc_SpawnWorker(void); +Uint Proc_MakeUserStack(void); +void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize); void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP); + int Proc_Demote(Uint *Err, int Dest, tRegs *Regs); void Proc_CallFaultHandler(tThread *Thread); +void Proc_DumpThreadCPUState(tThread *Thread); void Proc_Scheduler(int CPU); // === GLOBALS === @@ -304,7 +308,10 @@ void ArchThreads_Init(void) outb(0x40, (TIMER_DIVISOR>>8)&0xFF); // High Byte // Create Per-Process Data Block - MM_Allocate(MM_PPD_CFG); + if( !MM_Allocate(MM_PPD_CFG) ) + { + Warning("Oh, hell, Unable to allocate PPD for Thread#0"); + } // Change Stacks Proc_ChangeStack(); @@ -386,7 +393,7 @@ void Proc_Start(void) if(Proc_Clone(0, 0) == 0) { gaCPUs[0].IdleThread = Proc_GetCurThread(); - gaCPUs[0].IdleThread->ThreadName = "Idle Thread"; + gaCPUs[0].IdleThread->ThreadName = (char*)"Idle Thread"; Threads_SetPriority( gaCPUs[0].IdleThread, -1 ); // Never called randomly gaCPUs[0].IdleThread->Quantum = 1; // 1 slice quantum for(;;) HALT(); // Just yeilds @@ -611,8 +618,17 @@ Uint Proc_MakeUserStack(void) if(i != -1) return 0; // Allocate Stack - Allocate incrementally to clean up MM_Dump output - for( i = 0; i < USER_STACK_SZ/4069; i++ ) - MM_Allocate( base + (i<<12) ); + for( i = 0; i < USER_STACK_SZ/0x1000; i++ ) + { + if( !MM_Allocate( base + (i<<12) ) ) + { + // Error + Log_Error("Proc", "Unable to allocate user stack (%i pages requested)", USER_STACK_SZ/0x1000); + while( i -- ) + MM_Deallocate( base + (i<<12) ); + return 0; + } + } return base + USER_STACK_SZ; } @@ -724,6 +740,10 @@ void Proc_CallFaultHandler(tThread *Thread) for(;;); } +void Proc_DumpThreadCPUState(tThread *Thread) +{ +} + /** * \fn void Proc_Scheduler(int CPU) * \brief Swap current thread and clears dead threads