13ebc1248SPeter Wemm /*- 23ebc1248SPeter Wemm * Copyright (c) 1998-1999 Andrew Gallatin 33ebc1248SPeter Wemm * All rights reserved. 43ebc1248SPeter Wemm * 53ebc1248SPeter Wemm * Redistribution and use in source and binary forms, with or without 63ebc1248SPeter Wemm * modification, are permitted provided that the following conditions 73ebc1248SPeter Wemm * are met: 83ebc1248SPeter Wemm * 1. Redistributions of source code must retain the above copyright 93ebc1248SPeter Wemm * notice, this list of conditions and the following disclaimer 103ebc1248SPeter Wemm * in this position and unchanged. 113ebc1248SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 123ebc1248SPeter Wemm * notice, this list of conditions and the following disclaimer in the 133ebc1248SPeter Wemm * documentation and/or other materials provided with the distribution. 143ebc1248SPeter Wemm * 3. The name of the author may not be used to endorse or promote products 153ebc1248SPeter Wemm * derived from this software withough specific prior written permission 163ebc1248SPeter Wemm * 173ebc1248SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 183ebc1248SPeter Wemm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 193ebc1248SPeter Wemm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 203ebc1248SPeter Wemm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 213ebc1248SPeter Wemm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 223ebc1248SPeter Wemm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233ebc1248SPeter Wemm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243ebc1248SPeter Wemm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253ebc1248SPeter Wemm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 263ebc1248SPeter Wemm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273ebc1248SPeter Wemm * 283ebc1248SPeter Wemm * $FreeBSD$ 293ebc1248SPeter Wemm */ 303ebc1248SPeter Wemm 313ebc1248SPeter Wemm #include <vm/vm.h> 323ebc1248SPeter Wemm #include <vm/vm_param.h> 333ebc1248SPeter Wemm #include <vm/pmap.h> 343ebc1248SPeter Wemm 353ebc1248SPeter Wemm 363ebc1248SPeter Wemm #include <sys/exec.h> 373ebc1248SPeter Wemm #include <sys/sysent.h> 383ebc1248SPeter Wemm #include <sys/cdefs.h> 393ebc1248SPeter Wemm 401c7abef7SPeter Wemm struct freebsd32_ps_strings { 413ebc1248SPeter Wemm u_int32_t ps_argvstr; /* first of 0 or more argument strings */ 423ebc1248SPeter Wemm int ps_nargvstr; /* the number of argument strings */ 433ebc1248SPeter Wemm u_int32_t ps_envstr; /* first of 0 or more environment strings */ 443ebc1248SPeter Wemm int ps_nenvstr; /* the number of environment strings */ 453ebc1248SPeter Wemm }; 463ebc1248SPeter Wemm 4746159d1fSPeter Wemm #if defined(__amd64__) || defined(__ia64__) 4846159d1fSPeter Wemm #include <compat/ia32/ia32_util.h> 4946159d1fSPeter Wemm #endif 5046159d1fSPeter Wemm 511c7abef7SPeter Wemm #define FREEBSD32_PS_STRINGS \ 521c7abef7SPeter Wemm (FREEBSD32_USRSTACK - sizeof(struct freebsd32_ps_strings)) 533ebc1248SPeter Wemm 543ebc1248SPeter Wemm static __inline caddr_t stackgap_init(void); 553ebc1248SPeter Wemm static __inline void *stackgap_alloc(caddr_t *, size_t); 563ebc1248SPeter Wemm 573ebc1248SPeter Wemm static __inline caddr_t 583ebc1248SPeter Wemm stackgap_init() 593ebc1248SPeter Wemm { 603ebc1248SPeter Wemm #define szsigcode (*(curproc->p_sysent->sv_szsigcode)) 611c7abef7SPeter Wemm return (caddr_t)(((caddr_t)FREEBSD32_PS_STRINGS) - szsigcode - 621c7abef7SPeter Wemm SPARE_USRSPACE); 633ebc1248SPeter Wemm #undef szsigcode 643ebc1248SPeter Wemm } 653ebc1248SPeter Wemm 663ebc1248SPeter Wemm static __inline void * 673ebc1248SPeter Wemm stackgap_alloc(sgp, sz) 683ebc1248SPeter Wemm caddr_t *sgp; 693ebc1248SPeter Wemm size_t sz; 703ebc1248SPeter Wemm { 713ebc1248SPeter Wemm void *p; 723ebc1248SPeter Wemm 733ebc1248SPeter Wemm p = (void *) *sgp; 743ebc1248SPeter Wemm *sgp += ALIGN(sz); 753ebc1248SPeter Wemm return p; 763ebc1248SPeter Wemm } 773ebc1248SPeter Wemm 783ebc1248SPeter Wemm 791c7abef7SPeter Wemm extern const char freebsd32_emul_path[]; 801c7abef7SPeter Wemm int freebsd32_emul_find(struct thread *, caddr_t *, const char *, char *, 813ebc1248SPeter Wemm char **, int); 823ebc1248SPeter Wemm 833ebc1248SPeter Wemm #define CHECKALT(p, sgp, path, i) \ 843ebc1248SPeter Wemm do { \ 853ebc1248SPeter Wemm int _error; \ 863ebc1248SPeter Wemm \ 871c7abef7SPeter Wemm _error = freebsd32_emul_find(p, sgp, \ 881c7abef7SPeter Wemm freebsd32_emul_path, path, \ 893ebc1248SPeter Wemm &path, i); \ 903ebc1248SPeter Wemm if (_error == EFAULT) \ 913ebc1248SPeter Wemm return (_error); \ 923ebc1248SPeter Wemm } while (0) 933ebc1248SPeter Wemm 943ebc1248SPeter Wemm #define CHECKALTEXIST(p, sgp, path) CHECKALT((p), (sgp), (path), 0) 953ebc1248SPeter Wemm #define CHECKALTCREAT(p, sgp, path) CHECKALT((p), (sgp), (path), 1) 96