OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [sparc64/] [kernel/] [ioctl32.c] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* $Id: ioctl32.c,v 1.1.1.1 2004-04-15 01:34:21 phoenix Exp $
2
 * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
3
 *
4
 * Copyright (C) 1997-2000  Jakub Jelinek  (jakub@redhat.com)
5
 * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
6
 *
7
 * These routines maintain argument size conversion between 32bit and 64bit
8
 * ioctls.
9
 */
10
 
11
#include <linux/config.h>
12
#include <linux/types.h>
13
#include <linux/kernel.h>
14
#include <linux/sched.h>
15
#include <linux/smp.h>
16
#include <linux/smp_lock.h>
17
#include <linux/ioctl.h>
18
#include <linux/if.h>
19
#include <linux/slab.h>
20
#include <linux/hdreg.h>
21
#include <linux/raid/md.h>
22
#include <linux/kd.h>
23
#include <linux/route.h>
24
#include <linux/in6.h>
25
#include <linux/ipv6_route.h>
26
#include <linux/skbuff.h>
27
#include <linux/netlink.h>
28
#include <linux/vt.h>
29
#include <linux/fs.h>
30
#include <linux/file.h>
31
#include <linux/fd.h>
32
#include <linux/ppp_defs.h>
33
#include <linux/if_ppp.h>
34
#include <linux/if_pppox.h>
35
#include <linux/if_tun.h>
36
#include <linux/mtio.h>
37
#include <linux/cdrom.h>
38
#include <linux/loop.h>
39
#include <linux/auto_fs.h>
40
#include <linux/auto_fs4.h>
41
#include <linux/devfs_fs.h>
42
#include <linux/tty.h>
43
#include <linux/vt_kern.h>
44
#include <linux/fb.h>
45
#include <linux/ext2_fs.h>
46
#include <linux/videodev.h>
47
#include <linux/netdevice.h>
48
#include <linux/raw.h>
49
#include <linux/smb_fs.h>
50
#include <linux/ncp_fs.h>
51
#include <linux/blkpg.h>
52
#include <linux/blk.h>
53
#include <linux/elevator.h>
54
#include <linux/rtc.h>
55
#include <linux/pci.h>
56
#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
57
#include <linux/lvm.h>
58
#endif /* LVM */
59
 
60
#include <scsi/scsi.h>
61
/* Ugly hack. */
62
#undef __KERNEL__
63
#include <scsi/scsi_ioctl.h>
64
#define __KERNEL__
65
#include <scsi/sg.h>
66
 
67
#include <asm/types.h>
68
#include <asm/uaccess.h>
69
#include <asm/fbio.h>
70
#include <asm/kbio.h>
71
#include <asm/vuid_event.h>
72
#include <asm/openpromio.h>
73
#include <asm/envctrl.h>
74
#include <asm/audioio.h>
75
#include <linux/ethtool.h>
76
#include <linux/mii.h>
77
#include <linux/if_bonding.h>
78
#include <asm/display7seg.h>
79
#include <asm/watchdog.h>
80
#include <asm/module.h>
81
#include <linux/soundcard.h>
82
#include <linux/lp.h>
83
 
84
#include <linux/atm.h>
85
#include <linux/atmarp.h>
86
#include <linux/atmclip.h>
87
#include <linux/atmdev.h>
88
#include <linux/atmioc.h>
89
#include <linux/atmlec.h>
90
#include <linux/atmmpc.h>
91
#include <linux/atmsvc.h>
92
#include <linux/atm_tcp.h>
93
#include <linux/sonet.h>
94
#include <linux/atm_suni.h>
95
#include <linux/mtd/mtd.h>
96
 
97
#include <net/bluetooth/bluetooth.h>
98
#include <net/bluetooth/hci.h>
99
#include <net/bluetooth/rfcomm.h>
100
 
101
#include <linux/usb.h>
102
#include <linux/usbdevice_fs.h>
103
#include <linux/usb_scanner_ioctl.h>
104
#include <linux/nbd.h>
105
#include <linux/random.h>
106
#include <linux/filter.h>
107
 
108
/* Use this to get at 32-bit user passed pointers.
109
   See sys_sparc32.c for description about these. */
110
#define A(__x) ((unsigned long)(__x))
111
#define AA(__x)                         \
112
({      unsigned long __ret;            \
113
        __asm__ ("srl   %0, 0, %0"      \
114
                 : "=r" (__ret)         \
115
                 : "0" (__x));           \
116
        __ret;                          \
117
})
118
 
119
/* Aiee. Someone does not find a difference between int and long */
120
#define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
121
#define EXT2_IOC32_SETFLAGS               _IOW('f', 2, int)
122
#define EXT2_IOC32_GETVERSION             _IOR('v', 1, int)
123
#define EXT2_IOC32_SETVERSION             _IOW('v', 2, int)
124
 
125
extern asmlinkage int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
126
 
127
static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg)
128
{
129
        mm_segment_t old_fs = get_fs();
130
        int err;
131
        unsigned long val;
132
 
133
        set_fs (KERNEL_DS);
134
        err = sys_ioctl(fd, cmd, (unsigned long)&val);
135
        set_fs (old_fs);
136
        if (!err && put_user(val, (u32 *)arg))
137
                return -EFAULT;
138
        return err;
139
}
140
 
141
static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
142
{
143
        mm_segment_t old_fs = get_fs();
144
        int err;
145
        unsigned long val;
146
 
147
        if(get_user(val, (u32 *)arg))
148
                return -EFAULT;
149
        set_fs (KERNEL_DS);
150
        err = sys_ioctl(fd, cmd, (unsigned long)&val);
151
        set_fs (old_fs);
152
        if (!err && put_user(val, (u32 *)arg))
153
                return -EFAULT;
154
        return err;
155
}
156
 
157
static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
158
{
159
        /* These are just misnamed, they actually get/put from/to user an int */
160
        switch (cmd) {
161
        case EXT2_IOC32_GETFLAGS: cmd = EXT2_IOC_GETFLAGS; break;
162
        case EXT2_IOC32_SETFLAGS: cmd = EXT2_IOC_SETFLAGS; break;
163
        case EXT2_IOC32_GETVERSION: cmd = EXT2_IOC_GETVERSION; break;
164
        case EXT2_IOC32_SETVERSION: cmd = EXT2_IOC_SETVERSION; break;
165
        }
166
        return sys_ioctl(fd, cmd, arg);
167
}
168
 
169
struct video_tuner32 {
170
        s32 tuner;
171
        u8 name[32];
172
        u32 rangelow, rangehigh;
173
        u32 flags;
174
        u16 mode, signal;
175
};
176
 
177
static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 *up)
178
{
179
        int i;
180
 
181
        if(get_user(kp->tuner, &up->tuner))
182
                return -EFAULT;
183
        for(i = 0; i < 32; i++)
184
                __get_user(kp->name[i], &up->name[i]);
185
        __get_user(kp->rangelow, &up->rangelow);
186
        __get_user(kp->rangehigh, &up->rangehigh);
187
        __get_user(kp->flags, &up->flags);
188
        __get_user(kp->mode, &up->mode);
189
        __get_user(kp->signal, &up->signal);
190
        return 0;
191
}
192
 
193
static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 *up)
194
{
195
        int i;
196
 
197
        if(put_user(kp->tuner, &up->tuner))
198
                return -EFAULT;
199
        for(i = 0; i < 32; i++)
200
                __put_user(kp->name[i], &up->name[i]);
201
        __put_user(kp->rangelow, &up->rangelow);
202
        __put_user(kp->rangehigh, &up->rangehigh);
203
        __put_user(kp->flags, &up->flags);
204
        __put_user(kp->mode, &up->mode);
205
        __put_user(kp->signal, &up->signal);
206
        return 0;
207
}
208
 
209
struct video_buffer32 {
210
        /* void * */ u32 base;
211
        s32 height, width, depth, bytesperline;
212
};
213
 
214
static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 *up)
215
{
216
        u32 tmp;
217
 
218
        if(get_user(tmp, &up->base))
219
                return -EFAULT;
220
        kp->base = (void *) ((unsigned long)tmp);
221
        __get_user(kp->height, &up->height);
222
        __get_user(kp->width, &up->width);
223
        __get_user(kp->depth, &up->depth);
224
        __get_user(kp->bytesperline, &up->bytesperline);
225
        return 0;
226
}
227
 
228
static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 *up)
229
{
230
        u32 tmp = (u32)((unsigned long)kp->base);
231
 
232
        if(put_user(tmp, &up->base))
233
                return -EFAULT;
234
        __put_user(kp->height, &up->height);
235
        __put_user(kp->width, &up->width);
236
        __put_user(kp->depth, &up->depth);
237
        __put_user(kp->bytesperline, &up->bytesperline);
238
        return 0;
239
}
240
 
241
struct video_clip32 {
242
        s32 x, y, width, height;
243
        /* struct video_clip32 * */ u32 next;
244
};
245
 
246
struct video_window32 {
247
        u32 x, y, width, height, chromakey, flags;
248
        /* struct video_clip32 * */ u32 clips;
249
        s32 clipcount;
250
};
251
 
252
static void free_kvideo_clips(struct video_window *kp)
253
{
254
        struct video_clip *cp;
255
 
256
        cp = kp->clips;
257
        if(cp != NULL)
258
                kfree(cp);
259
}
260
 
261
static int get_video_window32(struct video_window *kp, struct video_window32 *up)
262
{
263
        struct video_clip32 *ucp;
264
        struct video_clip *kcp;
265
        int nclips, err, i;
266
        u32 tmp;
267
 
268
        if(get_user(kp->x, &up->x))
269
                return -EFAULT;
270
        __get_user(kp->y, &up->y);
271
        __get_user(kp->width, &up->width);
272
        __get_user(kp->height, &up->height);
273
        __get_user(kp->chromakey, &up->chromakey);
274
        __get_user(kp->flags, &up->flags);
275
        __get_user(kp->clipcount, &up->clipcount);
276
        __get_user(tmp, &up->clips);
277
        ucp = (struct video_clip32 *)A(tmp);
278
        kp->clips = NULL;
279
 
280
        nclips = kp->clipcount;
281
        if(nclips == 0)
282
                return 0;
283
 
284
        if(ucp == 0)
285
                return -EINVAL;
286
 
287
        /* Peculiar interface... */
288
        if(nclips < 0)
289
                nclips = VIDEO_CLIPMAP_SIZE;
290
 
291
        kcp = kmalloc(nclips * sizeof(struct video_clip), GFP_KERNEL);
292
        err = -ENOMEM;
293
        if(kcp == NULL)
294
                goto cleanup_and_err;
295
 
296
        kp->clips = kcp;
297
        for(i = 0; i < nclips; i++) {
298
                __get_user(kcp[i].x, &ucp[i].x);
299
                __get_user(kcp[i].y, &ucp[i].y);
300
                __get_user(kcp[i].width, &ucp[i].width);
301
                __get_user(kcp[i].height, &ucp[i].height);
302
                kcp[nclips].next = NULL;
303
        }
304
 
305
        return 0;
306
 
307
cleanup_and_err:
308
        free_kvideo_clips(kp);
309
        return err;
310
}
311
 
312
/* You get back everything except the clips... */
313
static int put_video_window32(struct video_window *kp, struct video_window32 *up)
314
{
315
        if(put_user(kp->x, &up->x))
316
                return -EFAULT;
317
        __put_user(kp->y, &up->y);
318
        __put_user(kp->width, &up->width);
319
        __put_user(kp->height, &up->height);
320
        __put_user(kp->chromakey, &up->chromakey);
321
        __put_user(kp->flags, &up->flags);
322
        __put_user(kp->clipcount, &up->clipcount);
323
        return 0;
324
}
325
 
326
#define VIDIOCGTUNER32          _IOWR('v',4, struct video_tuner32)
327
#define VIDIOCSTUNER32          _IOW('v',5, struct video_tuner32)
328
#define VIDIOCGWIN32            _IOR('v',9, struct video_window32)
329
#define VIDIOCSWIN32            _IOW('v',10, struct video_window32)
330
#define VIDIOCGFBUF32           _IOR('v',11, struct video_buffer32)
331
#define VIDIOCSFBUF32           _IOW('v',12, struct video_buffer32)
332
#define VIDIOCGFREQ32           _IOR('v',14, u32)
333
#define VIDIOCSFREQ32           _IOW('v',15, u32)
334
 
335
static int do_video_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
336
{
337
        union {
338
                struct video_tuner vt;
339
                struct video_buffer vb;
340
                struct video_window vw;
341
                unsigned long vx;
342
        } karg;
343
        mm_segment_t old_fs = get_fs();
344
        void *up = (void *)arg;
345
        int err = 0;
346
 
347
        /* First, convert the command. */
348
        switch(cmd) {
349
        case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break;
350
        case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break;
351
        case VIDIOCGWIN32: cmd = VIDIOCGWIN; break;
352
        case VIDIOCSWIN32: cmd = VIDIOCSWIN; break;
353
        case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break;
354
        case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break;
355
        case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break;
356
        case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break;
357
        };
358
 
359
        switch(cmd) {
360
        case VIDIOCSTUNER:
361
        case VIDIOCGTUNER:
362
                err = get_video_tuner32(&karg.vt, up);
363
                break;
364
 
365
        case VIDIOCSWIN:
366
                err = get_video_window32(&karg.vw, up);
367
                break;
368
 
369
        case VIDIOCSFBUF:
370
                err = get_video_buffer32(&karg.vb, up);
371
                break;
372
 
373
        case VIDIOCSFREQ:
374
                err = get_user(karg.vx, (u32 *)up);
375
                break;
376
        };
377
        if(err)
378
                goto out;
379
 
380
        set_fs(KERNEL_DS);
381
        err = sys_ioctl(fd, cmd, (unsigned long)&karg);
382
        set_fs(old_fs);
383
 
384
        if(cmd == VIDIOCSWIN)
385
                free_kvideo_clips(&karg.vw);
386
 
387
        if(err == 0) {
388
                switch(cmd) {
389
                case VIDIOCGTUNER:
390
                        err = put_video_tuner32(&karg.vt, up);
391
                        break;
392
 
393
                case VIDIOCGWIN:
394
                        err = put_video_window32(&karg.vw, up);
395
                        break;
396
 
397
                case VIDIOCGFBUF:
398
                        err = put_video_buffer32(&karg.vb, up);
399
                        break;
400
 
401
                case VIDIOCGFREQ:
402
                        err = put_user(((u32)karg.vx), (u32 *)up);
403
                        break;
404
                };
405
        }
406
out:
407
        return err;
408
}
409
 
410
struct timeval32 {
411
        int tv_sec;
412
        int tv_usec;
413
};
414
 
415
static int do_siocgstamp(unsigned int fd, unsigned int cmd, unsigned long arg)
416
{
417
        struct timeval32 *up = (struct timeval32 *)arg;
418
        struct timeval ktv;
419
        mm_segment_t old_fs = get_fs();
420
        int err;
421
 
422
        set_fs(KERNEL_DS);
423
        err = sys_ioctl(fd, cmd, (unsigned long)&ktv);
424
        set_fs(old_fs);
425
        if(!err) {
426
                err = put_user(ktv.tv_sec, &up->tv_sec);
427
                err |= __put_user(ktv.tv_usec, &up->tv_usec);
428
        }
429
        return err;
430
}
431
 
432
struct ifmap32 {
433
        u32 mem_start;
434
        u32 mem_end;
435
        unsigned short base_addr;
436
        unsigned char irq;
437
        unsigned char dma;
438
        unsigned char port;
439
};
440
 
441
struct ifreq32 {
442
#define IFHWADDRLEN     6
443
#define IFNAMSIZ        16
444
        union {
445
                char    ifrn_name[IFNAMSIZ];            /* if name, e.g. "en0" */
446
        } ifr_ifrn;
447
        union {
448
                struct  sockaddr ifru_addr;
449
                struct  sockaddr ifru_dstaddr;
450
                struct  sockaddr ifru_broadaddr;
451
                struct  sockaddr ifru_netmask;
452
                struct  sockaddr ifru_hwaddr;
453
                short   ifru_flags;
454
                int     ifru_ivalue;
455
                int     ifru_mtu;
456
                struct  ifmap32 ifru_map;
457
                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
458
                char    ifru_newname[IFNAMSIZ];
459
                __kernel_caddr_t32 ifru_data;
460
        } ifr_ifru;
461
};
462
 
463
struct ifconf32 {
464
        int     ifc_len;                        /* size of buffer       */
465
        __kernel_caddr_t32  ifcbuf;
466
};
467
 
468
#ifdef CONFIG_NET
469
static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
470
{
471
        struct net_device *dev;
472
        struct ifreq32 ifr32;
473
        int err;
474
 
475
        if (copy_from_user(&ifr32, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
476
                return -EFAULT;
477
 
478
        dev = dev_get_by_index(ifr32.ifr_ifindex);
479
        if (!dev)
480
                return -ENODEV;
481
 
482
        strcpy(ifr32.ifr_name, dev->name);
483
        dev_put(dev);
484
 
485
        err = copy_to_user((struct ifreq32 *)arg, &ifr32, sizeof(struct ifreq32));
486
        return (err ? -EFAULT : 0);
487
}
488
#endif
489
 
490
static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg)
491
{
492
        struct ifconf32 ifc32;
493
        struct ifconf ifc;
494
        struct ifreq32 *ifr32;
495
        struct ifreq *ifr;
496
        mm_segment_t old_fs;
497
        unsigned int i, j;
498
        int err;
499
 
500
        if (copy_from_user(&ifc32, (struct ifconf32 *)arg, sizeof(struct ifconf32)))
501
                return -EFAULT;
502
 
503
        if(ifc32.ifcbuf == 0) {
504
                ifc32.ifc_len = 0;
505
                ifc.ifc_len = 0;
506
                ifc.ifc_buf = NULL;
507
        } else {
508
                ifc.ifc_len = ((ifc32.ifc_len / sizeof (struct ifreq32)) + 1) *
509
                        sizeof (struct ifreq);
510
                ifc.ifc_buf = kmalloc (ifc.ifc_len, GFP_KERNEL);
511
                if (!ifc.ifc_buf)
512
                        return -ENOMEM;
513
        }
514
        ifr = ifc.ifc_req;
515
        ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
516
        for (i = 0; i < ifc32.ifc_len; i += sizeof (struct ifreq32)) {
517
                if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
518
                        kfree (ifc.ifc_buf);
519
                        return -EFAULT;
520
                }
521
        }
522
        old_fs = get_fs(); set_fs (KERNEL_DS);
523
        err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);
524
        set_fs (old_fs);
525
        if (!err) {
526
                ifr = ifc.ifc_req;
527
                ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
528
                for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len;
529
                     i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
530
                        if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
531
                                err = -EFAULT;
532
                                break;
533
                        }
534
                }
535
                if (!err) {
536
                        if (ifc32.ifcbuf == 0) {
537
                                /* Translate from 64-bit structure multiple to
538
                                 * a 32-bit one.
539
                                 */
540
                                i = ifc.ifc_len;
541
                                i = ((i / sizeof(struct ifreq)) * sizeof(struct ifreq32));
542
                                ifc32.ifc_len = i;
543
                        } else {
544
                                if (i <= ifc32.ifc_len)
545
                                        ifc32.ifc_len = i;
546
                                else
547
                                        ifc32.ifc_len = i - sizeof (struct ifreq32);
548
                        }
549
                        if (copy_to_user((struct ifconf32 *)arg, &ifc32, sizeof(struct ifconf32)))
550
                                err = -EFAULT;
551
                }
552
        }
553
        if(ifc.ifc_buf != NULL)
554
                kfree (ifc.ifc_buf);
555
        return err;
556
}
557
 
558
static __inline__ void *alloc_user_space(long len)
559
{
560
        struct pt_regs *regs = current->thread.kregs;
561
        unsigned long usp = regs->u_regs[UREG_I6];
562
 
563
        if (!(current->thread.flags & SPARC_FLAG_32BIT))
564
                usp += STACK_BIAS;
565
 
566
        return (void *) (usp - len);
567
}
568
 
569
static int ethtool_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
570
{
571
        struct ifreq *ifr;
572
        struct ifreq32 *ifr32;
573
        u32 data;
574
        void *datap;
575
 
576
        ifr = alloc_user_space(sizeof(*ifr));
577
        ifr32 = (struct ifreq32 *) arg;
578
 
579
        if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ))
580
                return -EFAULT;
581
 
582
        if (get_user(data, &ifr32->ifr_ifru.ifru_data))
583
                return -EFAULT;
584
 
585
        datap = (void *) (unsigned long) data;
586
        if (put_user(datap, &ifr->ifr_ifru.ifru_data))
587
                return -EFAULT;
588
 
589
        return sys_ioctl(fd, cmd, (unsigned long) ifr);
590
}
591
 
592
static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg)
593
{
594
        struct ifreq ifr;
595
        mm_segment_t old_fs;
596
        int err, len;
597
        u32 data;
598
 
599
        if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
600
                return -EFAULT;
601
        ifr.ifr_data = (__kernel_caddr_t)get_free_page(GFP_KERNEL);
602
        if (!ifr.ifr_data)
603
                return -EAGAIN;
604
 
605
        switch (cmd) {
606
        case SIOCBONDENSLAVE:
607
        case SIOCBONDRELEASE:
608
        case SIOCBONDSETHWADDR:
609
        case SIOCBONDCHANGEACTIVE:
610
                len = IFNAMSIZ * sizeof(char);
611
                break;
612
        case SIOCBONDSLAVEINFOQUERY:
613
                len = sizeof(struct ifslave);
614
                break;
615
        case SIOCBONDINFOQUERY:
616
                len = sizeof(struct ifbond);
617
                break;
618
        default:
619
                err = -EINVAL;
620
                goto out;
621
        };
622
 
623
        __get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
624
        if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
625
                err = -EFAULT;
626
                goto out;
627
        }
628
 
629
        old_fs = get_fs();
630
        set_fs (KERNEL_DS);
631
        err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
632
        set_fs (old_fs);
633
        if (!err) {
634
                len = copy_to_user((char *)A(data), ifr.ifr_data, len);
635
                if (len)
636
                        err = -EFAULT;
637
        }
638
 
639
out:
640
        free_page((unsigned long)ifr.ifr_data);
641
        return err;
642
}
643
 
644
static int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
645
{
646
        struct ifreq *u_ifreq64;
647
        struct ifreq32 *u_ifreq32 = (struct ifreq32 *) arg;
648
        char tmp_buf[IFNAMSIZ];
649
        void *data64;
650
        u32 data32;
651
 
652
        if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
653
                           IFNAMSIZ))
654
                return -EFAULT;
655
        if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
656
                return -EFAULT;
657
        data64 = (void *) A(data32);
658
 
659
        u_ifreq64 = alloc_user_space(sizeof(*u_ifreq64));
660
 
661
        /* Don't check these user accesses, just let that get trapped
662
         * in the ioctl handler instead.
663
         */
664
        copy_to_user(&u_ifreq64->ifr_ifrn.ifrn_name[0], &tmp_buf[0], IFNAMSIZ);
665
        __put_user(data64, &u_ifreq64->ifr_ifru.ifru_data);
666
 
667
        return sys_ioctl(fd, cmd, (unsigned long) u_ifreq64);
668
}
669
 
670
static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
671
{
672
        struct ifreq ifr;
673
        mm_segment_t old_fs;
674
        int err;
675
 
676
        switch (cmd) {
677
        case SIOCSIFMAP:
678
                err = copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(ifr.ifr_name));
679
                err |= __get_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
680
                err |= __get_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
681
                err |= __get_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
682
                err |= __get_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
683
                err |= __get_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
684
                err |= __get_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
685
                if (err)
686
                        return -EFAULT;
687
                break;
688
        default:
689
                if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
690
                        return -EFAULT;
691
                break;
692
        }
693
        old_fs = get_fs();
694
        set_fs (KERNEL_DS);
695
        err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
696
        set_fs (old_fs);
697
        if (!err) {
698
                switch (cmd) {
699
                case SIOCGIFFLAGS:
700
                case SIOCGIFMETRIC:
701
                case SIOCGIFMTU:
702
                case SIOCGIFMEM:
703
                case SIOCGIFHWADDR:
704
                case SIOCGIFINDEX:
705
                case SIOCGIFADDR:
706
                case SIOCGIFBRDADDR:
707
                case SIOCGIFDSTADDR:
708
                case SIOCGIFNETMASK:
709
                case SIOCGIFTXQLEN:
710
                        if (copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(struct ifreq32)))
711
                                return -EFAULT;
712
                        break;
713
                case SIOCGIFMAP:
714
                        err = copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(ifr.ifr_name));
715
                        err |= __put_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
716
                        err |= __put_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
717
                        err |= __put_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
718
                        err |= __put_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
719
                        err |= __put_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
720
                        err |= __put_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
721
                        if (err)
722
                                err = -EFAULT;
723
                        break;
724
                }
725
        }
726
        return err;
727
}
728
 
729
struct rtentry32 {
730
        u32             rt_pad1;
731
        struct sockaddr rt_dst;         /* target address               */
732
        struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
733
        struct sockaddr rt_genmask;     /* target network mask (IP)     */
734
        unsigned short  rt_flags;
735
        short           rt_pad2;
736
        u32             rt_pad3;
737
        unsigned char   rt_tos;
738
        unsigned char   rt_class;
739
        short           rt_pad4;
740
        short           rt_metric;      /* +1 for binary compatibility! */
741
        /* char * */ u32 rt_dev;        /* forcing the device at add    */
742
        u32             rt_mtu;         /* per route MTU/Window         */
743
        u32             rt_window;      /* Window clamping              */
744
        unsigned short  rt_irtt;        /* Initial RTT                  */
745
 
746
};
747
 
748
struct in6_rtmsg32 {
749
        struct in6_addr         rtmsg_dst;
750
        struct in6_addr         rtmsg_src;
751
        struct in6_addr         rtmsg_gateway;
752
        u32                     rtmsg_type;
753
        u16                     rtmsg_dst_len;
754
        u16                     rtmsg_src_len;
755
        u32                     rtmsg_metric;
756
        u32                     rtmsg_info;
757
        u32                     rtmsg_flags;
758
        s32                     rtmsg_ifindex;
759
};
760
 
761
extern struct socket *sockfd_lookup(int fd, int *err);
762
 
763
extern __inline__ void sockfd_put(struct socket *sock)
764
{
765
        fput(sock->file);
766
}
767
 
768
static int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
769
{
770
        int ret;
771
        void *r = NULL;
772
        struct in6_rtmsg r6;
773
        struct rtentry r4;
774
        char devname[16];
775
        u32 rtdev;
776
        mm_segment_t old_fs = get_fs();
777
 
778
        struct socket *mysock = sockfd_lookup(fd, &ret);
779
 
780
        if (mysock && mysock->sk && mysock->sk->family == AF_INET6) { /* ipv6 */
781
                ret = copy_from_user (&r6.rtmsg_dst, &(((struct in6_rtmsg32 *)arg)->rtmsg_dst),
782
                        3 * sizeof(struct in6_addr));
783
                ret |= __get_user (r6.rtmsg_type, &(((struct in6_rtmsg32 *)arg)->rtmsg_type));
784
                ret |= __get_user (r6.rtmsg_dst_len, &(((struct in6_rtmsg32 *)arg)->rtmsg_dst_len));
785
                ret |= __get_user (r6.rtmsg_src_len, &(((struct in6_rtmsg32 *)arg)->rtmsg_src_len));
786
                ret |= __get_user (r6.rtmsg_metric, &(((struct in6_rtmsg32 *)arg)->rtmsg_metric));
787
                ret |= __get_user (r6.rtmsg_info, &(((struct in6_rtmsg32 *)arg)->rtmsg_info));
788
                ret |= __get_user (r6.rtmsg_flags, &(((struct in6_rtmsg32 *)arg)->rtmsg_flags));
789
                ret |= __get_user (r6.rtmsg_ifindex, &(((struct in6_rtmsg32 *)arg)->rtmsg_ifindex));
790
 
791
                r = (void *) &r6;
792
        } else { /* ipv4 */
793
                ret = copy_from_user (&r4.rt_dst, &(((struct rtentry32 *)arg)->rt_dst), 3 * sizeof(struct sockaddr));
794
                ret |= __get_user (r4.rt_flags, &(((struct rtentry32 *)arg)->rt_flags));
795
                ret |= __get_user (r4.rt_metric, &(((struct rtentry32 *)arg)->rt_metric));
796
                ret |= __get_user (r4.rt_mtu, &(((struct rtentry32 *)arg)->rt_mtu));
797
                ret |= __get_user (r4.rt_window, &(((struct rtentry32 *)arg)->rt_window));
798
                ret |= __get_user (r4.rt_irtt, &(((struct rtentry32 *)arg)->rt_irtt));
799
                ret |= __get_user (rtdev, &(((struct rtentry32 *)arg)->rt_dev));
800
                if (rtdev) {
801
                        ret |= copy_from_user (devname, (char *)A(rtdev), 15);
802
                        r4.rt_dev = devname; devname[15] = 0;
803
                } else
804
                        r4.rt_dev = 0;
805
 
806
                r = (void *) &r4;
807
        }
808
 
809
        if (ret)
810
                return -EFAULT;
811
 
812
        set_fs (KERNEL_DS);
813
        ret = sys_ioctl (fd, cmd, (long) r);
814
        set_fs (old_fs);
815
 
816
        if (mysock)
817
                sockfd_put(mysock);
818
 
819
        return ret;
820
}
821
 
822
struct hd_geometry32 {
823
        unsigned char heads;
824
        unsigned char sectors;
825
        unsigned short cylinders;
826
        u32 start;
827
};
828
 
829
static int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg)
830
{
831
        mm_segment_t old_fs = get_fs();
832
        struct hd_geometry geo;
833
        int err;
834
 
835
        set_fs (KERNEL_DS);
836
        err = sys_ioctl(fd, HDIO_GETGEO, (unsigned long)&geo);
837
        set_fs (old_fs);
838
        if (!err) {
839
                if (copy_to_user ((struct hd_geometry32 *)arg, &geo, 4) ||
840
                    __put_user (geo.start, &(((struct hd_geometry32 *)arg)->start)))
841
                        err = -EFAULT;
842
        }
843
        return err;
844
}
845
 
846
struct hd_big_geometry32 {
847
        unsigned char heads;
848
        unsigned char sectors;
849
        unsigned int cylinders;
850
        u32 start;
851
};
852
 
