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> 37*a9c9e80bSKonstantin 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 5046159d1fSPeter Wemm #if defined(__amd64__) || defined(__ia64__) 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 820687ba3eSKonstantin Belousov #define SYSCALL32_INIT_HELPER(syscallname) { \ 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, \ 870687ba3eSKonstantin Belousov }, \ 880687ba3eSKonstantin Belousov .syscall_no = FREEBSD32_SYS_##syscallname \ 890687ba3eSKonstantin Belousov } 900687ba3eSKonstantin Belousov 9188ac915aSJohn Baldwin int syscall32_register(int *offset, struct sysent *new_sysent, 9288ac915aSJohn Baldwin struct sysent *old_sysent); 9388ac915aSJohn Baldwin int syscall32_deregister(int *offset, struct sysent *old_sysent); 9488ac915aSJohn Baldwin int syscall32_module_handler(struct module *mod, int what, void *arg); 950687ba3eSKonstantin Belousov int syscall32_helper_register(struct syscall_helper_data *sd); 960687ba3eSKonstantin Belousov int syscall32_helper_unregister(struct syscall_helper_data *sd); 9788ac915aSJohn Baldwin 98c5e4763dSKonstantin Belousov struct iovec32; 999847e91bSKonstantin Belousov struct rusage32; 1009847e91bSKonstantin Belousov register_t *freebsd32_copyout_strings(struct image_params *imgp); 101c5e4763dSKonstantin Belousov int freebsd32_copyiniov(struct iovec32 *iovp, u_int iovcnt, 102c5e4763dSKonstantin Belousov struct iovec **iov, int error); 1039847e91bSKonstantin Belousov void freebsd32_rusage_out(const struct rusage *s, struct rusage32 *s32); 1049847e91bSKonstantin Belousov 1050b53d156SKonstantin Belousov struct image_args; 1060b53d156SKonstantin Belousov int freebsd32_exec_copyin_args(struct image_args *args, char *fname, 1070b53d156SKonstantin Belousov enum uio_seg segflg, u_int32_t *argv, u_int32_t *envv); 108841c0c7eSNathan Whitehorn 109d47faadcSJohn Baldwin #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */ 110