diff options
Diffstat (limited to 'libdrm.h')
-rw-r--r-- | libdrm.h | 55 |
1 files changed, 55 insertions, 0 deletions
@@ -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 | |||
51 | extern void *__mmap2(void *, size_t, int, int, int, size_t); | ||
52 | |||
53 | static 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 | |||
76 | static 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 |