853
static int hdio_getgeo_big(unsigned int fd, unsigned int cmd, unsigned long arg)
854
{
855
        mm_segment_t old_fs = get_fs();
856
        struct hd_big_geometry geo;
857
        int err;
858
 
859
        set_fs (KERNEL_DS);
860
        err = sys_ioctl(fd, cmd, (unsigned long)&geo);
861
        set_fs (old_fs);
862
        if (!err) {
863
                struct hd_big_geometry32 *up = (struct hd_big_geometry32 *) arg;
864
 
865
                if (put_user(geo.heads, &up->heads) ||
866
                    __put_user(geo.sectors, &up->sectors) ||
867
                    __put_user(geo.cylinders, &up->cylinders) ||
868
                    __put_user(((u32) geo.start), &up->start))
869
                        err = -EFAULT;
870
        }
871
        return err;
872
}
873
 
874
struct  fbcmap32 {
875
        int             index;          /* first element (0 origin) */
876
        int             count;
877
        u32             red;
878
        u32             green;
879
        u32             blue;
880
};
881
 
882
#define FBIOPUTCMAP32   _IOW('F', 3, struct fbcmap32)
883
#define FBIOGETCMAP32   _IOW('F', 4, struct fbcmap32)
884
 
885
static int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg)
886
{
887
        struct fbcmap f;
888
        int ret;
889
        char red[256], green[256], blue[256];
890
        u32 r, g, b;
891
        mm_segment_t old_fs = get_fs();
892
 
893
        ret = get_user(f.index, &(((struct fbcmap32 *)arg)->index));
894
        ret |= __get_user(f.count, &(((struct fbcmap32 *)arg)->count));
895
        ret |= __get_user(r, &(((struct fbcmap32 *)arg)->red));
896
        ret |= __get_user(g, &(((struct fbcmap32 *)arg)->green));
897
        ret |= __get_user(b, &(((struct fbcmap32 *)arg)->blue));
898
        if (ret)
899
                return -EFAULT;
900
        if ((f.index < 0) || (f.index > 255)) return -EINVAL;
901
        if (f.index + f.count > 256)
902
                f.count = 256 - f.index;
903
        if (cmd == FBIOPUTCMAP32) {
904
                ret = copy_from_user (red, (char *)A(r), f.count);
905
                ret |= copy_from_user (green, (char *)A(g), f.count);
906
                ret |= copy_from_user (blue, (char *)A(b), f.count);
907
                if (ret)
908
                        return -EFAULT;
909
        }
910
        f.red = red; f.green = green; f.blue = blue;
911
        set_fs (KERNEL_DS);
912
        ret = sys_ioctl (fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (long)&f);
913
        set_fs (old_fs);
914
        if (!ret && cmd == FBIOGETCMAP32) {
915
                ret = copy_to_user ((char *)A(r), red, f.count);
916
                ret |= copy_to_user ((char *)A(g), green, f.count);
917
                ret |= copy_to_user ((char *)A(b), blue, f.count);
918
        }
919
        return ret ? -EFAULT : 0;
920
}
921
 
922
struct fbcursor32 {
923
        short set;              /* what to set, choose from the list above */
924
        short enable;           /* cursor on/off */
925
        struct fbcurpos pos;    /* cursor position */
926
        struct fbcurpos hot;    /* cursor hot spot */
927
        struct fbcmap32 cmap;   /* color map info */
928
        struct fbcurpos size;   /* cursor bit map size */
929
        u32     image;          /* cursor image bits */
930
        u32     mask;           /* cursor mask bits */
931
};
932
 
933
#define FBIOSCURSOR32   _IOW('F', 24, struct fbcursor32)
934
#define FBIOGCURSOR32   _IOW('F', 25, struct fbcursor32)
935
 
936
static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
937
{
938
        struct fbcursor f;
939
        int ret;
940
        char red[2], green[2], blue[2];
941
        char image[128], mask[128];
942
        u32 r, g, b;
943
        u32 m, i;
944
        mm_segment_t old_fs = get_fs();
945
 
946
        ret = copy_from_user (&f, (struct fbcursor32 *)arg, 2 * sizeof (short) + 2 * sizeof(struct fbcurpos));
947
        ret |= __get_user(f.size.fbx, &(((struct fbcursor32 *)arg)->size.fbx));
948
        ret |= __get_user(f.size.fby, &(((struct fbcursor32 *)arg)->size.fby));
949
        ret |= __get_user(f.cmap.index, &(((struct fbcursor32 *)arg)->cmap.index));
950
        ret |= __get_user(f.cmap.count, &(((struct fbcursor32 *)arg)->cmap.count));
951
        ret |= __get_user(r, &(((struct fbcursor32 *)arg)->cmap.red));
952
        ret |= __get_user(g, &(((struct fbcursor32 *)arg)->cmap.green));
953
        ret |= __get_user(b, &(((struct fbcursor32 *)arg)->cmap.blue));
954
        ret |= __get_user(m, &(((struct fbcursor32 *)arg)->mask));
955
        ret |= __get_user(i, &(((struct fbcursor32 *)arg)->image));
956
        if (ret)
957
                return -EFAULT;
958
        if (f.set & FB_CUR_SETCMAP) {
959
                if ((uint) f.size.fby > 32)
960
                        return -EINVAL;
961
                ret = copy_from_user (mask, (char *)A(m), f.size.fby * 4);
962
                ret |= copy_from_user (image, (char *)A(i), f.size.fby * 4);
963
                if (ret)
964
                        return -EFAULT;
965
                f.image = image; f.mask = mask;
966
        }
967
        if (f.set & FB_CUR_SETCMAP) {
968
                ret = copy_from_user (red, (char *)A(r), 2);
969
                ret |= copy_from_user (green, (char *)A(g), 2);
970
                ret |= copy_from_user (blue, (char *)A(b), 2);
971
                if (ret)
972
                        return -EFAULT;
973
                f.cmap.red = red; f.cmap.green = green; f.cmap.blue = blue;
974
        }
975
        set_fs (KERNEL_DS);
976
        ret = sys_ioctl (fd, FBIOSCURSOR, (long)&f);
977
        set_fs (old_fs);
978
        return ret;
979
}
980
 
981
struct fb_fix_screeninfo32 {
982
        char                    id[16];
983
        __kernel_caddr_t32      smem_start;
984
        __u32                   smem_len;
985
        __u32                   type;
986
        __u32                   type_aux;
987
        __u32                   visual;
988
        __u16                   xpanstep;
989
        __u16                   ypanstep;
990
        __u16                   ywrapstep;
991
        __u32                   line_length;
992
        __kernel_caddr_t32      mmio_start;
993
        __u32                   mmio_len;
994
        __u32                   accel;
995
        __u16                   reserved[3];
996
};
997
 
998
struct fb_cmap32 {
999
        __u32                   start;
1000
        __u32                   len;
1001
        __kernel_caddr_t32      red;
1002
        __kernel_caddr_t32      green;
1003
        __kernel_caddr_t32      blue;
1004
        __kernel_caddr_t32      transp;
1005
};
1006
 
1007
static int do_cmap_ptr(__u16 **ptr64, __u32 *ptr32)
1008
{
1009
        __u32 data;
1010
        void *datap;
1011
 
1012
        if (get_user(data, ptr32))
1013
                return -EFAULT;
1014
        datap = (void *) (unsigned long) data;
1015
        if (put_user(datap, ptr64))
1016
                return -EFAULT;
1017
        return 0;
1018
}
1019
 
1020
static int fb_getput_cmap(unsigned int fd, unsigned int cmd, unsigned long arg)
1021
{
1022
        struct fb_cmap *cmap;
1023
        struct fb_cmap32 *cmap32;
1024
        int err;
1025
 
1026
        cmap = alloc_user_space(sizeof(*cmap));
1027
        cmap32 = (struct fb_cmap32 *) arg;
1028
 
1029
        if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32)))
1030
                return -EFAULT;
1031
 
1032
        if (do_cmap_ptr(&cmap->red, &cmap32->red) ||
1033
            do_cmap_ptr(&cmap->green, &cmap32->green) ||
1034
            do_cmap_ptr(&cmap->blue, &cmap32->blue) ||
1035
            do_cmap_ptr(&cmap->transp, &cmap32->transp))
1036
                return -EFAULT;
1037
 
1038
        err = sys_ioctl(fd, cmd, (unsigned long) cmap);
1039
 
1040
        if (!err) {
1041
                if (copy_in_user(&cmap32->start,
1042
                                 &cmap->start,
1043
                                 2 * sizeof(__u32)))
1044
                        err = -EFAULT;
1045
        }
1046
        return err;
1047
}
1048
 
1049
static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix,
1050
                                  struct fb_fix_screeninfo32 *fix32)
1051
{
1052
        __u32 data;
1053
        int err;
1054
 
1055
        err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id));
1056
 
1057
        data = (__u32) (unsigned long) fix->smem_start;
1058
        err |= put_user(data, &fix32->smem_start);
1059
 
1060
        err |= put_user(fix->smem_len, &fix32->smem_len);
1061
        err |= put_user(fix->type, &fix32->type);
1062
        err |= put_user(fix->type_aux, &fix32->type_aux);
1063
        err |= put_user(fix->visual, &fix32->visual);
1064
        err |= put_user(fix->xpanstep, &fix32->xpanstep);
1065
        err |= put_user(fix->ypanstep, &fix32->ypanstep);
1066
        err |= put_user(fix->ywrapstep, &fix32->ywrapstep);
1067
        err |= put_user(fix->line_length, &fix32->line_length);
1068
 
1069
        data = (__u32) (unsigned long) fix->mmio_start;
1070
        err |= put_user(data, &fix32->mmio_start);
1071
 
1072
        err |= put_user(fix->mmio_len, &fix32->mmio_len);
1073
        err |= put_user(fix->accel, &fix32->accel);
1074
        err |= copy_to_user(fix32->reserved, fix->reserved,
1075
                            sizeof(fix->reserved));
1076
 
1077
        return err;
1078
}
1079
 
1080
static int fb_get_fscreeninfo(unsigned int fd, unsigned int cmd, unsigned long arg)
1081
{
1082
        mm_segment_t old_fs;
1083
        struct fb_fix_screeninfo fix;
1084
        struct fb_fix_screeninfo32 *fix32;
1085
        int err;
1086
 
1087
        fix32 = (struct fb_fix_screeninfo32 *) arg;
1088
 
1089
        old_fs = get_fs();
1090
        set_fs(KERNEL_DS);
1091
        err = sys_ioctl(fd, cmd, (unsigned long) &fix);
1092
        set_fs(old_fs);
1093
 
1094
        if (!err)
1095
                err = do_fscreeninfo_to_user(&fix, fix32);
1096
 
1097
        return err;
1098
}
1099
 
1100
static int fb_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1101
{
1102
        int err;
1103
 
1104
        switch (cmd) {
1105
        case FBIOGET_FSCREENINFO:
1106
                err = fb_get_fscreeninfo(fd,cmd, arg);
1107
                break;
1108
 
1109
        case FBIOGETCMAP:
1110
        case FBIOPUTCMAP:
1111
                err = fb_getput_cmap(fd, cmd, arg);
1112
                break;
1113
 
1114
        default:
1115
                do {
1116
                        static int count;
1117
                        if (++count <= 20)
1118
                                printk("%s: Unknown fb ioctl cmd fd(%d) "
1119
                                       "cmd(%08x) arg(%08lx)\n",
1120
                                       __FUNCTION__, fd, cmd, arg);
1121
                } while(0);
1122
                err = -ENOSYS;
1123
                break;
1124
        };
1125
 
1126
        return err;
1127
}
1128
 
1129
static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1130
{
1131
        mm_segment_t old_fs = get_fs();
1132
        unsigned long kval;
1133
        unsigned int *uvp;
1134
        int error;
1135
 
1136
        set_fs(KERNEL_DS);
1137
        error = sys_ioctl(fd, cmd, (long)&kval);
1138
        set_fs(old_fs);
1139
 
1140
        if(error == 0) {
1141
                uvp = (unsigned int *)arg;
1142
                if(put_user(kval, uvp))
1143
                        error = -EFAULT;
1144
        }
1145
        return error;
1146
}
1147
 
1148
struct floppy_struct32 {
1149
        unsigned int    size;
1150
        unsigned int    sect;
1151
        unsigned int    head;
1152
        unsigned int    track;
1153
        unsigned int    stretch;
1154
        unsigned char   gap;
1155
        unsigned char   rate;
1156
        unsigned char   spec1;
1157
        unsigned char   fmt_gap;
1158
        const __kernel_caddr_t32 name;
1159
};
1160
 
1161
struct floppy_drive_params32 {
1162
        char            cmos;
1163
        u32             max_dtr;
1164
        u32             hlt;
1165
        u32             hut;
1166
        u32             srt;
1167
        u32             spinup;
1168
        u32             spindown;
1169
        unsigned char   spindown_offset;
1170
        unsigned char   select_delay;
1171
        unsigned char   rps;
1172
        unsigned char   tracks;
1173
        u32             timeout;
1174
        unsigned char   interleave_sect;
1175
        struct floppy_max_errors max_errors;
1176
        char            flags;
1177
        char            read_track;
1178
        short           autodetect[8];
1179
        int             checkfreq;
1180
        int             native_format;
1181
};
1182
 
1183
struct floppy_drive_struct32 {
1184
        signed char     flags;
1185
        u32             spinup_date;
1186
        u32             select_date;
1187
        u32             first_read_date;
1188
        short           probed_format;
1189
        short           track;
1190
        short           maxblock;
1191
        short           maxtrack;
1192
        int             generation;
1193
        int             keep_data;
1194
        int             fd_ref;
1195
        int             fd_device;
1196
        int             last_checked;
1197
        __kernel_caddr_t32 dmabuf;
1198
        int             bufblocks;
1199
};
1200
 
1201
struct floppy_fdc_state32 {
1202
        int             spec1;
1203
        int             spec2;
1204
        int             dtr;
1205
        unsigned char   version;
1206
        unsigned char   dor;
1207
        u32             address;
1208
        unsigned int    rawcmd:2;
1209
        unsigned int    reset:1;
1210
        unsigned int    need_configure:1;
1211
        unsigned int    perp_mode:2;
1212
        unsigned int    has_fifo:1;
1213
        unsigned int    driver_version;
1214
        unsigned char   track[4];
1215
};
1216
 
1217
struct floppy_write_errors32 {
1218
        unsigned int    write_errors;
1219
        u32             first_error_sector;
1220
        int             first_error_generation;
1221
        u32             last_error_sector;
1222
        int             last_error_generation;
1223
        unsigned int    badness;
1224
};
1225
 
1226
#define FDSETPRM32 _IOW(2, 0x42, struct floppy_struct32)
1227
#define FDDEFPRM32 _IOW(2, 0x43, struct floppy_struct32)
1228
#define FDGETPRM32 _IOR(2, 0x04, struct floppy_struct32)
1229
#define FDSETDRVPRM32 _IOW(2, 0x90, struct floppy_drive_params32)
1230
#define FDGETDRVPRM32 _IOR(2, 0x11, struct floppy_drive_params32)
1231
#define FDGETDRVSTAT32 _IOR(2, 0x12, struct floppy_drive_struct32)
1232
#define FDPOLLDRVSTAT32 _IOR(2, 0x13, struct floppy_drive_struct32)
1233
#define FDGETFDCSTAT32 _IOR(2, 0x15, struct floppy_fdc_state32)
1234
#define FDWERRORGET32  _IOR(2, 0x17, struct floppy_write_errors32)
1235
 
1236
static struct {
1237
        unsigned int    cmd32;
1238
        unsigned int    cmd;
1239
} fd_ioctl_trans_table[] = {
1240
        { FDSETPRM32, FDSETPRM },
1241
        { FDDEFPRM32, FDDEFPRM },
1242
        { FDGETPRM32, FDGETPRM },
1243
        { FDSETDRVPRM32, FDSETDRVPRM },
1244
        { FDGETDRVPRM32, FDGETDRVPRM },
1245
        { FDGETDRVSTAT32, FDGETDRVSTAT },
1246
        { FDPOLLDRVSTAT32, FDPOLLDRVSTAT },
1247
        { FDGETFDCSTAT32, FDGETFDCSTAT },
1248
        { FDWERRORGET32, FDWERRORGET }
1249
};
1250
 
1251
#define NR_FD_IOCTL_TRANS (sizeof(fd_ioctl_trans_table)/sizeof(fd_ioctl_trans_table[0]))
1252
 
1253
static int fd_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1254
{
1255
        mm_segment_t old_fs = get_fs();
1256
        void *karg = NULL;
1257
        unsigned int kcmd = 0;
1258
        int i, err;
1259
 
1260
        for (i = 0; i < NR_FD_IOCTL_TRANS; i++)
1261
                if (cmd == fd_ioctl_trans_table[i].cmd32) {
1262
                        kcmd = fd_ioctl_trans_table[i].cmd;
1263
                        break;
1264
                }
1265
        if (!kcmd)
1266
                return -EINVAL;
1267
 
1268
        switch (cmd) {
1269
                case FDSETPRM32:
1270
                case FDDEFPRM32:
1271
                case FDGETPRM32:
1272
                {
1273
                        struct floppy_struct *f;
1274
 
1275
                        f = karg = kmalloc(sizeof(struct floppy_struct), GFP_KERNEL);
1276
                        if (!karg)
1277
                                return -ENOMEM;
1278
                        if (cmd == FDGETPRM32)
1279
                                break;
1280
                        err = __get_user(f->size, &((struct floppy_struct32 *)arg)->size);
1281
                        err |= __get_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
1282
                        err |= __get_user(f->head, &((struct floppy_struct32 *)arg)->head);
1283
                        err |= __get_user(f->track, &((struct floppy_struct32 *)arg)->track);
1284
                        err |= __get_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
1285
                        err |= __get_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
1286
                        err |= __get_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
1287
                        err |= __get_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
1288
                        err |= __get_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
1289
                        err |= __get_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
1290
                        if (err) {
1291
                                err = -EFAULT;
1292
                                goto out;
1293
                        }
1294
                        break;
1295
                }
1296
                case FDSETDRVPRM32:
1297
                case FDGETDRVPRM32:
1298
                {
1299
                        struct floppy_drive_params *f;
1300
 
1301
                        f = karg = kmalloc(sizeof(struct floppy_drive_params), GFP_KERNEL);
1302
                        if (!karg)
1303
                                return -ENOMEM;
1304
                        if (cmd == FDGETDRVPRM32)
1305
                                break;
1306
                        err = __get_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
1307
                        err |= __get_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
1308
                        err |= __get_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
1309
                        err |= __get_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
1310
                        err |= __get_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
1311
                        err |= __get_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
1312
                        err |= __get_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
1313
                        err |= __get_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
1314
                        err |= __get_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
1315
                        err |= __get_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
1316
                        err |= __get_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
1317
                        err |= __get_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
1318
                        err |= __get_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
1319
                        err |= __copy_from_user(&f->max_errors, &((struct floppy_drive_params32 *)arg)->max_errors, sizeof(f->max_errors));
1320
                        err |= __get_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
1321
                        err |= __get_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
1322
                        err |= __copy_from_user(f->autodetect, ((struct floppy_drive_params32 *)arg)->autodetect, sizeof(f->autodetect));
1323
                        err |= __get_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
1324
                        err |= __get_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
1325
                        if (err) {
1326
                                err = -EFAULT;
1327
                                goto out;
1328
                        }
1329
                        break;
1330
                }
1331
                case FDGETDRVSTAT32:
1332
                case FDPOLLDRVSTAT32:
1333
                        karg = kmalloc(sizeof(struct floppy_drive_struct), GFP_KERNEL);
1334
                        if (!karg)
1335
                                return -ENOMEM;
1336
                        break;
1337
                case FDGETFDCSTAT32:
1338
                        karg = kmalloc(sizeof(struct floppy_fdc_state), GFP_KERNEL);
1339
                        if (!karg)
1340
                                return -ENOMEM;
1341
                        break;
1342
                case FDWERRORGET32:
1343
                        karg = kmalloc(sizeof(struct floppy_write_errors), GFP_KERNEL);
1344
                        if (!karg)
1345
                                return -ENOMEM;
1346
                        break;
1347
                default:
1348
                        return -EINVAL;
1349
        }
1350
        set_fs (KERNEL_DS);
1351
        err = sys_ioctl (fd, kcmd, (unsigned long)karg);
1352
        set_fs (old_fs);
1353
        if (err)
1354
                goto out;
1355
        switch (cmd) {
1356
                case FDGETPRM32:
1357
                {
1358
                        struct floppy_struct *f = karg;
1359
 
1360
                        err = __put_user(f->size, &((struct floppy_struct32 *)arg)->size);
1361
                        err |= __put_user(f->sect, &((struct floppy_struct32 *)arg)->sect);
1362
                        err |= __put_user(f->head, &((struct floppy_struct32 *)arg)->head);
1363
                        err |= __put_user(f->track, &((struct floppy_struct32 *)arg)->track);
1364
                        err |= __put_user(f->stretch, &((struct floppy_struct32 *)arg)->stretch);
1365
                        err |= __put_user(f->gap, &((struct floppy_struct32 *)arg)->gap);
1366
                        err |= __put_user(f->rate, &((struct floppy_struct32 *)arg)->rate);
1367
                        err |= __put_user(f->spec1, &((struct floppy_struct32 *)arg)->spec1);
1368
                        err |= __put_user(f->fmt_gap, &((struct floppy_struct32 *)arg)->fmt_gap);
1369
                        err |= __put_user((u64)f->name, &((struct floppy_struct32 *)arg)->name);
1370
                        break;
1371
                }
1372
                case FDGETDRVPRM32:
1373
                {
1374
                        struct floppy_drive_params *f = karg;
1375
 
1376
                        err = __put_user(f->cmos, &((struct floppy_drive_params32 *)arg)->cmos);
1377
                        err |= __put_user(f->max_dtr, &((struct floppy_drive_params32 *)arg)->max_dtr);
1378
                        err |= __put_user(f->hlt, &((struct floppy_drive_params32 *)arg)->hlt);
1379
                        err |= __put_user(f->hut, &((struct floppy_drive_params32 *)arg)->hut);
1380
                        err |= __put_user(f->srt, &((struct floppy_drive_params32 *)arg)->srt);
1381
                        err |= __put_user(f->spinup, &((struct floppy_drive_params32 *)arg)->spinup);
1382
                        err |= __put_user(f->spindown, &((struct floppy_drive_params32 *)arg)->spindown);
1383
                        err |= __put_user(f->spindown_offset, &((struct floppy_drive_params32 *)arg)->spindown_offset);
1384
                        err |= __put_user(f->select_delay, &((struct floppy_drive_params32 *)arg)->select_delay);
1385
                        err |= __put_user(f->rps, &((struct floppy_drive_params32 *)arg)->rps);
1386
                        err |= __put_user(f->tracks, &((struct floppy_drive_params32 *)arg)->tracks);
1387
                        err |= __put_user(f->timeout, &((struct floppy_drive_params32 *)arg)->timeout);
1388
                        err |= __put_user(f->interleave_sect, &((struct floppy_drive_params32 *)arg)->interleave_sect);
1389
                        err |= __copy_to_user(&((struct floppy_drive_params32 *)arg)->max_errors, &f->max_errors, sizeof(f->max_errors));
1390
                        err |= __put_user(f->flags, &((struct floppy_drive_params32 *)arg)->flags);
1391
                        err |= __put_user(f->read_track, &((struct floppy_drive_params32 *)arg)->read_track);
1392
                        err |= __copy_to_user(((struct floppy_drive_params32 *)arg)->autodetect, f->autodetect, sizeof(f->autodetect));
1393
                        err |= __put_user(f->checkfreq, &((struct floppy_drive_params32 *)arg)->checkfreq);
1394
                        err |= __put_user(f->native_format, &((struct floppy_drive_params32 *)arg)->native_format);
1395
                        break;
1396
                }
1397
                case FDGETDRVSTAT32:
1398
                case FDPOLLDRVSTAT32:
1399
                {
1400
                        struct floppy_drive_struct *f = karg;
1401
 
1402
                        err = __put_user(f->flags, &((struct floppy_drive_struct32 *)arg)->flags);
1403
                        err |= __put_user(f->spinup_date, &((struct floppy_drive_struct32 *)arg)->spinup_date);
1404
                        err |= __put_user(f->select_date, &((struct floppy_drive_struct32 *)arg)->select_date);
1405
                        err |= __put_user(f->first_read_date, &((struct floppy_drive_struct32 *)arg)->first_read_date);
1406
                        err |= __put_user(f->probed_format, &((struct floppy_drive_struct32 *)arg)->probed_format);
1407
                        err |= __put_user(f->track, &((struct floppy_drive_struct32 *)arg)->track);
1408
                        err |= __put_user(f->maxblock, &((struct floppy_drive_struct32 *)arg)->maxblock);
1409
                        err |= __put_user(f->maxtrack, &((struct floppy_drive_struct32 *)arg)->maxtrack);
1410
                        err |= __put_user(f->generation, &((struct floppy_drive_struct32 *)arg)->generation);
1411
                        err |= __put_user(f->keep_data, &((struct floppy_drive_struct32 *)arg)->keep_data);
1412
                        err |= __put_user(f->fd_ref, &((struct floppy_drive_struct32 *)arg)->fd_ref);
1413
                        err |= __put_user(f->fd_device, &((struct floppy_drive_struct32 *)arg)->fd_device);
1414
                        err |= __put_user(f->last_checked, &((struct floppy_drive_struct32 *)arg)->last_checked);
1415
                        err |= __put_user((u64)f->dmabuf, &((struct floppy_drive_struct32 *)arg)->dmabuf);
1416
                        err |= __put_user((u64)f->bufblocks, &((struct floppy_drive_struct32 *)arg)->bufblocks);
1417
                        break;
1418
                }
1419
                case FDGETFDCSTAT32:
1420
                {
1421
                        struct floppy_fdc_state *f = karg;
1422
 
1423
                        err = __put_user(f->spec1, &((struct floppy_fdc_state32 *)arg)->spec1);
1424
                        err |= __put_user(f->spec2, &((struct floppy_fdc_state32 *)arg)->spec2);
1425
                        err |= __put_user(f->dtr, &((struct floppy_fdc_state32 *)arg)->dtr);
1426
                        err |= __put_user(f->version, &((struct floppy_fdc_state32 *)arg)->version);
1427
                        err |= __put_user(f->dor, &((struct floppy_fdc_state32 *)arg)->dor);
1428
                        err |= __put_user(f->address, &((struct floppy_fdc_state32 *)arg)->address);
1429
                        err |= __copy_to_user((char *)&((struct floppy_fdc_state32 *)arg)->address
1430
                                           + sizeof(((struct floppy_fdc_state32 *)arg)->address),
1431
                                           (char *)&f->address + sizeof(f->address), sizeof(int));
1432
                        err |= __put_user(f->driver_version, &((struct floppy_fdc_state32 *)arg)->driver_version);
1433
                        err |= __copy_to_user(((struct floppy_fdc_state32 *)arg)->track, f->track, sizeof(f->track));
1434
                        break;
1435
                }
1436
                case FDWERRORGET32:
1437
                {
1438
                        struct floppy_write_errors *f = karg;
1439
 
1440
                        err = __put_user(f->write_errors, &((struct floppy_write_errors32 *)arg)->write_errors);
1441
                        err |= __put_user(f->first_error_sector, &((struct floppy_write_errors32 *)arg)->first_error_sector);
1442
                        err |= __put_user(f->first_error_generation, &((struct floppy_write_errors32 *)arg)->first_error_generation);
1443
                        err |= __put_user(f->last_error_sector, &((struct floppy_write_errors32 *)arg)->last_error_sector);
1444
                        err |= __put_user(f->last_error_generation, &((struct floppy_write_errors32 *)arg)->last_error_generation);
1445
                        err |= __put_user(f->badness, &((struct floppy_write_errors32 *)arg)->badness);
1446
                        break;
1447
                }
1448
                default:
1449
                        break;
1450
        }
1451
        if (err)
1452
                err = -EFAULT;
1453
 
1454
out:    if (karg) kfree(karg);
1455
        return err;
1456
}
1457
 
1458
typedef struct sg_io_hdr32 {
1459
        s32 interface_id;       /* [i] 'S' for SCSI generic (required) */
1460
        s32 dxfer_direction;    /* [i] data transfer direction  */
1461
        u8  cmd_len;            /* [i] SCSI command length ( <= 16 bytes) */
1462
        u8  mx_sb_len;          /* [i] max length to write to sbp */
1463
        u16 iovec_count;        /* [i] 0 implies no scatter gather */
1464
        u32 dxfer_len;          /* [i] byte count of data transfer */
1465
        u32 dxferp;             /* [i], [*io] points to data transfer memory
1466
                                              or scatter gather list */
1467
        u32 cmdp;               /* [i], [*i] points to command to perform */
1468
        u32 sbp;                /* [i], [*o] points to sense_buffer memory */
1469
        u32 timeout;            /* [i] MAX_UINT->no timeout (unit: millisec) */
1470
        u32 flags;              /* [i] 0 -> default, see SG_FLAG... */
1471
        s32 pack_id;            /* [i->o] unused internally (normally) */
1472
        u32 usr_ptr;            /* [i->o] unused internally */
1473
        u8  status;             /* [o] scsi status */
1474
        u8  masked_status;      /* [o] shifted, masked scsi status */
1475
        u8  msg_status;         /* [o] messaging level data (optional) */
1476
        u8  sb_len_wr;          /* [o] byte count actually written to sbp */
1477
        u16 host_status;        /* [o] errors from host adapter */
1478
        u16 driver_status;      /* [o] errors from software driver */
1479
        s32 resid;              /* [o] dxfer_len - actual_transferred */
1480
        u32 duration;           /* [o] time taken by cmd (unit: millisec) */
1481
        u32 info;               /* [o] auxiliary information */
1482
} sg_io_hdr32_t;  /* 64 bytes long (on sparc32) */
1483
 
1484
typedef struct sg_iovec32 {
1485
        u32 iov_base;
1486
        u32 iov_len;
1487
} sg_iovec32_t;
1488
 
1489
static int sg_build_iovec(sg_io_hdr_t *sgio, void *dxferp, u16 iovec_count)
1490
{
1491
        sg_iovec_t *iov = (sg_iovec_t *) (sgio + 1);
1492
        sg_iovec32_t *iov32 = dxferp;
1493
        int i;
1494
 
1495
        for (i = 0; i < iovec_count; i++) {
1496
                u32 base, len;
1497
 
1498
                if (get_user(base, &iov32[i].iov_base) ||
1499
                    get_user(len, &iov32[i].iov_len) ||
1500
                    put_user((void *)(unsigned long)base, &iov[i].iov_base) ||
1501
                    put_user(len, &iov[i].iov_len))
1502
                        return -EFAULT;
1503
        }
1504
 
1505
        return 0;
1506
}
1507
 
