X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.c;h=934bee90784e9b57c57f917fffdd7c77cf63c7cf;hb=fae7520daf355d4646ba73c46a2e701e5ef4e9f5;hp=a1d5c86ade3314d0a42331c02df3040922a07a14;hpb=2fc80fd2e1db2c0a2c7661bee4ea03bb49ad7fbb;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.c b/Kernel/arch/x86_64/proc.c index a1d5c86a..934bee90 100644 --- a/Kernel/arch/x86_64/proc.c +++ b/Kernel/arch/x86_64/proc.c @@ -22,8 +22,8 @@ // === IMPORTS === extern tGDT gGDT[]; -extern void APStartup(); // 16-bit AP startup code -extern Uint GetRIP(); // start.asm +extern void APStartup(void); // 16-bit AP startup code +extern Uint GetRIP(void); // start.asm extern Uint64 gInitialPML4[512]; // start.asm extern void gInitialKernelStack; extern tSpinlock glThreadListLock; @@ -42,18 +42,18 @@ extern void Proc_ReturnToUser(void); extern void GetCPUNum(void); // === PROTOTYPES === -void ArchThreads_Init(); +void ArchThreads_Init(void); #if USE_MP void MP_StartAP(int CPU); void MP_SendIPI(Uint8 APICID, int Vector, int DeliveryMode); #endif -void Proc_Start(); -tThread *Proc_GetCurThread(); -void Proc_ChangeStack(); +void Proc_Start(void); +tThread *Proc_GetCurThread(void); +void Proc_ChangeStack(void); int Proc_Clone(Uint *Err, Uint Flags); void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP); void Proc_CallFaultHandler(tThread *Thread); -void Proc_Scheduler(); +void Proc_Scheduler(int CPU); // === GLOBALS === // --- Multiprocessing --- @@ -73,10 +73,10 @@ Uint32 gaDoubleFaultStack[1024]; // === CODE === /** - * \fn void ArchThreads_Init() + * \fn void ArchThreads_Init(void) * \brief Starts the process scheduler */ -void ArchThreads_Init() +void ArchThreads_Init(void) { Uint pos = 0; @@ -333,23 +333,22 @@ void MP_SendIPI(Uint8 APICID, int Vector, int DeliveryMode) #endif /** - * \fn void Proc_Start() + * \fn void Proc_Start(void) * \brief Start process scheduler */ -void Proc_Start() +void Proc_Start(void) { // Start Interrupts (and hence scheduler) __asm__ __volatile__("sti"); } /** - * \fn tThread *Proc_GetCurThread() + * \fn tThread *Proc_GetCurThread(void) * \brief Gets the current thread */ -tThread *Proc_GetCurThread() +tThread *Proc_GetCurThread(void) { #if USE_MP - //return gaCPUs[ gaAPIC_to_CPU[gpMP_LocalAPIC->ID.Val&0xFF] ].Current; return gaCPUs[ GetCPUNum() ].Current; #else return gCurrentThread; @@ -357,10 +356,10 @@ tThread *Proc_GetCurThread() } /** - * \fn void Proc_ChangeStack() + * \fn void Proc_ChangeStack(void) * \brief Swaps the current stack for a new one (in the proper stack reigon) */ -void Proc_ChangeStack() +void Proc_ChangeStack(void) { Uint rsp, rbp; Uint tmp_rbp, old_rsp; @@ -381,11 +380,11 @@ void Proc_ChangeStack() curBase = (Uint)&gInitialKernelStack; - LOG("curBase = 0x%x, newBase = 0x%x", curBase, newBase); + Log("curBase = 0x%x, newBase = 0x%x", curBase, newBase); // Get ESP as a used size rsp = curBase - rsp; - LOG("memcpy( %p, %p, 0x%x )", (void*)(newBase - rsp), (void*)(curBase - rsp), rsp ); + Log("memcpy( %p, %p, 0x%x )", (void*)(newBase - rsp), (void*)(curBase - rsp), rsp ); // Copy used stack memcpy( (void*)(newBase - rsp), (void*)(curBase - rsp), rsp ); // Get ESP as an offset in the new stack @@ -393,16 +392,17 @@ void Proc_ChangeStack() // Adjust EBP rbp = newBase - (curBase - rbp); + Log("Update stack"); // Repair EBPs & Stack Addresses // Catches arguments also, but may trash stack-address-like values - for(tmp_rbp = rsp; tmp_rbp < newBase; tmp_rbp += 4) + for(tmp_rbp = rsp; tmp_rbp < newBase; tmp_rbp += sizeof(Uint)) { if(old_rsp < *(Uint*)tmp_rbp && *(Uint*)tmp_rbp < curBase) *(Uint*)tmp_rbp += newBase - curBase; } + Log("Applying Changes"); Proc_GetCurThread()->KernelStack = newBase; - __asm__ __volatile__ ("mov %0, %%rsp"::"r"(rsp)); __asm__ __volatile__ ("mov %0, %%rbp"::"r"(rbp)); } @@ -423,8 +423,11 @@ int Proc_Clone(Uint *Err, Uint Flags) newThread = Threads_CloneTCB(Err, Flags); if(!newThread) return -1; + Log("Proc_Clone: newThread = %p", newThread); + // Initialise Memory Space (New Addr space or kernel stack) if(Flags & CLONE_VM) { + Log("Proc_Clone: Cloning VM"); newThread->MemState.CR3 = MM_Clone(); newThread->KernelStack = cur->KernelStack; } else { @@ -435,6 +438,7 @@ int Proc_Clone(Uint *Err, Uint Flags) // Create new KStack newThread->KernelStack = MM_NewKStack(); + Log("Proc_Clone: newKStack = %p", newThread->KernelStack); // Check for errors if(newThread->KernelStack == 0) { free(newThread); @@ -456,7 +460,7 @@ int Proc_Clone(Uint *Err, Uint Flags) // Repair EBPs & Stack Addresses // Catches arguments also, but may trash stack-address-like values - for(tmp_rbp = rsp; tmp_rbp < newThread->KernelStack; tmp_rbp += 4) + for(tmp_rbp = rsp; tmp_rbp < newThread->KernelStack; tmp_rbp += sizeof(Uint)) { if(old_rsp < *(Uint*)tmp_rbp && *(Uint*)tmp_rbp < cur->KernelStack) *(Uint*)tmp_rbp += newThread->KernelStack - cur->KernelStack; @@ -482,10 +486,10 @@ int Proc_Clone(Uint *Err, Uint Flags) } /** - * \fn int Proc_SpawnWorker() + * \fn int Proc_SpawnWorker(void) * \brief Spawns a new worker thread */ -int Proc_SpawnWorker() +int Proc_SpawnWorker(void) { tThread *new, *cur; Uint rip, rsp, rbp; @@ -530,10 +534,10 @@ int Proc_SpawnWorker() } /** - * \fn Uint Proc_MakeUserStack() + * \fn Uint Proc_MakeUserStack(void) * \brief Creates a new user stack */ -Uint Proc_MakeUserStack() +Uint Proc_MakeUserStack(void) { int i; Uint base = USER_STACK_TOP - USER_STACK_SZ;