- if (overlay) {
- if ((u.u_procp->p_flag & SPAGI) || u.u_sep==0 && ctos(ts) != ctos(u.u_tsize) || nargc) {
- u.u_error = ENOMEM;
- goto bad;
- }
- ds = u.u_dsize;
- ss = u.u_ssize;
- sep = u.u_sep;
- xfree();
- xalloc(ip, pagi);
- u.u_ar0[PC] = u.u_exdata.ux_entloc + 2; /* skip over entry mask */
- } else {
- if (chksize(ts, ds, ss))
- goto bad;
- u.u_cdmap = zdmap;
- u.u_csmap = zdmap;
- if (swpexpand(ds, ss, &u.u_cdmap, &u.u_csmap) == NULL)
- goto bad;
-
- /*
- * At this point, committed to the new image!
- * Release virtual memory resources of old process, and
- * initialize the virtual memory of the new process.
- * If we resulted from vfork(), instead wakeup our
- * parent who will set SVFDONE when he has taken back
- * our resources.
- */
- u.u_prof.pr_scale = 0;
- if ((u.u_procp->p_flag & SVFORK) == 0)
- vrelvm();
- else {
- u.u_procp->p_flag &= ~SVFORK;
- u.u_procp->p_flag |= SKEEP;
- wakeup((caddr_t)u.u_procp);
- while ((u.u_procp->p_flag & SVFDONE) == 0)
- sleep((caddr_t)u.u_procp, PZERO - 1);
- u.u_procp->p_flag &= ~(SVFDONE|SKEEP);
- }
- u.u_procp->p_flag &= ~(SPAGI|SANOM|SUANOM);
- u.u_procp->p_flag |= pagi;
- u.u_dmap = u.u_cdmap;
- u.u_smap = u.u_csmap;
- vgetvm(ts, ds, ss);
-
- if (pagi == 0) {
- /*
- * Read in data segment.
- */
- u.u_base = (char *)ctob(ts);
- u.u_offset = sizeof(u.u_exdata)+u.u_exdata.ux_tsize;
- u.u_count = u.u_exdata.ux_dsize;
- readi(ip);
- }
- xalloc(ip, pagi);
- if (pagi && u.u_procp->p_textp)
- vinifod((struct fpte *)dptopte(u.u_procp, 0),
- PG_FTEXT, u.u_procp->p_textp->x_iptr,
- 1 + ts/CLSIZE, (int)btoc(u.u_exdata.ux_dsize));