1508
static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1509
{
1510
        sg_io_hdr_t *sgio;
1511
        sg_io_hdr32_t *sgio32;
1512
        u16 iovec_count;
1513
        u32 data;
1514
        void *dxferp;
1515
        int err;
1516
 
1517
        sgio32 = (sg_io_hdr32_t *) arg;
1518
        if (get_user(iovec_count, &sgio32->iovec_count))
1519
                return -EFAULT;
1520
 
1521
        {
1522
                void *new, *top;
1523
 
1524
                top = alloc_user_space(0);
1525
                new = alloc_user_space(sizeof(sg_io_hdr_t) +
1526
                                       (iovec_count *
1527
                                        sizeof(sg_iovec_t)));
1528
                if (new > top)
1529
                        return -EINVAL;
1530
 
1531
                sgio = new;
1532
        }
1533
 
1534
        /* Ok, now construct.  */
1535
        if (copy_in_user(&sgio->interface_id, &sgio32->interface_id,
1536
                         (2 * sizeof(int)) +
1537
                         (2 * sizeof(unsigned char)) +
1538
                         (1 * sizeof(unsigned short)) +
1539
                         (1 * sizeof(unsigned int))))
1540
                return -EFAULT;
1541
 
1542
        if (get_user(data, &sgio32->dxferp))
1543
                return -EFAULT;
1544
        dxferp = (void *) (unsigned long) data;
1545
        if (iovec_count) {
1546
                if (sg_build_iovec(sgio, dxferp, iovec_count))
1547
                        return -EFAULT;
1548
        } else {
1549
                if (put_user(dxferp, &sgio->dxferp))
1550
                        return -EFAULT;
1551
        }
1552
 
1553
        {
1554
                unsigned char *cmdp, *sbp;
1555
 
1556
                if (get_user(data, &sgio32->cmdp))
1557
                        return -EFAULT;
1558
                cmdp = (unsigned char *) (unsigned long) data;
1559
 
1560
                if (get_user(data, &sgio32->sbp))
1561
                        return -EFAULT;
1562
                sbp = (unsigned char *) (unsigned long) data;
1563
 
1564
                if (put_user(cmdp, &sgio->cmdp) ||
1565
                    put_user(sbp, &sgio->sbp))
1566
                        return -EFAULT;
1567
        }
1568
 
1569
        if (copy_in_user(&sgio->timeout, &sgio32->timeout,
1570
                         3 * sizeof(int)))
1571
                return -EFAULT;
1572
 
1573
        if (get_user(data, &sgio32->usr_ptr))
1574
                return -EFAULT;
1575
        if (put_user((void *)(unsigned long)data, &sgio->usr_ptr))
1576
                return -EFAULT;
1577
 
1578
        if (copy_in_user(&sgio->status, &sgio32->status,
1579
                         (4 * sizeof(unsigned char)) +
1580
                         (2 * sizeof(unsigned (short))) +
1581
                         (3 * sizeof(int))))
1582
                return -EFAULT;
1583
 
1584
        err = sys_ioctl(fd, cmd, (unsigned long) sgio);
1585
 
1586
        if (err >= 0) {
1587
                void *datap;
1588
 
1589
                if (copy_in_user(&sgio32->pack_id, &sgio->pack_id,
1590
                                 sizeof(int)) ||
1591
                    get_user(datap, &sgio->usr_ptr) ||
1592
                    put_user((u32)(unsigned long)datap,
1593
                             &sgio32->usr_ptr) ||
1594
                    copy_in_user(&sgio32->status, &sgio->status,
1595
                                 (4 * sizeof(unsigned char)) +
1596
                                 (2 * sizeof(unsigned short)) +
1597
                                 (3 * sizeof(int))))
1598
                        err = -EFAULT;
1599
        }
1600
 
1601
        return err;
1602
}
1603
 
1604
struct sock_fprog32 {
1605
        __u16   len;
1606
        __u32   filter;
1607
};
1608
 
1609
#define PPPIOCSPASS32   _IOW('t', 71, struct sock_fprog32)
1610
#define PPPIOCSACTIVE32 _IOW('t', 70, struct sock_fprog32)
1611
 
1612
static int ppp_sock_fprog_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1613
{
1614
        struct sock_fprog32 *u_fprog32 = (struct sock_fprog32 *) arg;
1615
        struct sock_fprog *u_fprog64 = alloc_user_space(sizeof(struct sock_fprog));
1616
        void *fptr64;
1617
        u32 fptr32;
1618
        u16 flen;
1619
 
1620
        if (get_user(flen, &u_fprog32->len) ||
1621
            get_user(fptr32, &u_fprog32->filter))
1622
                return -EFAULT;
1623
 
1624
        fptr64 = (void *) A(fptr32);
1625
 
1626
        if (put_user(flen, &u_fprog64->len) ||
1627
            put_user(fptr64, &u_fprog64->filter))
1628
                return -EFAULT;
1629
 
1630
        if (cmd == PPPIOCSPASS32)
1631
                cmd = PPPIOCSPASS;
1632
        else
1633
                cmd = PPPIOCSACTIVE;
1634
 
1635
        return sys_ioctl(fd, cmd, (unsigned long) u_fprog64);
1636
}
1637
 
1638
struct ppp_option_data32 {
1639
        __kernel_caddr_t32      ptr;
1640
        __u32                   length;
1641
        int                     transmit;
1642
};
1643
#define PPPIOCSCOMPRESS32       _IOW('t', 77, struct ppp_option_data32)
1644
 
1645
struct ppp_idle32 {
1646
        __kernel_time_t32 xmit_idle;
1647
        __kernel_time_t32 recv_idle;
1648
};
1649
#define PPPIOCGIDLE32           _IOR('t', 63, struct ppp_idle32)
1650
 
1651
static int ppp_gidle(unsigned int fd, unsigned int cmd, unsigned long arg)
1652
{
1653
        struct ppp_idle *idle;
1654
        struct ppp_idle32 *idle32;
1655
        __kernel_time_t xmit, recv;
1656
        int err;
1657
 
1658
        idle = alloc_user_space(sizeof(*idle));
1659
        idle32 = (struct ppp_idle32 *) arg;
1660
 
1661
        err = sys_ioctl(fd, PPPIOCGIDLE, (unsigned long) idle);
1662
 
1663
        if (!err) {
1664
                if (get_user(xmit, &idle->xmit_idle) ||
1665
                    get_user(recv, &idle->recv_idle) ||
1666
                    put_user(xmit, &idle32->xmit_idle) ||
1667
                    put_user(recv, &idle32->recv_idle))
1668
                        err = -EFAULT;
1669
        }
1670
        return err;
1671
}
1672
 
1673
static int ppp_scompress(unsigned int fd, unsigned int cmd, unsigned long arg)
1674
{
1675
        struct ppp_option_data *odata;
1676
        struct ppp_option_data32 *odata32;
1677
        __u32 data;
1678
        void *datap;
1679
 
1680
        odata = alloc_user_space(sizeof(*odata));
1681
        odata32 = (struct ppp_option_data32 *) arg;
1682
 
1683
        if (get_user(data, &odata32->ptr))
1684
                return -EFAULT;
1685
 
1686
        datap = (void *) (unsigned long) data;
1687
        if (put_user(datap, &odata->ptr))
1688
                return -EFAULT;
1689
 
1690
        if (copy_in_user(&odata->length, &odata32->length,
1691
                         sizeof(__u32) + sizeof(int)))
1692
                return -EFAULT;
1693
 
1694
        return sys_ioctl(fd, PPPIOCSCOMPRESS, (unsigned long) odata);
1695
}
1696
 
1697
static int ppp_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1698
{
1699
        int err;
1700
 
1701
        switch (cmd) {
1702
        case PPPIOCGIDLE32:
1703
                err = ppp_gidle(fd, cmd, arg);
1704
                break;
1705
 
1706
        case PPPIOCSCOMPRESS32:
1707
                err = ppp_scompress(fd, cmd, arg);
1708
                break;
1709
 
1710
        default:
1711
                do {
1712
                        static int count;
1713
                        if (++count <= 20)
1714
                                printk("ppp_ioctl: Unknown cmd fd(%d) "
1715
                                       "cmd(%08x) arg(%08x)\n",
1716
                                       (int)fd, (unsigned int)cmd, (unsigned int)arg);
1717
                } while(0);
1718
                err = -EINVAL;
1719
                break;
1720
        };
1721
 
1722
        return err;
1723
}
1724
 
1725
 
1726
struct mtget32 {
1727
        __u32   mt_type;
1728
        __u32   mt_resid;
1729
        __u32   mt_dsreg;
1730
        __u32   mt_gstat;
1731
        __u32   mt_erreg;
1732
        __kernel_daddr_t32      mt_fileno;
1733
        __kernel_daddr_t32      mt_blkno;
1734
};
1735
#define MTIOCGET32      _IOR('m', 2, struct mtget32)
1736
 
1737
struct mtpos32 {
1738
        __u32   mt_blkno;
1739
};
1740
#define MTIOCPOS32      _IOR('m', 3, struct mtpos32)
1741
 
1742
struct mtconfiginfo32 {
1743
        __u32   mt_type;
1744
        __u32   ifc_type;
1745
        __u16   irqnr;
1746
        __u16   dmanr;
1747
        __u16   port;
1748
        __u32   debug;
1749
        __u32   have_dens:1;
1750
        __u32   have_bsf:1;
1751
        __u32   have_fsr:1;
1752
        __u32   have_bsr:1;
1753
        __u32   have_eod:1;
1754
        __u32   have_seek:1;
1755
        __u32   have_tell:1;
1756
        __u32   have_ras1:1;
1757
        __u32   have_ras2:1;
1758
        __u32   have_ras3:1;
1759
        __u32   have_qfa:1;
1760
        __u32   pad1:5;
1761
        char    reserved[10];
1762
};
1763
#define MTIOCGETCONFIG32        _IOR('m', 4, struct mtconfiginfo32)
1764
#define MTIOCSETCONFIG32        _IOW('m', 5, struct mtconfiginfo32)
1765
 
1766
static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1767
{
1768
        mm_segment_t old_fs = get_fs();
1769
        struct mtconfiginfo info;
1770
        struct mtget get;
1771
        struct mtpos pos;
1772
        unsigned long kcmd;
1773
        void *karg;
1774
        int err = 0;
1775
 
1776
        switch(cmd) {
1777
        case MTIOCPOS32:
1778
                kcmd = MTIOCPOS;
1779
                karg = &pos;
1780
                break;
1781
        case MTIOCGET32:
1782
                kcmd = MTIOCGET;
1783
                karg = &get;
1784
                break;
1785
        case MTIOCGETCONFIG32:
1786
                kcmd = MTIOCGETCONFIG;
1787
                karg = &info;
1788
                break;
1789
        case MTIOCSETCONFIG32:
1790
                kcmd = MTIOCSETCONFIG;
1791
                karg = &info;
1792
                err = __get_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
1793
                err |= __get_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
1794
                err |= __get_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
1795
                err |= __get_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
1796
                err |= __get_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
1797
                err |= __get_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
1798
                err |= __copy_from_user((char *)&info.debug + sizeof(info.debug),
1799
                                     (char *)&((struct mtconfiginfo32 *)arg)->debug
1800
                                     + sizeof(((struct mtconfiginfo32 *)arg)->debug), sizeof(__u32));
1801
                if (err)
1802
                        return -EFAULT;
1803
                break;
1804
        default:
1805
                do {
1806
                        static int count;
1807
                        if (++count <= 20)
1808
                                printk("mt_ioctl: Unknown cmd fd(%d) "
1809
                                       "cmd(%08x) arg(%08x)\n",
1810
                                       (int)fd, (unsigned int)cmd, (unsigned int)arg);
1811
                } while(0);
1812
                return -EINVAL;
1813
        }
1814
        set_fs (KERNEL_DS);
1815
        err = sys_ioctl (fd, kcmd, (unsigned long)karg);
1816
        set_fs (old_fs);
1817
        if (err)
1818
                return err;
1819
        switch (cmd) {
1820
        case MTIOCPOS32:
1821
                err = __put_user(pos.mt_blkno, &((struct mtpos32 *)arg)->mt_blkno);
1822
                break;
1823
        case MTIOCGET32:
1824
                err = __put_user(get.mt_type, &((struct mtget32 *)arg)->mt_type);
1825
                err |= __put_user(get.mt_resid, &((struct mtget32 *)arg)->mt_resid);
1826
                err |= __put_user(get.mt_dsreg, &((struct mtget32 *)arg)->mt_dsreg);
1827
                err |= __put_user(get.mt_gstat, &((struct mtget32 *)arg)->mt_gstat);
1828
                err |= __put_user(get.mt_erreg, &((struct mtget32 *)arg)->mt_erreg);
1829
                err |= __put_user(get.mt_fileno, &((struct mtget32 *)arg)->mt_fileno);
1830
                err |= __put_user(get.mt_blkno, &((struct mtget32 *)arg)->mt_blkno);
1831
                break;
1832
        case MTIOCGETCONFIG32:
1833
                err = __put_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
1834
                err |= __put_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
1835
                err |= __put_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
1836
                err |= __put_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
1837
                err |= __put_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
1838
                err |= __put_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
1839
                err |= __copy_to_user((char *)&((struct mtconfiginfo32 *)arg)->debug
1840
                                           + sizeof(((struct mtconfiginfo32 *)arg)->debug),
1841
                                           (char *)&info.debug + sizeof(info.debug), sizeof(__u32));
1842
                break;
1843
        case MTIOCSETCONFIG32:
1844
                break;
1845
        }
1846
        return err ? -EFAULT: 0;
1847
}
1848
 
1849
struct cdrom_read_audio32 {
1850
        union cdrom_addr        addr;
1851
        u_char                  addr_format;
1852
        int                     nframes;
1853
        __kernel_caddr_t32      buf;
1854
};
1855
 
1856
struct cdrom_generic_command32 {
1857
        unsigned char           cmd[CDROM_PACKET_SIZE];
1858
        __kernel_caddr_t32      buffer;
1859
        unsigned int            buflen;
1860
        int                     stat;
1861
        __kernel_caddr_t32      sense;
1862
        unsigned char           data_direction;
1863
        int                     quiet;
1864
        int                     timeout;
1865
        __kernel_caddr_t32      reserved[1];
1866
};
1867
 
1868
static int cdrom_do_read_audio(unsigned int fd, unsigned int cmd, unsigned long arg)
1869
{
1870
        struct cdrom_read_audio *cdread_audio;
1871
        struct cdrom_read_audio32 *cdread_audio32;
1872
        __u32 data;
1873
        void *datap;
1874
 
1875
        cdread_audio = alloc_user_space(sizeof(*cdread_audio));
1876
        cdread_audio32 = (struct cdrom_read_audio32 *) arg;
1877
 
1878
        if (copy_in_user(&cdread_audio->addr,
1879
                         &cdread_audio32->addr,
1880
                         (sizeof(*cdread_audio32) -
1881
                          sizeof(__kernel_caddr_t32))))
1882
                return -EFAULT;
1883
 
1884
        if (get_user(data, &cdread_audio32->buf))
1885
                return -EFAULT;
1886
        datap = (void *) (unsigned long) data;
1887
        if (put_user(datap, &cdread_audio->buf))
1888
                return -EFAULT;
1889
 
1890
        return sys_ioctl(fd, cmd, (unsigned long) cdread_audio);
1891
}
1892
 
1893
static int __cgc_do_ptr(void **ptr64, __u32 *ptr32)
1894
{
1895
        u32 data;
1896
        void *datap;
1897
 
1898
        if (get_user(data, ptr32))
1899
                return -EFAULT;
1900
        datap = (void *) (unsigned long) data;
1901
        if (put_user(datap, ptr64))
1902
                return -EFAULT;
1903
 
1904
        return 0;
1905
}
1906
 
1907
static int cdrom_do_generic_command(unsigned int fd, unsigned int cmd, unsigned long arg)
1908
{
1909
        struct cdrom_generic_command *cgc;
1910
        struct cdrom_generic_command32 *cgc32;
1911
        unsigned char dir;
1912
 
1913
        cgc = alloc_user_space(sizeof(*cgc));
1914
        cgc32 = (struct cdrom_generic_command32 *) arg;
1915
 
1916
        if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) ||
1917
            __cgc_do_ptr((void **) &cgc->buffer, &cgc32->buffer) ||
1918
            copy_in_user(&cgc->buflen, &cgc32->buflen,
1919
                         (sizeof(unsigned int) + sizeof(int))) ||
1920
            __cgc_do_ptr((void **) &cgc->sense, &cgc32->sense))
1921
                return -EFAULT;
1922
 
1923
        if (get_user(dir, &cgc32->data_direction) ||
1924
            put_user(dir, &cgc->data_direction))
1925
                return -EFAULT;
1926
 
1927
        if (copy_in_user(&cgc->quiet, &cgc32->quiet,
1928
                         2 * sizeof(int)))
1929
                return -EFAULT;
1930
 
1931
        if (__cgc_do_ptr(&cgc->reserved[0], &cgc32->reserved[0]))
1932
                return -EFAULT;
1933
 
1934
        return sys_ioctl(fd, cmd, (unsigned long) cgc);
1935
}
1936
 
1937
static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
1938
{
1939
        int err;
1940
 
1941
        switch(cmd) {
1942
        case CDROMREADAUDIO:
1943
                err = cdrom_do_read_audio(fd, cmd, arg);
1944
                break;
1945
 
1946
        case CDROM_SEND_PACKET:
1947
                err = cdrom_do_generic_command(fd, cmd, arg);
1948
                break;
1949
 
1950
        default:
1951
                do {
1952
                        static int count;
1953
                        if (++count <= 20)
1954
                                printk("cdrom_ioctl: Unknown cmd fd(%d) "
1955
                                       "cmd(%08x) arg(%08x)\n",
1956
                                       (int)fd, (unsigned int)cmd, (unsigned int)arg);
1957
                } while(0);
1958
                err = -EINVAL;
1959
                break;
1960
        };
1961
 
1962
        return err;
1963
}
1964
 
1965
struct loop_info32 {
1966
        int                     lo_number;      /* ioctl r/o */
1967
        __kernel_dev_t32        lo_device;      /* ioctl r/o */
1968
        unsigned int            lo_inode;       /* ioctl r/o */
1969
        __kernel_dev_t32        lo_rdevice;     /* ioctl r/o */
1970
        int                     lo_offset;
1971
        int                     lo_encrypt_type;
1972
        int                     lo_encrypt_key_size;    /* ioctl w/o */
1973
        int                     lo_flags;       /* ioctl r/o */
1974
        char                    lo_name[LO_NAME_SIZE];
1975
        unsigned char           lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
1976
        unsigned int            lo_init[2];
1977
        char                    reserved[4];
1978
};
1979
 
1980
static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg)
1981
{
1982
        mm_segment_t old_fs = get_fs();
1983
        struct loop_info l;
1984
        int err = -EINVAL;
1985
 
1986
        switch(cmd) {
1987
        case LOOP_SET_STATUS:
1988
                err = get_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
1989
                err |= __get_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
1990
                err |= __get_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
1991
                err |= __get_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
1992
                err |= __copy_from_user((char *)&l.lo_offset, (char *)&((struct loop_info32 *)arg)->lo_offset,
1993
                                           8 + (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
1994
                if (err) {
1995
                        err = -EFAULT;
1996
                } else {
1997
                        set_fs (KERNEL_DS);
1998
                        err = sys_ioctl (fd, cmd, (unsigned long)&l);
1999
                        set_fs (old_fs);
2000
                }
2001
                break;
2002
        case LOOP_GET_STATUS:
2003
                set_fs (KERNEL_DS);
2004
                err = sys_ioctl (fd, cmd, (unsigned long)&l);
2005
                set_fs (old_fs);
2006
                if (!err) {
2007
                        err = put_user(l.lo_number, &((struct loop_info32 *)arg)->lo_number);
2008
                        err |= __put_user(l.lo_device, &((struct loop_info32 *)arg)->lo_device);
2009
                        err |= __put_user(l.lo_inode, &((struct loop_info32 *)arg)->lo_inode);
2010
                        err |= __put_user(l.lo_rdevice, &((struct loop_info32 *)arg)->lo_rdevice);
2011
                        err |= __copy_to_user((char *)&((struct loop_info32 *)arg)->lo_offset,
2012
                                           (char *)&l.lo_offset, (unsigned long)l.lo_init - (unsigned long)&l.lo_offset);
2013
                        if (err)
2014
                                err = -EFAULT;
2015
                }
2016
                break;
2017
        default: {
2018
                static int count;
2019
                if (++count <= 20)
2020
                        printk("%s: Unknown loop ioctl cmd, fd(%d) "
2021
                               "cmd(%08x) arg(%08lx)\n",
2022
                               __FUNCTION__, fd, cmd, arg);
2023
        }
2024
        }
2025
        return err;
2026
}
2027
 
2028
extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
2029
 
2030
static int vt_check(struct file *file)
2031
{
2032
        struct tty_struct *tty;
2033
        struct inode *inode = file->f_dentry->d_inode;
2034
 
2035
        if (file->f_op->ioctl != tty_ioctl)
2036
                return -EINVAL;
2037
 
2038
        tty = (struct tty_struct *)file->private_data;
2039
        if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
2040
                return -EINVAL;
2041
 
2042
        if (tty->driver.ioctl != vt_ioctl)
2043
                return -EINVAL;
2044
 
2045
        /*
2046
         * To have permissions to do most of the vt ioctls, we either have
2047
         * to be the owner of the tty, or super-user.
2048
         */
2049
        if (current->tty == tty || suser())
2050
                return 1;
2051
        return 0;
2052
}
2053
 
2054
struct consolefontdesc32 {
2055
        unsigned short charcount;       /* characters in font (256 or 512) */
2056
        unsigned short charheight;      /* scan lines per character (1-32) */
2057
        u32 chardata;                   /* font data in expanded form */
2058
};
2059
 
2060
static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file)
2061
{
2062
        struct consolefontdesc cfdarg;
2063
        struct console_font_op op;
2064
        int i, perm;
2065
 
2066
        perm = vt_check(file);
2067
        if (perm < 0) return perm;
2068
 
2069
        if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc32)))
2070
                return -EFAULT;
2071
 
2072
        cfdarg.chardata = (unsigned char *)A(((struct consolefontdesc32 *)&cfdarg)->chardata);
2073
 
2074
        switch (cmd) {
2075
        case PIO_FONTX:
2076
                if (!perm)
2077
                        return -EPERM;
2078
                op.op = KD_FONT_OP_SET;
2079
                op.flags = 0;
2080
                op.width = 8;
2081
                op.height = cfdarg.charheight;
2082
                op.charcount = cfdarg.charcount;
2083
                op.data = cfdarg.chardata;
2084
                return con_font_op(fg_console, &op);
2085
        case GIO_FONTX:
2086
                if (!cfdarg.chardata)
2087
                        return 0;
2088
                op.op = KD_FONT_OP_GET;
2089
                op.flags = 0;
2090
                op.width = 8;
2091
                op.height = cfdarg.charheight;
2092
                op.charcount = cfdarg.charcount;
2093
                op.data = cfdarg.chardata;
2094
                i = con_font_op(fg_console, &op);
2095
                if (i)
2096
                        return i;
2097
                cfdarg.charheight = op.height;
2098
                cfdarg.charcount = op.charcount;
2099
                ((struct consolefontdesc32 *)&cfdarg)->chardata = (unsigned long)cfdarg.chardata;
2100
                if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc32)))
2101
                        return -EFAULT;
2102
                return 0;
2103
        }
2104
        return -EINVAL;
2105
}
2106
 
2107
struct console_font_op32 {
2108
        unsigned int op;        /* operation code KD_FONT_OP_* */
2109
        unsigned int flags;     /* KD_FONT_FLAG_* */
2110
        unsigned int width, height;     /* font size */
2111
        unsigned int charcount;
2112
        u32 data;    /* font data with height fixed to 32 */
2113
};
2114
 
2115
static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file)
2116
{
2117
        struct console_font_op op;
2118
        int perm = vt_check(file), i;
2119
        struct vt_struct *vt;
2120
 
2121
        if (perm < 0) return perm;
2122
 
2123
        if (copy_from_user(&op, (void *) fontop, sizeof(struct console_font_op32)))
2124
                return -EFAULT;
2125
        if (!perm && op.op != KD_FONT_OP_GET)
2126
                return -EPERM;
2127
        op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data);
2128
        op.flags |= KD_FONT_FLAG_OLD;
2129
        vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
2130
        i = con_font_op(vt->vc_num, &op);
2131
        if (i) return i;
2132
        ((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
2133
        if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32)))
2134
                return -EFAULT;
2135
        return 0;
2136
}
2137
 
2138
struct unimapdesc32 {
2139
        unsigned short entry_ct;
2140
        u32 entries;
2141
};
2142
 
2143
static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file)
2144
{
2145
        struct unimapdesc32 tmp;
2146
        int perm = vt_check(file);
2147
 
2148
        if (perm < 0) return perm;
2149
        if (copy_from_user(&tmp, user_ud, sizeof tmp))
2150
                return -EFAULT;
2151
        switch (cmd) {
2152
        case PIO_UNIMAP:
2153
                if (!perm) return -EPERM;
2154
                return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries));
2155
        case GIO_UNIMAP:
2156
                return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries));
2157
        }
2158
        return 0;
2159
}
2160
 
2161
static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg)
2162
{
2163
        mm_segment_t old_fs = get_fs();
2164
        __kernel_uid_t kuid;
2165
        int err;
2166
 
2167
        cmd = SMB_IOC_GETMOUNTUID;
2168
 
2169
        set_fs(KERNEL_DS);
2170
        err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
2171
        set_fs(old_fs);
2172
 
2173
        if (err >= 0)
2174
                err = put_user(kuid, (__kernel_uid_t32 *)arg);
2175
 
2176
        return err;
2177
}
2178
 
2179
struct ncp_ioctl_request_32 {
2180
        unsigned int function;
2181
        unsigned int size;
2182
        __kernel_caddr_t32 data;
2183
};
2184
 
2185
struct ncp_fs_info_v2_32 {
2186
        int version;
2187
        unsigned int mounted_uid;
2188
        unsigned int connection;
2189
        unsigned int buffer_size;
2190
 
2191
        unsigned int volume_number;
2192
        __u32 directory_id;
2193
 
2194
        __u32 dummy1;
2195
        __u32 dummy2;
2196
        __u32 dummy3;
2197
};
2198
 
2199
struct ncp_objectname_ioctl_32
2200
{
2201
        int             auth_type;
2202
        unsigned int    object_name_len;
2203
        __kernel_caddr_t32      object_name;    /* an userspace data, in most cases user name */
2204
};
2205
 
2206
struct ncp_privatedata_ioctl_32
2207
{
2208
        unsigned int    len;
2209
        __kernel_caddr_t32      data;           /* ~1000 for NDS */
2210
};
2211
 
2212
#define NCP_IOC_NCPREQUEST_32           _IOR('n', 1, struct ncp_ioctl_request_32)
2213
 
2214
#define NCP_IOC_GETMOUNTUID2_32         _IOW('n', 2, unsigned int)
2215
 
2216
#define NCP_IOC_GET_FS_INFO_V2_32       _IOWR('n', 4, struct ncp_fs_info_v2_32)
2217
 
2218
#define NCP_IOC_GETOBJECTNAME_32        _IOWR('n', 9, struct ncp_objectname_ioctl_32)
2219
#define NCP_IOC_SETOBJECTNAME_32        _IOR('n', 9, struct ncp_objectname_ioctl_32)
2220
#define NCP_IOC_GETPRIVATEDATA_32       _IOWR('n', 10, struct ncp_privatedata_ioctl_32)
2221
#define NCP_IOC_SETPRIVATEDATA_32       _IOR('n', 10, struct ncp_privatedata_ioctl_32)
2222
 
2223
static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
2224
{
2225
        struct ncp_ioctl_request_32 n32;
2226
        struct ncp_ioctl_request n;
2227
        mm_segment_t old_fs;
2228
        int err;
2229
 
2230
        if (copy_from_user(&n32, (struct ncp_ioctl_request_32*)arg,
2231
            sizeof(n32)))
2232
                return -EFAULT;
2233
 
2234
        n.function = n32.function;
2235
        n.size = n32.size;
2236
        if (n.size > 65536)
2237
                return -EINVAL;
2238
        n.data = vmalloc(65536);        /* 65536 must be same as NCP_PACKET_SIZE_INTERNAL in ncpfs */
2239
        if (!n.data)
2240
                return -ENOMEM;
2241
        err = -EFAULT;
2242
        if (copy_from_user(n.data, A(n32.data), n.size))
2243
                goto out;
2244
 
2245
        old_fs = get_fs(); set_fs (KERNEL_DS);
2246
        err = sys_ioctl (fd, NCP_IOC_NCPREQUEST, (unsigned long)&n);
2247
        set_fs (old_fs);
2248
        if(err <= 0)
2249
                goto out;
2250
        if (err > 65536) {
2251
                err = -EINVAL;
2252
                goto out;
2253
        }
2254
        if (copy_to_user(A(n32.data), n.data, err)) {
2255
                err = -EFAULT;
2256
                goto out;
2257
        }
2258
 out:
2259
        vfree(n.data);
2260
        return err;
2261
}
2262
 
2263
static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
2264
{
2265
        mm_segment_t old_fs = get_fs();
2266
        __kernel_uid_t kuid;
2267
        int err;
2268
 
2269
        cmd = NCP_IOC_GETMOUNTUID2;
2270
 
2271
        set_fs(KERNEL_DS);
2272
        err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
2273
        set_fs(old_fs);
2274
 
2275
        if (!err)
2276
                err = put_user(kuid, (unsigned int*)arg);
2277
 
2278
        return err;
2279
}
2280
 
2281
static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
2282
{
2283
        mm_segment_t old_fs = get_fs();
2284
        struct ncp_fs_info_v2_32 n32;
2285
        struct ncp_fs_info_v2 n;
2286
        int err;
2287
 
2288
        if (copy_from_user(&n32, (struct ncp_fs_info_v2_32*)arg, sizeof(n32)))
2289
                return -EFAULT;
2290
        if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
2291
                return -EINVAL;
2292
        n.version = NCP_GET_FS_INFO_VERSION_V2;
2293
 
2294
        set_fs(KERNEL_DS);
2295
        err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
2296
        set_fs(old_fs);
2297
 
2298
        if (!err) {
2299
                n32.version = n.version;
2300
                n32.mounted_uid = n.mounted_uid;
2301
                n32.connection = n.connection;
2302
                n32.buffer_size = n.buffer_size;
2303
                n32.volume_number = n.volume_number;
2304
                n32.directory_id = n.directory_id;
2305
                n32.dummy1 = n.dummy1;
2306
                n32.dummy2 = n.dummy2;
2307
                n32.dummy3 = n.dummy3;
2308
                err = copy_to_user((struct ncp_fs_info_v2_32*)arg, &n32, sizeof(n32)) ? -EFAULT : 0;
2309
        }
2310
        return err;
2311
}
2312
 
