libdrm_macros.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright © 2014 NVIDIA Corporation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. */
  22. #ifndef LIBDRM_LIBDRM_H
  23. #define LIBDRM_LIBDRM_H
  24. #if HAVE_VISIBILITY
  25. # define drm_private __attribute__((visibility("hidden")))
  26. # define drm_public __attribute__((visibility("default")))
  27. #else
  28. # define drm_private
  29. # define drm_public
  30. #endif
  31. /**
  32. * Static (compile-time) assertion.
  33. * Basically, use COND to dimension an array. If COND is false/zero the
  34. * array size will be -1 and we'll get a compilation error.
  35. */
  36. #define STATIC_ASSERT(COND) \
  37. do { \
  38. (void) sizeof(char [1 - 2*!(COND)]); \
  39. } while (0)
  40. #include <sys/mman.h>
  41. #if defined(ANDROID) && !defined(__LP64__)
  42. #include <errno.h> /* for EINVAL */
  43. static inline void *drm_mmap(void *addr, size_t length, int prot, int flags,
  44. int fd, loff_t offset)
  45. {
  46. /* offset must be aligned to 4096 (not necessarily the page size) */
  47. if (offset & 4095) {
  48. errno = EINVAL;
  49. return MAP_FAILED;
  50. }
  51. return mmap64(addr, length, prot, flags, fd, offset);
  52. }
  53. # define drm_munmap(addr, length) \
  54. munmap(addr, length)
  55. #else
  56. /* assume large file support exists */
  57. # define drm_mmap(addr, length, prot, flags, fd, offset) \
  58. mmap(addr, length, prot, flags, fd, offset)
  59. static inline int drm_munmap(void *addr, size_t length)
  60. {
  61. /* Copied from configure code generated by AC_SYS_LARGEFILE */
  62. #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + \
  63. (((off_t) 1 << 31) << 31))
  64. STATIC_ASSERT(LARGE_OFF_T % 2147483629 == 721 &&
  65. LARGE_OFF_T % 2147483647 == 1);
  66. #undef LARGE_OFF_T
  67. return munmap(addr, length);
  68. }
  69. #endif
  70. #endif