1cfefd687SGarrett Wollman /* 2cfefd687SGarrett Wollman * Copyright (c) 1993, David Greenman 3cfefd687SGarrett Wollman * All rights reserved. 4cfefd687SGarrett Wollman * 5cfefd687SGarrett Wollman * Redistribution and use in source and binary forms, with or without 6cfefd687SGarrett Wollman * modification, are permitted provided that the following conditions 7cfefd687SGarrett Wollman * are met: 8cfefd687SGarrett Wollman * 1. Redistributions of source code must retain the above copyright 9cfefd687SGarrett Wollman * notice, this list of conditions and the following disclaimer. 10cfefd687SGarrett Wollman * 2. Redistributions in binary form must reproduce the above copyright 11cfefd687SGarrett Wollman * notice, this list of conditions and the following disclaimer in the 12cfefd687SGarrett Wollman * documentation and/or other materials provided with the distribution. 13cfefd687SGarrett Wollman * 3. All advertising materials mentioning features or use of this software 14cfefd687SGarrett Wollman * must display the following acknowledgement: 15cfefd687SGarrett Wollman * This product includes software developed by David Greenman 16cfefd687SGarrett Wollman * 4. The name of the developer may be used to endorse or promote products 17cfefd687SGarrett Wollman * derived from this software without specific prior written permission. 18cfefd687SGarrett Wollman * 19cfefd687SGarrett Wollman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20cfefd687SGarrett Wollman * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21cfefd687SGarrett Wollman * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22cfefd687SGarrett Wollman * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23cfefd687SGarrett Wollman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24cfefd687SGarrett Wollman * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25cfefd687SGarrett Wollman * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26cfefd687SGarrett Wollman * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27cfefd687SGarrett Wollman * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28cfefd687SGarrett Wollman * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29cfefd687SGarrett Wollman * SUCH DAMAGE. 30cfefd687SGarrett Wollman * 31cfefd687SGarrett Wollman * $Id: aout_imgact.c,v 1.2 1993/12/19 00:51:14 wollman Exp $ 32cfefd687SGarrett Wollman */ 33cfefd687SGarrett Wollman 34cfefd687SGarrett Wollman #include "param.h" 35cfefd687SGarrett Wollman #include "systm.h" 36cfefd687SGarrett Wollman #include "resourcevar.h" 37cfefd687SGarrett Wollman #include "exec.h" 38cfefd687SGarrett Wollman #include "mman.h" 39cfefd687SGarrett Wollman #include "imgact.h" 40cfefd687SGarrett Wollman 41cfefd687SGarrett Wollman #include "vm/vm.h" 42cfefd687SGarrett Wollman 43cfefd687SGarrett Wollman int 44cfefd687SGarrett Wollman exec_aout_imgact(iparams) 45cfefd687SGarrett Wollman struct image_params *iparams; 46cfefd687SGarrett Wollman { 47cfefd687SGarrett Wollman struct exec *a_out = (struct exec *) iparams->image_header; 48cfefd687SGarrett Wollman struct vmspace *vmspace = iparams->proc->p_vmspace; 49cfefd687SGarrett Wollman unsigned long vmaddr, virtual_offset, file_offset; 50cfefd687SGarrett Wollman unsigned long bss_size; 51cfefd687SGarrett Wollman int error, len; 52cfefd687SGarrett Wollman 53cfefd687SGarrett Wollman /* 54cfefd687SGarrett Wollman * Set file/virtual offset based on a.out variant. 55cfefd687SGarrett Wollman * We do two cases: host byte order and network byte order 56cfefd687SGarrett Wollman * (for NetBSD compatibility) 57cfefd687SGarrett Wollman */ 58cfefd687SGarrett Wollman switch ((int)(a_out->a_magic & 0xffff)) { 59cfefd687SGarrett Wollman case ZMAGIC: 60cfefd687SGarrett Wollman virtual_offset = 0; 61cfefd687SGarrett Wollman if (a_out->a_text) { 62cfefd687SGarrett Wollman file_offset = NBPG; 63cfefd687SGarrett Wollman } else { 64cfefd687SGarrett Wollman /* Bill's "screwball mode" */ 65cfefd687SGarrett Wollman file_offset = 0; 66cfefd687SGarrett Wollman } 67cfefd687SGarrett Wollman break; 68cfefd687SGarrett Wollman case QMAGIC: 69cfefd687SGarrett Wollman virtual_offset = NBPG; 70cfefd687SGarrett Wollman file_offset = 0; 71cfefd687SGarrett Wollman break; 72cfefd687SGarrett Wollman default: 73cfefd687SGarrett Wollman /* NetBSD compatibility */ 74cfefd687SGarrett Wollman switch ((int)(ntohl(a_out->a_magic) & 0xffff)) { 75cfefd687SGarrett Wollman case ZMAGIC: 76cfefd687SGarrett Wollman case QMAGIC: 77cfefd687SGarrett Wollman virtual_offset = NBPG; 78cfefd687SGarrett Wollman file_offset = 0; 79cfefd687SGarrett Wollman break; 80cfefd687SGarrett Wollman default: 81cfefd687SGarrett Wollman return (-1); 82cfefd687SGarrett Wollman } 83cfefd687SGarrett Wollman } 84cfefd687SGarrett Wollman 85cfefd687SGarrett Wollman bss_size = roundup(a_out->a_bss, NBPG); 86cfefd687SGarrett Wollman 87cfefd687SGarrett Wollman /* 88cfefd687SGarrett Wollman * Check various fields in header for validity/bounds. 89cfefd687SGarrett Wollman */ 90cfefd687SGarrett Wollman if (/* entry point must lay with text region */ 91cfefd687SGarrett Wollman a_out->a_entry < virtual_offset || 92cfefd687SGarrett Wollman a_out->a_entry >= virtual_offset + a_out->a_text || 93cfefd687SGarrett Wollman 94cfefd687SGarrett Wollman /* text and data size must each be page rounded */ 95cfefd687SGarrett Wollman a_out->a_text % NBPG || 96cfefd687SGarrett Wollman a_out->a_data % NBPG) 97cfefd687SGarrett Wollman return (-1); 98cfefd687SGarrett Wollman 99cfefd687SGarrett Wollman /* text + data can't exceed file size */ 100cfefd687SGarrett Wollman if (a_out->a_data + a_out->a_text > iparams->attr->va_size) 101cfefd687SGarrett Wollman return (EFAULT); 102cfefd687SGarrett Wollman 103cfefd687SGarrett Wollman /* 104cfefd687SGarrett Wollman * text/data/bss must not exceed limits 105cfefd687SGarrett Wollman */ 106cfefd687SGarrett Wollman if (/* text can't exceed maximum text size */ 107cfefd687SGarrett Wollman a_out->a_text > MAXTSIZ || 108cfefd687SGarrett Wollman 109cfefd687SGarrett Wollman /* data + bss can't exceed maximum data size */ 110cfefd687SGarrett Wollman a_out->a_data + bss_size > MAXDSIZ || 111cfefd687SGarrett Wollman 112cfefd687SGarrett Wollman /* data + bss can't exceed rlimit */ 113cfefd687SGarrett Wollman a_out->a_data + bss_size > 114cfefd687SGarrett Wollman iparams->proc->p_rlimit[RLIMIT_DATA].rlim_cur) 115cfefd687SGarrett Wollman return (ENOMEM); 116cfefd687SGarrett Wollman 117cfefd687SGarrett Wollman /* copy in arguments and/or environment from old process */ 118cfefd687SGarrett Wollman error = exec_extract_strings(iparams); 119cfefd687SGarrett Wollman if (error) 120cfefd687SGarrett Wollman return (error); 121cfefd687SGarrett Wollman 122cfefd687SGarrett Wollman /* 123cfefd687SGarrett Wollman * Destroy old process VM and create a new one (with a new stack) 124cfefd687SGarrett Wollman */ 125cfefd687SGarrett Wollman exec_new_vmspace(iparams); 126cfefd687SGarrett Wollman 127cfefd687SGarrett Wollman /* 128cfefd687SGarrett Wollman * Map text read/execute 129cfefd687SGarrett Wollman */ 130cfefd687SGarrett Wollman vmaddr = virtual_offset; 131cfefd687SGarrett Wollman error = 132cfefd687SGarrett Wollman vm_mmap(&vmspace->vm_map, /* map */ 133cfefd687SGarrett Wollman &vmaddr, /* address */ 134cfefd687SGarrett Wollman a_out->a_text, /* size */ 135cfefd687SGarrett Wollman VM_PROT_READ | VM_PROT_EXECUTE, /* protection */ 136cfefd687SGarrett Wollman VM_PROT_READ | VM_PROT_EXECUTE, /* max protection */ 137cfefd687SGarrett Wollman MAP_FILE | MAP_PRIVATE | MAP_FIXED, /* flags */ 138cfefd687SGarrett Wollman iparams->vnodep, /* vnode */ 139cfefd687SGarrett Wollman file_offset); /* offset */ 140cfefd687SGarrett Wollman if (error) 141cfefd687SGarrett Wollman return (error); 142cfefd687SGarrett Wollman 143cfefd687SGarrett Wollman /* 144cfefd687SGarrett Wollman * Map data read/write (if text is 0, assume text is in data area 145cfefd687SGarrett Wollman * [Bill's screwball mode]) 146cfefd687SGarrett Wollman */ 147cfefd687SGarrett Wollman vmaddr = virtual_offset + a_out->a_text; 148cfefd687SGarrett Wollman error = 149cfefd687SGarrett Wollman vm_mmap(&vmspace->vm_map, 150cfefd687SGarrett Wollman &vmaddr, 151cfefd687SGarrett Wollman a_out->a_data, 152cfefd687SGarrett Wollman VM_PROT_READ | VM_PROT_WRITE | (a_out->a_text ? 0 : VM_PROT_EXECUTE), 153cfefd687SGarrett Wollman VM_PROT_READ | VM_PROT_WRITE | (a_out->a_text ? 0 : VM_PROT_EXECUTE), 154cfefd687SGarrett Wollman MAP_FILE | MAP_PRIVATE | MAP_FIXED, 155cfefd687SGarrett Wollman iparams->vnodep, 156cfefd687SGarrett Wollman file_offset + a_out->a_text); 157cfefd687SGarrett Wollman if (error) 158cfefd687SGarrett Wollman return (error); 159cfefd687SGarrett Wollman 160cfefd687SGarrett Wollman /* 161cfefd687SGarrett Wollman * Allocate demand-zeroed area for uninitialized data 162cfefd687SGarrett Wollman * "bss" = 'block started by symbol' - named after the IBM 7090 163cfefd687SGarrett Wollman * instruction of the same name. 164cfefd687SGarrett Wollman */ 165cfefd687SGarrett Wollman vmaddr = virtual_offset + a_out->a_text + a_out->a_data; 166cfefd687SGarrett Wollman error = vm_allocate(&vmspace->vm_map, &vmaddr, bss_size, FALSE); 167cfefd687SGarrett Wollman if (error) 168cfefd687SGarrett Wollman return (error); 169cfefd687SGarrett Wollman 170cfefd687SGarrett Wollman /* Fill in process VM information */ 171cfefd687SGarrett Wollman vmspace->vm_tsize = a_out->a_text >> PAGE_SHIFT; 172cfefd687SGarrett Wollman vmspace->vm_dsize = (a_out->a_data + bss_size) >> PAGE_SHIFT; 173cfefd687SGarrett Wollman vmspace->vm_taddr = (caddr_t) virtual_offset; 174cfefd687SGarrett Wollman vmspace->vm_daddr = (caddr_t) virtual_offset + a_out->a_text; 175cfefd687SGarrett Wollman 176cfefd687SGarrett Wollman /* Fill in image_params */ 177cfefd687SGarrett Wollman iparams->interpreted = 0; 178cfefd687SGarrett Wollman iparams->entry_addr = a_out->a_entry; 179cfefd687SGarrett Wollman 180cfefd687SGarrett Wollman return (0); 181cfefd687SGarrett Wollman } 182