2313
static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
2314
{
2315
        struct ncp_objectname_ioctl_32 n32;
2316
        struct ncp_objectname_ioctl n;
2317
        mm_segment_t old_fs;
2318
        int err;
2319
        size_t tl;
2320
 
2321
        if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
2322
            sizeof(n32)))
2323
                return -EFAULT;
2324
 
2325
        n.object_name_len = tl = n32.object_name_len;
2326
        if (tl) {
2327
                n.object_name = kmalloc(tl, GFP_KERNEL);
2328
                if (!n.object_name)
2329
                        return -ENOMEM;
2330
        } else {
2331
                n.object_name = NULL;
2332
        }
2333
 
2334
        old_fs = get_fs(); set_fs (KERNEL_DS);
2335
        err = sys_ioctl (fd, NCP_IOC_GETOBJECTNAME, (unsigned long)&n);
2336
        set_fs (old_fs);
2337
        if(err)
2338
                goto out;
2339
 
2340
        if (tl > n.object_name_len)
2341
                tl = n.object_name_len;
2342
 
2343
        err = -EFAULT;
2344
        if (tl && copy_to_user(A(n32.object_name), n.object_name, tl))
2345
                goto out;
2346
 
2347
        n32.auth_type = n.auth_type;
2348
        n32.object_name_len = n.object_name_len;
2349
 
2350
        if (copy_to_user((struct ncp_objectname_ioctl_32*)arg, &n32, sizeof(n32)))
2351
                goto out;
2352
 
2353
        err = 0;
2354
 out:
2355
        if (n.object_name)
2356
                kfree(n.object_name);
2357
 
2358
        return err;
2359
}
2360
 
2361
static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
2362
{
2363
        struct ncp_objectname_ioctl_32 n32;
2364
        struct ncp_objectname_ioctl n;
2365
        mm_segment_t old_fs;
2366
        int err;
2367
        size_t tl;
2368
 
2369
        if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
2370
            sizeof(n32)))
2371
                return -EFAULT;
2372
 
2373
        n.auth_type = n32.auth_type;
2374
        n.object_name_len = tl = n32.object_name_len;
2375
        if (tl) {
2376
                n.object_name = kmalloc(tl, GFP_KERNEL);
2377
                if (!n.object_name)
2378
                        return -ENOMEM;
2379
                err = -EFAULT;
2380
                if (copy_from_user(n.object_name, A(n32.object_name), tl))
2381
                        goto out;
2382
        } else {
2383
                n.object_name = NULL;
2384
        }
2385
 
2386
        old_fs = get_fs(); set_fs (KERNEL_DS);
2387
        err = sys_ioctl (fd, NCP_IOC_SETOBJECTNAME, (unsigned long)&n);
2388
        set_fs (old_fs);
2389
 
2390
 out:
2391
        if (n.object_name)
2392
                kfree(n.object_name);
2393
 
2394
        return err;
2395
}
2396
 
2397
static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
2398
{
2399
        struct ncp_privatedata_ioctl_32 n32;
2400
        struct ncp_privatedata_ioctl n;
2401
        mm_segment_t old_fs;
2402
        int err;
2403
        size_t tl;
2404
 
2405
        if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
2406
            sizeof(n32)))
2407
                return -EFAULT;
2408
 
2409
        n.len = tl = n32.len;
2410
        if (tl) {
2411
                n.data = kmalloc(tl, GFP_KERNEL);
2412
                if (!n.data)
2413
                        return -ENOMEM;
2414
        } else {
2415
                n.data = NULL;
2416
        }
2417
 
2418
        old_fs = get_fs(); set_fs (KERNEL_DS);
2419
        err = sys_ioctl (fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)&n);
2420
        set_fs (old_fs);
2421
        if(err)
2422
                goto out;
2423
 
2424
        if (tl > n.len)
2425
                tl = n.len;
2426
 
2427
        err = -EFAULT;
2428
        if (tl && copy_to_user(A(n32.data), n.data, tl))
2429
                goto out;
2430
 
2431
        n32.len = n.len;
2432
 
2433
        if (copy_to_user((struct ncp_privatedata_ioctl_32*)arg, &n32, sizeof(n32)))
2434
                goto out;
2435
 
2436
        err = 0;
2437
 out:
2438
        if (n.data)
2439
                kfree(n.data);
2440
 
2441
        return err;
2442
}
2443
 
2444
static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
2445
{
2446
        struct ncp_privatedata_ioctl_32 n32;
2447
        struct ncp_privatedata_ioctl n;
2448
        mm_segment_t old_fs;
2449
        int err;
2450
        size_t tl;
2451
 
2452
        if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
2453
            sizeof(n32)))
2454
                return -EFAULT;
2455
 
2456
        n.len = tl = n32.len;
2457
        if (tl) {
2458
                n.data = kmalloc(tl, GFP_KERNEL);
2459
                if (!n.data)
2460
                        return -ENOMEM;
2461
                err = -EFAULT;
2462
                if (copy_from_user(n.data, A(n32.data), tl))
2463
                        goto out;
2464
        } else {
2465
                n.data = NULL;
2466
        }
2467
 
2468
        old_fs = get_fs(); set_fs (KERNEL_DS);
2469
        err = sys_ioctl (fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)&n);
2470
        set_fs (old_fs);
2471
 
2472
 out:
2473
        if (n.data)
2474
                kfree(n.data);
2475
 
2476
        return err;
2477
}
2478
 
2479
 
2480
struct atmif_sioc32 {
2481
        int                number;
2482
        int                length;
2483
        __kernel_caddr_t32 arg;
2484
};
2485
 
2486
struct atm_iobuf32 {
2487
        int                length;
2488
        __kernel_caddr_t32 buffer;
2489
};
2490
 
2491
#define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32)
2492
#define ATM_GETNAMES32    _IOW('a', ATMIOC_ITF+3, struct atm_iobuf32)
2493
#define ATM_GETTYPE32     _IOW('a', ATMIOC_ITF+4, struct atmif_sioc32)
2494
#define ATM_GETESI32      _IOW('a', ATMIOC_ITF+5, struct atmif_sioc32)
2495
#define ATM_GETADDR32     _IOW('a', ATMIOC_ITF+6, struct atmif_sioc32)
2496
#define ATM_RSTADDR32     _IOW('a', ATMIOC_ITF+7, struct atmif_sioc32)
2497
#define ATM_ADDADDR32     _IOW('a', ATMIOC_ITF+8, struct atmif_sioc32)
2498
#define ATM_DELADDR32     _IOW('a', ATMIOC_ITF+9, struct atmif_sioc32)
2499
#define ATM_GETCIRANGE32  _IOW('a', ATMIOC_ITF+10, struct atmif_sioc32)
2500
#define ATM_SETCIRANGE32  _IOW('a', ATMIOC_ITF+11, struct atmif_sioc32)
2501
#define ATM_SETESI32      _IOW('a', ATMIOC_ITF+12, struct atmif_sioc32)
2502
#define ATM_SETESIF32     _IOW('a', ATMIOC_ITF+13, struct atmif_sioc32)
2503
#define ATM_GETSTAT32     _IOW('a', ATMIOC_SARCOM+0, struct atmif_sioc32)
2504
#define ATM_GETSTATZ32    _IOW('a', ATMIOC_SARCOM+1, struct atmif_sioc32)
2505
#define ATM_GETLOOP32     _IOW('a', ATMIOC_SARCOM+2, struct atmif_sioc32)
2506
#define ATM_SETLOOP32     _IOW('a', ATMIOC_SARCOM+3, struct atmif_sioc32)
2507
#define ATM_QUERYLOOP32   _IOW('a', ATMIOC_SARCOM+4, struct atmif_sioc32)
2508
 
2509
static struct {
2510
        unsigned int cmd32;
2511
        unsigned int cmd;
2512
} atm_ioctl_map[] = {
2513
        { ATM_GETLINKRATE32, ATM_GETLINKRATE },
2514
        { ATM_GETNAMES32,    ATM_GETNAMES },
2515
        { ATM_GETTYPE32,     ATM_GETTYPE },
2516
        { ATM_GETESI32,      ATM_GETESI },
2517
        { ATM_GETADDR32,     ATM_GETADDR },
2518
        { ATM_RSTADDR32,     ATM_RSTADDR },
2519
        { ATM_ADDADDR32,     ATM_ADDADDR },
2520
        { ATM_DELADDR32,     ATM_DELADDR },
2521
        { ATM_GETCIRANGE32,  ATM_GETCIRANGE },
2522
        { ATM_SETCIRANGE32,  ATM_SETCIRANGE },
2523
        { ATM_SETESI32,      ATM_SETESI },
2524
        { ATM_SETESIF32,     ATM_SETESIF },
2525
        { ATM_GETSTAT32,     ATM_GETSTAT },
2526
        { ATM_GETSTATZ32,    ATM_GETSTATZ },
2527
        { ATM_GETLOOP32,     ATM_GETLOOP },
2528
        { ATM_SETLOOP32,     ATM_SETLOOP },
2529
        { ATM_QUERYLOOP32,   ATM_QUERYLOOP }
2530
};
2531
 
2532
#define NR_ATM_IOCTL (sizeof(atm_ioctl_map)/sizeof(atm_ioctl_map[0]))
2533
 
2534
 
2535
static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg)
2536
{
2537
        struct atm_iobuf   *iobuf;
2538
        struct atm_iobuf32 *iobuf32;
2539
        u32 data;
2540
        void *datap;
2541
        int len, err;
2542
 
2543
        iobuf = alloc_user_space(sizeof(*iobuf));
2544
        iobuf32 = (struct atm_iobuf32 *) arg;
2545
 
2546
        if (get_user(len, &iobuf32->length) ||
2547
            get_user(data, &iobuf32->buffer))
2548
                return -EFAULT;
2549
        datap = (void *) (unsigned long) data;
2550
        if (put_user(len, &iobuf->length) ||
2551
            put_user(datap, &iobuf->buffer))
2552
                return -EFAULT;
2553
 
2554
        err = sys_ioctl(fd, cmd, (unsigned long)iobuf);
2555
 
2556
        if (!err) {
2557
                if (copy_in_user(&iobuf32->length, &iobuf->length,
2558
                                 sizeof(int)))
2559
                        err = -EFAULT;
2560
        }
2561
 
2562
        return err;
2563
}
2564
 
2565
 
2566
static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg)
2567
{
2568
        struct atmif_sioc   *sioc;
2569
        struct atmif_sioc32 *sioc32;
2570
        u32 data;
2571
        void *datap;
2572
        int err;
2573
 
2574
        sioc = alloc_user_space(sizeof(*sioc));
2575
        sioc32 = (struct atmif_sioc32 *) arg;
2576
 
2577
        if (copy_in_user(&sioc->number, &sioc32->number, 2 * sizeof(int)) ||
2578
            get_user(data, &sioc32->arg))
2579
                return -EFAULT;
2580
        datap = (void *) (unsigned long) data;
2581
        if (put_user(datap, &sioc->arg))
2582
                return -EFAULT;
2583
 
2584
        err = sys_ioctl(fd, cmd, (unsigned long) sioc);
2585
 
2586
        if (!err) {
2587
                if (copy_in_user(&sioc32->length, &sioc->length,
2588
                                 sizeof(int)))
2589
                        err = -EFAULT;
2590
        }
2591
        return err;
2592
}
2593
 
2594
 
2595
static int do_atm_ioctl(unsigned int fd, unsigned int cmd32, unsigned long arg)
2596
{
2597
        int i;
2598
        unsigned int cmd = 0;
2599
 
2600
        switch (cmd32) {
2601
        case SONET_GETSTAT:
2602
        case SONET_GETSTATZ:
2603
        case SONET_GETDIAG:
2604
        case SONET_SETDIAG:
2605
        case SONET_CLRDIAG:
2606
        case SONET_SETFRAMING:
2607
        case SONET_GETFRAMING:
2608
        case SONET_GETFRSENSE:
2609
                return do_atmif_sioc(fd, cmd32, arg);
2610
        }
2611
 
2612
        for (i = 0; i < NR_ATM_IOCTL; i++) {
2613
                if (cmd32 == atm_ioctl_map[i].cmd32) {
2614
                        cmd = atm_ioctl_map[i].cmd;
2615
                        break;
2616
                }
2617
        }
2618
        if (i == NR_ATM_IOCTL)
2619
                return -EINVAL;
2620
 
2621
        switch (cmd) {
2622
        case ATM_GETNAMES:
2623
                return do_atm_iobuf(fd, cmd, arg);
2624
 
2625
        case ATM_GETLINKRATE:
2626
        case ATM_GETTYPE:
2627
        case ATM_GETESI:
2628
        case ATM_GETADDR:
2629
        case ATM_RSTADDR:
2630
        case ATM_ADDADDR:
2631
        case ATM_DELADDR:
2632
        case ATM_GETCIRANGE:
2633
        case ATM_SETCIRANGE:
2634
        case ATM_SETESI:
2635
        case ATM_SETESIF:
2636
        case ATM_GETSTAT:
2637
        case ATM_GETSTATZ:
2638
        case ATM_GETLOOP:
2639
        case ATM_SETLOOP:
2640
        case ATM_QUERYLOOP:
2641
                return do_atmif_sioc(fd, cmd, arg);
2642
        }
2643
 
2644
        return -EINVAL;
2645
}
2646
 
2647
#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
2648
/* Ugh, LVM. Pitty it was not cleaned up before accepted :((. */
2649
typedef struct {
2650
        uint8_t vg_name[NAME_LEN];
2651
        uint32_t vg_number;
2652
        uint32_t vg_access;
2653
        uint32_t vg_status;
2654
        uint32_t lv_max;
2655
        uint32_t lv_cur;
2656
        uint32_t lv_open;
2657
        uint32_t pv_max;
2658
        uint32_t pv_cur;
2659
        uint32_t pv_act;
2660
        uint32_t dummy;
2661
        uint32_t vgda;
2662
        uint32_t pe_size;
2663
        uint32_t pe_total;
2664
        uint32_t pe_allocated;
2665
        uint32_t pvg_total;
2666
        u32 proc;
2667
        u32 pv[ABS_MAX_PV + 1];
2668
        u32 lv[ABS_MAX_LV + 1];
2669
        uint8_t vg_uuid[UUID_LEN+1];    /* volume group UUID */
2670
        uint8_t dummy1[200];
2671
} vg32_t;
2672
 
2673
typedef struct {
2674
        uint8_t id[2];
2675
        uint16_t version;
2676
        lvm_disk_data_t pv_on_disk;
2677
        lvm_disk_data_t vg_on_disk;
2678
        lvm_disk_data_t pv_namelist_on_disk;
2679
        lvm_disk_data_t lv_on_disk;
2680
        lvm_disk_data_t pe_on_disk;
2681
        uint8_t pv_name[NAME_LEN];
2682
        uint8_t vg_name[NAME_LEN];
2683
        uint8_t system_id[NAME_LEN];
2684
        kdev_t pv_dev;
2685
        uint32_t pv_number;
2686
        uint32_t pv_status;
2687
        uint32_t pv_allocatable;
2688
        uint32_t pv_size;
2689
        uint32_t lv_cur;
2690
        uint32_t pe_size;
2691
        uint32_t pe_total;
2692
        uint32_t pe_allocated;
2693
        uint32_t pe_stale;
2694
        u32 pe;
2695
        u32 inode;
2696
        uint8_t pv_uuid[UUID_LEN+1];
2697
} pv32_t;
2698
 
2699
typedef struct {
2700
        char lv_name[NAME_LEN];
2701
        u32 lv;
2702
} lv_req32_t;
2703
 
2704
typedef struct {
2705
        u32 lv_index;
2706
        u32 lv;
2707
        /* Transfer size because user space and kernel space differ */
2708
        uint16_t size;
2709
} lv_status_byindex_req32_t;
2710
 
2711
typedef struct {
2712
        __kernel_dev_t32 dev;
2713
        u32   lv;
2714
} lv_status_bydev_req32_t;
2715
 
2716
typedef struct {
2717
        uint8_t lv_name[NAME_LEN];
2718
        kdev_t old_dev;
2719
        kdev_t new_dev;
2720
        u32 old_pe;
2721
        u32 new_pe;
2722
} le_remap_req32_t;
2723
 
2724
typedef struct {
2725
        char pv_name[NAME_LEN];
2726
        u32 pv;
2727
} pv_status_req32_t;
2728
 
2729
typedef struct {
2730
        uint8_t lv_name[NAME_LEN];
2731
        uint8_t vg_name[NAME_LEN];
2732
        uint32_t lv_access;
2733
        uint32_t lv_status;
2734
        uint32_t lv_open;
2735
        kdev_t lv_dev;
2736
        uint32_t lv_number;
2737
        uint32_t lv_mirror_copies;
2738
        uint32_t lv_recovery;
2739
        uint32_t lv_schedule;
2740
        uint32_t lv_size;
2741
        u32 lv_current_pe;
2742
        uint32_t lv_current_le;
2743
        uint32_t lv_allocated_le;
2744
        uint32_t lv_stripes;
2745
        uint32_t lv_stripesize;
2746
        uint32_t lv_badblock;
2747
        uint32_t lv_allocation;
2748
        uint32_t lv_io_timeout;
2749
        uint32_t lv_read_ahead;
2750
        /* delta to version 1 starts here */
2751
        u32 lv_snapshot_org;
2752
        u32 lv_snapshot_prev;
2753
        u32 lv_snapshot_next;
2754
        u32 lv_block_exception;
2755
        uint32_t lv_remap_ptr;
2756
        uint32_t lv_remap_end;
2757
        uint32_t lv_chunk_size;
2758
        uint32_t lv_snapshot_minor;
2759
        char dummy[200];
2760
} lv32_t;
2761
 
2762
typedef struct {
2763
        u32 hash[2];
2764
        u32 rsector_org;
2765
        kdev_t rdev_org;
2766
        u32 rsector_new;
2767
        kdev_t rdev_new;
2768
} lv_block_exception32_t;
2769
 
2770
static void put_lv_t(lv_t *l)
2771
{
2772
        if (l->lv_current_pe) vfree(l->lv_current_pe);
2773
        if (l->lv_block_exception) vfree(l->lv_block_exception);
2774
        kfree(l);
2775
}
2776
 
