Project

General

Profile

Bug #2665 » compat_ioctl.c

virtual dj, 2015-03-21 11:17

 
1
/*
2
 * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
3
 *
4
 * Copyright (C) 1997-2000  Jakub Jelinek  ([email protected])
5
 * Copyright (C) 1998  Eddie C. Dost  ([email protected])
6
 * Copyright (C) 2001,2002  Andi Kleen, SuSE Labs 
7
 * Copyright (C) 2003       Pavel Machek ([email protected])
8
 *
9
 * These routines maintain argument size conversion between 32bit and 64bit
10
 * ioctls.
11
 */
12

    
13
#include <linux/joystick.h>
14

    
15
#include <linux/types.h>
16
#include <linux/compat.h>
17
#include <linux/kernel.h>
18
#include <linux/capability.h>
19
#include <linux/compiler.h>
20
#include <linux/sched.h>
21
#include <linux/smp.h>
22
#include <linux/ioctl.h>
23
#include <linux/if.h>
24
#include <linux/if_bridge.h>
25
#include <linux/raid/md_u.h>
26
#include <linux/kd.h>
27
#include <linux/route.h>
28
#include <linux/in6.h>
29
#include <linux/ipv6_route.h>
30
#include <linux/skbuff.h>
31
#include <linux/netlink.h>
32
#include <linux/vt.h>
33
#include <linux/falloc.h>
34
#include <linux/fs.h>
35
#include <linux/file.h>
36
#include <linux/ppp_defs.h>
37
#include <linux/ppp-ioctl.h>
38
#include <linux/if_pppox.h>
39
#include <linux/mtio.h>
40
#include <linux/auto_fs.h>
41
#include <linux/auto_fs4.h>
42
#include <linux/tty.h>
43
#include <linux/vt_kern.h>
44
#include <linux/fb.h>
45
#include <linux/videodev2.h>
46
#include <linux/netdevice.h>
47
#include <linux/raw.h>
48
#include <linux/blkdev.h>
49
#include <linux/elevator.h>
50
#include <linux/rtc.h>
51
#include <linux/pci.h>
52
#include <linux/serial.h>
53
#include <linux/if_tun.h>
54
#include <linux/ctype.h>
55
#include <linux/syscalls.h>
56
#include <linux/i2c.h>
57
#include <linux/i2c-dev.h>
58
#include <linux/atalk.h>
59
#include <linux/gfp.h>
60

    
61
#include <net/bluetooth/bluetooth.h>
62
#include <net/bluetooth/hci.h>
63
#include <net/bluetooth/rfcomm.h>
64

    
65
#include <linux/capi.h>
66
#include <linux/gigaset_dev.h>
67

    
68
#ifdef CONFIG_BLOCK
69
#include <linux/loop.h>
70
#include <linux/cdrom.h>
71
#include <linux/fd.h>
72
#include <scsi/scsi.h>
73
#include <scsi/scsi_ioctl.h>
74
#include <scsi/sg.h>
75
#endif
76

    
77
#include <asm/uaccess.h>
78
#include <linux/ethtool.h>
79
#include <linux/mii.h>
80
#include <linux/if_bonding.h>
81
#include <linux/watchdog.h>
82

    
83
#include <linux/soundcard.h>
84
#include <linux/lp.h>
85
#include <linux/ppdev.h>
86

    
87
#include <linux/atm.h>
88
#include <linux/atmarp.h>
89
#include <linux/atmclip.h>
90
#include <linux/atmdev.h>
91
#include <linux/atmioc.h>
92
#include <linux/atmlec.h>
93
#include <linux/atmmpc.h>
94
#include <linux/atmsvc.h>
95
#include <linux/atm_tcp.h>
96
#include <linux/sonet.h>
97
#include <linux/atm_suni.h>
98

    
99
#include <linux/usb.h>
100
#include <linux/usbdevice_fs.h>
101
#include <linux/nbd.h>
102
#include <linux/random.h>
103
#include <linux/filter.h>
104

    
105
#include <linux/hiddev.h>
106

    
107
#define __DVB_CORE__
108
#include <linux/dvb/audio.h>
109
#include <linux/dvb/dmx.h>
110
#include <linux/dvb/frontend.h>
111
#include <linux/dvb/video.h>
112

    
113
#include <linux/sort.h>
114

    
115
#ifdef CONFIG_SPARC
116
#include <asm/fbio.h>
117
#endif
118

    
119
static int w_long(unsigned int fd, unsigned int cmd,
120
		compat_ulong_t __user *argp)
121
{
122
	mm_segment_t old_fs = get_fs();
123
	int err;
124
	unsigned long val;
125

    
126
	set_fs (KERNEL_DS);
127
	err = sys_ioctl(fd, cmd, (unsigned long)&val);
128
	set_fs (old_fs);
129
	if (!err && put_user(val, argp))
130
		return -EFAULT;
131
	return err;
132
}
133

    
134
struct compat_video_event {
135
	int32_t		type;
136
	compat_time_t	timestamp;
137
	union {
138
	        video_size_t size;
139
		unsigned int frame_rate;
140
	} u;
141
};
142

    
143
static int do_video_get_event(unsigned int fd, unsigned int cmd,
144
		struct compat_video_event __user *up)
145
{
146
	struct video_event kevent;
147
	mm_segment_t old_fs = get_fs();
148
	int err;
149

    
150
	set_fs(KERNEL_DS);
151
	err = sys_ioctl(fd, cmd, (unsigned long) &kevent);
152
	set_fs(old_fs);
153

    
154
	if (!err) {
155
		err  = put_user(kevent.type, &up->type);
156
		err |= put_user(kevent.timestamp, &up->timestamp);
157
		err |= put_user(kevent.u.size.w, &up->u.size.w);
158
		err |= put_user(kevent.u.size.h, &up->u.size.h);
159
		err |= put_user(kevent.u.size.aspect_ratio,
160
				&up->u.size.aspect_ratio);
161
		if (err)
162
			err = -EFAULT;
163
	}
164

    
165
	return err;
166
}
167

    
168
struct compat_video_still_picture {
169
        compat_uptr_t iFrame;
170
        int32_t size;
171
};
172

    
173
static int do_video_stillpicture(unsigned int fd, unsigned int cmd,
174
	struct compat_video_still_picture __user *up)
175
{
176
	struct video_still_picture __user *up_native;
177
	compat_uptr_t fp;
178
	int32_t size;
179
	int err;
180

    
181
	err  = get_user(fp, &up->iFrame);
182
	err |= get_user(size, &up->size);
183
	if (err)
184
		return -EFAULT;
185

    
186
	up_native =
187
		compat_alloc_user_space(sizeof(struct video_still_picture));
188

    
189
	err =  put_user(compat_ptr(fp), &up_native->iFrame);
190
	err |= put_user(size, &up_native->size);
191
	if (err)
192
		return -EFAULT;
193

    
194
	err = sys_ioctl(fd, cmd, (unsigned long) up_native);
195

    
196
	return err;
197
}
198

    
199
struct compat_video_spu_palette {
200
	int length;
201
	compat_uptr_t palette;
202
};
203

    
204
static int do_video_set_spu_palette(unsigned int fd, unsigned int cmd,
205
		struct compat_video_spu_palette __user *up)
206
{
207
	struct video_spu_palette __user *up_native;
208
	compat_uptr_t palp;
209
	int length, err;
210

    
211
	err  = get_user(palp, &up->palette);
212
	err |= get_user(length, &up->length);
213

    
214
	up_native = compat_alloc_user_space(sizeof(struct video_spu_palette));
215
	err  = put_user(compat_ptr(palp), &up_native->palette);
216
	err |= put_user(length, &up_native->length);
217
	if (err)
218
		return -EFAULT;
219

    
220
	err = sys_ioctl(fd, cmd, (unsigned long) up_native);
221

    
222
	return err;
223
}
224

    
225
#ifdef CONFIG_BLOCK
226
typedef struct sg_io_hdr32 {
227
	compat_int_t interface_id;	/* [i] 'S' for SCSI generic (required) */
228
	compat_int_t dxfer_direction;	/* [i] data transfer direction  */
229
	unsigned char cmd_len;		/* [i] SCSI command length ( <= 16 bytes) */
230
	unsigned char mx_sb_len;		/* [i] max length to write to sbp */
231
	unsigned short iovec_count;	/* [i] 0 implies no scatter gather */
232
	compat_uint_t dxfer_len;		/* [i] byte count of data transfer */
233
	compat_uint_t dxferp;		/* [i], [*io] points to data transfer memory
234
					      or scatter gather list */
235
	compat_uptr_t cmdp;		/* [i], [*i] points to command to perform */
236
	compat_uptr_t sbp;		/* [i], [*o] points to sense_buffer memory */
237
	compat_uint_t timeout;		/* [i] MAX_UINT->no timeout (unit: millisec) */
238
	compat_uint_t flags;		/* [i] 0 -> default, see SG_FLAG... */
239
	compat_int_t pack_id;		/* [i->o] unused internally (normally) */
240
	compat_uptr_t usr_ptr;		/* [i->o] unused internally */
241
	unsigned char status;		/* [o] scsi status */
242
	unsigned char masked_status;	/* [o] shifted, masked scsi status */
243
	unsigned char msg_status;		/* [o] messaging level data (optional) */
244
	unsigned char sb_len_wr;		/* [o] byte count actually written to sbp */
245
	unsigned short host_status;	/* [o] errors from host adapter */
246
	unsigned short driver_status;	/* [o] errors from software driver */
247
	compat_int_t resid;		/* [o] dxfer_len - actual_transferred */
248
	compat_uint_t duration;		/* [o] time taken by cmd (unit: millisec) */
249
	compat_uint_t info;		/* [o] auxiliary information */
250
} sg_io_hdr32_t;  /* 64 bytes long (on sparc32) */
251

    
252
typedef struct sg_iovec32 {
253
	compat_uint_t iov_base;
254
	compat_uint_t iov_len;
255
} sg_iovec32_t;
256

    
257
static int sg_build_iovec(sg_io_hdr_t __user *sgio, void __user *dxferp, u16 iovec_count)
258
{
259
	sg_iovec_t __user *iov = (sg_iovec_t __user *) (sgio + 1);
260
	sg_iovec32_t __user *iov32 = dxferp;
261
	int i;
262

    
263
	for (i = 0; i < iovec_count; i++) {
264
		u32 base, len;
265

    
266
		if (get_user(base, &iov32[i].iov_base) ||
267
		    get_user(len, &iov32[i].iov_len) ||
268
		    put_user(compat_ptr(base), &iov[i].iov_base) ||
269
		    put_user(len, &iov[i].iov_len))
270
			return -EFAULT;
271
	}
272

    
273
	if (put_user(iov, &sgio->dxferp))
274
		return -EFAULT;
275
	return 0;
276
}
277

    
278
static int sg_ioctl_trans(unsigned int fd, unsigned int cmd,
279
			sg_io_hdr32_t __user *sgio32)
