1 /* $NetBSD: unpack.h,v 1.4 2021/12/18 23:45:33 riastradh Exp $ */ 2 3 /* SPDX-License-Identifier: MIT */ 4 #ifndef __NVIF_UNPACK_H__ 5 #define __NVIF_UNPACK_H__ 6 7 #define nvif_unvers(r,d,s,m) ({ \ 8 void **_data = (d); __u32 *_size = (s); int _ret = (r); \ 9 if (_ret == -ENOSYS && *_size == sizeof(m)) { \ 10 *_data = NULL; \ 11 *_size = _ret = 0; \ 12 } \ 13 _ret; \ 14 }) 15 16 #define nvif_unpack(r,d,s,m,vl,vh,x) ({ \ 17 void **_data = (d); __u32 *_size = (s); \ 18 int _ret = (r), _vl = (vl), _vh = (vh); \ 19 if (_ret == -ENOSYS && *_size >= sizeof(m) && \ 20 (m).version >= _vl && (m).version <= _vh) { \ 21 *_data = (__u8 *)*_data + sizeof(m); \ 22 *_size = *_size - sizeof(m); \ 23 if (_ret = 0, !(x)) { \ 24 _ret = *_size ? -E2BIG : 0; \ 25 *_data = NULL; \ 26 *_size = 0; \ 27 } \ 28 } \ 29 _ret; \ 30 }) 31 #endif 32