While attempting to test my clone syscall (code below), I keep getting the following errors:
pid 4 thread_test: trap 13 err 0 on cpu 1 eip 0xc54 addr 0x0--kill proc pid 5 thread_test: trap 14 err 4 on cpu 1 eip 0x0 addr 0x28ec83e5--kill proc
Which correspond to a general protection fault and a page fault respectively. Does anyone have any idea what might be causing the new threads to be killed right after creation?
int clone(void *(*func) (void *), void *arg, void *stack) { int i,pid; struct proc *np; // Allocate process. if((np = allocproc()) == 0) return -1; np->state = UNUSED; np->sz = proc->sz; np->parent = proc; *np->tf = *proc->tf; np->pgdir = proc->pgdir; np->tf->eax = 0; // Clear %eax so that fork returns 0 in the child. np->tf->eip = (int)func; //change eip to new function np->kstack = stack; //use given stack for(i = 0; i < NOFILE; i++) if(proc->ofile[i]) np->ofile[i] = filedup(proc->ofile[i]); np->cwd = idup(proc->cwd); np->tf->esp = (uint)(stack+PGSIZE-4); //put esp to right spot on stack *((uint*)(np->tf->esp)) = (uint)arg; //arg to function *((uint*)(np->tf->esp)-4) = 0xFFFFFFFF; //return to nowhere np->tf->esp =(np->tf->esp) -4; safestrcpy(np->name, proc->name, sizeof(proc->name)); pid = np->pid; acquire(&ptable.lock); //lock so writes last np->state = RUNNABLE; release(&ptable.lock); return pid; } 1 Answer
I found the solution, I was trying to use the passed in stack as the thread's kstack. I needed to create a separate stack in proc.h and then assign the stack to the thread using:
np->stack = (int)stack;