280
{
281
	sg_io_hdr_t __user *sgio;
282
	u16 iovec_count;
283
	u32 data;
284
	void __user *dxferp;
285
	int err;
286
	int interface_id;
287

    
288
	if (get_user(interface_id, &sgio32->interface_id))
289
		return -EFAULT;
290
	if (interface_id != 'S')
291
		return sys_ioctl(fd, cmd, (unsigned long)sgio32);
292

    
293
	if (get_user(iovec_count, &sgio32->iovec_count))
294
		return -EFAULT;
295

    
296
	{
297
		void __user *top = compat_alloc_user_space(0);
298
		void __user *new = compat_alloc_user_space(sizeof(sg_io_hdr_t) +
299
				       (iovec_count * sizeof(sg_iovec_t)));
300
		if (new > top)
301
			return -EINVAL;
302

    
303
		sgio = new;
304
	}
305

    
306
	/* Ok, now construct.  */
307
	if (copy_in_user(&sgio->interface_id, &sgio32->interface_id,
308
			 (2 * sizeof(int)) +
309
			 (2 * sizeof(unsigned char)) +
310
			 (1 * sizeof(unsigned short)) +
311
			 (1 * sizeof(unsigned int))))
312
		return -EFAULT;
313

    
314
	if (get_user(data, &sgio32->dxferp))
315
		return -EFAULT;
316
	dxferp = compat_ptr(data);
317
	if (iovec_count) {
318
		if (sg_build_iovec(sgio, dxferp, iovec_count))
319
			return -EFAULT;
320
	} else {
321
		if (put_user(dxferp, &sgio->dxferp))
322
			return -EFAULT;
323
	}
324

    
325
	{
326
		unsigned char __user *cmdp;
327
		unsigned char __user *sbp;
328

    
329
		if (get_user(data, &sgio32->cmdp))
330
			return -EFAULT;
331
		cmdp = compat_ptr(data);
332

    
333
		if (get_user(data, &sgio32->sbp))
334
			return -EFAULT;
335
		sbp = compat_ptr(data);
336

    
337
		if (put_user(cmdp, &sgio->cmdp) ||
338
		    put_user(sbp, &sgio->sbp))
339
			return -EFAULT;
340
	}
341

    
342
	if (copy_in_user(&sgio->timeout, &sgio32->timeout,
343
			 3 * sizeof(int)))
344
		return -EFAULT;
345

    
346
	if (get_user(data, &sgio32->usr_ptr))
347
		return -EFAULT;
348
	if (put_user(compat_ptr(data), &sgio->usr_ptr))
349
		return -EFAULT;
350

    
351
	err = sys_ioctl(fd, cmd, (unsigned long) sgio);
352

    
353
	if (err >= 0) {
354
		void __user *datap;
355

    
356
		if (copy_in_user(&sgio32->pack_id, &sgio->pack_id,
357
				 sizeof(int)) ||
358
		    get_user(datap, &sgio->usr_ptr) ||
359
		    put_user((u32)(unsigned long)datap,
360
			     &sgio32->usr_ptr) ||
361
		    copy_in_user(&sgio32->status, &sgio->status,
362
				 (4 * sizeof(unsigned char)) +
363
				 (2 * sizeof(unsigned short)) +
364
				 (3 * sizeof(int))))
365
			err = -EFAULT;
366
	}
367

    
368
	return err;
369
}
370

    
371
struct compat_sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
372
	char req_state;
373
	char orphan;
374
	char sg_io_owned;
375
	char problem;
376
	int pack_id;
377
	compat_uptr_t usr_ptr;
378
	unsigned int duration;
379
	int unused;
380
};
381

    
382
static int sg_grt_trans(unsigned int fd, unsigned int cmd, struct
383
			compat_sg_req_info __user *o)
384
{
385
	int err, i;
386
	sg_req_info_t __user *r;
387
	r = compat_alloc_user_space(sizeof(sg_req_info_t)*SG_MAX_QUEUE);
388
	err = sys_ioctl(fd,cmd,(unsigned long)r);
389
	if (err < 0)
390
		return err;
391
	for (i = 0; i < SG_MAX_QUEUE; i++) {
392
		void __user *ptr;
393
		int d;
394

    
395
		if (copy_in_user(o + i, r + i, offsetof(sg_req_info_t, usr_ptr)) ||
396
		    get_user(ptr, &r[i].usr_ptr) ||
397
		    get_user(d, &r[i].duration) ||
398
		    put_user((u32)(unsigned long)(ptr), &o[i].usr_ptr) ||
399
		    put_user(d, &o[i].duration))
400
			return -EFAULT;
401
	}
402
	return err;
403
}
404
#endif /* CONFIG_BLOCK */
405

    
406
struct sock_fprog32 {
407
	unsigned short	len;
408
	compat_caddr_t	filter;
409
};
410

    
411
#define PPPIOCSPASS32	_IOW('t', 71, struct sock_fprog32)
412
#define PPPIOCSACTIVE32	_IOW('t', 70, struct sock_fprog32)
413

    
414
static int ppp_sock_fprog_ioctl_trans(unsigned int fd, unsigned int cmd,
415
			struct sock_fprog32 __user *u_fprog32)
416
{
417
	struct sock_fprog __user *u_fprog64 = compat_alloc_user_space(sizeof(struct sock_fprog));
418
	void __user *fptr64;
419
	u32 fptr32;
420
	u16 flen;
421

    
422
	if (get_user(flen, &u_fprog32->len) ||
423
	    get_user(fptr32, &u_fprog32->filter))
424
		return -EFAULT;
425

    
426
	fptr64 = compat_ptr(fptr32);
427

    
428
	if (put_user(flen, &u_fprog64->len) ||
429
	    put_user(fptr64, &u_fprog64->filter))
430
		return -EFAULT;
431

    
432
	if (cmd == PPPIOCSPASS32)
433
		cmd = PPPIOCSPASS;
434
	else
435
		cmd = PPPIOCSACTIVE;
436

    
437
	return sys_ioctl(fd, cmd, (unsigned long) u_fprog64);
438
}
439

    
440
struct ppp_option_data32 {
441
	compat_caddr_t	ptr;
442
	u32			length;
443
	compat_int_t		transmit;
444
};
445
#define PPPIOCSCOMPRESS32	_IOW('t', 77, struct ppp_option_data32)
446

    
447
struct ppp_idle32 {
448
	compat_time_t xmit_idle;
449
	compat_time_t recv_idle;
450
};
451
#define PPPIOCGIDLE32		_IOR('t', 63, struct ppp_idle32)
452

    
453
static int ppp_gidle(unsigned int fd, unsigned int cmd,
454
		struct ppp_idle32 __user *idle32)
455
{
456
	struct ppp_idle __user *idle;
457
	__kernel_time_t xmit, recv;
458
	int err;
459

    
460
	idle = compat_alloc_user_space(sizeof(*idle));
461

    
462
	err = sys_ioctl(fd, PPPIOCGIDLE, (unsigned long) idle);
463

    
464
	if (!err) {
465
		if (get_user(xmit, &idle->xmit_idle) ||
466
		    get_user(recv, &idle->recv_idle) ||
467
		    put_user(xmit, &idle32->xmit_idle) ||
468
		    put_user(recv, &idle32->recv_idle))
469
			err = -EFAULT;
470
	}
471
	return err;
472
}
473

    
474
static int ppp_scompress(unsigned int fd, unsigned int cmd,
475
	struct ppp_option_data32 __user *odata32)
