1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46#include "acdebug.h"
47
48#define _COMPONENT ACPI_UTILITIES
49ACPI_MODULE_NAME("utalloc")
50
51
52
53
54
55
56
57
58
59
60
61
62acpi_status acpi_ut_create_caches(void)
63{
64 acpi_status status;
65
66
67
68 status =
69 acpi_os_create_cache("Acpi-Namespace",
70 sizeof(struct acpi_namespace_node),
71 ACPI_MAX_NAMESPACE_CACHE_DEPTH,
72 &acpi_gbl_namespace_cache);
73 if (ACPI_FAILURE(status)) {
74 return (status);
75 }
76
77 status =
78 acpi_os_create_cache("Acpi-State", sizeof(union acpi_generic_state),
79 ACPI_MAX_STATE_CACHE_DEPTH,
80 &acpi_gbl_state_cache);
81 if (ACPI_FAILURE(status)) {
82 return (status);
83 }
84
85 status =
86 acpi_os_create_cache("Acpi-Parse",
87 sizeof(struct acpi_parse_obj_common),
88 ACPI_MAX_PARSE_CACHE_DEPTH,
89 &acpi_gbl_ps_node_cache);
90 if (ACPI_FAILURE(status)) {
91 return (status);
92 }
93
94 status =
95 acpi_os_create_cache("Acpi-ParseExt",
96 sizeof(struct acpi_parse_obj_named),
97 ACPI_MAX_EXTPARSE_CACHE_DEPTH,
98 &acpi_gbl_ps_node_ext_cache);
99 if (ACPI_FAILURE(status)) {
100 return (status);
101 }
102
103 status =
104 acpi_os_create_cache("Acpi-Operand",
105 sizeof(union acpi_operand_object),
106 ACPI_MAX_OBJECT_CACHE_DEPTH,
107 &acpi_gbl_operand_cache);
108 if (ACPI_FAILURE(status)) {
109 return (status);
110 }
111#ifdef ACPI_DBG_TRACK_ALLOCATIONS
112
113
114
115 status = acpi_ut_create_list("Acpi-Global", 0, &acpi_gbl_global_list);
116 if (ACPI_FAILURE(status)) {
117 return (status);
118 }
119
120 status =
121 acpi_ut_create_list("Acpi-Namespace",
122 sizeof(struct acpi_namespace_node),
123 &acpi_gbl_ns_node_list);
124 if (ACPI_FAILURE(status)) {
125 return (status);
126 }
127#endif
128
129 return (AE_OK);
130}
131
132
133
134
135
136
137
138
139
140
141
142
143
144acpi_status acpi_ut_delete_caches(void)
145{
146#ifdef ACPI_DBG_TRACK_ALLOCATIONS
147 char buffer[7];
148
149 if (acpi_gbl_display_final_mem_stats) {
150 ACPI_STRCPY(buffer, "MEMORY");
151 (void)acpi_db_display_statistics(buffer);
152 }
153#endif
154
155 (void)acpi_os_delete_cache(acpi_gbl_namespace_cache);
156 acpi_gbl_namespace_cache = NULL;
157
158 (void)acpi_os_delete_cache(acpi_gbl_state_cache);
159 acpi_gbl_state_cache = NULL;
160
161 (void)acpi_os_delete_cache(acpi_gbl_operand_cache);
162 acpi_gbl_operand_cache = NULL;
163
164 (void)acpi_os_delete_cache(acpi_gbl_ps_node_cache);
165 acpi_gbl_ps_node_cache = NULL;
166
167 (void)acpi_os_delete_cache(acpi_gbl_ps_node_ext_cache);
168 acpi_gbl_ps_node_ext_cache = NULL;
169
170#ifdef ACPI_DBG_TRACK_ALLOCATIONS
171
172
173
174 acpi_ut_dump_allocations(ACPI_UINT32_MAX, NULL);
175
176
177
178 ACPI_FREE(acpi_gbl_global_list);
179 acpi_gbl_global_list = NULL;
180
181 ACPI_FREE(acpi_gbl_ns_node_list);
182 acpi_gbl_ns_node_list = NULL;
183#endif
184
185 return (AE_OK);
186}
187
188
189
190
191
192
193
194
195
196
197
198
199
200acpi_status acpi_ut_validate_buffer(struct acpi_buffer * buffer)
201{
202
203
204
205 if (!buffer) {
206 return (AE_BAD_PARAMETER);
207 }
208
209
210
211 if ((buffer->length == ACPI_NO_BUFFER) ||
212 (buffer->length == ACPI_ALLOCATE_BUFFER) ||
213 (buffer->length == ACPI_ALLOCATE_LOCAL_BUFFER)) {
214 return (AE_OK);
215 }
216
217
218
219 if (!buffer->pointer) {
220 return (AE_BAD_PARAMETER);
221 }
222
223 return (AE_OK);
224}
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240acpi_status
241acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
242 acpi_size required_length)
243{
244 acpi_size input_buffer_length;
245
246
247
248 if (!buffer || !required_length) {
249 return (AE_BAD_PARAMETER);
250 }
251
252
253
254
255
256 input_buffer_length = buffer->length;
257 buffer->length = required_length;
258
259
260
261
262
263 switch (input_buffer_length) {
264 case ACPI_NO_BUFFER:
265
266
267
268 return (AE_BUFFER_OVERFLOW);
269
270 case ACPI_ALLOCATE_BUFFER:
271
272
273
274 buffer->pointer = acpi_os_allocate(required_length);
275 break;
276
277 case ACPI_ALLOCATE_LOCAL_BUFFER:
278
279
280
281 buffer->pointer = ACPI_ALLOCATE(required_length);
282 break;
283
284 default:
285
286
287
288 if (input_buffer_length < required_length) {
289 return (AE_BUFFER_OVERFLOW);
290 }
291 break;
292 }
293
294
295
296 if (!buffer->pointer) {
297 return (AE_NO_MEMORY);
298 }
299
300
301
302 ACPI_MEMSET(buffer->pointer, 0, required_length);
303 return (AE_OK);
304}
305
306#ifdef NOT_USED_BY_LINUX
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322void *acpi_ut_allocate(acpi_size size,
323 u32 component, const char *module, u32 line)
324{
325 void *allocation;
326
327 ACPI_FUNCTION_TRACE_U32(ut_allocate, size);
328
329
330
331 if (!size) {
332 ACPI_WARNING((module, line,
333 "Attempt to allocate zero bytes, allocating 1 byte"));
334 size = 1;
335 }
336
337 allocation = acpi_os_allocate(size);
338 if (!allocation) {
339
340
341
342 ACPI_WARNING((module, line,
343 "Could not allocate size %u", (u32) size));
344
345 return_PTR(NULL);
346 }
347
348 return_PTR(allocation);
349}
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366void *acpi_ut_allocate_zeroed(acpi_size size,
367 u32 component, const char *module, u32 line)
368{
369 void *allocation;
370
371 ACPI_FUNCTION_ENTRY();
372
373 allocation = acpi_ut_allocate(size, component, module, line);
374 if (allocation) {
375
376
377
378 ACPI_MEMSET(allocation, 0, size);
379 }
380
381 return (allocation);
382}
383#endif
384