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);
|