xref: /freebsd/sys/compat/freebsd32/freebsd32_util.h (revision 022ca2fc7fe08d51f33a1d23a9be49e6d132914e)
13ebc1248SPeter Wemm /*-
27f2d13d6SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
37f2d13d6SPedro F. Giffuni  *
43ebc1248SPeter Wemm  * Copyright (c) 1998-1999 Andrew Gallatin
53ebc1248SPeter Wemm  * All rights reserved.
63ebc1248SPeter Wemm  *
73ebc1248SPeter Wemm  * Redistribution and use in source and binary forms, with or without
83ebc1248SPeter Wemm  * modification, are permitted provided that the following conditions
93ebc1248SPeter Wemm  * are met:
103ebc1248SPeter Wemm  * 1. Redistributions of source code must retain the above copyright
113ebc1248SPeter Wemm  *    notice, this list of conditions and the following disclaimer
123ebc1248SPeter Wemm  *    in this position and unchanged.
133ebc1248SPeter Wemm  * 2. Redistributions in binary form must reproduce the above copyright
143ebc1248SPeter Wemm  *    notice, this list of conditions and the following disclaimer in the
153ebc1248SPeter Wemm  *    documentation and/or other materials provided with the distribution.
163ebc1248SPeter Wemm  * 3. The name of the author may not be used to endorse or promote products
173ebc1248SPeter Wemm  *    derived from this software withough specific prior written permission
183ebc1248SPeter Wemm  *
193ebc1248SPeter Wemm  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
203ebc1248SPeter Wemm  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
213ebc1248SPeter Wemm  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
223ebc1248SPeter Wemm  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
233ebc1248SPeter Wemm  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
243ebc1248SPeter Wemm  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253ebc1248SPeter Wemm  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263ebc1248SPeter Wemm  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273ebc1248SPeter Wemm  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
283ebc1248SPeter Wemm  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293ebc1248SPeter Wemm  *
303ebc1248SPeter Wemm  * $FreeBSD$
313ebc1248SPeter Wemm  */
323ebc1248SPeter Wemm 
33d47faadcSJohn Baldwin #ifndef _COMPAT_FREEBSD32_FREEBSD32_UTIL_H_
34d47faadcSJohn Baldwin #define _COMPAT_FREEBSD32_FREEBSD32_UTIL_H_
35d47faadcSJohn Baldwin 
36d47faadcSJohn Baldwin #include <sys/cdefs.h>
37d47faadcSJohn Baldwin #include <sys/exec.h>
38d47faadcSJohn Baldwin #include <sys/sysent.h>
39a9c9e80bSKonstantin Belousov #include <sys/uio.h>
40d47faadcSJohn Baldwin 
413ebc1248SPeter Wemm #include <vm/vm.h>
423ebc1248SPeter Wemm #include <vm/vm_param.h>
433ebc1248SPeter Wemm #include <vm/pmap.h>
443ebc1248SPeter Wemm 
451c7abef7SPeter Wemm struct freebsd32_ps_strings {
463ebc1248SPeter Wemm 	u_int32_t ps_argvstr;	/* first of 0 or more argument strings */
473ebc1248SPeter Wemm 	int	ps_nargvstr;	/* the number of argument strings */
483ebc1248SPeter Wemm 	u_int32_t ps_envstr;	/* first of 0 or more environment strings */
493ebc1248SPeter Wemm 	int	ps_nenvstr;	/* the number of environment strings */
503ebc1248SPeter Wemm };
513ebc1248SPeter Wemm 
52e7d939bdSMarcel Moolenaar #if defined(__amd64__)
5346159d1fSPeter Wemm #include <compat/ia32/ia32_util.h>
5446159d1fSPeter Wemm #endif
5546159d1fSPeter Wemm 
561c7abef7SPeter Wemm #define FREEBSD32_PS_STRINGS	\
571c7abef7SPeter Wemm 	(FREEBSD32_USRSTACK - sizeof(struct freebsd32_ps_strings))
58d47faadcSJohn Baldwin 
5988ac915aSJohn Baldwin extern struct sysent freebsd32_sysent[];
6088ac915aSJohn Baldwin 
6188ac915aSJohn Baldwin #define SYSCALL32_MODULE(name, offset, new_sysent, evh, arg)   \
6288ac915aSJohn Baldwin static struct syscall_module_data name##_syscall32_mod = {     \
6388ac915aSJohn Baldwin        evh, arg, offset, new_sysent, { 0, NULL }               \
6488ac915aSJohn Baldwin };                                                             \
6588ac915aSJohn Baldwin                                                                \
6688ac915aSJohn Baldwin static moduledata_t name##32_mod = {                           \
6799b331a9SKonstantin Belousov        "sys32/" #name,                                         \
6888ac915aSJohn Baldwin        syscall32_module_handler,                               \
6988ac915aSJohn Baldwin        &name##_syscall32_mod                                   \
7088ac915aSJohn Baldwin };                                                             \
7188ac915aSJohn Baldwin DECLARE_MODULE(name##32, name##32_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE)
7288ac915aSJohn Baldwin 
7388ac915aSJohn Baldwin #define SYSCALL32_MODULE_HELPER(syscallname)            \
7488ac915aSJohn Baldwin static int syscallname##_syscall32 = FREEBSD32_SYS_##syscallname; \
7588ac915aSJohn Baldwin static struct sysent syscallname##_sysent32 = {         \
7688ac915aSJohn Baldwin     (sizeof(struct syscallname ## _args )               \
7788ac915aSJohn Baldwin      / sizeof(register_t)),                             \
7888ac915aSJohn Baldwin     (sy_call_t *)& syscallname                          \
7988ac915aSJohn Baldwin };                                                      \
8088ac915aSJohn Baldwin SYSCALL32_MODULE(syscallname,                           \
8188ac915aSJohn Baldwin     & syscallname##_syscall32, & syscallname##_sysent32,\
8288ac915aSJohn Baldwin     NULL, NULL);
8388ac915aSJohn Baldwin 
845cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_F(syscallname, flags) {		\
850687ba3eSKonstantin Belousov     .new_sysent = {						\
860687ba3eSKonstantin Belousov 	.sy_narg = (sizeof(struct syscallname ## _args )	\
870687ba3eSKonstantin Belousov 	    / sizeof(register_t)),				\
880687ba3eSKonstantin Belousov 	.sy_call = (sy_call_t *)& syscallname,			\
895cead591SKonstantin Belousov 	.sy_flags = (flags)					\
900687ba3eSKonstantin Belousov     },								\
910687ba3eSKonstantin Belousov     .syscall_no = FREEBSD32_SYS_##syscallname			\
920687ba3eSKonstantin Belousov }
930687ba3eSKonstantin Belousov 
945cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_COMPAT_F(syscallname, flags) {	\
958451d0ddSKip Macy     .new_sysent = {						\
968451d0ddSKip Macy 	.sy_narg = (sizeof(struct syscallname ## _args )	\
978451d0ddSKip Macy 	    / sizeof(register_t)),				\
988451d0ddSKip Macy 	.sy_call = (sy_call_t *)& sys_ ## syscallname,		\
995cead591SKonstantin Belousov 	.sy_flags = (flags)					\
1008451d0ddSKip Macy     },								\
1018451d0ddSKip Macy     .syscall_no = FREEBSD32_SYS_##syscallname			\
1028451d0ddSKip Macy }
1038451d0ddSKip Macy 
1045cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER(syscallname)			\
1055cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_F(syscallname, 0)
1065cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_COMPAT(syscallname)		\
1075cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_COMPAT_F(syscallname, 0)
1085cead591SKonstantin Belousov 
10988ac915aSJohn Baldwin int    syscall32_module_handler(struct module *mod, int what, void *arg);
110e015b1abSMateusz Guzik int    syscall32_helper_register(struct syscall_helper_data *sd, int flags);
1110687ba3eSKonstantin Belousov int    syscall32_helper_unregister(struct syscall_helper_data *sd);
11288ac915aSJohn Baldwin 
113c5e4763dSKonstantin Belousov struct iovec32;
1149847e91bSKonstantin Belousov struct rusage32;
11503b0d68cSJohn Baldwin int	freebsd32_copyout_strings(struct image_params *imgp,
11631174518SJohn Baldwin 	    uintptr_t *stack_base);
117c5e4763dSKonstantin Belousov int	freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt,
118c5e4763dSKonstantin Belousov 	    struct iovec **iov, int error);
119*022ca2fcSAlan Somers int	freebsd32_copyinuio(struct iovec32 *iovp, u_int iovcnt,
120*022ca2fcSAlan Somers 	    struct uio **uiop);
1219847e91bSKonstantin Belousov void	freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
1229847e91bSKonstantin Belousov 
1230b53d156SKonstantin Belousov struct image_args;
12412e69f96SBrooks Davis int freebsd32_exec_copyin_args(struct image_args *args, const char *fname,
1250b53d156SKonstantin Belousov 	    enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv);
126841c0c7eSNathan Whitehorn 
127d47faadcSJohn Baldwin #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */
128