xref: /freebsd/sys/compat/freebsd32/freebsd32_util.h (revision 5cead59181b1e371f22abff631625e27f71e946d)
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 
31d47faadcSJohn Baldwin #ifndef _COMPAT_FREEBSD32_FREEBSD32_UTIL_H_
32d47faadcSJohn Baldwin #define _COMPAT_FREEBSD32_FREEBSD32_UTIL_H_
33d47faadcSJohn Baldwin 
34d47faadcSJohn Baldwin #include <sys/cdefs.h>
35d47faadcSJohn Baldwin #include <sys/exec.h>
36d47faadcSJohn Baldwin #include <sys/sysent.h>
37a9c9e80bSKonstantin Belousov #include <sys/uio.h>
38d47faadcSJohn Baldwin 
393ebc1248SPeter Wemm #include <vm/vm.h>
403ebc1248SPeter Wemm #include <vm/vm_param.h>
413ebc1248SPeter Wemm #include <vm/pmap.h>
423ebc1248SPeter Wemm 
431c7abef7SPeter Wemm struct freebsd32_ps_strings {
443ebc1248SPeter Wemm 	u_int32_t ps_argvstr;	/* first of 0 or more argument strings */
453ebc1248SPeter Wemm 	int	ps_nargvstr;	/* the number of argument strings */
463ebc1248SPeter Wemm 	u_int32_t ps_envstr;	/* first of 0 or more environment strings */
473ebc1248SPeter Wemm 	int	ps_nenvstr;	/* the number of environment strings */
483ebc1248SPeter Wemm };
493ebc1248SPeter Wemm 
50e7d939bdSMarcel Moolenaar #if defined(__amd64__)
5146159d1fSPeter Wemm #include <compat/ia32/ia32_util.h>
5246159d1fSPeter Wemm #endif
5346159d1fSPeter Wemm 
541c7abef7SPeter Wemm #define FREEBSD32_PS_STRINGS	\
551c7abef7SPeter Wemm 	(FREEBSD32_USRSTACK - sizeof(struct freebsd32_ps_strings))
56d47faadcSJohn Baldwin 
5788ac915aSJohn Baldwin extern struct sysent freebsd32_sysent[];
5888ac915aSJohn Baldwin 
5988ac915aSJohn Baldwin #define SYSCALL32_MODULE(name, offset, new_sysent, evh, arg)   \
6088ac915aSJohn Baldwin static struct syscall_module_data name##_syscall32_mod = {     \
6188ac915aSJohn Baldwin        evh, arg, offset, new_sysent, { 0, NULL }               \
6288ac915aSJohn Baldwin };                                                             \
6388ac915aSJohn Baldwin                                                                \
6488ac915aSJohn Baldwin static moduledata_t name##32_mod = {                           \
6599b331a9SKonstantin Belousov        "sys32/" #name,                                         \
6688ac915aSJohn Baldwin        syscall32_module_handler,                               \
6788ac915aSJohn Baldwin        &name##_syscall32_mod                                   \
6888ac915aSJohn Baldwin };                                                             \
6988ac915aSJohn Baldwin DECLARE_MODULE(name##32, name##32_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE)
7088ac915aSJohn Baldwin 
7188ac915aSJohn Baldwin #define SYSCALL32_MODULE_HELPER(syscallname)            \
7288ac915aSJohn Baldwin static int syscallname##_syscall32 = FREEBSD32_SYS_##syscallname; \
7388ac915aSJohn Baldwin static struct sysent syscallname##_sysent32 = {         \
7488ac915aSJohn Baldwin     (sizeof(struct syscallname ## _args )               \
7588ac915aSJohn Baldwin      / sizeof(register_t)),                             \
7688ac915aSJohn Baldwin     (sy_call_t *)& syscallname                          \
7788ac915aSJohn Baldwin };                                                      \
7888ac915aSJohn Baldwin SYSCALL32_MODULE(syscallname,                           \
7988ac915aSJohn Baldwin     & syscallname##_syscall32, & syscallname##_sysent32,\
8088ac915aSJohn Baldwin     NULL, NULL);
8188ac915aSJohn Baldwin 
82*5cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_F(syscallname, flags) {		\
830687ba3eSKonstantin Belousov     .new_sysent = {						\
840687ba3eSKonstantin Belousov 	.sy_narg = (sizeof(struct syscallname ## _args )	\
850687ba3eSKonstantin Belousov 	    / sizeof(register_t)),				\
860687ba3eSKonstantin Belousov 	.sy_call = (sy_call_t *)& syscallname,			\
87*5cead591SKonstantin Belousov 	.sy_flags = (flags)					\
880687ba3eSKonstantin Belousov     },								\
890687ba3eSKonstantin Belousov     .syscall_no = FREEBSD32_SYS_##syscallname			\
900687ba3eSKonstantin Belousov }
910687ba3eSKonstantin Belousov 
92*5cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_COMPAT_F(syscallname, flags) {	\
938451d0ddSKip Macy     .new_sysent = {						\
948451d0ddSKip Macy 	.sy_narg = (sizeof(struct syscallname ## _args )	\
958451d0ddSKip Macy 	    / sizeof(register_t)),				\
968451d0ddSKip Macy 	.sy_call = (sy_call_t *)& sys_ ## syscallname,		\
97*5cead591SKonstantin Belousov 	.sy_flags = (flags)					\
988451d0ddSKip Macy     },								\
998451d0ddSKip Macy     .syscall_no = FREEBSD32_SYS_##syscallname			\
1008451d0ddSKip Macy }
1018451d0ddSKip Macy 
102*5cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER(syscallname)			\
103*5cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_F(syscallname, 0)
104*5cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_COMPAT(syscallname)		\
105*5cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_COMPAT_F(syscallname, 0)
106*5cead591SKonstantin Belousov 
10788ac915aSJohn Baldwin int    syscall32_register(int *offset, struct sysent *new_sysent,
108e015b1abSMateusz Guzik 	    struct sysent *old_sysent, int flags);
10988ac915aSJohn Baldwin int    syscall32_deregister(int *offset, struct sysent *old_sysent);
11088ac915aSJohn Baldwin int    syscall32_module_handler(struct module *mod, int what, void *arg);
111e015b1abSMateusz Guzik int    syscall32_helper_register(struct syscall_helper_data *sd, int flags);
1120687ba3eSKonstantin Belousov int    syscall32_helper_unregister(struct syscall_helper_data *sd);
11388ac915aSJohn Baldwin 
114c5e4763dSKonstantin Belousov struct iovec32;
1159847e91bSKonstantin Belousov struct rusage32;
1169847e91bSKonstantin Belousov register_t *freebsd32_copyout_strings(struct image_params *imgp);
117c5e4763dSKonstantin Belousov int	freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt,
118c5e4763dSKonstantin Belousov 	    struct iovec **iov, int error);
1199847e91bSKonstantin Belousov void	freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
1209847e91bSKonstantin Belousov 
1210b53d156SKonstantin Belousov struct image_args;
1220b53d156SKonstantin Belousov int freebsd32_exec_copyin_args(struct image_args *args, char *fname,
1230b53d156SKonstantin Belousov 	    enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv);
124841c0c7eSNathan Whitehorn 
125d47faadcSJohn Baldwin #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */
126