The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/dev/acpica/components/utilities/utalloc.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 7972ce943f722d38e7e0f0a42fc98b4f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.