Import 2.3.52pre1
[davej-history.git] / arch / sparc64 / kernel / ioctl32.c
blobb8fb7cfbd679aa22ed3a206bedc1d288a9a762ca
1 /* $Id: ioctl32.c,v 1.81 2000/03/12 04:02:07 davem Exp $
2 * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
4 * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
5 * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
7 * These routines maintain argument size conversion between 32bit and 64bit
8 * ioctls.
9 */
11 #include <linux/types.h>
12 #include <linux/kernel.h>
13 #include <linux/sched.h>
14 #include <linux/smp.h>
15 #include <linux/smp_lock.h>
16 #include <linux/ioctl.h>
17 #include <linux/if.h>
18 #include <linux/malloc.h>
19 #include <linux/hdreg.h>
20 #if 0 /* New RAID code is half-merged... -DaveM */
21 #include <linux/md.h>
22 #endif
23 #include <linux/kd.h>
24 #include <linux/route.h>
25 #include <linux/skbuff.h>
26 #include <linux/netlink.h>
27 #include <linux/vt.h>
28 #include <linux/fs.h>
29 #include <linux/file.h>
30 #include <linux/fd.h>
31 #include <linux/ppp_defs.h>
32 #include <linux/if_ppp.h>
33 #include <linux/mtio.h>
34 #include <linux/cdrom.h>
35 #include <linux/loop.h>
36 #include <linux/auto_fs.h>
37 #include <linux/devfs_fs.h>
38 #include <linux/tty.h>
39 #include <linux/vt_kern.h>
40 #include <linux/fb.h>
41 #include <linux/ext2_fs.h>
42 #include <linux/videodev.h>
43 #include <linux/netdevice.h>
44 #include <linux/raw.h>
45 #include <linux/smb_fs.h>
46 #include <linux/blkpg.h>
48 #include <scsi/scsi.h>
49 /* Ugly hack. */
50 #undef __KERNEL__
51 #include <scsi/scsi_ioctl.h>
52 #define __KERNEL__
53 #include <scsi/sg.h>
55 #include <asm/types.h>
56 #include <asm/uaccess.h>
57 #include <asm/fbio.h>
58 #include <asm/kbio.h>
59 #include <asm/vuid_event.h>
60 #include <asm/rtc.h>
61 #include <asm/openpromio.h>
62 #include <asm/envctrl.h>
63 #include <asm/audioio.h>
64 #include <asm/ethtool.h>
66 #include <linux/soundcard.h>
68 #include <linux/atm.h>
69 #include <linux/atmarp.h>
70 #include <linux/atmclip.h>
71 #include <linux/atmdev.h>
72 #include <linux/atmioc.h>
73 #include <linux/atmlec.h>
74 #include <linux/atmmpc.h>
75 #include <linux/atmsvc.h>
76 #include <linux/atm_tcp.h>
77 #include <linux/sonet.h>
78 #include <linux/atm_suni.h>
80 /* Use this to get at 32-bit user passed pointers.
81 See sys_sparc32.c for description about these. */
82 #define A(__x) ((unsigned long)(__x))
83 #define AA(__x) \
84 ({ unsigned long __ret; \
85 __asm__ ("srl %0, 0, %0" \
86 : "=r" (__ret) \
87 : "0" (__x)); \
88 __ret; \
91 /* Aiee. Someone does not find a difference between int and long */
92 #define EXT2_IOC32_GETFLAGS _IOR('f', 1, int)
93 #define EXT2_IOC32_SETFLAGS _IOW('f', 2, int)
94 #define EXT2_IOC32_GETVERSION _IOR('v', 1, int)
95 #define EXT2_IOC32_SETVERSION _IOW('v', 2, int)
97 extern asmlinkage int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
99 static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg)
101 mm_segment_t old_fs = get_fs();
102 int err;
103 unsigned long val;
105 set_fs (KERNEL_DS);
106 err = sys_ioctl(fd, cmd, (unsigned long)&val);
107 set_fs (old_fs);
108 if (!err && put_user(val, (u32 *)arg))
109 return -EFAULT;
110 return err;
113 static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
115 mm_segment_t old_fs = get_fs();
116 int err;
117 unsigned long val;
119 if(get_user(val, (u32 *)arg))
120 return -EFAULT;
121 set_fs (KERNEL_DS);
122 err = sys_ioctl(fd, cmd, (unsigned long)&val);
123 set_fs (old_fs);
124 if (!err && put_user(val, (u32 *)arg))
125 return -EFAULT;
126 return err;
129 static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
131 /* These are just misnamed, they actually get/put from/to user an int */
132 switch (cmd) {
133 case EXT2_IOC32_GETFLAGS: cmd = EXT2_IOC_GETFLAGS; break;
134 case EXT2_IOC32_SETFLAGS: cmd = EXT2_IOC_SETFLAGS; break;
135 case EXT2_IOC32_GETVERSION: cmd = EXT2_IOC_GETVERSION; break;
136 case EXT2_IOC32_SETVERSION: cmd = EXT2_IOC_SETVERSION; break;
138 return sys_ioctl(fd, cmd, arg);
141 struct video_tuner32 {
142 s32 tuner;
143 u8 name[32];
144 u32 rangelow, rangehigh;
145 u32 flags;
146 u16 mode, signal;
149 static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 *up)
151 int i;
153 if(get_user(kp->tuner, &up->tuner))
154 return -EFAULT;
155 for(i = 0; i < 32; i++)
156 __get_user(kp->name[i], &up->name[i]);
157 __get_user(kp->rangelow, &up->rangelow);
158 __get_user(kp->rangehigh, &up->rangehigh);
159 __get_user(kp->flags, &up->flags);
160 __get_user(kp->mode, &up->mode);
161 __get_user(kp->signal, &up->signal);
162 return 0;
165 static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 *up)
167 int i;
169 if(put_user(kp->tuner, &up->tuner))
170 return -EFAULT;
171 for(i = 0; i < 32; i++)
172 __put_user(kp->name[i], &up->name[i]);
173 __put_user(kp->rangelow, &up->rangelow);
174 __put_user(kp->rangehigh, &up->rangehigh);
175 __put_user(kp->flags, &up->flags);
176 __put_user(kp->mode, &up->mode);
177 __put_user(kp->signal, &up->signal);
178 return 0;
181 struct video_buffer32 {
182 /* void * */ u32 base;
183 s32 height, width, depth, bytesperline;
186 static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 *up)
188 u32 tmp;
190 if(get_user(tmp, &up->base))
191 return -EFAULT;
192 kp->base = (void *) ((unsigned long)tmp);
193 __get_user(kp->height, &up->height);
194 __get_user(kp->width, &up->width);
195 __get_user(kp->depth, &up->depth);
196 __get_user(kp->bytesperline, &up->bytesperline);
197 return 0;
200 static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 *up)
202 u32 tmp = (u32)((unsigned long)kp->base);
204 if(put_user(tmp, &up->base))
205 return -EFAULT;
206 __put_user(kp->height, &up->height);
207 __put_user(kp->width, &up->width);
208 __put_user(kp->depth, &up->depth);
209 __put_user(kp->bytesperline, &up->bytesperline);
210 return 0;
213 struct video_clip32 {
214 s32 x, y, width, height;
215 /* struct video_clip32 * */ u32 next;
218 struct video_window32 {
219 u32 x, y, width, height, chromakey, flags;
220 /* struct video_clip32 * */ u32 clips;
221 s32 clipcount;
224 static void free_kvideo_clips(struct video_window *kp)
226 struct video_clip *cp;
228 cp = kp->clips;
229 if(cp != NULL)
230 kfree(cp);
233 static int get_video_window32(struct video_window *kp, struct video_window32 *up)
235 struct video_clip32 *ucp;
236 struct video_clip *kcp;
237 int nclips, err, i;
238 u32 tmp;
240 if(get_user(kp->x, &up->x))
241 return -EFAULT;
242 __get_user(kp->y, &up->y);
243 __get_user(kp->width, &up->width);
244 __get_user(kp->height, &up->height);
245 __get_user(kp->chromakey, &up->chromakey);
246 __get_user(kp->flags, &up->flags);
247 __get_user(kp->clipcount, &up->clipcount);
248 __get_user(tmp, &up->clips);
249 ucp = (struct video_clip32 *)A(tmp);
250 kp->clips = NULL;
252 nclips = kp->clipcount;
253 if(nclips == 0)
254 return 0;
256 if(ucp == 0)
257 return -EINVAL;
259 /* Peculiar interface... */
260 if(nclips < 0)
261 nclips = VIDEO_CLIPMAP_SIZE;
263 kcp = kmalloc(nclips * sizeof(struct video_clip), GFP_KERNEL);
264 err = -ENOMEM;
265 if(kcp == NULL)
266 goto cleanup_and_err;
268 kp->clips = kcp;
269 for(i = 0; i < nclips; i++) {
270 __get_user(kcp[i].x, &ucp[i].x);
271 __get_user(kcp[i].y, &ucp[i].y);
272 __get_user(kcp[i].width, &ucp[i].width);
273 __get_user(kcp[i].height, &ucp[i].height);
274 kcp[nclips].next = NULL;
277 return 0;
279 cleanup_and_err:
280 free_kvideo_clips(kp);
281 return err;
284 /* You get back everything except the clips... */
285 static int put_video_window32(struct video_window *kp, struct video_window32 *up)
287 if(put_user(kp->x, &up->x))
288 return -EFAULT;
289 __put_user(kp->y, &up->y);
290 __put_user(kp->width, &up->width);
291 __put_user(kp->height, &up->height);
292 __put_user(kp->chromakey, &up->chromakey);
293 __put_user(kp->flags, &up->flags);
294 __put_user(kp->clipcount, &up->clipcount);
295 return 0;
298 #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32)
299 #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32)
300 #define VIDIOCGWIN32 _IOR('v',9, struct video_window32)
301 #define VIDIOCSWIN32 _IOW('v',10, struct video_window32)
302 #define VIDIOCGFBUF32 _IOR('v',11, struct video_buffer32)
303 #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32)
304 #define VIDIOCGFREQ32 _IOR('v',14, u32)
305 #define VIDIOCSFREQ32 _IOW('v',15, u32)
307 static int do_video_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
309 union {
310 struct video_tuner vt;
311 struct video_buffer vb;
312 struct video_window vw;
313 unsigned long vx;
314 } karg;
315 mm_segment_t old_fs = get_fs();
316 void *up = (void *)arg;
317 int err = 0;
319 /* First, convert the command. */
320 switch(cmd) {
321 case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break;
322 case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break;
323 case VIDIOCGWIN32: cmd = VIDIOCGWIN; break;
324 case VIDIOCSWIN32: cmd = VIDIOCSWIN; break;
325 case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break;
326 case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break;
327 case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break;
328 case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break;
331 switch(cmd) {
332 case VIDIOCSTUNER:
333 case VIDIOCGTUNER:
334 err = get_video_tuner32(&karg.vt, up);
335 break;
337 case VIDIOCSWIN:
338 err = get_video_window32(&karg.vw, up);
339 break;
341 case VIDIOCSFBUF:
342 err = get_video_buffer32(&karg.vb, up);
343 break;
345 case VIDIOCSFREQ:
346 err = get_user(karg.vx, (u32 *)up);
347 break;
349 if(err)
350 goto out;
352 set_fs(KERNEL_DS);
353 err = sys_ioctl(fd, cmd, (unsigned long)&karg);
354 set_fs(old_fs);
356 if(cmd == VIDIOCSWIN)
357 free_kvideo_clips(&karg.vw);
359 if(err == 0) {
360 switch(cmd) {
361 case VIDIOCGTUNER:
362 err = put_video_tuner32(&karg.vt, up);
363 break;
365 case VIDIOCGWIN:
366 err = put_video_window32(&karg.vw, up);
367 break;
369 case VIDIOCGFBUF:
370 err = put_video_buffer32(&karg.vb, up);
371 break;
373 case VIDIOCGFREQ:
374 err = put_user(((u32)karg.vx), (u32 *)up);
375 break;
378 out:
379 return err;
382 struct timeval32 {
383 int tv_sec;
384 int tv_usec;
387 static int do_siocgstamp(unsigned int fd, unsigned int cmd, unsigned long arg)
389 struct timeval32 *up = (struct timeval32 *)arg;
390 struct timeval ktv;
391 mm_segment_t old_fs = get_fs();
392 int err;
394 set_fs(KERNEL_DS);
395 err = sys_ioctl(fd, cmd, (unsigned long)&ktv);
396 set_fs(old_fs);
397 if(!err) {
398 err = put_user(ktv.tv_sec, &up->tv_sec);
399 err |= __put_user(ktv.tv_usec, &up->tv_usec);
401 return err;
404 struct ifmap32 {
405 u32 mem_start;
406 u32 mem_end;
407 unsigned short base_addr;
408 unsigned char irq;
409 unsigned char dma;
410 unsigned char port;
413 struct ifreq32 {
414 #define IFHWADDRLEN 6
415 #define IFNAMSIZ 16
416 union {
417 char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
418 } ifr_ifrn;
419 union {
420 struct sockaddr ifru_addr;
421 struct sockaddr ifru_dstaddr;
422 struct sockaddr ifru_broadaddr;
423 struct sockaddr ifru_netmask;
424 struct sockaddr ifru_hwaddr;
425 short ifru_flags;
426 int ifru_ivalue;
427 int ifru_mtu;
428 struct ifmap32 ifru_map;
429 char ifru_slave[IFNAMSIZ]; /* Just fits the size */
430 char ifru_newname[IFNAMSIZ];
431 __kernel_caddr_t32 ifru_data;
432 } ifr_ifru;
435 struct ifconf32 {
436 int ifc_len; /* size of buffer */
437 __kernel_caddr_t32 ifcbuf;
440 static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
442 struct net_device *dev;
443 struct ifreq32 ifr32;
444 int err;
446 if (copy_from_user(&ifr32, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
447 return -EFAULT;
449 dev = dev_get_by_index(ifr32.ifr_ifindex);
450 if (!dev)
451 return -ENODEV;
453 strcpy(ifr32.ifr_name, dev->name);
455 err = copy_to_user((struct ifreq32 *)arg, &ifr32, sizeof(struct ifreq32));
456 return (err ? -EFAULT : 0);
459 static inline int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
461 struct ifconf32 ifc32;
462 struct ifconf ifc;
463 struct ifreq32 *ifr32;
464 struct ifreq *ifr;
465 mm_segment_t old_fs;
466 unsigned int i, j;
467 int err;
469 if (copy_from_user(&ifc32, (struct ifconf32 *)arg, sizeof(struct ifconf32)))
470 return -EFAULT;
472 if(ifc32.ifcbuf == 0) {
473 ifc32.ifc_len = 0;
474 ifc.ifc_len = 0;
475 ifc.ifc_buf = NULL;
476 } else {
477 ifc.ifc_len = ((ifc32.ifc_len / sizeof (struct ifreq32)) + 1) *
478 sizeof (struct ifreq);
479 ifc.ifc_buf = kmalloc (ifc.ifc_len, GFP_KERNEL);
480 if (!ifc.ifc_buf)
481 return -ENOMEM;
483 ifr = ifc.ifc_req;
484 ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
485 for (i = 0; i < ifc32.ifc_len; i += sizeof (struct ifreq32)) {
486 if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
487 kfree (ifc.ifc_buf);
488 return -EFAULT;
491 old_fs = get_fs(); set_fs (KERNEL_DS);
492 err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);
493 set_fs (old_fs);
494 if (!err) {
495 ifr = ifc.ifc_req;
496 ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
497 for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len;
498 i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
499 if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
500 err = -EFAULT;
501 break;
504 if (!err) {
505 if (i <= ifc32.ifc_len)
506 ifc32.ifc_len = i;
507 else
508 ifc32.ifc_len = i - sizeof (struct ifreq32);
509 if (copy_to_user((struct ifconf32 *)arg, &ifc32, sizeof(struct ifconf32)))
510 err = -EFAULT;
513 if(ifc.ifc_buf != NULL)
514 kfree (ifc.ifc_buf);
515 return err;
518 static inline int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
520 struct ifreq ifr;
521 mm_segment_t old_fs;
522 int err;
524 switch (cmd) {
525 case SIOCSIFMAP:
526 err = copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(ifr.ifr_name));
527 err |= __get_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
528 err |= __get_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
529 err |= __get_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
530 err |= __get_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
531 err |= __get_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
532 err |= __get_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
533 if (err)
534 return -EFAULT;
535 break;
536 case SIOCGPPPSTATS:
537 case SIOCGPPPCSTATS:
538 case SIOCGPPPVER:
539 case SIOCETHTOOL:
540 if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
541 return -EFAULT;
542 ifr.ifr_data = (__kernel_caddr_t)get_free_page(GFP_KERNEL);
543 if (!ifr.ifr_data)
544 return -EAGAIN;
545 if(cmd == SIOCETHTOOL) {
546 u32 data;
548 __get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
549 if(copy_from_user(ifr.ifr_data,
550 (char *)A(data),
551 sizeof(struct ethtool_cmd))) {
552 free_page((unsigned long)ifr.ifr_data);
553 return -EFAULT;
556 break;
557 default:
558 if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
559 return -EFAULT;
560 break;
562 old_fs = get_fs();
563 set_fs (KERNEL_DS);
564 err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
565 set_fs (old_fs);
566 if (!err) {
567 switch (cmd) {
568 case SIOCGIFFLAGS:
569 case SIOCGIFMETRIC:
570 case SIOCGIFMTU:
571 case SIOCGIFMEM:
572 case SIOCGIFHWADDR:
573 case SIOCGIFINDEX:
574 case SIOCGIFADDR:
575 case SIOCGIFBRDADDR:
576 case SIOCGIFDSTADDR:
577 case SIOCGIFNETMASK:
578 case SIOCGIFTXQLEN:
579 if (copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(struct ifreq32)))
580 return -EFAULT;
581 break;
582 case SIOCGPPPSTATS:
583 case SIOCGPPPCSTATS:
584 case SIOCGPPPVER:
585 case SIOCETHTOOL:
587 u32 data;
588 int len;
590 __get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
591 if(cmd == SIOCETHTOOL)
592 len = sizeof(struct ethtool_cmd);
593 if(cmd == SIOCGPPPVER)
594 len = strlen((char *)ifr.ifr_data) + 1;
595 else if(cmd == SIOCGPPPCSTATS)
596 len = sizeof(struct ppp_comp_stats);
597 else
598 len = sizeof(struct ppp_stats);
600 len = copy_to_user((char *)A(data), ifr.ifr_data, len);
601 free_page((unsigned long)ifr.ifr_data);
602 if(len)
603 return -EFAULT;
604 break;
606 case SIOCGIFMAP:
607 err = copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(ifr.ifr_name));
608 err |= __put_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
609 err |= __put_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
610 err |= __put_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
611 err |= __put_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
612 err |= __put_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
613 err |= __put_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
614 if (err)
615 err = -EFAULT;
616 break;
619 return err;
622 struct rtentry32 {
623 u32 rt_pad1;
624 struct sockaddr rt_dst; /* target address */
625 struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */
626 struct sockaddr rt_genmask; /* target network mask (IP) */
627 unsigned short rt_flags;
628 short rt_pad2;
629 u32 rt_pad3;
630 unsigned char rt_tos;
631 unsigned char rt_class;
632 short rt_pad4;
633 short rt_metric; /* +1 for binary compatibility! */
634 /* char * */ u32 rt_dev; /* forcing the device at add */
635 u32 rt_mtu; /* per route MTU/Window */
636 u32 rt_window; /* Window clamping */
637 unsigned short rt_irtt; /* Initial RTT */
641 static inline int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
643 struct rtentry r;
644 char devname[16];
645 u32 rtdev;
646 int ret;
647 mm_segment_t old_fs = get_fs();
649 ret = copy_from_user (&r.rt_dst, &(((struct rtentry32 *)arg)->rt_dst), 3 * sizeof(struct sockaddr));
650 ret |= __get_user (r.rt_flags, &(((struct rtentry32 *)arg)->rt_flags));
651 ret |= __get_user (r.rt_metric, &(((struct rtentry32 *)arg)->rt_metric));
652 ret |= __get_user (r.rt_mtu, &(((struct rtentry32 *)arg)->rt_mtu));
653 ret |= __get_user (r.rt_window, &(((struct rtentry32 *)arg)->rt_window));
654 ret |= __get_user (r.rt_irtt, &(((struct rtentry32 *)arg)->rt_irtt));
655 ret |= __get_user (rtdev, &(((struct rtentry32 *)arg)->rt_dev));
656 if (rtdev) {
657 ret |= copy_from_user (devname, (char *)A(rtdev), 15);
658 r.rt_dev = devname; devname[15] = 0;
659 } else
660 r.rt_dev = 0;
661 if (ret)
662 return -EFAULT;
663 set_fs (KERNEL_DS);
664 ret = sys_ioctl (fd, cmd, (long)&r);
665 set_fs (old_fs);
666 return ret;
669 struct hd_geometry32 {
670 unsigned char heads;
671 unsigned char sectors;
672 unsigned short cylinders;
673 u32 start;
676 static inline int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg)
678 mm_segment_t old_fs = get_fs();
679 struct hd_geometry geo;
680 int err;
682 set_fs (KERNEL_DS);
683 err = sys_ioctl(fd, HDIO_GETGEO, (unsigned long)&geo);
684 set_fs (old_fs);
685 if (!err) {
686 err = copy_to_user ((struct hd_geometry32 *)arg, &geo, 4);
687 err |= __put_user (geo.start, &(((struct hd_geometry32 *)arg)->start));
689 return err ? -EFAULT : 0;
692 struct fbcmap32 {
693 int index; /* first element (0 origin) */
694 int count;
695 u32 red;
696 u32 green;
697 u32 blue;
700 #define FBIOPUTCMAP32 _IOW('F', 3, struct fbcmap32)
701 #define FBIOGETCMAP32 _IOW('F', 4, struct fbcmap32)
703 static inline int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg)
705 struct fbcmap f;
706 int ret;
707 char red[256], green[256], blue[256];
708 u32 r, g, b;
709 mm_segment_t old_fs = get_fs();
711 ret = get_user(f.index, &(((struct fbcmap32 *)arg)->index));
712 ret |= __get_user(f.count, &(((struct fbcmap32 *)arg)->count));
713 ret |= __get_user(r, &(((struct fbcmap32 *)arg)->red));
714 ret |= __get_user(g, &(((struct fbcmap32 *)arg)->green));
715 ret |= __get_user(b, &(((struct fbcmap32 *)arg)->blue));
716 if (ret)
717 return -EFAULT;
718 if ((f.index < 0) || (f.index > 255)) return -EINVAL;
719 if (f.index + f.count > 256)
720 f.count = 256 - f.index;
721 if (cmd == FBIOPUTCMAP32) {
722 ret = copy_from_user (red, (char *)A(r), f.count);
723 ret |= copy_from_user (green, (char *)A(g), f.count);
724 ret |= copy_from_user (blue, (char *)A(b), f.count);
725 if (ret)
726 return -EFAULT;
728 f.red = red; f.green = green; f.blue = blue;
729 set_fs (KERNEL_DS);
730 ret = sys_ioctl (fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (long)&f);
731 set_fs (old_fs);
732 if (!ret && cmd == FBIOGETCMAP32) {
733 ret = copy_to_user ((char *)A(r), red, f.count);
734 ret |= copy_to_user ((char *)A(g), green, f.count);
735 ret |= copy_to_user ((char *)A(b), blue, f.count);
737 return ret ? -EFAULT : 0;
740 struct fbcursor32 {
741 short set; /* what to set, choose from the list above */
742 short enable; /* cursor on/off */
743 struct fbcurpos pos; /* cursor position */
744 struct fbcurpos hot; /* cursor hot spot */
745 struct fbcmap32 cmap; /* color map info */
746 struct fbcurpos size; /* cursor bit map size */
747 u32 image; /* cursor image bits */
748 u32 mask; /* cursor mask bits */
751 #define FBIOSCURSOR32 _IOW('F', 24, struct fbcursor32)
752 #define FBIOGCURSOR32 _IOW('F', 25, struct fbcursor32)
754 static inline int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
756 struct fbcursor f;
757 int ret;
758 char red[2], green[2], blue[2];
759 char image[128], mask[128];
760 u32 r, g, b;
761 u32 m, i;
762 mm_segment_t old_fs = get_fs();
764 ret = copy_from_user (&f, (struct fbcursor32 *)arg, 2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
765 ret |= __get_user(f.size.fbx, &(((struct fbcursor32 *)arg)->size.fbx));
766 ret |= __get_user(f.size.fby, &(((struct fbcursor32 *)arg)->size.fby));
767 ret |= __get_user(f.cmap.index, &(((struct fbcursor32 *)arg)->cmap.index));
768 ret |= __get_user(f.cmap.count, &(((struct fbcursor32 *)arg)->cmap.count));
769 ret |= __get_user(r, &(((struct fbcursor32 *)arg)->cmap.red));
770 ret |= __get_user(g, &(((struct fbcursor32 *)arg)->cmap.green));
771 ret |= __get_user(b, &(((struct fbcursor32 *)arg)->cmap.blue));
772 ret |= __get_user(m, &(((struct fbcursor32 *)arg)->mask));
773 ret |= __get_user(i, &(((struct fbcursor32 *)arg)->image));
774 if (ret)
775 return -EFAULT;
776 if (f.set & FB_CUR_SETCMAP) {
777 if ((uint) f.size.fby > 32)
778 return -EINVAL;
779 ret = copy_from_user (mask, (char *)A(m), f.size.fby * 4);
780 ret |= copy_from_user (image, (char *)A(i), f.size.fby * 4);
781 if (ret)
782 return -EFAULT;
783 f.image = image; f.mask = mask;
785 if (f.set & FB_CUR_SETCMAP) {
786 ret = copy_from_user (red, (char *)A(r), 2);
787 ret |= copy_from_user (green, (char *)A(g), 2);
788 ret |= copy_from_user (blue, (char *)A(b), 2);
789 if (ret)
790 return -EFAULT;
791 f.cmap.red = red; f.cmap.green = green; f.cmap.blue = blue;
793 set_fs (KERNEL_DS);
794 ret = sys_ioctl (fd, FBIOSCURSOR, (long)&f);
795 set_fs (old_fs);
796 return ret;
799 struct fb_fix_screeninfo32 {
800 char id[16];
801 __kernel_caddr_t32 smem_start;
802 __u32 smem_len;
803 __u32 type;
804 __u32 type_aux;
805 __u32 visual;
806 __u16 xpanstep;
807 __u16 ypanstep;
808 __u16 ywrapstep;
809 __u32 line_length;
810 __kernel_caddr_t32 mmio_start;
811 __u32 mmio_len;
812 __u32 accel;
813 __u16 reserved[3];
816 struct fb_cmap32 {
817 __u32 start;
818 __u32 len;
819 __kernel_caddr_t32 red;
820 __kernel_caddr_t32 green;
821 __kernel_caddr_t32 blue;
822 __kernel_caddr_t32 transp;
825 static int fb_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
827 mm_segment_t old_fs = get_fs();
828 u32 red = 0, green = 0, blue = 0, transp = 0;
829 struct fb_fix_screeninfo fix;
830 struct fb_cmap cmap;
831 void *karg;
832 int err = 0;
834 memset(&cmap, 0, sizeof(cmap));
835 switch (cmd) {
836 case FBIOGET_FSCREENINFO:
837 karg = &fix;
838 break;
839 case FBIOGETCMAP:
840 case FBIOPUTCMAP:
841 karg = &cmap;
842 err = __get_user(cmap.start, &((struct fb_cmap32 *)arg)->start);
843 err |= __get_user(cmap.len, &((struct fb_cmap32 *)arg)->len);
844 err |= __get_user(red, &((struct fb_cmap32 *)arg)->red);
845 err |= __get_user(green, &((struct fb_cmap32 *)arg)->green);
846 err |= __get_user(blue, &((struct fb_cmap32 *)arg)->blue);
847 err |= __get_user(transp, &((struct fb_cmap32 *)arg)->transp);
848 if (err) {
849 err = -EFAULT;
850 goto out;
852 err = -ENOMEM;
853 cmap.red = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
854 if (!cmap.red)
855 goto out;
856 cmap.green = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
857 if (!cmap.green)
858 goto out;
859 cmap.blue = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
860 if (!cmap.blue)
861 goto out;
862 if (transp) {
863 cmap.transp = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
864 if (!cmap.transp)
865 goto out;
868 if (cmd == FBIOGETCMAP)
869 break;
871 err = __copy_from_user(cmap.red, (char *)A(red), cmap.len * sizeof(__u16));
872 err |= __copy_from_user(cmap.green, (char *)A(green), cmap.len * sizeof(__u16));
873 err |= __copy_from_user(cmap.blue, (char *)A(blue), cmap.len * sizeof(__u16));
874 if (cmap.transp) err |= __copy_from_user(cmap.transp, (char *)A(transp), cmap.len * sizeof(__u16));
875 if (err) {
876 err = -EFAULT;
877 goto out;
879 break;
880 default:
881 do {
882 static int count = 0;
883 if (++count <= 20)
884 printk("%s: Unknown fb ioctl cmd fd(%d) "
885 "cmd(%08x) arg(%08lx)\n",
886 __FUNCTION__, fd, cmd, arg);
887 } while(0);
888 return -ENOSYS;
890 set_fs(KERNEL_DS);
891 err = sys_ioctl(fd, cmd, (unsigned long)karg);
892 set_fs(old_fs);
893 if (err)
894 goto out;
895 switch (cmd) {
896 case FBIOGET_FSCREENINFO:
897 err = __copy_to_user((char *)((struct fb_fix_screeninfo32 *)arg)->id, (char *)fix.id, sizeof(fix.id));
898 err |= __put_user((__u32)(unsigned long)fix.smem_start, &((struct fb_fix_screeninfo32 *)arg)->smem_start);
899 err |= __put_user(fix.smem_len, &((struct fb_fix_screeninfo32 *)arg)->smem_len);
900 err |= __put_user(fix.type, &((struct fb_fix_screeninfo32 *)arg)->type);
901 err |= __put_user(fix.type_aux, &((struct fb_fix_screeninfo32 *)arg)->type_aux);
902 err |= __put_user(fix.visual, &((struct fb_fix_screeninfo32 *)arg)->visual);
903 err |= __put_user(fix.xpanstep, &((struct fb_fix_screeninfo32 *)arg)->xpanstep);
904 err |= __put_user(fix.ypanstep, &((struct fb_fix_screeninfo32 *)arg)->ypanstep);
905 err |= __put_user(fix.ywrapstep, &((struct fb_fix_screeninfo32 *)arg)->ywrapstep);
906 err |= __put_user(fix.line_length, &((struct fb_fix_screeninfo32 *)arg)->line_length);
907 err |= __put_user((__u32)(unsigned long)fix.mmio_start, &((struct fb_fix_screeninfo32 *)arg)->mmio_start);
908 err |= __put_user(fix.mmio_len, &((struct fb_fix_screeninfo32 *)arg)->mmio_len);
909 err |= __put_user(fix.accel, &((struct fb_fix_screeninfo32 *)arg)->accel);
910 err |= __copy_to_user((char *)((struct fb_fix_screeninfo32 *)arg)->reserved, (char *)fix.reserved, sizeof(fix.reserved));
911 break;
912 case FBIOGETCMAP:
913 err = __copy_to_user((char *)A(red), cmap.red, cmap.len * sizeof(__u16));
914 err |= __copy_to_user((char *)A(green), cmap.blue, cmap.len * sizeof(__u16));
915 err |= __copy_to_user((char *)A(blue), cmap.blue, cmap.len * sizeof(__u16));
916 if (cmap.transp)
917 err |= __copy_to_user((char *)A(transp), cmap.transp, cmap.len * sizeof(__u16));
918 break;
919 case FBIOPUTCMAP:
920 break;
922 if (err)
923 err = -EFAULT;
925 out: if (cmap.red) kfree(cmap.red);
926 if (cmap.green) kfree(cmap.green);
927 if (cmap.blue) kfree(cmap.blue);
928 if (cmap.transp) kfree(cmap.transp);
929 return err;
932 static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
934 mm_segment_t old_fs = get_fs();
935 unsigned long kval;
936 unsigned int *uvp;
937 int error;
939 set_fs(KERNEL_DS);
940 error = sys_ioctl(fd, cmd, (long)&kval);
941 set_fs(old_fs);
943 if(error == 0) {
944 uvp = (unsigned int *)arg;
945 if(put_user(kval, uvp))
946 error = -EFAULT;
948 return error;
951 struct floppy_struct32 {
952 unsigned int size;
953 unsigned int sect;
954 unsigned int head;
955 unsigned int track;
956 unsigned int stretch;
957 unsigned char gap;
958 unsigned char rate;
959 unsigned char spec1;
960 unsigned char fmt_gap;
961 const __kernel_caddr_t32 name;
964 struct floppy_drive_params32 {
965 char cmos;
966 u32 max_dtr;
967 u32 hlt;
968 u32 hut;
969 u32 srt;
970 u32 spinup;
971 u32 spindown;
972 unsigned char spindown_offset;
973 unsigned char select_delay;
974 unsigned char rps;
975 unsigned char tracks;
976 u32 timeout;
977 unsigned char interleave_sect;
978 struct floppy_max_errors max_errors;
979 char flags;
980 char read_track;
981 short autodetect[8];
982 int checkfreq;
983 int native_format;
986 struct floppy_drive_struct32 {
987 signed char flags;
988 u32 spinup_date;
989 u32 select_date;
990 u32 first_read_date;
991 short probed_format;
992 short track;
993 short maxblock;
994 short maxtrack;
995 int generation;
996 int keep_data;
997 int fd_ref;
998 int fd_device;
999 int last_checked;
1000 __kernel_caddr_t32 dmabuf;
1001 int bufblocks;
1004 struct floppy_fdc_state32 {
1005 int spec1;
1006 int spec2;
1007 int dtr;
1008 unsigned char version;
1009 unsigned char dor;
1010 u32 address;
1011 unsigned int rawcmd:2;
1012 unsigned int reset:1;
1013 unsigned int need_configure:1;
1014 unsigned int perp_mode:2;
1015 unsigned int has_fifo:1;
1016 unsigned int driver_version;
1017 unsigned char track[4];
1020 struct floppy_write_errors32 {
1021 unsigned int write_errors;
1022 u32 first_error_sector;
1023 int first_error_generation;
1024 u32 last_error_sector;
1025 int last_error_generation;
1026 unsigned int badness;
1029 #define FDSETPRM32 _IOW(2, 0x42, struct floppy_struct32)
1030 #define FDDEFPRM32 _IOW(2, 0x43, struct floppy_struct32)
1031 #define FDGETPRM32 _IOR(2, 0x04, struct floppy_struct32)
1032 #define FDSETDRVPRM32 _IOW(2, 0x90, struct floppy_drive_params32)
1033 #define FDGETDRVPRM32 _IOR(2, 0x11, struct floppy_drive_params32)
1034 #define FDGETDRVSTAT32 _IOR(2, 0x12, struct floppy_drive_struct32)
1035 #define FDPOLLDRVSTAT32 _IOR(2, 0x13, struct floppy_drive_struct32)
1036 #define FDGETFDCSTAT32 _IOR(2, 0x15, struct floppy_fdc_state32)
1037 #define FDWERRORGET32 _IOR(2, 0x17, struct floppy_write_errors32)
1039 static struct {
1040 unsigned int cmd32;
1041 unsigned int cmd;
1042 } fd_ioctl_trans_table[] = {
1043 { FDSETPRM32, FDSETPRM },
1044 { FDDEFPRM32, FDDEFPRM },
1045 { FDGETPRM32, FDGETPRM },
1046 { FDSETDRVPRM32, FDSETDRVPRM },
1047 { FDGETDRVPRM32, FDGETDRVPRM },
1048 { FDGETDRVSTAT32, FDGETDRVSTAT },
1049 { FDPOLLDRVSTAT32, FDPOLLDRVSTAT },
1050 { FDGETFDCSTAT32, FDGETFDCSTAT },
1051 { FDWERRORGET32, FDWERRORGET }
1054 #define NR_FD_IOCTL_TRANS (sizeof(fd_ioctl_trans_table)/sizeof(fd_ioctl_trans_table[0]))
1056 static int fd_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1058 mm_segment_t old_fs = get_fs();
1059 void *karg = NULL;
1060 unsigned int kcmd = 0;
1061 int i, err;
1063 for (i = 0; i < NR_FD_IOCTL_TRANS; i++)
1064 if (cmd == fd_ioctl_trans_table[i].cmd32) {
1065 kcmd = fd_ioctl_trans_table[i].cmd;
1066 break;
1068 if (!kcmd)
1069 return -EINVAL;
1071 switch (cmd) {
1072 case FDSETPRM32:
1073 case FDDEFPRM32:
1074 case FDGETPRM32:
1076 struct floppy_struct *f;
1078 f = karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_struct));
1079 if (!karg)
1080 return -ENOMEM;
1081 if (cmd == FDGETPRM32)
1082 break;
1083 err = __get_user(f->size, &((struct floppy_struct32 *)arg)->size);
1084 err |= __get_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
1085 err |= __get_user(f->head, &((struct floppy_struct32 *)arg)->head);
1086 err |= __get_user(f->track, &((struct floppy_struct32 *)arg)->track);
1087 err |= __get_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
1088 err |= __get_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
1089 err |= __get_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
1090 err |= __get_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
1091 err |= __get_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
1092 err |= __get_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
1093 if (err) {
1094 err = -EFAULT;
1095 goto out;
1097 break;
1099 case FDSETDRVPRM32:
1100 case FDGETDRVPRM32:
1102 struct floppy_drive_params *f;
1104 f = karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_drive_params));
1105 if (!karg)
1106 return -ENOMEM;
1107 if (cmd == FDGETDRVPRM32)
1108 break;
1109 err = __get_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
1110 err |= __get_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
1111 err |= __get_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
1112 err |= __get_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
1113 err |= __get_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
1114 err |= __get_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
1115 err |= __get_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
1116 err |= __get_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
1117 err |= __get_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
1118 err |= __get_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
1119 err |= __get_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
1120 err |= __get_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
1121 err |= __get_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
1122 err |= __copy_from_user(&f->max_errors, &((struct floppy_drive_params32 *)arg)->max_errors, sizeof(f->max_errors));
1123 err |= __get_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
1124 err |= __get_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
1125 err |= __copy_from_user(f->autodetect, ((struct floppy_drive_params32 *)arg)->autodetect, sizeof(f->autodetect));
1126 err |= __get_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
1127 err |= __get_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
1128 if (err) {
1129 err = -EFAULT;
1130 goto out;
1132 break;
1134 case FDGETDRVSTAT32:
1135 case FDPOLLDRVSTAT32:
1136 karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_drive_struct));
1137 if (!karg)
1138 return -ENOMEM;
1139 break;
1140 case FDGETFDCSTAT32:
1141 karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_fdc_state));
1142 if (!karg)
1143 return -ENOMEM;
1144 break;
1145 case FDWERRORGET32:
1146 karg = kmalloc(GFP_KERNEL, sizeof(struct floppy_write_errors));
1147 if (!karg)
1148 return -ENOMEM;
1149 break;
1150 default:
1151 return -EINVAL;
1153 set_fs (KERNEL_DS);
1154 err = sys_ioctl (fd, kcmd, (unsigned long)karg);
1155 set_fs (old_fs);
1156 if (err)
1157 goto out;
1158 switch (cmd) {
1159 case FDGETPRM32:
1161 struct floppy_struct *f = karg;
1163 err = __put_user(f->size, &((struct floppy_struct32 *)arg)->size);
1164 err |= __put_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
1165 err |= __put_user(f->head, &((struct floppy_struct32 *)arg)->head);
1166 err |= __put_user(f->track, &((struct floppy_struct32 *)arg)->track);
1167 err |= __put_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
1168 err |= __put_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
1169 err |= __put_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
1170 err |= __put_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
1171 err |= __put_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
1172 err |= __put_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
1173 break;
1175 case FDGETDRVPRM32:
1177 struct floppy_drive_params *f = karg;
1179 err = __put_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
1180 err |= __put_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
1181 err |= __put_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
1182 err |= __put_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
1183 err |= __put_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
1184 err |= __put_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
1185 err |= __put_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
1186 err |= __put_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
1187 err |= __put_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
1188 err |= __put_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
1189 err |= __put_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
1190 err |= __put_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
1191 err |= __put_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
1192 err |= __copy_to_user(&((struct floppy_drive_params32 *)arg)->max_errors, &f->max_errors, sizeof(f->max_errors));
1193 err |= __put_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
1194 err |= __put_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
1195 err |= __copy_to_user(((struct floppy_drive_params32 *)arg)->autodetect, f->autodetect, sizeof(f->autodetect));
1196 err |= __put_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
1197 err |= __put_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
1198 break;
1200 case FDGETDRVSTAT32:
1201 case FDPOLLDRVSTAT32:
1203 struct floppy_drive_struct *f = karg;
1205 err = __put_user(f->flags, &((struct floppy_drive_struct32 *)arg)->flags);
1206 err |= __put_user(f->spinup_date, &((struct floppy_drive_struct32 *)arg)->spinup_date);
1207 err |= __put_user(f->select_date, &((struct floppy_drive_struct32 *)arg)->select_date);
1208 err |= __put_user(f->first_read_date, &((struct floppy_drive_struct32 *)arg)->first_read_date);
1209 err |= __put_user(f->probed_format, &((struct floppy_drive_struct32 *)arg)->probed_format);
1210 err |= __put_user(f->track, &((struct floppy_drive_struct32 *)arg)->track);
1211 err |= __put_user(f->maxblock, &((struct floppy_drive_struct32 *)arg)->maxblock);
1212 err |= __put_user(f->maxtrack, &((struct floppy_drive_struct32 *)arg)->maxtrack);
1213 err |= __put_user(f->generation, &((struct floppy_drive_struct32 *)arg)->generation);
1214 err |= __put_user(f->keep_data, &((struct floppy_drive_struct32 *)arg)->keep_data);
1215 err |= __put_user(f->fd_ref, &((struct floppy_drive_struct32 *)arg)->fd_ref);
1216 err |= __put_user(f->fd_device, &((struct floppy_drive_struct32 *)arg)->fd_device);
1217 err |= __put_user(f->last_checked, &((struct floppy_drive_struct32 *)arg)->last_checked);
1218 err |= __put_user((u64)f->dmabuf, &((struct floppy_drive_struct32 *)arg)->dmabuf);
1219 err |= __put_user((u64)f->bufblocks, &((struct floppy_drive_struct32 *)arg)->bufblocks);
1220 break;
1222 case FDGETFDCSTAT32:
1224 struct floppy_fdc_state *f = karg;
1226 err = __put_user(f->spec1, &((struct floppy_fdc_state32 *)arg)->spec1);
1227 err |= __put_user(f->spec2, &((struct floppy_fdc_state32 *)arg)->spec2);
1228 err |= __put_user(f->dtr, &((struct floppy_fdc_state32 *)arg)->dtr);
1229 err |= __put_user(f->version, &((struct floppy_fdc_state32 *)arg)->version);
1230 err |= __put_user(f->dor, &((struct floppy_fdc_state32 *)arg)->dor);
1231 err |= __put_user(f->address, &((struct floppy_fdc_state32 *)arg)->address);
1232 err |= __copy_to_user((char *)&((struct floppy_fdc_state32 *)arg)->address
1233 + sizeof(((struct floppy_fdc_state32 *)arg)->address),
1234 (char *)&f->address + sizeof(f->address), sizeof(int));
1235 err |= __put_user(f->driver_version, &((struct floppy_fdc_state32 *)arg)->driver_version);
1236 err |= __copy_to_user(((struct floppy_fdc_state32 *)arg)->track, f->track, sizeof(f->track));
1237 break;
1239 case FDWERRORGET32:
1241 struct floppy_write_errors *f = karg;
1243 err = __put_user(f->write_errors, &((struct floppy_write_errors32 *)arg)->write_errors);
1244 err |= __put_user(f->first_error_sector, &((struct floppy_write_errors32 *)arg)->first_error_sector);
1245 err |= __put_user(f->first_error_generation, &((struct floppy_write_errors32 *)arg)->first_error_generation);
1246 err |= __put_user(f->last_error_sector, &((struct floppy_write_errors32 *)arg)->last_error_sector);
1247 err |= __put_user(f->last_error_generation, &((struct floppy_write_errors32 *)arg)->last_error_generation);
1248 err |= __put_user(f->badness, &((struct floppy_write_errors32 *)arg)->badness);
1249 break;
1251 default:
1252 break;
1254 if (err)
1255 err = -EFAULT;
1257 out: if (karg) kfree(karg);
1258 return err;
1261 struct ppp_option_data32 {
1262 __kernel_caddr_t32 ptr;
1263 __u32 length;
1264 int transmit;
1266 #define PPPIOCSCOMPRESS32 _IOW('t', 77, struct ppp_option_data32)
1268 struct ppp_idle32 {
1269 __kernel_time_t32 xmit_idle;
1270 __kernel_time_t32 recv_idle;
1272 #define PPPIOCGIDLE32 _IOR('t', 63, struct ppp_idle32)
1274 static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1276 mm_segment_t old_fs = get_fs();
1277 struct ppp_option_data32 data32;
1278 struct ppp_option_data data;
1279 struct ppp_idle32 idle32;
1280 struct ppp_idle idle;
1281 unsigned int kcmd;
1282 void *karg;
1283 int err = 0;
1285 switch (cmd) {
1286 case PPPIOCGIDLE32:
1287 kcmd = PPPIOCGIDLE;
1288 karg = &idle;
1289 break;
1290 case PPPIOCSCOMPRESS32:
1291 if (copy_from_user(&data32, (struct ppp_option_data32 *)arg, sizeof(struct ppp_option_data32)))
1292 return -EFAULT;
1293 data.ptr = kmalloc (data32.length, GFP_KERNEL);
1294 if (!data.ptr)
1295 return -ENOMEM;
1296 if (copy_from_user(data.ptr, (__u8 *)A(data32.ptr), data32.length)) {
1297 kfree(data.ptr);
1298 return -EFAULT;
1300 data.length = data32.length;
1301 data.transmit = data32.transmit;
1302 kcmd = PPPIOCSCOMPRESS;
1303 karg = &data;
1304 break;
1305 default:
1306 do {
1307 static int count = 0;
1308 if (++count <= 20)
1309 printk("ppp_ioctl: Unknown cmd fd(%d) "
1310 "cmd(%08x) arg(%08x)\n",
1311 (int)fd, (unsigned int)cmd, (unsigned int)arg);
1312 } while(0);
1313 return -EINVAL;
1315 set_fs (KERNEL_DS);
1316 err = sys_ioctl (fd, kcmd, (unsigned long)karg);
1317 set_fs (old_fs);
1318 switch (cmd) {
1319 case PPPIOCGIDLE32:
1320 if (err)
1321 return err;
1322 idle32.xmit_idle = idle.xmit_idle;
1323 idle32.recv_idle = idle.recv_idle;
1324 if (copy_to_user((struct ppp_idle32 *)arg, &idle32, sizeof(struct ppp_idle32)))
1325 return -EFAULT;
1326 break;
1327 case PPPIOCSCOMPRESS32:
1328 kfree(data.ptr);
1329 break;
1330 default:
1331 break;
1333 return err;
1337 struct mtget32 {
1338 __u32 mt_type;
1339 __u32 mt_resid;
1340 __u32 mt_dsreg;
1341 __u32 mt_gstat;
1342 __u32 mt_erreg;
1343 __kernel_daddr_t32 mt_fileno;
1344 __kernel_daddr_t32 mt_blkno;
1346 #define MTIOCGET32 _IOR('m', 2, struct mtget32)
1348 struct mtpos32 {
1349 __u32 mt_blkno;
1351 #define MTIOCPOS32 _IOR('m', 3, struct mtpos32)
1353 struct mtconfiginfo32 {
1354 __u32 mt_type;
1355 __u32 ifc_type;
1356 __u16 irqnr;
1357 __u16 dmanr;
1358 __u16 port;
1359 __u32 debug;
1360 __u32 have_dens:1;
1361 __u32 have_bsf:1;
1362 __u32 have_fsr:1;
1363 __u32 have_bsr:1;
1364 __u32 have_eod:1;
1365 __u32 have_seek:1;
1366 __u32 have_tell:1;
1367 __u32 have_ras1:1;
1368 __u32 have_ras2:1;
1369 __u32 have_ras3:1;
1370 __u32 have_qfa:1;
1371 __u32 pad1:5;
1372 char reserved[10];
1374 #define MTIOCGETCONFIG32 _IOR('m', 4, struct mtconfiginfo32)
1375 #define MTIOCSETCONFIG32 _IOW('m', 5, struct mtconfiginfo32)
1377 static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1379 mm_segment_t old_fs = get_fs();
1380 struct mtconfiginfo info;
1381 struct mtget get;
1382 struct mtpos pos;
1383 unsigned long kcmd;
1384 void *karg;
1385 int err = 0;
1387 switch(cmd) {
1388 case MTIOCPOS32:
1389 kcmd = MTIOCPOS;
1390 karg = &pos;
1391 break;
1392 case MTIOCGET32:
1393 kcmd = MTIOCGET;
1394 karg = &get;
1395 break;
1396 case MTIOCGETCONFIG32:
1397 kcmd = MTIOCGETCONFIG;
1398 karg = &info;
1399 break;
1400 case MTIOCSETCONFIG32:
1401 kcmd = MTIOCSETCONFIG;
1402 karg = &info;
1403 err = __get_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
1404 err |= __get_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
1405 err |= __get_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
1406 err |= __get_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
1407 err |= __get_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
1408 err |= __get_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
1409 err |= __copy_from_user((char *)&info.debug + sizeof(info.debug),
1410 (char *)&((struct mtconfiginfo32 *)arg)->debug
1411 + sizeof(((struct mtconfiginfo32 *)arg)->debug), sizeof(__u32));
1412 if (err)
1413 return -EFAULT;
1414 break;
1415 default:
1416 do {
1417 static int count = 0;
1418 if (++count <= 20)
1419 printk("mt_ioctl: Unknown cmd fd(%d) "
1420 "cmd(%08x) arg(%08x)\n",
1421 (int)fd, (unsigned int)cmd, (unsigned int)arg);
1422 } while(0);
1423 return -EINVAL;
1425 set_fs (KERNEL_DS);
1426 err = sys_ioctl (fd, kcmd, (unsigned long)karg);
1427 set_fs (old_fs);
1428 if (err)
1429 return err;
1430 switch (cmd) {
1431 case MTIOCPOS32:
1432 err = __put_user(pos.mt_blkno, &((struct mtpos32 *)arg)->mt_blkno);
1433 break;
1434 case MTIOCGET32:
1435 err = __put_user(get.mt_type, &((struct mtget32 *)arg)->mt_type);
1436 err |= __put_user(get.mt_resid, &((struct mtget32 *)arg)->mt_resid);
1437 err |= __put_user(get.mt_dsreg, &((struct mtget32 *)arg)->mt_dsreg);
1438 err |= __put_user(get.mt_gstat, &((struct mtget32 *)arg)->mt_gstat);
1439 err |= __put_user(get.mt_erreg, &((struct mtget32 *)arg)->mt_erreg);
1440 err |= __put_user(get.mt_fileno, &((struct mtget32 *)arg)->mt_fileno);
1441 err |= __put_user(get.mt_blkno, &((struct mtget32 *)arg)->mt_blkno);
1442 break;
1443 case MTIOCGETCONFIG32:
1444 err = __put_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
1445 err |= __put_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
1446 err |= __put_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
1447 err |= __put_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
1448 err |= __put_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
1449 err |= __put_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
1450 err |= __copy_to_user((char *)&((struct mtconfiginfo32 *)arg)->debug
1451 + sizeof(((struct mtconfiginfo32 *)arg)->debug),
1452 (char *)&info.debug + sizeof(info.debug), sizeof(__u32));
1453 break;
1454 case MTIOCSETCONFIG32:
1455 break;
1457 return err ? -EFAULT: 0;
1460 struct cdrom_read32 {
1461 int cdread_lba;
1462 __kernel_caddr_t32 cdread_bufaddr;
1463 int cdread_buflen;
1466 struct cdrom_read_audio32 {
1467 union cdrom_addr addr;
1468 u_char addr_format;
1469 int nframes;
1470 __kernel_caddr_t32 buf;
1473 struct cdrom_generic_command32 {
1474 unsigned char cmd[CDROM_PACKET_SIZE];
1475 __kernel_caddr_t32 buffer;
1476 unsigned int buflen;
1477 int stat;
1478 __kernel_caddr_t32 sense;
1479 __kernel_caddr_t32 reserved[3];
1482 static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1484 mm_segment_t old_fs = get_fs();
1485 struct cdrom_read cdread;
1486 struct cdrom_read_audio cdreadaudio;
1487 struct cdrom_generic_command cgc;
1488 __kernel_caddr_t32 addr;
1489 char *data = 0;
1490 void *karg;
1491 int err = 0;
1493 switch(cmd) {
1494 case CDROMREADMODE2:
1495 case CDROMREADMODE1:
1496 case CDROMREADRAW:
1497 case CDROMREADCOOKED:
1498 karg = &cdread;
1499 err = __get_user(cdread.cdread_lba, &((struct cdrom_read32 *)arg)->cdread_lba);
1500 err |= __get_user(addr, &((struct cdrom_read32 *)arg)->cdread_bufaddr);
1501 err |= __get_user(cdread.cdread_buflen, &((struct cdrom_read32 *)arg)->cdread_buflen);
1502 if (err)
1503 return -EFAULT;
1504 data = kmalloc(cdread.cdread_buflen, GFP_KERNEL);
1505 if (!data)
1506 return -ENOMEM;
1507 cdread.cdread_bufaddr = data;
1508 break;
1509 case CDROMREADAUDIO:
1510 karg = &cdreadaudio;
1511 err = copy_from_user(&cdreadaudio.addr, &((struct cdrom_read_audio32 *)arg)->addr, sizeof(cdreadaudio.addr));
1512 err |= __get_user(cdreadaudio.addr_format, &((struct cdrom_read_audio32 *)arg)->addr_format);
1513 err |= __get_user(cdreadaudio.nframes, &((struct cdrom_read_audio32 *)arg)->nframes);
1514 err |= __get_user(addr, &((struct cdrom_read_audio32 *)arg)->buf);
1515 if (err)
1516 return -EFAULT;
1517 data = kmalloc(cdreadaudio.nframes * 2352, GFP_KERNEL);
1518 if (!data)
1519 return -ENOMEM;
1520 cdreadaudio.buf = data;
1521 break;
1522 case CDROM_SEND_PACKET:
1523 karg = &cgc;
1524 err = copy_from_user(cgc.cmd, &((struct cdrom_generic_command32 *)arg)->cmd, sizeof(cgc.cmd));
1525 err |= __get_user(addr, &((struct cdrom_generic_command32 *)arg)->buffer);
1526 err |= __get_user(cgc.buflen, &((struct cdrom_generic_command32 *)arg)->buflen);
1527 if (err)
1528 return -EFAULT;
1529 if ((data = kmalloc(cgc.buflen, GFP_KERNEL)) == NULL)
1530 return -ENOMEM;
1531 cgc.buffer = data;
1532 break;
1533 default:
1534 do {
1535 static int count = 0;
1536 if (++count <= 20)
1537 printk("cdrom_ioctl: Unknown cmd fd(%d) "
1538 "cmd(%08x) arg(%08x)\n",
1539 (int)fd, (unsigned int)cmd, (unsigned int)arg);
1540 } while(0);
1541 return -EINVAL;
1543 set_fs (KERNEL_DS);
1544 err = sys_ioctl (fd, cmd, (unsigned long)karg);
1545 set_fs (old_fs);
1546 if (err)
1547 goto out;
1548 switch (cmd) {
1549 case CDROMREADMODE2:
1550 case CDROMREADMODE1:
1551 case CDROMREADRAW:
1552 case CDROMREADCOOKED:
1553 err = copy_to_user((char *)A(addr), data, cdread.cdread_buflen);
1554 break;
1555 case CDROMREADAUDIO:
1556 err = copy_to_user((char *)A(addr), data, cdreadaudio.nframes * 2352);
1557 break;
1558 case CDROM_SEND_PACKET:
1559 err = copy_to_user((char *)A(addr), data, cgc.buflen);
1560 break;
1561 default:
1562 break;
1564 out: if (data)
1565 kfree(data);
1566 return err ? -EFAULT : 0;
1569 struct loop_info32 {
1570 int lo_number; /* ioctl r/o */
1571 __kernel_dev_t32 lo_device; /* ioctl r/o */
1572 unsigned int lo_inode; /* ioctl r/o */
1573 __kernel_dev_t32 lo_rdevice; /* ioctl r/o */
1574 int lo_offset;
1575 int lo_encrypt_type;
1576 int lo_encrypt_key_size; /* ioctl w/o */
1577 int lo_flags; /* ioctl r/o */
1578 char lo_name[LO_NAME_SIZE];
1579 unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
1580 unsigned int lo_init[2];
1581 char reserved[4];
1584 static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg)
1586 mm_segment_t old_fs = get_fs();
1587 struct loop_info l;
1588 int err = 0;
1590 switch(cmd) {
1591 case LOOP_SET_STATUS:
1592 err = get_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
1593 err |= __get_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
1594 err |= __get_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
1595 err |= __get_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
1596 err |= __copy_from_user((char *)&l.lo_offset, (char *)&((struct loop_info32 *)arg)->lo_offset,
1597 8 + (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
1598 if (err)
1599 return -EFAULT;
1600 set_fs (KERNEL_DS);
1601 err = sys_ioctl (fd, cmd, (unsigned long)&l);
1602 set_fs (old_fs);
1603 break;
1604 case LOOP_GET_STATUS:
1605 set_fs (KERNEL_DS);
1606 err = sys_ioctl (fd, cmd, (unsigned long)&l);
1607 set_fs (old_fs);
1608 if (!err) {
1609 err = put_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
1610 err |= __put_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
1611 err |= __put_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
1612 err |= __put_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
1613 err |= __copy_to_user((char *)&((struct loop_info32 *)arg)->lo_offset,
1614 (char *)&l.lo_offset, (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
1616 break;
1618 return err ? -EFAULT : 0;
1621 extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
1623 static int vt_check(struct file *file)
1625 struct tty_struct *tty;
1626 struct inode *inode = file->f_dentry->d_inode;
1628 if (file->f_op->ioctl != tty_ioctl)
1629 return -EINVAL;
1631 tty = (struct tty_struct *)file->private_data;
1632 if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
1633 return -EINVAL;
1635 if (tty->driver.ioctl != vt_ioctl)
1636 return -EINVAL;
1639 * To have permissions to do most of the vt ioctls, we either have
1640 * to be the owner of the tty, or super-user.
1642 if (current->tty == tty || suser())
1643 return 1;
1644 return 0;
1647 struct consolefontdesc32 {
1648 unsigned short charcount; /* characters in font (256 or 512) */
1649 unsigned short charheight; /* scan lines per character (1-32) */
1650 u32 chardata; /* font data in expanded form */
1653 static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file)
1655 struct consolefontdesc cfdarg;
1656 struct console_font_op op;
1657 int i, perm;
1659 perm = vt_check(file);
1660 if (perm < 0) return perm;
1662 if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc32)))
1663 return -EFAULT;
1665 cfdarg.chardata = (unsigned char *)A(((struct consolefontdesc32 *)&cfdarg)->chardata);
1667 switch (cmd) {
1668 case PIO_FONTX:
1669 if (!perm)
1670 return -EPERM;
1671 op.op = KD_FONT_OP_SET;
1672 op.flags = 0;
1673 op.width = 8;
1674 op.height = cfdarg.charheight;
1675 op.charcount = cfdarg.charcount;
1676 op.data = cfdarg.chardata;
1677 return con_font_op(fg_console, &op);
1678 case GIO_FONTX:
1679 if (!cfdarg.chardata)
1680 return 0;
1681 op.op = KD_FONT_OP_GET;
1682 op.flags = 0;
1683 op.width = 8;
1684 op.height = cfdarg.charheight;
1685 op.charcount = cfdarg.charcount;
1686 op.data = cfdarg.chardata;
1687 i = con_font_op(fg_console, &op);
1688 if (i)
1689 return i;
1690 cfdarg.charheight = op.height;
1691 cfdarg.charcount = op.charcount;
1692 ((struct consolefontdesc32 *)&cfdarg)->chardata = (unsigned long)cfdarg.chardata;
1693 if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc32)))
1694 return -EFAULT;
1695 return 0;
1697 return -EINVAL;
1700 struct console_font_op32 {
1701 unsigned int op; /* operation code KD_FONT_OP_* */
1702 unsigned int flags; /* KD_FONT_FLAG_* */
1703 unsigned int width, height; /* font size */
1704 unsigned int charcount;
1705 u32 data; /* font data with height fixed to 32 */
1708 static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file)
1710 struct console_font_op op;
1711 int perm = vt_check(file), i;
1712 struct vt_struct *vt;
1714 if (perm < 0) return perm;
1716 if (copy_from_user(&op, (void *) fontop, sizeof(struct console_font_op32)))
1717 return -EFAULT;
1718 if (!perm && op.op != KD_FONT_OP_GET)
1719 return -EPERM;
1720 op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data);
1721 op.flags |= KD_FONT_FLAG_OLD;
1722 vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
1723 i = con_font_op(vt->vc_num, &op);
1724 if (i) return i;
1725 ((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
1726 if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32)))
1727 return -EFAULT;
1728 return 0;
1731 struct unimapdesc32 {
1732 unsigned short entry_ct;
1733 u32 entries;
1736 static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file)
1738 struct unimapdesc32 tmp;
1739 int perm = vt_check(file);
1741 if (perm < 0) return perm;
1742 if (copy_from_user(&tmp, user_ud, sizeof tmp))
1743 return -EFAULT;
1744 switch (cmd) {
1745 case PIO_UNIMAP:
1746 if (!perm) return -EPERM;
1747 return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries));
1748 case GIO_UNIMAP:
1749 return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries));
1751 return 0;
1754 static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg)
1756 mm_segment_t old_fs = get_fs();
1757 __kernel_uid_t kuid;
1758 int err;
1760 cmd = SMB_IOC_GETMOUNTUID;
1762 set_fs(KERNEL_DS);
1763 err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
1764 set_fs(old_fs);
1766 if (err >= 0)
1767 err = put_user(kuid, (__kernel_uid_t32 *)arg);
1769 return err;
1772 struct atmif_sioc32 {
1773 int number;
1774 int length;
1775 __kernel_caddr_t32 arg;
1778 struct atm_iobuf32 {
1779 int length;
1780 __kernel_caddr_t32 buffer;
1783 #define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32)
1784 #define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF+3, struct atm_iobuf32)
1785 #define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF+4, struct atmif_sioc32)
1786 #define ATM_GETESI32 _IOW('a', ATMIOC_ITF+5, struct atmif_sioc32)
1787 #define ATM_GETADDR32 _IOW('a', ATMIOC_ITF+6, struct atmif_sioc32)
1788 #define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF+7, struct atmif_sioc32)
1789 #define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF+8, struct atmif_sioc32)
1790 #define ATM_DELADDR32 _IOW('a', ATMIOC_ITF+9, struct atmif_sioc32)
1791 #define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF+10, struct atmif_sioc32)
1792 #define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF+11, struct atmif_sioc32)
1793 #define ATM_SETESI32 _IOW('a', ATMIOC_ITF+12, struct atmif_sioc32)
1794 #define ATM_SETESIF32 _IOW('a', ATMIOC_ITF+13, struct atmif_sioc32)
1795 #define ATM_GETSTAT32 _IOW('a', ATMIOC_SARCOM+0, struct atmif_sioc32)
1796 #define ATM_GETSTATZ32 _IOW('a', ATMIOC_SARCOM+1, struct atmif_sioc32)
1798 static struct {
1799 unsigned int cmd32;
1800 unsigned int cmd;
1801 } atm_ioctl_map[] = {
1802 { ATM_GETLINKRATE32, ATM_GETLINKRATE },
1803 { ATM_GETNAMES32, ATM_GETNAMES },
1804 { ATM_GETTYPE32, ATM_GETTYPE },
1805 { ATM_GETESI32, ATM_GETESI },
1806 { ATM_GETADDR32, ATM_GETADDR },
1807 { ATM_RSTADDR32, ATM_RSTADDR },
1808 { ATM_ADDADDR32, ATM_ADDADDR },
1809 { ATM_DELADDR32, ATM_DELADDR },
1810 { ATM_GETCIRANGE32, ATM_GETCIRANGE },
1811 { ATM_SETCIRANGE32, ATM_SETCIRANGE },
1812 { ATM_SETESI32, ATM_SETESI },
1813 { ATM_SETESIF32, ATM_SETESIF },
1814 { ATM_GETSTAT32, ATM_GETSTAT },
1815 { ATM_GETSTATZ32, ATM_GETSTATZ }
1818 #define NR_ATM_IOCTL (sizeof(atm_ioctl_map)/sizeof(atm_ioctl_map[0]))
1821 static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg)
1823 struct atm_iobuf32 iobuf32;
1824 struct atm_iobuf iobuf = { 0, NULL };
1825 mm_segment_t old_fs;
1826 int err;
1828 err = copy_from_user(&iobuf32, (struct atm_iobuf32*)arg,
1829 sizeof(struct atm_iobuf32));
1830 if (err)
1831 return -EFAULT;
1833 iobuf.length = iobuf32.length;
1835 if (iobuf32.buffer == (__kernel_caddr_t32) NULL || iobuf32.length == 0) {
1836 iobuf.buffer = (void*)(unsigned long)iobuf32.buffer;
1837 } else {
1838 iobuf.buffer = kmalloc(iobuf.length, GFP_KERNEL);
1839 if (iobuf.buffer == NULL) {
1840 err = -ENOMEM;
1841 goto out;
1844 err = copy_from_user(iobuf.buffer, A(iobuf32.buffer), iobuf.length);
1845 if (err) {
1846 err = -EFAULT;
1847 goto out;
1851 old_fs = get_fs(); set_fs (KERNEL_DS);
1852 err = sys_ioctl (fd, cmd, (unsigned long)&iobuf);
1853 set_fs (old_fs);
1854 if(err)
1855 goto out;
1857 if(iobuf.buffer && iobuf.length > 0) {
1858 err = copy_to_user(A(iobuf32.buffer), iobuf.buffer, iobuf.length);
1859 if (err) {
1860 err = -EFAULT;
1861 goto out;
1864 err = __put_user(iobuf.length, &(((struct atm_iobuf32*)arg)->length));
1866 out:
1867 if(iobuf32.buffer && iobuf32.length > 0)
1868 kfree(iobuf.buffer);
1870 return err;
1874 static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg)
1876 struct atmif_sioc32 sioc32;
1877 struct atmif_sioc sioc = { 0, 0, NULL };
1878 mm_segment_t old_fs;
1879 int err;
1881 err = copy_from_user(&sioc32, (struct atmif_sioc32*)arg,
1882 sizeof(struct atmif_sioc32));
1883 if (err)
1884 return -EFAULT;
1886 sioc.number = sioc32.number;
1887 sioc.length = sioc32.length;
1889 if (sioc32.arg == (__kernel_caddr_t32) NULL || sioc32.length == 0) {
1890 sioc.arg = (void*)(unsigned long)sioc32.arg;
1891 } else {
1892 sioc.arg = kmalloc(sioc.length, GFP_KERNEL);
1893 if (sioc.arg == NULL) {
1894 err = -ENOMEM;
1895 goto out;
1898 err = copy_from_user(sioc.arg, A(sioc32.arg), sioc32.length);
1899 if (err) {
1900 err = -EFAULT;
1901 goto out;
1905 old_fs = get_fs(); set_fs (KERNEL_DS);
1906 err = sys_ioctl (fd, cmd, (unsigned long)&sioc);
1907 set_fs (old_fs);
1908 if(err) {
1909 goto out;
1912 if(sioc.arg && sioc.length > 0) {
1913 err = copy_to_user(A(sioc32.arg), sioc.arg, sioc.length);
1914 if (err) {
1915 err = -EFAULT;
1916 goto out;
1919 err = __put_user(sioc.length, &(((struct atmif_sioc32*)arg)->length));
1921 out:
1922 if(sioc32.arg && sioc32.length > 0)
1923 kfree(sioc.arg);
1925 return err;
1929 static int do_atm_ioctl(unsigned int fd, unsigned int cmd32, unsigned long arg)
1931 int i;
1932 unsigned int cmd = 0;
1934 switch (cmd32) {
1935 case SUNI_GETLOOP:
1936 case SUNI_SETLOOP:
1937 case SONET_GETSTAT:
1938 case SONET_GETSTATZ:
1939 case SONET_GETDIAG:
1940 case SONET_SETDIAG:
1941 case SONET_CLRDIAG:
1942 case SONET_SETFRAMING:
1943 case SONET_GETFRAMING:
1944 case SONET_GETFRSENSE:
1945 return do_atmif_sioc(fd, cmd32, arg);
1948 if (cmd == 0) {
1949 for (i = 0; i < NR_ATM_IOCTL; i++) {
1950 if (cmd32 == atm_ioctl_map[i].cmd32) {
1951 cmd = atm_ioctl_map[i].cmd;
1952 break;
1955 if (i == NR_ATM_IOCTL) {
1956 return -EINVAL;
1960 switch (cmd) {
1961 case ATM_GETNAMES:
1962 return do_atm_iobuf(fd, cmd, arg);
1964 case ATM_GETLINKRATE:
1965 case ATM_GETTYPE:
1966 case ATM_GETESI:
1967 case ATM_GETADDR:
1968 case ATM_RSTADDR:
1969 case ATM_ADDADDR:
1970 case ATM_DELADDR:
1971 case ATM_GETCIRANGE:
1972 case ATM_SETCIRANGE:
1973 case ATM_SETESI:
1974 case ATM_SETESIF:
1975 case ATM_GETSTAT:
1976 case ATM_GETSTATZ:
1977 return do_atmif_sioc(fd, cmd, arg);
1980 return -EINVAL;
1983 static int ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
1985 return -EINVAL;
1988 static int broken_blkgetsize(unsigned int fd, unsigned int cmd, unsigned long arg)
1990 /* The mkswap binary hard codes it to Intel value :-((( */
1991 return w_long(fd, BLKGETSIZE, arg);
1994 struct blkpg_ioctl_arg32 {
1995 int op;
1996 int flags;
1997 int datalen;
1998 u32 data;
2001 static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, struct blkpg_ioctl_arg32 *arg)
2003 struct blkpg_ioctl_arg a;
2004 struct blkpg_partition p;
2005 int err;
2006 mm_segment_t old_fs = get_fs();
2008 err = get_user(a.op, &arg->op);
2009 err |= __get_user(a.flags, &arg->flags);
2010 err |= __get_user(a.datalen, &arg->datalen);
2011 err |= __get_user((long)a.data, &arg->data);
2012 if (err) return err;
2013 switch (a.op) {
2014 case BLKPG_ADD_PARTITION:
2015 case BLKPG_DEL_PARTITION:
2016 if (a.datalen < sizeof(struct blkpg_partition))
2017 return -EINVAL;
2018 if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition)))
2019 return -EFAULT;
2020 a.data = &p;
2021 set_fs (KERNEL_DS);
2022 err = sys_ioctl(fd, cmd, (unsigned long)&a);
2023 set_fs (old_fs);
2024 default:
2025 return -EINVAL;
2027 return err;
2030 static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
2032 return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
2035 struct ioctl_trans {
2036 unsigned int cmd;
2037 unsigned int handler;
2038 unsigned int next;
2041 #define COMPATIBLE_IOCTL(cmd) asm volatile(".word %0, sys_ioctl, 0" : : "i" (cmd));
2042 #define HANDLE_IOCTL(cmd,handler) asm volatile(".word %0, %1, 0" : : "i" (cmd), "i" (handler));
2043 #define IOCTL_TABLE_START void ioctl32_foo(void) { asm volatile(".data\nioctl_translations:");
2044 #define IOCTL_TABLE_END asm volatile("\nioctl_translations_end:\n\t.previous"); }
2046 IOCTL_TABLE_START
2047 /* List here exlicitly which ioctl's are known to have
2048 * compatable types passed or none at all...
2050 /* Big T */
2051 COMPATIBLE_IOCTL(TCGETA)
2052 COMPATIBLE_IOCTL(TCSETA)
2053 COMPATIBLE_IOCTL(TCSETAW)
2054 COMPATIBLE_IOCTL(TCSETAF)
2055 COMPATIBLE_IOCTL(TCSBRK)
2056 COMPATIBLE_IOCTL(TCXONC)
2057 COMPATIBLE_IOCTL(TCFLSH)
2058 COMPATIBLE_IOCTL(TCGETS)
2059 COMPATIBLE_IOCTL(TCSETS)
2060 COMPATIBLE_IOCTL(TCSETSW)
2061 COMPATIBLE_IOCTL(TCSETSF)
2062 COMPATIBLE_IOCTL(TIOCLINUX)
2063 /* Little t */
2064 COMPATIBLE_IOCTL(TIOCGETD)
2065 COMPATIBLE_IOCTL(TIOCSETD)
2066 COMPATIBLE_IOCTL(TIOCEXCL)
2067 COMPATIBLE_IOCTL(TIOCNXCL)
2068 COMPATIBLE_IOCTL(TIOCCONS)
2069 COMPATIBLE_IOCTL(TIOCGSOFTCAR)
2070 COMPATIBLE_IOCTL(TIOCSSOFTCAR)
2071 COMPATIBLE_IOCTL(TIOCSWINSZ)
2072 COMPATIBLE_IOCTL(TIOCGWINSZ)
2073 COMPATIBLE_IOCTL(TIOCMGET)
2074 COMPATIBLE_IOCTL(TIOCMBIC)
2075 COMPATIBLE_IOCTL(TIOCMBIS)
2076 COMPATIBLE_IOCTL(TIOCMSET)
2077 COMPATIBLE_IOCTL(TIOCPKT)
2078 COMPATIBLE_IOCTL(TIOCNOTTY)
2079 COMPATIBLE_IOCTL(TIOCSTI)
2080 COMPATIBLE_IOCTL(TIOCOUTQ)
2081 COMPATIBLE_IOCTL(TIOCSPGRP)
2082 COMPATIBLE_IOCTL(TIOCGPGRP)
2083 COMPATIBLE_IOCTL(TIOCSCTTY)
2084 COMPATIBLE_IOCTL(TIOCGPTN)
2085 COMPATIBLE_IOCTL(TIOCSPTLCK)
2086 COMPATIBLE_IOCTL(TIOCGSERIAL)
2087 COMPATIBLE_IOCTL(TIOCSSERIAL)
2088 COMPATIBLE_IOCTL(TIOCSERGETLSR)
2089 /* Big F */
2090 COMPATIBLE_IOCTL(FBIOGTYPE)
2091 COMPATIBLE_IOCTL(FBIOSATTR)
2092 COMPATIBLE_IOCTL(FBIOGATTR)
2093 COMPATIBLE_IOCTL(FBIOSVIDEO)
2094 COMPATIBLE_IOCTL(FBIOGVIDEO)
2095 COMPATIBLE_IOCTL(FBIOGCURSOR32) /* This is not implemented yet. Later it should be converted... */
2096 COMPATIBLE_IOCTL(FBIOSCURPOS)
2097 COMPATIBLE_IOCTL(FBIOGCURPOS)
2098 COMPATIBLE_IOCTL(FBIOGCURMAX)
2099 COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
2100 COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
2101 COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
2102 COMPATIBLE_IOCTL(FBIOGET_FCURSORINFO)
2103 COMPATIBLE_IOCTL(FBIOGET_VCURSORINFO)
2104 COMPATIBLE_IOCTL(FBIOPUT_VCURSORINFO)
2105 COMPATIBLE_IOCTL(FBIOGET_CURSORSTATE)
2106 COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE)
2107 COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP)
2108 COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP)
2109 /* Little f */
2110 COMPATIBLE_IOCTL(FIOCLEX)
2111 COMPATIBLE_IOCTL(FIONCLEX)
2112 COMPATIBLE_IOCTL(FIOASYNC)
2113 COMPATIBLE_IOCTL(FIONBIO)
2114 COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */
2115 /* 0x00 */
2116 COMPATIBLE_IOCTL(FIBMAP)
2117 COMPATIBLE_IOCTL(FIGETBSZ)
2118 /* 0x03 -- HD/IDE ioctl's used by hdparm and friends.
2119 * Some need translations, these do not.
2121 COMPATIBLE_IOCTL(HDIO_GET_IDENTITY)
2122 COMPATIBLE_IOCTL(HDIO_SET_DMA)
2123 COMPATIBLE_IOCTL(HDIO_SET_KEEPSETTINGS)
2124 COMPATIBLE_IOCTL(HDIO_SET_UNMASKINTR)
2125 COMPATIBLE_IOCTL(HDIO_SET_NOWERR)
2126 COMPATIBLE_IOCTL(HDIO_SET_32BIT)
2127 COMPATIBLE_IOCTL(HDIO_SET_MULTCOUNT)
2128 COMPATIBLE_IOCTL(HDIO_DRIVE_CMD)
2129 COMPATIBLE_IOCTL(HDIO_SET_PIO_MODE)
2130 COMPATIBLE_IOCTL(HDIO_SCAN_HWIF)
2131 COMPATIBLE_IOCTL(HDIO_SET_NICE)
2132 /* 0x02 -- Floppy ioctls */
2133 COMPATIBLE_IOCTL(FDMSGON)
2134 COMPATIBLE_IOCTL(FDMSGOFF)
2135 COMPATIBLE_IOCTL(FDSETEMSGTRESH)
2136 COMPATIBLE_IOCTL(FDFLUSH)
2137 COMPATIBLE_IOCTL(FDWERRORCLR)
2138 COMPATIBLE_IOCTL(FDSETMAXERRS)
2139 COMPATIBLE_IOCTL(FDGETMAXERRS)
2140 COMPATIBLE_IOCTL(FDGETDRVTYP)
2141 COMPATIBLE_IOCTL(FDEJECT)
2142 COMPATIBLE_IOCTL(FDCLRPRM)
2143 COMPATIBLE_IOCTL(FDFMTBEG)
2144 COMPATIBLE_IOCTL(FDFMTEND)
2145 COMPATIBLE_IOCTL(FDRESET)
2146 COMPATIBLE_IOCTL(FDTWADDLE)
2147 COMPATIBLE_IOCTL(FDFMTTRK)
2148 COMPATIBLE_IOCTL(FDRAWCMD)
2149 /* 0x12 */
2150 COMPATIBLE_IOCTL(BLKROSET)
2151 COMPATIBLE_IOCTL(BLKROGET)
2152 COMPATIBLE_IOCTL(BLKRRPART)
2153 COMPATIBLE_IOCTL(BLKFLSBUF)
2154 COMPATIBLE_IOCTL(BLKRASET)
2155 COMPATIBLE_IOCTL(BLKFRASET)
2156 COMPATIBLE_IOCTL(BLKSECTSET)
2157 COMPATIBLE_IOCTL(BLKSSZGET)
2160 #if 0 /* New RAID code is being merged, fix up to handle
2161 * new RAID ioctls when fully merged in 2.3.x -DaveM
2163 /* 0x09 */
2164 COMPATIBLE_IOCTL(REGISTER_DEV)
2165 COMPATIBLE_IOCTL(REGISTER_DEV_NEW)
2166 COMPATIBLE_IOCTL(START_MD)
2167 COMPATIBLE_IOCTL(STOP_MD)
2168 #endif
2170 /* Big K */
2171 COMPATIBLE_IOCTL(PIO_FONT)
2172 COMPATIBLE_IOCTL(GIO_FONT)
2173 COMPATIBLE_IOCTL(KDSIGACCEPT)
2174 COMPATIBLE_IOCTL(KDGETKEYCODE)
2175 COMPATIBLE_IOCTL(KDSETKEYCODE)
2176 COMPATIBLE_IOCTL(KIOCSOUND)
2177 COMPATIBLE_IOCTL(KDMKTONE)
2178 COMPATIBLE_IOCTL(KDGKBTYPE)
2179 COMPATIBLE_IOCTL(KDSETMODE)
2180 COMPATIBLE_IOCTL(KDGETMODE)
2181 COMPATIBLE_IOCTL(KDSKBMODE)
2182 COMPATIBLE_IOCTL(KDGKBMODE)
2183 COMPATIBLE_IOCTL(KDSKBMETA)
2184 COMPATIBLE_IOCTL(KDGKBMETA)
2185 COMPATIBLE_IOCTL(KDGKBENT)
2186 COMPATIBLE_IOCTL(KDSKBENT)
2187 COMPATIBLE_IOCTL(KDGKBSENT)
2188 COMPATIBLE_IOCTL(KDSKBSENT)
2189 COMPATIBLE_IOCTL(KDGKBDIACR)
2190 COMPATIBLE_IOCTL(KDSKBDIACR)
2191 COMPATIBLE_IOCTL(KDGKBLED)
2192 COMPATIBLE_IOCTL(KDSKBLED)
2193 COMPATIBLE_IOCTL(KDGETLED)
2194 COMPATIBLE_IOCTL(KDSETLED)
2195 COMPATIBLE_IOCTL(GIO_SCRNMAP)
2196 COMPATIBLE_IOCTL(PIO_SCRNMAP)
2197 COMPATIBLE_IOCTL(GIO_UNISCRNMAP)
2198 COMPATIBLE_IOCTL(PIO_UNISCRNMAP)
2199 COMPATIBLE_IOCTL(PIO_FONTRESET)
2200 COMPATIBLE_IOCTL(PIO_UNIMAPCLR)
2201 /* Little k */
2202 COMPATIBLE_IOCTL(KIOCTYPE)
2203 COMPATIBLE_IOCTL(KIOCLAYOUT)
2204 COMPATIBLE_IOCTL(KIOCGTRANS)
2205 COMPATIBLE_IOCTL(KIOCTRANS)
2206 COMPATIBLE_IOCTL(KIOCCMD)
2207 COMPATIBLE_IOCTL(KIOCSDIRECT)
2208 COMPATIBLE_IOCTL(KIOCSLED)
2209 COMPATIBLE_IOCTL(KIOCGLED)
2210 COMPATIBLE_IOCTL(KIOCSRATE)
2211 COMPATIBLE_IOCTL(KIOCGRATE)
2212 /* Big S */
2213 COMPATIBLE_IOCTL(SCSI_IOCTL_GET_IDLUN)
2214 COMPATIBLE_IOCTL(SCSI_IOCTL_DOORLOCK)
2215 COMPATIBLE_IOCTL(SCSI_IOCTL_DOORUNLOCK)
2216 COMPATIBLE_IOCTL(SCSI_IOCTL_TEST_UNIT_READY)
2217 COMPATIBLE_IOCTL(SCSI_IOCTL_TAGGED_ENABLE)
2218 COMPATIBLE_IOCTL(SCSI_IOCTL_TAGGED_DISABLE)
2219 COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER)
2220 COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND)
2221 /* Big V */
2222 COMPATIBLE_IOCTL(VT_SETMODE)
2223 COMPATIBLE_IOCTL(VT_GETMODE)
2224 COMPATIBLE_IOCTL(VT_GETSTATE)
2225 COMPATIBLE_IOCTL(VT_OPENQRY)
2226 COMPATIBLE_IOCTL(VT_ACTIVATE)
2227 COMPATIBLE_IOCTL(VT_WAITACTIVE)
2228 COMPATIBLE_IOCTL(VT_RELDISP)
2229 COMPATIBLE_IOCTL(VT_DISALLOCATE)
2230 COMPATIBLE_IOCTL(VT_RESIZE)
2231 COMPATIBLE_IOCTL(VT_RESIZEX)
2232 COMPATIBLE_IOCTL(VT_LOCKSWITCH)
2233 COMPATIBLE_IOCTL(VT_UNLOCKSWITCH)
2234 /* Little v */
2235 COMPATIBLE_IOCTL(VUIDSFORMAT)
2236 COMPATIBLE_IOCTL(VUIDGFORMAT)
2237 /* Little v, the video4linux ioctls */
2238 COMPATIBLE_IOCTL(VIDIOCGCAP)
2239 COMPATIBLE_IOCTL(VIDIOCGCHAN)
2240 COMPATIBLE_IOCTL(VIDIOCSCHAN)
2241 COMPATIBLE_IOCTL(VIDIOCGPICT)
2242 COMPATIBLE_IOCTL(VIDIOCSPICT)
2243 COMPATIBLE_IOCTL(VIDIOCCAPTURE)
2244 COMPATIBLE_IOCTL(VIDIOCKEY)
2245 COMPATIBLE_IOCTL(VIDIOCGAUDIO)
2246 COMPATIBLE_IOCTL(VIDIOCSAUDIO)
2247 COMPATIBLE_IOCTL(VIDIOCSYNC)
2248 COMPATIBLE_IOCTL(VIDIOCMCAPTURE)
2249 COMPATIBLE_IOCTL(VIDIOCGMBUF)
2250 COMPATIBLE_IOCTL(VIDIOCGUNIT)
2251 COMPATIBLE_IOCTL(VIDIOCGCAPTURE)
2252 COMPATIBLE_IOCTL(VIDIOCSCAPTURE)
2253 /* BTTV specific... */
2254 COMPATIBLE_IOCTL(_IOW('v', BASE_VIDIOCPRIVATE+0, char [256]))
2255 COMPATIBLE_IOCTL(_IOR('v', BASE_VIDIOCPRIVATE+1, char [256]))
2256 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+2, unsigned int))
2257 COMPATIBLE_IOCTL(_IOW('v' , BASE_VIDIOCPRIVATE+3, char [16])) /* struct bttv_pll_info */
2258 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+4, int))
2259 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+5, int))
2260 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+6, int))
2261 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+7, int))
2262 /* Little p (/dev/rtc, /dev/envctrl, etc.) */
2263 COMPATIBLE_IOCTL(RTCGET)
2264 COMPATIBLE_IOCTL(RTCSET)
2265 COMPATIBLE_IOCTL(I2CIOCSADR)
2266 COMPATIBLE_IOCTL(I2CIOCGADR)
2267 /* Little m */
2268 COMPATIBLE_IOCTL(MTIOCTOP)
2269 /* OPENPROMIO, SunOS/Solaris only, the NetBSD one's have
2270 * embedded pointers in the arg which we'd need to clean up...
2272 COMPATIBLE_IOCTL(OPROMGETOPT)
2273 COMPATIBLE_IOCTL(OPROMSETOPT)
2274 COMPATIBLE_IOCTL(OPROMNXTOPT)
2275 COMPATIBLE_IOCTL(OPROMSETOPT2)
2276 COMPATIBLE_IOCTL(OPROMNEXT)
2277 COMPATIBLE_IOCTL(OPROMCHILD)
2278 COMPATIBLE_IOCTL(OPROMGETPROP)
2279 COMPATIBLE_IOCTL(OPROMNXTPROP)
2280 COMPATIBLE_IOCTL(OPROMU2P)
2281 COMPATIBLE_IOCTL(OPROMGETCONS)
2282 COMPATIBLE_IOCTL(OPROMGETFBNAME)
2283 COMPATIBLE_IOCTL(OPROMGETBOOTARGS)
2284 COMPATIBLE_IOCTL(OPROMSETCUR)
2285 COMPATIBLE_IOCTL(OPROMPCI2NODE)
2286 COMPATIBLE_IOCTL(OPROMPATH2NODE)
2287 /* Socket level stuff */
2288 COMPATIBLE_IOCTL(FIOSETOWN)
2289 COMPATIBLE_IOCTL(SIOCSPGRP)
2290 COMPATIBLE_IOCTL(FIOGETOWN)
2291 COMPATIBLE_IOCTL(SIOCGPGRP)
2292 COMPATIBLE_IOCTL(SIOCATMARK)
2293 COMPATIBLE_IOCTL(SIOCSIFLINK)
2294 COMPATIBLE_IOCTL(SIOCSIFENCAP)
2295 COMPATIBLE_IOCTL(SIOCGIFENCAP)
2296 COMPATIBLE_IOCTL(SIOCSIFBR)
2297 COMPATIBLE_IOCTL(SIOCGIFBR)
2298 COMPATIBLE_IOCTL(SIOCSARP)
2299 COMPATIBLE_IOCTL(SIOCGARP)
2300 COMPATIBLE_IOCTL(SIOCDARP)
2301 #if 0 /* XXX No longer exist in new routing code. XXX */
2302 COMPATIBLE_IOCTL(OLD_SIOCSARP)
2303 COMPATIBLE_IOCTL(OLD_SIOCGARP)
2304 COMPATIBLE_IOCTL(OLD_SIOCDARP)
2305 #endif
2306 COMPATIBLE_IOCTL(SIOCSRARP)
2307 COMPATIBLE_IOCTL(SIOCGRARP)
2308 COMPATIBLE_IOCTL(SIOCDRARP)
2309 COMPATIBLE_IOCTL(SIOCADDDLCI)
2310 COMPATIBLE_IOCTL(SIOCDELDLCI)
2311 /* SG stuff */
2312 COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
2313 COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
2314 COMPATIBLE_IOCTL(SG_EMULATED_HOST)
2315 COMPATIBLE_IOCTL(SG_SET_TRANSFORM)
2316 COMPATIBLE_IOCTL(SG_GET_TRANSFORM)
2317 /* PPP stuff */
2318 COMPATIBLE_IOCTL(PPPIOCGFLAGS)
2319 COMPATIBLE_IOCTL(PPPIOCSFLAGS)
2320 COMPATIBLE_IOCTL(PPPIOCGASYNCMAP)
2321 COMPATIBLE_IOCTL(PPPIOCSASYNCMAP)
2322 COMPATIBLE_IOCTL(PPPIOCGUNIT)
2323 COMPATIBLE_IOCTL(PPPIOCGRASYNCMAP)
2324 COMPATIBLE_IOCTL(PPPIOCSRASYNCMAP)
2325 COMPATIBLE_IOCTL(PPPIOCGMRU)
2326 COMPATIBLE_IOCTL(PPPIOCSMRU)
2327 COMPATIBLE_IOCTL(PPPIOCSMAXCID)
2328 COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP)
2329 COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP)
2330 COMPATIBLE_IOCTL(PPPIOCXFERUNIT)
2331 COMPATIBLE_IOCTL(PPPIOCGNPMODE)
2332 COMPATIBLE_IOCTL(PPPIOCSNPMODE)
2333 COMPATIBLE_IOCTL(PPPIOCGDEBUG)
2334 COMPATIBLE_IOCTL(PPPIOCSDEBUG)
2335 COMPATIBLE_IOCTL(PPPIOCNEWUNIT)
2336 COMPATIBLE_IOCTL(PPPIOCATTACH)
2337 COMPATIBLE_IOCTL(PPPIOCDETACH)
2338 /* CDROM stuff */
2339 COMPATIBLE_IOCTL(CDROMPAUSE)
2340 COMPATIBLE_IOCTL(CDROMRESUME)
2341 COMPATIBLE_IOCTL(CDROMPLAYMSF)
2342 COMPATIBLE_IOCTL(CDROMPLAYTRKIND)
2343 COMPATIBLE_IOCTL(CDROMREADTOCHDR)
2344 COMPATIBLE_IOCTL(CDROMREADTOCENTRY)
2345 COMPATIBLE_IOCTL(CDROMSTOP)
2346 COMPATIBLE_IOCTL(CDROMSTART)
2347 COMPATIBLE_IOCTL(CDROMEJECT)
2348 COMPATIBLE_IOCTL(CDROMVOLCTRL)
2349 COMPATIBLE_IOCTL(CDROMSUBCHNL)
2350 COMPATIBLE_IOCTL(CDROMEJECT_SW)
2351 COMPATIBLE_IOCTL(CDROMMULTISESSION)
2352 COMPATIBLE_IOCTL(CDROM_GET_MCN)
2353 COMPATIBLE_IOCTL(CDROMRESET)
2354 COMPATIBLE_IOCTL(CDROMVOLREAD)
2355 COMPATIBLE_IOCTL(CDROMSEEK)
2356 COMPATIBLE_IOCTL(CDROMPLAYBLK)
2357 COMPATIBLE_IOCTL(CDROMCLOSETRAY)
2358 COMPATIBLE_IOCTL(CDROM_SET_OPTIONS)
2359 COMPATIBLE_IOCTL(CDROM_CLEAR_OPTIONS)
2360 COMPATIBLE_IOCTL(CDROM_SELECT_SPEED)
2361 COMPATIBLE_IOCTL(CDROM_SELECT_DISC)
2362 COMPATIBLE_IOCTL(CDROM_MEDIA_CHANGED)
2363 COMPATIBLE_IOCTL(CDROM_DRIVE_STATUS)
2364 COMPATIBLE_IOCTL(CDROM_DISC_STATUS)
2365 COMPATIBLE_IOCTL(CDROM_CHANGER_NSLOTS)
2366 COMPATIBLE_IOCTL(CDROM_LOCKDOOR)
2367 COMPATIBLE_IOCTL(CDROM_DEBUG)
2368 COMPATIBLE_IOCTL(CDROM_GET_CAPABILITY)
2369 /* Big L */
2370 COMPATIBLE_IOCTL(LOOP_SET_FD)
2371 COMPATIBLE_IOCTL(LOOP_CLR_FD)
2372 /* Big A */
2373 COMPATIBLE_IOCTL(AUDIO_GETINFO)
2374 COMPATIBLE_IOCTL(AUDIO_SETINFO)
2375 COMPATIBLE_IOCTL(AUDIO_DRAIN)
2376 COMPATIBLE_IOCTL(AUDIO_GETDEV)
2377 COMPATIBLE_IOCTL(AUDIO_GETDEV_SUNOS)
2378 COMPATIBLE_IOCTL(AUDIO_FLUSH)
2379 /* Big Q for sound/OSS */
2380 COMPATIBLE_IOCTL(SNDCTL_SEQ_RESET)
2381 COMPATIBLE_IOCTL(SNDCTL_SEQ_SYNC)
2382 COMPATIBLE_IOCTL(SNDCTL_SYNTH_INFO)
2383 COMPATIBLE_IOCTL(SNDCTL_SEQ_CTRLRATE)
2384 COMPATIBLE_IOCTL(SNDCTL_SEQ_GETOUTCOUNT)
2385 COMPATIBLE_IOCTL(SNDCTL_SEQ_GETINCOUNT)
2386 COMPATIBLE_IOCTL(SNDCTL_SEQ_PERCMODE)
2387 COMPATIBLE_IOCTL(SNDCTL_FM_LOAD_INSTR)
2388 COMPATIBLE_IOCTL(SNDCTL_SEQ_TESTMIDI)
2389 COMPATIBLE_IOCTL(SNDCTL_SEQ_RESETSAMPLES)
2390 COMPATIBLE_IOCTL(SNDCTL_SEQ_NRSYNTHS)
2391 COMPATIBLE_IOCTL(SNDCTL_SEQ_NRMIDIS)
2392 COMPATIBLE_IOCTL(SNDCTL_MIDI_INFO)
2393 COMPATIBLE_IOCTL(SNDCTL_SEQ_THRESHOLD)
2394 COMPATIBLE_IOCTL(SNDCTL_SYNTH_MEMAVL)
2395 COMPATIBLE_IOCTL(SNDCTL_FM_4OP_ENABLE)
2396 COMPATIBLE_IOCTL(SNDCTL_SEQ_PANIC)
2397 COMPATIBLE_IOCTL(SNDCTL_SEQ_OUTOFBAND)
2398 COMPATIBLE_IOCTL(SNDCTL_SEQ_GETTIME)
2399 COMPATIBLE_IOCTL(SNDCTL_SYNTH_ID)
2400 COMPATIBLE_IOCTL(SNDCTL_SYNTH_CONTROL)
2401 COMPATIBLE_IOCTL(SNDCTL_SYNTH_REMOVESAMPLE)
2402 /* Big T for sound/OSS */
2403 COMPATIBLE_IOCTL(SNDCTL_TMR_TIMEBASE)
2404 COMPATIBLE_IOCTL(SNDCTL_TMR_START)
2405 COMPATIBLE_IOCTL(SNDCTL_TMR_STOP)
2406 COMPATIBLE_IOCTL(SNDCTL_TMR_CONTINUE)
2407 COMPATIBLE_IOCTL(SNDCTL_TMR_TEMPO)
2408 COMPATIBLE_IOCTL(SNDCTL_TMR_SOURCE)
2409 COMPATIBLE_IOCTL(SNDCTL_TMR_METRONOME)
2410 COMPATIBLE_IOCTL(SNDCTL_TMR_SELECT)
2411 /* Little m for sound/OSS */
2412 COMPATIBLE_IOCTL(SNDCTL_MIDI_PRETIME)
2413 COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUMODE)
2414 COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUCMD)
2415 /* Big P for sound/OSS */
2416 COMPATIBLE_IOCTL(SNDCTL_DSP_RESET)
2417 COMPATIBLE_IOCTL(SNDCTL_DSP_SYNC)
2418 COMPATIBLE_IOCTL(SNDCTL_DSP_SPEED)
2419 COMPATIBLE_IOCTL(SNDCTL_DSP_STEREO)
2420 COMPATIBLE_IOCTL(SNDCTL_DSP_GETBLKSIZE)
2421 COMPATIBLE_IOCTL(SNDCTL_DSP_CHANNELS)
2422 COMPATIBLE_IOCTL(SOUND_PCM_WRITE_FILTER)
2423 COMPATIBLE_IOCTL(SNDCTL_DSP_POST)
2424 COMPATIBLE_IOCTL(SNDCTL_DSP_SUBDIVIDE)
2425 COMPATIBLE_IOCTL(SNDCTL_DSP_SETFRAGMENT)
2426 COMPATIBLE_IOCTL(SNDCTL_DSP_GETFMTS)
2427 COMPATIBLE_IOCTL(SNDCTL_DSP_SETFMT)
2428 COMPATIBLE_IOCTL(SNDCTL_DSP_GETOSPACE)
2429 COMPATIBLE_IOCTL(SNDCTL_DSP_GETISPACE)
2430 COMPATIBLE_IOCTL(SNDCTL_DSP_NONBLOCK)
2431 COMPATIBLE_IOCTL(SNDCTL_DSP_GETCAPS)
2432 COMPATIBLE_IOCTL(SNDCTL_DSP_GETTRIGGER)
2433 COMPATIBLE_IOCTL(SNDCTL_DSP_SETTRIGGER)
2434 COMPATIBLE_IOCTL(SNDCTL_DSP_GETIPTR)
2435 COMPATIBLE_IOCTL(SNDCTL_DSP_GETOPTR)
2436 /* SNDCTL_DSP_MAPINBUF, XXX needs translation */
2437 /* SNDCTL_DSP_MAPOUTBUF, XXX needs translation */
2438 COMPATIBLE_IOCTL(SNDCTL_DSP_SETSYNCRO)
2439 COMPATIBLE_IOCTL(SNDCTL_DSP_SETDUPLEX)
2440 COMPATIBLE_IOCTL(SNDCTL_DSP_GETODELAY)
2441 COMPATIBLE_IOCTL(SNDCTL_DSP_PROFILE)
2442 COMPATIBLE_IOCTL(SOUND_PCM_READ_RATE)
2443 COMPATIBLE_IOCTL(SOUND_PCM_READ_CHANNELS)
2444 COMPATIBLE_IOCTL(SOUND_PCM_READ_BITS)
2445 COMPATIBLE_IOCTL(SOUND_PCM_READ_FILTER)
2446 /* Big C for sound/OSS */
2447 COMPATIBLE_IOCTL(SNDCTL_COPR_RESET)
2448 COMPATIBLE_IOCTL(SNDCTL_COPR_LOAD)
2449 COMPATIBLE_IOCTL(SNDCTL_COPR_RDATA)
2450 COMPATIBLE_IOCTL(SNDCTL_COPR_RCODE)
2451 COMPATIBLE_IOCTL(SNDCTL_COPR_WDATA)
2452 COMPATIBLE_IOCTL(SNDCTL_COPR_WCODE)
2453 COMPATIBLE_IOCTL(SNDCTL_COPR_RUN)
2454 COMPATIBLE_IOCTL(SNDCTL_COPR_HALT)
2455 COMPATIBLE_IOCTL(SNDCTL_COPR_SENDMSG)
2456 COMPATIBLE_IOCTL(SNDCTL_COPR_RCVMSG)
2457 /* Big M for sound/OSS */
2458 COMPATIBLE_IOCTL(SOUND_MIXER_READ_VOLUME)
2459 COMPATIBLE_IOCTL(SOUND_MIXER_READ_BASS)
2460 COMPATIBLE_IOCTL(SOUND_MIXER_READ_TREBLE)
2461 COMPATIBLE_IOCTL(SOUND_MIXER_READ_SYNTH)
2462 COMPATIBLE_IOCTL(SOUND_MIXER_READ_PCM)
2463 COMPATIBLE_IOCTL(SOUND_MIXER_READ_SPEAKER)
2464 COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE)
2465 COMPATIBLE_IOCTL(SOUND_MIXER_READ_MIC)
2466 COMPATIBLE_IOCTL(SOUND_MIXER_READ_CD)
2467 COMPATIBLE_IOCTL(SOUND_MIXER_READ_IMIX)
2468 COMPATIBLE_IOCTL(SOUND_MIXER_READ_ALTPCM)
2469 COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECLEV)
2470 COMPATIBLE_IOCTL(SOUND_MIXER_READ_IGAIN)
2471 COMPATIBLE_IOCTL(SOUND_MIXER_READ_OGAIN)
2472 COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE1)
2473 COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE2)
2474 COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE3)
2475 COMPATIBLE_IOCTL(SOUND_MIXER_READ_MUTE)
2476 /* SOUND_MIXER_READ_ENHANCE, same value as READ_MUTE */
2477 /* SOUND_MIXER_READ_LOUD, same value as READ_MUTE */
2478 COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECSRC)
2479 COMPATIBLE_IOCTL(SOUND_MIXER_READ_DEVMASK)
2480 COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECMASK)
2481 COMPATIBLE_IOCTL(SOUND_MIXER_READ_STEREODEVS)
2482 COMPATIBLE_IOCTL(SOUND_MIXER_READ_CAPS)
2483 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_VOLUME)
2484 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_BASS)
2485 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_TREBLE)
2486 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SYNTH)
2487 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_PCM)
2488 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SPEAKER)
2489 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE)
2490 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MIC)
2491 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_CD)
2492 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IMIX)
2493 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_ALTPCM)
2494 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECLEV)
2495 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IGAIN)
2496 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_OGAIN)
2497 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE1)
2498 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE2)
2499 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE3)
2500 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MUTE)
2501 /* SOUND_MIXER_WRITE_ENHANCE, same value as WRITE_MUTE */
2502 /* SOUND_MIXER_WRITE_LOUD, same value as WRITE_MUTE */
2503 COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECSRC)
2504 COMPATIBLE_IOCTL(SOUND_MIXER_INFO)
2505 COMPATIBLE_IOCTL(SOUND_OLD_MIXER_INFO)
2506 COMPATIBLE_IOCTL(SOUND_MIXER_ACCESS)
2507 COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE1)
2508 COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE2)
2509 COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE3)
2510 COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE4)
2511 COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE5)
2512 COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
2513 COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
2514 COMPATIBLE_IOCTL(OSS_GETVERSION)
2515 /* AUTOFS */
2516 COMPATIBLE_IOCTL(AUTOFS_IOC_READY)
2517 COMPATIBLE_IOCTL(AUTOFS_IOC_FAIL)
2518 COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC)
2519 COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
2520 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
2521 /* DEVFS */
2522 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
2523 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)
2524 COMPATIBLE_IOCTL(DEVFSDIOC_RELEASE_EVENT_QUEUE)
2525 COMPATIBLE_IOCTL(DEVFSDIOC_SET_DEBUG_MASK)
2526 /* Raw devices */
2527 COMPATIBLE_IOCTL(RAW_SETBIND)
2528 COMPATIBLE_IOCTL(RAW_GETBIND)
2529 /* SMB ioctls which do not need any translations */
2530 COMPATIBLE_IOCTL(SMB_IOC_NEWCONN)
2531 /* Little a */
2532 COMPATIBLE_IOCTL(ATMSIGD_CTRL)
2533 COMPATIBLE_IOCTL(ATMARPD_CTRL)
2534 COMPATIBLE_IOCTL(ATMLEC_CTRL)
2535 COMPATIBLE_IOCTL(ATMLEC_MCAST)
2536 COMPATIBLE_IOCTL(ATMLEC_DATA)
2537 COMPATIBLE_IOCTL(ATM_SETSC)
2538 COMPATIBLE_IOCTL(SIOCSIFATMTCP)
2539 COMPATIBLE_IOCTL(SIOCMKCLIP)
2540 COMPATIBLE_IOCTL(ATMARP_MKIP)
2541 COMPATIBLE_IOCTL(ATMARP_SETENTRY)
2542 COMPATIBLE_IOCTL(ATMARP_ENCAP)
2543 COMPATIBLE_IOCTL(ATMTCP_CREATE)
2544 COMPATIBLE_IOCTL(ATMTCP_REMOVE)
2545 COMPATIBLE_IOCTL(ATMMPC_CTRL)
2546 COMPATIBLE_IOCTL(ATMMPC_DATA)
2547 /* And these ioctls need translation */
2548 HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
2549 HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
2550 HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
2551 HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
2552 HANDLE_IOCTL(SIOCGIFMETRIC, dev_ifsioc)
2553 HANDLE_IOCTL(SIOCSIFMETRIC, dev_ifsioc)
2554 HANDLE_IOCTL(SIOCGIFMTU, dev_ifsioc)
2555 HANDLE_IOCTL(SIOCSIFMTU, dev_ifsioc)
2556 HANDLE_IOCTL(SIOCGIFMEM, dev_ifsioc)
2557 HANDLE_IOCTL(SIOCSIFMEM, dev_ifsioc)
2558 HANDLE_IOCTL(SIOCGIFHWADDR, dev_ifsioc)
2559 HANDLE_IOCTL(SIOCSIFHWADDR, dev_ifsioc)
2560 HANDLE_IOCTL(SIOCADDMULTI, dev_ifsioc)
2561 HANDLE_IOCTL(SIOCDELMULTI, dev_ifsioc)
2562 HANDLE_IOCTL(SIOCGIFINDEX, dev_ifsioc)
2563 HANDLE_IOCTL(SIOCGIFMAP, dev_ifsioc)
2564 HANDLE_IOCTL(SIOCSIFMAP, dev_ifsioc)
2565 HANDLE_IOCTL(SIOCGIFADDR, dev_ifsioc)
2566 HANDLE_IOCTL(SIOCSIFADDR, dev_ifsioc)
2567 HANDLE_IOCTL(SIOCGIFBRDADDR, dev_ifsioc)
2568 HANDLE_IOCTL(SIOCSIFBRDADDR, dev_ifsioc)
2569 HANDLE_IOCTL(SIOCGIFDSTADDR, dev_ifsioc)
2570 HANDLE_IOCTL(SIOCSIFDSTADDR, dev_ifsioc)
2571 HANDLE_IOCTL(SIOCGIFNETMASK, dev_ifsioc)
2572 HANDLE_IOCTL(SIOCSIFNETMASK, dev_ifsioc)
2573 HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
2574 HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
2575 HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
2576 HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
2577 HANDLE_IOCTL(SIOCGPPPVER, dev_ifsioc)
2578 HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
2579 HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
2580 HANDLE_IOCTL(SIOCETHTOOL, dev_ifsioc)
2581 HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
2582 HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
2583 /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
2584 HANDLE_IOCTL(SIOCRTMSG, ret_einval)
2585 HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
2586 HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)
2587 HANDLE_IOCTL(BLKRAGET, w_long)
2588 HANDLE_IOCTL(BLKGETSIZE, w_long)
2589 HANDLE_IOCTL(0x1260, broken_blkgetsize)
2590 HANDLE_IOCTL(BLKFRAGET, w_long)
2591 HANDLE_IOCTL(BLKSECTGET, w_long)
2592 HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
2593 HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
2594 HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap)
2595 HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor)
2596 HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans)
2597 HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans)
2598 HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans)
2599 HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans)
2600 HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
2601 HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
2602 HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans)
2603 HANDLE_IOCTL(HDIO_GET_MULTCOUNT, hdio_ioctl_trans)
2604 HANDLE_IOCTL(HDIO_GET_NOWERR, hdio_ioctl_trans)
2605 HANDLE_IOCTL(HDIO_GET_NICE, hdio_ioctl_trans)
2606 HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
2607 HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
2608 HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)
2609 HANDLE_IOCTL(FDSETDRVPRM32, fd_ioctl_trans)
2610 HANDLE_IOCTL(FDGETDRVPRM32, fd_ioctl_trans)
2611 HANDLE_IOCTL(FDGETDRVSTAT32, fd_ioctl_trans)
2612 HANDLE_IOCTL(FDPOLLDRVSTAT32, fd_ioctl_trans)
2613 HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans)
2614 HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
2615 HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
2616 HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
2617 HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
2618 HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
2619 HANDLE_IOCTL(MTIOCGETCONFIG32, mt_ioctl_trans)
2620 HANDLE_IOCTL(MTIOCSETCONFIG32, mt_ioctl_trans)
2621 HANDLE_IOCTL(CDROMREADMODE2, cdrom_ioctl_trans)
2622 HANDLE_IOCTL(CDROMREADMODE1, cdrom_ioctl_trans)
2623 HANDLE_IOCTL(CDROMREADRAW, cdrom_ioctl_trans)
2624 HANDLE_IOCTL(CDROMREADCOOKED, cdrom_ioctl_trans)
2625 HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
2626 HANDLE_IOCTL(CDROMREADALL, cdrom_ioctl_trans)
2627 HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
2628 HANDLE_IOCTL(LOOP_SET_STATUS, loop_status)
2629 HANDLE_IOCTL(LOOP_GET_STATUS, loop_status)
2630 #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
2631 HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
2632 HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl)
2633 HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl)
2634 HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl)
2635 HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl)
2636 HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
2637 HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
2638 HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
2639 HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
2640 HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
2641 HANDLE_IOCTL(VIDIOCGTUNER32, do_video_ioctl)
2642 HANDLE_IOCTL(VIDIOCSTUNER32, do_video_ioctl)
2643 HANDLE_IOCTL(VIDIOCGWIN32, do_video_ioctl)
2644 HANDLE_IOCTL(VIDIOCSWIN32, do_video_ioctl)
2645 HANDLE_IOCTL(VIDIOCGFBUF32, do_video_ioctl)
2646 HANDLE_IOCTL(VIDIOCSFBUF32, do_video_ioctl)
2647 HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl)
2648 HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl)
2649 /* One SMB ioctl needs translations. */
2650 #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, __kernel_uid_t32)
2651 HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
2652 HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
2653 HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
2654 HANDLE_IOCTL(ATM_GETTYPE32, do_atm_ioctl)
2655 HANDLE_IOCTL(ATM_GETESI32, do_atm_ioctl)
2656 HANDLE_IOCTL(ATM_GETADDR32, do_atm_ioctl)
2657 HANDLE_IOCTL(ATM_RSTADDR32, do_atm_ioctl)
2658 HANDLE_IOCTL(ATM_ADDADDR32, do_atm_ioctl)
2659 HANDLE_IOCTL(ATM_DELADDR32, do_atm_ioctl)
2660 HANDLE_IOCTL(ATM_GETCIRANGE32, do_atm_ioctl)
2661 HANDLE_IOCTL(ATM_SETCIRANGE32, do_atm_ioctl)
2662 HANDLE_IOCTL(ATM_SETESI32, do_atm_ioctl)
2663 HANDLE_IOCTL(ATM_SETESIF32, do_atm_ioctl)
2664 HANDLE_IOCTL(ATM_GETSTAT32, do_atm_ioctl)
2665 HANDLE_IOCTL(ATM_GETSTATZ32, do_atm_ioctl)
2666 HANDLE_IOCTL(SUNI_GETLOOP, do_atm_ioctl)
2667 HANDLE_IOCTL(SUNI_SETLOOP, do_atm_ioctl)
2668 HANDLE_IOCTL(SONET_GETSTAT, do_atm_ioctl)
2669 HANDLE_IOCTL(SONET_GETSTATZ, do_atm_ioctl)
2670 HANDLE_IOCTL(SONET_GETDIAG, do_atm_ioctl)
2671 HANDLE_IOCTL(SONET_SETDIAG, do_atm_ioctl)
2672 HANDLE_IOCTL(SONET_CLRDIAG, do_atm_ioctl)
2673 HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
2674 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
2675 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
2676 IOCTL_TABLE_END
2678 unsigned int ioctl32_hash_table[1024];
2680 extern inline unsigned long ioctl32_hash(unsigned long cmd)
2682 return ((cmd >> 6) ^ (cmd >> 4) ^ cmd) & 0x3ff;
2685 static void ioctl32_insert_translation(struct ioctl_trans *trans)
2687 unsigned long hash;
2688 struct ioctl_trans *t;
2690 hash = ioctl32_hash (trans->cmd);
2691 if (!ioctl32_hash_table[hash])
2692 ioctl32_hash_table[hash] = (u32)(long)trans;
2693 else {
2694 t = (struct ioctl_trans *)(long)ioctl32_hash_table[hash];
2695 while (t->next)
2696 t = (struct ioctl_trans *)(long)t->next;
2697 trans->next = 0;
2698 t->next = (u32)(long)trans;
2702 static int __init init_sys32_ioctl(void)
2704 int i;
2705 extern struct ioctl_trans ioctl_translations[], ioctl_translations_end[];
2707 for (i = 0; &ioctl_translations[i] < &ioctl_translations_end[0]; i++)
2708 ioctl32_insert_translation(&ioctl_translations[i]);
2709 return 0;
2712 __initcall(init_sys32_ioctl);
2714 static struct ioctl_trans *additional_ioctls;
2716 /* Always call these with kernel lock held! */
2718 int register_ioctl32_conversion(unsigned int cmd, int (*handler)(unsigned int, unsigned int, unsigned long, struct file *))
2720 int i;
2721 if (!additional_ioctls) {
2722 additional_ioctls = module_map(PAGE_SIZE);
2723 if (!additional_ioctls) return -ENOMEM;
2725 for (i = 0; i < PAGE_SIZE/sizeof(struct ioctl_trans); i++)
2726 if (!additional_ioctls[i].cmd)
2727 break;
2728 if (i == PAGE_SIZE/sizeof(struct ioctl_trans))
2729 return -ENOMEM;
2730 additional_ioctls[i].cmd = cmd;
2731 if (!handler)
2732 additional_ioctls[i].handler = (u32)(long)sys_ioctl;
2733 else
2734 additional_ioctls[i].handler = (u32)(long)handler;
2735 ioctl32_insert_translation(&additional_ioctls[i]);
2736 return 0;
2739 int unregister_ioctl32_conversion(unsigned int cmd)
2741 unsigned long hash = ioctl32_hash(cmd);
2742 struct ioctl_trans *t, *t1;
2744 t = (struct ioctl_trans *)(long)ioctl32_hash_table[hash];
2745 if (!t) return -EINVAL;
2746 if (t->cmd == cmd && t >= additional_ioctls &&
2747 (unsigned long)t < ((unsigned long)additional_ioctls) + PAGE_SIZE) {
2748 ioctl32_hash_table[hash] = t->next;
2749 t->cmd = 0;
2750 return 0;
2751 } else while (t->next) {
2752 t1 = (struct ioctl_trans *)(long)t->next;
2753 if (t1->cmd == cmd && t1 >= additional_ioctls &&
2754 (unsigned long)t1 < ((unsigned long)additional_ioctls) + PAGE_SIZE) {
2755 t1->cmd = 0;
2756 t->next = t1->next;
2757 return 0;
2759 t = t1;
2761 return -EINVAL;
2764 asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
2766 struct file * filp;
2767 int error = -EBADF;
2768 int (*handler)(unsigned int, unsigned int, unsigned long, struct file * filp);
2769 struct ioctl_trans *t;
2771 lock_kernel();
2772 filp = fget(fd);
2773 if(!filp)
2774 goto out2;
2776 if (!filp->f_op || !filp->f_op->ioctl) {
2777 error = sys_ioctl (fd, cmd, arg);
2778 goto out;
2781 t = (struct ioctl_trans *)(long)ioctl32_hash_table [ioctl32_hash (cmd)];
2783 while (t && t->cmd != cmd)
2784 t = (struct ioctl_trans *)(long)t->next;
2785 if (t) {
2786 handler = (void *)(long)t->handler;
2787 error = handler(fd, cmd, arg, filp);
2788 } else {
2789 static int count = 0;
2790 if (++count <= 20)
2791 printk("sys32_ioctl: Unknown cmd fd(%d) "
2792 "cmd(%08x) arg(%08x)\n",
2793 (int)fd, (unsigned int)cmd, (unsigned int)arg);
2794 error = -EINVAL;
2796 out:
2797 fput(filp);
2798 out2:
2799 unlock_kernel();
2800 return error;