[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/compat/ia32/ia32_sysvec.c

Version: -  FREEBSD  -  FREEBSD7  -  FREEBSD71  -  FREEBSD70  -  FREEBSD6  -  FREEBSD64  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  OPENSOLARIS  -  minix-3-1-1  -  TRUSTEDBSD-SEBSD  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

  1 /*-
  2  * Copyright (c) 2002 Doug Rabson
  3  * Copyright (c) 2003 Peter Wemm
  4  * All rights reserved.
  5  *
  6  * Redistribution and use in source and binary forms, with or without
  7  * modification, are permitted provided that the following conditions
  8  * are met:
  9  * 1. Redistributions of source code must retain the above copyright
 10  *    notice, this list of conditions and the following disclaimer.
 11  * 2. Redistributions in binary form must reproduce the above copyright
 12  *    notice, this list of conditions and the following disclaimer in the
 13  *    documentation and/or other materials provided with the distribution.
 14  *
 15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 25  * SUCH DAMAGE.
 26  */
 27 
 28 #include <sys/cdefs.h>
 29 __FBSDID("$FreeBSD: src/sys/compat/ia32/ia32_sysvec.c,v 1.30 2008/11/22 12:36:15 kib Exp $");
 30 
 31 #include "opt_compat.h"
 32 
 33 #define __ELF_WORD_SIZE 32
 34 
 35 #include <sys/param.h>
 36 #include <sys/exec.h>
 37 #include <sys/fcntl.h>
 38 #include <sys/imgact.h>
 39 #include <sys/kernel.h>
 40 #include <sys/lock.h>
 41 #include <sys/malloc.h>
 42 #include <sys/mutex.h>
 43 #include <sys/mman.h>
 44 #include <sys/namei.h>
 45 #include <sys/pioctl.h>
 46 #include <sys/proc.h>
 47 #include <sys/procfs.h>
 48 #include <sys/resourcevar.h>
 49 #include <sys/systm.h>
 50 #include <sys/signalvar.h>
 51 #include <sys/stat.h>
 52 #include <sys/sx.h>
 53 #include <sys/syscall.h>
 54 #include <sys/sysctl.h>
 55 #include <sys/sysent.h>
 56 #include <sys/vnode.h>
 57 #include <sys/imgact_elf.h>
 58 
 59 #include <vm/vm.h>
 60 #include <vm/vm_kern.h>
 61 #include <vm/vm_param.h>
 62 #include <vm/pmap.h>
 63 #include <vm/vm_map.h>
 64 #include <vm/vm_object.h>
 65 #include <vm/vm_extern.h>
 66 
 67 #include <compat/freebsd32/freebsd32_signal.h>
 68 #include <compat/freebsd32/freebsd32_util.h>
 69 #include <compat/freebsd32/freebsd32_proto.h>
 70 #include <compat/freebsd32/freebsd32_syscall.h>
 71 #include <compat/ia32/ia32_signal.h>
 72 #ifdef __amd64__
 73 #include <machine/psl.h>
 74 #include <machine/segments.h>
 75 #include <machine/specialreg.h>
 76 #else
 77 #include <i386/include/psl.h>
 78 #include <i386/include/segments.h>
 79 #include <i386/include/specialreg.h>
 80 #endif
 81 #include <machine/frame.h>
 82 #include <machine/md_var.h>
 83 #include <machine/pcb.h>
 84 #include <machine/cpufunc.h>
 85 
 86 CTASSERT(sizeof(struct ia32_mcontext) == 640);
 87 CTASSERT(sizeof(struct ia32_ucontext) == 704);
 88 CTASSERT(sizeof(struct ia32_sigframe) == 800);
 89 CTASSERT(sizeof(struct siginfo32) == 64);
 90 #ifdef COMPAT_FREEBSD4
 91 CTASSERT(sizeof(struct ia32_mcontext4) == 260);
 92 CTASSERT(sizeof(struct ia32_ucontext4) == 324);
 93 CTASSERT(sizeof(struct ia32_sigframe4) == 408);
 94 #endif
 95 
 96 static register_t *ia32_copyout_strings(struct image_params *imgp);
 97 static void ia32_fixlimit(struct rlimit *rl, int which);
 98 
 99 SYSCTL_NODE(_compat, OID_AUTO, ia32, CTLFLAG_RW, 0, "ia32 mode");
100 
101 static u_long   ia32_maxdsiz = IA32_MAXDSIZ;
102 SYSCTL_ULONG(_compat_ia32, OID_AUTO, maxdsiz, CTLFLAG_RW, &ia32_maxdsiz, 0, "");
103 TUNABLE_ULONG("compat.ia32.maxdsiz", &ia32_maxdsiz);
104 static u_long   ia32_maxssiz = IA32_MAXSSIZ;
105 SYSCTL_ULONG(_compat_ia32, OID_AUTO, maxssiz, CTLFLAG_RW, &ia32_maxssiz, 0, "");
106 TUNABLE_ULONG("compat.ia32.maxssiz", &ia32_maxssiz);
107 static u_long   ia32_maxvmem = IA32_MAXVMEM;
108 SYSCTL_ULONG(_compat_ia32, OID_AUTO, maxvmem, CTLFLAG_RW, &ia32_maxvmem, 0, "");
109 TUNABLE_ULONG("compat.ia32.maxvmem", &ia32_maxvmem);
110 
111 struct sysentvec ia32_freebsd_sysvec = {
112         .sv_size        = FREEBSD32_SYS_MAXSYSCALL,
113         .sv_table       = freebsd32_sysent,
114         .sv_mask        = 0,
115         .sv_sigsize     = 0,
116         .sv_sigtbl      = NULL,
117         .sv_errsize     = 0,
118         .sv_errtbl      = NULL,
119         .sv_transtrap   = NULL,
120         .sv_fixup       = elf32_freebsd_fixup,
121         .sv_sendsig     = ia32_sendsig,
122         .sv_sigcode     = ia32_sigcode,
123         .sv_szsigcode   = &sz_ia32_sigcode,
124         .sv_prepsyscall = NULL,
125         .sv_name        = "FreeBSD ELF32",
126         .sv_coredump    = elf32_coredump,
127         .sv_imgact_try  = NULL,
128         .sv_minsigstksz = MINSIGSTKSZ,
129         .sv_pagesize    = IA32_PAGE_SIZE,
130         .sv_minuser     = 0,
131         .sv_maxuser     = FREEBSD32_USRSTACK,
132         .sv_usrstack    = FREEBSD32_USRSTACK,
133         .sv_psstrings   = FREEBSD32_PS_STRINGS,
134         .sv_stackprot   = VM_PROT_ALL,
135         .sv_copyout_strings     = ia32_copyout_strings,
136         .sv_setregs     = ia32_setregs,
137         .sv_fixlimit    = ia32_fixlimit,
138         .sv_maxssiz     = &ia32_maxssiz,
139         .sv_flags       = SV_ABI_FREEBSD | SV_IA32 | SV_ILP32
140 };
141 
142 
143 static Elf32_Brandinfo ia32_brand_info = {
144         .brand          = ELFOSABI_FREEBSD,
145         .machine        = EM_386,
146         .compat_3_brand = "FreeBSD",
147         .emul_path      = NULL,
148         .interp_path    = "/libexec/ld-elf.so.1",
149         .sysvec         = &ia32_freebsd_sysvec,
150         .interp_newpath = "/libexec/ld-elf32.so.1",
151         .flags          = BI_CAN_EXEC_DYN
152 };
153 
154 SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
155         (sysinit_cfunc_t) elf32_insert_brand_entry,
156         &ia32_brand_info);
157 
158 static Elf32_Brandinfo ia32_brand_oinfo = {
159         .brand          = ELFOSABI_FREEBSD,
160         .machine        = EM_386,
161         .compat_3_brand = "FreeBSD",
162         .emul_path      = NULL,
163         .interp_path    = "/usr/libexec/ld-elf.so.1",
164         .sysvec         = &ia32_freebsd_sysvec,
165         .interp_newpath = "/libexec/ld-elf32.so.1",
166         .flags          = BI_CAN_EXEC_DYN,
167 };
168 
169 SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY,
170         (sysinit_cfunc_t) elf32_insert_brand_entry,
171         &ia32_brand_oinfo);
172 
173 
174 void
175 elf32_dump_thread(struct thread *td __unused, void *dst __unused,
176     size_t *off __unused)
177 {
178 }
179 
180 
181 /* XXX may be freebsd32 MI */
182 static register_t *
183 ia32_copyout_strings(struct image_params *imgp)
184 {
185         int argc, envc;
186         u_int32_t *vectp;
187         char *stringp, *destp;
188         u_int32_t *stack_base;
189         struct freebsd32_ps_strings *arginfo;
190         int szsigcode;
191 
192         /*
193          * Calculate string base and vector table pointers.
194          * Also deal with signal trampoline code for this exec type.
195          */
196         arginfo = (struct freebsd32_ps_strings *)FREEBSD32_PS_STRINGS;
197         szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
198         destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
199                 roundup((ARG_MAX - imgp->args->stringspace), sizeof(char *));
200 
201         /*
202          * install sigcode
203          */
204         if (szsigcode)
205                 copyout(imgp->proc->p_sysent->sv_sigcode,
206                         ((caddr_t)arginfo - szsigcode), szsigcode);
207 
208         /*
209          * If we have a valid auxargs ptr, prepare some room
210          * on the stack.
211          */
212         if (imgp->auxargs) {
213                 /*
214                  * 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
215                  * lower compatibility.
216                  */
217                 imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size
218                         : (AT_COUNT * 2);
219                 /*
220                  * The '+ 2' is for the null pointers at the end of each of
221                  * the arg and env vector sets,and imgp->auxarg_size is room
222                  * for argument of Runtime loader.
223                  */
224                 vectp = (u_int32_t *) (destp - (imgp->args->argc + imgp->args->envc + 2 +
225                                        imgp->auxarg_size) * sizeof(u_int32_t));
226 
227         } else
228                 /*
229                  * The '+ 2' is for the null pointers at the end of each of
230                  * the arg and env vector sets
231                  */
232                 vectp = (u_int32_t *)
233                         (destp - (imgp->args->argc + imgp->args->envc + 2) * sizeof(u_int32_t));
234 
235         /*
236          * vectp also becomes our initial stack base
237          */
238         stack_base = vectp;
239 
240         stringp = imgp->args->begin_argv;
241         argc = imgp->args->argc;
242         envc = imgp->args->envc;
243         /*
244          * Copy out strings - arguments and environment.
245          */
246         copyout(stringp, destp, ARG_MAX - imgp->args->stringspace);
247 
248         /*
249          * Fill in "ps_strings" struct for ps, w, etc.
250          */
251         suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
252         suword32(&arginfo->ps_nargvstr, argc);
253 
254         /*
255          * Fill in argument portion of vector table.
256          */
257         for (; argc > 0; --argc) {
258                 suword32(vectp++, (u_int32_t)(intptr_t)destp);
259                 while (*stringp++ != 0)
260                         destp++;
261                 destp++;
262         }
263 
264         /* a null vector table pointer separates the argp's from the envp's */
265         suword32(vectp++, 0);
266 
267         suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
268         suword32(&arginfo->ps_nenvstr, envc);
269 
270         /*
271          * Fill in environment portion of vector table.
272          */
273         for (; envc > 0; --envc) {
274                 suword32(vectp++, (u_int32_t)(intptr_t)destp);
275                 while (*stringp++ != 0)
276                         destp++;
277                 destp++;
278         }
279 
280         /* end of vector table is a null pointer */
281         suword32(vectp, 0);
282 
283         return ((register_t *)stack_base);
284 }
285 
286 static void
287 ia32_fixlimit(struct rlimit *rl, int which)
288 {
289 
290         switch (which) {
291         case RLIMIT_DATA:
292                 if (ia32_maxdsiz != 0) {
293                         if (rl->rlim_cur > ia32_maxdsiz)
294                                 rl->rlim_cur = ia32_maxdsiz;
295                         if (rl->rlim_max > ia32_maxdsiz)
296                                 rl->rlim_max = ia32_maxdsiz;
297                 }
298                 break;
299         case RLIMIT_STACK:
300                 if (ia32_maxssiz != 0) {
301                         if (rl->rlim_cur > ia32_maxssiz)
302                                 rl->rlim_cur = ia32_maxssiz;
303                         if (rl->rlim_max > ia32_maxssiz)
304                                 rl->rlim_max = ia32_maxssiz;
305                 }
306                 break;
307         case RLIMIT_VMEM:
308                 if (ia32_maxvmem != 0) {
309                         if (rl->rlim_cur > ia32_maxvmem)
310                                 rl->rlim_cur = ia32_maxvmem;
311                         if (rl->rlim_max > ia32_maxvmem)
312                                 rl->rlim_max = ia32_maxvmem;
313                 }
314                 break;
315         }
316 }
317 

Cache object: 0939cbdc4310a950c30020f18ae4c342


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.