476
{
477
	struct ppp_option_data __user *odata;
478
	__u32 data;
479
	void __user *datap;
480

    
481
	odata = compat_alloc_user_space(sizeof(*odata));
482

    
483
	if (get_user(data, &odata32->ptr))
484
		return -EFAULT;
485

    
486
	datap = compat_ptr(data);
487
	if (put_user(datap, &odata->ptr))
488
		return -EFAULT;
489

    
490
	if (copy_in_user(&odata->length, &odata32->length,
491
			 sizeof(__u32) + sizeof(int)))
492
		return -EFAULT;
493

    
494
	return sys_ioctl(fd, PPPIOCSCOMPRESS, (unsigned long) odata);
495
}
496

    
497
#ifdef CONFIG_BLOCK
498
struct mtget32 {
499
	compat_long_t	mt_type;
500
	compat_long_t	mt_resid;
501
	compat_long_t	mt_dsreg;
502
	compat_long_t	mt_gstat;
503
	compat_long_t	mt_erreg;
504
	compat_daddr_t	mt_fileno;
505
	compat_daddr_t	mt_blkno;
506
};
507
#define MTIOCGET32	_IOR('m', 2, struct mtget32)
508

    
509
struct mtpos32 {
510
	compat_long_t	mt_blkno;
511
};
512
#define MTIOCPOS32	_IOR('m', 3, struct mtpos32)
513

    
514
static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, void __user *argp)
515
{
516
	mm_segment_t old_fs = get_fs();
517
	struct mtget get;
518
	struct mtget32 __user *umget32;
519
	struct mtpos pos;
520
	struct mtpos32 __user *upos32;
521
	unsigned long kcmd;
522
	void *karg;
523
	int err = 0;
524

    
525
	switch(cmd) {
526
	case MTIOCPOS32:
527
		kcmd = MTIOCPOS;
528
		karg = &pos;
529
		break;
530
	default:	/* MTIOCGET32 */
531
		kcmd = MTIOCGET;
532
		karg = &get;
533
		break;
534
	}
535
	set_fs (KERNEL_DS);
536
	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
537
	set_fs (old_fs);
538
	if (err)
539
		return err;
540
	switch (cmd) {
541
	case MTIOCPOS32:
542
		upos32 = argp;
543
		err = __put_user(pos.mt_blkno, &upos32->mt_blkno);
544
		break;
545
	case MTIOCGET32:
546
		umget32 = argp;
547
		err = __put_user(get.mt_type, &umget32->mt_type);
548
		err |= __put_user(get.mt_resid, &umget32->mt_resid);
549
		err |= __put_user(get.mt_dsreg, &umget32->mt_dsreg);
550
		err |= __put_user(get.mt_gstat, &umget32->mt_gstat);
551
		err |= __put_user(get.mt_erreg, &umget32->mt_erreg);
552
		err |= __put_user(get.mt_fileno, &umget32->mt_fileno);
553
		err |= __put_user(get.mt_blkno, &umget32->mt_blkno);
554
		break;
555
	}
556
	return err ? -EFAULT: 0;
557
}
558

    
559
#endif /* CONFIG_BLOCK */
560

    
561
/* Bluetooth ioctls */
562
#define HCIUARTSETPROTO		_IOW('U', 200, int)
563
#define HCIUARTGETPROTO		_IOR('U', 201, int)
564
#define HCIUARTGETDEVICE	_IOR('U', 202, int)
565
#define HCIUARTSETFLAGS		_IOW('U', 203, int)
566
#define HCIUARTGETFLAGS		_IOR('U', 204, int)
567

    
568
#define BNEPCONNADD	_IOW('B', 200, int)
569
#define BNEPCONNDEL	_IOW('B', 201, int)
570
#define BNEPGETCONNLIST	_IOR('B', 210, int)
571
#define BNEPGETCONNINFO	_IOR('B', 211, int)
572

    
573
#define CMTPCONNADD	_IOW('C', 200, int)
574
#define CMTPCONNDEL	_IOW('C', 201, int)
575
#define CMTPGETCONNLIST	_IOR('C', 210, int)
576
#define CMTPGETCONNINFO	_IOR('C', 211, int)
577

    
578
#define HIDPCONNADD	_IOW('H', 200, int)
579
#define HIDPCONNDEL	_IOW('H', 201, int)
580
#define HIDPGETCONNLIST	_IOR('H', 210, int)
581
#define HIDPGETCONNINFO	_IOR('H', 211, int)
582

    
583

    
584
struct serial_struct32 {
585
        compat_int_t    type;
586
        compat_int_t    line;
587
        compat_uint_t   port;
588
        compat_int_t    irq;
589
        compat_int_t    flags;
590
        compat_int_t    xmit_fifo_size;
591
        compat_int_t    custom_divisor;
592
        compat_int_t    baud_base;
593
        unsigned short  close_delay;
594
        char    io_type;
595
        char    reserved_char[1];
596
        compat_int_t    hub6;
597
        unsigned short  closing_wait; /* time to wait before closing */
598
        unsigned short  closing_wait2; /* no longer used... */
599
        compat_uint_t   iomem_base;
600
        unsigned short  iomem_reg_shift;
601
        unsigned int    port_high;
602
     /* compat_ulong_t  iomap_base FIXME */
603
        compat_int_t    reserved[1];
604
};
605

    
606
static int serial_struct_ioctl(unsigned fd, unsigned cmd,
607
			struct serial_struct32 __user *ss32)
608
{
609
        typedef struct serial_struct SS;
610
        typedef struct serial_struct32 SS32;
611
        int err;
612
        struct serial_struct ss;
613
        mm_segment_t oldseg = get_fs();
614
        __u32 udata;
615
	unsigned int base;
616

    
617
        if (cmd == TIOCSSERIAL) {
618
                if (!access_ok(VERIFY_READ, ss32, sizeof(SS32)))
619
                        return -EFAULT;
620
                if (__copy_from_user(&ss, ss32, offsetof(SS32, iomem_base)))
621
			return -EFAULT;
622
                if (__get_user(udata, &ss32->iomem_base))
623
			return -EFAULT;
624
                ss.iomem_base = compat_ptr(udata);
625
                if (__get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
626
		    __get_user(ss.port_high, &ss32->port_high))
627
			return -EFAULT;
628
                ss.iomap_base = 0UL;
629
        }
630
        set_fs(KERNEL_DS);
631
                err = sys_ioctl(fd,cmd,(unsigned long)(&ss));
632
        set_fs(oldseg);
633
        if (cmd == TIOCGSERIAL && err >= 0) {
634
                if (!access_ok(VERIFY_WRITE, ss32, sizeof(SS32)))
635
                        return -EFAULT;
636
                if (__copy_to_user(ss32,&ss,offsetof(SS32,iomem_base)))
637
			return -EFAULT;
638
		base = (unsigned long)ss.iomem_base  >> 32 ?
639
			0xffffffff : (unsigned)(unsigned long)ss.iomem_base;
640
		if (__put_user(base, &ss32->iomem_base) ||
641
		    __put_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
642
		    __put_user(ss.port_high, &ss32->port_high))
643
			return -EFAULT;
644
        }
645
        return err;
646
}
647

    
648
/*
649
 * I2C layer ioctls
650
 */
651

    
652
struct i2c_msg32 {
653
	u16 addr;
654
	u16 flags;
655
	u16 len;
656
	compat_caddr_t buf;
657
};
658

    
659
struct i2c_rdwr_ioctl_data32 {
660
	compat_caddr_t msgs; /* struct i2c_msg __user *msgs */
661
	u32 nmsgs;
662
};
663

    
664
struct i2c_smbus_ioctl_data32 {
665
	u8 read_write;
666
	u8 command;
667
	u32 size;
668
	compat_caddr_t data; /* union i2c_smbus_data *data */
669
};
670

    
671
struct i2c_rdwr_aligned {
672
	struct i2c_rdwr_ioctl_data cmd;
673
	struct i2c_msg msgs[0];
674
};
675

    
676
static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd,
677
			struct i2c_rdwr_ioctl_data32    __user *udata)
678
{
679
	struct i2c_rdwr_aligned		__user *tdata;
680
	struct i2c_msg			__user *tmsgs;
681
	struct i2c_msg32		__user *umsgs;
682
	compat_caddr_t			datap;
683
	int				nmsgs, i;
684

    
685
	if (get_user(nmsgs, &udata->nmsgs))
686
		return -EFAULT;
687
	if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
688
		return -EINVAL;
689

    
690
	if (get_user(datap, &udata->msgs))
691
		return -EFAULT;
692
	umsgs = compat_ptr(datap);
693

    
694
	tdata = compat_alloc_user_space(sizeof(*tdata) +
695
				      nmsgs * sizeof(struct i2c_msg));
696
	tmsgs = &tdata->msgs[0];
697

    
698
	if (put_user(nmsgs, &tdata->cmd.nmsgs) ||
699
	    put_user(tmsgs, &tdata->cmd.msgs))
700
		return -EFAULT;
701

    
702
	for (i = 0; i < nmsgs; i++) {
703
		if (copy_in_user(&tmsgs[i].addr, &umsgs[i].addr, 3*sizeof(u16)))
704
			return -EFAULT;
705
		if (get_user(datap, &umsgs[i].buf) ||
706
		    put_user(compat_ptr(datap), &tmsgs[i].buf))
707
			return -EFAULT;
708
	}
709
	return sys_ioctl(fd, cmd, (unsigned long)tdata);
710
}
711

    
712
static int do_i2c_smbus_ioctl(unsigned int fd, unsigned int cmd,
713
			struct i2c_smbus_ioctl_data32   __user *udata)
714
{
715
	struct i2c_smbus_ioctl_data	__user *tdata;
716
	compat_caddr_t			datap;
717

    
718
	tdata = compat_alloc_user_space(sizeof(*tdata));
719
	if (tdata == NULL)
720
		return -ENOMEM;
721
	if (!access_ok(VERIFY_WRITE, tdata, sizeof(*tdata)))
722
		return -EFAULT;
723

    
724
	if (!access_ok(VERIFY_READ, udata, sizeof(*udata)))
725
		return -EFAULT;
726

    
727
	if (__copy_in_user(&tdata->read_write, &udata->read_write, 2 * sizeof(u8)))
728
		return -EFAULT;
729
	if (__copy_in_user(&tdata->size, &udata->size, 2 * sizeof(u32)))
730
		return -EFAULT;
731
	if (__get_user(datap, &udata->data) ||
732
	    __put_user(compat_ptr(datap), &tdata->data))
733
		return -EFAULT;
734

    
735
	return sys_ioctl(fd, cmd, (unsigned long)tdata);
736
}
737

    
738
#define RTC_IRQP_READ32		_IOR('p', 0x0b, compat_ulong_t)
739
#define RTC_IRQP_SET32		_IOW('p', 0x0c, compat_ulong_t)
740
#define RTC_EPOCH_READ32	_IOR('p', 0x0d, compat_ulong_t)
741
#define RTC_EPOCH_SET32		_IOW('p', 0x0e, compat_ulong_t)
742

    
743
static int rtc_ioctl(unsigned fd, unsigned cmd, void __user *argp)
744
{
745
	mm_segment_t oldfs = get_fs();
746
	compat_ulong_t val32;
747
	unsigned long kval;
748
	int ret;
749

    
750
	switch (cmd) {
751
	case RTC_IRQP_READ32:
752
	case RTC_EPOCH_READ32:
753
		set_fs(KERNEL_DS);
754
		ret = sys_ioctl(fd, (cmd == RTC_IRQP_READ32) ?
755
					RTC_IRQP_READ : RTC_EPOCH_READ,
756
					(unsigned long)&kval);
757
		set_fs(oldfs);
758
		if (ret)
759
			return ret;
760
		val32 = kval;
761
		return put_user(val32, (unsigned int __user *)argp);
762
	case RTC_IRQP_SET32:
763
		return sys_ioctl(fd, RTC_IRQP_SET, (unsigned long)argp);
764
	case RTC_EPOCH_SET32:
765
		return sys_ioctl(fd, RTC_EPOCH_SET, (unsigned long)argp);
766
	}
767

    
768
	return -ENOIOCTLCMD;
769
}
770

    
771
/* on ia32 l_start is on a 32-bit boundary */
772
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
773
struct space_resv_32 {
774
	__s16		l_type;
775
	__s16		l_whence;
776
	__s64		l_start	__attribute__((packed));
777
			/* len == 0 means until end of file */
778
	__s64		l_len __attribute__((packed));
779
	__s32		l_sysid;
780
	__u32		l_pid;
781
	__s32		l_pad[4];	/* reserve area */
782
};
783

    
784
#define FS_IOC_RESVSP_32		_IOW ('X', 40, struct space_resv_32)
785
#define FS_IOC_RESVSP64_32	_IOW ('X', 42, struct space_resv_32)
786

    
787
/* just account for different alignment */
788
static int compat_ioctl_preallocate(struct file *file,
789
			struct space_resv_32    __user *p32)
