Lines Matching refs:ptr
43 extern int CheckRegion(const LosVmSpace *space, VADDR_T ptr, size_t len);
44 extern void *DupUserMem(const void *ptr, size_t len, int needCopy);
48 #define CHECK_ASPACE(ptr, len, ...) \
50 if (ptr != NULL && len != 0) { \
51 if (!LOS_IsUserAddressRange((VADDR_T)(UINTPTR)ptr, len)) { \
58 if (CheckRegion(__aspace, (VADDR_T)(UINTPTR)ptr, len) == -1) { \
68 #define LEN(ptr) ((ptr) ? *(ptr) : 0)
70 #define DUP_FROM_USER_(ptr, size, copy, ...) \
71 __typeof(ptr) ptr##bak = ptr; \
72 if (ptr != NULL && (size) != 0) { \
73 ptr = DupUserMem(ptr, size, copy); \
74 if (ptr == NULL) { \
75 ptr = ptr##bak; \
82 DUP_FROM_USER(ptr, size, ...) can not deal with "char *";
85 #define DUP_FROM_USER(ptr, size, ...) \
86 DUP_FROM_USER_(ptr, size, 1, ##__VA_ARGS__)
88 #define DUP_FROM_USER_NOCOPY(ptr, size, ...) \
89 DUP_FROM_USER_(ptr, size, 0, ##__VA_ARGS__)
91 #define DUP_TO_USER(ptr, size, ...) \
93 if (ptr != NULL && (size) != 0) { \
94 if (LOS_ArchCopyToUser(ptr##bak, ptr, size) != 0) { \
102 #define FREE_DUP(ptr) \
104 if (ptr != ptr##bak) { \
105 LOS_MemFree(OS_SYS_MEM_ADDR, (void*)ptr); \
106 ptr = ptr##bak; \
110 #define CPY_FROM_USER(ptr) \
111 __typeof(*ptr) ptr##cpy = {0}, *ptr##bak = ptr; \
112 if (ptr != NULL) { \
113 if (LOS_ArchCopyFromUser((void*)&ptr##cpy, ptr##bak, sizeof(*ptr##bak)) != 0) { \
117 ptr = &ptr##cpy; \
120 #define CPY_TO_USER(ptr, ...) \
121 if (ptr != NULL) { \
122 if (LOS_ArchCopyToUser(ptr##bak, ptr, sizeof(*ptr)) != 0) { \
131 #define CONST_CAST(ptr) ((__typeof(ptr##_NONCONST))ptr)
133 #define CHECK_FIELD_ASPACE(ptr, field, len) \
135 if (ptr != NULL) { \
136 CHECK_ASPACE(ptr->field, len); \
140 #define CHECK_ARRAY_FIELD_ASPACE(ptr, arr, arrlen, field, len, ...) \
142 if (ptr != NULL && ptr->arr != NULL) { \
144 CHECK_ASPACE(ptr->arr[i].field, ptr->arr[i].len, ##__VA_ARGS__); \
149 #define DUP_FIELD_FROM_USER_(ptr, field, size, copy, ...) \
151 if (ptr != NULL && ptr->field != NULL && (size) != 0) { \
152 CONST_CAST(ptr)->field = DupUserMem(ptr->field, size, copy); \
153 if (ptr->field == NULL) { \
160 #define DUP_FIELD_FROM_USER(ptr, field, size, ...) \
161 DUP_FIELD_FROM_USER_(ptr, field, size, 1, ##__VA_ARGS__)
163 #define DUP_FIELD_FROM_USER_NOCOPY(ptr, field, size, ...) \
164 DUP_FIELD_FROM_USER_(ptr, field, size, 0, ##__VA_ARGS__)
166 /* backup the arr to ptr##arr */
167 #define DUP_ARRAY_FIELD_FROM_USER_(ext, ptr, arr, arrlen, field, len, ...) \
168 __typeof(*ptr##_NONCONST) ptr##arr##cpy = ptr##cpybak, ptr##arr##cpybak = ptr##cpybak; \
169 __typeof(ptr##_NONCONST) ptr##arr = ptr ? &ptr##arr##cpy : NULL, ptr##arr##_NONCONST = NULL; \
170 DUP_FIELD_FROM_USER(ptr##arr, arr, arrlen * sizeof(ptr->arr[0]), ##__VA_ARGS__); \
171 if (ptr != NULL && ptr->arr != NULL) { \
174 DUP_FIELD_FROM_USER##ext(ptr, arr[i].field, ptr->arr[i].len, break); \
177 FREE_DUP_ARRAY_FIELD(ptr, arr, i, field); \
183 #define DUP_ARRAY_FIELD_FROM_USER(ptr, arr, arrlen, field, len, ...) \
184 DUP_ARRAY_FIELD_FROM_USER_(, ptr, arr, arrlen, field, len, ##__VA_ARGS__)
186 #define DUP_ARRAY_FIELD_FROM_USER_NOCOPY(ptr, arr, arrlen, field, len, ...) \
187 DUP_ARRAY_FIELD_FROM_USER_(_NOCOPY, ptr, arr, arrlen, field, len, ##__VA_ARGS__)
189 #define FREE_DUP_FIELD(ptr, field) \
191 if (ptr != NULL && ptr->field != ptr##cpybak.field) { \
192 LOS_MemFree(OS_SYS_MEM_ADDR, (void*)ptr->field); \
193 CONST_CAST(ptr)->field = ptr##cpybak.field; \
197 /* use and free the backuped arr in ptr##arr */
198 #define FREE_DUP_ARRAY_FIELD(ptr, arr, arrlen, field) \
199 if (ptr != NULL && ptr->arr != NULL && arrlen != 0) { \
200 __typeof(ptr##cpybak.arr) tmp = ptr##cpybak.arr; \
201 ptr##cpybak.arr = ptr##arr->arr; \
203 FREE_DUP_FIELD(ptr, arr[j].field); \
205 ptr##cpybak.arr = tmp; \
207 FREE_DUP_FIELD(ptr##arr, arr);
209 #define CPY_FROM_CONST_USER(NonConstType, ptr) \
210 CPY_FROM_USER(ptr); \
211 NonConstType *ptr##_NONCONST = NULL, ptr##cpybak = ptr##cpy; \
212 (void)ptr##bak;
214 #define CPY_FROM_NONCONST_USER(ptr) \
215 CPY_FROM_USER(ptr); \
216 __typeof(*ptr) *ptr##_NONCONST = NULL, ptr##cpybak = ptr##cpy;
218 #define DUP_FIELD_TO_USER(ptr, field, size, ...) \
220 if (ptr != NULL && ptr->field != NULL && (size) != 0) { \
221 if (LOS_ArchCopyToUser(ptr##cpybak.field, ptr->field, size) != 0 || \
222 LOS_ArchCopyToUser(&ptr##bak->field, &ptr##cpybak.field, sizeof(__typeof(ptr##cpybak.field))) != 0) { \
230 /* use the backuped arr from ptr##arr */
231 #define DUP_ARRAY_FIELD_TO_USER(ptr, arr, arrlen, field, len, ...) \
232 if (ptr != NULL && ptr->arr != NULL) { \
233 __typeof(ptr##cpybak.arr) tmp = ptr##cpybak.arr; \
234 __typeof(ptr##bak) tmp2 = ptr##bak; \
235 ptr##cpybak.arr = ptr##arr->arr; \
236 ptr##arr->arr = tmp; \
237 ptr##bak = ptr##arr; \
239 DUP_FIELD_TO_USER(ptr, arr[i].field, ptr->arr[i].len, ##__VA_ARGS__); \
241 ptr##bak = tmp2; \
242 ptr##arr->arr = ptr##cpybak.arr; \
243 ptr##cpybak.arr = tmp; \
246 #define PointerFree(ptr) \
248 if (ptr != NULL) { \
249 LOS_MemFree(OS_SYS_MEM_ADDR, (void*)ptr); \