xref: /freebsd/sys/compat/freebsd32/freebsd32_util.h (revision 15581af7c2d30360313dcad74dc5dc83c02f9df0)
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 
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 {
44cc5aa0a4SJohn Baldwin 	uint32_t ps_argvstr;	/* first of 0 or more argument strings */
453ebc1248SPeter Wemm 	int	ps_nargvstr;	/* the number of argument strings */
46cc5aa0a4SJohn Baldwin 	uint32_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 
825cead591SKonstantin 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,			\
875cead591SKonstantin Belousov 	.sy_flags = (flags)					\
880687ba3eSKonstantin Belousov     },								\
890687ba3eSKonstantin Belousov     .syscall_no = FREEBSD32_SYS_##syscallname			\
900687ba3eSKonstantin Belousov }
910687ba3eSKonstantin Belousov 
925cead591SKonstantin 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,		\
975cead591SKonstantin Belousov 	.sy_flags = (flags)					\
988451d0ddSKip Macy     },								\
998451d0ddSKip Macy     .syscall_no = FREEBSD32_SYS_##syscallname			\
1008451d0ddSKip Macy }
1018451d0ddSKip Macy 
1025cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER(syscallname)			\
1035cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_F(syscallname, 0)
1045cead591SKonstantin Belousov #define SYSCALL32_INIT_HELPER_COMPAT(syscallname)		\
1055cead591SKonstantin Belousov     SYSCALL32_INIT_HELPER_COMPAT_F(syscallname, 0)
1065cead591SKonstantin Belousov 
10788ac915aSJohn Baldwin int    syscall32_module_handler(struct module *mod, int what, void *arg);
108e015b1abSMateusz Guzik int    syscall32_helper_register(struct syscall_helper_data *sd, int flags);
1090687ba3eSKonstantin Belousov int    syscall32_helper_unregister(struct syscall_helper_data *sd);
11088ac915aSJohn Baldwin 
111c5e4763dSKonstantin Belousov struct iovec32;
1129847e91bSKonstantin Belousov struct rusage32;
11303b0d68cSJohn Baldwin int	freebsd32_copyout_strings(struct image_params *imgp,
11431174518SJohn Baldwin 	    uintptr_t *stack_base);
115c5e4763dSKonstantin Belousov int	freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt,
116c5e4763dSKonstantin Belousov 	    struct iovec **iov, int error);
117694ef157SBrooks Davis int	freebsd32_copyinuio(const struct iovec32 *iovp, u_int iovcnt,
118022ca2fcSAlan Somers 	    struct uio **uiop);
1199847e91bSKonstantin Belousov void	freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32);
1209847e91bSKonstantin Belousov 
1210b53d156SKonstantin Belousov struct image_args;
12212e69f96SBrooks Davis int freebsd32_exec_copyin_args(struct image_args *args, const char *fname,
123*15581af7SWuyang Chung 	    uint32_t *argv, uint32_t *envv);
124841c0c7eSNathan Whitehorn 
125fa8fdd80SKonstantin Belousov struct kinfo_knote;
126fa8fdd80SKonstantin Belousov struct kinfo_knote32;
127fa8fdd80SKonstantin Belousov void	freebsd32_kinfo_knote_to_32(const struct kinfo_knote *kin,
128fa8fdd80SKonstantin Belousov 	    struct kinfo_knote32 *kin32);
129fa8fdd80SKonstantin Belousov 
1305a2bbaceSKonstantin Belousov extern int compat_freebsd_32bit;
1315a2bbaceSKonstantin Belousov 
132d47faadcSJohn Baldwin #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */
133