790
{
791
	struct space_resv	__user *p = compat_alloc_user_space(sizeof(*p));
792

    
793
	if (copy_in_user(&p->l_type,	&p32->l_type,	sizeof(s16)) ||
794
	    copy_in_user(&p->l_whence,	&p32->l_whence, sizeof(s16)) ||
795
	    copy_in_user(&p->l_start,	&p32->l_start,	sizeof(s64)) ||
796
	    copy_in_user(&p->l_len,	&p32->l_len,	sizeof(s64)) ||
797
	    copy_in_user(&p->l_sysid,	&p32->l_sysid,	sizeof(s32)) ||
798
	    copy_in_user(&p->l_pid,	&p32->l_pid,	sizeof(u32)) ||
799
	    copy_in_user(&p->l_pad,	&p32->l_pad,	4*sizeof(u32)))
800
		return -EFAULT;
801

    
802
	return ioctl_preallocate(file, p);
803
}
804
#endif
805

    
806
/*
807
 * simple reversible transform to make our table more evenly
808
 * distributed after sorting.
809
 */
810
#define XFORM(i) (((i) ^ ((i) << 27) ^ ((i) << 17)) & 0xffffffff)
811

    
812
#define COMPATIBLE_IOCTL(cmd) XFORM(cmd),
813
/* ioctl should not be warned about even if it's not implemented.
814
   Valid reasons to use this:
815
   - It is implemented with ->compat_ioctl on some device, but programs
816
   call it on others too.
817
   - The ioctl is not implemented in the native kernel, but programs
818
   call it commonly anyways.
819
   Most other reasons are not valid. */
820
#define IGNORE_IOCTL(cmd) COMPATIBLE_IOCTL(cmd)
821

    
822
static unsigned int ioctl_pointer[] = {
823
/* compatible ioctls first */
824
COMPATIBLE_IOCTL(0x4B50)   /* KDGHWCLK - not in the kernel, but don't complain */
825
COMPATIBLE_IOCTL(0x4B51)   /* KDSHWCLK - not in the kernel, but don't complain */
826

    
827
/* Big T */
828
COMPATIBLE_IOCTL(TCGETA)
829
COMPATIBLE_IOCTL(TCSETA)
830
COMPATIBLE_IOCTL(TCSETAW)
831
COMPATIBLE_IOCTL(TCSETAF)
832
COMPATIBLE_IOCTL(TCSBRK)
833
COMPATIBLE_IOCTL(TCXONC)
834
COMPATIBLE_IOCTL(TCFLSH)
835
COMPATIBLE_IOCTL(TCGETS)
836
COMPATIBLE_IOCTL(TCSETS)
837
COMPATIBLE_IOCTL(TCSETSW)
838
COMPATIBLE_IOCTL(TCSETSF)
839
COMPATIBLE_IOCTL(TIOCLINUX)
840
COMPATIBLE_IOCTL(TIOCSBRK)
841
COMPATIBLE_IOCTL(TIOCGDEV)
842
COMPATIBLE_IOCTL(TIOCCBRK)
843
COMPATIBLE_IOCTL(TIOCGSID)
844
COMPATIBLE_IOCTL(TIOCGICOUNT)
845
/* Little t */
846
COMPATIBLE_IOCTL(TIOCGETD)
847
COMPATIBLE_IOCTL(TIOCSETD)
848
COMPATIBLE_IOCTL(TIOCEXCL)
849
COMPATIBLE_IOCTL(TIOCNXCL)
850
COMPATIBLE_IOCTL(TIOCCONS)
851
COMPATIBLE_IOCTL(TIOCGSOFTCAR)
852
COMPATIBLE_IOCTL(TIOCSSOFTCAR)
853
COMPATIBLE_IOCTL(TIOCSWINSZ)
854
COMPATIBLE_IOCTL(TIOCGWINSZ)
855
COMPATIBLE_IOCTL(TIOCMGET)
856
COMPATIBLE_IOCTL(TIOCMBIC)
857
COMPATIBLE_IOCTL(TIOCMBIS)
858
COMPATIBLE_IOCTL(TIOCMSET)
859
COMPATIBLE_IOCTL(TIOCPKT)
860
COMPATIBLE_IOCTL(TIOCNOTTY)
861
COMPATIBLE_IOCTL(TIOCSTI)
862
COMPATIBLE_IOCTL(TIOCOUTQ)
863
COMPATIBLE_IOCTL(TIOCSPGRP)
864
COMPATIBLE_IOCTL(TIOCGPGRP)
865
COMPATIBLE_IOCTL(TIOCGPTN)
866
COMPATIBLE_IOCTL(TIOCSPTLCK)
867
COMPATIBLE_IOCTL(TIOCSERGETLSR)
868
COMPATIBLE_IOCTL(TIOCSIG)
869
#ifdef TCGETS2
870
COMPATIBLE_IOCTL(TCGETS2)
871
COMPATIBLE_IOCTL(TCSETS2)
872
COMPATIBLE_IOCTL(TCSETSW2)
873
COMPATIBLE_IOCTL(TCSETSF2)
874
#endif
875
/* Little f */
876
COMPATIBLE_IOCTL(FIOCLEX)
877
COMPATIBLE_IOCTL(FIONCLEX)
878
COMPATIBLE_IOCTL(FIOASYNC)
879
COMPATIBLE_IOCTL(FIONBIO)
880
COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
881
COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
882
/* 0x00 */
883
COMPATIBLE_IOCTL(FIBMAP)
884
COMPATIBLE_IOCTL(FIGETBSZ)
885
/* 'X' - originally XFS but some now in the VFS */
886
COMPATIBLE_IOCTL(FIFREEZE)
887
COMPATIBLE_IOCTL(FITHAW)
888
COMPATIBLE_IOCTL(KDGETKEYCODE)
889
COMPATIBLE_IOCTL(KDSETKEYCODE)
890
COMPATIBLE_IOCTL(KDGKBTYPE)
891
COMPATIBLE_IOCTL(KDGETMODE)
892
COMPATIBLE_IOCTL(KDGKBMODE)
893
COMPATIBLE_IOCTL(KDGKBMETA)
894
COMPATIBLE_IOCTL(KDGKBENT)
895
COMPATIBLE_IOCTL(KDSKBENT)
896
COMPATIBLE_IOCTL(KDGKBSENT)
897
COMPATIBLE_IOCTL(KDSKBSENT)
898
COMPATIBLE_IOCTL(KDGKBDIACR)
899
COMPATIBLE_IOCTL(KDSKBDIACR)
900
COMPATIBLE_IOCTL(KDKBDREP)
901
COMPATIBLE_IOCTL(KDGKBLED)
902
COMPATIBLE_IOCTL(KDGETLED)
903
#ifdef CONFIG_BLOCK
904
/* Big S */
905
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_IDLUN)
906
COMPATIBLE_IOCTL(SCSI_IOCTL_DOORLOCK)
907
COMPATIBLE_IOCTL(SCSI_IOCTL_DOORUNLOCK)
908
COMPATIBLE_IOCTL(SCSI_IOCTL_TEST_UNIT_READY)
909
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER)
910
COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND)
911
COMPATIBLE_IOCTL(SCSI_IOCTL_PROBE_HOST)
912
COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI)
913
#endif
914
/* Big V (don't complain on serial console) */
915
IGNORE_IOCTL(VT_OPENQRY)
916
IGNORE_IOCTL(VT_GETMODE)
917
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
918
COMPATIBLE_IOCTL(RTC_AIE_ON)
919
COMPATIBLE_IOCTL(RTC_AIE_OFF)
920
COMPATIBLE_IOCTL(RTC_UIE_ON)
921
COMPATIBLE_IOCTL(RTC_UIE_OFF)
922
COMPATIBLE_IOCTL(RTC_PIE_ON)
923
COMPATIBLE_IOCTL(RTC_PIE_OFF)
924
COMPATIBLE_IOCTL(RTC_WIE_ON)
925
COMPATIBLE_IOCTL(RTC_WIE_OFF)
926
COMPATIBLE_IOCTL(RTC_ALM_SET)
927
COMPATIBLE_IOCTL(RTC_ALM_READ)
928
COMPATIBLE_IOCTL(RTC_RD_TIME)
929
COMPATIBLE_IOCTL(RTC_SET_TIME)
930
COMPATIBLE_IOCTL(RTC_WKALM_SET)
931
COMPATIBLE_IOCTL(RTC_WKALM_RD)
932
/*
933
 * These two are only for the sbus rtc driver, but
934
 * hwclock tries them on every rtc device first when
935
 * running on sparc.  On other architectures the entries
936
 * are useless but harmless.
937
 */
