+ if (vm_allocate(&vm->vm_map, &addr, size, FALSE)) {
+ uprintf("Cannot allocate stack space\n");
+ error = ENOMEM; /* XXX */
+ goto badmap;
+ }
+ size -= round_page(p->p_rlimit[RLIMIT_STACK].rlim_cur);
+ if (vm_map_protect(&vm->vm_map, addr, addr+size, VM_PROT_NONE, FALSE)) {
+ uprintf("Cannot protect stack space\n");
+ error = ENOMEM;
+ goto badmap;
+ }
+ vm->vm_maxsaddr = (caddr_t)addr;
+
+ if (paged == 0) {
+ /*
+ * Read in data segment.
+ */
+ (void) vn_rdwr(UIO_READ, vp, vm->vm_daddr, (int) ep->a_data,
+ (off_t)(toff + ep->a_text), UIO_USERSPACE,
+ (IO_UNIT|IO_NODELOCKED), cred, (int *)0, p);
+ /*
+ * Read in text segment if necessary (0410),
+ * and read-protect it.
+ */
+ if (ep->a_text > 0) {
+ error = vn_rdwr(UIO_READ, vp, vm->vm_taddr,
+ (int)ep->a_text, toff, UIO_USERSPACE,
+ (IO_UNIT|IO_NODELOCKED), cred, (int *)0, p);
+ (void) vm_map_protect(&vm->vm_map,
+ (vm_offset_t)vm->vm_taddr,
+ (vm_offset_t)vm->vm_taddr + trunc_page(ep->a_text),
+ VM_PROT_READ|VM_PROT_EXECUTE, FALSE);