X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fproc.c;h=dfde359176f126b5d9d21ddb7fe3d221f1644522;hb=4bd32b966938a9f52c22d63cac0b22d6932e585d;hp=cb772f4b6657b2bc927dce5bb7f6403d14a635fc;hpb=d48818efad07523eba505813b60a82d13b35499a;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/proc.c b/Kernel/arch/x86/proc.c index cb772f4b..dfde3591 100644 --- a/Kernel/arch/x86/proc.c +++ b/Kernel/arch/x86/proc.c @@ -45,21 +45,22 @@ extern void APStartup(void); // 16-bit AP startup code extern Uint GetEIP(void); // start.asm extern Uint GetEIP_Sched(void); // proc.asm extern void NewTaskHeader(tThread *Thread, void *Fcn, int nArgs, ...); // Actually takes cdecl args -extern Uint Proc_CloneInt(Uint *ESP, Uint *CR3); +extern Uint Proc_CloneInt(Uint *ESP, Uint32 *CR3); extern Uint32 gaInitPageDir[1024]; // start.asm extern char Kernel_Stack_Top[]; -extern tShortSpinlock glThreadListLock; extern int giNumCPUs; extern int giNextTID; extern tThread gThreadZero; extern void Isr8(void); // Double Fault extern void Proc_ReturnToUser(tVAddr Handler, Uint Argument, tVAddr KernelStack); -extern void scheduler_return; // Return address in SchedulerBase -extern void IRQCommon; // Common IRQ handler code -extern void IRQCommon_handled; // IRQCommon call return location -extern void GetEIP_Sched_ret; // GetEIP call return location -extern void Threads_AddToDelete(tThread *Thread); +extern char scheduler_return[]; // Return address in SchedulerBase +extern char IRQCommon[]; // Common IRQ handler code +extern char IRQCommon_handled[]; // IRQCommon call return location +extern char GetEIP_Sched_ret[]; // GetEIP call return location extern void SwitchTasks(Uint NewSP, Uint *OldSP, Uint NewIP, Uint *OldIO, Uint CR3); +extern void Proc_InitialiseSSE(void); +extern void Proc_SaveSSE(Uint DestPtr); +extern void Proc_DisableSSE(void); // === PROTOTYPES === //void ArchThreads_Init(void); @@ -71,7 +72,7 @@ void Proc_IdleThread(void *Ptr); //void Proc_Start(void); //tThread *Proc_GetCurThread(void); void Proc_ChangeStack(void); - int Proc_NewKThread(void (*Fcn)(void*), void *Data); +// int Proc_NewKThread(void (*Fcn)(void*), void *Data); // int Proc_Clone(Uint *Err, Uint Flags); Uint Proc_MakeUserStack(void); //void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize); @@ -92,7 +93,9 @@ Uint8 gaAPIC_to_CPU[256] = {0}; int giProc_BootProcessorID = 0; tTSS gaTSSs[MAX_CPUS]; // TSS Array #endif -tCPU gaCPUs[MAX_CPUS]; +tCPU gaCPUs[MAX_CPUS] = { + {.Current = &gThreadZero} + }; tTSS *gTSSs = NULL; // Pointer to TSS array tTSS gTSS0 = {0}; // --- Error Recovery --- @@ -314,7 +317,7 @@ void ArchThreads_Init(void) outb(0x40, TIMER_DIVISOR&0xFF); // Low Byte of Divisor outb(0x40, (TIMER_DIVISOR>>8)&0xFF); // High Byte - Log("Timer Frequency %i.%03i Hz", + Log_Debug("Proc", "PIT Frequency %i.%03i Hz", TIMER_BASE/TIMER_DIVISOR, ((Uint64)TIMER_BASE*1000/TIMER_DIVISOR)%1000 ); @@ -371,6 +374,9 @@ void ArchThreads_Init(void) { Panic("OOM - No space for initial Per-Process Config"); } + + // Initialise SSE support + Proc_InitialiseSSE(); // Change Stacks Proc_ChangeStack(); @@ -551,6 +557,15 @@ void Proc_ChangeStack(void) __asm__ __volatile__ ("mov %0, %%ebp"::"r"(ebp)); } +void Proc_ClearThread(tThread *Thread) +{ + Log_Warning("Proc", "TODO: Nuke address space etc"); + if(Thread->SavedState.SSE) { + free(Thread->SavedState.SSE); + Thread->SavedState.SSE = NULL; + } +} + int Proc_NewKThread(void (*Fcn)(void*), void *Data) { Uint esp; @@ -579,7 +594,8 @@ int Proc_NewKThread(void (*Fcn)(void*), void *Data) newThread->SavedState.ESP = esp; newThread->SavedState.EIP = (Uint)&NewTaskHeader; - Log("New (KThread) %p, esp = %p\n", newThread->SavedState.EIP, newThread->SavedState.ESP); + newThread->SavedState.SSE = NULL; +// Log("New (KThread) %p, esp = %p", newThread->SavedState.EIP, newThread->SavedState.ESP); // MAGIC_BREAK(); Threads_AddActive(newThread); @@ -616,11 +632,13 @@ int Proc_Clone(Uint Flags) return 0; } newThread->SavedState.EIP = eip; + newThread->SavedState.SSE = NULL; + newThread->SavedState.bSSEModified = 0; // Check for errors if( newThread->MemState.CR3 == 0 ) { Log_Error("Proc", "Proc_Clone: MM_Clone failed"); - Threads_AddToDelete(newThread); + Threads_Delete(newThread); return -1; } @@ -656,8 +674,9 @@ int Proc_SpawnWorker(void (*Fcn)(void*), void *Data) // Save core machine state new->SavedState.ESP = new->KernelStack - sizeof(stack_contents); - new->SavedState.EBP = 0; new->SavedState.EIP = (Uint)NewTaskHeader; + new->SavedState.SSE = NULL; + new->SavedState.bSSEModified = 0; // Mark as active new->Status = THREAD_STAT_PREINIT; @@ -849,7 +868,6 @@ void Proc_DumpThreadCPUState(tThread *Thread) return ; } - #if 1 tVAddr diffFromScheduler = Thread->SavedState.EIP - (tVAddr)SwitchTasks; tVAddr diffFromClone = Thread->SavedState.EIP - (tVAddr)Proc_CloneInt; tVAddr diffFromSpawn = Thread->SavedState.EIP - (tVAddr)NewTaskHeader; @@ -867,24 +885,6 @@ void Proc_DumpThreadCPUState(tThread *Thread) } if( diffFromScheduler > 0 && diffFromScheduler < 128 ) // When I last checked, GetEIP was at .+0x30 - #else - Uint32 data[3]; - MM_ReadFromAddrSpace(Thread->MemState.CR3, Thread->SavedState.EBP, data, 12); - if( data[1] == (Uint32)&IRQCommon + 25 ) - { - tRegs *regs = (void *) data[2]; - Log(" oldebp = 0x%08x, ret = 0x%08x, regs = 0x%x", - data[0], data[1], data[2] - ); - // [EBP] = old EBP - // [EBP+0x04] = Return Addr - // [EBP+0x08] = Arg 1 (CPU Number) - // [EBP+0x0C] = Arg 2 (Thread) - // [EBP+0x10] = GS (start of tRegs) - Log(" IRQ%i from %02x:%08x", regs->int_num regs->cs, regs->eip); - } - if( stack[1] == (Uint32)&scheduler_return ) - #endif { // Scheduled out Log(" At %04x:%08x", Thread->SavedState.UserCS, Thread->SavedState.UserEIP); @@ -899,7 +899,7 @@ void Proc_Reschedule(void) tThread *nextthread, *curthread; int cpu = GetCPUNum(); - // TODO: Wait for it? + // TODO: Wait for the lock? if(IS_LOCKED(&glThreadListLock)) return; curthread = Proc_GetCurThread(); @@ -925,11 +925,20 @@ void Proc_Reschedule(void) gTSSs[cpu].ESP0 = nextthread->KernelStack-4; __asm__ __volatile__("mov %0, %%db0\n\t" : : "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.ESP, &curthread->SavedState.ESP, nextthread->SavedState.EIP, &curthread->SavedState.EIP, nextthread->MemState.CR3 ); + return ; }