aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/compat_ioctl32.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/compat_ioctl32.c')
-rw-r--r--drivers/media/video/compat_ioctl32.c62
1 files changed, 54 insertions, 8 deletions
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c
index 4b14942dd91c..27945e082195 100644
--- a/drivers/media/video/compat_ioctl32.c
+++ b/drivers/media/video/compat_ioctl32.c
@@ -106,11 +106,11 @@ static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
106{ 106{
107 int ret = -ENOIOCTLCMD; 107 int ret = -ENOIOCTLCMD;
108 108
109 if (file->f_ops->unlocked_ioctl) 109 if (file->f_op->unlocked_ioctl)
110 ret = file->f_ops->unlocked_ioctl(file, cmd, arg); 110 ret = file->f_op->unlocked_ioctl(file, cmd, arg);
111 else if (file->f_ops->ioctl) { 111 else if (file->f_op->ioctl) {
112 lock_kernel(); 112 lock_kernel();
113 ret = file->f_ops->ioctl(file->f_dentry->d_inode, file, cmd, arg); 113 ret = file->f_op->ioctl(file->f_dentry->d_inode, file, cmd, arg);
114 unlock_kernel(); 114 unlock_kernel();
115 } 115 }
116 116
@@ -367,6 +367,19 @@ struct v4l2_framebuffer32
367 struct v4l2_pix_format fmt; 367 struct v4l2_pix_format fmt;
368}; 368};
369 369
370static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up)
371{
372 u32 tmp;
373
374 if (get_user(tmp, &up->base))
375 return -EFAULT;
376 kp->base = compat_ptr(tmp);
377 __get_user(kp->capability, &up->capability);
378 __get_user(kp->flags, &up->flags);
379 get_v4l2_pix_format(&kp->fmt, &up->fmt);
380 return 0;
381}
382
370static int put_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up) 383static int put_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up)
371{ 384{
372 u32 tmp = (u32)((unsigned long)kp->base); 385 u32 tmp = (u32)((unsigned long)kp->base);
@@ -404,6 +417,7 @@ struct v4l2_input32 /* identical layout, but different size */
404#define VIDIOC_S_FMT32 _IOWR ('V', 5, struct v4l2_format32) 417#define VIDIOC_S_FMT32 _IOWR ('V', 5, struct v4l2_format32)
405#define VIDIOC_QUERYBUF32 _IOWR ('V', 9, struct v4l2_buffer32) 418#define VIDIOC_QUERYBUF32 _IOWR ('V', 9, struct v4l2_buffer32)
406#define VIDIOC_G_FBUF32 _IOR ('V', 10, struct v4l2_framebuffer32) 419#define VIDIOC_G_FBUF32 _IOR ('V', 10, struct v4l2_framebuffer32)
420#define VIDIOC_S_FBUF32 _IOW ('V', 11, struct v4l2_framebuffer32)
407/* VIDIOC_OVERLAY is now _IOW, but was _IOWR */ 421/* VIDIOC_OVERLAY is now _IOW, but was _IOWR */
408#define VIDIOC_OVERLAY32 _IOWR ('V', 14, compat_int_t) 422#define VIDIOC_OVERLAY32 _IOWR ('V', 14, compat_int_t)
409#define VIDIOC_QBUF32 _IOWR ('V', 15, struct v4l2_buffer32) 423#define VIDIOC_QBUF32 _IOWR ('V', 15, struct v4l2_buffer32)
@@ -511,6 +525,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
511 case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; 525 case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break;
512 case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; 526 case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break;
513 case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break; 527 case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break;
528 case VIDIOC_S_FBUF32: cmd = VIDIOC_S_FBUF; break;
514 case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; 529 case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break;
515 case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break; 530 case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break;
516 case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break; 531 case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break;
@@ -536,10 +551,16 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
536 case VIDIOCSFREQ: 551 case VIDIOCSFREQ:
537 case VIDIOC_S_INPUT: 552 case VIDIOC_S_INPUT:
538 case VIDIOC_OVERLAY: 553 case VIDIOC_OVERLAY:
554 case VIDIOC_STREAMON:
555 case VIDIOC_STREAMOFF:
539 err = get_user(karg.vx, (u32 __user *)up); 556 err = get_user(karg.vx, (u32 __user *)up);
540 compatible_arg = 0; 557 compatible_arg = 0;
541 break; 558 break;
542 }; 559
560 case VIDIOC_S_FBUF:
561 err = get_v4l2_framebuffer32(&karg.v2fb, up);
562 compatible_arg = 0;
563 break;
543 564
544 case VIDIOC_G_FMT: 565 case VIDIOC_G_FMT:
545 case VIDIOC_S_FMT: 566 case VIDIOC_S_FMT:
@@ -566,17 +587,18 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg
566 case VIDIOC_G_FBUF: 587 case VIDIOC_G_FBUF:
567 case VIDIOC_G_INPUT: 588 case VIDIOC_G_INPUT:
568 compatible_arg = 0; 589 compatible_arg = 0;
590 };
569 591
570 if(err) 592 if(err)
571 goto out; 593 goto out;
572 594
573 if(compatible_arg) 595 if(compatible_arg)
574 err = sys_ioctl(fd, cmd, (unsigned long)up); 596 err = native_ioctl(file, cmd, (unsigned long)up);
575 else { 597 else {
576 mm_segment_t old_fs = get_fs(); 598 mm_segment_t old_fs = get_fs();
577 599
578 set_fs(KERNEL_DS); 600 set_fs(KERNEL_DS);
579 err = sys_ioctl(fd, cmd, (unsigned long)&karg); 601 err = native_ioctl(file, cmd, (unsigned long)&karg);
580 set_fs(old_fs); 602 set_fs(old_fs);
581 } 603 }
582 if(err == 0) { 604 if(err == 0) {
@@ -627,7 +649,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
627{ 649{
628 int ret = -ENOIOCTLCMD; 650 int ret = -ENOIOCTLCMD;
629 651
630 if (!file->f_ops->ioctl) 652 if (!file->f_op->ioctl)
631 return ret; 653 return ret;
632 654
633 switch (cmd) { 655 switch (cmd) {
@@ -641,6 +663,30 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
641 case VIDIOCSFBUF32: 663 case VIDIOCSFBUF32:
642 case VIDIOCGFREQ32: 664 case VIDIOCGFREQ32:
643 case VIDIOCSFREQ32: 665 case VIDIOCSFREQ32:
666 case VIDIOC_QUERYCAP:
667 case VIDIOC_ENUM_FMT:
668 case VIDIOC_G_FMT32:
669 case VIDIOC_S_FMT32:
670 case VIDIOC_REQBUFS:
671 case VIDIOC_QUERYBUF32:
672 case VIDIOC_G_FBUF32:
673 case VIDIOC_S_FBUF32:
674 case VIDIOC_OVERLAY32:
675 case VIDIOC_QBUF32:
676 case VIDIOC_DQBUF32:
677 case VIDIOC_STREAMON32:
678 case VIDIOC_STREAMOFF32:
679 case VIDIOC_G_PARM:
680 case VIDIOC_G_STD:
681 case VIDIOC_S_STD:
682 case VIDIOC_ENUMSTD32:
683 case VIDIOC_ENUMINPUT32:
684 case VIDIOC_G_CTRL:
685 case VIDIOC_S_CTRL32:
686 case VIDIOC_QUERYCTRL:
687 case VIDIOC_G_INPUT32:
688 case VIDIOC_S_INPUT32:
689 case VIDIOC_TRY_FMT32:
644 ret = do_video_ioctl(file, cmd, arg); 690 ret = do_video_ioctl(file, cmd, arg);
645 break; 691 break;
646 692