diff options
42 files changed, 362 insertions, 273 deletions
diff --git a/drivers/media/radio/miropcm20-radio.c b/drivers/media/radio/miropcm20-radio.c index c2ebe8754a95..dc292da2605f 100644 --- a/drivers/media/radio/miropcm20-radio.c +++ b/drivers/media/radio/miropcm20-radio.c | |||
@@ -220,6 +220,7 @@ static struct file_operations pcm20_fops = { | |||
220 | .open = video_exclusive_open, | 220 | .open = video_exclusive_open, |
221 | .release = video_exclusive_release, | 221 | .release = video_exclusive_release, |
222 | .ioctl = pcm20_ioctl, | 222 | .ioctl = pcm20_ioctl, |
223 | .compat_ioctl = v4l_compat_ioctl32, | ||
223 | .llseek = no_llseek, | 224 | .llseek = no_llseek, |
224 | }; | 225 | }; |
225 | 226 | ||
diff --git a/drivers/media/radio/radio-aimslab.c b/drivers/media/radio/radio-aimslab.c index 877c770558e9..914deab4e044 100644 --- a/drivers/media/radio/radio-aimslab.c +++ b/drivers/media/radio/radio-aimslab.c | |||
@@ -299,6 +299,7 @@ static struct file_operations rtrack_fops = { | |||
299 | .open = video_exclusive_open, | 299 | .open = video_exclusive_open, |
300 | .release = video_exclusive_release, | 300 | .release = video_exclusive_release, |
301 | .ioctl = rt_ioctl, | 301 | .ioctl = rt_ioctl, |
302 | .compat_ioctl = v4l_compat_ioctl32, | ||
302 | .llseek = no_llseek, | 303 | .llseek = no_llseek, |
303 | }; | 304 | }; |
304 | 305 | ||
diff --git a/drivers/media/radio/radio-aztech.c b/drivers/media/radio/radio-aztech.c index 5319a9c9a979..523be820f9c6 100644 --- a/drivers/media/radio/radio-aztech.c +++ b/drivers/media/radio/radio-aztech.c | |||
@@ -256,6 +256,7 @@ static struct file_operations aztech_fops = { | |||
256 | .open = video_exclusive_open, | 256 | .open = video_exclusive_open, |
257 | .release = video_exclusive_release, | 257 | .release = video_exclusive_release, |
258 | .ioctl = az_ioctl, | 258 | .ioctl = az_ioctl, |
259 | .compat_ioctl = v4l_compat_ioctl32, | ||
259 | .llseek = no_llseek, | 260 | .llseek = no_llseek, |
260 | }; | 261 | }; |
261 | 262 | ||
diff --git a/drivers/media/radio/radio-cadet.c b/drivers/media/radio/radio-cadet.c index 9b0406318f2d..f1b5ac81e9d2 100644 --- a/drivers/media/radio/radio-cadet.c +++ b/drivers/media/radio/radio-cadet.c | |||
@@ -490,6 +490,7 @@ static struct file_operations cadet_fops = { | |||
490 | .release = cadet_release, | 490 | .release = cadet_release, |
491 | .read = cadet_read, | 491 | .read = cadet_read, |
492 | .ioctl = cadet_ioctl, | 492 | .ioctl = cadet_ioctl, |
493 | .compat_ioctl = v4l_compat_ioctl32, | ||
493 | .llseek = no_llseek, | 494 | .llseek = no_llseek, |
494 | }; | 495 | }; |
495 | 496 | ||
diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c index 630cc786d0a4..42c8fce04aa2 100644 --- a/drivers/media/radio/radio-gemtek-pci.c +++ b/drivers/media/radio/radio-gemtek-pci.c | |||
@@ -301,6 +301,7 @@ static struct file_operations gemtek_pci_fops = { | |||
301 | .open = video_exclusive_open, | 301 | .open = video_exclusive_open, |
302 | .release = video_exclusive_release, | 302 | .release = video_exclusive_release, |
303 | .ioctl = gemtek_pci_ioctl, | 303 | .ioctl = gemtek_pci_ioctl, |
304 | .compat_ioctl = v4l_compat_ioctl32, | ||
304 | .llseek = no_llseek, | 305 | .llseek = no_llseek, |
305 | }; | 306 | }; |
306 | 307 | ||
diff --git a/drivers/media/radio/radio-gemtek.c b/drivers/media/radio/radio-gemtek.c index 6418f03b9ce4..47173be97b9f 100644 --- a/drivers/media/radio/radio-gemtek.c +++ b/drivers/media/radio/radio-gemtek.c | |||
@@ -233,6 +233,7 @@ static struct file_operations gemtek_fops = { | |||
233 | .open = video_exclusive_open, | 233 | .open = video_exclusive_open, |
234 | .release = video_exclusive_release, | 234 | .release = video_exclusive_release, |
235 | .ioctl = gemtek_ioctl, | 235 | .ioctl = gemtek_ioctl, |
236 | .compat_ioctl = v4l_compat_ioctl32, | ||
236 | .llseek = no_llseek, | 237 | .llseek = no_llseek, |
237 | }; | 238 | }; |
238 | 239 | ||
diff --git a/drivers/media/radio/radio-maestro.c b/drivers/media/radio/radio-maestro.c index e5e2021a7312..c30effdf711f 100644 --- a/drivers/media/radio/radio-maestro.c +++ b/drivers/media/radio/radio-maestro.c | |||
@@ -72,6 +72,7 @@ static struct file_operations maestro_fops = { | |||
72 | .open = video_exclusive_open, | 72 | .open = video_exclusive_open, |
73 | .release = video_exclusive_release, | 73 | .release = video_exclusive_release, |
74 | .ioctl = radio_ioctl, | 74 | .ioctl = radio_ioctl, |
75 | .compat_ioctl = v4l_compat_ioctl32, | ||
75 | .llseek = no_llseek, | 76 | .llseek = no_llseek, |
76 | }; | 77 | }; |
77 | 78 | ||
diff --git a/drivers/media/radio/radio-maxiradio.c b/drivers/media/radio/radio-maxiradio.c index 02d39a50d5ed..30869308332a 100644 --- a/drivers/media/radio/radio-maxiradio.c +++ b/drivers/media/radio/radio-maxiradio.c | |||
@@ -80,6 +80,7 @@ static struct file_operations maxiradio_fops = { | |||
80 | .open = video_exclusive_open, | 80 | .open = video_exclusive_open, |
81 | .release = video_exclusive_release, | 81 | .release = video_exclusive_release, |
82 | .ioctl = radio_ioctl, | 82 | .ioctl = radio_ioctl, |
83 | .compat_ioctl = v4l_compat_ioctl32, | ||
83 | .llseek = no_llseek, | 84 | .llseek = no_llseek, |
84 | }; | 85 | }; |
85 | static struct video_device maxiradio_radio = | 86 | static struct video_device maxiradio_radio = |
diff --git a/drivers/media/radio/radio-rtrack2.c b/drivers/media/radio/radio-rtrack2.c index b2256d675b44..28a47c9e7a81 100644 --- a/drivers/media/radio/radio-rtrack2.c +++ b/drivers/media/radio/radio-rtrack2.c | |||
@@ -199,6 +199,7 @@ static struct file_operations rtrack2_fops = { | |||
199 | .open = video_exclusive_open, | 199 | .open = video_exclusive_open, |
200 | .release = video_exclusive_release, | 200 | .release = video_exclusive_release, |
201 | .ioctl = rt_ioctl, | 201 | .ioctl = rt_ioctl, |
202 | .compat_ioctl = v4l_compat_ioctl32, | ||
202 | .llseek = no_llseek, | 203 | .llseek = no_llseek, |
203 | }; | 204 | }; |
204 | 205 | ||
diff --git a/drivers/media/radio/radio-sf16fmi.c b/drivers/media/radio/radio-sf16fmi.c index 6f03ce4dd7b0..0229f792a059 100644 --- a/drivers/media/radio/radio-sf16fmi.c +++ b/drivers/media/radio/radio-sf16fmi.c | |||
@@ -225,6 +225,7 @@ static struct file_operations fmi_fops = { | |||
225 | .open = video_exclusive_open, | 225 | .open = video_exclusive_open, |
226 | .release = video_exclusive_release, | 226 | .release = video_exclusive_release, |
227 | .ioctl = fmi_ioctl, | 227 | .ioctl = fmi_ioctl, |
228 | .compat_ioctl = v4l_compat_ioctl32, | ||
228 | .llseek = no_llseek, | 229 | .llseek = no_llseek, |
229 | }; | 230 | }; |
230 | 231 | ||
diff --git a/drivers/media/radio/radio-sf16fmr2.c b/drivers/media/radio/radio-sf16fmr2.c index 71971e9bb342..26632cead09a 100644 --- a/drivers/media/radio/radio-sf16fmr2.c +++ b/drivers/media/radio/radio-sf16fmr2.c | |||
@@ -356,6 +356,7 @@ static struct file_operations fmr2_fops = { | |||
356 | .open = video_exclusive_open, | 356 | .open = video_exclusive_open, |
357 | .release = video_exclusive_release, | 357 | .release = video_exclusive_release, |
358 | .ioctl = fmr2_ioctl, | 358 | .ioctl = fmr2_ioctl, |
359 | .compat_ioctl = v4l_compat_ioctl32, | ||
359 | .llseek = no_llseek, | 360 | .llseek = no_llseek, |
360 | }; | 361 | }; |
361 | 362 | ||
diff --git a/drivers/media/radio/radio-terratec.c b/drivers/media/radio/radio-terratec.c index b03573c6840e..fcfde2e4f195 100644 --- a/drivers/media/radio/radio-terratec.c +++ b/drivers/media/radio/radio-terratec.c | |||
@@ -276,6 +276,7 @@ static struct file_operations terratec_fops = { | |||
276 | .open = video_exclusive_open, | 276 | .open = video_exclusive_open, |
277 | .release = video_exclusive_release, | 277 | .release = video_exclusive_release, |
278 | .ioctl = tt_ioctl, | 278 | .ioctl = tt_ioctl, |
279 | .compat_ioctl = v4l_compat_ioctl32, | ||
279 | .llseek = no_llseek, | 280 | .llseek = no_llseek, |
280 | }; | 281 | }; |
281 | 282 | ||
diff --git a/drivers/media/radio/radio-trust.c b/drivers/media/radio/radio-trust.c index b300bedf7c74..5a099a50d4d0 100644 --- a/drivers/media/radio/radio-trust.c +++ b/drivers/media/radio/radio-trust.c | |||
@@ -255,6 +255,7 @@ static struct file_operations trust_fops = { | |||
255 | .open = video_exclusive_open, | 255 | .open = video_exclusive_open, |
256 | .release = video_exclusive_release, | 256 | .release = video_exclusive_release, |
257 | .ioctl = tr_ioctl, | 257 | .ioctl = tr_ioctl, |
258 | .compat_ioctl = v4l_compat_ioctl32, | ||
258 | .llseek = no_llseek, | 259 | .llseek = no_llseek, |
259 | }; | 260 | }; |
260 | 261 | ||
diff --git a/drivers/media/radio/radio-typhoon.c b/drivers/media/radio/radio-typhoon.c index f304f3c14763..8ac9a8ef9094 100644 --- a/drivers/media/radio/radio-typhoon.c +++ b/drivers/media/radio/radio-typhoon.c | |||
@@ -261,6 +261,7 @@ static struct file_operations typhoon_fops = { | |||
261 | .open = video_exclusive_open, | 261 | .open = video_exclusive_open, |
262 | .release = video_exclusive_release, | 262 | .release = video_exclusive_release, |
263 | .ioctl = typhoon_ioctl, | 263 | .ioctl = typhoon_ioctl, |
264 | .compat_ioctl = v4l_compat_ioctl32, | ||
264 | .llseek = no_llseek, | 265 | .llseek = no_llseek, |
265 | }; | 266 | }; |
266 | 267 | ||
diff --git a/drivers/media/radio/radio-zoltrix.c b/drivers/media/radio/radio-zoltrix.c index 4c6d6fb49034..d590e80c922e 100644 --- a/drivers/media/radio/radio-zoltrix.c +++ b/drivers/media/radio/radio-zoltrix.c | |||
@@ -313,6 +313,7 @@ static struct file_operations zoltrix_fops = | |||
313 | .open = video_exclusive_open, | 313 | .open = video_exclusive_open, |
314 | .release = video_exclusive_release, | 314 | .release = video_exclusive_release, |
315 | .ioctl = zol_ioctl, | 315 | .ioctl = zol_ioctl, |
316 | .compat_ioctl = v4l_compat_ioctl32, | ||
316 | .llseek = no_llseek, | 317 | .llseek = no_llseek, |
317 | }; | 318 | }; |
318 | 319 | ||
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index 82060f9909d8..618a08ab940a 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile | |||
@@ -8,7 +8,8 @@ zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o | |||
8 | zr36067-objs := zoran_procfs.o zoran_device.o \ | 8 | zr36067-objs := zoran_procfs.o zoran_device.o \ |
9 | zoran_driver.o zoran_card.o | 9 | zoran_driver.o zoran_card.o |
10 | tuner-objs := tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o | 10 | tuner-objs := tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o |
11 | obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o | 11 | |
12 | obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o compat_ioctl32.o | ||
12 | 13 | ||
13 | obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \ | 14 | obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \ |
14 | tda7432.o tda9875.o ir-kbd-i2c.o ir-kbd-gpio.o | 15 | tda7432.o tda9875.o ir-kbd-i2c.o ir-kbd-gpio.o |
diff --git a/drivers/media/video/arv.c b/drivers/media/video/arv.c index 881cdcb1875d..7d5a068353f2 100644 --- a/drivers/media/video/arv.c +++ b/drivers/media/video/arv.c | |||
@@ -749,6 +749,7 @@ static struct file_operations ar_fops = { | |||
749 | .release = video_exclusive_release, | 749 | .release = video_exclusive_release, |
750 | .read = ar_read, | 750 | .read = ar_read, |
751 | .ioctl = ar_ioctl, | 751 | .ioctl = ar_ioctl, |
752 | .compat_ioctl = v4l_compat_ioctl32, | ||
752 | .llseek = no_llseek, | 753 | .llseek = no_llseek, |
753 | }; | 754 | }; |
754 | 755 | ||
diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c index 1ddf9ba613ef..03f925724ce9 100644 --- a/drivers/media/video/bttv-driver.c +++ b/drivers/media/video/bttv-driver.c | |||
@@ -3120,6 +3120,7 @@ static struct file_operations bttv_fops = | |||
3120 | .open = bttv_open, | 3120 | .open = bttv_open, |
3121 | .release = bttv_release, | 3121 | .release = bttv_release, |
3122 | .ioctl = bttv_ioctl, | 3122 | .ioctl = bttv_ioctl, |
3123 | .compat_ioctl = v4l_compat_ioctl32, | ||
3123 | .llseek = no_llseek, | 3124 | .llseek = no_llseek, |
3124 | .read = bttv_read, | 3125 | .read = bttv_read, |
3125 | .mmap = bttv_mmap, | 3126 | .mmap = bttv_mmap, |
diff --git a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c index 0065d0c240d1..6bad93ef969f 100644 --- a/drivers/media/video/bw-qcam.c +++ b/drivers/media/video/bw-qcam.c | |||
@@ -875,6 +875,7 @@ static struct file_operations qcam_fops = { | |||
875 | .open = video_exclusive_open, | 875 | .open = video_exclusive_open, |
876 | .release = video_exclusive_release, | 876 | .release = video_exclusive_release, |
877 | .ioctl = qcam_ioctl, | 877 | .ioctl = qcam_ioctl, |
878 | .compat_ioctl = v4l_compat_ioctl32, | ||
878 | .read = qcam_read, | 879 | .read = qcam_read, |
879 | .llseek = no_llseek, | 880 | .llseek = no_llseek, |
880 | }; | 881 | }; |
diff --git a/drivers/media/video/c-qcam.c b/drivers/media/video/c-qcam.c index 75442ec49f35..9976db4f6da8 100644 --- a/drivers/media/video/c-qcam.c +++ b/drivers/media/video/c-qcam.c | |||
@@ -687,6 +687,7 @@ static struct file_operations qcam_fops = { | |||
687 | .open = video_exclusive_open, | 687 | .open = video_exclusive_open, |
688 | .release = video_exclusive_release, | 688 | .release = video_exclusive_release, |
689 | .ioctl = qcam_ioctl, | 689 | .ioctl = qcam_ioctl, |
690 | .compat_ioctl = v4l_compat_ioctl32, | ||
690 | .read = qcam_read, | 691 | .read = qcam_read, |
691 | .llseek = no_llseek, | 692 | .llseek = no_llseek, |
692 | }; | 693 | }; |
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c new file mode 100644 index 000000000000..42dc11c63c0d --- /dev/null +++ b/drivers/media/video/compat_ioctl32.c | |||
@@ -0,0 +1,318 @@ | |||
1 | #include <linux/config.h> | ||
2 | #include <linux/compat.h> | ||
3 | #include <linux/videodev.h> | ||
4 | |||
5 | #ifdef CONFIG_COMPAT | ||
6 | struct video_tuner32 { | ||
7 | compat_int_t tuner; | ||
8 | char name[32]; | ||
9 | compat_ulong_t rangelow, rangehigh; | ||
10 | u32 flags; /* It is really u32 in videodev.h */ | ||
11 | u16 mode, signal; | ||
12 | }; | ||
13 | |||
14 | static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
15 | { | ||
16 | int i; | ||
17 | |||
18 | if(get_user(kp->tuner, &up->tuner)) | ||
19 | return -EFAULT; | ||
20 | for(i = 0; i < 32; i++) | ||
21 | __get_user(kp->name[i], &up->name[i]); | ||
22 | __get_user(kp->rangelow, &up->rangelow); | ||
23 | __get_user(kp->rangehigh, &up->rangehigh); | ||
24 | __get_user(kp->flags, &up->flags); | ||
25 | __get_user(kp->mode, &up->mode); | ||
26 | __get_user(kp->signal, &up->signal); | ||
27 | return 0; | ||
28 | } | ||
29 | |||
30 | static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
31 | { | ||
32 | int i; | ||
33 | |||
34 | if(put_user(kp->tuner, &up->tuner)) | ||
35 | return -EFAULT; | ||
36 | for(i = 0; i < 32; i++) | ||
37 | __put_user(kp->name[i], &up->name[i]); | ||
38 | __put_user(kp->rangelow, &up->rangelow); | ||
39 | __put_user(kp->rangehigh, &up->rangehigh); | ||
40 | __put_user(kp->flags, &up->flags); | ||
41 | __put_user(kp->mode, &up->mode); | ||
42 | __put_user(kp->signal, &up->signal); | ||
43 | return 0; | ||
44 | } | ||
45 | |||
46 | struct video_buffer32 { | ||
47 | compat_caddr_t base; | ||
48 | compat_int_t height, width, depth, bytesperline; | ||
49 | }; | ||
50 | |||
51 | static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
52 | { | ||
53 | u32 tmp; | ||
54 | |||
55 | if (get_user(tmp, &up->base)) | ||
56 | return -EFAULT; | ||
57 | |||
58 | /* This is actually a physical address stored | ||
59 | * as a void pointer. | ||
60 | */ | ||
61 | kp->base = (void *)(unsigned long) tmp; | ||
62 | |||
63 | __get_user(kp->height, &up->height); | ||
64 | __get_user(kp->width, &up->width); | ||
65 | __get_user(kp->depth, &up->depth); | ||
66 | __get_user(kp->bytesperline, &up->bytesperline); | ||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
71 | { | ||
72 | u32 tmp = (u32)((unsigned long)kp->base); | ||
73 | |||
74 | if(put_user(tmp, &up->base)) | ||
75 | return -EFAULT; | ||
76 | __put_user(kp->height, &up->height); | ||
77 | __put_user(kp->width, &up->width); | ||
78 | __put_user(kp->depth, &up->depth); | ||
79 | __put_user(kp->bytesperline, &up->bytesperline); | ||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | struct video_clip32 { | ||
84 | s32 x, y, width, height; /* Its really s32 in videodev.h */ | ||
85 | compat_caddr_t next; | ||
86 | }; | ||
87 | |||
88 | struct video_window32 { | ||
89 | u32 x, y, width, height, chromakey, flags; | ||
90 | compat_caddr_t clips; | ||
91 | compat_int_t clipcount; | ||
92 | }; | ||
93 | |||
94 | static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
95 | { | ||
96 | int ret = -ENOIOCTLCMD; | ||
97 | |||
98 | if (file->f_ops->unlocked_ioctl) | ||
99 | ret = file->f_ops->unlocked_ioctl(file, cmd, arg); | ||
100 | else if (file->f_ops->ioctl) { | ||
101 | lock_kernel(); | ||
102 | ret = file->f_ops->ioctl(file->f_dentry->d_inode, file, cmd, arg); | ||
103 | unlock_kernel(); | ||
104 | } | ||
105 | |||
106 | return ret; | ||
107 | } | ||
108 | |||
109 | |||
110 | /* You get back everything except the clips... */ | ||
111 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) | ||
112 | { | ||
113 | if(put_user(kp->x, &up->x)) | ||
114 | return -EFAULT; | ||
115 | __put_user(kp->y, &up->y); | ||
116 | __put_user(kp->width, &up->width); | ||
117 | __put_user(kp->height, &up->height); | ||
118 | __put_user(kp->chromakey, &up->chromakey); | ||
119 | __put_user(kp->flags, &up->flags); | ||
120 | __put_user(kp->clipcount, &up->clipcount); | ||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | ||
125 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | ||
126 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | ||
127 | #define VIDIOCSWIN32 _IOW('v',10, struct video_window32) | ||
128 | #define VIDIOCGFBUF32 _IOR('v',11, struct video_buffer32) | ||
129 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | ||
130 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | ||
131 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | ||
132 | |||
133 | enum { | ||
134 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) | ||
135 | }; | ||
136 | |||
137 | static int do_set_window(struct file *file, unsigned int cmd, unsigned long arg) | ||
138 | { | ||
139 | struct video_window32 __user *up = compat_ptr(arg); | ||
140 | struct video_window __user *vw; | ||
141 | struct video_clip __user *p; | ||
142 | int nclips; | ||
143 | u32 n; | ||
144 | |||
145 | if (get_user(nclips, &up->clipcount)) | ||
146 | return -EFAULT; | ||
147 | |||
148 | /* Peculiar interface... */ | ||
149 | if (nclips < 0) | ||
150 | nclips = VIDEO_CLIPMAP_SIZE; | ||
151 | |||
152 | if (nclips > MaxClips) | ||
153 | return -ENOMEM; | ||
154 | |||
155 | vw = compat_alloc_user_space(sizeof(struct video_window) + | ||
156 | nclips * sizeof(struct video_clip)); | ||
157 | |||
158 | p = nclips ? (struct video_clip __user *)(vw + 1) : NULL; | ||
159 | |||
160 | if (get_user(n, &up->x) || put_user(n, &vw->x) || | ||
161 | get_user(n, &up->y) || put_user(n, &vw->y) || | ||
162 | get_user(n, &up->width) || put_user(n, &vw->width) || | ||
163 | get_user(n, &up->height) || put_user(n, &vw->height) || | ||
164 | get_user(n, &up->chromakey) || put_user(n, &vw->chromakey) || | ||
165 | get_user(n, &up->flags) || put_user(n, &vw->flags) || | ||
166 | get_user(n, &up->clipcount) || put_user(n, &vw->clipcount) || | ||
167 | get_user(n, &up->clips) || put_user(p, &vw->clips)) | ||
168 | return -EFAULT; | ||
169 | |||
170 | if (nclips) { | ||
171 | struct video_clip32 __user *u = compat_ptr(n); | ||
172 | int i; | ||
173 | if (!u) | ||
174 | return -EINVAL; | ||
175 | for (i = 0; i < nclips; i++, u++, p++) { | ||
176 | s32 v; | ||
177 | if (get_user(v, &u->x) || | ||
178 | put_user(v, &p->x) || | ||
179 | get_user(v, &u->y) || | ||
180 | put_user(v, &p->y) || | ||
181 | get_user(v, &u->width) || | ||
182 | put_user(v, &p->width) || | ||
183 | get_user(v, &u->height) || | ||
184 | put_user(v, &p->height) || | ||
185 | put_user(NULL, &p->next)) | ||
186 | return -EFAULT; | ||
187 | } | ||
188 | } | ||
189 | |||
190 | return native_ioctl(file, VIDIOCSWIN, (unsigned long)p); | ||
191 | } | ||
192 | |||
193 | static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
194 | { | ||
195 | union { | ||
196 | struct video_tuner vt; | ||
197 | struct video_buffer vb; | ||
198 | struct video_window vw; | ||
199 | unsigned long vx; | ||
200 | } karg; | ||
201 | mm_segment_t old_fs = get_fs(); | ||
202 | void __user *up = compat_ptr(arg); | ||
203 | int err = 0; | ||
204 | |||
205 | /* First, convert the command. */ | ||
206 | switch(cmd) { | ||
207 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; | ||
208 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; | ||
209 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; | ||
210 | case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break; | ||
211 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; | ||
212 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; | ||
213 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; | ||
214 | }; | ||
215 | |||
216 | switch(cmd) { | ||
217 | case VIDIOCSTUNER: | ||
218 | case VIDIOCGTUNER: | ||
219 | err = get_video_tuner32(&karg.vt, up); | ||
220 | break; | ||
221 | |||
222 | case VIDIOCSFBUF: | ||
223 | err = get_video_buffer32(&karg.vb, up); | ||
224 | break; | ||
225 | |||
226 | case VIDIOCSFREQ: | ||
227 | err = get_user(karg.vx, (u32 __user *)up); | ||
228 | break; | ||
229 | }; | ||
230 | if(err) | ||
231 | goto out; | ||
232 | |||
233 | set_fs(KERNEL_DS); | ||
234 | err = native_ioctl(file, cmd, (unsigned long)&karg); | ||
235 | set_fs(old_fs); | ||
236 | |||
237 | if(err == 0) { | ||
238 | switch(cmd) { | ||
239 | case VIDIOCGTUNER: | ||
240 | err = put_video_tuner32(&karg.vt, up); | ||
241 | break; | ||
242 | |||
243 | case VIDIOCGWIN: | ||
244 | err = put_video_window32(&karg.vw, up); | ||
245 | break; | ||
246 | |||
247 | case VIDIOCGFBUF: | ||
248 | err = put_video_buffer32(&karg.vb, up); | ||
249 | break; | ||
250 | |||
251 | case VIDIOCGFREQ: | ||
252 | err = put_user(((u32)karg.vx), (u32 __user *)up); | ||
253 | break; | ||
254 | }; | ||
255 | } | ||
256 | out: | ||
257 | return err; | ||
258 | } | ||
259 | |||
260 | long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | ||
261 | { | ||
262 | int ret = -ENOIOCTLCMD; | ||
263 | |||
264 | if (!file->f_ops->ioctl) | ||
265 | return ret; | ||
266 | |||
267 | switch (cmd) { | ||
268 | case VIDIOCSWIN32: | ||
269 | ret = do_set_window(file, cmd, arg); | ||
270 | break; | ||
271 | case VIDIOCGTUNER32: | ||
272 | case VIDIOCSTUNER32: | ||
273 | case VIDIOCGWIN32: | ||
274 | case VIDIOCGFBUF32: | ||
275 | case VIDIOCSFBUF32: | ||
276 | case VIDIOCGFREQ32: | ||
277 | case VIDIOCSFREQ32 | ||
278 | ret = do_video_ioctl(file, cmd, arg); | ||
279 | break; | ||
280 | |||
281 | /* Little v, the video4linux ioctls (conflict?) */ | ||
282 | case VIDIOCGCAP: | ||
283 | case VIDIOCGCHAN: | ||
284 | case VIDIOCSCHAN: | ||
285 | case VIDIOCGPICT: | ||
286 | case VIDIOCSPICT: | ||
287 | case VIDIOCCAPTURE: | ||
288 | case VIDIOCKEY: | ||
289 | case VIDIOCGAUDIO: | ||
290 | case VIDIOCSAUDIO: | ||
291 | case VIDIOCSYNC: | ||
292 | case VIDIOCMCAPTURE: | ||
293 | case VIDIOCGMBUF: | ||
294 | case VIDIOCGUNIT: | ||
295 | case VIDIOCGCAPTURE: | ||
296 | case VIDIOCSCAPTURE: | ||
297 | |||
298 | /* BTTV specific... */ | ||
299 | case _IOW('v', BASE_VIDIOCPRIVATE+0, char [256]): | ||
300 | case _IOR('v', BASE_VIDIOCPRIVATE+1, char [256]): | ||
301 | case _IOR('v' , BASE_VIDIOCPRIVATE+2, unsigned int): | ||
302 | case _IOW('v' , BASE_VIDIOCPRIVATE+3, char [16]): /* struct bttv_pll_info */ | ||
303 | case _IOR('v' , BASE_VIDIOCPRIVATE+4, int): | ||
304 | case _IOR('v' , BASE_VIDIOCPRIVATE+5, int): | ||
305 | case _IOR('v' , BASE_VIDIOCPRIVATE+6, int): | ||
306 | case _IOR('v' , BASE_VIDIOCPRIVATE+7, int): | ||
307 | ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); | ||
308 | break; | ||
309 | |||
310 | return ret; | ||
311 | } | ||
312 | #else | ||
313 | long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | ||
314 | { | ||
315 | return -ENOIOCTLCMD; | ||
316 | } | ||
317 | #endif | ||
318 | EXPORT_SYMBOL_GPL(v4l_compat_ioctl32); | ||
diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c index b7ec9bf45085..9f59541155d9 100644 --- a/drivers/media/video/cpia.c +++ b/drivers/media/video/cpia.c | |||
@@ -3807,6 +3807,7 @@ static struct file_operations cpia_fops = { | |||
3807 | .read = cpia_read, | 3807 | .read = cpia_read, |
3808 | .mmap = cpia_mmap, | 3808 | .mmap = cpia_mmap, |
3809 | .ioctl = cpia_ioctl, | 3809 | .ioctl = cpia_ioctl, |
3810 | .compat_ioctl = v4l_compat_ioctl32, | ||
3810 | .llseek = no_llseek, | 3811 | .llseek = no_llseek, |
3811 | }; | 3812 | }; |
3812 | 3813 | ||
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 24a48f8a48c1..bc025c46aedf 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
@@ -1740,6 +1740,7 @@ static struct file_operations video_fops = | |||
1740 | .poll = video_poll, | 1740 | .poll = video_poll, |
1741 | .mmap = video_mmap, | 1741 | .mmap = video_mmap, |
1742 | .ioctl = video_ioctl, | 1742 | .ioctl = video_ioctl, |
1743 | .compat_ioctl = v4l_compat_ioctl32, | ||
1743 | .llseek = no_llseek, | 1744 | .llseek = no_llseek, |
1744 | }; | 1745 | }; |
1745 | 1746 | ||
@@ -1767,6 +1768,7 @@ static struct file_operations radio_fops = | |||
1767 | .open = video_open, | 1768 | .open = video_open, |
1768 | .release = video_release, | 1769 | .release = video_release, |
1769 | .ioctl = radio_ioctl, | 1770 | .ioctl = radio_ioctl, |
1771 | .compat_ioctl = v4l_compat_ioctl32, | ||
1770 | .llseek = no_llseek, | 1772 | .llseek = no_llseek, |
1771 | }; | 1773 | }; |
1772 | 1774 | ||
diff --git a/drivers/media/video/meye.c b/drivers/media/video/meye.c index 3f2a882bc20a..2869464aee0d 100644 --- a/drivers/media/video/meye.c +++ b/drivers/media/video/meye.c | |||
@@ -1754,6 +1754,7 @@ static struct file_operations meye_fops = { | |||
1754 | .release = meye_release, | 1754 | .release = meye_release, |
1755 | .mmap = meye_mmap, | 1755 | .mmap = meye_mmap, |
1756 | .ioctl = meye_ioctl, | 1756 | .ioctl = meye_ioctl, |
1757 | .compat_ioctl = v4l_compat_ioctl32, | ||
1757 | .poll = meye_poll, | 1758 | .poll = meye_poll, |
1758 | .llseek = no_llseek, | 1759 | .llseek = no_llseek, |
1759 | }; | 1760 | }; |
diff --git a/drivers/media/video/pms.c b/drivers/media/video/pms.c index 2504207b2e3d..9e6448639480 100644 --- a/drivers/media/video/pms.c +++ b/drivers/media/video/pms.c | |||
@@ -883,6 +883,7 @@ static struct file_operations pms_fops = { | |||
883 | .open = video_exclusive_open, | 883 | .open = video_exclusive_open, |
884 | .release = video_exclusive_release, | 884 | .release = video_exclusive_release, |
885 | .ioctl = pms_ioctl, | 885 | .ioctl = pms_ioctl, |
886 | .compat_ioctl = v4l_compat_ioctl32, | ||
886 | .read = pms_read, | 887 | .read = pms_read, |
887 | .llseek = no_llseek, | 888 | .llseek = no_llseek, |
888 | }; | 889 | }; |
diff --git a/drivers/media/video/saa5249.c b/drivers/media/video/saa5249.c index a51c7bd96618..73b4f0e2abf0 100644 --- a/drivers/media/video/saa5249.c +++ b/drivers/media/video/saa5249.c | |||
@@ -702,6 +702,7 @@ static struct file_operations saa_fops = { | |||
702 | .open = saa5249_open, | 702 | .open = saa5249_open, |
703 | .release = saa5249_release, | 703 | .release = saa5249_release, |
704 | .ioctl = saa5249_ioctl, | 704 | .ioctl = saa5249_ioctl, |
705 | .compat_ioctl = v4l_compat_ioctl32, | ||
705 | .llseek = no_llseek, | 706 | .llseek = no_llseek, |
706 | }; | 707 | }; |
707 | 708 | ||
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index 45c852df13ed..9b9e1e7f05ef 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -2262,6 +2262,7 @@ static struct file_operations video_fops = | |||
2262 | .poll = video_poll, | 2262 | .poll = video_poll, |
2263 | .mmap = video_mmap, | 2263 | .mmap = video_mmap, |
2264 | .ioctl = video_ioctl, | 2264 | .ioctl = video_ioctl, |
2265 | .compat_ioctl = v4l_compat_ioctl32, | ||
2265 | .llseek = no_llseek, | 2266 | .llseek = no_llseek, |
2266 | }; | 2267 | }; |
2267 | 2268 | ||
@@ -2271,6 +2272,7 @@ static struct file_operations radio_fops = | |||
2271 | .open = video_open, | 2272 | .open = video_open, |
2272 | .release = video_release, | 2273 | .release = video_release, |
2273 | .ioctl = radio_ioctl, | 2274 | .ioctl = radio_ioctl, |
2275 | .compat_ioctl = v4l_compat_ioctl32, | ||
2274 | .llseek = no_llseek, | 2276 | .llseek = no_llseek, |
2275 | }; | 2277 | }; |
2276 | 2278 | ||
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index d4497dbae05c..6ee54a45411f 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c | |||
@@ -1974,6 +1974,7 @@ static struct file_operations saa_fops = | |||
1974 | .open = saa_open, | 1974 | .open = saa_open, |
1975 | .release = saa_release, | 1975 | .release = saa_release, |
1976 | .ioctl = saa_ioctl, | 1976 | .ioctl = saa_ioctl, |
1977 | .compat_ioctl = v4l_compat_ioctl32, | ||
1977 | .read = saa_read, | 1978 | .read = saa_read, |
1978 | .llseek = no_llseek, | 1979 | .llseek = no_llseek, |
1979 | .write = saa_write, | 1980 | .write = saa_write, |
diff --git a/drivers/media/video/w9966.c b/drivers/media/video/w9966.c index c318ba32fbaf..b7b0afffd214 100644 --- a/drivers/media/video/w9966.c +++ b/drivers/media/video/w9966.c | |||
@@ -187,6 +187,7 @@ static struct file_operations w9966_fops = { | |||
187 | .open = video_exclusive_open, | 187 | .open = video_exclusive_open, |
188 | .release = video_exclusive_release, | 188 | .release = video_exclusive_release, |
189 | .ioctl = w9966_v4l_ioctl, | 189 | .ioctl = w9966_v4l_ioctl, |
190 | .compat_ioctl = v4l_compat_ioctl32, | ||
190 | .read = w9966_v4l_read, | 191 | .read = w9966_v4l_read, |
191 | .llseek = no_llseek, | 192 | .llseek = no_llseek, |
192 | }; | 193 | }; |
diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c index 4034f1b45366..15283f44e79f 100644 --- a/drivers/media/video/zoran_driver.c +++ b/drivers/media/video/zoran_driver.c | |||
@@ -4678,6 +4678,7 @@ static struct file_operations zoran_fops = { | |||
4678 | .open = zoran_open, | 4678 | .open = zoran_open, |
4679 | .release = zoran_close, | 4679 | .release = zoran_close, |
4680 | .ioctl = zoran_ioctl, | 4680 | .ioctl = zoran_ioctl, |
4681 | .compat_ioctl = v4l_compat_ioctl32, | ||
4681 | .llseek = no_llseek, | 4682 | .llseek = no_llseek, |
4682 | .read = zoran_read, | 4683 | .read = zoran_read, |
4683 | .write = zoran_write, | 4684 | .write = zoran_write, |
diff --git a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c index 07286816d7df..d4c633b8a7f5 100644 --- a/drivers/media/video/zr36120.c +++ b/drivers/media/video/zr36120.c | |||
@@ -1490,6 +1490,7 @@ static struct video_device zr36120_template= | |||
1490 | .write = zoran_write, | 1490 | .write = zoran_write, |
1491 | .poll = zoran_poll, | 1491 | .poll = zoran_poll, |
1492 | .ioctl = zoran_ioctl, | 1492 | .ioctl = zoran_ioctl, |
1493 | .compat_ioctl = v4l_compat_ioctl32, | ||
1493 | .mmap = zoran_mmap, | 1494 | .mmap = zoran_mmap, |
1494 | .minor = -1, | 1495 | .minor = -1, |
1495 | }; | 1496 | }; |
diff --git a/drivers/usb/media/dsbr100.c b/drivers/usb/media/dsbr100.c index 6a5700e9d428..25646804d5be 100644 --- a/drivers/usb/media/dsbr100.c +++ b/drivers/usb/media/dsbr100.c | |||
@@ -127,6 +127,7 @@ static struct file_operations usb_dsbr100_fops = { | |||
127 | .open = usb_dsbr100_open, | 127 | .open = usb_dsbr100_open, |
128 | .release = usb_dsbr100_close, | 128 | .release = usb_dsbr100_close, |
129 | .ioctl = usb_dsbr100_ioctl, | 129 | .ioctl = usb_dsbr100_ioctl, |
130 | .compat_ioctl = v4l_compat_ioctl32, | ||
130 | .llseek = no_llseek, | 131 | .llseek = no_llseek, |
131 | }; | 132 | }; |
132 | 133 | ||
diff --git a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c index 3a0e8ce67ebe..8af665bbe330 100644 --- a/drivers/usb/media/ov511.c +++ b/drivers/usb/media/ov511.c | |||
@@ -4774,6 +4774,7 @@ static struct file_operations ov511_fops = { | |||
4774 | .read = ov51x_v4l1_read, | 4774 | .read = ov51x_v4l1_read, |
4775 | .mmap = ov51x_v4l1_mmap, | 4775 | .mmap = ov51x_v4l1_mmap, |
4776 | .ioctl = ov51x_v4l1_ioctl, | 4776 | .ioctl = ov51x_v4l1_ioctl, |
4777 | .compat_ioctl = v4l_compat_ioctl32, | ||
4777 | .llseek = no_llseek, | 4778 | .llseek = no_llseek, |
4778 | }; | 4779 | }; |
4779 | 4780 | ||
diff --git a/drivers/usb/media/pwc/pwc-if.c b/drivers/usb/media/pwc/pwc-if.c index 09ca6128ac20..4f9b0dc6fd7b 100644 --- a/drivers/usb/media/pwc/pwc-if.c +++ b/drivers/usb/media/pwc/pwc-if.c | |||
@@ -154,6 +154,7 @@ static struct file_operations pwc_fops = { | |||
154 | .poll = pwc_video_poll, | 154 | .poll = pwc_video_poll, |
155 | .mmap = pwc_video_mmap, | 155 | .mmap = pwc_video_mmap, |
156 | .ioctl = pwc_video_ioctl, | 156 | .ioctl = pwc_video_ioctl, |
157 | .compat_ioctl = v4l_compat_ioctl32, | ||
157 | .llseek = no_llseek, | 158 | .llseek = no_llseek, |
158 | }; | 159 | }; |
159 | static struct video_device pwc_template = { | 160 | static struct video_device pwc_template = { |
diff --git a/drivers/usb/media/se401.c b/drivers/usb/media/se401.c index b2ae29af5940..2ba562285fda 100644 --- a/drivers/usb/media/se401.c +++ b/drivers/usb/media/se401.c | |||
@@ -1193,6 +1193,7 @@ static struct file_operations se401_fops = { | |||
1193 | .read = se401_read, | 1193 | .read = se401_read, |
1194 | .mmap = se401_mmap, | 1194 | .mmap = se401_mmap, |
1195 | .ioctl = se401_ioctl, | 1195 | .ioctl = se401_ioctl, |
1196 | .compat_ioctl = v4l_compat_ioctl32, | ||
1196 | .llseek = no_llseek, | 1197 | .llseek = no_llseek, |
1197 | }; | 1198 | }; |
1198 | static struct video_device se401_template = { | 1199 | static struct video_device se401_template = { |
diff --git a/drivers/usb/media/stv680.c b/drivers/usb/media/stv680.c index 774038b352cd..b497a6a0a206 100644 --- a/drivers/usb/media/stv680.c +++ b/drivers/usb/media/stv680.c | |||
@@ -1343,6 +1343,7 @@ static struct file_operations stv680_fops = { | |||
1343 | .read = stv680_read, | 1343 | .read = stv680_read, |
1344 | .mmap = stv680_mmap, | 1344 | .mmap = stv680_mmap, |
1345 | .ioctl = stv680_ioctl, | 1345 | .ioctl = stv680_ioctl, |
1346 | .compat_ioctl = v4l_compat_ioctl32, | ||
1346 | .llseek = no_llseek, | 1347 | .llseek = no_llseek, |
1347 | }; | 1348 | }; |
1348 | static struct video_device stv680_template = { | 1349 | static struct video_device stv680_template = { |
diff --git a/drivers/usb/media/usbvideo.c b/drivers/usb/media/usbvideo.c index 4bd113325ef9..63a72e550a1b 100644 --- a/drivers/usb/media/usbvideo.c +++ b/drivers/usb/media/usbvideo.c | |||
@@ -953,6 +953,7 @@ static struct file_operations usbvideo_fops = { | |||
953 | .read = usbvideo_v4l_read, | 953 | .read = usbvideo_v4l_read, |
954 | .mmap = usbvideo_v4l_mmap, | 954 | .mmap = usbvideo_v4l_mmap, |
955 | .ioctl = usbvideo_v4l_ioctl, | 955 | .ioctl = usbvideo_v4l_ioctl, |
956 | .compat_ioctl = v4l_compat_ioctl32, | ||
956 | .llseek = no_llseek, | 957 | .llseek = no_llseek, |
957 | }; | 958 | }; |
958 | static const struct video_device usbvideo_template = { | 959 | static const struct video_device usbvideo_template = { |
diff --git a/drivers/usb/media/vicam.c b/drivers/usb/media/vicam.c index 1c73155c8d77..5df144073871 100644 --- a/drivers/usb/media/vicam.c +++ b/drivers/usb/media/vicam.c | |||
@@ -1236,6 +1236,7 @@ static struct file_operations vicam_fops = { | |||
1236 | .read = vicam_read, | 1236 | .read = vicam_read, |
1237 | .mmap = vicam_mmap, | 1237 | .mmap = vicam_mmap, |
1238 | .ioctl = vicam_ioctl, | 1238 | .ioctl = vicam_ioctl, |
1239 | .compat_ioctl = v4l_compat_ioctl32, | ||
1239 | .llseek = no_llseek, | 1240 | .llseek = no_llseek, |
1240 | }; | 1241 | }; |
1241 | 1242 | ||
diff --git a/drivers/usb/media/w9968cf.c b/drivers/usb/media/w9968cf.c index 3605a6f3067b..bff9434c8e55 100644 --- a/drivers/usb/media/w9968cf.c +++ b/drivers/usb/media/w9968cf.c | |||
@@ -3490,6 +3490,7 @@ static struct file_operations w9968cf_fops = { | |||
3490 | .release = w9968cf_release, | 3490 | .release = w9968cf_release, |
3491 | .read = w9968cf_read, | 3491 | .read = w9968cf_read, |
3492 | .ioctl = w9968cf_ioctl, | 3492 | .ioctl = w9968cf_ioctl, |
3493 | .compat_ioctl = v4l_compat_ioctl32, | ||
3493 | .mmap = w9968cf_mmap, | 3494 | .mmap = w9968cf_mmap, |
3494 | .llseek = no_llseek, | 3495 | .llseek = no_llseek, |
3495 | }; | 3496 | }; |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 43a2508ac696..55d9a3a954cf 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
@@ -207,244 +207,6 @@ static int do_ext3_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
207 | return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg)); | 207 | return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg)); |
208 | } | 208 | } |
209 | 209 | ||
210 | struct video_tuner32 { | ||
211 | compat_int_t tuner; | ||
212 | char name[32]; | ||
213 | compat_ulong_t rangelow, rangehigh; | ||
214 | u32 flags; /* It is really u32 in videodev.h */ | ||
215 | u16 mode, signal; | ||
216 | }; | ||
217 | |||
218 | static int get_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
219 | { | ||
220 | int i; | ||
221 | |||
222 | if(get_user(kp->tuner, &up->tuner)) | ||
223 | return -EFAULT; | ||
224 | for(i = 0; i < 32; i++) | ||
225 | __get_user(kp->name[i], &up->name[i]); | ||
226 | __get_user(kp->rangelow, &up->rangelow); | ||
227 | __get_user(kp->rangehigh, &up->rangehigh); | ||
228 | __get_user(kp->flags, &up->flags); | ||
229 | __get_user(kp->mode, &up->mode); | ||
230 | __get_user(kp->signal, &up->signal); | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | static int put_video_tuner32(struct video_tuner *kp, struct video_tuner32 __user *up) | ||
235 | { | ||
236 | int i; | ||
237 | |||
238 | if(put_user(kp->tuner, &up->tuner)) | ||
239 | return -EFAULT; | ||
240 | for(i = 0; i < 32; i++) | ||
241 | __put_user(kp->name[i], &up->name[i]); | ||
242 | __put_user(kp->rangelow, &up->rangelow); | ||
243 | __put_user(kp->rangehigh, &up->rangehigh); | ||
244 | __put_user(kp->flags, &up->flags); | ||
245 | __put_user(kp->mode, &up->mode); | ||
246 | __put_user(kp->signal, &up->signal); | ||
247 | return 0; | ||
248 | } | ||
249 | |||
250 | struct video_buffer32 { | ||
251 | compat_caddr_t base; | ||
252 | compat_int_t height, width, depth, bytesperline; | ||
253 | }; | ||
254 | |||
255 | static int get_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
256 | { | ||
257 | u32 tmp; | ||
258 | |||
259 | if (get_user(tmp, &up->base)) | ||
260 | return -EFAULT; | ||
261 | |||
262 | /* This is actually a physical address stored | ||
263 | * as a void pointer. | ||
264 | */ | ||
265 | kp->base = (void *)(unsigned long) tmp; | ||
266 | |||
267 | __get_user(kp->height, &up->height); | ||
268 | __get_user(kp->width, &up->width); | ||
269 | __get_user(kp->depth, &up->depth); | ||
270 | __get_user(kp->bytesperline, &up->bytesperline); | ||
271 | return 0; | ||
272 | } | ||
273 | |||
274 | static int put_video_buffer32(struct video_buffer *kp, struct video_buffer32 __user *up) | ||
275 | { | ||
276 | u32 tmp = (u32)((unsigned long)kp->base); | ||
277 | |||
278 | if(put_user(tmp, &up->base)) | ||
279 | return -EFAULT; | ||
280 | __put_user(kp->height, &up->height); | ||
281 | __put_user(kp->width, &up->width); | ||
282 | __put_user(kp->depth, &up->depth); | ||
283 | __put_user(kp->bytesperline, &up->bytesperline); | ||
284 | return 0; | ||
285 | } | ||
286 | |||
287 | struct video_clip32 { | ||
288 | s32 x, y, width, height; /* Its really s32 in videodev.h */ | ||
289 | compat_caddr_t next; | ||
290 | }; | ||
291 | |||
292 | struct video_window32 { | ||
293 | u32 x, y, width, height, chromakey, flags; | ||
294 | compat_caddr_t clips; | ||
295 | compat_int_t clipcount; | ||
296 | }; | ||
297 | |||
298 | /* You get back everything except the clips... */ | ||
299 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) | ||
300 | { | ||
301 | if(put_user(kp->x, &up->x)) | ||
302 | return -EFAULT; | ||
303 | __put_user(kp->y, &up->y); | ||
304 | __put_user(kp->width, &up->width); | ||
305 | __put_user(kp->height, &up->height); | ||
306 | __put_user(kp->chromakey, &up->chromakey); | ||
307 | __put_user(kp->flags, &up->flags); | ||
308 | __put_user(kp->clipcount, &up->clipcount); | ||
309 | return 0; | ||
310 | } | ||
311 | |||
312 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | ||
313 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | ||
314 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | ||
315 | #define VIDIOCSWIN32 _IOW('v',10, struct video_window32) | ||
316 | #define VIDIOCGFBUF32 _IOR('v',11, struct video_buffer32) | ||
317 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | ||
318 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | ||
319 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | ||
320 | |||
321 | enum { | ||
322 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) | ||
323 | }; | ||
324 | |||
325 | static int do_set_window(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
326 | { | ||
327 | struct video_window32 __user *up = compat_ptr(arg); | ||
328 | struct video_window __user *vw; | ||
329 | struct video_clip __user *p; | ||
330 | int nclips; | ||
331 | u32 n; | ||
332 | |||
333 | if (get_user(nclips, &up->clipcount)) | ||
334 | return -EFAULT; | ||
335 | |||
336 | /* Peculiar interface... */ | ||
337 | if (nclips < 0) | ||
338 | nclips = VIDEO_CLIPMAP_SIZE; | ||
339 | |||
340 | if (nclips > MaxClips) | ||
341 | return -ENOMEM; | ||
342 | |||
343 | vw = compat_alloc_user_space(sizeof(struct video_window) + | ||
344 | nclips * sizeof(struct video_clip)); | ||
345 | |||
346 | p = nclips ? (struct video_clip __user *)(vw + 1) : NULL; | ||
347 | |||
348 | if (get_user(n, &up->x) || put_user(n, &vw->x) || | ||
349 | get_user(n, &up->y) || put_user(n, &vw->y) || | ||
350 | get_user(n, &up->width) || put_user(n, &vw->width) || | ||
351 | get_user(n, &up->height) || put_user(n, &vw->height) || | ||
352 | get_user(n, &up->chromakey) || put_user(n, &vw->chromakey) || | ||
353 | get_user(n, &up->flags) || put_user(n, &vw->flags) || | ||
354 | get_user(n, &up->clipcount) || put_user(n, &vw->clipcount) || | ||
355 | get_user(n, &up->clips) || put_user(p, &vw->clips)) | ||
356 | return -EFAULT; | ||
357 | |||
358 | if (nclips) { | ||
359 | struct video_clip32 __user *u = compat_ptr(n); | ||
360 | int i; | ||
361 | if (!u) | ||
362 | return -EINVAL; | ||
363 | for (i = 0; i < nclips; i++, u++, p++) { | ||
364 | s32 v; | ||
365 | if (get_user(v, &u->x) || | ||
366 | put_user(v, &p->x) || | ||
367 | get_user(v, &u->y) || | ||
368 | put_user(v, &p->y) || | ||
369 | get_user(v, &u->width) || | ||
370 | put_user(v, &p->width) || | ||
371 | get_user(v, &u->height) || | ||
372 | put_user(v, &p->height) || | ||
373 | put_user(NULL, &p->next)) | ||
374 | return -EFAULT; | ||
375 | } | ||
376 | } | ||
377 | |||
378 | return sys_ioctl(fd, VIDIOCSWIN, (unsigned long)p); | ||
379 | } | ||
380 | |||
381 | static int do_video_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
382 | { | ||
383 | union { | ||
384 | struct video_tuner vt; | ||
385 | struct video_buffer vb; | ||
386 | struct video_window vw; | ||
387 | unsigned long vx; | ||
388 | } karg; | ||
389 | mm_segment_t old_fs = get_fs(); | ||
390 | void __user *up = compat_ptr(arg); | ||
391 | int err = 0; | ||
392 | |||
393 | /* First, convert the command. */ | ||
394 | switch(cmd) { | ||
395 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; | ||
396 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; | ||
397 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; | ||
398 | case VIDIOCGFBUF32: cmd = VIDIOCGFBUF; break; | ||
399 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; | ||
400 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; | ||
401 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; | ||
402 | }; | ||
403 | |||
404 | switch(cmd) { | ||
405 | case VIDIOCSTUNER: | ||
406 | case VIDIOCGTUNER: | ||
407 | err = get_video_tuner32(&karg.vt, up); | ||
408 | break; | ||
409 | |||
410 | case VIDIOCSFBUF: | ||
411 | err = get_video_buffer32(&karg.vb, up); | ||
412 | break; | ||
413 | |||
414 | case VIDIOCSFREQ: | ||
415 | err = get_user(karg.vx, (u32 __user *)up); | ||
416 | break; | ||
417 | }; | ||
418 | if(err) | ||
419 | goto out; | ||
420 | |||
421 | set_fs(KERNEL_DS); | ||
422 | err = sys_ioctl(fd, cmd, (unsigned long)&karg); | ||
423 | set_fs(old_fs); | ||
424 | |||
425 | if(err == 0) { | ||
426 | switch(cmd) { | ||
427 | case VIDIOCGTUNER: | ||
428 | err = put_video_tuner32(&karg.vt, up); | ||
429 | break; | ||
430 | |||
431 | case VIDIOCGWIN: | ||
432 | err = put_video_window32(&karg.vw, up); | ||
433 | break; | ||
434 | |||
435 | case VIDIOCGFBUF: | ||
436 | err = put_video_buffer32(&karg.vb, up); | ||
437 | break; | ||
438 | |||
439 | case VIDIOCGFREQ: | ||
440 | err = put_user(((u32)karg.vx), (u32 __user *)up); | ||
441 | break; | ||
442 | }; | ||
443 | } | ||
444 | out: | ||
445 | return err; | ||
446 | } | ||
447 | |||
448 | struct compat_dmx_event { | 210 | struct compat_dmx_event { |
449 | dmx_event_t event; | 211 | dmx_event_t event; |
450 | compat_time_t timeStamp; | 212 | compat_time_t timeStamp; |
@@ -3015,14 +2777,6 @@ COMPATIBLE_IOCTL(EXT3_IOC_GROUP_ADD) | |||
3015 | #ifdef CONFIG_JBD_DEBUG | 2777 | #ifdef CONFIG_JBD_DEBUG |
3016 | HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl) | 2778 | HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl) |
3017 | #endif | 2779 | #endif |
3018 | HANDLE_IOCTL(VIDIOCGTUNER32, do_video_ioctl) | ||
3019 | HANDLE_IOCTL(VIDIOCSTUNER32, do_video_ioctl) | ||
3020 | HANDLE_IOCTL(VIDIOCGWIN32, do_video_ioctl) | ||
3021 | HANDLE_IOCTL(VIDIOCSWIN32, do_set_window) | ||
3022 | HANDLE_IOCTL(VIDIOCGFBUF32, do_video_ioctl) | ||
3023 | HANDLE_IOCTL(VIDIOCSFBUF32, do_video_ioctl) | ||
3024 | HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl) | ||
3025 | HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl) | ||
3026 | /* One SMB ioctl needs translations. */ | 2780 | /* One SMB ioctl needs translations. */ |
3027 | #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t) | 2781 | #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t) |
3028 | HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid) | 2782 | HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid) |
diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index 119f9d064cc6..339878952f12 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h | |||
@@ -218,32 +218,6 @@ COMPATIBLE_IOCTL(VT_RESIZE) | |||
218 | COMPATIBLE_IOCTL(VT_RESIZEX) | 218 | COMPATIBLE_IOCTL(VT_RESIZEX) |
219 | COMPATIBLE_IOCTL(VT_LOCKSWITCH) | 219 | COMPATIBLE_IOCTL(VT_LOCKSWITCH) |
220 | COMPATIBLE_IOCTL(VT_UNLOCKSWITCH) | 220 | COMPATIBLE_IOCTL(VT_UNLOCKSWITCH) |
221 | /* Little v */ | ||
222 | /* Little v, the video4linux ioctls (conflict?) */ | ||
223 | COMPATIBLE_IOCTL(VIDIOCGCAP) | ||
224 | COMPATIBLE_IOCTL(VIDIOCGCHAN) | ||
225 | COMPATIBLE_IOCTL(VIDIOCSCHAN) | ||
226 | COMPATIBLE_IOCTL(VIDIOCGPICT) | ||
227 | COMPATIBLE_IOCTL(VIDIOCSPICT) | ||
228 | COMPATIBLE_IOCTL(VIDIOCCAPTURE) | ||
229 | COMPATIBLE_IOCTL(VIDIOCKEY) | ||
230 | COMPATIBLE_IOCTL(VIDIOCGAUDIO) | ||
231 | COMPATIBLE_IOCTL(VIDIOCSAUDIO) | ||
232 | COMPATIBLE_IOCTL(VIDIOCSYNC) | ||
233 | COMPATIBLE_IOCTL(VIDIOCMCAPTURE) | ||
234 | COMPATIBLE_IOCTL(VIDIOCGMBUF) | ||
235 | COMPATIBLE_IOCTL(VIDIOCGUNIT) | ||
236 | COMPATIBLE_IOCTL(VIDIOCGCAPTURE) | ||
237 | COMPATIBLE_IOCTL(VIDIOCSCAPTURE) | ||
238 | /* BTTV specific... */ | ||
239 | COMPATIBLE_IOCTL(_IOW('v', BASE_VIDIOCPRIVATE+0, char [256])) | ||
240 | COMPATIBLE_IOCTL(_IOR('v', BASE_VIDIOCPRIVATE+1, char [256])) | ||
241 | COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+2, unsigned int)) | ||
242 | COMPATIBLE_IOCTL(_IOW('v' , BASE_VIDIOCPRIVATE+3, char [16])) /* struct bttv_pll_info */ | ||
243 | COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+4, int)) | ||
244 | COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+5, int)) | ||
245 | COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+6, int)) | ||
246 | COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+7, int)) | ||
247 | /* Little p (/dev/rtc, /dev/envctrl, etc.) */ | 221 | /* Little p (/dev/rtc, /dev/envctrl, etc.) */ |
248 | COMPATIBLE_IOCTL(RTC_AIE_ON) | 222 | COMPATIBLE_IOCTL(RTC_AIE_ON) |
249 | COMPATIBLE_IOCTL(RTC_AIE_OFF) | 223 | COMPATIBLE_IOCTL(RTC_AIE_OFF) |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 1cded681eb6d..13f78ec4bf76 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -1117,6 +1117,9 @@ typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file, | |||
1117 | unsigned int cmd, void *arg); | 1117 | unsigned int cmd, void *arg); |
1118 | int v4l_compat_translate_ioctl(struct inode *inode, struct file *file, | 1118 | int v4l_compat_translate_ioctl(struct inode *inode, struct file *file, |
1119 | int cmd, void *arg, v4l2_kioctl driver_ioctl); | 1119 | int cmd, void *arg, v4l2_kioctl driver_ioctl); |
1120 | /* 32 Bits compatibility layer for 64 bits processors */ | ||
1121 | extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd, | ||
1122 | unsigned long arg); | ||
1120 | 1123 | ||
1121 | #endif /* __KERNEL__ */ | 1124 | #endif /* __KERNEL__ */ |
1122 | #endif /* __LINUX_VIDEODEV2_H */ | 1125 | #endif /* __LINUX_VIDEODEV2_H */ |