Annotation of sys/compat/hpux/hppa/hpux_exec.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: hpux_exec.c,v 1.3 2005/12/30 19:46:53 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2004 Michael Shalayeff. All rights reserved.
! 5: * Copyright (c) 1995, 1997 Jason R. Thorpe. All rights reserved.
! 6: * Copyright (c) 1993, 1994 Christopher G. Demetriou
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * This product includes software developed by Christopher G. Demetriou.
! 18: * 4. The name of the author may not be used to endorse or promote products
! 19: * derived from this software without specific prior written permission
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 22: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 23: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 24: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 25: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 26: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 27: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 28: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 29: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 30: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 31: */
! 32:
! 33: /*
! 34: * Glue for exec'ing HP-UX executables and the HP-UX execv() system call.
! 35: * Based on sys/kern/exec_aout.c
! 36: */
! 37:
! 38: #include <sys/param.h>
! 39: #include <sys/systm.h>
! 40: #include <sys/kernel.h>
! 41: #include <sys/proc.h>
! 42: #include <sys/malloc.h>
! 43: #include <sys/mount.h>
! 44: #include <sys/namei.h>
! 45: #include <sys/user.h>
! 46: #include <sys/vnode.h>
! 47: #include <sys/mman.h>
! 48: #include <sys/stat.h>
! 49:
! 50: #include <uvm/uvm_extern.h>
! 51:
! 52: #include <machine/cpu.h>
! 53: #include <machine/reg.h>
! 54:
! 55: #include <sys/syscallargs.h>
! 56:
! 57: #include <compat/hpux/hpux.h>
! 58: #include <compat/hpux/hpux_util.h>
! 59: #include <compat/hpux/hppa/hpux_syscall.h>
! 60: #include <compat/hpux/hppa/hpux_syscallargs.h>
! 61:
! 62: #include <machine/hpux_machdep.h>
! 63:
! 64: const char hpux_emul_path[] = "/emul/hpux";
! 65: extern char hpux_sigcode[], hpux_esigcode[];
! 66: extern struct sysent hpux_sysent[];
! 67: #ifdef SYSCALL_DEBUG
! 68: extern char *hpux_syscallnames[];
! 69: #endif
! 70: extern int bsdtohpuxerrnomap[];
! 71:
! 72: int exec_hpux_som_nmagic(struct proc *, struct exec_package *);
! 73: int exec_hpux_som_zmagic(struct proc *, struct exec_package *);
! 74: int exec_hpux_som_omagic(struct proc *, struct exec_package *);
! 75:
! 76: struct emul emul_hpux = {
! 77: "hpux",
! 78: bsdtohpuxerrnomap,
! 79: hpux_sendsig,
! 80: HPUX_SYS_syscall,
! 81: HPUX_SYS_MAXSYSCALL,
! 82: hpux_sysent,
! 83: #ifdef SYSCALL_DEBUG
! 84: hpux_syscallnames,
! 85: #else
! 86: NULL,
! 87: #endif
! 88: 0,
! 89: copyargs,
! 90: hpux_setregs,
! 91: NULL,
! 92: hpux_sigcode,
! 93: hpux_esigcode,
! 94: };
! 95:
! 96: int
! 97: exec_hpux_makecmds(p, epp)
! 98: struct proc *p;
! 99: struct exec_package *epp;
! 100: {
! 101: struct som_exec *som_ep = epp->ep_hdr;
! 102: short sysid, magic;
! 103: int error = ENOEXEC;
! 104:
! 105: sysid = HPUX_SYSID(som_ep);
! 106: if (sysid != MID_HPUX800 && sysid != MID_HPPA11 && sysid != MID_HPPA20)
! 107: return (error);
! 108:
! 109: /* XXX read in the aux header if it was not following the som header */
! 110: if (sysid != MID_HPUX && (!(som_ep->som_version == HPUX_SOM_V0 ||
! 111: som_ep->som_version == HPUX_SOM_V1) ||
! 112: som_ep->som_auxhdr + sizeof(struct som_aux) > epp->ep_hdrvalid)) {
! 113: return (error);
! 114: }
! 115:
! 116: /*
! 117: * HP-UX is a 4k page size system, and executables assume
! 118: * this.
! 119: */
! 120: if (PAGE_SIZE != HPUX_LDPGSZ)
! 121: return (error);
! 122:
! 123: magic = HPUX_MAGIC(som_ep);
! 124: switch (magic) {
! 125: case OMAGIC:
! 126: error = exec_hpux_som_omagic(p, epp);
! 127: break;
! 128:
! 129: case NMAGIC:
! 130: error = exec_hpux_som_nmagic(p, epp);
! 131: break;
! 132:
! 133: case ZMAGIC:
! 134: error = exec_hpux_som_zmagic(p, epp);
! 135: break;
! 136: }
! 137:
! 138: if (error == 0) {
! 139: /* set up our emulation information */
! 140: epp->ep_emul = &emul_hpux;
! 141: } else
! 142: kill_vmcmds(&epp->ep_vmcmds);
! 143:
! 144: return (error);
! 145: }
! 146:
! 147: int
! 148: exec_hpux_som_nmagic(struct proc *p, struct exec_package *epp)
! 149: {
! 150: struct som_exec *execp = epp->ep_hdr;
! 151: struct som_aux *auxp = epp->ep_hdr + execp->som_auxhdr;
! 152:
! 153: epp->ep_taddr = auxp->som_tmem;
! 154: epp->ep_tsize = auxp->som_tsize;
! 155: epp->ep_daddr = auxp->som_dmem;
! 156: epp->ep_dsize = auxp->som_dsize + auxp->som_bsize;
! 157: epp->ep_entry = auxp->som_entry;
! 158:
! 159: /* set up command for text segment */
! 160: NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_readvn, epp->ep_tsize,
! 161: epp->ep_taddr, epp->ep_vp, auxp->som_tfile,
! 162: VM_PROT_READ|VM_PROT_EXECUTE);
! 163:
! 164: /* set up command for data segment */
! 165: NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_readvn, auxp->som_dsize,
! 166: epp->ep_daddr, epp->ep_vp, auxp->som_dfile,
! 167: VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
! 168:
! 169: /* set up command for bss segment */
! 170: if (auxp->som_bsize > 0)
! 171: NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, auxp->som_bsize,
! 172: epp->ep_daddr + auxp->som_dsize,
! 173: NULLVP, 0, VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
! 174:
! 175: return (exec_setup_stack(p, epp));
! 176: }
! 177:
! 178: int
! 179: exec_hpux_som_zmagic(struct proc *p, struct exec_package *epp)
! 180: {
! 181:
! 182: return (exec_setup_stack(p, epp));
! 183: }
! 184:
! 185: int
! 186: exec_hpux_som_omagic(struct proc *p, struct exec_package *epp)
! 187: {
! 188:
! 189: return (exec_setup_stack(p, epp));
! 190: }
! 191:
! 192: /*
! 193: * The HP-UX execv(2) system call.
! 194: *
! 195: * Just check the alternate emulation path, and pass it on to the NetBSD
! 196: * execve().
! 197: */
! 198: int
! 199: hpux_sys_execv(p, v, retval)
! 200: struct proc *p;
! 201: void *v;
! 202: register_t *retval;
! 203: {
! 204: struct hpux_sys_execv_args /* {
! 205: syscallarg(char *) path;
! 206: syscallarg(char **) argv;
! 207: } */ *uap = v;
! 208: struct sys_execve_args ap;
! 209: caddr_t sg;
! 210:
! 211: sg = stackgap_init(p->p_emul);
! 212: HPUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 213:
! 214: SCARG(&ap, path) = SCARG(uap, path);
! 215: SCARG(&ap, argp) = SCARG(uap, argp);
! 216: SCARG(&ap, envp) = NULL;
! 217:
! 218: return sys_execve(p, &ap, retval);
! 219: }
! 220:
! 221: int
! 222: hpux_sys_execve(p, v, retval)
! 223: struct proc *p;
! 224: void *v;
! 225: register_t *retval;
! 226: {
! 227: struct hpux_sys_execve_args /* {
! 228: syscallarg(char *) path;
! 229: syscallarg(char **) argv;
! 230: syscallarg(char **) envp;
! 231: } */ *uap = v;
! 232: struct sys_execve_args ap;
! 233: caddr_t sg;
! 234:
! 235: sg = stackgap_init(p->p_emul);
! 236: HPUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 237:
! 238: SCARG(&ap, path) = SCARG(uap, path);
! 239: SCARG(&ap, argp) = SCARG(uap, argp);
! 240: SCARG(&ap, envp) = SCARG(uap, envp);
! 241:
! 242: return (sys_execve(p, &ap, retval));
! 243: }
CVSweb