ibcs2_sysvec.c revision 102808
1/* 2 * Copyright (c) 1995 Steven Wallace 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Steven Wallace. 16 * 4. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $FreeBSD: head/sys/i386/ibcs2/ibcs2_sysvec.c 102808 2002-09-01 21:41:24Z jake $ 31 */ 32 33#include <sys/param.h> 34#include <sys/kernel.h> 35#include <sys/systm.h> 36#include <sys/exec.h> 37#include <sys/imgact.h> 38#include <sys/lock.h> 39#include <sys/module.h> 40#include <sys/sysent.h> 41#include <sys/signalvar.h> 42#include <sys/proc.h> 43#include <sys/sx.h> 44 45#include <vm/vm.h> 46#include <vm/pmap.h> 47#include <vm/vm_param.h> 48 49#include <i386/ibcs2/ibcs2_syscall.h> 50#include <i386/ibcs2/ibcs2_signal.h> 51 52MODULE_VERSION(ibcs2, 1); 53 54extern int bsd_to_ibcs2_errno[]; 55extern struct sysent ibcs2_sysent[IBCS2_SYS_MAXSYSCALL]; 56extern int szsigcode; 57extern char sigcode[]; 58static int ibcs2_fixup(register_t **, struct image_params *); 59 60struct sysentvec ibcs2_svr3_sysvec = { 61 sizeof (ibcs2_sysent) / sizeof (ibcs2_sysent[0]), 62 ibcs2_sysent, 63 0xFF, 64 IBCS2_SIGTBLSZ, 65 bsd_to_ibcs2_sig, 66 ELAST + 1, 67 bsd_to_ibcs2_errno, 68 NULL, /* trap-to-signal translation function */ 69 ibcs2_fixup, /* fixup */ 70 sendsig, 71 sigcode, /* use generic trampoline */ 72 &szsigcode, /* use generic trampoline size */ 73 NULL, /* prepsyscall */ 74 "IBCS2 COFF", 75 NULL, /* we don't have a COFF coredump function */ 76 NULL, 77 IBCS2_MINSIGSTKSZ, 78 PAGE_SIZE, 79 VM_MIN_ADDRESS, 80 VM_MAXUSER_ADDRESS, 81 USRSTACK, 82 PS_STRINGS, 83 VM_PROT_ALL, 84 exec_copyout_strings, 85 exec_setregs 86}; 87 88static int 89ibcs2_fixup(register_t **stack_base, struct image_params *imgp) 90{ 91 92 return (suword(--(*stack_base), imgp->argc)); 93} 94 95/* 96 * Create an "ibcs2" module that does nothing but allow checking for 97 * the presence of the subsystem. 98 */ 99static int 100ibcs2_modevent(module_t mod, int type, void *unused) 101{ 102 struct proc *p = NULL; 103 int rval = 0; 104 105 switch(type) { 106 case MOD_UNLOAD: 107 /* if this was an ELF module we'd use elf_brand_inuse()... */ 108 sx_slock(&allproc_lock); 109 LIST_FOREACH(p, &allproc, p_list) { 110 if (p->p_sysent == &ibcs2_svr3_sysvec) { 111 rval = EBUSY; 112 break; 113 } 114 } 115 sx_sunlock(&allproc_lock); 116 default: 117 /* do not care */ 118 break; 119 } 120 return (rval); 121} 122static moduledata_t ibcs2_mod = { 123 "ibcs2", 124 ibcs2_modevent, 125 0 126}; 127DECLARE_MODULE(ibcs2, ibcs2_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); 128