Subject: Re: fork1 and new stack
To: None <eeh@netbsd.org>
From: Emmanuel Dreyfus <manu@netbsd.org>
List: tech-kern
Date: 04/26/2002 07:30:28
> Uh, did you by any chance forget to allocate VM in that range?
Here is the code. Is there something wrong in VM allocation?
bsd_flags = FORK_SHAREVM;
tf = (struct frame *)p->p_md.md_regs;
child_stack_addr = (u_long)(tf->f_regs[SP] - IRIX_SPROC_STACK_OFFSET);
child_stack_size = (u_long)p->p_vmspace->vm_minsaddr
- (u_long)p->p_vmspace->vm_maxsaddr;
error = fork1(p, bsd_flags, SIGCHLD, (void *)child_stack_addr,
child_stack_size, NULL, NULL, retval, &p2);
if (error)
return error;
tf = (struct frame *)p2->p_md.md_regs;
tf->f_regs[PC] = (unsigned long)SCARG(uap, entry);
tf->f_regs[A0] = (unsigned long)SCARG(uap, arg);
tf->f_regs[A1] = tf->f_regs[S3]; /* XXX ? */
bzero(&vmc, sizeof(vmc));
vmc.ev_addr = trunc_page(child_stack_addr - child_stack_size);
vmc.ev_len = round_page(child_stack_size);
vmc.ev_prot = UVM_PROT_RWX;
vmc.ev_flags = UVM_FLAG_COPYONW|UVM_FLAG_FIXED|UVM_FLAG_OVERLAY;
vmc.ev_proc = vmcmd_map_zero;
error = (*vmc.ev_proc)(p, &vmc);
retval[0] = (register_t)p2->p_pid;
retval[1] = 0;
return error;
--
Emmanuel Dreyfus.
"Le 80x86 n'est pas si complexe - il n'a simplement pas de sens"
(Mike Johnson, responsable de la conception x86 chez AMD)
manu@netbsd.org