938
COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
939
COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
940
/* Little m */
941
COMPATIBLE_IOCTL(MTIOCTOP)
942
/* Socket level stuff */
943
COMPATIBLE_IOCTL(FIOQSIZE)
944
#ifdef CONFIG_BLOCK
945
/* loop */
946
IGNORE_IOCTL(LOOP_CLR_FD)
947
/* md calls this on random blockdevs */
948
IGNORE_IOCTL(RAID_VERSION)
949
/* qemu/qemu-img might call these two on plain files for probing */
950
IGNORE_IOCTL(CDROM_DRIVE_STATUS)
951
IGNORE_IOCTL(FDGETPRM32)
952
/* SG stuff */
953
COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
954
COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
955
COMPATIBLE_IOCTL(SG_EMULATED_HOST)
956
COMPATIBLE_IOCTL(SG_GET_TRANSFORM)
957
COMPATIBLE_IOCTL(SG_SET_RESERVED_SIZE)
958
COMPATIBLE_IOCTL(SG_GET_RESERVED_SIZE)
959
COMPATIBLE_IOCTL(SG_GET_SCSI_ID)
960
COMPATIBLE_IOCTL(SG_SET_FORCE_LOW_DMA)
961
COMPATIBLE_IOCTL(SG_GET_LOW_DMA)
962
COMPATIBLE_IOCTL(SG_SET_FORCE_PACK_ID)
963
COMPATIBLE_IOCTL(SG_GET_PACK_ID)
964
COMPATIBLE_IOCTL(SG_GET_NUM_WAITING)
965
COMPATIBLE_IOCTL(SG_SET_DEBUG)
966
COMPATIBLE_IOCTL(SG_GET_SG_TABLESIZE)
967
COMPATIBLE_IOCTL(SG_GET_COMMAND_Q)
968
COMPATIBLE_IOCTL(SG_SET_COMMAND_Q)
969
COMPATIBLE_IOCTL(SG_GET_VERSION_NUM)
970
COMPATIBLE_IOCTL(SG_NEXT_CMD_LEN)
971
COMPATIBLE_IOCTL(SG_SCSI_RESET)
972
COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
973
COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
974
COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
975
#endif
976
/* PPP stuff */
977
COMPATIBLE_IOCTL(PPPIOCGFLAGS)
978
COMPATIBLE_IOCTL(PPPIOCSFLAGS)
979
COMPATIBLE_IOCTL(PPPIOCGASYNCMAP)
980
COMPATIBLE_IOCTL(PPPIOCSASYNCMAP)
981
COMPATIBLE_IOCTL(PPPIOCGUNIT)
982
COMPATIBLE_IOCTL(PPPIOCGRASYNCMAP)
983
COMPATIBLE_IOCTL(PPPIOCSRASYNCMAP)
984
COMPATIBLE_IOCTL(PPPIOCGMRU)
985
COMPATIBLE_IOCTL(PPPIOCSMRU)
986
COMPATIBLE_IOCTL(PPPIOCSMAXCID)
987
COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP)
988
COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP)
989
COMPATIBLE_IOCTL(PPPIOCXFERUNIT)
990
/* PPPIOCSCOMPRESS is translated */
991
COMPATIBLE_IOCTL(PPPIOCGNPMODE)
992
COMPATIBLE_IOCTL(PPPIOCSNPMODE)
993
COMPATIBLE_IOCTL(PPPIOCGDEBUG)
994
COMPATIBLE_IOCTL(PPPIOCSDEBUG)
995
/* PPPIOCSPASS is translated */
996
/* PPPIOCSACTIVE is translated */
997
/* PPPIOCGIDLE is translated */
998
COMPATIBLE_IOCTL(PPPIOCNEWUNIT)
999
COMPATIBLE_IOCTL(PPPIOCATTACH)
1000
COMPATIBLE_IOCTL(PPPIOCDETACH)
1001
COMPATIBLE_IOCTL(PPPIOCSMRRU)
1002
COMPATIBLE_IOCTL(PPPIOCCONNECT)
1003
COMPATIBLE_IOCTL(PPPIOCDISCONN)
1004
COMPATIBLE_IOCTL(PPPIOCATTCHAN)
1005
COMPATIBLE_IOCTL(PPPIOCGCHAN)
1006
COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS)
1007
/* PPPOX */
1008
COMPATIBLE_IOCTL(PPPOEIOCSFWD)
1009
COMPATIBLE_IOCTL(PPPOEIOCDFWD)
1010
/* ppdev */
1011
COMPATIBLE_IOCTL(PPSETMODE)
1012
COMPATIBLE_IOCTL(PPRSTATUS)
1013
COMPATIBLE_IOCTL(PPRCONTROL)
1014
COMPATIBLE_IOCTL(PPWCONTROL)
1015
COMPATIBLE_IOCTL(PPFCONTROL)
1016
COMPATIBLE_IOCTL(PPRDATA)
1017
COMPATIBLE_IOCTL(PPWDATA)
1018
COMPATIBLE_IOCTL(PPCLAIM)
1019
COMPATIBLE_IOCTL(PPRELEASE)
1020
COMPATIBLE_IOCTL(PPYIELD)
1021
COMPATIBLE_IOCTL(PPEXCL)
1022
COMPATIBLE_IOCTL(PPDATADIR)
1023
COMPATIBLE_IOCTL(PPNEGOT)
1024
COMPATIBLE_IOCTL(PPWCTLONIRQ)
1025
COMPATIBLE_IOCTL(PPCLRIRQ)
1026
COMPATIBLE_IOCTL(PPSETPHASE)
1027
COMPATIBLE_IOCTL(PPGETMODES)
1028
COMPATIBLE_IOCTL(PPGETMODE)
1029
COMPATIBLE_IOCTL(PPGETPHASE)
1030
COMPATIBLE_IOCTL(PPGETFLAGS)
1031
COMPATIBLE_IOCTL(PPSETFLAGS)
1032
/* Big A */
1033
/* sparc only */
1034
/* Big Q for sound/OSS */
1035
COMPATIBLE_IOCTL(SNDCTL_SEQ_RESET)
1036
COMPATIBLE_IOCTL(SNDCTL_SEQ_SYNC)
1037
COMPATIBLE_IOCTL(SNDCTL_SYNTH_INFO)
1038
COMPATIBLE_IOCTL(SNDCTL_SEQ_CTRLRATE)
1039
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETOUTCOUNT)
1040
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETINCOUNT)
1041
COMPATIBLE_IOCTL(SNDCTL_SEQ_PERCMODE)
1042
COMPATIBLE_IOCTL(SNDCTL_FM_LOAD_INSTR)
1043
COMPATIBLE_IOCTL(SNDCTL_SEQ_TESTMIDI)
1044
COMPATIBLE_IOCTL(SNDCTL_SEQ_RESETSAMPLES)
1045
COMPATIBLE_IOCTL(SNDCTL_SEQ_NRSYNTHS)
1046
COMPATIBLE_IOCTL(SNDCTL_SEQ_NRMIDIS)
1047
COMPATIBLE_IOCTL(SNDCTL_MIDI_INFO)
1048
COMPATIBLE_IOCTL(SNDCTL_SEQ_THRESHOLD)
1049
COMPATIBLE_IOCTL(SNDCTL_SYNTH_MEMAVL)
1050
COMPATIBLE_IOCTL(SNDCTL_FM_4OP_ENABLE)
1051
COMPATIBLE_IOCTL(SNDCTL_SEQ_PANIC)
1052
COMPATIBLE_IOCTL(SNDCTL_SEQ_OUTOFBAND)
1053
COMPATIBLE_IOCTL(SNDCTL_SEQ_GETTIME)
1054
COMPATIBLE_IOCTL(SNDCTL_SYNTH_ID)
1055
COMPATIBLE_IOCTL(SNDCTL_SYNTH_CONTROL)
1056
COMPATIBLE_IOCTL(SNDCTL_SYNTH_REMOVESAMPLE)
1057
/* Big T for sound/OSS */
1058
COMPATIBLE_IOCTL(SNDCTL_TMR_TIMEBASE)
1059
COMPATIBLE_IOCTL(SNDCTL_TMR_START)
1060
COMPATIBLE_IOCTL(SNDCTL_TMR_STOP)
1061
COMPATIBLE_IOCTL(SNDCTL_TMR_CONTINUE)
1062
COMPATIBLE_IOCTL(SNDCTL_TMR_TEMPO)
1063
COMPATIBLE_IOCTL(SNDCTL_TMR_SOURCE)
1064
COMPATIBLE_IOCTL(SNDCTL_TMR_METRONOME)
1065
COMPATIBLE_IOCTL(SNDCTL_TMR_SELECT)
1066
/* Little m for sound/OSS */
1067
COMPATIBLE_IOCTL(SNDCTL_MIDI_PRETIME)
1068
COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUMODE)
1069
COMPATIBLE_IOCTL(SNDCTL_MIDI_MPUCMD)
1070
/* Big P for sound/OSS */
1071
COMPATIBLE_IOCTL(SNDCTL_DSP_RESET)
1072
COMPATIBLE_IOCTL(SNDCTL_DSP_SYNC)
1073
COMPATIBLE_IOCTL(SNDCTL_DSP_SPEED)
1074
COMPATIBLE_IOCTL(SNDCTL_DSP_STEREO)
1075
COMPATIBLE_IOCTL(SNDCTL_DSP_GETBLKSIZE)
1076
COMPATIBLE_IOCTL(SNDCTL_DSP_CHANNELS)
1077
COMPATIBLE_IOCTL(SOUND_PCM_WRITE_FILTER)
1078
COMPATIBLE_IOCTL(SNDCTL_DSP_POST)
1079
COMPATIBLE_IOCTL(SNDCTL_DSP_SUBDIVIDE)
1080
COMPATIBLE_IOCTL(SNDCTL_DSP_SETFRAGMENT)
1081
COMPATIBLE_IOCTL(SNDCTL_DSP_GETFMTS)
1082
COMPATIBLE_IOCTL(SNDCTL_DSP_SETFMT)
1083
COMPATIBLE_IOCTL(SNDCTL_DSP_GETOSPACE)
1084
COMPATIBLE_IOCTL(SNDCTL_DSP_GETISPACE)
1085
COMPATIBLE_IOCTL(SNDCTL_DSP_NONBLOCK)
1086
COMPATIBLE_IOCTL(SNDCTL_DSP_GETCAPS)
1087
COMPATIBLE_IOCTL(SNDCTL_DSP_GETTRIGGER)
1088
COMPATIBLE_IOCTL(SNDCTL_DSP_SETTRIGGER)
1089
COMPATIBLE_IOCTL(SNDCTL_DSP_GETIPTR)
1090
COMPATIBLE_IOCTL(SNDCTL_DSP_GETOPTR)
1091
/* SNDCTL_DSP_MAPINBUF,  XXX needs translation */
1092
/* SNDCTL_DSP_MAPOUTBUF,  XXX needs translation */
1093
COMPATIBLE_IOCTL(SNDCTL_DSP_SETSYNCRO)
1094
COMPATIBLE_IOCTL(SNDCTL_DSP_SETDUPLEX)
1095
COMPATIBLE_IOCTL(SNDCTL_DSP_GETODELAY)
1096
COMPATIBLE_IOCTL(SNDCTL_DSP_PROFILE)
1097
COMPATIBLE_IOCTL(SOUND_PCM_READ_RATE)
1098
COMPATIBLE_IOCTL(SOUND_PCM_READ_CHANNELS)
1099
COMPATIBLE_IOCTL(SOUND_PCM_READ_BITS)
1100
COMPATIBLE_IOCTL(SOUND_PCM_READ_FILTER)
1101
/* Big C for sound/OSS */
1102
COMPATIBLE_IOCTL(SNDCTL_COPR_RESET)
1103
COMPATIBLE_IOCTL(SNDCTL_COPR_LOAD)
1104
COMPATIBLE_IOCTL(SNDCTL_COPR_RDATA)
1105
COMPATIBLE_IOCTL(SNDCTL_COPR_RCODE)
1106
COMPATIBLE_IOCTL(SNDCTL_COPR_WDATA)
1107
COMPATIBLE_IOCTL(SNDCTL_COPR_WCODE)
1108
COMPATIBLE_IOCTL(SNDCTL_COPR_RUN)
1109
COMPATIBLE_IOCTL(SNDCTL_COPR_HALT)
1110
COMPATIBLE_IOCTL(SNDCTL_COPR_SENDMSG)
1111
COMPATIBLE_IOCTL(SNDCTL_COPR_RCVMSG)
1112
/* Big M for sound/OSS */
1113
COMPATIBLE_IOCTL(SOUND_MIXER_READ_VOLUME)
1114
COMPATIBLE_IOCTL(SOUND_MIXER_READ_BASS)
1115
COMPATIBLE_IOCTL(SOUND_MIXER_READ_TREBLE)
1116
COMPATIBLE_IOCTL(SOUND_MIXER_READ_SYNTH)
1117
COMPATIBLE_IOCTL(SOUND_MIXER_READ_PCM)
1118
COMPATIBLE_IOCTL(SOUND_MIXER_READ_SPEAKER)
1119
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE)
1120
COMPATIBLE_IOCTL(SOUND_MIXER_READ_MIC)
1121
COMPATIBLE_IOCTL(SOUND_MIXER_READ_CD)
1122
COMPATIBLE_IOCTL(SOUND_MIXER_READ_IMIX)
1123
COMPATIBLE_IOCTL(SOUND_MIXER_READ_ALTPCM)
1124
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECLEV)
1125
COMPATIBLE_IOCTL(SOUND_MIXER_READ_IGAIN)
1126
COMPATIBLE_IOCTL(SOUND_MIXER_READ_OGAIN)
1127
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE1)
1128
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE2)
1129
COMPATIBLE_IOCTL(SOUND_MIXER_READ_LINE3)
1130
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL1))
1131
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL2))
1132
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_DIGITAL3))
1133
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_PHONEIN))
1134
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_PHONEOUT))
1135
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_VIDEO))
1136
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_RADIO))
1137
COMPATIBLE_IOCTL(MIXER_READ(SOUND_MIXER_MONITOR))
1138
COMPATIBLE_IOCTL(SOUND_MIXER_READ_MUTE)
1139
/* SOUND_MIXER_READ_ENHANCE,  same value as READ_MUTE */
1140
/* SOUND_MIXER_READ_LOUD,  same value as READ_MUTE */
1141
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECSRC)
1142
COMPATIBLE_IOCTL(SOUND_MIXER_READ_DEVMASK)
1143
COMPATIBLE_IOCTL(SOUND_MIXER_READ_RECMASK)
1144
COMPATIBLE_IOCTL(SOUND_MIXER_READ_STEREODEVS)
1145
COMPATIBLE_IOCTL(SOUND_MIXER_READ_CAPS)
1146
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_VOLUME)
1147
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_BASS)
1148
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_TREBLE)
1149
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SYNTH)
1150
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_PCM)
1151
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_SPEAKER)
1152
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE)
1153
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MIC)
1154
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_CD)
1155
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IMIX)
1156
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_ALTPCM)
1157
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECLEV)
1158
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_IGAIN)
1159
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_OGAIN)
1160
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE1)
1161
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE2)
1162
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_LINE3)
1163
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL1))
1164
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL2))
1165
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_DIGITAL3))
1166
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_PHONEIN))
1167
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_PHONEOUT))
1168
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_VIDEO))
1169
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_RADIO))
1170
COMPATIBLE_IOCTL(MIXER_WRITE(SOUND_MIXER_MONITOR))
1171
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_MUTE)
1172
/* SOUND_MIXER_WRITE_ENHANCE,  same value as WRITE_MUTE */
1173
/* SOUND_MIXER_WRITE_LOUD,  same value as WRITE_MUTE */
1174
COMPATIBLE_IOCTL(SOUND_MIXER_WRITE_RECSRC)
1175
COMPATIBLE_IOCTL(SOUND_MIXER_INFO)
1176
COMPATIBLE_IOCTL(SOUND_OLD_MIXER_INFO)
1177
COMPATIBLE_IOCTL(SOUND_MIXER_ACCESS)
1178
COMPATIBLE_IOCTL(SOUND_MIXER_AGC)
1179
COMPATIBLE_IOCTL(SOUND_MIXER_3DSE)
1180
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE1)
1181
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE2)
1182
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE3)
1183
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE4)
1184
COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE5)
1185
COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
1186
COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
1187
COMPATIBLE_IOCTL(OSS_GETVERSION)
1188
/* Raw devices */
1189
COMPATIBLE_IOCTL(RAW_SETBIND)
1190
COMPATIBLE_IOCTL(RAW_GETBIND)
1191
/* Watchdog */
1192
COMPATIBLE_IOCTL(WDIOC_GETSUPPORT)
1193
COMPATIBLE_IOCTL(WDIOC_GETSTATUS)
1194
COMPATIBLE_IOCTL(WDIOC_GETBOOTSTATUS)
1195
COMPATIBLE_IOCTL(WDIOC_GETTEMP)
1196
COMPATIBLE_IOCTL(WDIOC_SETOPTIONS)
1197
COMPATIBLE_IOCTL(WDIOC_KEEPALIVE)
1198
COMPATIBLE_IOCTL(WDIOC_SETTIMEOUT)
1199
COMPATIBLE_IOCTL(WDIOC_GETTIMEOUT)
1200
/* Big R */
1201
COMPATIBLE_IOCTL(RNDGETENTCNT)
1202
COMPATIBLE_IOCTL(RNDADDTOENTCNT)
1203
COMPATIBLE_IOCTL(RNDGETPOOL)
1204
COMPATIBLE_IOCTL(RNDADDENTROPY)
1205
COMPATIBLE_IOCTL(RNDZAPENTCNT)
1206
COMPATIBLE_IOCTL(RNDCLEARPOOL)
1207
/* Bluetooth */
1208
COMPATIBLE_IOCTL(HCIDEVUP)
1209
COMPATIBLE_IOCTL(HCIDEVDOWN)
1210
COMPATIBLE_IOCTL(HCIDEVRESET)
1211
COMPATIBLE_IOCTL(HCIDEVRESTAT)
1212
COMPATIBLE_IOCTL(HCIGETDEVLIST)
1213
COMPATIBLE_IOCTL(HCIGETDEVINFO)
1214
COMPATIBLE_IOCTL(HCIGETCONNLIST)
1215
COMPATIBLE_IOCTL(HCIGETCONNINFO)
1216
COMPATIBLE_IOCTL(HCIGETAUTHINFO)
1217
COMPATIBLE_IOCTL(HCISETRAW)
1218
COMPATIBLE_IOCTL(HCISETSCAN)
1219
COMPATIBLE_IOCTL(HCISETAUTH)
1220
COMPATIBLE_IOCTL(HCISETENCRYPT)
1221
COMPATIBLE_IOCTL(HCISETPTYPE)
1222
COMPATIBLE_IOCTL(HCISETLINKPOL)
1223
COMPATIBLE_IOCTL(HCISETLINKMODE)
1224
COMPATIBLE_IOCTL(HCISETACLMTU)
1225
COMPATIBLE_IOCTL(HCISETSCOMTU)
1226
COMPATIBLE_IOCTL(HCIBLOCKADDR)
1227
COMPATIBLE_IOCTL(HCIUNBLOCKADDR)
1228
COMPATIBLE_IOCTL(HCIINQUIRY)
1229
COMPATIBLE_IOCTL(HCIUARTSETPROTO)
1230
COMPATIBLE_IOCTL(HCIUARTGETPROTO)
1231
COMPATIBLE_IOCTL(RFCOMMCREATEDEV)
1232
COMPATIBLE_IOCTL(RFCOMMRELEASEDEV)
1233
COMPATIBLE_IOCTL(RFCOMMGETDEVLIST)
1234
COMPATIBLE_IOCTL(RFCOMMGETDEVINFO)
1235
COMPATIBLE_IOCTL(RFCOMMSTEALDLC)
1236
COMPATIBLE_IOCTL(BNEPCONNADD)
1237
COMPATIBLE_IOCTL(BNEPCONNDEL)
1238
COMPATIBLE_IOCTL(BNEPGETCONNLIST)
1239
COMPATIBLE_IOCTL(BNEPGETCONNINFO)
1240
COMPATIBLE_IOCTL(CMTPCONNADD)
1241
COMPATIBLE_IOCTL(CMTPCONNDEL)
1242
COMPATIBLE_IOCTL(CMTPGETCONNLIST)
1243
COMPATIBLE_IOCTL(CMTPGETCONNINFO)
1244
COMPATIBLE_IOCTL(HIDPCONNADD)
1245
COMPATIBLE_IOCTL(HIDPCONNDEL)
1246
COMPATIBLE_IOCTL(HIDPGETCONNLIST)
1247
COMPATIBLE_IOCTL(HIDPGETCONNINFO)
1248
/* CAPI */
1249
COMPATIBLE_IOCTL(CAPI_REGISTER)
1250
COMPATIBLE_IOCTL(CAPI_GET_MANUFACTURER)
1251
COMPATIBLE_IOCTL(CAPI_GET_VERSION)
1252
COMPATIBLE_IOCTL(CAPI_GET_SERIAL)
1253
COMPATIBLE_IOCTL(CAPI_GET_PROFILE)
1254
COMPATIBLE_IOCTL(CAPI_MANUFACTURER_CMD)
1255
COMPATIBLE_IOCTL(CAPI_GET_ERRCODE)
1256
COMPATIBLE_IOCTL(CAPI_INSTALLED)
1257
COMPATIBLE_IOCTL(CAPI_GET_FLAGS)
1258
COMPATIBLE_IOCTL(CAPI_SET_FLAGS)
1259
COMPATIBLE_IOCTL(CAPI_CLR_FLAGS)
1260
COMPATIBLE_IOCTL(CAPI_NCCI_OPENCOUNT)
1261
COMPATIBLE_IOCTL(CAPI_NCCI_GETUNIT)
1262
/* Siemens Gigaset */
1263
COMPATIBLE_IOCTL(GIGASET_REDIR)
1264
COMPATIBLE_IOCTL(GIGASET_CONFIG)
1265
COMPATIBLE_IOCTL(GIGASET_BRKCHARS)
1266
COMPATIBLE_IOCTL(GIGASET_VERSION)
1267
/* Misc. */
1268
COMPATIBLE_IOCTL(0x41545900)		/* ATYIO_CLKR */
1269
COMPATIBLE_IOCTL(0x41545901)		/* ATYIO_CLKW */
1270
COMPATIBLE_IOCTL(PCIIOC_CONTROLLER)
1271
COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_IO)
1272
COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_MEM)
1273
COMPATIBLE_IOCTL(PCIIOC_WRITE_COMBINE)
1274
/* NBD */
1275
COMPATIBLE_IOCTL(NBD_DO_IT)
1276
COMPATIBLE_IOCTL(NBD_CLEAR_SOCK)
1277
COMPATIBLE_IOCTL(NBD_CLEAR_QUE)
1278
COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
1279
COMPATIBLE_IOCTL(NBD_DISCONNECT)
1280
/* i2c */
1281
COMPATIBLE_IOCTL(I2C_SLAVE)
1282
COMPATIBLE_IOCTL(I2C_SLAVE_FORCE)
1283
COMPATIBLE_IOCTL(I2C_TENBIT)
1284
COMPATIBLE_IOCTL(I2C_PEC)
1285
COMPATIBLE_IOCTL(I2C_RETRIES)
1286
COMPATIBLE_IOCTL(I2C_TIMEOUT)
1287
/* hiddev */
1288
COMPATIBLE_IOCTL(HIDIOCGVERSION)
1289
COMPATIBLE_IOCTL(HIDIOCAPPLICATION)
1290
COMPATIBLE_IOCTL(HIDIOCGDEVINFO)
1291
COMPATIBLE_IOCTL(HIDIOCGSTRING)
1292
COMPATIBLE_IOCTL(HIDIOCINITREPORT)
1293
COMPATIBLE_IOCTL(HIDIOCGREPORT)
1294
COMPATIBLE_IOCTL(HIDIOCSREPORT)
1295
COMPATIBLE_IOCTL(HIDIOCGREPORTINFO)
1296
COMPATIBLE_IOCTL(HIDIOCGFIELDINFO)
1297
COMPATIBLE_IOCTL(HIDIOCGUSAGE)
1298
COMPATIBLE_IOCTL(HIDIOCSUSAGE)
1299
COMPATIBLE_IOCTL(HIDIOCGUCODE)
1300
COMPATIBLE_IOCTL(HIDIOCGFLAG)
1301
COMPATIBLE_IOCTL(HIDIOCSFLAG)
1302
COMPATIBLE_IOCTL(HIDIOCGCOLLECTIONINDEX)
1303
COMPATIBLE_IOCTL(HIDIOCGCOLLECTIONINFO)
1304
/* dvb */
1305
COMPATIBLE_IOCTL(AUDIO_STOP)
1306
COMPATIBLE_IOCTL(AUDIO_PLAY)
1307
COMPATIBLE_IOCTL(AUDIO_PAUSE)
1308
COMPATIBLE_IOCTL(AUDIO_CONTINUE)
1309
COMPATIBLE_IOCTL(AUDIO_SELECT_SOURCE)
1310
COMPATIBLE_IOCTL(AUDIO_SET_MUTE)
1311
COMPATIBLE_IOCTL(AUDIO_SET_AV_SYNC)
1312
COMPATIBLE_IOCTL(AUDIO_SET_BYPASS_MODE)
1313
COMPATIBLE_IOCTL(AUDIO_CHANNEL_SELECT)
1314
COMPATIBLE_IOCTL(AUDIO_GET_STATUS)
1315
COMPATIBLE_IOCTL(AUDIO_GET_CAPABILITIES)
1316
COMPATIBLE_IOCTL(AUDIO_CLEAR_BUFFER)
1317
COMPATIBLE_IOCTL(AUDIO_SET_ID)
1318
COMPATIBLE_IOCTL(AUDIO_SET_MIXER)
1319
COMPATIBLE_IOCTL(AUDIO_SET_STREAMTYPE)
1320
COMPATIBLE_IOCTL(AUDIO_SET_EXT_ID)
1321
COMPATIBLE_IOCTL(AUDIO_SET_ATTRIBUTES)
1322
COMPATIBLE_IOCTL(AUDIO_SET_KARAOKE)
1323
COMPATIBLE_IOCTL(DMX_START)
1324
COMPATIBLE_IOCTL(DMX_STOP)
1325
COMPATIBLE_IOCTL(DMX_SET_FILTER)
1326
COMPATIBLE_IOCTL(DMX_SET_PES_FILTER)
1327
COMPATIBLE_IOCTL(DMX_SET_BUFFER_SIZE)
1328
COMPATIBLE_IOCTL(DMX_GET_PES_PIDS)
1329
COMPATIBLE_IOCTL(DMX_GET_CAPS)
1330
COMPATIBLE_IOCTL(DMX_SET_SOURCE)
1331
COMPATIBLE_IOCTL(DMX_GET_STC)
1332
COMPATIBLE_IOCTL(FE_GET_INFO)
1333
COMPATIBLE_IOCTL(FE_DISEQC_RESET_OVERLOAD)
1334
COMPATIBLE_IOCTL(FE_DISEQC_SEND_MASTER_CMD)
1335
COMPATIBLE_IOCTL(FE_DISEQC_RECV_SLAVE_REPLY)
1336
COMPATIBLE_IOCTL(FE_DISEQC_SEND_BURST)
1337
COMPATIBLE_IOCTL(FE_SET_TONE)
1338
COMPATIBLE_IOCTL(FE_SET_VOLTAGE)
1339
COMPATIBLE_IOCTL(FE_ENABLE_HIGH_LNB_VOLTAGE)
1340
COMPATIBLE_IOCTL(FE_READ_STATUS)
1341
COMPATIBLE_IOCTL(FE_READ_BER)
1342
COMPATIBLE_IOCTL(FE_READ_SIGNAL_STRENGTH)
1343
COMPATIBLE_IOCTL(FE_READ_SNR)
1344
COMPATIBLE_IOCTL(FE_READ_UNCORRECTED_BLOCKS)
1345
COMPATIBLE_IOCTL(FE_SET_FRONTEND)
1346
COMPATIBLE_IOCTL(FE_GET_FRONTEND)
1347
COMPATIBLE_IOCTL(FE_GET_EVENT)
1348
COMPATIBLE_IOCTL(FE_DISHNETWORK_SEND_LEGACY_CMD)
1349
COMPATIBLE_IOCTL(VIDEO_STOP)
1350
COMPATIBLE_IOCTL(VIDEO_PLAY)
1351
COMPATIBLE_IOCTL(VIDEO_FREEZE)
1352
COMPATIBLE_IOCTL(VIDEO_CONTINUE)
1353
COMPATIBLE_IOCTL(VIDEO_SELECT_SOURCE)
1354
COMPATIBLE_IOCTL(VIDEO_SET_BLANK)
1355
COMPATIBLE_IOCTL(VIDEO_GET_STATUS)
1356
COMPATIBLE_IOCTL(VIDEO_SET_DISPLAY_FORMAT)
1357
COMPATIBLE_IOCTL(VIDEO_FAST_FORWARD)
1358
COMPATIBLE_IOCTL(VIDEO_SLOWMOTION)
1359
COMPATIBLE_IOCTL(VIDEO_GET_CAPABILITIES)
1360
COMPATIBLE_IOCTL(VIDEO_CLEAR_BUFFER)
1361
COMPATIBLE_IOCTL(VIDEO_SET_ID)
1362
COMPATIBLE_IOCTL(VIDEO_SET_STREAMTYPE)
1363
COMPATIBLE_IOCTL(VIDEO_SET_FORMAT)
1364
COMPATIBLE_IOCTL(VIDEO_SET_SYSTEM)
1365
COMPATIBLE_IOCTL(VIDEO_SET_HIGHLIGHT)
1366
COMPATIBLE_IOCTL(VIDEO_SET_SPU)
1367
COMPATIBLE_IOCTL(VIDEO_GET_NAVI)
1368
COMPATIBLE_IOCTL(VIDEO_SET_ATTRIBUTES)
1369
COMPATIBLE_IOCTL(VIDEO_GET_SIZE)
1370
COMPATIBLE_IOCTL(VIDEO_GET_FRAME_RATE)
1371

    
1372
/* joystick */
1373
COMPATIBLE_IOCTL(JSIOCGVERSION)
1374
COMPATIBLE_IOCTL(JSIOCGAXES)
1375
COMPATIBLE_IOCTL(JSIOCGBUTTONS)
1376
COMPATIBLE_IOCTL(JSIOCGNAME(0))
1377

    
1378
#ifdef TIOCGLTC
1379
COMPATIBLE_IOCTL(TIOCGLTC)
1380
COMPATIBLE_IOCTL(TIOCSLTC)
1381
#endif
1382
#ifdef TIOCSTART
1383
/*
1384
 * For these two we have definitions in ioctls.h and/or termios.h on
1385
 * some architectures but no actual implemention.  Some applications
1386
 * like bash call them if they are defined in the headers, so we provide
1387
 * entries here to avoid syslog message spew.
1388
 */
