Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Restore binary compatibility with NetBSD 5 binaries that...



details:   https://anonhg.NetBSD.org/src/rev/91b0e79c4c38
branches:  trunk
changeset: 768254:91b0e79c4c38
user:      jakllsch <jakllsch%NetBSD.org@localhost>
date:      Sat Aug 13 02:49:06 2011 +0000

description:
Restore binary compatibility with NetBSD 5 binaries that utilize video(4).

diffstat:

 sys/dev/video.c   |  126 +++++++++++++++++++++++++++++++----------------------
 sys/sys/videoio.h |   29 +++++++-----
 2 files changed, 91 insertions(+), 64 deletions(-)

diffs (294 lines):

diff -r 686325c15e08 -r 91b0e79c4c38 sys/dev/video.c
--- a/sys/dev/video.c   Fri Aug 12 23:40:43 2011 +0000
+++ b/sys/dev/video.c   Sat Aug 13 02:49:06 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: video.c,v 1.26 2010/12/26 23:41:45 jmcneill Exp $ */
+/* $NetBSD: video.c,v 1.27 2011/08/13 02:49:06 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2008 Patrick Mahoney <pat%polycrystal.org@localhost>
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: video.c,v 1.26 2010/12/26 23:41:45 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: video.c,v 1.27 2011/08/13 02:49:06 jakllsch Exp $");
 
 #include "video.h"
 #if NVIDEO > 0
@@ -1781,49 +1781,55 @@
 }
 
 
+/*
+ * Before 64-bit time_t, timeval's tv_sec was 'long'.  Thus on LP64 ports
+ * v4l2_buffer is the same size and layout as before.  However it did change
+ * on LP32 ports, and we thus handle this difference here for "COMPAT_50".
+ */
+
+#ifndef _LP64
 static void
-buf32tobuf(const void *data, struct v4l2_buffer *buf)
+buf50tobuf(const void *data, struct v4l2_buffer *buf)
 {
-       const struct v4l2_buffer32 *b32 = data;
-
-       buf->index = b32->index;
-       buf->type = b32->type;
-       buf->bytesused = b32->bytesused;
-       buf->flags = b32->flags;
-       buf->field = b32->field;
-       buf->timestamp.tv_sec = b32->timestamp.tv_sec;
-       buf->timestamp.tv_usec = b32->timestamp.tv_usec;
-       buf->timecode = b32->timecode;
-       buf->sequence = b32->sequence;
-       buf->memory = b32->memory;
-       buf->m.offset = b32->m.offset;
+       const struct v4l2_buffer50 *b50 = data;
+
+       buf->index = b50->index;
+       buf->type = b50->type;
+       buf->bytesused = b50->bytesused;
+       buf->flags = b50->flags;
+       buf->field = b50->field;
+       timeval50_to_timeval(&b50->timestamp, &buf->timestamp);
+       buf->timecode = b50->timecode;
+       buf->sequence = b50->sequence;
+       buf->memory = b50->memory;
+       buf->m.offset = b50->m.offset;
        /* XXX: Handle userptr */
-       buf->length = b32->length;
-       buf->input = b32->input;
-       buf->reserved = b32->reserved;
+       buf->length = b50->length;
+       buf->input = b50->input;
+       buf->reserved = b50->reserved;
 }
 
 static void
-buftobuf32(void *data, const struct v4l2_buffer *buf)
+buftobuf50(void *data, const struct v4l2_buffer *buf)
 {
-       struct v4l2_buffer32 *b32 = data;
-
-       b32->index = buf->index;
-       b32->type = buf->type;
-       b32->bytesused = buf->bytesused;
-       b32->flags = buf->flags;
-       b32->field = buf->field;
-       b32->timestamp.tv_sec = (uint32_t)buf->timestamp.tv_sec;
-       b32->timestamp.tv_usec = buf->timestamp.tv_usec;
-       b32->timecode = buf->timecode;
-       b32->sequence = buf->sequence;
-       b32->memory = buf->memory;
-       b32->m.offset = buf->m.offset;
+       struct v4l2_buffer50 *b50 = data;
+
+       b50->index = buf->index;
+       b50->type = buf->type;
+       b50->bytesused = buf->bytesused;
+       b50->flags = buf->flags;
+       b50->field = buf->field;
+       timeval_to_timeval50(&buf->timestamp, &b50->timestamp);
+       b50->timecode = buf->timecode;
+       b50->sequence = buf->sequence;
+       b50->memory = buf->memory;
+       b50->m.offset = buf->m.offset;
        /* XXX: Handle userptr */
-       b32->length = buf->length;
-       b32->input = buf->input;
-       b32->reserved = buf->reserved;
+       b50->length = buf->length;
+       b50->input = buf->input;
+       b50->reserved = buf->reserved;
 }
