xref: /freebsd/sys/compat/freebsd32/freebsd32_util.h (revision 46159d1fd66c714d13497b424f8f5bcae914c61f)
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