aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov2014-09-07 13:29:00 -0500
committerEmil Velikov2014-09-28 11:09:34 -0500
commit4c2766b69c261703c62131b5e4200d0e164b5eb4 (patch)
tree5024abf8c56616b84a1ce93da2ee61b20207822b /libdrm.h
parent268dce4192125ceb6a65f1c8d885e4b656310578 (diff)
downloadexternal-libdrm-4c2766b69c261703c62131b5e4200d0e164b5eb4.tar.gz
external-libdrm-4c2766b69c261703c62131b5e4200d0e164b5eb4.tar.xz
external-libdrm-4c2766b69c261703c62131b5e4200d0e164b5eb4.zip
Add private mmap/munmap wrappers
Unlike Linux, Android (bionic) has separate functions - mmap & mmap64. Add a local wrapper (inspired by gallium) that will be used throughout libdrm to combat this bionic feature. v2: - Drop the undefined unlikely macro. - Use macro for munmap under Android. - Wrap long lines. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> (v1)
Diffstat (limited to 'libdrm.h')
-rw-r--r--libdrm.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/libdrm.h b/libdrm.h
index 23926e6f..acfada5c 100644
--- a/libdrm.h
+++ b/libdrm.h
@@ -31,4 +31,59 @@
31# define drm_public 31# define drm_public
32#endif 32#endif
33 33
34
35/**
36 * Static (compile-time) assertion.
37 * Basically, use COND to dimension an array. If COND is false/zero the
38 * array size will be -1 and we'll get a compilation error.
39 */
40#define STATIC_ASSERT(COND) \
41 do { \
42 (void) sizeof(char [1 - 2*!(COND)]); \
43 } while (0)
44
45
46#include <sys/mman.h>
47
48#if defined(ANDROID)
49#include <errno.h> /* for EINVAL */
50
51extern void *__mmap2(void *, size_t, int, int, int, size_t);
52
53static inline void *drm_mmap(void *addr, size_t length, int prot, int flags,
54 int fd, loff_t offset)
55{
56 /* offset must be aligned to 4096 (not necessarily the page size) */
57 if (offset & 4095) {
58 errno = EINVAL;
59 return MAP_FAILED;
60 }
61
62 return __mmap2(addr, length, prot, flags, fd, (size_t) (offset >> 12));
63}
64
65# define drm_munmap(addr, length) \
66 munmap(addr, length)
67
68
69#else
70
71/* assume large file support exists */
72# define drm_mmap(addr, length, prot, flags, fd, offset) \
73 mmap(addr, length, prot, flags, fd, offset)
74
75
76static inline int drm_munmap(void *addr, size_t length)
77{
78 /* Copied from configure code generated by AC_SYS_LARGEFILE */
79#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + \
80 (((off_t) 1 << 31) << 31))
81 STATIC_ASSERT(LARGE_OFF_T % 2147483629 == 721 &&
82 LARGE_OFF_T % 2147483647 == 1);
83#undef LARGE_OFF_T
84
85 return munmap(addr, length);
86}
87#endif
88
34#endif 89#endif