diff options
-rw-r--r-- | drivers/media/video/v4l2-compat-ioctl32.c | 37 | ||||
-rw-r--r-- | kernel/compat.c | 1 |
2 files changed, 38 insertions, 0 deletions
diff --git a/drivers/media/video/v4l2-compat-ioctl32.c b/drivers/media/video/v4l2-compat-ioctl32.c index 7c2694738b31..61979b70f388 100644 --- a/drivers/media/video/v4l2-compat-ioctl32.c +++ b/drivers/media/video/v4l2-compat-ioctl32.c | |||
@@ -662,6 +662,32 @@ static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext | |||
662 | return 0; | 662 | return 0; |
663 | } | 663 | } |
664 | 664 | ||
665 | struct v4l2_event32 { | ||
666 | __u32 type; | ||
667 | union { | ||
668 | __u8 data[64]; | ||
669 | } u; | ||
670 | __u32 pending; | ||
671 | __u32 sequence; | ||
672 | struct compat_timespec timestamp; | ||
673 | __u32 id; | ||
674 | __u32 reserved[8]; | ||
675 | }; | ||
676 | |||
677 | static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *up) | ||
678 | { | ||
679 | if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_event32)) || | ||
680 | put_user(kp->type, &up->type) || | ||
681 | copy_to_user(&up->u, &kp->u, sizeof(kp->u)) || | ||
682 | put_user(kp->pending, &up->pending) || | ||
683 | put_user(kp->sequence, &up->sequence) || | ||
684 | put_compat_timespec(&kp->timestamp, &up->timestamp) || | ||
685 | put_user(kp->id, &up->id) || | ||
686 | copy_to_user(up->reserved, kp->reserved, 8 * sizeof(__u32))) | ||
687 | return -EFAULT; | ||
688 | return 0; | ||
689 | } | ||
690 | |||
665 | #define VIDIOC_G_FMT32 _IOWR('V', 4, struct v4l2_format32) | 691 | #define VIDIOC_G_FMT32 _IOWR('V', 4, struct v4l2_format32) |
666 | #define VIDIOC_S_FMT32 _IOWR('V', 5, struct v4l2_format32) | 692 | #define VIDIOC_S_FMT32 _IOWR('V', 5, struct v4l2_format32) |
667 | #define VIDIOC_QUERYBUF32 _IOWR('V', 9, struct v4l2_buffer32) | 693 | #define VIDIOC_QUERYBUF32 _IOWR('V', 9, struct v4l2_buffer32) |
@@ -675,6 +701,7 @@ static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext | |||
675 | #define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) | 701 | #define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) |
676 | #define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) | 702 | #define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) |
677 | #define VIDIOC_TRY_EXT_CTRLS32 _IOWR('V', 73, struct v4l2_ext_controls32) | 703 | #define VIDIOC_TRY_EXT_CTRLS32 _IOWR('V', 73, struct v4l2_ext_controls32) |
704 | #define VIDIOC_DQEVENT32 _IOR ('V', 89, struct v4l2_event32) | ||
678 | 705 | ||
679 | #define VIDIOC_OVERLAY32 _IOW ('V', 14, s32) | 706 | #define VIDIOC_OVERLAY32 _IOW ('V', 14, s32) |
680 | #define VIDIOC_STREAMON32 _IOW ('V', 18, s32) | 707 | #define VIDIOC_STREAMON32 _IOW ('V', 18, s32) |
@@ -693,6 +720,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar | |||
693 | struct v4l2_input v2i; | 720 | struct v4l2_input v2i; |
694 | struct v4l2_standard v2s; | 721 | struct v4l2_standard v2s; |
695 | struct v4l2_ext_controls v2ecs; | 722 | struct v4l2_ext_controls v2ecs; |
723 | struct v4l2_event v2ev; | ||
696 | unsigned long vx; | 724 | unsigned long vx; |
697 | int vi; | 725 | int vi; |
698 | } karg; | 726 | } karg; |
@@ -715,6 +743,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar | |||
715 | case VIDIOC_G_EXT_CTRLS32: cmd = VIDIOC_G_EXT_CTRLS; break; | 743 | case VIDIOC_G_EXT_CTRLS32: cmd = VIDIOC_G_EXT_CTRLS; break; |
716 | case VIDIOC_S_EXT_CTRLS32: cmd = VIDIOC_S_EXT_CTRLS; break; | 744 | case VIDIOC_S_EXT_CTRLS32: cmd = VIDIOC_S_EXT_CTRLS; break; |
717 | case VIDIOC_TRY_EXT_CTRLS32: cmd = VIDIOC_TRY_EXT_CTRLS; break; | 745 | case VIDIOC_TRY_EXT_CTRLS32: cmd = VIDIOC_TRY_EXT_CTRLS; break; |
746 | case VIDIOC_DQEVENT32: cmd = VIDIOC_DQEVENT; break; | ||
718 | case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; | 747 | case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; |
719 | case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; | 748 | case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; |
720 | case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; | 749 | case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; |
@@ -778,6 +807,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar | |||
778 | err = get_v4l2_ext_controls32(&karg.v2ecs, up); | 807 | err = get_v4l2_ext_controls32(&karg.v2ecs, up); |
779 | compatible_arg = 0; | 808 | compatible_arg = 0; |
780 | break; | 809 | break; |
810 | case VIDIOC_DQEVENT: | ||
811 | compatible_arg = 0; | ||
812 | break; | ||
781 | } | 813 | } |
782 | if (err) | 814 | if (err) |
783 | return err; | 815 | return err; |
@@ -818,6 +850,10 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar | |||
818 | err = put_v4l2_framebuffer32(&karg.v2fb, up); | 850 | err = put_v4l2_framebuffer32(&karg.v2fb, up); |
819 | break; | 851 | break; |
820 | 852 | ||
853 | case VIDIOC_DQEVENT: | ||
854 | err = put_v4l2_event32(&karg.v2ev, up); | ||
855 | break; | ||
856 | |||
821 | case VIDIOC_G_FMT: | 857 | case VIDIOC_G_FMT: |
822 | case VIDIOC_S_FMT: | 858 | case VIDIOC_S_FMT: |
823 | case VIDIOC_TRY_FMT: | 859 | case VIDIOC_TRY_FMT: |
@@ -920,6 +956,7 @@ long v4l2_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
920 | case VIDIOC_S_DV_TIMINGS: | 956 | case VIDIOC_S_DV_TIMINGS: |
921 | case VIDIOC_G_DV_TIMINGS: | 957 | case VIDIOC_G_DV_TIMINGS: |
922 | case VIDIOC_DQEVENT: | 958 | case VIDIOC_DQEVENT: |
959 | case VIDIOC_DQEVENT32: | ||
923 | case VIDIOC_SUBSCRIBE_EVENT: | 960 | case VIDIOC_SUBSCRIBE_EVENT: |
924 | case VIDIOC_UNSUBSCRIBE_EVENT: | 961 | case VIDIOC_UNSUBSCRIBE_EVENT: |
925 | ret = do_video_ioctl(file, cmd, arg); | 962 | ret = do_video_ioctl(file, cmd, arg); |
diff --git a/kernel/compat.c b/kernel/compat.c index fc9eb093acd5..d4abc5bcc27c 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -158,6 +158,7 @@ int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user | |||
158 | __put_user(ts->tv_sec, &cts->tv_sec) || | 158 | __put_user(ts->tv_sec, &cts->tv_sec) || |
159 | __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; | 159 | __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0; |
160 | } | 160 | } |
161 | EXPORT_SYMBOL_GPL(put_compat_timespec); | ||
161 | 162 | ||
162 | static long compat_nanosleep_restart(struct restart_block *restart) | 163 | static long compat_nanosleep_restart(struct restart_block *restart) |
163 | { | 164 | { |