2777
static lv_t *get_lv_t(u32 p, int *errp)
2778
{
2779
        int err, i;
2780
        u32 ptr1, ptr2;
2781
        size_t size;
2782
        lv_block_exception32_t *lbe32;
2783
        lv_block_exception_t *lbe;
2784
        lv32_t *ul = (lv32_t *)A(p);
2785
        lv_t *l = (lv_t *) kmalloc(sizeof(lv_t), GFP_KERNEL);
2786
 
2787
        if (!l) {
2788
                *errp = -ENOMEM;
2789
                return NULL;
2790
        }
2791
        memset(l, 0, sizeof(lv_t));
2792
        err = copy_from_user(l, ul, (long)&((lv32_t *)0)->lv_current_pe);
2793
        err |= __copy_from_user(&l->lv_current_le, &ul->lv_current_le,
2794
                                ((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
2795
        err |= __copy_from_user(&l->lv_remap_ptr, &ul->lv_remap_ptr,
2796
                                ((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
2797
        err |= __get_user(ptr1, &ul->lv_current_pe);
2798
        err |= __get_user(ptr2, &ul->lv_block_exception);
2799
        if (err) {
2800
                kfree(l);
2801
                *errp = -EFAULT;
2802
                return NULL;
2803
        }
2804
        if (ptr1) {
2805
                size = l->lv_allocated_le * sizeof(pe_t);
2806
                l->lv_current_pe = vmalloc(size);
2807
                if (l->lv_current_pe)
2808
                        err = copy_from_user(l->lv_current_pe, (void *)A(ptr1), size);
2809
        }
2810
        if (!err && ptr2) {
2811
                size = l->lv_remap_end * sizeof(lv_block_exception_t);
2812
                l->lv_block_exception = lbe = vmalloc(size);
2813
                if (l->lv_block_exception) {
2814
                        lbe32 = (lv_block_exception32_t *)A(ptr2);
2815
                        memset(lbe, 0, size);
2816
                        for (i = 0; i < l->lv_remap_end; i++, lbe++, lbe32++) {
2817
                                err |= get_user(lbe->rsector_org, &lbe32->rsector_org);
2818
                                err |= __get_user(lbe->rdev_org, &lbe32->rdev_org);
2819
                                err |= __get_user(lbe->rsector_new, &lbe32->rsector_new);
2820
                                err |= __get_user(lbe->rdev_new, &lbe32->rdev_new);
2821
                        }
2822
                }
2823
        }
2824
        if (err || (ptr1 && !l->lv_current_pe) || (ptr2 && !l->lv_block_exception)) {
2825
                if (!err)
2826
                        *errp = -ENOMEM;
2827
                else
2828
                        *errp = -EFAULT;
2829
                put_lv_t(l);
2830
                return NULL;
2831
        }
2832
        return l;
2833
}
2834
 
2835
static int copy_lv_t(u32 ptr, lv_t *l)
2836
{
2837
        int err;
2838
        lv32_t *ul = (lv32_t *)A(ptr);
2839
        u32 ptr1;
2840
        size_t size;
2841
 
2842
        err = get_user(ptr1, &ul->lv_current_pe);
2843
        if (err)
2844
                return -EFAULT;
2845
        err = copy_to_user(ul, l, (long)&((lv32_t *)0)->lv_current_pe);
2846
        err |= __copy_to_user(&ul->lv_current_le, &l->lv_current_le,
2847
                                ((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
2848
        err |= __copy_to_user(&ul->lv_remap_ptr, &l->lv_remap_ptr,
2849
                                ((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
2850
        size = l->lv_allocated_le * sizeof(pe_t);
2851
        if (ptr1)
2852
                err |= __copy_to_user((void *)A(ptr1), l->lv_current_pe, size);
2853
        return err ? -EFAULT : 0;
2854
}
2855
 
2856
static int do_lvm_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
2857
{
2858
        vg_t *v = NULL;
2859
        union {
2860
                lv_req_t lv_req;
2861
                le_remap_req_t le_remap;
2862
                lv_status_byindex_req_t lv_byindex;
2863
                lv_status_bydev_req_t lv_bydev;
2864
                pv_status_req_t pv_status;
2865
        } u;
2866
        pv_t p;
2867
        int err;
2868
        u32 ptr = 0;
2869
        int i;
2870
        mm_segment_t old_fs;
2871
        void *karg = &u;
2872
 
2873
        switch (cmd) {
2874
        case VG_STATUS:
2875
                v = kmalloc(sizeof(vg_t), GFP_KERNEL);
2876
                if (!v)
2877
                        return -ENOMEM;
2878
                karg = v;
2879
                break;
2880
 
2881
        case VG_CREATE_OLD:
2882
        case VG_CREATE:
2883
                v = kmalloc(sizeof(vg_t), GFP_KERNEL);
2884
                if (!v)
2885
                        return -ENOMEM;
2886
                if (copy_from_user(v, (void *)arg, (long)&((vg32_t *)0)->proc)) {
2887
                        kfree(v);
2888
                        return -EFAULT;
2889
                }
2890
                /* 'proc' field is unused, just NULL it out. */
2891
                v->proc = NULL;
2892
                if (copy_from_user(v->vg_uuid, ((vg32_t *)arg)->vg_uuid, UUID_LEN+1)) {
2893
                        kfree(v);
2894
                        return -EFAULT;
2895
                }
2896
 
2897
                karg = v;
2898
                memset(v->pv, 0, sizeof(v->pv) + sizeof(v->lv));
2899
                if (v->pv_max > ABS_MAX_PV || v->lv_max > ABS_MAX_LV)
2900
                        return -EPERM;
2901
                for (i = 0; i < v->pv_max; i++) {
2902
                        err = __get_user(ptr, &((vg32_t *)arg)->pv[i]);
2903
                        if (err)
2904
                                break;
2905
                        if (ptr) {
2906
                                v->pv[i] = kmalloc(sizeof(pv_t), GFP_KERNEL);
2907
                                if (!v->pv[i]) {
2908
                                        err = -ENOMEM;
2909
                                        break;
2910
                                }
2911
                                err = copy_from_user(v->pv[i], (void *)A(ptr),
2912
                                                     sizeof(pv32_t) - 8 - UUID_LEN+1);
2913
                                if (err) {
2914
                                        err = -EFAULT;
2915
                                        break;
2916
                                }
2917
                                err = copy_from_user(v->pv[i]->pv_uuid,
2918
                                                     ((pv32_t *)A(ptr))->pv_uuid,
2919
                                                     UUID_LEN+1);
2920
                                if (err) {
2921
                                        err = -EFAULT;
2922
                                        break;
2923
                                }
2924
 
2925
                                v->pv[i]->pe = NULL;
2926
                                v->pv[i]->bd = NULL;
2927
                        }
2928
                }
2929
                if (!err) {
2930
                        for (i = 0; i < v->lv_max; i++) {
2931
                                err = __get_user(ptr, &((vg32_t *)arg)->lv[i]);
2932
                                if (err)
2933
                                        break;
2934
                                if (ptr) {
2935
                                        v->lv[i] = get_lv_t(ptr, &err);
2936
                                        if (err)
2937
                                                break;
2938
                                }
2939
                        }
2940
                }
2941
                break;
2942
 
2943
        case LV_CREATE:
2944
        case LV_EXTEND:
2945
        case LV_REDUCE:
2946
        case LV_REMOVE:
2947
        case LV_RENAME:
2948
        case LV_STATUS_BYNAME:
2949
                err = copy_from_user(&u.pv_status, arg, sizeof(u.pv_status.pv_name));
2950
                if (err)
2951
                        return -EFAULT;
2952
                if (cmd != LV_REMOVE) {
2953
                        err = __get_user(ptr, &((lv_req32_t *)arg)->lv);
2954
                        if (err)
2955
                                return err;
2956
                        u.lv_req.lv = get_lv_t(ptr, &err);
2957
                } else
2958
                        u.lv_req.lv = NULL;
2959
                break;
2960
 
2961
        case LV_STATUS_BYINDEX:
2962
                err = get_user(u.lv_byindex.lv_index,
2963
                               &((lv_status_byindex_req32_t *)arg)->lv_index);
2964
                err |= __get_user(ptr, &((lv_status_byindex_req32_t *)arg)->lv);
2965
                if (err)
2966
                        return err;
2967
                u.lv_byindex.lv = get_lv_t(ptr, &err);
2968
                break;
2969
 
2970
        case LV_STATUS_BYDEV:
2971
                err = get_user(u.lv_bydev.dev, &((lv_status_bydev_req32_t *)arg)->dev);
2972
                err |= __get_user(ptr, &((lv_status_bydev_req32_t *)arg)->lv);
2973
                if (err)
2974
                        return err;
2975
                u.lv_bydev.lv = get_lv_t(ptr, &err);
2976
                break;
2977
 
2978
        case VG_EXTEND:
2979
                err = copy_from_user(&p, (void *)arg, sizeof(pv32_t) - 8 - UUID_LEN+1);
2980
                if (err)
2981
                        return -EFAULT;
2982
                err = copy_from_user(p.pv_uuid, ((pv32_t *)arg)->pv_uuid, UUID_LEN+1);
2983
                if (err)
2984
                        return -EFAULT;
2985
                p.pe = NULL;
2986
                p.bd = NULL;
2987
                karg = &p;
2988
                break;
2989
 
2990
        case PV_CHANGE:
2991
        case PV_STATUS:
2992
                err = copy_from_user(&u.pv_status, arg, sizeof(u.lv_req.lv_name));
2993
                if (err)
2994
                        return -EFAULT;
2995
                err = __get_user(ptr, &((pv_status_req32_t *)arg)->pv);
2996
                if (err)
2997
                        return err;
2998
                u.pv_status.pv = &p;
2999
                if (cmd == PV_CHANGE) {
3000
                        err = copy_from_user(&p, (void *)A(ptr),
3001
                                             sizeof(pv32_t) - 8 - UUID_LEN+1);
3002
                        if (err)
3003
                                return -EFAULT;
3004
                        p.pe = NULL;
3005
                        p.bd = NULL;
3006
                }
3007
                break;
3008
        };
3009
 
3010
        old_fs = get_fs(); set_fs (KERNEL_DS);
3011
        err = sys_ioctl (fd, cmd, (unsigned long)karg);
3012
        set_fs (old_fs);
3013
 
3014
        switch (cmd) {
3015
        case VG_STATUS:
3016
                if (!err) {
3017
                        if (copy_to_user((void *)arg, v, (long)&((vg32_t *)0)->proc) ||
3018
                            clear_user(&((vg32_t *)arg)->proc, sizeof(vg32_t) - (long)&((vg32_t *)0)->proc))
3019
                                err = -EFAULT;
3020
                }
3021
                if (copy_to_user(((vg32_t *)arg)->vg_uuid, v->vg_uuid, UUID_LEN+1)) {
3022
                        err = -EFAULT;
3023
                }
3024
                kfree(v);
3025
                break;
3026
 
3027
        case VG_CREATE_OLD:
3028
        case VG_CREATE:
3029
                for (i = 0; i < v->pv_max; i++) {
3030
                        if (v->pv[i])
3031
                                kfree(v->pv[i]);
3032
                }
3033
                for (i = 0; i < v->lv_max; i++) {
3034
                        if (v->lv[i])
3035
                                put_lv_t(v->lv[i]);
3036
                }
3037
                kfree(v);
3038
                break;
3039
 
3040
        case LV_STATUS_BYNAME:
3041
                if (!err && u.lv_req.lv)
3042
                        err = copy_lv_t(ptr, u.lv_req.lv);
3043
                /* Fall through */
3044
 
3045
        case LV_CREATE:
3046
        case LV_EXTEND:
3047
        case LV_REDUCE:
3048
                if (u.lv_req.lv)
3049
                        put_lv_t(u.lv_req.lv);
3050
                break;
3051
 
3052
        case LV_STATUS_BYINDEX:
3053
                if (u.lv_byindex.lv) {
3054
                        if (!err)
3055
                                err = copy_lv_t(ptr, u.lv_byindex.lv);
3056
                        put_lv_t(u.lv_byindex.lv);
3057
                }
3058
                break;
3059
 
3060
        case LV_STATUS_BYDEV:
3061
                if (u.lv_bydev.lv) {
3062
                        if (!err)
3063
                                err = copy_lv_t(ptr, u.lv_bydev.lv);
3064
                        put_lv_t(u.lv_byindex.lv);
3065
                }
3066
                break;
3067
 
3068
        case PV_STATUS:
3069
                if (!err) {
3070
                        err = copy_to_user((void *)A(ptr), &p, sizeof(pv32_t) - 8 - UUID_LEN+1);
3071
                        if (err)
3072
                                return -EFAULT;
3073
                        err = copy_to_user(((pv_t *)A(ptr))->pv_uuid, p.pv_uuid, UUID_LEN + 1);
3074
                        if (err)
3075
                                return -EFAULT;
3076
                }
3077
                break;
3078
        };
3079
 
3080
        return err;
3081
}
3082
#endif
3083
 
3084
#if defined(CONFIG_IEEE1394) || defined(CONFIG_IEEE1394_MODULE)
3085
#include "../../../drivers/ieee1394/ieee1394-ioctl.h"
3086
#include "../../../drivers/ieee1394/amdtp.h"
3087
#include "../../../drivers/ieee1394/dv1394.h"
3088
#include "../../../drivers/ieee1394/video1394.h"
3089
 
3090
#define DV1394_IOC32_INIT       _IOW('#', 0x06, struct dv1394_init32)
3091
#define DV1394_IOC32_GET_STATUS _IOR('#', 0x0c, struct dv1394_status32)
3092
 
3093
struct dv1394_init32 {
3094
        u32 api_version;
3095
        u32 channel;
3096
        u32 n_frames;
3097
        u32 format;
3098
        u32 cip_n;
3099
        u32 cip_d;
3100
        u32 syt_offset;
3101
};
3102
 
3103
struct dv1394_status32 {
3104
        struct dv1394_init32 init;
3105
        s32 active_frame;
3106
        u32 first_clear_frame;
3107
        u32 n_clear_frames;
3108
        u32 dropped_frames;
3109
};
3110
 
3111
static int handle_dv1394_init(unsigned int fd, unsigned int cmd, unsigned long arg)
3112
{
3113
        struct dv1394_init32 dv32;
3114
        struct dv1394_init dv;
3115
        mm_segment_t old_fs;
3116
        int ret;
3117
 
3118
        if (copy_from_user(&dv32, (void *)arg, sizeof(dv32)))
3119
                return -EFAULT;
3120
 
3121
        dv.api_version = dv32.api_version;
3122
        dv.channel = dv32.channel;
3123
        dv.n_frames = dv32.n_frames;
3124
        dv.format = dv32.format;
3125
        dv.cip_n = (unsigned long)dv32.cip_n;
3126
        dv.cip_d = (unsigned long)dv32.cip_d;
3127
        dv.syt_offset = dv32.syt_offset;
3128
 
3129
        old_fs = get_fs();
3130
        set_fs(KERNEL_DS);
3131
        ret = sys_ioctl(fd, DV1394_IOC_INIT, (unsigned long) &dv);
3132
        set_fs(old_fs);
3133
 
3134
        return ret;
3135
}
3136
 
3137
static int handle_dv1394_get_status(unsigned int fd, unsigned int cmd, unsigned long arg)
3138
{
3139
        struct dv1394_status32 dv32;
3140
        struct dv1394_status dv;
3141
        mm_segment_t old_fs;
3142
        int ret;
3143
 
3144
        old_fs = get_fs();
3145
        set_fs(KERNEL_DS);
3146
        ret = sys_ioctl(fd, DV1394_IOC_GET_STATUS, (unsigned long) &dv);
3147
        set_fs(old_fs);
3148
 
3149
        if (!ret) {
3150
                dv32.init.api_version = dv.init.api_version;
3151
                dv32.init.channel = dv.init.channel;
3152
                dv32.init.n_frames = dv.init.n_frames;
3153
                dv32.init.format = dv.init.format;
3154
                dv32.init.cip_n = (u32)dv.init.cip_n;
3155
                dv32.init.cip_d = (u32)dv.init.cip_d;
3156
                dv32.init.syt_offset = dv.init.syt_offset;
3157
                dv32.active_frame = dv.active_frame;
3158
                dv32.first_clear_frame = dv.first_clear_frame;
3159
                dv32.n_clear_frames = dv.n_clear_frames;
3160
                dv32.dropped_frames = dv.dropped_frames;
3161
 
3162
                if (copy_to_user((struct dv1394_status32 *)arg, &dv32, sizeof(dv32)))
3163
                        ret = -EFAULT;
3164
        }
3165
 
3166
        return ret;
3167
}
3168
 
3169
#define VIDEO1394_IOC32_LISTEN_QUEUE_BUFFER     \
3170
        _IOW ('#', 0x12, struct video1394_wait32)
3171
#define VIDEO1394_IOC32_LISTEN_WAIT_BUFFER      \
3172
        _IOWR('#', 0x13, struct video1394_wait32)
3173
#define VIDEO1394_IOC32_TALK_WAIT_BUFFER        \
3174
        _IOW ('#', 0x17, struct video1394_wait32)
3175
#define VIDEO1394_IOC32_LISTEN_POLL_BUFFER      \
3176
        _IOWR('#', 0x18, struct video1394_wait32)
3177
 
3178
struct video1394_wait32 {
3179
        u32 channel;
3180
        u32 buffer;
3181
        struct timeval32 filltime;
3182
};
3183
 
3184
static int video1394_wr_wait32(unsigned int fd, unsigned int cmd, unsigned long arg)
3185
{
3186
        struct video1394_wait32 wait32;
3187
        struct video1394_wait wait;
3188
        mm_segment_t old_fs;
3189
        int ret;
3190
 
3191
        if (copy_from_user(&wait32, (void *)arg, sizeof(wait32)))
3192
                return -EFAULT;
3193
 
3194
        wait.channel = wait32.channel;
3195
        wait.buffer = wait32.buffer;
3196
        wait.filltime.tv_sec = (time_t)wait32.filltime.tv_sec;
3197
        wait.filltime.tv_usec = (suseconds_t)wait32.filltime.tv_usec;
3198
 
3199
        old_fs = get_fs();
3200
        set_fs(KERNEL_DS);
3201
        if (cmd == VIDEO1394_IOC32_LISTEN_WAIT_BUFFER)
3202
                ret = sys_ioctl(fd, VIDEO1394_IOC_LISTEN_WAIT_BUFFER, (unsigned long) &wait);
3203
        else
3204
                ret = sys_ioctl(fd, VIDEO1394_IOC_LISTEN_POLL_BUFFER, (unsigned long) &wait);
3205
        set_fs(old_fs);
3206
 
3207
        if (!ret) {
3208
                wait32.channel = wait.channel;
3209
                wait32.buffer = wait.buffer;
3210
                wait32.filltime.tv_sec = (int)wait.filltime.tv_sec;
3211
                wait32.filltime.tv_usec = (int)wait.filltime.tv_usec;
3212
 
3213
                if (copy_to_user((struct video1394_wait32 *)arg, &wait32, sizeof(wait32)))
3214
                        ret = -EFAULT;
3215
        }
3216
 
3217
        return ret;
3218
}
3219
 
3220
static int video1394_w_wait32(unsigned int fd, unsigned int cmd, unsigned long arg)
3221
{
3222
        struct video1394_wait32 wait32;
3223
        struct video1394_wait wait;
3224
        mm_segment_t old_fs;
3225
        int ret;
3226
 
3227
        if (copy_from_user(&wait32, (void *)arg, sizeof(wait32)))
3228
                return -EFAULT;
3229
 
3230
        wait.channel = wait32.channel;
3231
        wait.buffer = wait32.buffer;
3232
        wait.filltime.tv_sec = (time_t)wait32.filltime.tv_sec;
3233
        wait.filltime.tv_usec = (suseconds_t)wait32.filltime.tv_usec;
3234
 
3235
        old_fs = get_fs();
3236
        set_fs(KERNEL_DS);
3237
        if (cmd == VIDEO1394_IOC32_LISTEN_QUEUE_BUFFER)
3238
                ret = sys_ioctl(fd, VIDEO1394_IOC_LISTEN_QUEUE_BUFFER, (unsigned long) &wait);
3239
        else
3240
                ret = sys_ioctl(fd, VIDEO1394_IOC_TALK_WAIT_BUFFER, (unsigned long) &wait);
3241
        set_fs(old_fs);
3242
 
3243
        return ret;
3244
}
3245
 
3246
static int video1394_queue_buf32(unsigned int fd, unsigned int cmd, unsigned long arg)
3247
{
3248
        return -EFAULT;
3249
}
3250
 
3251
#endif /* CONFIG_IEEE1394 */
3252
 
3253
#if defined(CONFIG_DRM_NEW) || defined(CONFIG_DRM_NEW_MODULE)
3254
/* This really belongs in include/linux/drm.h -DaveM */
3255
#include "../../../drivers/char/drm/drm.h"
3256
 
3257
typedef struct drm32_version {
3258
        int    version_major;     /* Major version                          */
3259
        int    version_minor;     /* Minor version                          */
3260
        int    version_patchlevel;/* Patch level                            */
3261
        int    name_len;          /* Length of name buffer                  */
3262
        u32    name;              /* Name of driver                         */
3263
        int    date_len;          /* Length of date buffer                  */
3264
        u32    date;              /* User-space buffer to hold date         */
3265
        int    desc_len;          /* Length of desc buffer                  */
3266
        u32    desc;              /* User-space buffer to hold desc         */
3267
} drm32_version_t;
3268
#define DRM32_IOCTL_VERSION    DRM_IOWR(0x00, drm32_version_t)
3269
 
3270
static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg)
3271
{
3272
        drm32_version_t *uversion = (drm32_version_t *)arg;
3273
        char *name_ptr, *date_ptr, *desc_ptr;
3274
        u32 tmp1, tmp2, tmp3;
3275
        drm_version_t kversion;
3276
        mm_segment_t old_fs;
3277
        int ret;
3278
 
3279
        memset(&kversion, 0, sizeof(kversion));
3280
        if (get_user(kversion.name_len, &uversion->name_len) ||
3281
            get_user(kversion.date_len, &uversion->date_len) ||
3282
            get_user(kversion.desc_len, &uversion->desc_len) ||
3283
            get_user(tmp1, &uversion->name) ||
3284
            get_user(tmp2, &uversion->date) ||
3285
            get_user(tmp3, &uversion->desc))
3286
                return -EFAULT;
3287
 
3288
        name_ptr = (char *) A(tmp1);
3289
        date_ptr = (char *) A(tmp2);
3290
        desc_ptr = (char *) A(tmp3);
3291
 
3292
        ret = -ENOMEM;
3293
        if (kversion.name_len && name_ptr) {
3294
                kversion.name = kmalloc(kversion.name_len, GFP_KERNEL);
3295
                if (!kversion.name)
3296
                        goto out;
3297
        }
3298
        if (kversion.date_len && date_ptr) {
3299
                kversion.date = kmalloc(kversion.date_len, GFP_KERNEL);
3300
                if (!kversion.date)
3301
                        goto out;
3302
        }
3303
        if (kversion.desc_len && desc_ptr) {
3304
                kversion.desc = kmalloc(kversion.desc_len, GFP_KERNEL);
3305
                if (!kversion.desc)
3306
                        goto out;
3307
        }
3308
 
3309
        old_fs = get_fs();
3310
        set_fs(KERNEL_DS);
3311
        ret = sys_ioctl (fd, DRM_IOCTL_VERSION, (unsigned long)&kversion);
3312
        set_fs(old_fs);
3313
 
3314
        if (!ret) {
3315
                if ((kversion.name &&
3316
                     copy_to_user(name_ptr, kversion.name, kversion.name_len)) ||
3317
                    (kversion.date &&
3318
                     copy_to_user(date_ptr, kversion.date, kversion.date_len)) ||
3319
                    (kversion.desc &&
3320
                     copy_to_user(desc_ptr, kversion.desc, kversion.desc_len)))
3321
                        ret = -EFAULT;
3322
                if (put_user(kversion.version_major, &uversion->version_major) ||
3323
                    put_user(kversion.version_minor, &uversion->version_minor) ||
3324
                    put_user(kversion.version_patchlevel, &uversion->version_patchlevel) ||
3325
                    put_user(kversion.name_len, &uversion->name_len) ||
3326
                    put_user(kversion.date_len, &uversion->date_len) ||
3327
                    put_user(kversion.desc_len, &uversion->desc_len))
3328
                        ret = -EFAULT;
3329
        }
3330
 
3331
out:
3332
        if (kversion.name)
3333
                kfree(kversion.name);
3334
        if (kversion.date)
3335
                kfree(kversion.date);
3336
        if (kversion.desc)
3337
                kfree(kversion.desc);
3338
        return ret;
3339
}
3340
 
3341
typedef struct drm32_unique {
3342
        int     unique_len;       /* Length of unique                       */
3343
        u32     unique;           /* Unique name for driver instantiation   */
3344
} drm32_unique_t;
3345
#define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t)
3346
#define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t)
3347
 
3348
static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long arg)
3349
{
3350
        drm32_unique_t *uarg = (drm32_unique_t *)arg;
3351
        drm_unique_t karg;
3352
        mm_segment_t old_fs;
3353
        char *uptr;
3354
        u32 tmp;
3355
        int ret;
3356
 
3357
        if (get_user(karg.unique_len, &uarg->unique_len))
3358
                return -EFAULT;
3359
        karg.unique = NULL;
3360
 
3361
        if (get_user(tmp, &uarg->unique))
3362
                return -EFAULT;
3363
 
3364
        uptr = (char *) A(tmp);
3365
 
3366
        if (uptr) {
3367
                karg.unique = kmalloc(karg.unique_len, GFP_KERNEL);
3368
                if (!karg.unique)
3369
                        return -ENOMEM;
3370
                if (cmd == DRM32_IOCTL_SET_UNIQUE &&
3371
                    copy_from_user(karg.unique, uptr, karg.unique_len)) {
3372
                        kfree(karg.unique);
3373
                        return -EFAULT;
3374
                }
3375
        }
3376
 
3377
        old_fs = get_fs();
3378
        set_fs(KERNEL_DS);
3379
        if (cmd == DRM32_IOCTL_GET_UNIQUE)
3380
                ret = sys_ioctl (fd, DRM_IOCTL_GET_UNIQUE, (unsigned long)&karg);
3381
        else
3382
                ret = sys_ioctl (fd, DRM_IOCTL_SET_UNIQUE, (unsigned long)&karg);
3383
        set_fs(old_fs);
3384
 
3385
        if (!ret) {
3386
                if (cmd == DRM32_IOCTL_GET_UNIQUE &&
3387
                    uptr != NULL &&
3388
                    copy_to_user(uptr, karg.unique, karg.unique_len))
3389
                        ret = -EFAULT;
3390
                if (put_user(karg.unique_len, &uarg->unique_len))
3391
                        ret = -EFAULT;
3392
        }
3393
 
3394
        if (karg.unique != NULL)
3395
                kfree(karg.unique);
3396
 
3397
        return ret;
3398
}
3399
 
3400
typedef struct drm32_map {
3401
        u32             offset;  /* Requested physical address (0 for SAREA)*/
3402
        u32             size;    /* Requested physical size (bytes)         */
3403
        drm_map_type_t  type;    /* Type of memory to map                   */
3404
        drm_map_flags_t flags;   /* Flags                                   */
3405
        u32             handle;  /* User-space: "Handle" to pass to mmap    */
3406
                                 /* Kernel-space: kernel-virtual address    */
3407
        int             mtrr;    /* MTRR slot used                          */
3408
                                 /* Private data                            */
3409
} drm32_map_t;
3410
#define DRM32_IOCTL_ADD_MAP    DRM_IOWR(0x15, drm32_map_t)
3411
 
3412
static int drm32_addmap(unsigned int fd, unsigned int cmd, unsigned long arg)
3413
{
3414
        drm32_map_t *uarg = (drm32_map_t *) arg;
3415
        drm_map_t karg;
3416
        mm_segment_t old_fs;
3417
        u32 tmp;
3418
        int ret;
3419
 
3420
        ret  = get_user(karg.offset, &uarg->offset);
3421
        ret |= get_user(karg.size, &uarg->size);
3422
        ret |= get_user(karg.type, &uarg->type);
3423
        ret |= get_user(karg.flags, &uarg->flags);
3424
        ret |= get_user(tmp, &uarg->handle);
3425
        ret |= get_user(karg.mtrr, &uarg->mtrr);
3426
        if (ret)
3427
                return -EFAULT;
3428
 
3429
        karg.handle = (void *) A(tmp);
3430
 
3431
        old_fs = get_fs();
3432
        set_fs(KERNEL_DS);
3433
        ret = sys_ioctl(fd, DRM_IOCTL_ADD_MAP, (unsigned long) &karg);
3434
        set_fs(old_fs);
3435
 
3436
        if (!ret) {
3437
                ret  = put_user(karg.offset, &uarg->offset);
3438
                ret |= put_user(karg.size, &uarg->size);
3439
                ret |= put_user(karg.type, &uarg->type);
3440
                ret |= put_user(karg.flags, &uarg->flags);
3441
                tmp = (u32) (long)karg.handle;
3442
                ret |= put_user(tmp, &uarg->handle);
3443
                ret |= put_user(karg.mtrr, &uarg->mtrr);
3444
                if (ret)
3445
                        ret = -EFAULT;
3446
        }
3447
 
3448
        return ret;
3449
}
3450
 
3451
typedef struct drm32_buf_info {
3452
        int            count;   /* Entries in list                           */
3453
        u32            list;    /* (drm_buf_desc_t *) */
3454
} drm32_buf_info_t;
3455
#define DRM32_IOCTL_INFO_BUFS  DRM_IOWR(0x18, drm32_buf_info_t)
3456
 
3457
static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
3458
{
3459
        drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg;
3460
        drm_buf_desc_t *ulist;
3461
        drm_buf_info_t karg;
3462
        mm_segment_t old_fs;
3463
        int orig_count, ret;
3464
        u32 tmp;
3465
 
3466
        if (get_user(karg.count, &uarg->count) ||
3467
            get_user(tmp, &uarg->list))
3468
                return -EFAULT;
3469
 
3470
        ulist = (drm_buf_desc_t *) A(tmp);
3471
 
3472
        orig_count = karg.count;
3473
 
3474
        karg.list = kmalloc(karg.count * sizeof(drm_buf_desc_t), GFP_KERNEL);
3475
        if (!karg.list)
3476
                return -EFAULT;
3477
 
3478
        old_fs = get_fs();
3479
        set_fs(KERNEL_DS);
3480
        ret = sys_ioctl(fd, DRM_IOCTL_INFO_BUFS, (unsigned long) &karg);
3481
        set_fs(old_fs);
3482
 
3483
        if (!ret) {
3484
                if (karg.count <= orig_count &&
3485
                    (copy_to_user(ulist, karg.list,
3486
                                  karg.count * sizeof(drm_buf_desc_t))))
3487
                        ret = -EFAULT;
3488
                if (put_user(karg.count, &uarg->count))
3489
                        ret = -EFAULT;
3490
        }
3491
 
3492
        kfree(karg.list);
3493
 
3494
        return ret;
3495
}
3496
 
3497
typedef struct drm32_buf_free {
3498
        int            count;
3499
        u32            list;    /* (int *) */
3500
} drm32_buf_free_t;
3501
#define DRM32_IOCTL_FREE_BUFS  DRM_IOW( 0x1a, drm32_buf_free_t)
3502
 
3503
static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
3504
{
3505
        drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg;
3506
        drm_buf_free_t karg;
3507
        mm_segment_t old_fs;
3508
        int *ulist;
3509
        int ret;
3510
        u32 tmp;
3511
 
3512
        if (get_user(karg.count, &uarg->count) ||
3513
            get_user(tmp, &uarg->list))
3514
                return -EFAULT;
3515
 
3516
        ulist = (int *) A(tmp);
3517
 
3518
        karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL);
3519
        if (!karg.list)
3520
                return -ENOMEM;
3521
 
3522
        ret = -EFAULT;
3523
        if (copy_from_user(karg.list, ulist, (karg.count * sizeof(int))))
3524
                goto out;
3525
 
3526
        old_fs = get_fs();
3527
        set_fs(KERNEL_DS);
3528
        ret = sys_ioctl(fd, DRM_IOCTL_FREE_BUFS, (unsigned long) &karg);
3529
        set_fs(old_fs);
3530
 
3531
out:
3532
        kfree(karg.list);
3533
 
3534
        return ret;
3535
}
3536
 
3537
typedef struct drm32_buf_pub {
3538
        int               idx;         /* Index into master buflist          */
3539
        int               total;       /* Buffer size                        */
3540
        int               used;        /* Amount of buffer in use (for DMA)  */
3541
        u32               address;     /* Address of buffer (void *)         */
3542
} drm32_buf_pub_t;
3543
 
3544
typedef struct drm32_buf_map {
3545
        int           count;    /* Length of buflist                        */
3546
        u32           virtual;  /* Mmaped area in user-virtual (void *)     */
3547
        u32           list;     /* Buffer information (drm_buf_pub_t *)     */
3548
} drm32_buf_map_t;
3549
#define DRM32_IOCTL_MAP_BUFS   DRM_IOWR(0x19, drm32_buf_map_t)
3550
 
3551
static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
3552
{
3553
        drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg;
3554
        drm32_buf_pub_t *ulist;
3555
        drm_buf_map_t karg;
3556
        mm_segment_t old_fs;
3557
        int orig_count, ret, i;
3558
        u32 tmp1, tmp2;
3559
 
3560
        if (get_user(karg.count, &uarg->count) ||
3561
            get_user(tmp1, &uarg->virtual) ||
3562
            get_user(tmp2, &uarg->list))
3563
                return -EFAULT;
3564
 
3565
        karg.virtual = (void *) A(tmp1);
3566
        ulist = (drm32_buf_pub_t *) A(tmp2);
3567
 
3568
        orig_count = karg.count;
3569
 
3570
        karg.list = kmalloc(karg.count * sizeof(drm_buf_pub_t), GFP_KERNEL);
3571
        if (!karg.list)
3572
                return -ENOMEM;
3573
 
3574
        ret = -EFAULT;
3575
        for (i = 0; i < karg.count; i++) {
3576
                if (get_user(karg.list[i].idx, &ulist[i].idx) ||
3577
                    get_user(karg.list[i].total, &ulist[i].total) ||
3578
                    get_user(karg.list[i].used, &ulist[i].used) ||
3579
                    get_user(tmp1, &ulist[i].address))
3580
                        goto out;
3581
 
3582
                karg.list[i].address = (void *) A(tmp1);
3583
        }
3584
 
3585
        old_fs = get_fs();
3586
        set_fs(KERNEL_DS);
3587
        ret = sys_ioctl(fd, DRM_IOCTL_MAP_BUFS, (unsigned long) &karg);
3588
        set_fs(old_fs);
3589
 
3590
        if (!ret) {
3591
                for (i = 0; i < orig_count; i++) {
3592
                        tmp1 = (u32) (long) karg.list[i].address;
3593
                        if (put_user(karg.list[i].idx, &ulist[i].idx) ||
3594
                            put_user(karg.list[i].total, &ulist[i].total) ||
3595
                            put_user(karg.list[i].used, &ulist[i].used) ||
3596
                            put_user(tmp1, &ulist[i].address)) {
3597
                                ret = -EFAULT;
3598
                                goto out;
3599
                        }
3600
                }
3601
                if (put_user(karg.count, &uarg->count))
3602
                        ret = -EFAULT;
3603
        }
3604
 
3605
out:
3606
        kfree(karg.list);
3607
        return ret;
3608
}
3609
 
3610
typedef struct drm32_dma {
3611
                                /* Indices here refer to the offset into
3612
                                   buflist in drm_buf_get_t.  */
3613
        int             context;          /* Context handle                 */
3614
        int             send_count;       /* Number of buffers to send      */
3615
        u32             send_indices;     /* List of handles to buffers (int *) */
3616
        u32             send_sizes;       /* Lengths of data to send (int *) */
3617
        drm_dma_flags_t flags;            /* Flags                          */
3618
        int             request_count;    /* Number of buffers requested    */
3619
        int             request_size;     /* Desired size for buffers       */
3620
        u32             request_indices;  /* Buffer information (int *)     */
3621
        u32             request_sizes;    /* (int *) */
3622
        int             granted_count;    /* Number of buffers granted      */
3623
} drm32_dma_t;
3624
#define DRM32_IOCTL_DMA      DRM_IOWR(0x29, drm32_dma_t)
3625
 
3626
/* RED PEN      The DRM layer blindly dereferences the send/request
3627
 *              indice/size arrays even though they are userland
3628
 *              pointers.  -DaveM
3629
 */
3630
static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg)
3631
{
3632
        drm32_dma_t *uarg = (drm32_dma_t *) arg;
3633
        int *u_si, *u_ss, *u_ri, *u_rs;
3634
        drm_dma_t karg;
3635
        mm_segment_t old_fs;
3636
        int ret;
3637
        u32 tmp1, tmp2, tmp3, tmp4;
3638
 
3639
        karg.send_indices = karg.send_sizes = NULL;
3640
        karg.request_indices = karg.request_sizes = NULL;
3641
 
3642
        if (get_user(karg.context, &uarg->context) ||
3643
            get_user(karg.send_count, &uarg->send_count) ||
3644
            get_user(tmp1, &uarg->send_indices) ||
3645
            get_user(tmp2, &uarg->send_sizes) ||
3646
            get_user(karg.flags, &uarg->flags) ||
3647
            get_user(karg.request_count, &uarg->request_count) ||
3648
            get_user(karg.request_size, &uarg->request_size) ||
3649
            get_user(tmp3, &uarg->request_indices) ||
3650
            get_user(tmp4, &uarg->request_sizes) ||
3651
            get_user(karg.granted_count, &uarg->granted_count))
3652
                return -EFAULT;
3653
 
3654
        u_si = (int *) A(tmp1);
3655
        u_ss = (int *) A(tmp2);
3656
        u_ri = (int *) A(tmp3);
3657
        u_rs = (int *) A(tmp4);
3658
 
3659
        if (karg.send_count) {
3660
                karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);
3661
                karg.send_sizes = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);
3662
 
3663
                ret = -ENOMEM;
3664
                if (!karg.send_indices || !karg.send_sizes)
3665
                        goto out;
3666
 
3667
                ret = -EFAULT;
3668
                if (copy_from_user(karg.send_indices, u_si,
3669
                                   (karg.send_count * sizeof(int))) ||
3670
                    copy_from_user(karg.send_sizes, u_ss,
3671
                                   (karg.send_count * sizeof(int))))
3672
                        goto out;
3673
        }
3674
 
3675
        if (karg.request_count) {
3676
                karg.request_indices = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);
3677
                karg.request_sizes = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL);
3678
 
3679
                ret = -ENOMEM;
3680
                if (!karg.request_indices || !karg.request_sizes)
3681
                        goto out;
3682
 
3683
                ret = -EFAULT;
3684
                if (copy_from_user(karg.request_indices, u_ri,
3685
                                   (karg.request_count * sizeof(int))) ||
3686
                    copy_from_user(karg.request_sizes, u_rs,
3687
                                   (karg.request_count * sizeof(int))))
3688
                        goto out;
3689
        }
3690
 
3691
        old_fs = get_fs();
3692
        set_fs(KERNEL_DS);
3693
        ret = sys_ioctl(fd, DRM_IOCTL_DMA, (unsigned long) &karg);
3694
        set_fs(old_fs);
3695
 
3696
        if (!ret) {
3697
                if (put_user(karg.context, &uarg->context) ||
3698
                    put_user(karg.send_count, &uarg->send_count) ||
3699
                    put_user(karg.flags, &uarg->flags) ||
3700
                    put_user(karg.request_count, &uarg->request_count) ||
3701
                    put_user(karg.request_size, &uarg->request_size) ||
3702
                    put_user(karg.granted_count, &uarg->granted_count))
3703
                        ret = -EFAULT;
3704
 
3705
                if (karg.send_count) {
3706
                        if (copy_to_user(u_si, karg.send_indices,
3707
                                         (karg.send_count * sizeof(int))) ||
3708
                            copy_to_user(u_ss, karg.send_sizes,
3709
                                         (karg.send_count * sizeof(int))))
3710
                                ret = -EFAULT;
3711
                }
3712
                if (karg.request_count) {
3713
                        if (copy_to_user(u_ri, karg.request_indices,
3714
                                         (karg.request_count * sizeof(int))) ||
3715
                            copy_to_user(u_rs, karg.request_sizes,
3716
                                         (karg.request_count * sizeof(int))))
3717
                                ret = -EFAULT;
3718
                }
3719
        }
3720
 
3721
out:
3722
        if (karg.send_indices)
3723
                kfree(karg.send_indices);
3724
        if (karg.send_sizes)
3725
                kfree(karg.send_sizes);
3726
        if (karg.request_indices)
3727
                kfree(karg.request_indices);
3728
        if (karg.request_sizes)
3729
                kfree(karg.request_sizes);
3730
 
3731
        return ret;
3732
}
3733
 
3734
typedef struct drm32_ctx_res {
3735
        int             count;
3736
        u32             contexts; /* (drm_ctx_t *) */
3737
} drm32_ctx_res_t;
3738
#define DRM32_IOCTL_RES_CTX    DRM_IOWR(0x26, drm32_ctx_res_t)
3739
 
3740
static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg)
3741
{
3742
        drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg;
3743
        drm_ctx_t *ulist;
3744
        drm_ctx_res_t karg;
3745
        mm_segment_t old_fs;
3746
        int orig_count, ret;
3747
        u32 tmp;
3748
 
3749
        karg.contexts = NULL;
3750
        if (get_user(karg.count, &uarg->count) ||
3751
            get_user(tmp, &uarg->contexts))
3752
                return -EFAULT;
3753
 
3754
        ulist = (drm_ctx_t *) A(tmp);
3755
 
3756
        orig_count = karg.count;
3757
        if (karg.count && ulist) {
3758
                karg.contexts = kmalloc((karg.count * sizeof(drm_ctx_t)), GFP_KERNEL);
3759
                if (!karg.contexts)
3760
                        return -ENOMEM;
3761
                if (copy_from_user(karg.contexts, ulist,
3762
                                   (karg.count * sizeof(drm_ctx_t)))) {
3763
                        kfree(karg.contexts);
3764
                        return -EFAULT;
3765
                }
3766
        }
3767
 
3768
        old_fs = get_fs();
3769
        set_fs(KERNEL_DS);
3770
        ret = sys_ioctl(fd, DRM_IOCTL_RES_CTX, (unsigned long) &karg);
3771
        set_fs(old_fs);
3772
 
3773
        if (!ret) {
3774
                if (orig_count) {
3775
                        if (copy_to_user(ulist, karg.contexts,
3776
                                         (orig_count * sizeof(drm_ctx_t))))
3777
                                ret = -EFAULT;
3778
                }
3779
                if (put_user(karg.count, &uarg->count))
3780
                        ret = -EFAULT;
3781
        }
3782
 
3783
        if (karg.contexts)
3784
                kfree(karg.contexts);
3785
 
3786
        return ret;
3787
}
3788
 
3789
#endif
3790
 
3791
static int ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
3792
{
3793
        return -EINVAL;
3794
}
3795
 
3796
static int broken_blkgetsize(unsigned int fd, unsigned int cmd, unsigned long arg)
3797
{
3798
        /* The mkswap binary hard codes it to Intel value :-((( */
3799
        return w_long(fd, BLKGETSIZE, arg);
3800
}
3801
 
3802
struct blkpg_ioctl_arg32 {
3803
        int op;
3804
        int flags;
3805
        int datalen;
3806
        u32 data;
3807
};
3808
 
3809
static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, struct blkpg_ioctl_arg32 *arg)
3810
{
3811
        struct blkpg_ioctl_arg a;
3812
        struct blkpg_partition p;
3813
        int err;
3814
        mm_segment_t old_fs = get_fs();
3815
 
3816
        err = get_user(a.op, &arg->op);
3817
        err |= __get_user(a.flags, &arg->flags);
3818
        err |= __get_user(a.datalen, &arg->datalen);
3819
        err |= __get_user((long)a.data, &arg->data);
3820
        if (err) return err;
3821
        switch (a.op) {
3822
        case BLKPG_ADD_PARTITION:
3823
        case BLKPG_DEL_PARTITION:
3824
                if (a.datalen < sizeof(struct blkpg_partition))
3825
                        return -EINVAL;
3826
                if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition)))
3827
                        return -EFAULT;
3828
                a.data = &p;
3829
                set_fs (KERNEL_DS);
3830
                err = sys_ioctl(fd, cmd, (unsigned long)&a);
3831
                set_fs (old_fs);
3832
        default:
3833
                return -EINVAL;
3834
        }