1389
COMPATIBLE_IOCTL(TIOCSTART)
1390
COMPATIBLE_IOCTL(TIOCSTOP)
1391
#endif
1392

    
1393
/* fat 'r' ioctls. These are handled by fat with ->compat_ioctl,
1394
   but we don't want warnings on other file systems. So declare
1395
   them as compatible here. */
1396
#define VFAT_IOCTL_READDIR_BOTH32       _IOR('r', 1, struct compat_dirent[2])
1397
#define VFAT_IOCTL_READDIR_SHORT32      _IOR('r', 2, struct compat_dirent[2])
1398

    
1399
IGNORE_IOCTL(VFAT_IOCTL_READDIR_BOTH32)
1400
IGNORE_IOCTL(VFAT_IOCTL_READDIR_SHORT32)
1401

    
1402
#ifdef CONFIG_SPARC
1403
/* Sparc framebuffers, handled in sbusfb_compat_ioctl() */
1404
IGNORE_IOCTL(FBIOGTYPE)
1405
IGNORE_IOCTL(FBIOSATTR)
1406
IGNORE_IOCTL(FBIOGATTR)
1407
IGNORE_IOCTL(FBIOSVIDEO)
1408
IGNORE_IOCTL(FBIOGVIDEO)
1409
IGNORE_IOCTL(FBIOSCURPOS)
1410
IGNORE_IOCTL(FBIOGCURPOS)
1411
IGNORE_IOCTL(FBIOGCURMAX)
1412
IGNORE_IOCTL(FBIOPUTCMAP32)
1413
IGNORE_IOCTL(FBIOGETCMAP32)
1414
IGNORE_IOCTL(FBIOSCURSOR32)
1415
IGNORE_IOCTL(FBIOGCURSOR32)
1416
#endif
1417
};
1418

    
1419
/*
1420
 * Convert common ioctl arguments based on their command number
1421
 *
1422
 * Please do not add any code in here. Instead, implement
1423
 * a compat_ioctl operation in the place that handleѕ the
1424
 * ioctl for the native case.
1425
 */
