xref: /netbsd-src/sys/compat/netbsd32/netbsd32_ioctl.c (revision c2f489221e6bef1a8efa6f93091db60d97764d82)
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