3835
        return err;
3836
}
3837
 
3838
static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
3839
{
3840
        return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
3841
}
3842
 
3843
struct usbdevfs_ctrltransfer32 {
3844
        __u8 requesttype;
3845
        __u8 request;
3846
        __u16 value;
3847
        __u16 index;
3848
        __u16 length;
3849
        __u32 timeout;  /* in milliseconds */
3850
        __u32 data;
3851
};
3852
 
3853
#define USBDEVFS_CONTROL32           _IOWR('U', 0, struct usbdevfs_ctrltransfer32)
3854
 
3855
static int do_usbdevfs_control(unsigned int fd, unsigned int cmd, unsigned long arg)
3856
{
3857
        struct usbdevfs_ctrltransfer kctrl;
3858
        struct usbdevfs_ctrltransfer32 *uctrl;
3859
        mm_segment_t old_fs;
3860
        __u32 udata;
3861
        void *uptr, *kptr;
3862
        int err;
3863
 
3864
        uctrl = (struct usbdevfs_ctrltransfer32 *) arg;
3865
 
3866
        if (copy_from_user(&kctrl, uctrl,
3867
                           (sizeof(struct usbdevfs_ctrltransfer) -
3868
                            sizeof(void *))))
3869
                return -EFAULT;
3870
 
3871
        if (get_user(udata, &uctrl->data))
3872
                return -EFAULT;
3873
        uptr = (void *) A(udata);
3874
 
3875
        /* In usbdevice_fs, it limits the control buffer to a page,
3876
         * for simplicity so do we.
3877
         */
3878
        if (!uptr || kctrl.length > PAGE_SIZE)
3879
                return -EINVAL;
3880
 
3881
        kptr = (void *)__get_free_page(GFP_KERNEL);
3882
 
3883
        if ((kctrl.requesttype & 0x80) == 0) {
3884
                err = -EFAULT;
3885
                if (copy_from_user(kptr, uptr, kctrl.length))
3886
                        goto out;
3887
        }
3888
 
3889
        kctrl.data = kptr;
3890
 
3891
        old_fs = get_fs();
3892
        set_fs(KERNEL_DS);
3893
        err = sys_ioctl(fd, USBDEVFS_CONTROL, (unsigned long)&kctrl);
3894
        set_fs(old_fs);
3895
 
3896
        if (err >= 0 &&
3897
            ((kctrl.requesttype & 0x80) != 0)) {
3898
                if (copy_to_user(uptr, kptr, kctrl.length))
3899
                        err = -EFAULT;
3900
        }
3901
 
3902
out:
3903
        free_page((unsigned long) kptr);
3904
        return err;
3905
}
3906
 
3907
struct usbdevfs_bulktransfer32 {
3908
        unsigned int ep;
3909
        unsigned int len;
3910
        unsigned int timeout; /* in milliseconds */
3911
        __u32 data;
3912
};
3913
 
3914
#define USBDEVFS_BULK32              _IOWR('U', 2, struct usbdevfs_bulktransfer32)
3915
 
3916
static int do_usbdevfs_bulk(unsigned int fd, unsigned int cmd, unsigned long arg)
3917
{
3918
        struct usbdevfs_bulktransfer kbulk;
3919
        struct usbdevfs_bulktransfer32 *ubulk;
3920
        mm_segment_t old_fs;
3921
        __u32 udata;
3922
        void *uptr, *kptr;
3923
        int err;
3924
 
3925
        ubulk = (struct usbdevfs_bulktransfer32 *) arg;
3926
 
3927
        if (get_user(kbulk.ep, &ubulk->ep) ||
3928
            get_user(kbulk.len, &ubulk->len) ||
3929
            get_user(kbulk.timeout, &ubulk->timeout) ||
3930
            get_user(udata, &ubulk->data))
3931
                return -EFAULT;
3932
 
3933
        uptr = (void *) A(udata);
3934
 
3935
        /* In usbdevice_fs, it limits the control buffer to a page,
3936
         * for simplicity so do we.
3937
         */
3938
        if (!uptr || kbulk.len > PAGE_SIZE)
3939
                return -EINVAL;
3940
 
3941
        kptr = (void *) __get_free_page(GFP_KERNEL);
3942
 
3943
        if ((kbulk.ep & 0x80) == 0) {
3944
                err = -EFAULT;
3945
                if (copy_from_user(kptr, uptr, kbulk.len))
3946
                        goto out;
3947
        }
3948
 
3949
        kbulk.data = kptr;
3950
 
3951
        old_fs = get_fs();
3952
        set_fs(KERNEL_DS);
3953
        err = sys_ioctl(fd, USBDEVFS_BULK, (unsigned long) &kbulk);
3954
        set_fs(old_fs);
3955
 
3956
        if (err >= 0 &&
3957
            ((kbulk.ep & 0x80) != 0)) {
3958
                if (copy_to_user(uptr, kptr, kbulk.len))
3959
                        err = -EFAULT;
3960
        }
3961
 
3962
out:
3963
        free_page((unsigned long) kptr);
3964
        return err;
3965
}
3966
 
3967
/* This needs more work before we can enable it.  Unfortunately
3968
 * because of the fancy asynchronous way URB status/error is written
3969
 * back to userspace, we'll need to fiddle with USB devio internals
3970
 * and/or reimplement entirely the frontend of it ourselves. -DaveM
3971
 *
3972
 * The issue is:
3973
 *
3974
 *      When an URB is submitted via usbdevicefs it is put onto an
3975
 *      asynchronous queue.  When the URB completes, it may be reaped
3976
 *      via another ioctl.  During this reaping the status is written
3977
 *      back to userspace along with the length of the transfer.
3978
 *
3979
 *      We must translate into 64-bit kernel types so we pass in a kernel
3980
 *      space copy of the usbdevfs_urb structure.  This would mean that we
3981
 *      must do something to deal with the async entry reaping.  First we
3982
 *      have to deal somehow with this transitory memory we've allocated.
3983
 *      This is problematic since there are many call sites from which the
3984
 *      async entries can be destroyed (and thus when we'd need to free up
3985
 *      this kernel memory).  One of which is the close() op of usbdevicefs.
3986
 *      To handle that we'd need to make our own file_operations struct which
3987
 *      overrides usbdevicefs's release op with our own which runs usbdevicefs's
3988
 *      real release op then frees up the kernel memory.
3989
 *
3990
 *      But how to keep track of these kernel buffers?  We'd need to either
3991
 *      keep track of them in some table _or_ know about usbdevicefs internals
3992
 *      (ie. the exact layout of it's file private, which is actually defined
3993
 *      in linux/usbdevice_fs.h, the layout of the async queues are private to
3994
 *      devio.c)
3995
 *
3996
 * There is one possible other solution I considered, also involving knowledge
3997
 * of usbdevicefs internals:
3998
 *
3999
 *      After an URB is submitted, we "fix up" the address back to the user
4000
 *      space one.  This would work if the status/length fields written back
4001
 *      by the async URB completion lines up perfectly in the 32-bit type with
4002
 *      the 64-bit kernel type.  Unfortunately, it does not because the iso
4003
 *      frame descriptors, at the end of the struct, can be written back.
4004
 *
4005
 * I think we'll just need to simply duplicate the devio URB engine here.
4006
 */
4007
#if 0
4008
struct usbdevfs_urb32 {
4009
        __u8 type;
4010
        __u8 endpoint;
4011
        __s32 status;
4012
        __u32 flags;
4013
        __u32 buffer;
4014
        __s32 buffer_length;
4015
        __s32 actual_length;
4016
        __s32 start_frame;
4017
        __s32 number_of_packets;
4018
        __s32 error_count;
4019
        __u32 signr;
4020
        __u32 usercontext; /* unused */
4021
        struct usbdevfs_iso_packet_desc iso_frame_desc[0];
4022
};
4023
 
4024
#define USBDEVFS_SUBMITURB32       _IOR('U', 10, struct usbdevfs_urb32)
4025
 
4026
static int get_urb32(struct usbdevfs_urb *kurb,
4027
                     struct usbdevfs_urb32 *uurb)
4028
{
4029
        if (get_user(kurb->type, &uurb->type) ||
4030
            __get_user(kurb->endpoint, &uurb->endpoint) ||
4031
            __get_user(kurb->status, &uurb->status) ||
4032
            __get_user(kurb->flags, &uurb->flags) ||
4033
            __get_user(kurb->buffer_length, &uurb->buffer_length) ||
4034
            __get_user(kurb->actual_length, &uurb->actual_length) ||
4035
            __get_user(kurb->start_frame, &uurb->start_frame) ||
4036
            __get_user(kurb->number_of_packets, &uurb->number_of_packets) ||
4037
            __get_user(kurb->error_count, &uurb->error_count) ||
4038
            __get_user(kurb->signr, &uurb->signr))
4039
                return -EFAULT;
4040
 
4041
        kurb->usercontext = 0; /* unused currently */
4042
 
4043
        return 0;
4044
}
4045
 
4046
/* Just put back the values which usbdevfs actually changes. */
4047
static int put_urb32(struct usbdevfs_urb *kurb,
4048
                     struct usbdevfs_urb32 *uurb)
4049
{
4050
        if (put_user(kurb->status, &uurb->status) ||
4051
            __put_user(kurb->actual_length, &uurb->actual_length) ||
4052
            __put_user(kurb->error_count, &uurb->error_count))
4053
                return -EFAULT;
4054
 
4055
        if (kurb->number_of_packets != 0) {
4056
                int i;
4057
 
4058
                for (i = 0; i < kurb->number_of_packets; i++) {
4059
                        if (__put_user(kurb->iso_frame_desc[i].actual_length,
4060
                                       &uurb->iso_frame_desc[i].actual_length) ||
4061
                            __put_user(kurb->iso_frame_desc[i].status,
4062
                                       &uurb->iso_frame_desc[i].status))
4063
                                return -EFAULT;
4064
                }
4065
        }
4066
 
4067
        return 0;
4068
}
4069
 
4070
static int get_urb32_isoframes(struct usbdevfs_urb *kurb,
4071
                               struct usbdevfs_urb32 *uurb)
4072
{
4073
        unsigned int totlen;
4074
        int i;
4075
 
4076
        if (kurb->type != USBDEVFS_URB_TYPE_ISO) {
4077
                kurb->number_of_packets = 0;
4078
                return 0;
4079
        }
4080
 
4081
        if (kurb->number_of_packets < 1 ||
4082
            kurb->number_of_packets > 128)
4083
                return -EINVAL;
4084
 
4085
        if (copy_from_user(&kurb->iso_frame_desc[0],
4086
                           &uurb->iso_frame_desc[0],
4087
                           sizeof(struct usbdevfs_iso_packet_desc) *
4088
                           kurb->number_of_packets))
4089
                return -EFAULT;
4090
 
4091
        totlen = 0;
4092
        for (i = 0; i < kurb->number_of_packets; i++) {
4093
                unsigned int this_len;
4094
 
4095
                this_len = kurb->iso_frame_desc[i].length;
4096
                if (this_len > 1023)
4097
                        return -EINVAL;
4098
 
4099
                totlen += this_len;
4100
        }
4101
 
4102
        if (totlen > 32768)
4103
                return -EINVAL;
4104
 
4105
        kurb->buffer_length = totlen;
4106
 
4107
        return 0;
4108
}
4109
 
4110
static int do_usbdevfs_urb(unsigned int fd, unsigned int cmd, unsigned long arg)
4111
{
4112
        struct usbdevfs_urb *kurb;
4113
        struct usbdevfs_urb32 *uurb;
4114
        mm_segment_t old_fs;
4115
        __u32 udata;
4116
        void *uptr, *kptr;
4117
        unsigned int buflen;
4118
        int err;
4119
 
4120
        uurb = (struct usbdevfs_urb32 *) arg;
4121
 
4122
        err = -ENOMEM;
4123
        kurb = kmalloc(sizeof(struct usbdevfs_urb) +
4124
                       (sizeof(struct usbdevfs_iso_packet_desc) * 128),
4125
                       GFP_KERNEL);
4126
        if (!kurb)
4127
                goto out;
4128
 
4129
        err = -EFAULT;
4130
        if (get_urb32(kurb, uurb))
4131
                goto out;
4132
 
4133
        err = get_urb32_isoframes(kurb, uurb);
4134
        if (err)
4135
                goto out;
4136
 
4137
        err = -EFAULT;
4138
        if (__get_user(udata, &uurb->buffer))
4139
                goto out;
4140
        uptr = (void *) A(udata);
4141
 
4142
        err = -ENOMEM;
4143
        buflen = kurb->buffer_length;
4144
        kptr = kmalloc(buflen, GFP_KERNEL);
4145
        if (!kptr)
4146
                goto out;
4147
 
4148
        kurb->buffer = kptr;
4149
 
4150
        err = -EFAULT;
4151
        if (copy_from_user(kptr, uptr, buflen))
4152
                goto out_kptr;
4153
 
4154
        old_fs = get_fs();
4155
        set_fs(KERNEL_DS);
4156
        err = sys_ioctl(fd, USBDEVFS_SUBMITURB, (unsigned long) kurb);
4157
        set_fs(old_fs);
4158
 
4159
        if (err >= 0) {
4160
                /* XXX Shit, this doesn't work for async URBs :-( XXX */
4161
                if (put_urb32(kurb, uurb)) {
4162
                        err = -EFAULT;
4163
                } else if ((kurb->endpoint & USB_DIR_IN) != 0) {
4164
                        if (copy_to_user(uptr, kptr, buflen))
4165
                                err = -EFAULT;
4166
                }
4167
        }
4168
 
4169
out_kptr:
4170
        kfree(kptr);
4171
 
4172
out:
4173
        kfree(kurb);
4174
        return err;
4175
}
4176
#endif
4177
 
4178
#define USBDEVFS_REAPURB32         _IOW('U', 12, u32)
4179
#define USBDEVFS_REAPURBNDELAY32   _IOW('U', 13, u32)
4180
 
4181
static int do_usbdevfs_reapurb(unsigned int fd, unsigned int cmd, unsigned long arg)
4182
{
4183
        mm_segment_t old_fs;
4184
        void *kptr;
4185
        int err;
4186
 
4187
        old_fs = get_fs();
4188
        set_fs(KERNEL_DS);
4189
        err = sys_ioctl(fd,
4190
                        (cmd == USBDEVFS_REAPURB32 ?
4191
                         USBDEVFS_REAPURB :
4192
                         USBDEVFS_REAPURBNDELAY),
4193
                        (unsigned long) &kptr);
4194
        set_fs(old_fs);
4195
 
4196
        if (err >= 0 &&
4197
            put_user(((u32)(long)kptr), (u32 *) A(arg)))
4198
                err = -EFAULT;
4199
 
4200
        return err;
4201
}
4202
 
4203
struct usbdevfs_disconnectsignal32 {
4204
        unsigned int signr;
4205
        u32 context;
4206
};
4207
 
4208
#define USBDEVFS_DISCSIGNAL32      _IOR('U', 14, struct usbdevfs_disconnectsignal32)
4209
 
4210
static int do_usbdevfs_discsignal(unsigned int fd, unsigned int cmd, unsigned long arg)
4211
{
4212
        struct usbdevfs_disconnectsignal kdis;
4213
        struct usbdevfs_disconnectsignal32 *udis;
4214
        mm_segment_t old_fs;
4215
        u32 uctx;
4216
        int err;
4217
 
4218
        udis = (struct usbdevfs_disconnectsignal32 *) arg;
4219
 
4220
        if (get_user(kdis.signr, &udis->signr) ||
4221
            __get_user(uctx, &udis->context))
4222
                return -EFAULT;
4223
 
4224
        kdis.context = (void *) (long)uctx;
4225
 
4226
        old_fs = get_fs();
4227
        set_fs(KERNEL_DS);
4228
        err = sys_ioctl(fd, USBDEVFS_DISCSIGNAL, (unsigned long) &kdis);
4229
        set_fs(old_fs);
4230
 
4231
        return err;
4232
}
4233
 
4234
struct mtd_oob_buf32 {
4235
        u32 start;
4236
        u32 length;
4237
        u32 ptr;        /* unsigned char* */
4238
};
4239
 
4240
#define MEMWRITEOOB32   _IOWR('M',3,struct mtd_oob_buf32)
4241
#define MEMREADOOB32    _IOWR('M',4,struct mtd_oob_buf32)
4242
 
4243
static int mtd_rw_oob(unsigned int fd, unsigned int cmd, unsigned long arg)
4244
{
4245
        struct mtd_oob_buf      *buf = alloc_user_space(sizeof(*buf));
4246
        struct mtd_oob_buf32    *buf32 = (struct mtd_oob_buf32 *) arg;
4247
        u32 data;
4248
        char *datap;
4249
        unsigned int real_cmd;
4250
        int err;
4251
 
4252
        real_cmd = (cmd == MEMREADOOB32) ?
4253
                MEMREADOOB : MEMWRITEOOB;
4254
 
4255
        if (copy_in_user(&buf->start, &buf32->start,
4256
                         2 * sizeof(u32)) ||
4257
            get_user(data, &buf32->ptr))
4258
                return -EFAULT;
4259
        datap = (void *) (unsigned long) data;
4260
        if (put_user(datap, &buf->ptr))
4261
                return -EFAULT;
4262
 
4263
        err = sys_ioctl(fd, real_cmd, (unsigned long) buf);
4264
 
4265
        if (!err) {
4266
                if (copy_in_user(&buf32->start, &buf->start,
4267
                                 2 * sizeof(u32)))
4268
                        err = -EFAULT;
4269
        }
4270
 
4271
        return err;
4272
}
4273
 
4274
/* Fix sizeof(sizeof()) breakage */
4275
#define BLKELVGET_32    _IOR(0x12,106,int)
4276
#define BLKELVSET_32    _IOW(0x12,107,int)
4277
#define BLKBSZGET_32    _IOR(0x12,112,int)
4278
#define BLKBSZSET_32    _IOW(0x12,113,int)
4279
#define BLKGETSIZE64_32 _IOR(0x12,114,int)
4280
 
4281
static int do_blkelvget(unsigned int fd, unsigned int cmd, unsigned long arg)
4282
{
4283
        return sys_ioctl(fd, BLKELVGET, arg);
4284
}
4285
 
4286
static int do_blkelvset(unsigned int fd, unsigned int cmd, unsigned long arg)
4287
{
4288
        return sys_ioctl(fd, BLKELVSET, arg);
4289
}
4290
 
4291
static int do_blkbszget(unsigned int fd, unsigned int cmd, unsigned long arg)
4292
{
4293
        return sys_ioctl(fd, BLKBSZGET, arg);
4294
}
4295
 
4296
static int do_blkbszset(unsigned int fd, unsigned int cmd, unsigned long arg)
4297
{
4298
        return sys_ioctl(fd, BLKBSZSET, arg);
4299
}
4300
 
4301
static int do_blkgetsize64(unsigned int fd, unsigned int cmd,
4302
                           unsigned long arg)
4303
{
4304
        return sys_ioctl(fd, BLKGETSIZE64, arg);
4305
}
4306
 
4307
/* Bluetooth ioctls */
4308
#define HCIUARTSETPROTO _IOW('U', 200, int)
4309
#define HCIUARTGETPROTO _IOR('U', 201, int)
4310
 
4311
#define BNEPCONNADD     _IOW('B', 200, int)
4312
#define BNEPCONNDEL     _IOW('B', 201, int)
4313
#define BNEPGETCONNLIST _IOR('B', 210, int)
4314
#define BNEPGETCONNINFO _IOR('B', 211, int)
4315
 
4316
#define CMTPCONNADD     _IOW('C', 200, int)
4317
#define CMTPCONNDEL     _IOW('C', 201, int)
4318
#define CMTPGETCONNLIST _IOR('C', 210, int)
4319
#define CMTPGETCONNINFO _IOR('C', 211, int)
4320
 
4321
struct ioctl_trans {
4322
        unsigned int cmd;
4323
        unsigned int handler;
4324
        unsigned int next;
4325
};
4326
 
4327
#define COMPATIBLE_IOCTL(cmd) asm volatile(".word %0, sys_ioctl, 0" : : "i" (cmd));
4328
#define HANDLE_IOCTL(cmd,handler) asm volatile(".word %0, %1, 0" : : "i" (cmd), "i" (handler));
4329
#define IOCTL_TABLE_START void ioctl32_foo(void) { asm volatile(".data\nioctl_translations:");
4330
#define IOCTL_TABLE_END asm volatile("\nioctl_translations_end:\n\t.previous"); }
4331
 
4332
IOCTL_TABLE_START
4333
/* List here exlicitly which ioctl's are known to have
4334
 * compatable types passed or none at all...
4335
 */
4336
/* Big T */
4337
COMPATIBLE_IOCTL(TCGETA)
4338
COMPATIBLE_IOCTL(TCSETA)
4339
COMPATIBLE_IOCTL(TCSETAW)
4340
COMPATIBLE_IOCTL(TCSETAF)
4341
COMPATIBLE_IOCTL(TCSBRK)
4342
COMPATIBLE_IOCTL(TCSBRKP)
4343
COMPATIBLE_IOCTL(TCXONC)
4344
COMPATIBLE_IOCTL(TCFLSH)
4345
COMPATIBLE_IOCTL(TCGETS)
4346
COMPATIBLE_IOCTL(TCSETS)
4347
COMPATIBLE_IOCTL(TCSETSW)
4348
COMPATIBLE_IOCTL(TCSETSF)
4349
COMPATIBLE_IOCTL(TIOCLINUX)
4350
COMPATIBLE_IOCTL(TIOCSTART)
4351
COMPATIBLE_IOCTL(TIOCSTOP)
4352
/* Little t */
4353
COMPATIBLE_IOCTL(TIOCGETD)
4354
COMPATIBLE_IOCTL(TIOCSETD)
4355
COMPATIBLE_IOCTL(TIOCEXCL)
4356
COMPATIBLE_IOCTL(TIOCNXCL)
4357
COMPATIBLE_IOCTL(TIOCCONS)
4358
COMPATIBLE_IOCTL(TIOCGSOFTCAR)
4359
COMPATIBLE_IOCTL(TIOCSSOFTCAR)
4360
COMPATIBLE_IOCTL(TIOCSWINSZ)
4361
COMPATIBLE_IOCTL(TIOCGWINSZ)
4362
COMPATIBLE_IOCTL(TIOCMGET)
4363
COMPATIBLE_IOCTL(TIOCMBIC)
4364
COMPATIBLE_IOCTL(TIOCMBIS)
4365
COMPATIBLE_IOCTL(TIOCMSET)
4366
COMPATIBLE_IOCTL(TIOCPKT)
4367
COMPATIBLE_IOCTL(TIOCNOTTY)
4368
COMPATIBLE_IOCTL(TIOCSTI)
4369
COMPATIBLE_IOCTL(TIOCOUTQ)
4370
COMPATIBLE_IOCTL(TIOCSPGRP)
4371
COMPATIBLE_IOCTL(TIOCGPGRP)
4372
COMPATIBLE_IOCTL(TIOCSCTTY)
4373
COMPATIBLE_IOCTL(TIOCGPTN)
4374
COMPATIBLE_IOCTL(TIOCSPTLCK)
4375
COMPATIBLE_IOCTL(TIOCGSERIAL)
4376
COMPATIBLE_IOCTL(TIOCSSERIAL)
4377
COMPATIBLE_IOCTL(TIOCSERGETLSR)
4378
COMPATIBLE_IOCTL(TIOCSLTC)
4379
/* Big F */
4380
COMPATIBLE_IOCTL(FBIOGTYPE)
4381
COMPATIBLE_IOCTL(FBIOSATTR)
4382
COMPATIBLE_IOCTL(FBIOGATTR)
4383
COMPATIBLE_IOCTL(FBIOSVIDEO)
4384
COMPATIBLE_IOCTL(FBIOGVIDEO)
4385
COMPATIBLE_IOCTL(FBIOGCURSOR32)  /* This is not implemented yet. Later it should be converted... */
4386
COMPATIBLE_IOCTL(FBIOSCURPOS)
4387
COMPATIBLE_IOCTL(FBIOGCURPOS)
4388
COMPATIBLE_IOCTL(FBIOGCURMAX)
4389
COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
4390
COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
4391
COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
4392
COMPATIBLE_IOCTL(FBIOGET_FCURSORINFO)
4393
COMPATIBLE_IOCTL(FBIOGET_VCURSORINFO)
4394
COMPATIBLE_IOCTL(FBIOPUT_VCURSORINFO)
4395
COMPATIBLE_IOCTL(FBIOGET_CURSORSTATE)
4396
COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE)
4397
COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP)
4398
COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP)
4399
/* Little f */
4400
COMPATIBLE_IOCTL(FIOCLEX)
4401
COMPATIBLE_IOCTL(FIONCLEX)
4402
COMPATIBLE_IOCTL(FIOASYNC)
4403
COMPATIBLE_IOCTL(FIONBIO)
4404
COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
4405
/* 0x00 */
4406
COMPATIBLE_IOCTL(FIBMAP)
4407
COMPATIBLE_IOCTL(FIGETBSZ)
4408
/* 0x03 -- HD/IDE ioctl's used by hdparm and friends.
4409
 *         Some need translations, these do not.
4410
 */
4411
COMPATIBLE_IOCTL(HDIO_GET_IDENTITY)
4412
COMPATIBLE_IOCTL(HDIO_SET_DMA)
4413
COMPATIBLE_IOCTL(HDIO_SET_KEEPSETTINGS)
4414
COMPATIBLE_IOCTL(HDIO_SET_UNMASKINTR)
4415
COMPATIBLE_IOCTL(HDIO_SET_NOWERR)
4416
COMPATIBLE_IOCTL(HDIO_SET_32BIT)
4417
COMPATIBLE_IOCTL(HDIO_SET_MULTCOUNT)
4418
COMPATIBLE_IOCTL(HDIO_DRIVE_CMD)
4419
COMPATIBLE_IOCTL(HDIO_SET_PIO_MODE)
4420
COMPATIBLE_IOCTL(HDIO_SCAN_HWIF)
4421
COMPATIBLE_IOCTL(HDIO_SET_NICE)
4422
/* 0x02 -- Floppy ioctls */
4423
COMPATIBLE_IOCTL(FDMSGON)
4424
COMPATIBLE_IOCTL(FDMSGOFF)
4425
COMPATIBLE_IOCTL(FDSETEMSGTRESH)
4426
COMPATIBLE_IOCTL(FDFLUSH)
4427
COMPATIBLE_IOCTL(FDWERRORCLR)
4428
COMPATIBLE_IOCTL(FDSETMAXERRS)
4429
COMPATIBLE_IOCTL(FDGETMAXERRS)
4430
COMPATIBLE_IOCTL(FDGETDRVTYP)
4431
COMPATIBLE_IOCTL(FDEJECT)
4432
COMPATIBLE_IOCTL(FDCLRPRM)
4433
COMPATIBLE_IOCTL(FDFMTBEG)
4434
COMPATIBLE_IOCTL(FDFMTEND)
4435
COMPATIBLE_IOCTL(FDRESET)
4436
COMPATIBLE_IOCTL(FDTWADDLE)
4437
COMPATIBLE_IOCTL(FDFMTTRK)
4438
COMPATIBLE_IOCTL(FDRAWCMD)
4439
/* 0x12 */
4440
COMPATIBLE_IOCTL(BLKROSET)
4441
COMPATIBLE_IOCTL(BLKROGET)
4442
COMPATIBLE_IOCTL(BLKRRPART)
4443
COMPATIBLE_IOCTL(BLKFLSBUF)
4444
COMPATIBLE_IOCTL(BLKRASET)
4445
COMPATIBLE_IOCTL(BLKFRASET)
4446
COMPATIBLE_IOCTL(BLKSECTSET)
4447
COMPATIBLE_IOCTL(BLKSSZGET)
4448
/* RAID */
4449
COMPATIBLE_IOCTL(RAID_VERSION)
4450
COMPATIBLE_IOCTL(GET_ARRAY_INFO)
4451
COMPATIBLE_IOCTL(GET_DISK_INFO)
4452
COMPATIBLE_IOCTL(PRINT_RAID_DEBUG)
4453
COMPATIBLE_IOCTL(CLEAR_ARRAY)
4454
COMPATIBLE_IOCTL(ADD_NEW_DISK)
4455
COMPATIBLE_IOCTL(HOT_REMOVE_DISK)
4456
COMPATIBLE_IOCTL(SET_ARRAY_INFO)
4457
COMPATIBLE_IOCTL(SET_DISK_INFO)
4458
COMPATIBLE_IOCTL(WRITE_RAID_INFO)
4459
COMPATIBLE_IOCTL(UNPROTECT_ARRAY)
4460
COMPATIBLE_IOCTL(PROTECT_ARRAY)
4461
COMPATIBLE_IOCTL(HOT_ADD_DISK)
4462
COMPATIBLE_IOCTL(SET_DISK_FAULTY)
4463
COMPATIBLE_IOCTL(RUN_ARRAY)
4464
COMPATIBLE_IOCTL(START_ARRAY)
4465
COMPATIBLE_IOCTL(STOP_ARRAY)
4466
COMPATIBLE_IOCTL(STOP_ARRAY_RO)
4467
COMPATIBLE_IOCTL(RESTART_ARRAY_RW)
4468
COMPATIBLE_IOCTL(RAID_AUTORUN)
4469
 
