diff options
author | Arnd Bergmann <arnd@arndb.de> | 2006-01-09 12:24:57 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@brturbo.com.br> | 2006-01-09 12:24:57 -0500 |
commit | 0d0fbf8152fb3bb4393be11e8df7f70e1fbbd738 (patch) | |
tree | 98ef8850e6b769da7391665716e4e2348de21ec1 /drivers/media | |
parent | 5367f2d67c7d0bf1faae90e6e7b4e2ac3c9b5e0f (diff) |
V4L (926_2): Moves compat32 functions from fs to v4l subsystem
This moves the 32 bit ioctl compatibility handlers for
Video4Linux into a new file and adds explicit calls to them
to each v4l device driver.
Unfortunately, there does not seem to be any code handling
the v4l2 ioctls, so quite often the code goes through two
separate conversions, first from 32 bit v4l to 64 bit v4l,
and from there to 64 bit v4l2. My patch does not change
that, so there is still much room for improvement.
Also, some drivers have additional ioctl numbers, for
which the conversion should be handled internally to
that driver.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Diffstat (limited to 'drivers/media')
31 files changed, 351 insertions, 1 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 | }; |