1426
static long do_ioctl_trans(int fd, unsigned int cmd,
1427
		 unsigned long arg, struct file *file)
1428
{
1429
	void __user *argp = compat_ptr(arg);
1430

    
1431
	switch (cmd) {
1432
	case PPPIOCGIDLE32:
1433
		return ppp_gidle(fd, cmd, argp);
1434
	case PPPIOCSCOMPRESS32:
1435
		return ppp_scompress(fd, cmd, argp);
1436
	case PPPIOCSPASS32:
1437
	case PPPIOCSACTIVE32:
1438
		return ppp_sock_fprog_ioctl_trans(fd, cmd, argp);
1439
#ifdef CONFIG_BLOCK
1440
	case SG_IO:
1441
		return sg_ioctl_trans(fd, cmd, argp);
1442
	case SG_GET_REQUEST_TABLE:
1443
		return sg_grt_trans(fd, cmd, argp);
1444
	case MTIOCGET32:
1445
	case MTIOCPOS32:
1446
		return mt_ioctl_trans(fd, cmd, argp);
1447
#endif
1448
	/* Serial */
1449
	case TIOCGSERIAL:
1450
	case TIOCSSERIAL:
1451
		return serial_struct_ioctl(fd, cmd, argp);
1452
	/* i2c */
1453
	case I2C_FUNCS:
1454
		return w_long(fd, cmd, argp);
1455
	case I2C_RDWR:
1456
		return do_i2c_rdwr_ioctl(fd, cmd, argp);
1457
	case I2C_SMBUS:
1458
		return do_i2c_smbus_ioctl(fd, cmd, argp);
1459
	/* Not implemented in the native kernel */
1460
	case RTC_IRQP_READ32:
1461
	case RTC_IRQP_SET32:
1462
	case RTC_EPOCH_READ32:
1463
	case RTC_EPOCH_SET32:
1464
		return rtc_ioctl(fd, cmd, argp);
1465

    
1466
	/* dvb */
1467
	case VIDEO_GET_EVENT:
1468
		return do_video_get_event(fd, cmd, argp);
1469
	case VIDEO_STILLPICTURE:
1470
		return do_video_stillpicture(fd, cmd, argp);
1471
	case VIDEO_SET_SPU_PALETTE:
1472
		return do_video_set_spu_palette(fd, cmd, argp);
1473
	}
1474

    
1475
	/*
1476
	 * These take an integer instead of a pointer as 'arg',
1477
	 * so we must not do a compat_ptr() translation.
1478
	 */
1479
	switch (cmd) {
1480
	/* Big T */
1481
	case TCSBRKP:
1482
	case TIOCMIWAIT:
1483
	case TIOCSCTTY:
1484
	/* RAID */
1485
	case HOT_REMOVE_DISK:
1486
	case HOT_ADD_DISK:
1487
	case SET_DISK_FAULTY:
1488
	case SET_BITMAP_FILE:
1489
	/* Big K */
1490
	case KDSIGACCEPT:
1491
	case KIOCSOUND:
1492
	case KDMKTONE:
1493
	case KDSETMODE:
1494
	case KDSKBMODE:
1495
	case KDSKBMETA:
1496
	case KDSKBLED:
1497
	case KDSETLED:
1498
	/* NBD */
1499
	case NBD_SET_SOCK:
1500
	case NBD_SET_BLKSIZE:
1501
	case NBD_SET_SIZE:
1502
	case NBD_SET_SIZE_BLOCKS:
1503
		return do_vfs_ioctl(file, fd, cmd, arg);
1504
	}
1505

    
1506
	return -ENOIOCTLCMD;
1507
}
1508

    
1509
static int compat_ioctl_check_table(unsigned int xcmd)
1510
{
1511
	int i;
1512
	const int max = ARRAY_SIZE(ioctl_pointer) - 1;
1513

    
1514
	BUILD_BUG_ON(max >= (1 << 16));
1515

    
1516
	/* guess initial offset into table, assuming a
1517
	   normalized distribution */
1518
	i = ((xcmd >> 16) * max) >> 16;
1519

    
1520
	/* do linear search up first, until greater or equal */
1521
	while (ioctl_pointer[i] < xcmd && i < max)
1522
		i++;
1523

    
1524
	/* then do linear search down */
1525
	while (ioctl_pointer[i] > xcmd && i > 0)
1526
		i--;
1527

    
1528
	return ioctl_pointer[i] == xcmd;
1529
}
1530

    
1531
asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
1532
				unsigned long arg)