4470
/* Big K */
4471
COMPATIBLE_IOCTL(PIO_FONT)
4472
COMPATIBLE_IOCTL(GIO_FONT)
4473
COMPATIBLE_IOCTL(KDSIGACCEPT)
4474
COMPATIBLE_IOCTL(KDGETKEYCODE)
4475
COMPATIBLE_IOCTL(KDSETKEYCODE)
4476
COMPATIBLE_IOCTL(KIOCSOUND)
4477
COMPATIBLE_IOCTL(KDMKTONE)
4478
COMPATIBLE_IOCTL(KDGKBTYPE)
4479
COMPATIBLE_IOCTL(KDSETMODE)
4480
COMPATIBLE_IOCTL(KDGETMODE)
4481
COMPATIBLE_IOCTL(KDSKBMODE)
4482
COMPATIBLE_IOCTL(KDGKBMODE)
4483
COMPATIBLE_IOCTL(KDSKBMETA)
4484
COMPATIBLE_IOCTL(KDGKBMETA)
4485
COMPATIBLE_IOCTL(KDGKBENT)
4486
COMPATIBLE_IOCTL(KDSKBENT)
4487
COMPATIBLE_IOCTL(KDGKBSENT)
4488
COMPATIBLE_IOCTL(KDSKBSENT)
4489
COMPATIBLE_IOCTL(KDGKBDIACR)
4490
COMPATIBLE_IOCTL(KDKBDREP)
4491
COMPATIBLE_IOCTL(KDSKBDIACR)
4492
COMPATIBLE_IOCTL(KDGKBLED)
4493
COMPATIBLE_IOCTL(KDSKBLED)
4494
COMPATIBLE_IOCTL(KDGETLED)
4495
COMPATIBLE_IOCTL(KDSETLED)
4496
COMPATIBLE_IOCTL(GIO_SCRNMAP)
4497
COMPATIBLE_IOCTL(PIO_SCRNMAP)
4498
COMPATIBLE_IOCTL(GIO_UNISCRNMAP)
4499
COMPATIBLE_IOCTL(PIO_UNISCRNMAP)
4500
COMPATIBLE_IOCTL(PIO_FONTRESET)
4501
COMPATIBLE_IOCTL(PIO_UNIMAPCLR)
4502
/* Little k */
4503
COMPATIBLE_IOCTL(KIOCTYPE)
4504
COMPATIBLE_IOCTL(KIOCLAYOUT)
4505
COMPATIBLE_IOCTL(KIOCGTRANS)
4506
COMPATIBLE_IOCTL(KIOCTRANS)
4507
COMPATIBLE_IOCTL(KIOCCMD)
4508
COMPATIBLE_IOCTL(KIOCSDIRECT)
4509
COMPATIBLE_IOCTL(KIOCSLED)
4510
COMPATIBLE_IOCTL(KIOCGLED)
4511
COMPATIBLE_IOCTL(KIOCSRATE)
4512
COMPATIBLE_IOCTL(KIOCGRATE)
4513
/* Big S */
4514
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_IDLUN)
4515
COMPATIBLE_IOCTL(SCSI_IOCTL_PROBE_HOST)
4516
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI)
4517
COMPATIBLE_IOCTL(SCSI_IOCTL_DOORLOCK)
4518
COMPATIBLE_IOCTL(SCSI_IOCTL_DOORUNLOCK)
4519
COMPATIBLE_IOCTL(SCSI_IOCTL_TEST_UNIT_READY)
4520
COMPATIBLE_IOCTL(SCSI_IOCTL_TAGGED_ENABLE)
4521
COMPATIBLE_IOCTL(SCSI_IOCTL_TAGGED_DISABLE)
4522
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER)
4523
COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND)
4524
/* Big T */
4525
COMPATIBLE_IOCTL(TUNSETNOCSUM)
4526
COMPATIBLE_IOCTL(TUNSETDEBUG)
4527
COMPATIBLE_IOCTL(TUNSETPERSIST)
4528
COMPATIBLE_IOCTL(TUNSETOWNER)
4529
/* Big V */
4530
COMPATIBLE_IOCTL(VT_SETMODE)
4531
COMPATIBLE_IOCTL(VT_GETMODE)
4532
COMPATIBLE_IOCTL(VT_GETSTATE)
4533
COMPATIBLE_IOCTL(VT_OPENQRY)
4534
COMPATIBLE_IOCTL(VT_ACTIVATE)
4535
COMPATIBLE_IOCTL(VT_WAITACTIVE)
4536
COMPATIBLE_IOCTL(VT_RELDISP)
4537
COMPATIBLE_IOCTL(VT_DISALLOCATE)
4538
COMPATIBLE_IOCTL(VT_RESIZE)
4539
COMPATIBLE_IOCTL(VT_RESIZEX)
4540
COMPATIBLE_IOCTL(VT_LOCKSWITCH)
4541
COMPATIBLE_IOCTL(VT_UNLOCKSWITCH)
4542
/* Little v */
4543
COMPATIBLE_IOCTL(VUIDSFORMAT)
4544
COMPATIBLE_IOCTL(VUIDGFORMAT)
4545
/* Little v, the video4linux ioctls */
4546
COMPATIBLE_IOCTL(VIDIOCGCAP)
4547
COMPATIBLE_IOCTL(VIDIOCGCHAN)
4548
COMPATIBLE_IOCTL(VIDIOCSCHAN)
4549
COMPATIBLE_IOCTL(VIDIOCGPICT)
4550
COMPATIBLE_IOCTL(VIDIOCSPICT)
4551
COMPATIBLE_IOCTL(VIDIOCCAPTURE)
4552
COMPATIBLE_IOCTL(VIDIOCKEY)
4553
COMPATIBLE_IOCTL(VIDIOCGAUDIO)
4554
COMPATIBLE_IOCTL(VIDIOCSAUDIO)
4555
COMPATIBLE_IOCTL(VIDIOCSYNC)
4556
COMPATIBLE_IOCTL(VIDIOCMCAPTURE)
4557
COMPATIBLE_IOCTL(VIDIOCGMBUF)
4558
COMPATIBLE_IOCTL(VIDIOCGUNIT)
4559
COMPATIBLE_IOCTL(VIDIOCGCAPTURE)
4560
COMPATIBLE_IOCTL(VIDIOCSCAPTURE)
4561
/* BTTV specific... */
4562
COMPATIBLE_IOCTL(_IOW('v',  BASE_VIDIOCPRIVATE+0, char [256]))
4563
COMPATIBLE_IOCTL(_IOR('v',  BASE_VIDIOCPRIVATE+1, char [256]))
4564
COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+2, unsigned int))
4565
COMPATIBLE_IOCTL(_IOW('v' , BASE_VIDIOCPRIVATE+3, char [16])) /* struct bttv_pll_info */
4566
COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+4, int))
4567
COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+5, int))
4568
COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+6, int))
4569
COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+7, int))
4570
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
4571
COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
4572
COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
4573
COMPATIBLE_IOCTL(RTC_AIE_ON)
4574
COMPATIBLE_IOCTL(RTC_AIE_OFF)
4575
COMPATIBLE_IOCTL(RTC_UIE_ON)
4576
COMPATIBLE_IOCTL(RTC_UIE_OFF)
4577
COMPATIBLE_IOCTL(RTC_PIE_ON)
4578
COMPATIBLE_IOCTL(RTC_PIE_OFF)
4579
COMPATIBLE_IOCTL(RTC_WIE_ON)
4580
COMPATIBLE_IOCTL(RTC_WIE_OFF)
4581
COMPATIBLE_IOCTL(RTC_ALM_SET)
4582
COMPATIBLE_IOCTL(RTC_ALM_READ)
4583
COMPATIBLE_IOCTL(RTC_RD_TIME)
4584
COMPATIBLE_IOCTL(RTC_SET_TIME)
4585
COMPATIBLE_IOCTL(RTC_WKALM_SET)
4586
COMPATIBLE_IOCTL(RTC_WKALM_RD)
4587
COMPATIBLE_IOCTL(ENVCTRL_RD_WARNING_TEMPERATURE)
4588
COMPATIBLE_IOCTL(ENVCTRL_RD_SHUTDOWN_TEMPERATURE)
4589
COMPATIBLE_IOCTL(ENVCTRL_RD_CPU_TEMPERATURE)
4590
COMPATIBLE_IOCTL(ENVCTRL_RD_FAN_STATUS)
4591
COMPATIBLE_IOCTL(ENVCTRL_RD_VOLTAGE_STATUS)
4592
COMPATIBLE_IOCTL(ENVCTRL_RD_SCSI_TEMPERATURE)
4593
COMPATIBLE_IOCTL(ENVCTRL_RD_ETHERNET_TEMPERATURE)
4594
COMPATIBLE_IOCTL(ENVCTRL_RD_MTHRBD_TEMPERATURE)
4595
COMPATIBLE_IOCTL(ENVCTRL_RD_CPU_VOLTAGE)
4596
COMPATIBLE_IOCTL(ENVCTRL_RD_GLOBALADDRESS)
4597
/* COMPATIBLE_IOCTL(D7SIOCRD) same value as ENVCTRL_RD_VOLTAGE_STATUS */
4598
COMPATIBLE_IOCTL(D7SIOCWR)
4599
COMPATIBLE_IOCTL(D7SIOCTM)
4600
/* Little m */
4601
COMPATIBLE_IOCTL(MTIOCTOP)
4602
/* OPENPROMIO, SunOS/Solaris only, the NetBSD one's have
4603
 * embedded pointers in the arg which we'd need to clean up...
4604
 */
4605
COMPATIBLE_IOCTL(OPROMGETOPT)
4606
COMPATIBLE_IOCTL(OPROMSETOPT)
4607
COMPATIBLE_IOCTL(OPROMNXTOPT)
4608
COMPATIBLE_IOCTL(OPROMSETOPT2)
4609
COMPATIBLE_IOCTL(OPROMNEXT)
4610
COMPATIBLE_IOCTL(OPROMCHILD)
4611
COMPATIBLE_IOCTL(OPROMGETPROP)
4612
COMPATIBLE_IOCTL(OPROMNXTPROP)
4613
COMPATIBLE_IOCTL(OPROMU2P)
4614
COMPATIBLE_IOCTL(OPROMGETCONS)
4615
COMPATIBLE_IOCTL(OPROMGETFBNAME)
4616
COMPATIBLE_IOCTL(OPROMGETBOOTARGS)
4617
COMPATIBLE_IOCTL(OPROMSETCUR)
4618
COMPATIBLE_IOCTL(OPROMPCI2NODE)
4619
COMPATIBLE_IOCTL(OPROMPATH2NODE)
4620
/* Socket level stuff */
4621
COMPATIBLE_IOCTL(FIOSETOWN)
4622
COMPATIBLE_IOCTL(SIOCSPGRP)
4623
COMPATIBLE_IOCTL(FIOGETOWN)
4624
COMPATIBLE_IOCTL(SIOCGPGRP)
4625
COMPATIBLE_IOCTL(SIOCATMARK)
4626
COMPATIBLE_IOCTL(SIOCSIFLINK)
4627
COMPATIBLE_IOCTL(SIOCSIFENCAP)
4628
COMPATIBLE_IOCTL(SIOCGIFENCAP)
4629
COMPATIBLE_IOCTL(SIOCSIFBR)
4630
COMPATIBLE_IOCTL(SIOCGIFBR)
4631
COMPATIBLE_IOCTL(SIOCSARP)
4632
COMPATIBLE_IOCTL(SIOCGARP)
4633
COMPATIBLE_IOCTL(SIOCDARP)
4634
COMPATIBLE_IOCTL(SIOCSRARP)
4635
COMPATIBLE_IOCTL(SIOCGRARP)
4636
COMPATIBLE_IOCTL(SIOCDRARP)
4637
COMPATIBLE_IOCTL(SIOCADDDLCI)
4638
COMPATIBLE_IOCTL(SIOCDELDLCI)
4639
COMPATIBLE_IOCTL(SIOCGMIIPHY)
4640
COMPATIBLE_IOCTL(SIOCGMIIREG)
4641
COMPATIBLE_IOCTL(SIOCSMIIREG)
4642
COMPATIBLE_IOCTL(SIOCGIFVLAN)
4643
COMPATIBLE_IOCTL(SIOCSIFVLAN)
4644
/* SG stuff */
4645
COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
4646
COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
4647
COMPATIBLE_IOCTL(SG_EMULATED_HOST)
4648
COMPATIBLE_IOCTL(SG_SET_TRANSFORM)
4649
COMPATIBLE_IOCTL(SG_GET_TRANSFORM)
4650
COMPATIBLE_IOCTL(SG_SET_RESERVED_SIZE)
4651
COMPATIBLE_IOCTL(SG_GET_RESERVED_SIZE)
4652
COMPATIBLE_IOCTL(SG_GET_SCSI_ID)
4653
COMPATIBLE_IOCTL(SG_SET_FORCE_LOW_DMA)
4654
COMPATIBLE_IOCTL(SG_GET_LOW_DMA)
4655
COMPATIBLE_IOCTL(SG_SET_FORCE_PACK_ID)
4656
COMPATIBLE_IOCTL(SG_GET_PACK_ID)
4657
COMPATIBLE_IOCTL(SG_GET_NUM_WAITING)
4658
COMPATIBLE_IOCTL(SG_SET_DEBUG)
4659
COMPATIBLE_IOCTL(SG_GET_SG_TABLESIZE)
4660
COMPATIBLE_IOCTL(SG_GET_COMMAND_Q)
4661
COMPATIBLE_IOCTL(SG_SET_COMMAND_Q)
4662
COMPATIBLE_IOCTL(SG_GET_VERSION_NUM)
4663
COMPATIBLE_IOCTL(SG_NEXT_CMD_LEN)
4664
COMPATIBLE_IOCTL(SG_SCSI_RESET)
4665
COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
4666
COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
4667
COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
4668
/* PPP stuff */
4669
COMPATIBLE_IOCTL(PPPIOCGFLAGS)
4670
COMPATIBLE_IOCTL(PPPIOCSFLAGS)
4671
COMPATIBLE_IOCTL(PPPIOCGASYNCMAP)
4672
COMPATIBLE_IOCTL(PPPIOCSASYNCMAP)
4673
COMPATIBLE_IOCTL(PPPIOCGUNIT)
4674
COMPATIBLE_IOCTL(PPPIOCGRASYNCMAP)
4675
COMPATIBLE_IOCTL(PPPIOCSRASYNCMAP)
4676
COMPATIBLE_IOCTL(PPPIOCGMRU)
4677
COMPATIBLE_IOCTL(PPPIOCSMRU)
4678
COMPATIBLE_IOCTL(PPPIOCSMAXCID)
4679
COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP)
4680
COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP)
4681
COMPATIBLE_IOCTL(PPPIOCXFERUNIT)
4682
/* PPPIOCSCOMPRESS is translated */
4683
COMPATIBLE_IOCTL(PPPIOCGNPMODE)
4684
COMPATIBLE_IOCTL(PPPIOCSNPMODE)
4685
/* PPPIOCSPASS is translated */
4686
/* PPPIOCSACTIVE is translated */
4687
COMPATIBLE_IOCTL(PPPIOCGDEBUG)
4688
COMPATIBLE_IOCTL(PPPIOCSDEBUG)
4689
/* PPPIOCGIDLE is translated */
4690
COMPATIBLE_IOCTL(PPPIOCNEWUNIT)
4691
COMPATIBLE_IOCTL(PPPIOCATTACH)
4692
COMPATIBLE_IOCTL(PPPIOCDETACH)
4693
COMPATIBLE_IOCTL(PPPIOCSMRRU)
4694
COMPATIBLE_IOCTL(PPPIOCCONNECT)
4695
COMPATIBLE_IOCTL(PPPIOCDISCONN)
4696
COMPATIBLE_IOCTL(PPPIOCATTCHAN)
4697
COMPATIBLE_IOCTL(PPPIOCGCHAN)
4698
/* LP */
4699
COMPATIBLE_IOCTL(LPGETSTATUS)
4700
/* PPPOX */
4701
COMPATIBLE_IOCTL(PPPOEIOCSFWD)
4702
COMPATIBLE_IOCTL(PPPOEIOCDFWD)
4703
/* CDROM stuff */
4704
COMPATIBLE_IOCTL(CDROMPAUSE)
4705
COMPATIBLE_IOCTL(CDROMRESUME)
4706
COMPATIBLE_IOCTL(CDROMPLAYMSF)
4707
COMPATIBLE_IOCTL(CDROMPLAYTRKIND)
4708
COMPATIBLE_IOCTL(CDROMREADTOCHDR)
4709
COMPATIBLE_IOCTL(CDROMREADTOCENTRY)
4710
COMPATIBLE_IOCTL(CDROMSTOP)
4711
COMPATIBLE_IOCTL(CDROMSTART)
4712
COMPATIBLE_IOCTL(CDROMEJECT)
4713
COMPATIBLE_IOCTL(CDROMVOLCTRL)
4714
COMPATIBLE_IOCTL(CDROMSUBCHNL)
4715
COMPATIBLE_IOCTL(CDROMEJECT_SW)
4716
COMPATIBLE_IOCTL(CDROMMULTISESSION)
4717
COMPATIBLE_IOCTL(CDROM_GET_MCN)
4718
COMPATIBLE_IOCTL(CDROMRESET)
4719
COMPATIBLE_IOCTL(CDROMVOLREAD)
4720
COMPATIBLE_IOCTL(CDROMSEEK)
4721
COMPATIBLE_IOCTL(CDROMPLAYBLK)
4722
COMPATIBLE_IOCTL(CDROMCLOSETRAY)
4723
COMPATIBLE_IOCTL(CDROM_SET_OPTIONS)
4724
COMPATIBLE_IOCTL(CDROM_CLEAR_OPTIONS)
4725
COMPATIBLE_IOCTL(CDROM_SELECT_SPEED)
4726
COMPATIBLE_IOCTL(CDROM_SELECT_DISC)
4727
COMPATIBLE_IOCTL(CDROM_MEDIA_CHANGED)
4728
COMPATIBLE_IOCTL(CDROM_DRIVE_STATUS)
4729
COMPATIBLE_IOCTL(CDROM_DISC_STATUS)
4730
COMPATIBLE_IOCTL(CDROM_CHANGER_NSLOTS)
4731
COMPATIBLE_IOCTL(CDROM_LOCKDOOR)
4732
COMPATIBLE_IOCTL(CDROM_DEBUG)
4733
COMPATIBLE_IOCTL(CDROM_GET_CAPABILITY)
4734
/* Ignore cdrom.h about these next 5 ioctls, they absolutely do
4735
 * not take a struct cdrom_read, instead they take a struct cdrom_msf
4736
 * which is compatible.
4737
 */
