unpack.h 1.6 KB

1234567891011121314151617181920212223242526272829
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __NVIF_UNPACK_H__
  3. #define __NVIF_UNPACK_H__
  4. #define nvif_unvers(r,d,s,m) ({ \
  5. void **_data = (d); __u32 *_size = (s); int _ret = (r); \
  6. if (_ret == -ENOSYS && *_size == sizeof(m)) { \
  7. *_data = NULL; \
  8. *_size = _ret = 0; \
  9. } \
  10. _ret; \
  11. })
  12. #define nvif_unpack(r,d,s,m,vl,vh,x) ({ \
  13. void **_data = (d); __u32 *_size = (s); \
  14. int _ret = (r), _vl = (vl), _vh = (vh); \
  15. if (_ret == -ENOSYS && *_size >= sizeof(m) && \
  16. (m).version >= _vl && (m).version <= _vh) { \
  17. *_data = (__u8 *)*_data + sizeof(m); \
  18. *_size = *_size - sizeof(m); \
  19. if (_ret = 0, !(x)) { \
  20. _ret = *_size ? -E2BIG : 0; \
  21. *_data = NULL; \
  22. *_size = 0; \
  23. } \
  24. } \
  25. _ret; \
  26. })
  27. #endif