+#endif
 
 int
 videoioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
@@ -1841,10 +1847,14 @@
        struct v4l2_control *control;
        struct v4l2_queryctrl *query;
        struct v4l2_requestbuffers *reqbufs;
-       struct v4l2_buffer *buf, bufspace;
+       struct v4l2_buffer *buf;
        v4l2_std_id *stdid;
        enum v4l2_buf_type *typep;
-       int *ip, error;
+       int *ip;
+#ifndef _LP64
+       struct v4l2_buffer bufspace;
+       int error;
+#endif
 
        sc = device_private(device_lookup(&video_cd, VIDEOUNIT(dev)));
 
@@ -1960,27 +1970,33 @@
        case VIDIOC_QUERYBUF:
                buf = data;
                return video_query_buf(sc, buf);
-       case VIDIOC_QUERYBUF32:
-               buf32tobuf(data, buf = &bufspace);
+#ifndef _LP64
+       case VIDIOC_QUERYBUF50:
+               buf50tobuf(data, buf = &bufspace);
                if ((error = video_query_buf(sc, buf)) != 0)
                        return error;
-               buftobuf32(data, buf);
+               buftobuf50(data, buf);
                return 0;
+#endif
        case VIDIOC_QBUF:
                buf = data;
                return video_queue_buf(sc, buf);
-       case VIDIOC_QBUF32:
-               buf32tobuf(data, buf = &bufspace);
+#ifndef _LP64
+       case VIDIOC_QBUF50:
+               buf50tobuf(data, buf = &bufspace);
                return video_queue_buf(sc, buf);
+#endif
        case VIDIOC_DQBUF:
                buf = data;
                return video_dequeue_buf(sc, buf);
-       case VIDIOC_DQBUF32:
-               buf32tobuf(data, buf = &bufspace);
+#ifndef _LP64
+       case VIDIOC_DQBUF50:
+               buf50tobuf(data, buf = &bufspace);
                if ((error = video_dequeue_buf(sc, buf)) != 0)
                        return error;
-               buftobuf32(data, buf);
+               buftobuf50(data, buf);
                return 0;
+#endif
        case VIDIOC_STREAMON:
                typep = data;
                return video_stream_on(sc, *typep);
@@ -2023,9 +2039,11 @@
        case VIDIOC_QUERYBUF:
                str = "VIDIOC_QUERYBUF";
                break;
-       case VIDIOC_QUERYBUF32:
-               str = "VIDIOC_QUERYBUF32";
+#ifndef _LP64
+       case VIDIOC_QUERYBUF50:
+               str = "VIDIOC_QUERYBUF50";
                break;
+#endif
        case VIDIOC_G_FBUF:
                str = "VIDIOC_G_FBUF";
                break;
@@ -2038,15 +2056,19 @@
        case VIDIOC_QBUF:
                str = "VIDIOC_QBUF";
                break;
-       case VIDIOC_QBUF32:
-               str = "VIDIOC_QBUF32";
+#ifndef _LP64
+       case VIDIOC_QBUF50:
+               str = "VIDIOC_QBUF50";
                break;
+#endif
        case VIDIOC_DQBUF:
                str = "VIDIOC_DQBUF";
                break;
-       case VIDIOC_DQBUF32:
-               str = "VIDIOC_DQBUF32";
+#ifndef _LP64
+       case VIDIOC_DQBUF50:
+               str = "VIDIOC_DQBUF50";
                break;