4738
COMPATIBLE_IOCTL(CDROMREADMODE2)
4739
COMPATIBLE_IOCTL(CDROMREADMODE1)
4740
COMPATIBLE_IOCTL(CDROMREADRAW)
4741
COMPATIBLE_IOCTL(CDROMREADCOOKED)
4742
COMPATIBLE_IOCTL(CDROMREADALL)
4743
/* DVD ioctls */
4744
COMPATIBLE_IOCTL(DVD_READ_STRUCT)
4745
COMPATIBLE_IOCTL(DVD_WRITE_STRUCT)
4746
COMPATIBLE_IOCTL(DVD_AUTH)
4747
/* Big L */
4748
COMPATIBLE_IOCTL(LOOP_SET_FD)
4749
COMPATIBLE_IOCTL(LOOP_CLR_FD)
4750
/* Big A */
4751
COMPATIBLE_IOCTL(AUDIO_GETINFO)
4752
COMPATIBLE_IOCTL(AUDIO_SETINFO)
4753
COMPATIBLE_IOCTL(AUDIO_DRAIN)
4754
COMPATIBLE_IOCTL(AUDIO_GETDEV)
4755
COMPATIBLE_IOCTL(AUDIO_GETDEV_SUNOS)
4756
COMPATIBLE_IOCTL(AUDIO_FLUSH)
4757
/* Big Q for sound/OSS */
4758
COMPATIBLE_IOCTL(SNDCTL_SEQ_RESET)
4759
COMPATIBLE_IOCTL(SNDCTL_SEQ_SYNC)
4760
COMPATIBLE_IOCTL(SNDCTL_SYNTH_INFO)
4761
COMPATIBLE_IOCTL(SNDCTL_SEQ_CTRLRATE)
4762
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETOUTCOUNT)
4763
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETINCOUNT)
4764
COMPATIBLE_IOCTL(SNDCTL_SEQ_PERCMODE)
4765
COMPATIBLE_IOCTL(SNDCTL_FM_LOAD_INSTR)
4766
COMPATIBLE_IOCTL(SNDCTL_SEQ_TESTMIDI)
4767
COMPATIBLE_IOCTL(SNDCTL_SEQ_RESETSAMPLES)
4768
COMPATIBLE_IOCTL(SNDCTL_SEQ_NRSYNTHS)
4769
COMPATIBLE_IOCTL(SNDCTL_SEQ_NRMIDIS)
4770
COMPATIBLE_IOCTL(SNDCTL_MIDI_INFO)
4771
COMPATIBLE_IOCTL(SNDCTL_SEQ_THRESHOLD)
4772
COMPATIBLE_IOCTL(SNDCTL_SYNTH_MEMAVL)
4773
COMPATIBLE_IOCTL(SNDCTL_FM_4OP_ENABLE)
4774
COMPATIBLE_IOCTL(SNDCTL_SEQ_PANIC)
4775
COMPATIBLE_IOCTL(SNDCTL_SEQ_OUTOFBAND)
4776
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETTIME)
4777
COMPATIBLE_IOCTL(SNDCTL_SYNTH_ID)
4778
COMPATIBLE_IOCTL(SNDCTL_SYNTH_CONTROL)
4779
COMPATIBLE_IOCTL(SNDCTL_SYNTH_REMOVESAMPLE)
4780
/* Big T for sound/OSS */
4781
COMPATIBLE_IOCTL(SNDCTL_TMR_TIMEBASE)
4782
COMPATIBLE_IOCTL(SNDCTL_TMR_START)
4783
COMPATIBLE_IOCTL(SNDCTL_TMR_STOP)
4784
COMPATIBLE_IOCTL(SNDCTL_TMR_CONTINUE)
4785
COMPATIBLE_IOCTL(SNDCTL_TMR_TEMPO)
4786
COMPATIBLE_IOCTL(SNDCTL_TMR_SOURCE)
4787
COMPATIBLE_IOCTL(SNDCTL_TMR_METRONOME)
4788
COMPATIBLE_IOCTL(SNDCTL_TMR_SELECT)
4789
/* Little m for sound/OSS */
4790
COMPATIBLE_IOCTL(SNDCTL_MIDI_PRETIME)
4791
COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUMODE)
4792
COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUCMD)
4793
/* Big P for sound/OSS */
4794
COMPATIBLE_IOCTL(SNDCTL_DSP_RESET)
4795
COMPATIBLE_IOCTL(SNDCTL_DSP_SYNC)
4796
COMPATIBLE_IOCTL(SNDCTL_DSP_SPEED)
4797
COMPATIBLE_IOCTL(SNDCTL_DSP_STEREO)
4798
COMPATIBLE_IOCTL(SNDCTL_DSP_GETBLKSIZE)
4799
COMPATIBLE_IOCTL(SNDCTL_DSP_CHANNELS)
4800
COMPATIBLE_IOCTL(SOUND_PCM_WRITE_FILTER)
4801
COMPATIBLE_IOCTL(SNDCTL_DSP_POST)
4802
COMPATIBLE_IOCTL(SNDCTL_DSP_SUBDIVIDE)
4803
COMPATIBLE_IOCTL(SNDCTL_DSP_SETFRAGMENT)
4804
COMPATIBLE_IOCTL(SNDCTL_DSP_GETFMTS)
4805
COMPATIBLE_IOCTL(SNDCTL_DSP_SETFMT)
4806
COMPATIBLE_IOCTL(SNDCTL_DSP_GETOSPACE)
4807
COMPATIBLE_IOCTL(SNDCTL_DSP_GETISPACE)
4808
COMPATIBLE_IOCTL(SNDCTL_DSP_NONBLOCK)
4809
COMPATIBLE_IOCTL(SNDCTL_DSP_GETCAPS)
4810
COMPATIBLE_IOCTL(SNDCTL_DSP_GETTRIGGER)
4811
COMPATIBLE_IOCTL(SNDCTL_DSP_SETTRIGGER)
4812
COMPATIBLE_IOCTL(SNDCTL_DSP_GETIPTR)
4813
COMPATIBLE_IOCTL(SNDCTL_DSP_GETOPTR)
4814
/* SNDCTL_DSP_MAPINBUF,  XXX needs translation */
4815
/* SNDCTL_DSP_MAPOUTBUF,  XXX needs translation */
4816
COMPATIBLE_IOCTL(SNDCTL_DSP_SETSYNCRO)
4817
COMPATIBLE_IOCTL(SNDCTL_DSP_SETDUPLEX)
4818
COMPATIBLE_IOCTL(SNDCTL_DSP_GETODELAY)
4819
COMPATIBLE_IOCTL(SNDCTL_DSP_PROFILE)
4820
COMPATIBLE_IOCTL(SOUND_PCM_READ_RATE)
4821
COMPATIBLE_IOCTL(SOUND_PCM_READ_CHANNELS)
4822
COMPATIBLE_IOCTL(SOUND_PCM_READ_BITS)
4823
COMPATIBLE_IOCTL(SOUND_PCM_READ_FILTER)
4824
/* Big C for sound/OSS */
4825
COMPATIBLE_IOCTL(SNDCTL_COPR_RESET)
4826
COMPATIBLE_IOCTL(SNDCTL_COPR_LOAD)
4827
COMPATIBLE_IOCTL(SNDCTL_COPR_RDATA)
4828
COMPATIBLE_IOCTL(SNDCTL_COPR_RCODE)
4829
COMPATIBLE_IOCTL(SNDCTL_COPR_WDATA)
4830
COMPATIBLE_IOCTL(SNDCTL_COPR_WCODE)
4831
COMPATIBLE_IOCTL(SNDCTL_COPR_RUN)
4832
COMPATIBLE_IOCTL(SNDCTL_COPR_HALT)
4833
COMPATIBLE_IOCTL(SNDCTL_COPR_SENDMSG)
4834
COMPATIBLE_IOCTL(SNDCTL_COPR_RCVMSG)
4835
/* Big M for sound/OSS */
4836
COMPATIBLE_IOCTL(SOUND_MIXER_READ_VOLUME)
4837
COMPATIBLE_IOCTL(SOUND_MIXER_READ_BASS)
4838
COMPATIBLE_IOCTL(SOUND_MIXER_READ_TREBLE)
4839
COMPATIBLE_IOCTL(SOUND_MIXER_READ_SYNTH)
4840
COMPATIBLE_IOCTL(SOUND_MIXER_READ_PCM)
4841
COMPATIBLE_IOCTL(SOUND_MIXER_READ_SPEAKER)
4842
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE)
4843
COMPATIBLE_IOCTL(SOUND_MIXER_READ_MIC)
4844
COMPATIBLE_IOCTL(SOUND_MIXER_READ_CD)
4845
COMPATIBLE_IOCTL(SOUND_MIXER_READ_IMIX)
4846
COMPATIBLE_IOCTL(SOUND_MIXER_READ_ALTPCM)
4847
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECLEV)
4848
COMPATIBLE_IOCTL(SOUND_MIXER_READ_IGAIN)
4849
COMPATIBLE_IOCTL(SOUND_MIXER_READ_OGAIN)
4850
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE1)
4851
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE2)
4852
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE3)
4853
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL1))
4854
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL2))
4855
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL3))
4856
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_PHONEIN))
4857
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_PHONEOUT))
4858
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_VIDEO))
4859
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_RADIO))
4860
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_MONITOR))
4861
COMPATIBLE_IOCTL(SOUND_MIXER_READ_MUTE)
4862
/* SOUND_MIXER_READ_ENHANCE,  same value as READ_MUTE */
4863
/* SOUND_MIXER_READ_LOUD,  same value as READ_MUTE */
4864
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECSRC)
4865
COMPATIBLE_IOCTL(SOUND_MIXER_READ_DEVMASK)
4866
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECMASK)
4867
COMPATIBLE_IOCTL(SOUND_MIXER_READ_STEREODEVS)
4868
COMPATIBLE_IOCTL(SOUND_MIXER_READ_CAPS)
4869
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_VOLUME)
4870
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_BASS)
4871
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_TREBLE)
4872
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SYNTH)
4873
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_PCM)
4874
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SPEAKER)
4875
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE)
4876
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MIC)
4877
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_CD)
4878
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IMIX)
4879
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_ALTPCM)
4880
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECLEV)
4881
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IGAIN)
4882
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_OGAIN)
4883
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE1)
4884
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE2)
4885
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE3)
4886
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL1))
4887
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL2))
4888
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL3))
4889
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_PHONEIN))
4890
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_PHONEOUT))
4891
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_VIDEO))
4892
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_RADIO))
4893
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_MONITOR))
4894
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MUTE)
4895
/* SOUND_MIXER_WRITE_ENHANCE,  same value as WRITE_MUTE */
4896
/* SOUND_MIXER_WRITE_LOUD,  same value as WRITE_MUTE */
4897
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECSRC)
4898
COMPATIBLE_IOCTL(SOUND_MIXER_INFO)
4899
COMPATIBLE_IOCTL(SOUND_OLD_MIXER_INFO)
4900
COMPATIBLE_IOCTL(SOUND_MIXER_ACCESS)
4901
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE1)
4902
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE2)
4903
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE3)
4904
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE4)
4905
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE5)
4906
COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
4907
COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
4908
COMPATIBLE_IOCTL(OSS_GETVERSION)
4909
/* AUTOFS */
4910
COMPATIBLE_IOCTL(AUTOFS_IOC_READY)
4911
COMPATIBLE_IOCTL(AUTOFS_IOC_FAIL)
4912
COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC)
4913
COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
4914
COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
4915
COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
4916
/* DEVFS */
4917
COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
4918
COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)
4919
COMPATIBLE_IOCTL(DEVFSDIOC_RELEASE_EVENT_QUEUE)
4920
COMPATIBLE_IOCTL(DEVFSDIOC_SET_DEBUG_MASK)
4921
/* Raw devices */
4922
COMPATIBLE_IOCTL(RAW_SETBIND)
4923
COMPATIBLE_IOCTL(RAW_GETBIND)
4924
/* SMB ioctls which do not need any translations */
4925
COMPATIBLE_IOCTL(SMB_IOC_NEWCONN)
4926
/* NCP ioctls which do not need any translations */
4927
COMPATIBLE_IOCTL(NCP_IOC_CONN_LOGGED_IN)
4928
COMPATIBLE_IOCTL(NCP_IOC_SIGN_INIT)
4929
COMPATIBLE_IOCTL(NCP_IOC_SIGN_WANTED)
4930
COMPATIBLE_IOCTL(NCP_IOC_SET_SIGN_WANTED)
4931
COMPATIBLE_IOCTL(NCP_IOC_LOCKUNLOCK)
4932
COMPATIBLE_IOCTL(NCP_IOC_GETROOT)
4933
COMPATIBLE_IOCTL(NCP_IOC_SETROOT)
4934
COMPATIBLE_IOCTL(NCP_IOC_GETCHARSETS)
4935
COMPATIBLE_IOCTL(NCP_IOC_SETCHARSETS)
4936
COMPATIBLE_IOCTL(NCP_IOC_GETDENTRYTTL)
4937
COMPATIBLE_IOCTL(NCP_IOC_SETDENTRYTTL)
4938
/* Little a */
4939
COMPATIBLE_IOCTL(ATMSIGD_CTRL)
4940
COMPATIBLE_IOCTL(ATMARPD_CTRL)
4941
COMPATIBLE_IOCTL(ATMLEC_CTRL)
4942
COMPATIBLE_IOCTL(ATMLEC_MCAST)
4943
COMPATIBLE_IOCTL(ATMLEC_DATA)
4944
COMPATIBLE_IOCTL(ATM_SETSC)
4945
COMPATIBLE_IOCTL(SIOCSIFATMTCP)
4946
COMPATIBLE_IOCTL(SIOCMKCLIP)
4947
COMPATIBLE_IOCTL(ATMARP_MKIP)
4948
COMPATIBLE_IOCTL(ATMARP_SETENTRY)
4949
COMPATIBLE_IOCTL(ATMARP_ENCAP)
4950
COMPATIBLE_IOCTL(ATMTCP_CREATE)
4951
COMPATIBLE_IOCTL(ATMTCP_REMOVE)
4952
COMPATIBLE_IOCTL(ATMMPC_CTRL)
4953
COMPATIBLE_IOCTL(ATMMPC_DATA)
4954
#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
4955
/* 0xfe - lvm */
4956
COMPATIBLE_IOCTL(VG_SET_EXTENDABLE)
4957
COMPATIBLE_IOCTL(VG_STATUS_GET_COUNT)
4958
COMPATIBLE_IOCTL(VG_STATUS_GET_NAMELIST)
4959
COMPATIBLE_IOCTL(VG_REMOVE)
4960
COMPATIBLE_IOCTL(VG_RENAME)
4961
COMPATIBLE_IOCTL(VG_REDUCE)
4962
COMPATIBLE_IOCTL(PE_LOCK_UNLOCK)
4963
COMPATIBLE_IOCTL(PV_FLUSH)
4964
COMPATIBLE_IOCTL(LVM_LOCK_LVM)
4965
COMPATIBLE_IOCTL(LVM_GET_IOP_VERSION)
4966
#ifdef LVM_TOTAL_RESET
4967
COMPATIBLE_IOCTL(LVM_RESET)
4968
#endif
4969
COMPATIBLE_IOCTL(LV_SET_ACCESS)
4970
COMPATIBLE_IOCTL(LV_SET_STATUS)
4971
COMPATIBLE_IOCTL(LV_SET_ALLOCATION)
4972
COMPATIBLE_IOCTL(LE_REMAP)
4973
COMPATIBLE_IOCTL(LV_BMAP)
4974
COMPATIBLE_IOCTL(LV_SNAPSHOT_USE_RATE)
4975
#endif /* LVM */
4976
#if defined(CONFIG_DRM_NEW) || defined(CONFIG_DRM_NEW_MODULE)
4977
COMPATIBLE_IOCTL(DRM_IOCTL_GET_MAGIC)
4978
COMPATIBLE_IOCTL(DRM_IOCTL_IRQ_BUSID)
4979
COMPATIBLE_IOCTL(DRM_IOCTL_AUTH_MAGIC)
4980
COMPATIBLE_IOCTL(DRM_IOCTL_BLOCK)
4981
COMPATIBLE_IOCTL(DRM_IOCTL_UNBLOCK)
4982
COMPATIBLE_IOCTL(DRM_IOCTL_CONTROL)
4983
COMPATIBLE_IOCTL(DRM_IOCTL_ADD_BUFS)
4984
COMPATIBLE_IOCTL(DRM_IOCTL_MARK_BUFS)
4985
COMPATIBLE_IOCTL(DRM_IOCTL_ADD_CTX)
4986
COMPATIBLE_IOCTL(DRM_IOCTL_RM_CTX)
4987
COMPATIBLE_IOCTL(DRM_IOCTL_MOD_CTX)
4988
COMPATIBLE_IOCTL(DRM_IOCTL_GET_CTX)
4989
COMPATIBLE_IOCTL(DRM_IOCTL_SWITCH_CTX)
4990
COMPATIBLE_IOCTL(DRM_IOCTL_NEW_CTX)
4991
COMPATIBLE_IOCTL(DRM_IOCTL_ADD_DRAW)
4992
COMPATIBLE_IOCTL(DRM_IOCTL_RM_DRAW)
4993
COMPATIBLE_IOCTL(DRM_IOCTL_LOCK)
4994
COMPATIBLE_IOCTL(DRM_IOCTL_UNLOCK)
4995
COMPATIBLE_IOCTL(DRM_IOCTL_FINISH)
4996
#endif /* DRM */
4997
/* Big W */
4998
/* WIOC_GETSUPPORT not yet implemented -E */
4999
COMPATIBLE_IOCTL(WDIOC_GETSTATUS)
5000
COMPATIBLE_IOCTL(WDIOC_GETBOOTSTATUS)
5001
COMPATIBLE_IOCTL(WDIOC_GETTEMP)
5002
COMPATIBLE_IOCTL(WDIOC_SETOPTIONS)
5003
COMPATIBLE_IOCTL(WDIOC_KEEPALIVE)
5004
COMPATIBLE_IOCTL(WIOCSTART)
5005
COMPATIBLE_IOCTL(WIOCSTOP)
5006
COMPATIBLE_IOCTL(WIOCGSTAT)
5007
/* Big R */
5008
COMPATIBLE_IOCTL(RNDGETENTCNT)
5009
COMPATIBLE_IOCTL(RNDADDTOENTCNT)
5010
COMPATIBLE_IOCTL(RNDGETPOOL)
5011
COMPATIBLE_IOCTL(RNDADDENTROPY)
5012
COMPATIBLE_IOCTL(RNDZAPENTCNT)
5013
COMPATIBLE_IOCTL(RNDCLEARPOOL)
5014
/* Bluetooth ioctls */
5015
COMPATIBLE_IOCTL(HCIDEVUP)
5016
COMPATIBLE_IOCTL(HCIDEVDOWN)
5017
COMPATIBLE_IOCTL(HCIDEVRESET)
5018
COMPATIBLE_IOCTL(HCIDEVRESTAT)
5019
COMPATIBLE_IOCTL(HCIGETDEVLIST)
5020
COMPATIBLE_IOCTL(HCIGETDEVINFO)
5021
COMPATIBLE_IOCTL(HCIGETCONNLIST)
5022
COMPATIBLE_IOCTL(HCIGETCONNINFO)
5023
COMPATIBLE_IOCTL(HCISETRAW)
5024
COMPATIBLE_IOCTL(HCISETSCAN)
5025
COMPATIBLE_IOCTL(HCISETAUTH)
5026
COMPATIBLE_IOCTL(HCISETENCRYPT)
5027
COMPATIBLE_IOCTL(HCISETPTYPE)
5028
COMPATIBLE_IOCTL(HCISETLINKPOL)
5029
COMPATIBLE_IOCTL(HCISETLINKMODE)
5030
COMPATIBLE_IOCTL(HCISETACLMTU)
5031
COMPATIBLE_IOCTL(HCISETSCOMTU)
5032
COMPATIBLE_IOCTL(HCIINQUIRY)
5033
COMPATIBLE_IOCTL(HCIUARTSETPROTO)
5034
COMPATIBLE_IOCTL(HCIUARTGETPROTO)
5035
COMPATIBLE_IOCTL(RFCOMMCREATEDEV)
5036
COMPATIBLE_IOCTL(RFCOMMRELEASEDEV)
5037
COMPATIBLE_IOCTL(RFCOMMGETDEVLIST)
5038
COMPATIBLE_IOCTL(RFCOMMGETDEVINFO)
5039
COMPATIBLE_IOCTL(RFCOMMSTEALDLC)
5040
COMPATIBLE_IOCTL(BNEPCONNADD)
5041
COMPATIBLE_IOCTL(BNEPCONNDEL)
5042
COMPATIBLE_IOCTL(BNEPGETCONNLIST)
5043
COMPATIBLE_IOCTL(BNEPGETCONNINFO)
5044
COMPATIBLE_IOCTL(CMTPCONNADD)
5045
COMPATIBLE_IOCTL(CMTPCONNDEL)
5046
COMPATIBLE_IOCTL(CMTPGETCONNLIST)
5047
COMPATIBLE_IOCTL(CMTPGETCONNINFO)
5048
/* Scanner */
5049
COMPATIBLE_IOCTL(SCANNER_IOCTL_VENDOR)
5050
COMPATIBLE_IOCTL(SCANNER_IOCTL_PRODUCT)
5051
COMPATIBLE_IOCTL(SCANNER_IOCTL_CTRLMSG)
5052
/* Misc. */
5053
COMPATIBLE_IOCTL(0x41545900)            /* ATYIO_CLKR */
5054
COMPATIBLE_IOCTL(0x41545901)            /* ATYIO_CLKW */
5055
COMPATIBLE_IOCTL(PCIIOC_CONTROLLER)
5056
COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_IO)
5057
COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_MEM)
5058
COMPATIBLE_IOCTL(PCIIOC_WRITE_COMBINE)
5059
/* USB */
5060
COMPATIBLE_IOCTL(USBDEVFS_RESETEP)
5061
COMPATIBLE_IOCTL(USBDEVFS_SETINTERFACE)
5062
COMPATIBLE_IOCTL(USBDEVFS_SETCONFIGURATION)
5063
COMPATIBLE_IOCTL(USBDEVFS_GETDRIVER)
5064
COMPATIBLE_IOCTL(USBDEVFS_DISCARDURB)
5065
COMPATIBLE_IOCTL(USBDEVFS_CLAIMINTERFACE)
5066
COMPATIBLE_IOCTL(USBDEVFS_RELEASEINTERFACE)
5067
COMPATIBLE_IOCTL(USBDEVFS_CONNECTINFO)
5068
COMPATIBLE_IOCTL(USBDEVFS_HUB_PORTINFO)
5069
COMPATIBLE_IOCTL(USBDEVFS_RESET)
5070
COMPATIBLE_IOCTL(USBDEVFS_CLEAR_HALT)
5071
/* MTD */
5072
COMPATIBLE_IOCTL(MEMGETINFO)
5073
COMPATIBLE_IOCTL(MEMERASE)
5074
COMPATIBLE_IOCTL(MEMLOCK)
5075
COMPATIBLE_IOCTL(MEMUNLOCK)
5076
COMPATIBLE_IOCTL(MEMGETREGIONCOUNT)
5077
COMPATIBLE_IOCTL(MEMGETREGIONINFO)
5078
/* NBD */
5079
COMPATIBLE_IOCTL(NBD_SET_SOCK)
5080
COMPATIBLE_IOCTL(NBD_SET_BLKSIZE)
5081
COMPATIBLE_IOCTL(NBD_SET_SIZE)
5082
COMPATIBLE_IOCTL(NBD_DO_IT)
5083
COMPATIBLE_IOCTL(NBD_CLEAR_SOCK)
5084
COMPATIBLE_IOCTL(NBD_CLEAR_QUE)
5085
COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
5086
COMPATIBLE_IOCTL(NBD_SET_SIZE_BLOCKS)
5087
COMPATIBLE_IOCTL(NBD_DISCONNECT)
5088
/* Linux-1394 */
5089
#if defined(CONFIG_IEEE1394) || defined(CONFIG_IEEE1394_MODULE)
5090
COMPATIBLE_IOCTL(AMDTP_IOC_CHANNEL)
5091
COMPATIBLE_IOCTL(AMDTP_IOC_PLUG)
5092
COMPATIBLE_IOCTL(AMDTP_IOC_PING)
5093
COMPATIBLE_IOCTL(AMDTP_IOC_ZAP)
5094
COMPATIBLE_IOCTL(DV1394_IOC_SHUTDOWN)
5095
COMPATIBLE_IOCTL(DV1394_IOC_SUBMIT_FRAMES)
5096
COMPATIBLE_IOCTL(DV1394_IOC_WAIT_FRAMES)
5097
COMPATIBLE_IOCTL(DV1394_IOC_RECEIVE_FRAMES)
5098
COMPATIBLE_IOCTL(DV1394_IOC_START_RECEIVE)
5099
COMPATIBLE_IOCTL(VIDEO1394_IOC_LISTEN_CHANNEL)
5100
COMPATIBLE_IOCTL(VIDEO1394_IOC_UNLISTEN_CHANNEL)
5101
COMPATIBLE_IOCTL(VIDEO1394_IOC_TALK_CHANNEL)
5102
COMPATIBLE_IOCTL(VIDEO1394_IOC_UNTALK_CHANNEL)
5103
#endif
5104
 
5105
/* And these ioctls need translation */
5106
#if defined(CONFIG_IEEE1394) || defined(CONFIG_IEEE1394_MODULE)
5107
HANDLE_IOCTL(DV1394_IOC32_INIT, handle_dv1394_init)
5108
HANDLE_IOCTL(DV1394_IOC32_GET_STATUS, handle_dv1394_get_status)
5109
HANDLE_IOCTL(VIDEO1394_IOC32_LISTEN_QUEUE_BUFFER, video1394_w_wait32)
5110
HANDLE_IOCTL(VIDEO1394_IOC32_LISTEN_WAIT_BUFFER, video1394_wr_wait32)
5111
HANDLE_IOCTL(VIDEO1394_IOC_TALK_QUEUE_BUFFER, video1394_queue_buf32)
5112
HANDLE_IOCTL(VIDEO1394_IOC32_TALK_WAIT_BUFFER, video1394_w_wait32)
5113
HANDLE_IOCTL(VIDEO1394_IOC32_LISTEN_POLL_BUFFER, video1394_wr_wait32)
5114
#endif
5115
HANDLE_IOCTL(MEMREADOOB32, mtd_rw_oob)
5116
HANDLE_IOCTL(MEMWRITEOOB32, mtd_rw_oob)
5117
#ifdef CONFIG_NET
5118
HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
5119
#endif
5120
HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
5121
HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
5122
HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
5123
HANDLE_IOCTL(SIOCGIFMETRIC, dev_ifsioc)
5124
HANDLE_IOCTL(SIOCSIFMETRIC, dev_ifsioc)
5125
HANDLE_IOCTL(SIOCGIFMTU, dev_ifsioc)
5126
HANDLE_IOCTL(SIOCSIFMTU, dev_ifsioc)
5127
HANDLE_IOCTL(SIOCGIFMEM, dev_ifsioc)
5128
HANDLE_IOCTL(SIOCSIFMEM, dev_ifsioc)
5129
HANDLE_IOCTL(SIOCGIFHWADDR, dev_ifsioc)
5130
HANDLE_IOCTL(SIOCSIFHWADDR, dev_ifsioc)
5131
HANDLE_IOCTL(SIOCADDMULTI, dev_ifsioc)
5132
HANDLE_IOCTL(SIOCDELMULTI, dev_ifsioc)
5133
HANDLE_IOCTL(SIOCGIFINDEX, dev_ifsioc)
5134
HANDLE_IOCTL(SIOCGIFMAP, dev_ifsioc)
5135
HANDLE_IOCTL(SIOCSIFMAP, dev_ifsioc)
5136
HANDLE_IOCTL(SIOCGIFADDR, dev_ifsioc)
5137
HANDLE_IOCTL(SIOCSIFADDR, dev_ifsioc)
5138
HANDLE_IOCTL(SIOCGIFBRDADDR, dev_ifsioc)
5139
HANDLE_IOCTL(SIOCSIFBRDADDR, dev_ifsioc)
5140
HANDLE_IOCTL(SIOCGIFDSTADDR, dev_ifsioc)
5141
HANDLE_IOCTL(SIOCSIFDSTADDR, dev_ifsioc)
5142
HANDLE_IOCTL(SIOCGIFNETMASK, dev_ifsioc)
5143
HANDLE_IOCTL(SIOCSIFNETMASK, dev_ifsioc)
5144
HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
5145
HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
5146
HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
5147
HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
5148
HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
5149
HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
5150
HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
5151
HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
5152
HANDLE_IOCTL(SIOCBONDSETHWADDR, bond_ioctl)
5153
HANDLE_IOCTL(SIOCBONDSLAVEINFOQUERY, bond_ioctl)
5154
HANDLE_IOCTL(SIOCBONDINFOQUERY, bond_ioctl)
5155
HANDLE_IOCTL(SIOCBONDCHANGEACTIVE, bond_ioctl)
5156
HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
5157
HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
5158
/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
5159
HANDLE_IOCTL(SIOCRTMSG, ret_einval)
5160
HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
5161
HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)
5162
HANDLE_IOCTL(HDIO_GETGEO_BIG, hdio_getgeo_big)
5163
HANDLE_IOCTL(HDIO_GETGEO_BIG_RAW, hdio_getgeo_big)
5164
HANDLE_IOCTL(BLKRAGET, w_long)
5165
HANDLE_IOCTL(BLKGETSIZE, w_long)
5166
HANDLE_IOCTL(0x1260, broken_blkgetsize)
5167
HANDLE_IOCTL(BLKFRAGET, w_long)
5168
HANDLE_IOCTL(BLKSECTGET, w_long)
5169
HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
5170
HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap)
5171
HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap)
5172
HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor)
5173
HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans)
5174
HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans)
5175
HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans)
5176
HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans)
5177
HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
5178
HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
5179
HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans)
5180
HANDLE_IOCTL(HDIO_GET_MULTCOUNT, hdio_ioctl_trans)
5181
HANDLE_IOCTL(HDIO_GET_NOWERR, hdio_ioctl_trans)
5182
HANDLE_IOCTL(HDIO_GET_NICE, hdio_ioctl_trans)
5183
HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
5184
HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
5185
HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)
5186
HANDLE_IOCTL(FDSETDRVPRM32, fd_ioctl_trans)
5187
HANDLE_IOCTL(FDGETDRVPRM32, fd_ioctl_trans)
5188
HANDLE_IOCTL(FDGETDRVSTAT32, fd_ioctl_trans)
5189
HANDLE_IOCTL(FDPOLLDRVSTAT32, fd_ioctl_trans)
5190
HANDLE_IOCTL(FDGETFDCSTAT32, fd_ioctl_trans)
5191
HANDLE_IOCTL(FDWERRORGET32, fd_ioctl_trans)
5192
HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
5193
HANDLE_IOCTL(PPPIOCGIDLE32, ppp_ioctl_trans)
5194
HANDLE_IOCTL(PPPIOCSCOMPRESS32, ppp_ioctl_trans)
5195
HANDLE_IOCTL(PPPIOCSPASS32, ppp_sock_fprog_ioctl_trans)
5196
HANDLE_IOCTL(PPPIOCSACTIVE32, ppp_sock_fprog_ioctl_trans)
5197
HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
5198
HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
5199
HANDLE_IOCTL(MTIOCGETCONFIG32, mt_ioctl_trans)
5200
HANDLE_IOCTL(MTIOCSETCONFIG32, mt_ioctl_trans)
5201
HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
5202
HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
5203
HANDLE_IOCTL(LOOP_SET_STATUS, loop_status)
5204
HANDLE_IOCTL(LOOP_GET_STATUS, loop_status)
5205
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
5206
HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
5207
HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl)
5208
HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl)
5209
HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl)
5210
HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl)
5211
HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
5212
HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
5213
HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
5214
HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
5215
HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
5216
HANDLE_IOCTL(VIDIOCGTUNER32, do_video_ioctl)
5217
HANDLE_IOCTL(VIDIOCSTUNER32, do_video_ioctl)
5218
HANDLE_IOCTL(VIDIOCGWIN32, do_video_ioctl)
5219
HANDLE_IOCTL(VIDIOCSWIN32, do_video_ioctl)
5220
HANDLE_IOCTL(VIDIOCGFBUF32, do_video_ioctl)
5221
HANDLE_IOCTL(VIDIOCSFBUF32, do_video_ioctl)
5222
HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl)
5223
HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl)
5224
/* One SMB ioctl needs translations. */
5225
#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, __kernel_uid_t32)
5226
HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
5227
/* NCPFS */
5228
HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
5229
HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
5230
HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
5231
HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
5232
HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
5233
HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
5234
HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
5235
HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
5236
HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
5237
HANDLE_IOCTL(ATM_GETTYPE32, do_atm_ioctl)
5238
HANDLE_IOCTL(ATM_GETESI32, do_atm_ioctl)
5239
HANDLE_IOCTL(ATM_GETADDR32, do_atm_ioctl)
5240
HANDLE_IOCTL(ATM_RSTADDR32, do_atm_ioctl)
5241
HANDLE_IOCTL(ATM_ADDADDR32, do_atm_ioctl)
5242
HANDLE_IOCTL(ATM_DELADDR32, do_atm_ioctl)
5243
HANDLE_IOCTL(ATM_GETCIRANGE32, do_atm_ioctl)
5244
HANDLE_IOCTL(ATM_SETCIRANGE32, do_atm_ioctl)
5245
HANDLE_IOCTL(ATM_SETESI32, do_atm_ioctl)
5246
HANDLE_IOCTL(ATM_SETESIF32, do_atm_ioctl)
5247
HANDLE_IOCTL(ATM_GETSTAT32, do_atm_ioctl)
5248
HANDLE_IOCTL(ATM_GETSTATZ32, do_atm_ioctl)
5249
HANDLE_IOCTL(ATM_GETLOOP32, do_atm_ioctl)
5250
HANDLE_IOCTL(ATM_SETLOOP32, do_atm_ioctl)
5251
HANDLE_IOCTL(ATM_QUERYLOOP32, do_atm_ioctl)
5252
HANDLE_IOCTL(SONET_GETSTAT, do_atm_ioctl)
5253
HANDLE_IOCTL(SONET_GETSTATZ, do_atm_ioctl)
5254
HANDLE_IOCTL(SONET_GETDIAG, do_atm_ioctl)
5255
HANDLE_IOCTL(SONET_SETDIAG, do_atm_ioctl)
5256
HANDLE_IOCTL(SONET_CLRDIAG, do_atm_ioctl)
5257
HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
5258
HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
5259
HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
5260
#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
5261
HANDLE_IOCTL(VG_STATUS, do_lvm_ioctl)
5262
HANDLE_IOCTL(VG_CREATE_OLD, do_lvm_ioctl)
5263
HANDLE_IOCTL(VG_CREATE, do_lvm_ioctl)
5264
HANDLE_IOCTL(VG_EXTEND, do_lvm_ioctl)
5265
HANDLE_IOCTL(LV_CREATE, do_lvm_ioctl)
5266
HANDLE_IOCTL(LV_REMOVE, do_lvm_ioctl)
5267
HANDLE_IOCTL(LV_EXTEND, do_lvm_ioctl)
5268
HANDLE_IOCTL(LV_REDUCE, do_lvm_ioctl)
5269
HANDLE_IOCTL(LV_RENAME, do_lvm_ioctl)
5270
HANDLE_IOCTL(LV_STATUS_BYNAME, do_lvm_ioctl)
5271
HANDLE_IOCTL(LV_STATUS_BYINDEX, do_lvm_ioctl)
5272
HANDLE_IOCTL(LV_STATUS_BYDEV, do_lvm_ioctl)
5273
HANDLE_IOCTL(PV_CHANGE, do_lvm_ioctl)
5274
HANDLE_IOCTL(PV_STATUS, do_lvm_ioctl)
5275
#endif /* LVM */
5276
#if defined(CONFIG_DRM_NEW) || defined(CONFIG_DRM_NEW_MODULE)
5277
HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version)
5278
HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique)
5279
HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique)
5280
HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap)
5281
HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs)
5282
HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs)
5283
HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs)
5284
HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma)
5285
HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx)
5286
#endif /* DRM */
5287
#if 0
5288
HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl)
5289
HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl)
5290
HANDLE_IOCTL(RTC32_EPOCH_READ, do_rtc_ioctl)
5291
HANDLE_IOCTL(RTC32_EPOCH_SET, do_rtc_ioctl)
5292
#endif
5293
HANDLE_IOCTL(USBDEVFS_CONTROL32, do_usbdevfs_control)
5294
HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevfs_bulk)
5295
/*HANDLE_IOCTL(USBDEVFS_SUBMITURB32, do_usbdevfs_urb)*/
5296
HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb)
5297
HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb)
5298
HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal)
5299
/* take care of sizeof(sizeof()) breakage */
5300
/* elevator */
5301
HANDLE_IOCTL(BLKELVGET_32, do_blkelvget)
5302
HANDLE_IOCTL(BLKELVSET_32, do_blkelvset)
5303
/* block stuff */
5304
HANDLE_IOCTL(BLKBSZGET_32, do_blkbszget)
5305
HANDLE_IOCTL(BLKBSZSET_32, do_blkbszset)
5306
HANDLE_IOCTL(BLKGETSIZE64_32, do_blkgetsize64)
5307
IOCTL_TABLE_END
5308
 
5309
unsigned int ioctl32_hash_table[1024];
5310
 
5311
static inline unsigned long ioctl32_hash(unsigned long cmd)
5312
{
5313
        return ((cmd >> 6) ^ (cmd >> 4) ^ cmd) & 0x3ff;
5314
}
5315
 
5316
static void ioctl32_insert_translation(struct ioctl_trans *trans)
5317
{
5318
        unsigned long hash;
5319
        struct ioctl_trans *t;
5320
 
5321
        hash = ioctl32_hash (trans->cmd);
5322
        if (!ioctl32_hash_table[hash])
5323
                ioctl32_hash_table[hash] = (u32)(long)trans;
5324
        else {
5325
                t = (struct ioctl_trans *)(long)ioctl32_hash_table[hash];
5326
                while (t->next)
5327
                        t = (struct ioctl_trans *)(long)t->next;
5328
                trans->next = 0;
5329
                t->next = (u32)(long)trans;
5330
        }
5331
}
5332
 
5333
static int __init init_sys32_ioctl(void)
5334
{
5335
        int i;
5336
        extern struct ioctl_trans ioctl_translations[], ioctl_translations_end[];
5337
 
5338
        for (i = 0; &ioctl_translations[i] < &ioctl_translations_end[0]; i++)
5339
                ioctl32_insert_translation(&ioctl_translations[i]);
5340
        return 0;
5341
}
5342
 
5343
__initcall(init_sys32_ioctl);
5344
 
5345
static struct ioctl_trans *additional_ioctls;
5346
 
5347
/* Always call these with kernel lock held! */
5348
 
5349
int register_ioctl32_conversion(unsigned int cmd, int (*handler)(unsigned int, unsigned int, unsigned long, struct file *))
5350
{
5351
        int i;
5352
        if (!additional_ioctls) {
5353
                additional_ioctls = module_map(PAGE_SIZE);
5354
                if (!additional_ioctls)
5355
                        return -ENOMEM;
5356
                memset(additional_ioctls, 0, PAGE_SIZE);
5357
        }
5358
        for (i = 0; i < PAGE_SIZE/sizeof(struct ioctl_trans); i++)
5359
                if (!additional_ioctls[i].cmd)
5360
                        break;
5361
        if (i == PAGE_SIZE/sizeof(struct ioctl_trans))
5362
                return -ENOMEM;
5363
        additional_ioctls[i].cmd = cmd;
5364
        if (!handler)
5365
                additional_ioctls[i].handler = (u32)(long)sys_ioctl;
5366
        else
5367
                additional_ioctls[i].handler = (u32)(long)handler;
5368
        ioctl32_insert_translation(&additional_ioctls[i]);
5369
        return 0;
5370
}
5371
 
5372
int unregister_ioctl32_conversion(unsigned int cmd)
5373
{
5374
        unsigned long hash = ioctl32_hash(cmd);
5375
        struct ioctl_trans *t, *t1;
5376
 
5377
        t = (struct ioctl_trans *)(long)ioctl32_hash_table[hash];
5378
        if (!t) return -EINVAL;
5379
        if (t->cmd == cmd && t >= additional_ioctls &&
5380
            (unsigned long)t < ((unsigned long)additional_ioctls) + PAGE_SIZE) {
5381
                ioctl32_hash_table[hash] = t->next;
5382
                t->cmd = 0;
5383
                t->next = 0;
5384
                return 0;
5385
        } else while (t->next) {
5386
                t1 = (struct ioctl_trans *)(long)t->next;
5387
                if (t1->cmd == cmd && t1 >= additional_ioctls &&
5388
                    (unsigned long)t1 < ((unsigned long)additional_ioctls) + PAGE_SIZE) {
5389
                        t->next = t1->next;
5390
                        t1->cmd = 0;
5391
                        t1->next = 0;
5392
                        return 0;
5393
                }
5394
                t = t1;
5395
        }
5396
        return -EINVAL;
5397
}
5398
 
5399
asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
5400
{
5401
        struct file * filp;
5402
        int error = -EBADF;
5403
        int (*handler)(unsigned int, unsigned int, unsigned long, struct file * filp);
5404
        struct ioctl_trans *t;
5405
 
5406
        filp = fget(fd);
5407
        if(!filp)
5408
                goto out2;
5409
 
5410
        if (!filp->f_op || !filp->f_op->ioctl) {
5411
                error = sys_ioctl (fd, cmd, arg);
5412
                goto out;
5413
        }
5414
 
5415
        t = (struct ioctl_trans *)(long)ioctl32_hash_table [ioctl32_hash (cmd)];
5416
 
5417
        while (t && t->cmd != cmd)
5418
                t = (struct ioctl_trans *)(long)t->next;
5419
        if (t) {
5420
                handler = (void *)(long)t->handler;
5421
                error = handler(fd, cmd, arg, filp);
5422
        } else if (cmd >= SIOCDEVPRIVATE &&
5423
                   cmd <= (SIOCDEVPRIVATE + 15)) {
5424
                error = siocdevprivate_ioctl(fd, cmd, arg);
5425
        } else {
5426
                static int count;
5427
                if (++count <= 20)
5428
                        printk("sys32_ioctl(%s:%d): Unknown cmd fd(%d) "
5429
                               "cmd(%08x) arg(%08x)\n",
5430
                               current->comm, current->pid,
5431
                               (int)fd, (unsigned int)cmd, (unsigned int)arg);
5432
                error = -EINVAL;
5433
        }
5434
out:
5435
        fput(filp);
5436
out2:
5437
        return error;
5438
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.