1533
{
1534
	struct file *filp;
1535
	int error = -EBADF;
1536
	int fput_needed;
1537

    
1538
	filp = fget_light(fd, &fput_needed);
1539
	if (!filp)
1540
		goto out;
1541

    
1542
	/* RED-PEN how should LSM module know it's handling 32bit? */
1543
	error = security_file_ioctl(filp, cmd, arg);
1544
	if (error)
1545
		goto out_fput;
1546

    
1547
	/*
1548
	 * To allow the compat_ioctl handlers to be self contained
1549
	 * we need to check the common ioctls here first.
1550
	 * Just handle them with the standard handlers below.
1551
	 */
1552
	switch (cmd) {
1553
	case FIOCLEX:
1554
	case FIONCLEX:
1555
	case FIONBIO:
1556
	case FIOASYNC:
1557
	case FIOQSIZE:
1558
		break;
1559

    
1560
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
1561
	case FS_IOC_RESVSP_32:
1562
	case FS_IOC_RESVSP64_32:
1563
		error = compat_ioctl_preallocate(filp, compat_ptr(arg));
1564
		goto out_fput;
1565
#else
1566
	case FS_IOC_RESVSP:
1567
	case FS_IOC_RESVSP64:
1568
		error = ioctl_preallocate(filp, compat_ptr(arg));
1569
		goto out_fput;
1570
#endif
1571

    
1572
	case FIBMAP:
1573
	case FIGETBSZ:
1574
	case FIONREAD:
1575
		if (S_ISREG(filp->f_path.dentry->d_inode->i_mode))
1576
			break;
1577
		/*FALL THROUGH*/
1578

    
1579
	default:
1580
		if (filp->f_op && filp->f_op->compat_ioctl) {
1581
			error = filp->f_op->compat_ioctl(filp, cmd, arg);
1582
			if (error != -ENOIOCTLCMD)
1583
				goto out_fput;
1584
		}
1585

    
1586
		if (!filp->f_op || !filp->f_op->unlocked_ioctl)
1587
			goto do_ioctl;
1588
		break;
1589
	}
1590

    
1591
	if (compat_ioctl_check_table(XFORM(cmd)))
1592
		goto found_handler;
1593

    
1594
	error = do_ioctl_trans(fd, cmd, arg, filp);
1595
	if (error == -ENOIOCTLCMD)
1596
		error = -ENOTTY;
1597

    
1598
	goto out_fput;
1599

    
1600
 found_handler:
1601
	arg = (unsigned long)compat_ptr(arg);
1602
 do_ioctl:
1603
	error = do_vfs_ioctl(filp, fd, cmd, arg);
1604
 out_fput:
1605
	fput_light(filp, fput_needed);
1606
 out:
1607
	return error;
1608
}
1609

    
1610
static int __init init_sys32_ioctl_cmp(const void *p, const void *q)
1611
{
1612
	unsigned int a, b;
1613
	a = *(unsigned int *)p;
1614
	b = *(unsigned int *)q;
1615
	if (a > b)
1616
		return 1;
1617
	if (a < b)
1618
		return -1;
1619
	return 0;
1620
}
1621

    
1622
static int __init init_sys32_ioctl(void)
1623
{
1624
	sort(ioctl_pointer, ARRAY_SIZE(ioctl_pointer), sizeof(*ioctl_pointer),
1625
		init_sys32_ioctl_cmp, NULL);
1626
	return 0;
1627
}
1628
__initcall(init_sys32_ioctl);
(4-4/5)