+#endif
        case VIDIOC_STREAMON:
                str = "VIDIOC_STREAMON";
                break;
diff -r 686325c15e08 -r 91b0e79c4c38 sys/sys/videoio.h
--- a/sys/sys/videoio.h Fri Aug 12 23:40:43 2011 +0000
+++ b/sys/sys/videoio.h Sat Aug 13 02:49:06 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: videoio.h,v 1.7 2009/11/14 10:37:27 njoly Exp $ */
+/* $NetBSD: videoio.h,v 1.8 2011/08/13 02:49:06 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2005, 2008 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -32,6 +32,9 @@
 
 #include <sys/types.h>
 #include <sys/time.h>
+#ifdef _KERNEL
+#include <compat/sys/time.h>
+#endif
 
 #ifndef _KERNEL
 #define __u64  uint64_t
@@ -153,28 +156,27 @@
        uint32_t        reserved;
 };
 
-struct v4l2_buffer32 {
+#ifdef _KERNEL
+struct v4l2_buffer50 {
        uint32_t        index;
        enum v4l2_buf_type type;
        uint32_t        bytesused;
        uint32_t        flags;
        enum v4l2_field field;
-       struct {
-               uint32_t tv_sec;
-               uint32_t tv_usec;
-       } timestamp;
+       struct timeval50 timestamp;
        struct v4l2_timecode timecode;
        uint32_t        sequence;
        enum v4l2_memory memory;
        union {
-               uint32_t offset;
-               uint32_t userptr;
+               uint32_t        offset;
+               unsigned long   userptr;
        } m;
        uint32_t        length;
        uint32_t        input;
        uint32_t        reserved;
 };
 
+#endif
 struct v4l2_rect {
        int32_t         left;
        int32_t         top;
@@ -323,7 +325,7 @@
                struct v4l2_vbi_format vbi;
                uint8_t         raw_data[200];
        } fmt;
-} __packed;
+};
 
 struct v4l2_frequency {
        uint32_t        tuner;
@@ -695,14 +697,11 @@
 /* 6 and 7 are VIDIOC_[SG]_COMP, which are unsupported */
 #define VIDIOC_REQBUFS         _IOWR('V', 8, struct v4l2_requestbuffers)
 #define VIDIOC_QUERYBUF                _IOWR('V', 9, struct v4l2_buffer)
-#define VIDIOC_QUERYBUF32      _IOWR('V', 9, struct v4l2_buffer32)
 #define VIDIOC_G_FBUF          _IOR('V', 10, struct v4l2_framebuffer)
 #define VIDIOC_S_FBUF          _IOW('V', 11, struct v4l2_framebuffer)
 #define VIDIOC_OVERLAY         _IOW('V', 14, int)
 #define VIDIOC_QBUF            _IOWR('V', 15, struct v4l2_buffer)
-#define VIDIOC_QBUF32          _IOWR('V', 15, struct v4l2_buffer32)
 #define VIDIOC_DQBUF           _IOWR('V', 17, struct v4l2_buffer)
-#define VIDIOC_DQBUF32         _IOWR('V', 17, struct v4l2_buffer32)
 #define VIDIOC_STREAMON                _IOW('V', 18, int)
 #define VIDIOC_STREAMOFF       _IOW('V', 19, int)
 #define VIDIOC_G_PARM          _IOWR('V', 21, struct v4l2_streamparm)
@@ -742,4 +741,10 @@
 #define VIDIOC_G_PRIORITY      _IOR('V', 67, enum v4l2_priority)
 #define VIDIOC_S_PRIORITY      _IOW('V', 68, enum v4l2_priority)
 
+#ifdef _KERNEL
+#define VIDIOC_QUERYBUF50      _IOWR('V', 9, struct v4l2_buffer50)
+#define VIDIOC_QBUF50          _IOWR('V', 15, struct v4l2_buffer50)
+#define VIDIOC_DQBUF50         _IOWR('V', 17, struct v4l2_buffer50)
+#endif
+
 #endif /* !_HAVE_SYS_VIDEOIO_H */



Home | Main Index | Thread Index | Old Index