xref: /titanic_52/usr/src/uts/intel/io/acpica/utilities/utalloc.c (revision 6e375c8351497b82ffa4f33cbf61d712999b4605)
1 /******************************************************************************
2  *
3  * Module Name: utalloc - local memory allocation routines
4  *              $Revision: 1.166 $
5  *
6  *****************************************************************************/
7 
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
13  * All rights reserved.
14  *
15  * 2. License
16  *
17  * 2.1. This is your license from Intel Corp. under its intellectual property
18  * rights.  You may have additional license terms from the party that provided
19  * you this software, covering your right to use that party's intellectual
20  * property rights.
21  *
22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23  * copy of the source code appearing in this file ("Covered Code") an
24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25  * base code distributed originally by Intel ("Original Intel Code") to copy,
26  * make derivatives, distribute, use and display any portion of the Covered
27  * Code in any form, with the right to sublicense such rights; and
28  *
29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30  * license (with the right to sublicense), under only those claims of Intel
31  * patents that are infringed by the Original Intel Code, to make, use, sell,
32  * offer to sell, and import the Covered Code and derivative works thereof
33  * solely to the minimum extent necessary to exercise the above copyright
34  * license, and in no event shall the patent license extend to any additions
35  * to or modifications of the Original Intel Code.  No other license or right
36  * is granted directly or by implication, estoppel or otherwise;
37  *
38  * The above copyright and patent license is granted only if the following
39  * conditions are met:
40  *
41  * 3. Conditions
42  *
43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44  * Redistribution of source code of any substantial portion of the Covered
45  * Code or modification with rights to further distribute source must include
46  * the above Copyright Notice, the above License, this list of Conditions,
47  * and the following Disclaimer and Export Compliance provision.  In addition,
48  * Licensee must cause all Covered Code to which Licensee contributes to
49  * contain a file documenting the changes Licensee made to create that Covered
50  * Code and the date of any change.  Licensee must include in that file the
51  * documentation of any changes made by any predecessor Licensee.  Licensee
52  * must include a prominent statement that the modification is derived,
53  * directly or indirectly, from Original Intel Code.
54  *
55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56  * Redistribution of source code of any substantial portion of the Covered
57  * Code or modification without rights to further distribute source must
58  * include the following Disclaimer and Export Compliance provision in the
59  * documentation and/or other materials provided with distribution.  In
60  * addition, Licensee may not authorize further sublicense of source of any
61  * portion of the Covered Code, and must include terms to the effect that the
62  * license from Licensee to its licensee is limited to the intellectual
63  * property embodied in the software Licensee provides to its licensee, and
64  * not to intellectual property embodied in modifications its licensee may
65  * make.
66  *
67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68  * substantial portion of the Covered Code or modification must reproduce the
69  * above Copyright Notice, and the following Disclaimer and Export Compliance
70  * provision in the documentation and/or other materials provided with the
71  * distribution.
72  *
73  * 3.4. Intel retains all right, title, and interest in and to the Original
74  * Intel Code.
75  *
76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77  * Intel shall be used in advertising or otherwise to promote the sale, use or
78  * other dealings in products derived from or relating to the Covered Code
79  * without prior written authorization from Intel.
80  *
81  * 4. Disclaimer and Export Compliance
82  *
83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89  * PARTICULAR PURPOSE.
90  *
91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98  * LIMITED REMEDY.
99  *
100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101  * software or system incorporating such software without first obtaining any
102  * required license or other approval from the U. S. Department of Commerce or
103  * any other agency or department of the United States Government.  In the
104  * event Licensee exports any such software from the United States or
105  * re-exports any such software from a foreign destination, Licensee shall
106  * ensure that the distribution and export/re-export of the software is in
107  * compliance with all laws, regulations, orders, or other restrictions of the
108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109  * any of its subsidiaries will export/re-export any technical data, process,
110  * software, or service, directly or indirectly, to any country for which the
111  * United States government or any agency thereof requires an export license,
112  * other governmental approval, or letter of assurance, without first obtaining
113  * such license, approval or letter.
114  *
115  *****************************************************************************/
116 
117 #define __UTALLOC_C__
118 
119 #include "acpi.h"
120 #include "acdebug.h"
121 
122 #define _COMPONENT          ACPI_UTILITIES
123         ACPI_MODULE_NAME    ("utalloc")
124 
125 
126 /*******************************************************************************
127  *
128  * FUNCTION:    AcpiUtCreateCaches
129  *
130  * PARAMETERS:  None
131  *
132  * RETURN:      Status
133  *
134  * DESCRIPTION: Create all local caches
135  *
136  ******************************************************************************/
137 
138 ACPI_STATUS
139 AcpiUtCreateCaches (
140     void)
141 {
142     ACPI_STATUS             Status;
143 
144 
145     /* Object Caches, for frequently used objects */
146 
147     Status = AcpiOsCreateCache ("Acpi-Namespace", sizeof (ACPI_NAMESPACE_NODE),
148                 ACPI_MAX_NAMESPACE_CACHE_DEPTH, &AcpiGbl_NamespaceCache);
149     if (ACPI_FAILURE (Status))
150     {
151         return (Status);
152     }
153 
154     Status = AcpiOsCreateCache ("Acpi-State", sizeof (ACPI_GENERIC_STATE),
155                 ACPI_MAX_STATE_CACHE_DEPTH, &AcpiGbl_StateCache);
156     if (ACPI_FAILURE (Status))
157     {
158         return (Status);
159     }
160 
161     Status = AcpiOsCreateCache ("Acpi-Parse", sizeof (ACPI_PARSE_OBJ_COMMON),
162                 ACPI_MAX_PARSE_CACHE_DEPTH, &AcpiGbl_PsNodeCache);
163     if (ACPI_FAILURE (Status))
164     {
165         return (Status);
166     }
167 
168     Status = AcpiOsCreateCache ("Acpi-ParseExt", sizeof (ACPI_PARSE_OBJ_NAMED),
169                 ACPI_MAX_EXTPARSE_CACHE_DEPTH, &AcpiGbl_PsNodeExtCache);
170     if (ACPI_FAILURE (Status))
171     {
172         return (Status);
173     }
174 
175     Status = AcpiOsCreateCache ("Acpi-Operand", sizeof (ACPI_OPERAND_OBJECT),
176                 ACPI_MAX_OBJECT_CACHE_DEPTH, &AcpiGbl_OperandCache);
177     if (ACPI_FAILURE (Status))
178     {
179         return (Status);
180     }
181 
182 
183 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
184 
185     /* Memory allocation lists */
186 
187     Status = AcpiUtCreateList ("Acpi-Global", 0,
188                 &AcpiGbl_GlobalList);
189     if (ACPI_FAILURE (Status))
190     {
191         return (Status);
192     }
193 
194     Status = AcpiUtCreateList ("Acpi-Namespace", sizeof (ACPI_NAMESPACE_NODE),
195                 &AcpiGbl_NsNodeList);
196     if (ACPI_FAILURE (Status))
197     {
198         return (Status);
199     }
200 #endif
201 
202     return (AE_OK);
203 }
204 
205 
206 /*******************************************************************************
207  *
208  * FUNCTION:    AcpiUtDeleteCaches
209  *
210  * PARAMETERS:  None
211  *
212  * RETURN:      Status
213  *
214  * DESCRIPTION: Purge and delete all local caches
215  *
216  ******************************************************************************/
217 
218 ACPI_STATUS
219 AcpiUtDeleteCaches (
220     void)
221 {
222 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
223     char                    Buffer[7];
224 
225     if (AcpiGbl_DisplayFinalMemStats)
226     {
227         ACPI_STRCPY (Buffer, "MEMORY");
228         (void) AcpiDbDisplayStatistics (Buffer);
229     }
230 #endif
231 
232     (void) AcpiOsDeleteCache (AcpiGbl_NamespaceCache);
233     AcpiGbl_NamespaceCache = NULL;
234 
235     (void) AcpiOsDeleteCache (AcpiGbl_StateCache);
236     AcpiGbl_StateCache = NULL;
237 
238     (void) AcpiOsDeleteCache (AcpiGbl_OperandCache);
239     AcpiGbl_OperandCache = NULL;
240 
241     (void) AcpiOsDeleteCache (AcpiGbl_PsNodeCache);
242     AcpiGbl_PsNodeCache = NULL;
243 
244     (void) AcpiOsDeleteCache (AcpiGbl_PsNodeExtCache);
245     AcpiGbl_PsNodeExtCache = NULL;
246 
247 
248 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
249 
250     /* Debug only - display leftover memory allocation, if any */
251 
252     AcpiUtDumpAllocations (ACPI_UINT32_MAX, NULL);
253 
254     /* Free memory lists */
255 
256     AcpiOsFree (AcpiGbl_GlobalList);
257     AcpiGbl_GlobalList = NULL;
258 
259     AcpiOsFree (AcpiGbl_NsNodeList);
260     AcpiGbl_NsNodeList = NULL;
261 #endif
262 
263     return (AE_OK);
264 }
265 
266 
267 /*******************************************************************************
268  *
269  * FUNCTION:    AcpiUtValidateBuffer
270  *
271  * PARAMETERS:  Buffer              - Buffer descriptor to be validated
272  *
273  * RETURN:      Status
274  *
275  * DESCRIPTION: Perform parameter validation checks on an ACPI_BUFFER
276  *
277  ******************************************************************************/
278 
279 ACPI_STATUS
280 AcpiUtValidateBuffer (
281     ACPI_BUFFER             *Buffer)
282 {
283 
284     /* Obviously, the structure pointer must be valid */
285 
286     if (!Buffer)
287     {
288         return (AE_BAD_PARAMETER);
289     }
290 
291     /* Special semantics for the length */
292 
293     if ((Buffer->Length == ACPI_NO_BUFFER)              ||
294         (Buffer->Length == ACPI_ALLOCATE_BUFFER)        ||
295         (Buffer->Length == ACPI_ALLOCATE_LOCAL_BUFFER))
296     {
297         return (AE_OK);
298     }
299 
300     /* Length is valid, the buffer pointer must be also */
301 
302     if (!Buffer->Pointer)
303     {
304         return (AE_BAD_PARAMETER);
305     }
306 
307     return (AE_OK);
308 }
309 
310 
311 /*******************************************************************************
312  *
313  * FUNCTION:    AcpiUtInitializeBuffer
314  *
315  * PARAMETERS:  Buffer              - Buffer to be validated
316  *              RequiredLength      - Length needed
317  *
318  * RETURN:      Status
319  *
320  * DESCRIPTION: Validate that the buffer is of the required length or
321  *              allocate a new buffer.  Returned buffer is always zeroed.
322  *
323  ******************************************************************************/
324 
325 ACPI_STATUS
326 AcpiUtInitializeBuffer (
327     ACPI_BUFFER             *Buffer,
328     ACPI_SIZE               RequiredLength)
329 {
330     ACPI_STATUS             Status = AE_OK;
331 
332 
333     /* Parameter validation */
334 
335     if (!Buffer || !RequiredLength)
336     {
337         return (AE_BAD_PARAMETER);
338     }
339 
340     switch (Buffer->Length)
341     {
342     case ACPI_NO_BUFFER:
343 
344         /* Set the exception and returned the required length */
345 
346         Status = AE_BUFFER_OVERFLOW;
347         break;
348 
349 
350     case ACPI_ALLOCATE_BUFFER:
351 
352         /* Allocate a new buffer */
353 
354         Buffer->Pointer = AcpiOsAllocate (RequiredLength);
355         if (!Buffer->Pointer)
356         {
357             return (AE_NO_MEMORY);
358         }
359 
360         /* Clear the buffer */
361 
362         ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
363         break;
364 
365 
366     case ACPI_ALLOCATE_LOCAL_BUFFER:
367 
368         /* Allocate a new buffer with local interface to allow tracking */
369 
370         Buffer->Pointer = ACPI_ALLOCATE_ZEROED (RequiredLength);
371         if (!Buffer->Pointer)
372         {
373             return (AE_NO_MEMORY);
374         }
375         break;
376 
377 
378     default:
379 
380         /* Existing buffer: Validate the size of the buffer */
381 
382         if (Buffer->Length < RequiredLength)
383         {
384             Status = AE_BUFFER_OVERFLOW;
385             break;
386         }
387 
388         /* Clear the buffer */
389 
390         ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
391         break;
392     }
393 
394     Buffer->Length = RequiredLength;
395     return (Status);
396 }
397 
398 
399 /*******************************************************************************
400  *
401  * FUNCTION:    AcpiUtAllocate
402  *
403  * PARAMETERS:  Size                - Size of the allocation
404  *              Component           - Component type of caller
405  *              Module              - Source file name of caller
406  *              Line                - Line number of caller
407  *
408  * RETURN:      Address of the allocated memory on success, NULL on failure.
409  *
410  * DESCRIPTION: Subsystem equivalent of malloc.
411  *
412  ******************************************************************************/
413 
414 void *
415 AcpiUtAllocate (
416     ACPI_SIZE               Size,
417     UINT32                  Component,
418     const char              *Module,
419     UINT32                  Line)
420 {
421     void                    *Allocation;
422 
423 
424     ACPI_FUNCTION_TRACE_U32 (UtAllocate, Size);
425 
426 
427     /* Check for an inadvertent size of zero bytes */
428 
429     if (!Size)
430     {
431         ACPI_WARNING ((Module, Line,
432             "Attempt to allocate zero bytes, allocating 1 byte"));
433         Size = 1;
434     }
435 
436     Allocation = AcpiOsAllocate (Size);
437     if (!Allocation)
438     {
439         /* Report allocation error */
440 
441         ACPI_WARNING ((Module, Line,
442             "Could not allocate size %X", (UINT32) Size));
443 
444         return_PTR (NULL);
445     }
446 
447     return_PTR (Allocation);
448 }
449 
450 
451 /*******************************************************************************
452  *
453  * FUNCTION:    AcpiUtAllocateZeroed
454  *
455  * PARAMETERS:  Size                - Size of the allocation
456  *              Component           - Component type of caller
457  *              Module              - Source file name of caller
458  *              Line                - Line number of caller
459  *
460  * RETURN:      Address of the allocated memory on success, NULL on failure.
461  *
462  * DESCRIPTION: Subsystem equivalent of calloc. Allocate and zero memory.
463  *
464  ******************************************************************************/
465 
466 void *
467 AcpiUtAllocateZeroed (
468     ACPI_SIZE               Size,
469     UINT32                  Component,
470     const char              *Module,
471     UINT32                  Line)
472 {
473     void                    *Allocation;
474 
475 
476     ACPI_FUNCTION_ENTRY ();
477 
478 
479     Allocation = AcpiUtAllocate (Size, Component, Module, Line);
480     if (Allocation)
481     {
482         /* Clear the memory block */
483 
484         ACPI_MEMSET (Allocation, 0, Size);
485     }
486 
487     return (Allocation);
488 }
489 
490