• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-
2  * Copyright (c) 2009 Hans Petter Selasky. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  */
25 
26 /*
27  * The following file allows for having the complete V4L stack and
28  * hardware drivers in userland.
29  */
30 
31 #ifndef _LIBV4LSYSCALL_PRIV_H_
32 #define _LIBV4LSYSCALL_PRIV_H_
33 
34 /* Some of these headers are not needed by us, but by linux/videodev2.h,
35    which is broken on some systems and doesn't include them itself :( */
36 
37 #ifdef linux
38 #include <sys/time.h>
39 #include <sys/syscall.h>
40 #include <linux/types.h>
41 #include <linux/ioctl.h>
42 /* On 32 bits archs we always use mmap2, on 64 bits archs there is no mmap2 */
43 #ifdef __NR_mmap2
44 #if !defined(SYS_mmap2)
45 #define	SYS_mmap2 __NR_mmap2
46 #endif
47 #define	MMAP2_PAGE_SHIFT 12
48 #else
49 #define	SYS_mmap2 SYS_mmap
50 #define	MMAP2_PAGE_SHIFT 0
51 #endif
52 #endif
53 
54 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
55 #include <sys/time.h>
56 #include <sys/syscall.h>
57 #include <sys/types.h>
58 #include <sys/ioctl.h>
59 #define	_IOC_NR(cmd) ((cmd) & 0xFF)
60 #define	_IOC_TYPE(cmd) IOCGROUP(cmd)
61 #define	_IOC_SIZE(cmd) IOCPARM_LEN(cmd)
62 #define	MAP_ANONYMOUS MAP_ANON
63 #define	MMAP2_PAGE_SHIFT 0
64 #endif
65 
66 #if defined(__OpenBSD__)
67 #include <sys/syscall.h>
68 #include <sys/types.h>
69 #include <sys/ioctl.h>
70 #define	_IOC_NR(cmd) ((cmd) & 0xFF)
71 #define	_IOC_TYPE(cmd) IOCGROUP(cmd)
72 #define	MMAP2_PAGE_SHIFT 0
73 #endif
74 
75 #undef SYS_OPEN
76 #undef SYS_CLOSE
77 #undef SYS_IOCTL
78 #undef SYS_READ
79 #undef SYS_WRITE
80 #undef SYS_MMAP
81 #undef SYS_MUNMAP
82 
83 #ifndef CONFIG_SYS_WRAPPER
84 
85 #ifdef SYS_openat
86 #define SYS_OPEN(file, oflag, mode) \
87 	syscall(SYS_openat, AT_FDCWD, (const char *)(file), (int)(oflag), (mode_t)(mode))
88 #else
89 #define SYS_OPEN(file, oflag, mode) \
90 	syscall(SYS_open, (const char *)(file), (int)(oflag), (mode_t)(mode))
91 #endif
92 #define SYS_CLOSE(fd) \
93 	syscall(SYS_close, (int)(fd))
94 #define SYS_IOCTL(fd, cmd, arg) \
95 	syscall(SYS_ioctl, (int)(fd), (unsigned long)(cmd), (void *)(arg))
96 #define SYS_READ(fd, buf, len) \
97 	syscall(SYS_read, (int)(fd), (void *)(buf), (size_t)(len));
98 #define SYS_WRITE(fd, buf, len) \
99 	syscall(SYS_write, (int)(fd), (const void *)(buf), (size_t)(len));
100 
101 #if defined(__FreeBSD__)
102 #define SYS_MMAP(addr, len, prot, flags, fd, off) \
103 	__syscall(SYS_mmap, (void *)(addr), (size_t)(len), \
104 			(int)(prot), (int)(flags), (int)(fd), (off_t)(off))
105 #elif defined(__FreeBSD_kernel__)
106 #define SYS_MMAP(addr, len, prot, flags, fd, off) \
107 	syscall(SYS_mmap, (void *)(addr), (size_t)(len), \
108 			(int)(prot), (int)(flags), (int)(fd), (off_t)(off))
109 #elif defined(__OpenBSD__)
110 register_t __syscall(quad_t, ...);
111 #define SYS_MMAP(addr, len, prot, flags, fd, offset) \
112 	__syscall((quad_t)SYS_mmap, (void *)(addr), (size_t)(len), \
113 			(int)(prot), (int)(flags), (int)(fd), 0, (off_t)(offset))
114 #else
115 #define SYS_MMAP(addr, len, prot, flags, fd, off) \
116 	syscall(SYS_mmap2, (void *)(addr), (size_t)(len), \
117 			(int)(prot), (int)(flags), (int)(fd), (off_t)((off) >> MMAP2_PAGE_SHIFT))
118 #endif
119 
120 #define SYS_MUNMAP(addr, len) \
121 	syscall(SYS_munmap, (void *)(addr), (size_t)(len))
122 
123 #else
124 
125 int v4lx_open_wrapper(const char *, int, int);
126 int v4lx_close_wrapper(int);
127 int v4lx_ioctl_wrapper(int, unsigned long, void *);
128 int v4lx_read_wrapper(int, void *, size_t);
129 int v4lx_write_wrapper(int, const void *, size_t);
130 void *v4lx_mmap_wrapper(void *, size_t, int, int, int, off_t);
131 int v4lx_munmap_wrapper(void *, size_t);
132 
133 #define SYS_OPEN(...) v4lx_open_wrapper(__VA_ARGS__)
134 #define SYS_CLOSE(...) v4lx_close_wrapper(__VA_ARGS__)
135 #define SYS_IOCTL(...) v4lx_ioctl_wrapper(__VA_ARGS__)
136 #define SYS_READ(...) v4lx_read_wrapper(__VA_ARGS__)
137 #define SYS_WRITE(...) v4lx_write_wrapper(__VA_ARGS__)
138 #define SYS_MMAP(...) v4lx_mmap_wrapper(__VA_ARGS__)
139 #define SYS_MUNMAP(...) v4lx_munmap_wrapper(__VA_ARGS__)
140 
141 #endif
142 
143 #endif /* _LIBV4LSYSCALL_PRIV_H_ */
144