return;
cpu_fork(struct proc *p1, struct proc *p2, void *stack, size_t stacksize){	struct switchframe *p2sf;	int cpu;	struct ksigframe {		void (*func)(struct proc *);		void *proc;	} *ksfp;	extern struct pcb *curpcb;	extern void proc_do_uret(), child_return();	extern void proc_trampoline();	extern void savectx();        extern void save_u_area();	cpu = cpu_number();/*		savectx(p1->p_addr->u_pcb);*/	savectx(curpcb);		/* copy p1 pcb to p2 */	bcopy((void *)&p1->p_addr->u_pcb, (void *)&p2->p_addr->u_pcb, sizeof(struct pcb));	p2->p_addr->u_pcb.kernel_state.pcb_ipl = 0;	p2->p_md.md_tf = USER_REGS(p2);	/*XXX these may not be necessary nivas */	save_u_area(p2, p2->p_addr);#ifdef notneeded 	pmap_activate(p2);#endif /* notneeded */	/*	 * Create a switch frame for proc 2	 */	p2sf = (struct switchframe *)((char *)p2->p_addr + USPACE - 8) - 1;	p2sf->sf_pc = (u_int)proc_do_uret;	p2sf->sf_proc = p2;	p2->p_addr->u_pcb.kernel_state.pcb_sp = (u_int)p2sf;	/*	 * If specified, give the child a different stack.	 */	if (stack != NULL)		USER_REGS(p2)->r[31] = (u_int)stack + stacksize;	ksfp = (struct ksigframe *)p2->p_addr->u_pcb.kernel_state.pcb_sp - 1;	ksfp->func = child_return;	ksfp->proc = p2;	/*	 * When this process resumes, r31 will be ksfp and	 * the process will be at the beginning of proc_trampoline().	 * proc_trampoline will execute the function func, pop off	 * ksfp frame, and call the function in the switchframe	 * now exposed.	 */	p2->p_addr->u_pcb.kernel_state.pcb_sp = (u_int)ksfp;	p2->p_addr->u_pcb.kernel_state.pcb_pc = (u_int)proc_trampoline;	return;}