1*c2f48922Sriastradh /* $NetBSD: netbsd32_ioctl.c,v 1.122 2024/11/10 16:20:12 riastradh Exp $ */ 23ba6ab09Smrg 33ba6ab09Smrg /* 4e63635fdSmrg * Copyright (c) 1998, 2001 Matthew R. Green 53ba6ab09Smrg * All rights reserved. 63ba6ab09Smrg * 73ba6ab09Smrg * Redistribution and use in source and binary forms, with or without 83ba6ab09Smrg * modification, are permitted provided that the following conditions 93ba6ab09Smrg * are met: 103ba6ab09Smrg * 1. Redistributions of source code must retain the above copyright 113ba6ab09Smrg * notice, this list of conditions and the following disclaimer. 123ba6ab09Smrg * 2. Redistributions in binary form must reproduce the above copyright 133ba6ab09Smrg * notice, this list of conditions and the following disclaimer in the 143ba6ab09Smrg * documentation and/or other materials provided with the distribution. 153ba6ab09Smrg * 163ba6ab09Smrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 173ba6ab09Smrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 183ba6ab09Smrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 193ba6ab09Smrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 203ba6ab09Smrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 213ba6ab09Smrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 223ba6ab09Smrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 233ba6ab09Smrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 243ba6ab09Smrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 253ba6ab09Smrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 263ba6ab09Smrg * SUCH DAMAGE. 273ba6ab09Smrg */ 283ba6ab09Smrg 293ba6ab09Smrg /* 305d06ed3cSmrg * handle ioctl conversions from netbsd32 -> 64-bit kernel 313ba6ab09Smrg */ 323ba6ab09Smrg 33dab6ef8bSlukem #include <sys/cdefs.h> 34*c2f48922Sriastradh __KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.122 2024/11/10 16:20:12 riastradh Exp $"); 35e6d67a8fSrin 36e6d67a8fSrin #if defined(_KERNEL_OPT) 37e6d67a8fSrin #include "opt_ntp.h" 38e6d67a8fSrin #endif 39dab6ef8bSlukem 403ba6ab09Smrg #include <sys/param.h> 418e6cd4ceSriastradh #include <sys/atomic.h> 423ba6ab09Smrg #include <sys/systm.h> 431e8c5f21Seeh #include <sys/filedesc.h> 441e8c5f21Seeh #include <sys/ioctl.h> 451e8c5f21Seeh #include <sys/file.h> 461e8c5f21Seeh #include <sys/proc.h> 471e8c5f21Seeh #include <sys/socketvar.h> 483ba6ab09Smrg #include <sys/audioio.h> 493ba6ab09Smrg #include <sys/disklabel.h> 503ba6ab09Smrg #include <sys/dkio.h> 5132ccd9f2Smanu #include <sys/ataio.h> 523ba6ab09Smrg #include <sys/sockio.h> 533ba6ab09Smrg #include <sys/socket.h> 543ba6ab09Smrg #include <sys/ttycom.h> 553ba6ab09Smrg #include <sys/mount.h> 563ba6ab09Smrg #include <sys/syscallargs.h> 57226b6c84Snjoly #include <sys/ktrace.h> 58a9ca7a37Sad #include <sys/kmem.h> 596795d62eSnjoly #include <sys/envsys.h> 60166893d4Sbouyer #include <sys/wdog.h> 61254cd918Schristos #include <sys/clockctl.h> 620828cd07Smatt #include <sys/exec_elf.h> 63d0c9fc59Smatt #include <sys/ksyms.h> 645be74d29Sjmcneill #include <sys/drvctlio.h> 65d91f98a8Spgoyette #include <sys/compat_stub.h> 663ba6ab09Smrg 67bfaaad74Schristos #include <sys/vnode.h> 68bfaaad74Schristos #include <sys/conf.h> 69bfaaad74Schristos #include <miscfs/specfs/specdev.h> 70bfaaad74Schristos 71fe75469dSfvdl #ifdef __sparc__ 72e38a2e56Sthorpej #include <dev/sun/fbio.h> 733ba6ab09Smrg #include <machine/openpromio.h> 74fe75469dSfvdl #endif 753ba6ab09Smrg 763ba6ab09Smrg #include <net/if.h> 773ba6ab09Smrg #include <net/route.h> 783ba6ab09Smrg 79fc67b5dcSroy #include <net/if_pppoe.h> 8027cf308bSroy #include <net/if_sppp.h> 8127cf308bSroy 82ccc80301Sbouyer #include <net/bpf.h> 833ba6ab09Smrg #include <netinet/in.h> 843ba6ab09Smrg #include <netinet/in_var.h> 853ba6ab09Smrg #include <netinet/igmp.h> 863ba6ab09Smrg #include <netinet/igmp_var.h> 873ba6ab09Smrg #include <netinet/ip_mroute.h> 883ba6ab09Smrg 899742d884Ssimonb #include <netinet6/nd6.h> 909742d884Ssimonb #include <netinet6/in6_var.h> 919742d884Ssimonb 929bf57b1fSchristos #include <compat/sys/sockio.h> 939bf57b1fSchristos 94a5867d93Smrg #include <compat/netbsd32/netbsd32.h> 95a5867d93Smrg #include <compat/netbsd32/netbsd32_ioctl.h> 96a5867d93Smrg #include <compat/netbsd32/netbsd32_syscallargs.h> 97ac0b0395Smlelstv #include <compat/netbsd32/netbsd32_conv.h> 983ba6ab09Smrg 99f89159bbSsimonb #include <dev/fssvar.h> 100c97f9c82Smrg #include <dev/vndvar.h> 101c97f9c82Smrg 1028f951525Smrg /* convert to/from different structures */ 1038f951525Smrg 104a3ff3a30Sfvdl #if 0 1050f0296d8Sperry static inline void 106e19818fbSmsaitoh netbsd32_to_format_op(struct netbsd32_format_op *s32p, 107e19818fbSmsaitoh struct format_op *p, u_long cmd) 1083ba6ab09Smrg { 1093ba6ab09Smrg 110cb521158Sscw p->df_buf = (char *)NETBSD32PTR64(s32p->df_buf); 1113ba6ab09Smrg p->df_count = s32p->df_count; 1123ba6ab09Smrg p->df_startblk = s32p->df_startblk; 1133ba6ab09Smrg memcpy(p->df_reg, s32p->df_reg, sizeof(s32p->df_reg)); 1143ba6ab09Smrg } 115a3ff3a30Sfvdl #endif 1163ba6ab09Smrg 1170f0296d8Sperry static inline void 11828bae79bSdsl netbsd32_to_ifreq(struct netbsd32_ifreq *s32p, struct ifreq *p, u_long cmd) 1193ba6ab09Smrg { 1203ba6ab09Smrg 1211d9c8161Smrg memcpy(p, s32p, sizeof *s32p); 1223ba6ab09Smrg /* 1233ba6ab09Smrg * XXX 1243ba6ab09Smrg * struct ifreq says the same, but sometimes the ifr_data 1253ba6ab09Smrg * union member needs to be converted to 64 bits... this 1263ba6ab09Smrg * is very driver specific and so we ignore it for now.. 1273ba6ab09Smrg */ 12817b1a5f7Sjmcneill switch (cmd) { 12917b1a5f7Sjmcneill case SIOCGIFDATA: 13017b1a5f7Sjmcneill case SIOCZIFDATA: 13117b1a5f7Sjmcneill case SIOCGIFGENERIC: 13217b1a5f7Sjmcneill case SIOCSIFGENERIC: 13353524e44Schristos p->ifr_data = (void *)NETBSD32PTR64(s32p->ifr_data); 13417b1a5f7Sjmcneill break; 13517b1a5f7Sjmcneill } 1363ba6ab09Smrg } 1373ba6ab09Smrg 1380f0296d8Sperry static inline void 13967de10fcSchristos netbsd32_to_oifreq(struct netbsd32_oifreq *s32p, struct oifreq *p, u_long cmd) 14067de10fcSchristos { 14167de10fcSchristos 14267de10fcSchristos memcpy(p, s32p, sizeof *s32p); 14367de10fcSchristos /* 14467de10fcSchristos * XXX 14567de10fcSchristos * struct ifreq says the same, but sometimes the ifr_data 14667de10fcSchristos * union member needs to be converted to 64 bits... this 14767de10fcSchristos * is very driver specific and so we ignore it for now.. 14867de10fcSchristos */ 14967de10fcSchristos if (cmd == SIOCGIFDATA || cmd == SIOCZIFDATA) 15067de10fcSchristos p->ifr_data = (void *)NETBSD32PTR64(s32p->ifr_data); 15167de10fcSchristos } 15267de10fcSchristos 15367de10fcSchristos static inline void 154ed4d3e75Smartin netbsd32_to_ifdatareq(struct netbsd32_ifdatareq *s32p, struct ifdatareq *p, u_long cmd) 155ed4d3e75Smartin { 156ed4d3e75Smartin 157ed4d3e75Smartin memcpy(p, s32p, sizeof *s32p); 158ed4d3e75Smartin switch (cmd) { 159ed4d3e75Smartin case SIOCGIFDATA: 160ed4d3e75Smartin case SIOCZIFDATA: 161ed4d3e75Smartin netbsd32_to_timespec(&s32p->ifdr_data.ifi_lastchange, 162ed4d3e75Smartin &p->ifdr_data.ifi_lastchange); 163ed4d3e75Smartin break; 164ed4d3e75Smartin } 165ed4d3e75Smartin } 166ed4d3e75Smartin 167ed4d3e75Smartin static inline void 1680f0d2276Smatt netbsd32_to_if_addrprefreq(const struct netbsd32_if_addrprefreq *ifap32, 1690f0d2276Smatt struct if_addrprefreq *ifap, u_long cmd) 1700f0d2276Smatt { 171e19818fbSmsaitoh 172bc41a15eSmlelstv memcpy(ifap->ifap_name, ifap32->ifap_name, IFNAMSIZ); 1730f0d2276Smatt ifap->ifap_preference = ifap32->ifap_preference; 1740f0d2276Smatt memcpy(&ifap->ifap_addr, &ifap32->ifap_addr, 175d1579b2dSriastradh uimin(ifap32->ifap_addr.ss_len, _SS_MAXSIZE)); 1760f0d2276Smatt } 1770f0d2276Smatt 1780f0d2276Smatt static inline void 17928bae79bSdsl netbsd32_to_ifconf(struct netbsd32_ifconf *s32p, struct ifconf *p, u_long cmd) 1803ba6ab09Smrg { 1813ba6ab09Smrg 1823ba6ab09Smrg p->ifc_len = s32p->ifc_len; 1833ba6ab09Smrg /* ifc_buf & ifc_req are the same size so this works */ 18453524e44Schristos p->ifc_buf = (void *)NETBSD32PTR64(s32p->ifc_buf); 1853ba6ab09Smrg } 1863ba6ab09Smrg 1870f0296d8Sperry static inline void 188e19818fbSmsaitoh netbsd32_to_ifmediareq(struct netbsd32_ifmediareq *s32p, 189e19818fbSmsaitoh struct ifmediareq *p, u_long cmd) 1903ba6ab09Smrg { 1913ba6ab09Smrg 1923ba6ab09Smrg memcpy(p, s32p, sizeof *s32p); 193cb521158Sscw p->ifm_ulist = (int *)NETBSD32PTR64(s32p->ifm_ulist); 1943ba6ab09Smrg } 1953ba6ab09Smrg 196fc67b5dcSroy static inline void 19784d9fa6cSroy netbsd32_to_in_nbrinfo(struct netbsd32_in_nbrinfo *s32p, struct in_nbrinfo *p, 19884d9fa6cSroy u_long cmd) 19984d9fa6cSroy { 20084d9fa6cSroy 20184d9fa6cSroy memcpy(p->ifname, s32p->ifname, sizeof p->ifname); 20284d9fa6cSroy memcpy(&p->addr, &s32p->addr, sizeof p->addr); 20384d9fa6cSroy p->asked = s32p->asked; 20484d9fa6cSroy p->state = s32p->state; 20584d9fa6cSroy p->expire = s32p->expire; 20684d9fa6cSroy } 20784d9fa6cSroy 20884d9fa6cSroy static inline void 2099742d884Ssimonb netbsd32_to_in6_nbrinfo(struct netbsd32_in6_nbrinfo *s32p, struct in6_nbrinfo *p, 2109742d884Ssimonb u_long cmd) 2119742d884Ssimonb { 2129742d884Ssimonb 2139742d884Ssimonb memcpy(p->ifname, s32p->ifname, sizeof p->ifname); 2149742d884Ssimonb memcpy(&p->addr, &s32p->addr, sizeof p->addr); 2159742d884Ssimonb p->asked = s32p->asked; 2169742d884Ssimonb p->isrouter = s32p->isrouter; 2179742d884Ssimonb p->state = s32p->state; 2189742d884Ssimonb p->expire = s32p->expire; 2199742d884Ssimonb } 2209742d884Ssimonb 2219742d884Ssimonb static inline void 222fc67b5dcSroy netbsd32_to_pppoediscparms(struct netbsd32_pppoediscparms *s32p, 223fc67b5dcSroy struct pppoediscparms *p, u_long cmd) 224fc67b5dcSroy { 225fc67b5dcSroy 226fc67b5dcSroy memcpy(p->ifname, s32p->ifname, sizeof p->ifname); 227fc67b5dcSroy memcpy(p->eth_ifname, s32p->eth_ifname, sizeof p->eth_ifname); 228fc67b5dcSroy p->ac_name = (char *)NETBSD32PTR64(s32p->ac_name); 229fc67b5dcSroy p->ac_name_len = s32p->ac_name_len; 230fc67b5dcSroy p->service_name = (char *)NETBSD32PTR64(s32p->service_name); 231fc67b5dcSroy p->service_name_len = s32p->service_name_len; 232fc67b5dcSroy } 233fc67b5dcSroy 23427cf308bSroy static inline void 23527cf308bSroy netbsd32_to_spppauthcfg(struct netbsd32_spppauthcfg *s32p, 23627cf308bSroy struct spppauthcfg *p, u_long cmd) 23727cf308bSroy { 23827cf308bSroy 23927cf308bSroy memcpy(p->ifname, s32p->ifname, sizeof p->ifname); 24027cf308bSroy p->hisauth = s32p->hisauth; 24127cf308bSroy p->myauth = s32p->myauth; 24227cf308bSroy p->myname_length = s32p->myname_length; 24327cf308bSroy p->mysecret_length = s32p->mysecret_length; 24427cf308bSroy p->hisname_length = s32p->hisname_length; 24527cf308bSroy p->hissecret_length = s32p->hissecret_length; 24627cf308bSroy p->myauthflags = s32p->myauthflags; 24727cf308bSroy p->hisauthflags = s32p->hisauthflags; 24827cf308bSroy p->myname = (char *)NETBSD32PTR64(s32p->myname); 24927cf308bSroy p->mysecret = (char *)NETBSD32PTR64(s32p->mysecret); 25027cf308bSroy p->hisname = (char *)NETBSD32PTR64(s32p->hisname); 25127cf308bSroy p->hissecret = (char *)NETBSD32PTR64(s32p->hissecret); 25227cf308bSroy } 25327cf308bSroy 2540f0296d8Sperry static inline void 25528bae79bSdsl netbsd32_to_ifdrv(struct netbsd32_ifdrv *s32p, struct ifdrv *p, u_long cmd) 2563ba6ab09Smrg { 2573ba6ab09Smrg 258c4fd6408Sroy memcpy(p->ifd_name, s32p->ifd_name, sizeof p->ifd_name); 259aeae3560Smatt p->ifd_cmd = s32p->ifd_cmd; 260aeae3560Smatt p->ifd_len = s32p->ifd_len; 261cb521158Sscw p->ifd_data = (void *)NETBSD32PTR64(s32p->ifd_data); 2623ba6ab09Smrg } 2633ba6ab09Smrg 2640f0296d8Sperry static inline void 265e19818fbSmsaitoh netbsd32_to_sioc_vif_req(struct netbsd32_sioc_vif_req *s32p, 266e19818fbSmsaitoh struct sioc_vif_req *p, u_long cmd) 2673ba6ab09Smrg { 2683ba6ab09Smrg 2693ba6ab09Smrg p->vifi = s32p->vifi; 2703ba6ab09Smrg p->icount = (u_long)s32p->icount; 2713ba6ab09Smrg p->ocount = (u_long)s32p->ocount; 2723ba6ab09Smrg p->ibytes = (u_long)s32p->ibytes; 2733ba6ab09Smrg p->obytes = (u_long)s32p->obytes; 2743ba6ab09Smrg } 2753ba6ab09Smrg 2760f0296d8Sperry static inline void 277e19818fbSmsaitoh netbsd32_to_sioc_sg_req(struct netbsd32_sioc_sg_req *s32p, 278e19818fbSmsaitoh struct sioc_sg_req *p, u_long cmd) 2793ba6ab09Smrg { 2803ba6ab09Smrg 2813ba6ab09Smrg p->src = s32p->src; 2823ba6ab09Smrg p->grp = s32p->grp; 2833ba6ab09Smrg p->pktcnt = (u_long)s32p->pktcnt; 2843ba6ab09Smrg p->bytecnt = (u_long)s32p->bytecnt; 2853ba6ab09Smrg p->wrong_if = (u_long)s32p->wrong_if; 2863ba6ab09Smrg } 2873ba6ab09Smrg 2889e2edd2bSmrg static inline void 2892b90ec0aSsimonb netbsd32_to_kfilter_mapping(struct netbsd32_kfilter_mapping *s32p, 2902b90ec0aSsimonb struct kfilter_mapping *p, u_long cmd) 2912b90ec0aSsimonb { 2922b90ec0aSsimonb 2932b90ec0aSsimonb p->name = (char *)NETBSD32PTR64(s32p->name); 2942b90ec0aSsimonb p->len = s32p->len; 2952b90ec0aSsimonb p->filter = s32p->filter; 2962b90ec0aSsimonb } 2972b90ec0aSsimonb 2982b90ec0aSsimonb static inline void 29932ccd9f2Smanu netbsd32_to_atareq(struct netbsd32_atareq *s32p, struct atareq *p, u_long cmd) 30032ccd9f2Smanu { 301e19818fbSmsaitoh 30232ccd9f2Smanu p->flags = (u_long)s32p->flags; 30332ccd9f2Smanu p->command = s32p->command; 30432ccd9f2Smanu p->features = s32p->features; 30532ccd9f2Smanu p->sec_count = s32p->sec_count; 30632ccd9f2Smanu p->sec_num = s32p->sec_num; 30732ccd9f2Smanu p->head = s32p->head; 30832ccd9f2Smanu p->cylinder = s32p->cylinder; 30932ccd9f2Smanu p->databuf = (char *)NETBSD32PTR64(s32p->databuf); 31032ccd9f2Smanu p->datalen = (u_long)s32p->datalen; 31132ccd9f2Smanu p->timeout = s32p->timeout; 31232ccd9f2Smanu p->retsts = s32p->retsts; 31332ccd9f2Smanu p->error = s32p->error; 31432ccd9f2Smanu } 31532ccd9f2Smanu 31632ccd9f2Smanu static inline void 317f89159bbSsimonb netbsd32_to_fss_set(struct netbsd32_fss_set *s32p, struct fss_set *p, 318f89159bbSsimonb u_long cmd) 319f89159bbSsimonb { 320f89159bbSsimonb 321f89159bbSsimonb p->fss_mount = (char *)NETBSD32PTR64(s32p->fss_mount); 322f89159bbSsimonb p->fss_bstore = (char *)NETBSD32PTR64(s32p->fss_bstore); 323f89159bbSsimonb p->fss_csize = s32p->fss_csize; 324f89159bbSsimonb p->fss_flags = s32p->fss_flags; 325f89159bbSsimonb } 326f89159bbSsimonb 327f89159bbSsimonb static inline void 328f89159bbSsimonb netbsd32_to_fss_get(struct netbsd32_fss_get *s32p, struct fss_get *p, 329f89159bbSsimonb u_long cmd) 330f89159bbSsimonb { 331f89159bbSsimonb 332f89159bbSsimonb memcpy(p->fsg_mount, s32p->fsg_mount, MNAMELEN); 333f89159bbSsimonb netbsd32_to_timeval(&s32p->fsg_time, &p->fsg_time); 334f89159bbSsimonb p->fsg_csize = s32p->fsg_csize; 335f89159bbSsimonb p->fsg_mount_size = s32p->fsg_mount_size; 336f89159bbSsimonb p->fsg_bs_size = s32p->fsg_bs_size; 337f89159bbSsimonb 338f89159bbSsimonb } 339f89159bbSsimonb 340f89159bbSsimonb static inline void 341e19818fbSmsaitoh netbsd32_to_vnd_ioctl(struct netbsd32_vnd_ioctl *s32p, 342e19818fbSmsaitoh struct vnd_ioctl *p, u_long cmd) 3439e2edd2bSmrg { 3449e2edd2bSmrg 3459e2edd2bSmrg p->vnd_file = (char *)NETBSD32PTR64(s32p->vnd_file); 3469e2edd2bSmrg p->vnd_flags = s32p->vnd_flags; 3479e2edd2bSmrg p->vnd_geom = s32p->vnd_geom; 3489e2edd2bSmrg p->vnd_osize = s32p->vnd_osize; 3499e2edd2bSmrg p->vnd_size = s32p->vnd_size; 3509e2edd2bSmrg } 3519e2edd2bSmrg 3529e2edd2bSmrg static inline void 353e19818fbSmsaitoh netbsd32_to_vnd_user(struct netbsd32_vnd_user *s32p, 354e19818fbSmsaitoh struct vnd_user *p, u_long cmd) 3559e2edd2bSmrg { 3569e2edd2bSmrg 3579e2edd2bSmrg p->vnu_unit = s32p->vnu_unit; 3589e2edd2bSmrg p->vnu_dev = s32p->vnu_dev; 3599e2edd2bSmrg p->vnu_ino = s32p->vnu_ino; 3609e2edd2bSmrg } 3619e2edd2bSmrg 362c97f9c82Smrg static inline void 363e19818fbSmsaitoh netbsd32_to_vnd_ioctl50(struct netbsd32_vnd_ioctl50 *s32p, 364e19818fbSmsaitoh struct vnd_ioctl50 *p, u_long cmd) 365c97f9c82Smrg { 366c97f9c82Smrg 367c97f9c82Smrg p->vnd_file = (char *)NETBSD32PTR64(s32p->vnd_file); 368c97f9c82Smrg p->vnd_flags = s32p->vnd_flags; 369c97f9c82Smrg p->vnd_geom = s32p->vnd_geom; 370c97f9c82Smrg p->vnd_size = s32p->vnd_size; 371c97f9c82Smrg } 372c97f9c82Smrg 373bb1c6815Smrg static inline void 374e19818fbSmsaitoh netbsd32_to_plistref(struct netbsd32_plistref *s32p, 375e19818fbSmsaitoh struct plistref *p, u_long cmd) 3766795d62eSnjoly { 3776795d62eSnjoly 3786795d62eSnjoly p->pref_plist = NETBSD32PTR64(s32p->pref_plist); 3796795d62eSnjoly p->pref_len = s32p->pref_len; 3806795d62eSnjoly } 3816795d62eSnjoly 3826795d62eSnjoly static inline void 383e19818fbSmsaitoh netbsd32_to_nvlist_ref_t(netbsd32_nvlist_ref_t *s32p, 384e19818fbSmsaitoh nvlist_ref_t *p, u_long cmd) 385c16d8e94Smlelstv { 386c16d8e94Smlelstv 387c16d8e94Smlelstv p->buf = NETBSD32PTR64(s32p->buf); 388c16d8e94Smlelstv p->len = s32p->len; 389c16d8e94Smlelstv p->flags = s32p->flags; 390c16d8e94Smlelstv } 391c16d8e94Smlelstv 392c16d8e94Smlelstv static inline void 393bb1c6815Smrg netbsd32_to_u_long(netbsd32_u_long *s32p, u_long *p, u_long cmd) 394bb1c6815Smrg { 395bb1c6815Smrg 396bb1c6815Smrg *p = (u_long)*s32p; 397bb1c6815Smrg } 398bb1c6815Smrg 399166893d4Sbouyer static inline void 400cb537247Sroy netbsd32_to_voidp(netbsd32_voidp *s32p, voidp *p, u_long cmd) 401cb537247Sroy { 402cb537247Sroy 403cb537247Sroy *p = (void *)NETBSD32PTR64(*s32p); 404cb537247Sroy } 405cb537247Sroy 406cb537247Sroy static inline void 407e19818fbSmsaitoh netbsd32_to_wdog_conf(struct netbsd32_wdog_conf *s32p, 408e19818fbSmsaitoh struct wdog_conf *p, u_long cmd) 409166893d4Sbouyer { 410166893d4Sbouyer 411166893d4Sbouyer p->wc_names = (char *)NETBSD32PTR64(s32p->wc_names); 412166893d4Sbouyer p->wc_count = s32p->wc_count; 413166893d4Sbouyer } 414166893d4Sbouyer 415ccc80301Sbouyer static inline void 416e19818fbSmsaitoh netbsd32_to_npf_ioctl_table(const struct netbsd32_npf_ioctl_table *s32p, 417e19818fbSmsaitoh struct npf_ioctl_table *p, u_long cmd) 418c16d8e94Smlelstv { 419c16d8e94Smlelstv 420c16d8e94Smlelstv p->nct_cmd = s32p->nct_cmd; 421c16d8e94Smlelstv p->nct_name = NETBSD32PTR64(s32p->nct_name); 422c16d8e94Smlelstv switch (s32p->nct_cmd) { 423c16d8e94Smlelstv case NPF_CMD_TABLE_LOOKUP: 424c16d8e94Smlelstv case NPF_CMD_TABLE_ADD: 425c16d8e94Smlelstv case NPF_CMD_TABLE_REMOVE: 426c16d8e94Smlelstv p->nct_data.ent = s32p->nct_data.ent; 427c16d8e94Smlelstv break; 428c16d8e94Smlelstv case NPF_CMD_TABLE_LIST: 429c16d8e94Smlelstv p->nct_data.buf.buf = NETBSD32PTR64(s32p->nct_data.buf.buf); 430c16d8e94Smlelstv p->nct_data.buf.len = s32p->nct_data.buf.len; 431c16d8e94Smlelstv break; 432c16d8e94Smlelstv } 433c16d8e94Smlelstv } 434c16d8e94Smlelstv 435c16d8e94Smlelstv static inline void 436e19818fbSmsaitoh netbsd32_to_bpf_program(struct netbsd32_bpf_program *s32p, 437e19818fbSmsaitoh struct bpf_program *p, u_long cmd) 438ccc80301Sbouyer { 439ccc80301Sbouyer 440ccc80301Sbouyer p->bf_insns = (void *)NETBSD32PTR64(s32p->bf_insns); 441ccc80301Sbouyer p->bf_len = s32p->bf_len; 442ccc80301Sbouyer } 443ccc80301Sbouyer 444ccc80301Sbouyer static inline void 445e19818fbSmsaitoh netbsd32_to_bpf_dltlist(struct netbsd32_bpf_dltlist *s32p, 446e19818fbSmsaitoh struct bpf_dltlist *p, u_long cmd) 447ccc80301Sbouyer { 448ccc80301Sbouyer 449ccc80301Sbouyer p->bfl_list = (void *)NETBSD32PTR64(s32p->bfl_list); 450ccc80301Sbouyer p->bfl_len = s32p->bfl_len; 451ccc80301Sbouyer } 452ccc80301Sbouyer 453daaec637Smacallan /* wsdisplay stuff */ 454daaec637Smacallan static inline void 455e19818fbSmsaitoh netbsd32_to_wsdisplay_addscreendata( 456e19818fbSmsaitoh struct netbsd32_wsdisplay_addscreendata *asd32, 457e19818fbSmsaitoh struct wsdisplay_addscreendata *asd, u_long cmd) 458daaec637Smacallan { 459e19818fbSmsaitoh 460daaec637Smacallan asd->screentype = (char *)NETBSD32PTR64(asd32->screentype); 461daaec637Smacallan asd->emul = (char *)NETBSD32PTR64(asd32->emul); 462daaec637Smacallan asd->idx = asd32->idx; 463daaec637Smacallan } 464daaec637Smacallan 465d9554c19Smacallan static inline void 46682e21017Schristos netbsd32_to_ieee80211req(struct netbsd32_ieee80211req *ireq32, 46782e21017Schristos struct ieee80211req *ireq, u_long cmd) 46882e21017Schristos { 469e19818fbSmsaitoh 470df5586d2Smlelstv memcpy(ireq->i_name, ireq32->i_name, IFNAMSIZ); 47182e21017Schristos ireq->i_type = ireq32->i_type; 47282e21017Schristos ireq->i_val = ireq32->i_val; 47382e21017Schristos ireq->i_len = ireq32->i_len; 47482e21017Schristos ireq->i_data = NETBSD32PTR64(ireq32->i_data); 47582e21017Schristos } 47682e21017Schristos 47782e21017Schristos static inline void 478d9554c19Smacallan netbsd32_to_ieee80211_nwkey(struct netbsd32_ieee80211_nwkey *nwk32, 479e19818fbSmsaitoh struct ieee80211_nwkey *nwk, u_long cmd) 480d9554c19Smacallan { 481d9554c19Smacallan int i; 482d9554c19Smacallan 483df5586d2Smlelstv memcpy(nwk->i_name, nwk32->i_name, IFNAMSIZ); 484d9554c19Smacallan nwk->i_wepon = nwk32->i_wepon; 485d9554c19Smacallan nwk->i_defkid = nwk32->i_defkid; 486d9554c19Smacallan for (i = 0; i < IEEE80211_WEP_NKID; i++) { 487d9554c19Smacallan nwk->i_key[i].i_keylen = nwk32->i_key[i].i_keylen; 488d9554c19Smacallan nwk->i_key[i].i_keydat = 489d9554c19Smacallan NETBSD32PTR64(nwk32->i_key[i].i_keydat); 490d9554c19Smacallan } 491d9554c19Smacallan } 492d9554c19Smacallan 493f7396474Smacallan static inline void 494f7396474Smacallan netbsd32_to_wsdisplay_cursor(struct netbsd32_wsdisplay_cursor *c32, 495e19818fbSmsaitoh struct wsdisplay_cursor *c, u_long cmd) 496f7396474Smacallan { 497e19818fbSmsaitoh 498f7396474Smacallan c->which = c32->which; 499f7396474Smacallan c->enable = c32->enable; 500f7396474Smacallan c->pos.x = c32->pos.x; 501f7396474Smacallan c->pos.y = c32->pos.y; 502f7396474Smacallan c->hot.x = c32->hot.x; 503f7396474Smacallan c->hot.y = c32->hot.y; 504f7396474Smacallan c->size.x = c32->size.x; 505f7396474Smacallan c->size.y = c32->size.y; 506f7396474Smacallan c->cmap.index = c32->cmap.index; 507f7396474Smacallan c->cmap.count = c32->cmap.count; 508f7396474Smacallan c->cmap.red = NETBSD32PTR64(c32->cmap.red); 509f7396474Smacallan c->cmap.green = NETBSD32PTR64(c32->cmap.green); 510f7396474Smacallan c->cmap.blue = NETBSD32PTR64(c32->cmap.blue); 511f7396474Smacallan c->image = NETBSD32PTR64(c32->image); 512f7396474Smacallan c->mask = NETBSD32PTR64(c32->mask); 513f7396474Smacallan } 514f7396474Smacallan 515254cd918Schristos static inline void 51609a234bdSbouyer netbsd32_to_wsdisplay_cmap(struct netbsd32_wsdisplay_cmap *c32, 517e19818fbSmsaitoh struct wsdisplay_cmap *c, u_long cmd) 51809a234bdSbouyer { 519e19818fbSmsaitoh 52009a234bdSbouyer c->index = c32->index; 52109a234bdSbouyer c->count = c32->count; 52209a234bdSbouyer c->red = NETBSD32PTR64(c32->red); 52309a234bdSbouyer c->green = NETBSD32PTR64(c32->green); 52409a234bdSbouyer c->blue = NETBSD32PTR64(c32->blue); 52509a234bdSbouyer } 52609a234bdSbouyer 52709a234bdSbouyer static inline void 528baced4feSmacallan netbsd32_to_wsdisplay_font(struct netbsd32_wsdisplay_font *f32, 529e19818fbSmsaitoh struct wsdisplay_font *f, u_long cmd) 530baced4feSmacallan { 531e19818fbSmsaitoh 532baced4feSmacallan f->name = NETBSD32PTR64(f32->name); 533baced4feSmacallan f->firstchar = f32->firstchar; 534baced4feSmacallan f->numchars = f32->numchars; 535baced4feSmacallan f->encoding = f32->encoding; 536baced4feSmacallan f->fontwidth = f32->fontwidth; 537baced4feSmacallan f->fontheight = f32->fontheight; 538baced4feSmacallan f->stride = f32->stride; 539baced4feSmacallan f->bitorder = f32->bitorder; 540baced4feSmacallan f->byteorder = f32->byteorder; 541baced4feSmacallan f->data = NETBSD32PTR64(f32->data); 542baced4feSmacallan } 543baced4feSmacallan 544baced4feSmacallan static inline void 545baced4feSmacallan netbsd32_to_wsdisplay_usefontdata(struct netbsd32_wsdisplay_usefontdata *f32, 546e19818fbSmsaitoh struct wsdisplay_usefontdata *f, u_long cmd) 547baced4feSmacallan { 548e19818fbSmsaitoh 549baced4feSmacallan f->name = NETBSD32PTR64(f32->name); 550baced4feSmacallan } 551baced4feSmacallan 552baced4feSmacallan static inline void 553254cd918Schristos netbsd32_to_clockctl_settimeofday( 554254cd918Schristos const struct netbsd32_clockctl_settimeofday *s32p, 555e19818fbSmsaitoh struct clockctl_settimeofday *p, u_long cmd) 556254cd918Schristos { 557254cd918Schristos 558254cd918Schristos p->tv = NETBSD32PTR64(s32p->tv); 559254cd918Schristos p->tzp = NETBSD32PTR64(s32p->tzp); 560254cd918Schristos } 561254cd918Schristos 562254cd918Schristos static inline void 563254cd918Schristos netbsd32_to_clockctl_adjtime( 564254cd918Schristos const struct netbsd32_clockctl_adjtime *s32p, 565e19818fbSmsaitoh struct clockctl_adjtime *p, u_long cmd) 566254cd918Schristos { 567254cd918Schristos 568254cd918Schristos p->delta = NETBSD32PTR64(s32p->delta); 569254cd918Schristos p->olddelta = NETBSD32PTR64(s32p->olddelta); 570254cd918Schristos } 571254cd918Schristos 572254cd918Schristos static inline void 573254cd918Schristos netbsd32_to_clockctl_clock_settime( 574254cd918Schristos const struct netbsd32_clockctl_clock_settime *s32p, 575e19818fbSmsaitoh struct clockctl_clock_settime *p, u_long cmd) 576254cd918Schristos { 577254cd918Schristos 578254cd918Schristos p->clock_id = s32p->clock_id; 579254cd918Schristos p->tp = NETBSD32PTR64(s32p->tp); 580254cd918Schristos } 581254cd918Schristos 582bfaaad74Schristos #ifdef NTP 583254cd918Schristos static inline void 584254cd918Schristos netbsd32_to_clockctl_ntp_adjtime( 585254cd918Schristos const struct netbsd32_clockctl_ntp_adjtime *s32p, 586e19818fbSmsaitoh struct clockctl_ntp_adjtime *p, u_long cmd) 587254cd918Schristos { 588254cd918Schristos 589254cd918Schristos p->tp = NETBSD32PTR64(s32p->tp); 590254cd918Schristos p->retval = s32p->retval; 591254cd918Schristos } 592bfaaad74Schristos #endif 593254cd918Schristos 594d0c9fc59Smatt static inline void 595e19818fbSmsaitoh netbsd32_to_ksyms_gsymbol(const struct netbsd32_ksyms_gsymbol *s32p, 596e19818fbSmsaitoh struct ksyms_gsymbol *p, u_long cmd) 597d0c9fc59Smatt { 598d0c9fc59Smatt 599d0c9fc59Smatt p->kg_name = NETBSD32PTR64(s32p->kg_name); 600d0c9fc59Smatt } 601d0c9fc59Smatt 602d0c9fc59Smatt static inline void 603e19818fbSmsaitoh netbsd32_to_ksyms_gvalue(const struct netbsd32_ksyms_gvalue *s32p, 604e19818fbSmsaitoh struct ksyms_gvalue *p, u_long cmd) 605d0c9fc59Smatt { 606d0c9fc59Smatt 607d0c9fc59Smatt p->kv_name = NETBSD32PTR64(s32p->kv_name); 608d0c9fc59Smatt } 609d0c9fc59Smatt 610cb537247Sroy static inline void 611e19818fbSmsaitoh netbsd32_to_devlistargs(const struct netbsd32_devlistargs *s32p, 612e19818fbSmsaitoh struct devlistargs *p, u_long cmd) 6135be74d29Sjmcneill { 614e19818fbSmsaitoh 6155be74d29Sjmcneill memcpy(p->l_devname, s32p->l_devname, sizeof(p->l_devname)); 6165be74d29Sjmcneill p->l_children = s32p->l_children; 6175be74d29Sjmcneill p->l_childname = NETBSD32PTR64(s32p->l_childname); 6185be74d29Sjmcneill } 6195be74d29Sjmcneill 6205be74d29Sjmcneill static inline void 621e19818fbSmsaitoh netbsd32_to_devrescanargs(const struct netbsd32_devrescanargs *s32p, 622e19818fbSmsaitoh struct devrescanargs *p, u_long cmd) 6235be74d29Sjmcneill { 624e19818fbSmsaitoh 6255be74d29Sjmcneill memcpy(p->busname, s32p->busname, sizeof(p->busname)); 6265be74d29Sjmcneill memcpy(p->ifattr, s32p->ifattr, sizeof(p->ifattr)); 6275be74d29Sjmcneill p->numlocators = s32p->numlocators; 6285be74d29Sjmcneill p->locators = NETBSD32PTR64(s32p->locators); 6295be74d29Sjmcneill } 6305be74d29Sjmcneill 6311261ded2Smlelstv static inline void 632e19818fbSmsaitoh netbsd32_to_disk_strategy(const struct netbsd32_disk_strategy *s32p, 633e19818fbSmsaitoh struct disk_strategy *p, u_long cmd) 634d7f371cdSjdolecek { 635e19818fbSmsaitoh 636d7f371cdSjdolecek memcpy(p->dks_name, s32p->dks_name, sizeof(p->dks_name)); 637d7f371cdSjdolecek p->dks_param = NETBSD32PTR64(s32p->dks_param); 638d7f371cdSjdolecek p->dks_paramlen = s32p->dks_paramlen; 639d7f371cdSjdolecek } 640d7f371cdSjdolecek 641d7f371cdSjdolecek static inline void 642e19818fbSmsaitoh netbsd32_to_dkwedge_list(const struct netbsd32_dkwedge_list *s32p, 643e19818fbSmsaitoh struct dkwedge_list *p, u_long cmd) 6441261ded2Smlelstv { 645e19818fbSmsaitoh 64687baea7bSjdolecek p->dkwl_buf = NETBSD32PTR64(s32p->dkwl_buf); 6471261ded2Smlelstv p->dkwl_bufsize = s32p->dkwl_bufsize; 6481261ded2Smlelstv p->dkwl_nwedges = s32p->dkwl_nwedges; 6491261ded2Smlelstv p->dkwl_ncopied = s32p->dkwl_ncopied; 6501261ded2Smlelstv } 6511261ded2Smlelstv 6523ba6ab09Smrg /* 6535d06ed3cSmrg * handle ioctl conversions from 64-bit kernel -> netbsd32 6543ba6ab09Smrg */ 6553ba6ab09Smrg 656a3ff3a30Sfvdl #if 0 6570f0296d8Sperry static inline void 658e19818fbSmsaitoh netbsd32_from_format_op(struct format_op *p, 659e19818fbSmsaitoh struct netbsd32_format_op *s32p, u_long cmd) 6603ba6ab09Smrg { 6613ba6ab09Smrg 6623ba6ab09Smrg /* filled in */ 6633ba6ab09Smrg #if 0 664a5867d93Smrg s32p->df_buf = (netbsd32_charp)p->df_buf; 6653ba6ab09Smrg #endif 6663ba6ab09Smrg s32p->df_count = p->df_count; 6673ba6ab09Smrg s32p->df_startblk = p->df_startblk; 6683ba6ab09Smrg memcpy(s32p->df_reg, p->df_reg, sizeof(p->df_reg)); 6693ba6ab09Smrg } 670a3ff3a30Sfvdl #endif 6713ba6ab09Smrg 6720f0296d8Sperry static inline void 67328bae79bSdsl netbsd32_from_ifreq(struct ifreq *p, struct netbsd32_ifreq *s32p, u_long cmd) 6743ba6ab09Smrg { 6753ba6ab09Smrg 6763ba6ab09Smrg /* 6773ba6ab09Smrg * XXX 6783ba6ab09Smrg * struct ifreq says the same, but sometimes the ifr_data 6793ba6ab09Smrg * union member needs to be converted to 64 bits... this 6803ba6ab09Smrg * is very driver specific and so we ignore it for now.. 6813ba6ab09Smrg */ 682c3217052Snjoly memcpy(s32p, p, sizeof *s32p); 68317b1a5f7Sjmcneill switch (cmd) { 68417b1a5f7Sjmcneill case SIOCGIFDATA: 68517b1a5f7Sjmcneill case SIOCZIFDATA: 68617b1a5f7Sjmcneill case SIOCGIFGENERIC: 68717b1a5f7Sjmcneill case SIOCSIFGENERIC: 68867de10fcSchristos NETBSD32PTR32(s32p->ifr_data, p->ifr_data); 68917b1a5f7Sjmcneill break; 69017b1a5f7Sjmcneill } 69167de10fcSchristos } 69267de10fcSchristos 69367de10fcSchristos static inline void 694e19818fbSmsaitoh netbsd32_from_oifreq(struct oifreq *p, 695e19818fbSmsaitoh struct netbsd32_oifreq *s32p, u_long cmd) 69667de10fcSchristos { 69767de10fcSchristos 69867de10fcSchristos /* 69967de10fcSchristos * XXX 70067de10fcSchristos * struct ifreq says the same, but sometimes the ifr_data 70167de10fcSchristos * union member needs to be converted to 64 bits... this 70267de10fcSchristos * is very driver specific and so we ignore it for now.. 70367de10fcSchristos */ 704c3217052Snjoly memcpy(s32p, p, sizeof *s32p); 7051d9c8161Smrg if (cmd == SIOCGIFDATA || cmd == SIOCZIFDATA) 706a065e516Sdsl NETBSD32PTR32(s32p->ifr_data, p->ifr_data); 7073ba6ab09Smrg } 7083ba6ab09Smrg 7090f0296d8Sperry static inline void 710ed4d3e75Smartin netbsd32_from_ifdatareq(const struct ifdatareq *p, struct netbsd32_ifdatareq *p32, u_long cmd) 711ed4d3e75Smartin { 712ed4d3e75Smartin 713ed4d3e75Smartin memcpy(p32, p, sizeof *p32); 714ed4d3e75Smartin switch (cmd) { 715ed4d3e75Smartin case SIOCGIFDATA: 716ed4d3e75Smartin case SIOCZIFDATA: 717ed4d3e75Smartin netbsd32_from_timespec(&p->ifdr_data.ifi_lastchange, 718ed4d3e75Smartin &p32->ifdr_data.ifi_lastchange); 719ed4d3e75Smartin break; 720ed4d3e75Smartin } 721ed4d3e75Smartin } 722ed4d3e75Smartin 723ed4d3e75Smartin static inline void 7240f0d2276Smatt netbsd32_from_if_addrprefreq(const struct if_addrprefreq *ifap, 7250f0d2276Smatt struct netbsd32_if_addrprefreq *ifap32, u_long cmd) 7260f0d2276Smatt { 727e19818fbSmsaitoh 728df5586d2Smlelstv memcpy(ifap32->ifap_name, ifap->ifap_name, IFNAMSIZ); 7290f0d2276Smatt ifap32->ifap_preference = ifap->ifap_preference; 7300f0d2276Smatt memcpy(&ifap32->ifap_addr, &ifap->ifap_addr, 731d1579b2dSriastradh uimin(ifap->ifap_addr.ss_len, _SS_MAXSIZE)); 7320f0d2276Smatt } 7330f0d2276Smatt 7340f0d2276Smatt static inline void 735e19818fbSmsaitoh netbsd32_from_ifconf(struct ifconf *p, 736e19818fbSmsaitoh struct netbsd32_ifconf *s32p, u_long cmd) 7373ba6ab09Smrg { 7383ba6ab09Smrg 7393ba6ab09Smrg s32p->ifc_len = p->ifc_len; 7403ba6ab09Smrg /* ifc_buf & ifc_req are the same size so this works */ 741a065e516Sdsl NETBSD32PTR32(s32p->ifc_buf, p->ifc_buf); 7423ba6ab09Smrg } 7433ba6ab09Smrg 7440f0296d8Sperry static inline void 745e19818fbSmsaitoh netbsd32_from_ifmediareq(struct ifmediareq *p, 746e19818fbSmsaitoh struct netbsd32_ifmediareq *s32p, u_long cmd) 7473ba6ab09Smrg { 7483ba6ab09Smrg 7493ba6ab09Smrg memcpy(s32p, p, sizeof *p); 7503ba6ab09Smrg /* filled in? */ 7513ba6ab09Smrg #if 0 752a5867d93Smrg s32p->ifm_ulist = (netbsd32_intp_t)p->ifm_ulist; 7533ba6ab09Smrg #endif 7543ba6ab09Smrg } 7553ba6ab09Smrg 756fc67b5dcSroy static inline void 75784d9fa6cSroy netbsd32_from_in_nbrinfo(struct in_nbrinfo *p, struct netbsd32_in_nbrinfo *s32p, 75884d9fa6cSroy u_long cmd) 75984d9fa6cSroy { 76084d9fa6cSroy 76184d9fa6cSroy memcpy(s32p->ifname, p->ifname, sizeof s32p->ifname); 76284d9fa6cSroy memcpy(&s32p->addr, &p->addr, sizeof s32p->addr); 76384d9fa6cSroy s32p->asked = p->asked; 76484d9fa6cSroy s32p->state = p->state; 76584d9fa6cSroy s32p->expire = p->expire; 76684d9fa6cSroy } 76784d9fa6cSroy 76884d9fa6cSroy static inline void 7699742d884Ssimonb netbsd32_from_in6_nbrinfo(struct in6_nbrinfo *p, struct netbsd32_in6_nbrinfo *s32p, 7709742d884Ssimonb u_long cmd) 7719742d884Ssimonb { 7729742d884Ssimonb 7739742d884Ssimonb memcpy(s32p->ifname, p->ifname, sizeof s32p->ifname); 7749742d884Ssimonb memcpy(&s32p->addr, &p->addr, sizeof s32p->addr); 7759742d884Ssimonb s32p->asked = p->asked; 7769742d884Ssimonb s32p->isrouter = p->isrouter; 7779742d884Ssimonb s32p->state = p->state; 7789742d884Ssimonb s32p->expire = p->expire; 7799742d884Ssimonb } 7809742d884Ssimonb 7819742d884Ssimonb static inline void 782fc67b5dcSroy netbsd32_from_pppoediscparms(struct pppoediscparms *p, 783fc67b5dcSroy struct netbsd32_pppoediscparms *s32p, u_long cmd) 784fc67b5dcSroy { 785fc67b5dcSroy 786fc67b5dcSroy memcpy(s32p->ifname, p->ifname, sizeof s32p->ifname); 787fc67b5dcSroy memcpy(s32p->eth_ifname, p->eth_ifname, sizeof s32p->eth_ifname); 788fc67b5dcSroy NETBSD32PTR32(s32p->ac_name, p->ac_name); 789fc67b5dcSroy s32p->ac_name_len = p->ac_name_len; 790fc67b5dcSroy NETBSD32PTR32(s32p->service_name, p->service_name); 791fc67b5dcSroy s32p->service_name_len = p->service_name_len; 792fc67b5dcSroy } 793fc67b5dcSroy 79427cf308bSroy static inline void 79527cf308bSroy netbsd32_from_spppauthcfg(struct spppauthcfg *p, 79627cf308bSroy struct netbsd32_spppauthcfg *s32p, u_long cmd) 79727cf308bSroy { 79827cf308bSroy 79927cf308bSroy memcpy(s32p->ifname, p->ifname, sizeof s32p->ifname); 80027cf308bSroy s32p->hisauth = p->hisauth; 80127cf308bSroy s32p->myauth = p->myauth; 80227cf308bSroy s32p->myname_length = p->myname_length; 80327cf308bSroy s32p->mysecret_length = p->mysecret_length; 80427cf308bSroy s32p->hisname_length = p->hisname_length; 80527cf308bSroy s32p->hissecret_length = p->hissecret_length; 80627cf308bSroy s32p->myauthflags = p->myauthflags; 80727cf308bSroy s32p->hisauthflags = p->hisauthflags; 80827cf308bSroy NETBSD32PTR32(s32p->myname, p->myname); 80927cf308bSroy NETBSD32PTR32(s32p->mysecret, p->mysecret); 81027cf308bSroy NETBSD32PTR32(s32p->hisname, p->hisname); 81127cf308bSroy NETBSD32PTR32(s32p->hissecret, p->hissecret); 81227cf308bSroy } 81327cf308bSroy 8140f0296d8Sperry static inline void 81528bae79bSdsl netbsd32_from_ifdrv(struct ifdrv *p, struct netbsd32_ifdrv *s32p, u_long cmd) 8163ba6ab09Smrg { 817c4fd6408Sroy 818c4fd6408Sroy memcpy(s32p->ifd_name, p->ifd_name, sizeof s32p->ifd_name); 819aeae3560Smatt s32p->ifd_cmd = p->ifd_cmd; 820aeae3560Smatt s32p->ifd_len = p->ifd_len; 821aeae3560Smatt NETBSD32PTR32(s32p->ifd_data, p->ifd_data); 8223ba6ab09Smrg } 8233ba6ab09Smrg 8240f0296d8Sperry static inline void 825e19818fbSmsaitoh netbsd32_from_sioc_vif_req(struct sioc_vif_req *p, 826e19818fbSmsaitoh struct netbsd32_sioc_vif_req *s32p, u_long cmd) 8273ba6ab09Smrg { 8283ba6ab09Smrg 8293ba6ab09Smrg s32p->vifi = p->vifi; 830a5867d93Smrg s32p->icount = (netbsd32_u_long)p->icount; 831a5867d93Smrg s32p->ocount = (netbsd32_u_long)p->ocount; 832a5867d93Smrg s32p->ibytes = (netbsd32_u_long)p->ibytes; 833a5867d93Smrg s32p->obytes = (netbsd32_u_long)p->obytes; 8343ba6ab09Smrg } 8353ba6ab09Smrg 8360f0296d8Sperry static inline void 837e19818fbSmsaitoh netbsd32_from_sioc_sg_req(struct sioc_sg_req *p, 838e19818fbSmsaitoh struct netbsd32_sioc_sg_req *s32p, u_long cmd) 8393ba6ab09Smrg { 8403ba6ab09Smrg 8413ba6ab09Smrg s32p->src = p->src; 8423ba6ab09Smrg s32p->grp = p->grp; 843a5867d93Smrg s32p->pktcnt = (netbsd32_u_long)p->pktcnt; 844a5867d93Smrg s32p->bytecnt = (netbsd32_u_long)p->bytecnt; 845a5867d93Smrg s32p->wrong_if = (netbsd32_u_long)p->wrong_if; 8463ba6ab09Smrg } 8473ba6ab09Smrg 8489e2edd2bSmrg static inline void 8492b90ec0aSsimonb netbsd32_from_kfilter_mapping(struct kfilter_mapping *p, 8502b90ec0aSsimonb struct netbsd32_kfilter_mapping *s32p, u_long cmd) 8512b90ec0aSsimonb { 8522b90ec0aSsimonb 8532b90ec0aSsimonb NETBSD32PTR32(s32p->name, p->name); 8542b90ec0aSsimonb s32p->len = p->len; 8552b90ec0aSsimonb s32p->filter = p->filter; 8562b90ec0aSsimonb } 8572b90ec0aSsimonb 8582b90ec0aSsimonb static inline void 859e19818fbSmsaitoh netbsd32_from_atareq(struct atareq *p, 860e19818fbSmsaitoh struct netbsd32_atareq *s32p, u_long cmd) 86132ccd9f2Smanu { 862e19818fbSmsaitoh 86332ccd9f2Smanu s32p->flags = (netbsd32_u_long)p->flags; 86432ccd9f2Smanu s32p->command = p->command; 86532ccd9f2Smanu s32p->features = p->features; 86632ccd9f2Smanu s32p->sec_count = p->sec_count; 86732ccd9f2Smanu s32p->sec_num = p->sec_num; 86832ccd9f2Smanu s32p->head = p->head; 86932ccd9f2Smanu s32p->cylinder = p->cylinder; 87032ccd9f2Smanu NETBSD32PTR32(s32p->databuf, p->databuf); 87132ccd9f2Smanu s32p->datalen = (netbsd32_u_long)p->datalen; 87232ccd9f2Smanu s32p->timeout = p->timeout; 87332ccd9f2Smanu s32p->retsts = p->retsts; 87432ccd9f2Smanu s32p->error = p->error; 87532ccd9f2Smanu } 87632ccd9f2Smanu 87732ccd9f2Smanu static inline void 878f89159bbSsimonb netbsd32_from_fss_set(struct fss_set *p, struct netbsd32_fss_set *s32p, 879f89159bbSsimonb u_long cmd) 880f89159bbSsimonb { 881f89159bbSsimonb 882f89159bbSsimonb NETBSD32PTR32(s32p->fss_mount, p->fss_mount); 883f89159bbSsimonb NETBSD32PTR32(s32p->fss_bstore, p->fss_bstore); 884f89159bbSsimonb s32p->fss_csize = p->fss_csize; 885f89159bbSsimonb s32p->fss_flags = p->fss_flags; 886f89159bbSsimonb } 887f89159bbSsimonb 888f89159bbSsimonb static inline void 889f89159bbSsimonb netbsd32_from_fss_get(struct fss_get *p, struct netbsd32_fss_get *s32p, 890f89159bbSsimonb u_long cmd) 891f89159bbSsimonb { 892f89159bbSsimonb 893f89159bbSsimonb memcpy(s32p->fsg_mount, p->fsg_mount, MNAMELEN); 894f89159bbSsimonb netbsd32_from_timeval(&p->fsg_time, &s32p->fsg_time); 895f89159bbSsimonb s32p->fsg_csize = p->fsg_csize; 896f89159bbSsimonb s32p->fsg_mount_size = p->fsg_mount_size; 897f89159bbSsimonb s32p->fsg_bs_size = p->fsg_bs_size; 898f89159bbSsimonb 899f89159bbSsimonb } 900f89159bbSsimonb 901f89159bbSsimonb static inline void 902e19818fbSmsaitoh netbsd32_from_vnd_ioctl(struct vnd_ioctl *p, 903e19818fbSmsaitoh struct netbsd32_vnd_ioctl *s32p, u_long cmd) 9049e2edd2bSmrg { 9059e2edd2bSmrg 9069e2edd2bSmrg s32p->vnd_flags = p->vnd_flags; 9079e2edd2bSmrg s32p->vnd_geom = p->vnd_geom; 9089e2edd2bSmrg s32p->vnd_osize = p->vnd_osize; 9099e2edd2bSmrg s32p->vnd_size = p->vnd_size; 9109e2edd2bSmrg } 9119e2edd2bSmrg 9129e2edd2bSmrg static inline void 913e19818fbSmsaitoh netbsd32_from_vnd_user(struct vnd_user *p, 914e19818fbSmsaitoh struct netbsd32_vnd_user *s32p, u_long cmd) 9159e2edd2bSmrg { 9169e2edd2bSmrg 9179e2edd2bSmrg s32p->vnu_unit = p->vnu_unit; 9189e2edd2bSmrg s32p->vnu_dev = p->vnu_dev; 9199e2edd2bSmrg s32p->vnu_ino = p->vnu_ino; 9209e2edd2bSmrg } 9219e2edd2bSmrg 922c97f9c82Smrg static inline void 923e19818fbSmsaitoh netbsd32_from_vnd_ioctl50(struct vnd_ioctl50 *p, 924e19818fbSmsaitoh struct netbsd32_vnd_ioctl50 *s32p, u_long cmd) 925c97f9c82Smrg { 926c97f9c82Smrg 927c97f9c82Smrg s32p->vnd_flags = p->vnd_flags; 928c97f9c82Smrg s32p->vnd_geom = p->vnd_geom; 929c97f9c82Smrg s32p->vnd_size = p->vnd_size; 930c97f9c82Smrg } 931c97f9c82Smrg 932bb1c6815Smrg static inline void 933e19818fbSmsaitoh netbsd32_from_plistref(struct plistref *p, 934e19818fbSmsaitoh struct netbsd32_plistref *s32p, u_long cmd) 9356795d62eSnjoly { 9366795d62eSnjoly 9376795d62eSnjoly NETBSD32PTR32(s32p->pref_plist, p->pref_plist); 9386795d62eSnjoly s32p->pref_len = p->pref_len; 9396795d62eSnjoly } 9406795d62eSnjoly 9416795d62eSnjoly static inline void 942e19818fbSmsaitoh netbsd32_from_nvlist_ref_t(nvlist_ref_t *p, 943e19818fbSmsaitoh netbsd32_nvlist_ref_t *s32p, u_long cmd) 944c16d8e94Smlelstv { 945c16d8e94Smlelstv 946c16d8e94Smlelstv NETBSD32PTR32(s32p->buf, p->buf); 947c16d8e94Smlelstv s32p->len = p->len; 948c16d8e94Smlelstv s32p->flags = p->flags; 949c16d8e94Smlelstv } 950c16d8e94Smlelstv 951c16d8e94Smlelstv static inline void 952e19818fbSmsaitoh netbsd32_from_wdog_conf(struct wdog_conf *p, 953e19818fbSmsaitoh struct netbsd32_wdog_conf *s32p, u_long cmd) 954166893d4Sbouyer { 955166893d4Sbouyer 956166893d4Sbouyer NETBSD32PTR32(s32p->wc_names, p->wc_names); 957166893d4Sbouyer s32p->wc_count = p->wc_count; 958166893d4Sbouyer } 959166893d4Sbouyer 960daaec637Smacallan /* wsdisplay stuff */ 961daaec637Smacallan static inline void 962daaec637Smacallan netbsd32_from_wsdisplay_addscreendata(struct wsdisplay_addscreendata *asd, 963e19818fbSmsaitoh struct netbsd32_wsdisplay_addscreendata *asd32, u_long cmd) 964daaec637Smacallan { 965e19818fbSmsaitoh 966daaec637Smacallan NETBSD32PTR32(asd32->screentype, asd->screentype); 967daaec637Smacallan NETBSD32PTR32(asd32->emul, asd->emul); 968daaec637Smacallan asd32->idx = asd->idx; 969daaec637Smacallan } 970daaec637Smacallan 971166893d4Sbouyer static inline void 972f7396474Smacallan netbsd32_from_wsdisplay_cursor(struct wsdisplay_cursor *c, 973e19818fbSmsaitoh struct netbsd32_wsdisplay_cursor *c32, u_long cmd) 974f7396474Smacallan { 975e19818fbSmsaitoh 976f7396474Smacallan c32->which = c->which; 977f7396474Smacallan c32->enable = c->enable; 978f7396474Smacallan c32->pos.x = c->pos.x; 979f7396474Smacallan c32->pos.y = c->pos.y; 980f7396474Smacallan c32->hot.x = c->hot.x; 981f7396474Smacallan c32->hot.y = c->hot.y; 982f7396474Smacallan c32->size.x = c->size.x; 983f7396474Smacallan c32->size.y = c->size.y; 984f7396474Smacallan c32->cmap.index = c->cmap.index; 985f7396474Smacallan c32->cmap.count = c->cmap.count; 986f7396474Smacallan NETBSD32PTR32(c32->cmap.red, c->cmap.red); 987f7396474Smacallan NETBSD32PTR32(c32->cmap.green, c->cmap.green); 988f7396474Smacallan NETBSD32PTR32(c32->cmap.blue, c->cmap.blue); 989f7396474Smacallan NETBSD32PTR32(c32->image, c->image); 990f7396474Smacallan NETBSD32PTR32(c32->mask, c->mask); 991f7396474Smacallan } 992f7396474Smacallan 993f7396474Smacallan static inline void 99409a234bdSbouyer netbsd32_from_wsdisplay_cmap(struct wsdisplay_cmap *c, 995e19818fbSmsaitoh struct netbsd32_wsdisplay_cmap *c32, u_long cmd) 99609a234bdSbouyer { 997e19818fbSmsaitoh 99809a234bdSbouyer c32->index = c->index; 99909a234bdSbouyer c32->count = c->count; 100009a234bdSbouyer NETBSD32PTR32(c32->red, c->red); 100109a234bdSbouyer NETBSD32PTR32(c32->green, c->green); 100209a234bdSbouyer NETBSD32PTR32(c32->blue, c->blue); 100309a234bdSbouyer } 100409a234bdSbouyer 100509a234bdSbouyer static inline void 1006baced4feSmacallan netbsd32_from_wsdisplay_font(struct wsdisplay_font *f, 1007e19818fbSmsaitoh struct netbsd32_wsdisplay_font *f32, u_long cmd) 1008baced4feSmacallan { 1009baced4feSmacallan } 1010baced4feSmacallan 1011baced4feSmacallan static inline void 1012baced4feSmacallan netbsd32_from_wsdisplay_usefontdata(struct wsdisplay_usefontdata *f, 1013e19818fbSmsaitoh struct netbsd32_wsdisplay_usefontdata *f32, u_long cmd) 1014baced4feSmacallan { 1015baced4feSmacallan } 1016baced4feSmacallan 1017baced4feSmacallan static inline void 101882e21017Schristos netbsd32_from_ieee80211req(struct ieee80211req *ireq, 101982e21017Schristos struct netbsd32_ieee80211req *ireq32, u_long cmd) 102082e21017Schristos { 1021e19818fbSmsaitoh 1022df5586d2Smlelstv memcpy(ireq32->i_name, ireq->i_name, IFNAMSIZ); 102382e21017Schristos ireq32->i_type = ireq->i_type; 102482e21017Schristos ireq32->i_val = ireq->i_val; 102582e21017Schristos ireq32->i_len = ireq->i_len; 102682e21017Schristos NETBSD32PTR32(ireq32->i_data, ireq->i_data); 102782e21017Schristos } 102882e21017Schristos 102982e21017Schristos static inline void 1030d9554c19Smacallan netbsd32_from_ieee80211_nwkey(struct ieee80211_nwkey *nwk, 1031e19818fbSmsaitoh struct netbsd32_ieee80211_nwkey *nwk32, u_long cmd) 1032d9554c19Smacallan { 1033d9554c19Smacallan int i; 1034d9554c19Smacallan 1035df5586d2Smlelstv memcpy(nwk32->i_name, nwk->i_name, IFNAMSIZ); 1036d9554c19Smacallan nwk32->i_wepon = nwk->i_wepon; 1037d9554c19Smacallan nwk32->i_defkid = nwk->i_defkid; 1038d9554c19Smacallan for (i = 0; i < IEEE80211_WEP_NKID; i++) { 1039d9554c19Smacallan nwk32->i_key[i].i_keylen = nwk->i_key[i].i_keylen; 1040d9554c19Smacallan NETBSD32PTR32(nwk32->i_key[i].i_keydat, 1041d9554c19Smacallan nwk->i_key[i].i_keydat); 1042d9554c19Smacallan } 1043d9554c19Smacallan } 1044d9554c19Smacallan 1045d9554c19Smacallan static inline void 1046e19818fbSmsaitoh netbsd32_from_bpf_program(struct bpf_program *p, 1047e19818fbSmsaitoh struct netbsd32_bpf_program *s32p, u_long cmd) 1048ccc80301Sbouyer { 1049ccc80301Sbouyer 1050ccc80301Sbouyer NETBSD32PTR32(s32p->bf_insns, p->bf_insns); 1051ccc80301Sbouyer s32p->bf_len = p->bf_len; 1052ccc80301Sbouyer } 1053ccc80301Sbouyer 1054ccc80301Sbouyer static inline void 1055e19818fbSmsaitoh netbsd32_from_bpf_dltlist(struct bpf_dltlist *p, 1056e19818fbSmsaitoh struct netbsd32_bpf_dltlist *s32p, u_long cmd) 1057ccc80301Sbouyer { 1058ccc80301Sbouyer 1059ccc80301Sbouyer NETBSD32PTR32(s32p->bfl_list, p->bfl_list); 1060ccc80301Sbouyer s32p->bfl_len = p->bfl_len; 1061ccc80301Sbouyer } 1062ccc80301Sbouyer 1063ccc80301Sbouyer static inline void 1064bb1c6815Smrg netbsd32_from_u_long(u_long *p, netbsd32_u_long *s32p, u_long cmd) 1065bb1c6815Smrg { 1066bb1c6815Smrg 1067bb1c6815Smrg *s32p = (netbsd32_u_long)*p; 1068bb1c6815Smrg } 1069bb1c6815Smrg 1070254cd918Schristos static inline void 1071cb537247Sroy netbsd32_from_voidp(voidp *p, netbsd32_voidp *s32p, u_long cmd) 1072cb537247Sroy { 1073cb537247Sroy 1074cb537247Sroy NETBSD32PTR32(*s32p, *p); 1075cb537247Sroy } 1076cb537247Sroy 1077cb537247Sroy static inline void 1078e19818fbSmsaitoh netbsd32_from_clockctl_settimeofday(const struct clockctl_settimeofday *p, 1079e19818fbSmsaitoh struct netbsd32_clockctl_settimeofday *s32p, u_long cmd) 1080254cd918Schristos { 1081254cd918Schristos 1082254cd918Schristos NETBSD32PTR32(s32p->tv, p->tv); 1083254cd918Schristos NETBSD32PTR32(s32p->tzp, p->tzp); 1084254cd918Schristos } 1085254cd918Schristos 1086254cd918Schristos static inline void 1087e19818fbSmsaitoh netbsd32_from_clockctl_adjtime(const struct clockctl_adjtime *p, 1088e19818fbSmsaitoh struct netbsd32_clockctl_adjtime *s32p, u_long cmd) 1089254cd918Schristos { 1090254cd918Schristos 1091254cd918Schristos NETBSD32PTR32(s32p->delta, p->delta); 1092254cd918Schristos NETBSD32PTR32(s32p->olddelta, p->olddelta); 1093254cd918Schristos } 1094254cd918Schristos 1095254cd918Schristos static inline void 1096e19818fbSmsaitoh netbsd32_from_clockctl_clock_settime(const struct clockctl_clock_settime *p, 1097e19818fbSmsaitoh struct netbsd32_clockctl_clock_settime *s32p, u_long cmd) 1098254cd918Schristos { 1099254cd918Schristos 1100254cd918Schristos s32p->clock_id = p->clock_id; 1101254cd918Schristos NETBSD32PTR32(s32p->tp, p->tp); 1102254cd918Schristos } 1103254cd918Schristos 1104bfaaad74Schristos #ifdef NTP 1105254cd918Schristos static inline void 1106e19818fbSmsaitoh netbsd32_from_clockctl_ntp_adjtime(const struct clockctl_ntp_adjtime *p, 1107e19818fbSmsaitoh struct netbsd32_clockctl_ntp_adjtime *s32p, u_long cmd) 1108254cd918Schristos { 1109254cd918Schristos 1110254cd918Schristos NETBSD32PTR32(s32p->tp, p->tp); 1111254cd918Schristos s32p->retval = p->retval; 1112254cd918Schristos } 1113bfaaad74Schristos #endif 1114254cd918Schristos 1115d0c9fc59Smatt static inline void 1116e19818fbSmsaitoh netbsd32_from_ksyms_gsymbol( const struct ksyms_gsymbol *p, 1117e19818fbSmsaitoh struct netbsd32_ksyms_gsymbol *s32p, u_long cmd) 1118d0c9fc59Smatt { 1119d0c9fc59Smatt 1120d0c9fc59Smatt NETBSD32PTR32(s32p->kg_name, p->kg_name); 1121d0c9fc59Smatt s32p->kg_sym = p->kg_sym; 1122d0c9fc59Smatt } 1123d0c9fc59Smatt 1124d0c9fc59Smatt static inline void 1125d0c9fc59Smatt netbsd32_from_ksyms_gvalue( 1126d0c9fc59Smatt const struct ksyms_gvalue *p, 1127e19818fbSmsaitoh struct netbsd32_ksyms_gvalue *s32p, u_long cmd) 1128d0c9fc59Smatt { 1129d0c9fc59Smatt 1130d0c9fc59Smatt NETBSD32PTR32(s32p->kv_name, p->kv_name); 1131d0c9fc59Smatt s32p->kv_value = p->kv_value; 1132d0c9fc59Smatt } 1133d0c9fc59Smatt 1134cb537247Sroy static inline void 1135e19818fbSmsaitoh netbsd32_from_npf_ioctl_table(const struct npf_ioctl_table *p, 1136e19818fbSmsaitoh struct netbsd32_npf_ioctl_table *s32p, u_long cmd) 1137c16d8e94Smlelstv { 1138c16d8e94Smlelstv 1139c16d8e94Smlelstv s32p->nct_cmd = p->nct_cmd; 1140c16d8e94Smlelstv NETBSD32PTR32(s32p->nct_name, p->nct_name); 1141c16d8e94Smlelstv switch (p->nct_cmd) { 1142c16d8e94Smlelstv case NPF_CMD_TABLE_LOOKUP: 1143c16d8e94Smlelstv case NPF_CMD_TABLE_ADD: 1144c16d8e94Smlelstv case NPF_CMD_TABLE_REMOVE: 1145c16d8e94Smlelstv s32p->nct_data.ent = p->nct_data.ent; 1146c16d8e94Smlelstv break; 1147c16d8e94Smlelstv case NPF_CMD_TABLE_LIST: 1148c16d8e94Smlelstv NETBSD32PTR32(s32p->nct_data.buf.buf, p->nct_data.buf.buf); 1149c16d8e94Smlelstv s32p->nct_data.buf.len = p->nct_data.buf.len; 1150c16d8e94Smlelstv break; 1151c16d8e94Smlelstv } 1152c16d8e94Smlelstv } 1153c16d8e94Smlelstv 1154c16d8e94Smlelstv static inline void 1155e19818fbSmsaitoh netbsd32_from_devlistargs(const struct devlistargs *p, 1156e19818fbSmsaitoh struct netbsd32_devlistargs *s32p, u_long cmd) 11575be74d29Sjmcneill { 1158e19818fbSmsaitoh 11595be74d29Sjmcneill memcpy(s32p->l_devname, p->l_devname, sizeof(s32p->l_devname)); 11605be74d29Sjmcneill s32p->l_children = p->l_children; 11615be74d29Sjmcneill NETBSD32PTR32(s32p->l_childname, p->l_childname); 11625be74d29Sjmcneill } 11635be74d29Sjmcneill 11645be74d29Sjmcneill static inline void 1165e19818fbSmsaitoh netbsd32_from_devrescanargs(const struct devrescanargs *p, 1166e19818fbSmsaitoh struct netbsd32_devrescanargs *s32p, u_long cmd) 11675be74d29Sjmcneill { 1168e19818fbSmsaitoh 11695be74d29Sjmcneill memcpy(s32p->busname, p->busname, sizeof(s32p->busname)); 11705be74d29Sjmcneill memcpy(s32p->ifattr, p->ifattr, sizeof(s32p->ifattr)); 11715be74d29Sjmcneill s32p->numlocators = p->numlocators; 11725be74d29Sjmcneill NETBSD32PTR32(s32p->locators, p->locators); 11735be74d29Sjmcneill } 11745be74d29Sjmcneill 11751261ded2Smlelstv static inline void 1176e19818fbSmsaitoh netbsd32_from_disk_strategy(const struct disk_strategy *p, 1177e19818fbSmsaitoh struct netbsd32_disk_strategy *s32p, u_long cmd) 1178d7f371cdSjdolecek { 1179e19818fbSmsaitoh 1180d7f371cdSjdolecek memcpy(s32p->dks_name, p->dks_name, sizeof(p->dks_name)); 1181d7f371cdSjdolecek NETBSD32PTR32(s32p->dks_param, p->dks_param); 1182d7f371cdSjdolecek s32p->dks_paramlen = p->dks_paramlen; 1183d7f371cdSjdolecek } 1184d7f371cdSjdolecek 1185d7f371cdSjdolecek static inline void 1186e19818fbSmsaitoh netbsd32_from_dkwedge_list(const struct dkwedge_list *p, 1187e19818fbSmsaitoh struct netbsd32_dkwedge_list *s32p, u_long cmd) 11881261ded2Smlelstv { 1189e19818fbSmsaitoh 119087baea7bSjdolecek NETBSD32PTR32(s32p->dkwl_buf, p->dkwl_buf); 11911261ded2Smlelstv s32p->dkwl_bufsize = p->dkwl_bufsize; 11921261ded2Smlelstv s32p->dkwl_nwedges = p->dkwl_nwedges; 11931261ded2Smlelstv s32p->dkwl_ncopied = p->dkwl_ncopied; 11941261ded2Smlelstv } 11951261ded2Smlelstv 119641b59d1aSsimonb static inline void 119741b59d1aSsimonb netbsd32_to_lsenable(struct netbsd32_lsenable *le32, struct lsenable *le, 119841b59d1aSsimonb u_long cmd) 119941b59d1aSsimonb { 120041b59d1aSsimonb 120141b59d1aSsimonb le->le_csstart = le32->le_csstart; 120241b59d1aSsimonb le->le_csend = le32->le_csend; 120341b59d1aSsimonb le->le_lockstart = le32->le_lockstart; 120441b59d1aSsimonb le->le_lockend = le32->le_lockend; 120541b59d1aSsimonb le->le_nbufs = le32->le_nbufs; 120641b59d1aSsimonb le->le_flags = le32->le_flags; 120741b59d1aSsimonb le->le_mask = le32->le_mask; 120841b59d1aSsimonb } 120941b59d1aSsimonb 121041b59d1aSsimonb static inline void 121141b59d1aSsimonb netbsd32_from_lsenable(struct lsenable *le, struct netbsd32_lsenable *le32, 121241b59d1aSsimonb u_long cmd) 121341b59d1aSsimonb { 121441b59d1aSsimonb 121541b59d1aSsimonb le32->le_csstart = le->le_csstart; 121641b59d1aSsimonb le32->le_csend = le->le_csend; 121741b59d1aSsimonb le32->le_lockstart = le->le_lockstart; 121841b59d1aSsimonb le32->le_lockend = le->le_lockend; 121941b59d1aSsimonb le32->le_nbufs = le->le_nbufs; 122041b59d1aSsimonb le32->le_flags = le->le_flags; 122141b59d1aSsimonb le32->le_mask = le->le_mask; 122241b59d1aSsimonb } 122341b59d1aSsimonb 122441b59d1aSsimonb static inline void 122541b59d1aSsimonb netbsd32_to_lsdisable(struct netbsd32_lsdisable *ld32, struct lsdisable *ld, 122641b59d1aSsimonb u_long cmd) 122741b59d1aSsimonb { 122841b59d1aSsimonb 122941b59d1aSsimonb ld->ld_size = ld32->ld_size; 123041b59d1aSsimonb netbsd32_to_timespec(&ld32->ld_time, &ld->ld_time); 123141b59d1aSsimonb memcpy(&ld->ld_time, &ld32->ld_time, sizeof(ld->ld_time)); 123241b59d1aSsimonb } 123341b59d1aSsimonb 123441b59d1aSsimonb static inline void 123541b59d1aSsimonb netbsd32_from_lsdisable(struct lsdisable *ld, struct netbsd32_lsdisable *ld32, 123641b59d1aSsimonb u_long cmd) 123741b59d1aSsimonb { 123841b59d1aSsimonb 123941b59d1aSsimonb ld->ld_size = ld32->ld_size; 124041b59d1aSsimonb netbsd32_from_timespec(&ld->ld_time, &ld32->ld_time); 124141b59d1aSsimonb memcpy(&ld->ld_time, &ld32->ld_time, sizeof(ld->ld_time)); 124241b59d1aSsimonb } 124341b59d1aSsimonb 1244bfaaad74Schristos #ifdef NTP 1245bfaaad74Schristos static int 1246bfaaad74Schristos netbsd32_do_clockctl_ntp_adjtime(struct file *fp, 1247bfaaad74Schristos struct clockctl_ntp_adjtime *args) 1248bfaaad74Schristos { 1249bfaaad74Schristos struct vnode *vp; 1250bfaaad74Schristos struct specnode *sn; 1251bfaaad74Schristos const char *name; 1252bfaaad74Schristos 1253bfaaad74Schristos struct netbsd32_timex ntv32; 1254bfaaad74Schristos struct timex ntv; 1255bfaaad74Schristos int error; 1256bfaaad74Schristos 1257bfaaad74Schristos /* Verify that the file descriptor is is to the clockctl device */ 1258bfaaad74Schristos if (fp->f_type != DTYPE_VNODE) 1259bfaaad74Schristos return EINVAL; 1260bfaaad74Schristos 1261bfaaad74Schristos vp = fp->f_vnode; 1262bfaaad74Schristos if (vp->v_type != VCHR) 1263bfaaad74Schristos return EINVAL; 1264bfaaad74Schristos 1265bfaaad74Schristos sn = vp->v_specnode; 1266bfaaad74Schristos name = cdevsw_getname(major(sn->sn_rdev)); 1267bfaaad74Schristos if (name == NULL || strcmp(name, "clockctl") != 0) 1268bfaaad74Schristos return EINVAL; 1269bfaaad74Schristos 1270bfaaad74Schristos if (vec_ntp_adjtime1 == NULL) 1271bfaaad74Schristos return EINVAL; 1272bfaaad74Schristos 1273bfaaad74Schristos error = copyin(args->tp, &ntv32, sizeof(ntv32)); 1274bfaaad74Schristos if (error) 1275bfaaad74Schristos return error; 1276bfaaad74Schristos 1277bfaaad74Schristos netbsd32_to_timex(&ntv32, &ntv); 1278bfaaad74Schristos (*vec_ntp_adjtime1)(&ntv); 1279bfaaad74Schristos netbsd32_from_timex(&ntv, &ntv32); 1280bfaaad74Schristos 1281bfaaad74Schristos error = copyout(&ntv32, args->tp, sizeof(ntv32)); 1282bfaaad74Schristos if (error == 0) 1283bfaaad74Schristos args->retval = ntp_timestatus(); 1284bfaaad74Schristos 1285bfaaad74Schristos return error; 1286bfaaad74Schristos } 1287bfaaad74Schristos #endif 1288bfaaad74Schristos 12893ba6ab09Smrg /* 12903ba6ab09Smrg * main ioctl syscall. 12913ba6ab09Smrg * 12923ba6ab09Smrg * ok, here we are in the biggy. we have to do fix ups depending 12933ba6ab09Smrg * on the ioctl command before and afterwards. 12943ba6ab09Smrg */ 12953ba6ab09Smrg int 1296e19818fbSmsaitoh netbsd32_ioctl(struct lwp *l, 1297e19818fbSmsaitoh const struct netbsd32_ioctl_args *uap, register_t *retval) 12983ba6ab09Smrg { 12997e2790cfSdsl /* { 13003ba6ab09Smrg syscallarg(int) fd; 1301a5867d93Smrg syscallarg(netbsd32_u_long) com; 1302a5867d93Smrg syscallarg(netbsd32_voidp) data; 13037e2790cfSdsl } */ 13041e8c5f21Seeh struct file *fp; 13051e8c5f21Seeh u_long com; 13061e8c5f21Seeh int error = 0; 1307ad396e28Smatt size_t size; 1308ad396e28Smatt size_t alloc_size32, size32; 1309fffc9c66Schristos void *data, *memp = NULL; 1310fffc9c66Schristos void *data32, *memp32 = NULL; 1311ad396e28Smatt unsigned int fd; 13121e8c5f21Seeh int tmp; 13131e8c5f21Seeh #define STK_PARAMS 128 13143677c27bSskrll uint64_t stkbuf[STK_PARAMS/sizeof(uint64_t)]; 13153677c27bSskrll uint64_t stkbuf32[STK_PARAMS/sizeof(uint64_t)]; 13163ba6ab09Smrg 13173ba6ab09Smrg /* 13183ba6ab09Smrg * we need to translate some commands (_IOW) before calling sys_ioctl, 13193ba6ab09Smrg * some after (_IOR), and some both (_IOWR). 13203ba6ab09Smrg */ 1321a65e57bfSeeh #if 0 1322a65e57bfSeeh { 1323ad396e28Smatt const char * const dirs[8] = { 1324ad396e28Smatt "NONE!", "VOID", "OUT", "VOID|OUT!", "IN", "VOID|IN!", 1325ad396e28Smatt "INOUT", "VOID|IN|OUT!" 1326ad396e28Smatt }; 1327a65e57bfSeeh 1328ad396e28Smatt printf("netbsd32_ioctl(%d, %x, %x): " 1329ad396e28Smatt "%s group %c base %d len %d\n", 1330ad396e28Smatt SCARG(uap, fd), SCARG(uap, com), SCARG(uap, data).i32, 1331a65e57bfSeeh dirs[((SCARG(uap, com) & IOC_DIRMASK)>>29)], 1332a65e57bfSeeh IOCGROUP(SCARG(uap, com)), IOCBASECMD(SCARG(uap, com)), 1333a65e57bfSeeh IOCPARM_LEN(SCARG(uap, com))); 1334a65e57bfSeeh } 1335a65e57bfSeeh #endif 13363ba6ab09Smrg 1337ad396e28Smatt memp = NULL; 1338ad396e28Smatt memp32 = NULL; 1339ad396e28Smatt alloc_size32 = 0; 1340ad396e28Smatt size32 = 0; 1341ad396e28Smatt size = 0; 1342ad396e28Smatt 1343a9ca7a37Sad fd = SCARG(uap, fd); 1344a9ca7a37Sad if ((fp = fd_getfile(fd)) == NULL) 1345e19818fbSmsaitoh return EBADF; 13461e8c5f21Seeh if ((fp->f_flag & (FREAD | FWRITE)) == 0) { 13471e8c5f21Seeh error = EBADF; 13481e8c5f21Seeh goto out; 13491e8c5f21Seeh } 13501e8c5f21Seeh 13511e8c5f21Seeh switch (com = SCARG(uap, com)) { 13527408df12Smatt case FIONCLEX: 1353*c2f48922Sriastradh case FIOCLEX: 1354*c2f48922Sriastradh fd_set_exclose(l, fd, com == FIOCLEX); 13551e8c5f21Seeh goto out; 13561e8c5f21Seeh } 13571e8c5f21Seeh 13581e8c5f21Seeh /* 13591e8c5f21Seeh * Interpret high order word to find amount of data to be 13601e8c5f21Seeh * copied to/from the user's address space. 13611e8c5f21Seeh */ 13621e8c5f21Seeh size32 = IOCPARM_LEN(com); 1363ad396e28Smatt alloc_size32 = size32; 1364ad396e28Smatt 1365ad396e28Smatt /* 1366ad396e28Smatt * The disklabel is now padded to a multiple of 8 bytes however the old 1367ad396e28Smatt * disklabel on 32bit platforms wasn't. This leaves a difference in 1368ad396e28Smatt * size of 4 bytes between the two but are otherwise identical. 1369ad396e28Smatt * To deal with this, we allocate enough space for the new disklabel 1370ad396e28Smatt * but only copyin/out the smaller amount. 1371ad396e28Smatt */ 1372ad396e28Smatt if (IOCGROUP(com) == 'd') { 1373ad396e28Smatt u_long ncom = com ^ (DIOCGDINFO ^ DIOCGDINFO32); 1374ad396e28Smatt switch (ncom) { 1375ad396e28Smatt case DIOCGDINFO: 1376ad396e28Smatt case DIOCWDINFO: 1377ad396e28Smatt case DIOCSDINFO: 1378ad396e28Smatt case DIOCGDEFLABEL: 1379ad396e28Smatt com = ncom; 1380ad396e28Smatt if (IOCPARM_LEN(DIOCGDINFO32) < IOCPARM_LEN(DIOCGDINFO)) 1381ad396e28Smatt alloc_size32 = IOCPARM_LEN(DIOCGDINFO); 1382ad396e28Smatt break; 1383ad396e28Smatt } 1384ad396e28Smatt } 1385ad396e28Smatt if (alloc_size32 > IOCPARM_MAX) { 13861e8c5f21Seeh error = ENOTTY; 13871e8c5f21Seeh goto out; 13881e8c5f21Seeh } 1389ad396e28Smatt if (alloc_size32 > sizeof(stkbuf)) { 1390ad396e28Smatt memp32 = kmem_alloc(alloc_size32, KM_SLEEP); 13911e8c5f21Seeh data32 = memp32; 13921e8c5f21Seeh } else 139353524e44Schristos data32 = (void *)stkbuf32; 1394ad396e28Smatt if ((com >> IOCPARM_SHIFT) == 0) { 1395ad396e28Smatt /* UNIX-style ioctl. */ 1396ad396e28Smatt data32 = SCARG_P32(uap, data); 1397ad396e28Smatt } else { 13981e8c5f21Seeh if (com&IOC_IN) { 13991e8c5f21Seeh if (size32) { 1400ad396e28Smatt error = copyin(SCARG_P32(uap, data), data32, 1401ad396e28Smatt size32); 14021e8c5f21Seeh if (error) { 14031e8c5f21Seeh goto out; 14041e8c5f21Seeh } 1405ad396e28Smatt /* 1406ad396e28Smatt * The data between size and alloc_size has 1407ad396e28Smatt * not been overwritten. It shouldn't matter 1408ad396e28Smatt * but let's clear that anyway. 1409ad396e28Smatt */ 1410ad396e28Smatt if (__predict_false(size32 < alloc_size32)) { 1411ad396e28Smatt memset((char *)data32+size32, 0, 1412ad396e28Smatt alloc_size32 - size32); 1413ad396e28Smatt } 1414a9ca7a37Sad ktrgenio(fd, UIO_WRITE, SCARG_P32(uap, data), 1415226b6c84Snjoly size32, 0); 14161e8c5f21Seeh } else 1417d364d308Sdsl *(void **)data32 = SCARG_P32(uap, data); 1418ad396e28Smatt } else if ((com&IOC_OUT) && size32) { 14191e8c5f21Seeh /* 14201e8c5f21Seeh * Zero the buffer so the user always 14211e8c5f21Seeh * gets back something deterministic. 14221e8c5f21Seeh */ 1423ad396e28Smatt memset(data32, 0, alloc_size32); 1424ad396e28Smatt } else if (com&IOC_VOID) { 1425d364d308Sdsl *(void **)data32 = SCARG_P32(uap, data); 1426ad396e28Smatt } 1427ad396e28Smatt } 14281e8c5f21Seeh 14293ba6ab09Smrg /* 14303ba6ab09Smrg * convert various structures, pointers, and other objects that 14313ba6ab09Smrg * change size from 32 bit -> 64 bit, for all ioctl commands. 14323ba6ab09Smrg */ 14333ba6ab09Smrg switch (SCARG(uap, com)) { 14341e8c5f21Seeh case FIONBIO: 1435a9ca7a37Sad mutex_enter(&fp->f_lock); 1436433c9293Seeh if ((tmp = *(int *)data32) != 0) 14371e8c5f21Seeh fp->f_flag |= FNONBLOCK; 14383ba6ab09Smrg else 14391e8c5f21Seeh fp->f_flag &= ~FNONBLOCK; 1440a9ca7a37Sad mutex_exit(&fp->f_lock); 1441a9ca7a37Sad error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, (void *)&tmp); 14421e8c5f21Seeh break; 14433ba6ab09Smrg 14441e8c5f21Seeh case FIOASYNC: 1445a9ca7a37Sad mutex_enter(&fp->f_lock); 1446433c9293Seeh if ((tmp = *(int *)data32) != 0) 14471e8c5f21Seeh fp->f_flag |= FASYNC; 14481e8c5f21Seeh else 14491e8c5f21Seeh fp->f_flag &= ~FASYNC; 1450a9ca7a37Sad mutex_exit(&fp->f_lock); 1451a9ca7a37Sad error = (*fp->f_ops->fo_ioctl)(fp, FIOASYNC, (void *)&tmp); 14521e8c5f21Seeh break; 14531e8c5f21Seeh 1454bb1c6815Smrg case AUDIO_WSEEK32: 1455bb1c6815Smrg IOCTL_CONV_TO(AUDIO_WSEEK, u_long); 1456bb1c6815Smrg 1457a3ff3a30Sfvdl #if 0 /* not implemented by anything */ 14581e8c5f21Seeh case DIOCRFORMAT32: 14591e8c5f21Seeh IOCTL_STRUCT_CONV_TO(DIOCRFORMAT, format_op); 14601e8c5f21Seeh case DIOCWFORMAT32: 14611e8c5f21Seeh IOCTL_STRUCT_CONV_TO(DIOCWFORMAT, format_op); 1462a3ff3a30Sfvdl #endif 14633ba6ab09Smrg 14642b90ec0aSsimonb case KFILTER_BYFILTER32: 14652b90ec0aSsimonb IOCTL_STRUCT_CONV_TO(KFILTER_BYFILTER, kfilter_mapping); 14662b90ec0aSsimonb case KFILTER_BYNAME32: 14672b90ec0aSsimonb IOCTL_STRUCT_CONV_TO(KFILTER_BYNAME, kfilter_mapping); 14682b90ec0aSsimonb 146932ccd9f2Smanu case ATAIOCCOMMAND32: 147032ccd9f2Smanu IOCTL_STRUCT_CONV_TO(ATAIOCCOMMAND, atareq); 147132ccd9f2Smanu 1472c5617ba8Smartin case SIOCIFGCLONERS32: 1473c5617ba8Smartin { 1474c5617ba8Smartin struct netbsd32_if_clonereq *req = 1475c5617ba8Smartin (struct netbsd32_if_clonereq *)data32; 1476c5617ba8Smartin char *buf = NETBSD32PTR64(req->ifcr_buffer); 1477c5617ba8Smartin 1478c5617ba8Smartin error = if_clone_list(req->ifcr_count, 1479c5617ba8Smartin buf, &req->ifcr_total); 1480c5617ba8Smartin break; 1481c5617ba8Smartin } 1482c5617ba8Smartin 14833ba6ab09Smrg /* 14843ba6ab09Smrg * only a few ifreq syscalls need conversion and those are 14853ba6ab09Smrg * all driver specific... XXX 14863ba6ab09Smrg */ 14873ba6ab09Smrg #if 0 14881e8c5f21Seeh case SIOCGADDRROM3232: 14891e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGADDRROM32, ifreq); 14901e8c5f21Seeh case SIOCGCHIPID32: 14911e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGCHIPID, ifreq); 14921e8c5f21Seeh case SIOCSIFADDR32: 14931e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFADDR, ifreq); 14941e8c5f21Seeh case OSIOCGIFADDR32: 14951e8c5f21Seeh IOCTL_STRUCT_CONV_TO(OSIOCGIFADDR, ifreq); 14961e8c5f21Seeh case SIOCGIFADDR32: 14971e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFADDR, ifreq); 14981e8c5f21Seeh case SIOCSIFDSTADDR32: 14991e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFDSTADDR, ifreq); 15001e8c5f21Seeh case OSIOCGIFDSTADDR32: 15011e8c5f21Seeh IOCTL_STRUCT_CONV_TO(OSIOCGIFDSTADDR, ifreq); 15021e8c5f21Seeh case SIOCGIFDSTADDR32: 15031e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFDSTADDR, ifreq); 15041e8c5f21Seeh case OSIOCGIFBRDADDR32: 15051e8c5f21Seeh IOCTL_STRUCT_CONV_TO(OSIOCGIFBRDADDR, ifreq); 15061e8c5f21Seeh case SIOCGIFBRDADDR32: 15071e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFBRDADDR, ifreq); 15081e8c5f21Seeh case SIOCSIFBRDADDR32: 15091e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFBRDADDR, ifreq); 15101e8c5f21Seeh case OSIOCGIFNETMASK32: 15111e8c5f21Seeh IOCTL_STRUCT_CONV_TO(OSIOCGIFNETMASK, ifreq); 15121e8c5f21Seeh case SIOCGIFNETMASK32: 15131e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFNETMASK, ifreq); 15141e8c5f21Seeh case SIOCSIFNETMASK32: 15151e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFNETMASK, ifreq); 15161e8c5f21Seeh case SIOCGIFMETRIC32: 15171e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFMETRIC, ifreq); 15181e8c5f21Seeh case SIOCSIFMETRIC32: 15191e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFMETRIC, ifreq); 15201e8c5f21Seeh case SIOCDIFADDR32: 15211e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCDIFADDR, ifreq); 15221e8c5f21Seeh case SIOCADDMULTI32: 15231e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCADDMULTI, ifreq); 15241e8c5f21Seeh case SIOCDELMULTI32: 15251e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCDELMULTI, ifreq); 15261e8c5f21Seeh case SIOCSIFMEDIA32: 15271e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFMEDIA, ifreq); 15281e8c5f21Seeh case SIOCSIFMTU32: 15291e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSIFMTU, ifreq); 15301e8c5f21Seeh case SIOCGIFMTU32: 15311e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFMTU, ifreq); 1532c56f7f42Schristos case BIOCGETIF32: 1533c56f7f42Schristos IOCTL_STRUCT_CONV_TO(BIOCGETIF, ifreq); 15341e8c5f21Seeh case BIOCSETIF32: 15351e8c5f21Seeh IOCTL_STRUCT_CONV_TO(BIOCSETIF, ifreq); 15361e8c5f21Seeh case SIOCPHASE132: 15371e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCPHASE1, ifreq); 15381e8c5f21Seeh case SIOCPHASE232: 15391e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCPHASE2, ifreq); 15403ba6ab09Smrg #endif 15413ba6ab09Smrg 15420237fe6dSnjoly case OOSIOCGIFCONF32: 15430237fe6dSnjoly IOCTL_STRUCT_CONV_TO(OOSIOCGIFCONF, ifconf); 15441e8c5f21Seeh case OSIOCGIFCONF32: 15451e8c5f21Seeh IOCTL_STRUCT_CONV_TO(OSIOCGIFCONF, ifconf); 15461e8c5f21Seeh case SIOCGIFCONF32: 15471e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFCONF, ifconf); 15483ba6ab09Smrg 15491d9c8161Smrg case SIOCGIFFLAGS32: 15501d9c8161Smrg IOCTL_STRUCT_CONV_TO(SIOCGIFFLAGS, ifreq); 15511d9c8161Smrg case SIOCSIFFLAGS32: 15521d9c8161Smrg IOCTL_STRUCT_CONV_TO(SIOCSIFFLAGS, ifreq); 15531d9c8161Smrg 15540f0d2276Smatt case SIOCGIFADDRPREF32: 15550f0d2276Smatt IOCTL_STRUCT_CONV_TO(SIOCGIFADDRPREF, if_addrprefreq); 15560f0d2276Smatt case SIOCSIFADDRPREF32: 15570f0d2276Smatt IOCTL_STRUCT_CONV_TO(SIOCSIFADDRPREF, if_addrprefreq); 15580f0d2276Smatt 1559ed4d3e75Smartin case SIOCGIFDATA32: 1560ed4d3e75Smartin IOCTL_STRUCT_CONV_TO(SIOCGIFDATA, ifdatareq); 1561ed4d3e75Smartin case SIOCZIFDATA32: 1562ed4d3e75Smartin IOCTL_STRUCT_CONV_TO(SIOCZIFDATA, ifdatareq); 15630f0d2276Smatt 156467de10fcSchristos case OSIOCGIFFLAGS32: 156567de10fcSchristos IOCTL_STRUCT_CONV_TO(OSIOCGIFFLAGS, oifreq); 156667de10fcSchristos case OSIOCSIFFLAGS32: 156767de10fcSchristos IOCTL_STRUCT_CONV_TO(OSIOCSIFFLAGS, oifreq); 156867de10fcSchristos 1569bf354a07Smsaitoh case SIOCGIFMEDIA32_80: 1570bf354a07Smsaitoh IOCTL_STRUCT_CONV_TO(SIOCGIFMEDIA_80, ifmediareq); 15711e8c5f21Seeh case SIOCGIFMEDIA32: 15721e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGIFMEDIA, ifmediareq); 15733ba6ab09Smrg 157484d9fa6cSroy case SIOCGNBRINFO32: 157584d9fa6cSroy IOCTL_STRUCT_CONV_TO(SIOCGNBRINFO, in_nbrinfo); 15769742d884Ssimonb case SIOCGNBRINFO_IN632: 15779742d884Ssimonb IOCTL_STRUCT_CONV_TO(SIOCGNBRINFO_IN6, in6_nbrinfo); 15789742d884Ssimonb 157917b1a5f7Sjmcneill case SIOCGIFGENERIC32: 158017b1a5f7Sjmcneill IOCTL_STRUCT_CONV_TO(SIOCGIFGENERIC, ifreq); 158117b1a5f7Sjmcneill case SIOCSIFGENERIC32: 158217b1a5f7Sjmcneill IOCTL_STRUCT_CONV_TO(SIOCSIFGENERIC, ifreq); 158317b1a5f7Sjmcneill 1584fc67b5dcSroy case PPPOESETPARMS32: 1585fc67b5dcSroy IOCTL_STRUCT_CONV_TO(PPPOESETPARMS, pppoediscparms); 1586fc67b5dcSroy case PPPOEGETPARMS32: 1587fc67b5dcSroy IOCTL_STRUCT_CONV_TO(PPPOEGETPARMS, pppoediscparms); 158827cf308bSroy case SPPPGETAUTHCFG32: 158927cf308bSroy IOCTL_STRUCT_CONV_TO(SPPPGETAUTHCFG, spppauthcfg); 159027cf308bSroy case SPPPSETAUTHCFG32: 159127cf308bSroy IOCTL_STRUCT_CONV_TO(SPPPSETAUTHCFG, spppauthcfg); 159227cf308bSroy 15931e8c5f21Seeh case SIOCSDRVSPEC32: 15941e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCSDRVSPEC, ifdrv); 15950d007d00Smatt case SIOCGDRVSPEC32: 15960d007d00Smatt IOCTL_STRUCT_CONV_TO(SIOCGDRVSPEC, ifdrv); 15973ba6ab09Smrg 15981e8c5f21Seeh case SIOCGETVIFCNT32: 15991e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGETVIFCNT, sioc_vif_req); 16003ba6ab09Smrg 16011e8c5f21Seeh case SIOCGETSGCNT32: 16021e8c5f21Seeh IOCTL_STRUCT_CONV_TO(SIOCGETSGCNT, sioc_sg_req); 16031e8c5f21Seeh 1604f89159bbSsimonb case FSSIOCSET32: /* XXX FSSIOCSET50 not yet handled */ 1605f89159bbSsimonb IOCTL_STRUCT_CONV_TO(FSSIOCSET, fss_set); 1606f89159bbSsimonb case FSSIOCGET32: /* XXX FSSIOCGET50 not yet handled */ 1607f89159bbSsimonb IOCTL_STRUCT_CONV_TO(FSSIOCGET, fss_get); 1608f89159bbSsimonb 16099e2edd2bSmrg case VNDIOCSET32: 16109e2edd2bSmrg IOCTL_STRUCT_CONV_TO(VNDIOCSET, vnd_ioctl); 16119e2edd2bSmrg case VNDIOCCLR32: 16129e2edd2bSmrg IOCTL_STRUCT_CONV_TO(VNDIOCCLR, vnd_ioctl); 16139e2edd2bSmrg case VNDIOCGET32: 16149e2edd2bSmrg IOCTL_STRUCT_CONV_TO(VNDIOCGET, vnd_user); 1615c97f9c82Smrg case VNDIOCSET5032: 1616c97f9c82Smrg IOCTL_STRUCT_CONV_TO(VNDIOCSET50, vnd_ioctl50); 1617c97f9c82Smrg case VNDIOCCLR5032: 1618c97f9c82Smrg IOCTL_STRUCT_CONV_TO(VNDIOCCLR50, vnd_ioctl50); 1619c97f9c82Smrg 16206795d62eSnjoly case ENVSYS_GETDICTIONARY32: 16216795d62eSnjoly IOCTL_STRUCT_CONV_TO(ENVSYS_GETDICTIONARY, plistref); 16226795d62eSnjoly case ENVSYS_SETDICTIONARY32: 16236795d62eSnjoly IOCTL_STRUCT_CONV_TO(ENVSYS_SETDICTIONARY, plistref); 16246795d62eSnjoly case ENVSYS_REMOVEPROPS32: 16256795d62eSnjoly IOCTL_STRUCT_CONV_TO(ENVSYS_REMOVEPROPS, plistref); 16266795d62eSnjoly 1627166893d4Sbouyer case WDOGIOC_GWDOGS32: 1628166893d4Sbouyer IOCTL_STRUCT_CONV_TO(WDOGIOC_GWDOGS, wdog_conf); 1629166893d4Sbouyer 1630ccc80301Sbouyer case BIOCSETF32: 1631ccc80301Sbouyer IOCTL_STRUCT_CONV_TO(BIOCSETF, bpf_program); 16323e4f2cbfSjmcneill case BIOCSETWF32: 16333e4f2cbfSjmcneill IOCTL_STRUCT_CONV_TO(BIOCSETWF, bpf_program); 1634ccc80301Sbouyer case BIOCSTCPF32: 1635ccc80301Sbouyer IOCTL_STRUCT_CONV_TO(BIOCSTCPF, bpf_program); 1636ccc80301Sbouyer case BIOCSUDPF32: 1637ccc80301Sbouyer IOCTL_STRUCT_CONV_TO(BIOCSUDPF, bpf_program); 1638ccc80301Sbouyer case BIOCGDLTLIST32: 1639ccc80301Sbouyer IOCTL_STRUCT_CONV_TO(BIOCGDLTLIST, bpf_dltlist); 1640eae570daSrin case BIOCSRTIMEOUT32: 16412d366d5dSrin #define netbsd32_to_timeval(s32p, p, cmd) netbsd32_to_timeval(s32p, p) 164291dfd1d8Schristos #define netbsd32_from_timeval(p, s32p, cmd) netbsd32_from_timeval(p, s32p) 164391dfd1d8Schristos IOCTL_STRUCT_CONV_TO(BIOCSRTIMEOUT, timeval); 164491dfd1d8Schristos #undef netbsd32_to_timeval 164591dfd1d8Schristos #undef netbsd32_from_timeval 1646ccc80301Sbouyer 1647daaec637Smacallan case WSDISPLAYIO_ADDSCREEN32: 1648e19818fbSmsaitoh IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_ADDSCREEN, 1649e19818fbSmsaitoh wsdisplay_addscreendata); 1650daaec637Smacallan 1651f7396474Smacallan case WSDISPLAYIO_GCURSOR32: 1652f7396474Smacallan IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_GCURSOR, wsdisplay_cursor); 1653f7396474Smacallan case WSDISPLAYIO_SCURSOR32: 1654f7396474Smacallan IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_SCURSOR, wsdisplay_cursor); 1655f7396474Smacallan 165609a234bdSbouyer case WSDISPLAYIO_GETCMAP32: 165709a234bdSbouyer IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_GETCMAP, wsdisplay_cmap); 165809a234bdSbouyer case WSDISPLAYIO_PUTCMAP32: 165909a234bdSbouyer IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_PUTCMAP, wsdisplay_cmap); 166009a234bdSbouyer 1661baced4feSmacallan case WSDISPLAYIO_LDFONT32: 1662baced4feSmacallan IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_LDFONT, wsdisplay_font); 1663baced4feSmacallan case WSDISPLAYIO_SFONT32: 1664baced4feSmacallan IOCTL_STRUCT_CONV_TO(WSDISPLAYIO_SFONT, wsdisplay_usefontdata); 1665baced4feSmacallan 166682e21017Schristos case SIOCS8021132: 166782e21017Schristos IOCTL_STRUCT_CONV_TO(SIOCS80211, ieee80211req); 166882e21017Schristos case SIOCG8021132: 166982e21017Schristos IOCTL_STRUCT_CONV_TO(SIOCG80211, ieee80211req); 1670d9554c19Smacallan case SIOCS80211NWKEY32: 16713d6ab01eSmacallan IOCTL_STRUCT_CONV_TO(SIOCS80211NWKEY, ieee80211_nwkey); 1672b788a760Smacallan case SIOCG80211NWKEY32: 1673b788a760Smacallan IOCTL_STRUCT_CONV_TO(SIOCG80211NWKEY, ieee80211_nwkey); 1674d9554c19Smacallan 1675fccabba9Smacallan case POWER_EVENT_RECVDICT32: 1676fccabba9Smacallan IOCTL_STRUCT_CONV_TO(POWER_EVENT_RECVDICT, plistref); 1677fccabba9Smacallan 1678254cd918Schristos case CLOCKCTL_SETTIMEOFDAY32: 1679254cd918Schristos IOCTL_STRUCT_CONV_TO(CLOCKCTL_SETTIMEOFDAY, 1680254cd918Schristos clockctl_settimeofday); 1681254cd918Schristos case CLOCKCTL_ADJTIME32: 1682254cd918Schristos IOCTL_STRUCT_CONV_TO(CLOCKCTL_ADJTIME, clockctl_adjtime); 1683254cd918Schristos case CLOCKCTL_CLOCK_SETTIME32: 1684254cd918Schristos IOCTL_STRUCT_CONV_TO(CLOCKCTL_CLOCK_SETTIME, 1685254cd918Schristos clockctl_clock_settime); 1686254cd918Schristos case CLOCKCTL_NTP_ADJTIME32: 1687bfaaad74Schristos #ifdef NTP 1688bfaaad74Schristos { 1689bfaaad74Schristos size = IOCPARM_LEN(CLOCKCTL_NTP_ADJTIME); 1690bfaaad74Schristos if (size > sizeof(stkbuf)) 1691bfaaad74Schristos data = memp = kmem_alloc(size, KM_SLEEP); 1692bfaaad74Schristos else 1693bfaaad74Schristos data = (void *)stkbuf; 1694bfaaad74Schristos 1695bfaaad74Schristos netbsd32_to_clockctl_ntp_adjtime( 1696bfaaad74Schristos (const struct netbsd32_clockctl_ntp_adjtime *)data32, 1697bfaaad74Schristos (struct clockctl_ntp_adjtime *)data, 1698bfaaad74Schristos CLOCKCTL_NTP_ADJTIME); 1699bfaaad74Schristos error = netbsd32_do_clockctl_ntp_adjtime(fp, 1700bfaaad74Schristos (struct clockctl_ntp_adjtime *)data); 1701bfaaad74Schristos netbsd32_from_clockctl_ntp_adjtime( 1702bfaaad74Schristos (const struct clockctl_ntp_adjtime *)data, 1703bfaaad74Schristos (struct netbsd32_clockctl_ntp_adjtime *)data32, 1704bfaaad74Schristos CLOCKCTL_NTP_ADJTIME); 1705bfaaad74Schristos 1706bfaaad74Schristos break; 1707bfaaad74Schristos } 1708bfaaad74Schristos #else 1709bfaaad74Schristos error = ENOTTY; 1710bfaaad74Schristos break; 1711bfaaad74Schristos #endif /* NTP */ 1712bfaaad74Schristos 1713d0c9fc59Smatt case KIOCGSYMBOL32: 1714d0c9fc59Smatt IOCTL_STRUCT_CONV_TO(KIOCGSYMBOL, ksyms_gsymbol); 1715d0c9fc59Smatt case KIOCGVALUE32: 1716d0c9fc59Smatt IOCTL_STRUCT_CONV_TO(KIOCGVALUE, ksyms_gvalue); 1717d0c9fc59Smatt 1718c16d8e94Smlelstv case IOC_NPF_LOAD32: 1719c16d8e94Smlelstv IOCTL_CONV_TO(IOC_NPF_LOAD, nvlist_ref_t); 1720c16d8e94Smlelstv case IOC_NPF_TABLE32: 1721c16d8e94Smlelstv IOCTL_STRUCT_CONV_TO(IOC_NPF_TABLE, npf_ioctl_table); 1722c16d8e94Smlelstv case IOC_NPF_STATS32: 1723c16d8e94Smlelstv IOCTL_CONV_TO(IOC_NPF_STATS, voidp); 1724c16d8e94Smlelstv case IOC_NPF_SAVE32: 1725c16d8e94Smlelstv IOCTL_CONV_TO(IOC_NPF_SAVE, nvlist_ref_t); 1726c16d8e94Smlelstv case IOC_NPF_RULE32: 1727c16d8e94Smlelstv IOCTL_CONV_TO(IOC_NPF_RULE, nvlist_ref_t); 1728c16d8e94Smlelstv case IOC_NPF_CONN_LOOKUP32: 1729c16d8e94Smlelstv IOCTL_CONV_TO(IOC_NPF_CONN_LOOKUP, nvlist_ref_t); 1730c16d8e94Smlelstv 17315be74d29Sjmcneill case DRVRESCANBUS32: 17325be74d29Sjmcneill IOCTL_STRUCT_CONV_TO(DRVRESCANBUS, devrescanargs); 17335be74d29Sjmcneill case DRVLISTDEV32: 17345be74d29Sjmcneill IOCTL_STRUCT_CONV_TO(DRVLISTDEV, devlistargs); 17355be74d29Sjmcneill case DRVCTLCOMMAND32: 17365be74d29Sjmcneill IOCTL_STRUCT_CONV_TO(DRVCTLCOMMAND, plistref); 17375be74d29Sjmcneill case DRVGETEVENT32: 17385be74d29Sjmcneill IOCTL_STRUCT_CONV_TO(DRVGETEVENT, plistref); 17395be74d29Sjmcneill 1740d7f371cdSjdolecek case DIOCGSTRATEGY32: 1741d7f371cdSjdolecek IOCTL_STRUCT_CONV_TO(DIOCGSTRATEGY, disk_strategy); 1742d7f371cdSjdolecek case DIOCSSTRATEGY32: 1743d7f371cdSjdolecek IOCTL_STRUCT_CONV_TO(DIOCSSTRATEGY, disk_strategy); 17440e3291dfSmlelstv case DIOCGDISKINFO32: 17450e3291dfSmlelstv IOCTL_STRUCT_CONV_TO(DIOCGDISKINFO, plistref); 17461261ded2Smlelstv case DIOCLWEDGES32: 17471261ded2Smlelstv IOCTL_STRUCT_CONV_TO(DIOCLWEDGES, dkwedge_list); 17481261ded2Smlelstv 174941b59d1aSsimonb case IOC_LOCKSTAT_ENABLE32: 175041b59d1aSsimonb IOCTL_STRUCT_CONV_TO(IOC_LOCKSTAT_ENABLE, lsenable); 175141b59d1aSsimonb case IOC_LOCKSTAT_DISABLE32: 175241b59d1aSsimonb IOCTL_STRUCT_CONV_TO(IOC_LOCKSTAT_DISABLE, lsdisable); 175341b59d1aSsimonb 17541e8c5f21Seeh default: 1755842abfeeSchristos #ifdef NETBSD32_DRMKMS 1756842abfeeSchristos if (IOCGROUP(com) == 'd') { 1757842abfeeSchristos error = netbsd32_drm_ioctl(fp, com, data32, l); 1758842abfeeSchristos break; 1759842abfeeSchristos } 1760842abfeeSchristos #endif 17615d06ed3cSmrg #ifdef NETBSD32_MD_IOCTL 176295e1ffb1Schristos error = netbsd32_md_ioctl(fp, com, data32, l); 17635d06ed3cSmrg #else 1764a9ca7a37Sad error = (*fp->f_ops->fo_ioctl)(fp, com, data32); 17655d06ed3cSmrg #endif 17663ba6ab09Smrg break; 17673ba6ab09Smrg } 17683ba6ab09Smrg 1769fc06b6e9Sfvdl if (error == EPASSTHROUGH) 1770fc06b6e9Sfvdl error = ENOTTY; 1771fc06b6e9Sfvdl 17721e8c5f21Seeh /* 17731e8c5f21Seeh * Copy any data to user, size was 17741e8c5f21Seeh * already set and checked above. 17751e8c5f21Seeh */ 1776226b6c84Snjoly if (error == 0 && (com&IOC_OUT) && size32) { 1777d364d308Sdsl error = copyout(data32, SCARG_P32(uap, data), size32); 1778a9ca7a37Sad ktrgenio(fd, UIO_READ, SCARG_P32(uap, data), 1779226b6c84Snjoly size32, error); 1780226b6c84Snjoly } 17811e8c5f21Seeh 1782ad396e28Smatt out: 1783d00df284Srmind /* If we allocated data, free it here. */ 17841e8c5f21Seeh if (memp32) 1785ad396e28Smatt kmem_free(memp32, alloc_size32); 17861e8c5f21Seeh if (memp) 1787fc2c6c78Smatt kmem_free(memp, size); 1788a9ca7a37Sad fd_putfile(fd); 1789e19818fbSmsaitoh return error; 17903ba6ab09Smrg } 1791