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/disassembler/dmresrc.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: dmresrc.c - Resource Descriptor disassembly
    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/amlcode.h>
  155 #include <contrib/dev/acpica/include/acdisasm.h>
  156 
  157 
  158 #define _COMPONENT          ACPI_CA_DEBUGGER
  159         ACPI_MODULE_NAME    ("dbresrc")
  160 
  161 
  162 /* Dispatch tables for Resource disassembly functions */
  163 
  164 static ACPI_RESOURCE_HANDLER    AcpiGbl_DmResourceDispatch [] =
  165 {
  166     /* Small descriptors */
  167 
  168     NULL,                           /* 0x00, Reserved */
  169     NULL,                           /* 0x01, Reserved */
  170     NULL,                           /* 0x02, Reserved */
  171     NULL,                           /* 0x03, Reserved */
  172     AcpiDmIrqDescriptor,            /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
  173     AcpiDmDmaDescriptor,            /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
  174     AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
  175     AcpiDmEndDependentDescriptor,   /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
  176     AcpiDmIoDescriptor,             /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
  177     AcpiDmFixedIoDescriptor,        /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
  178     AcpiDmFixedDmaDescriptor,       /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */
  179     NULL,                           /* 0x0B, Reserved */
  180     NULL,                           /* 0x0C, Reserved */
  181     NULL,                           /* 0x0D, Reserved */
  182     AcpiDmVendorSmallDescriptor,    /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
  183     NULL,                           /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
  184 
  185     /* Large descriptors */
  186 
  187     NULL,                           /* 0x00, Reserved */
  188     AcpiDmMemory24Descriptor,       /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
  189     AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
  190     NULL,                           /* 0x03, Reserved */
  191     AcpiDmVendorLargeDescriptor,    /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
  192     AcpiDmMemory32Descriptor,       /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
  193     AcpiDmFixedMemory32Descriptor,  /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
  194     AcpiDmDwordDescriptor,          /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
  195     AcpiDmWordDescriptor,           /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
  196     AcpiDmInterruptDescriptor,      /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
  197     AcpiDmQwordDescriptor,          /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
  198     AcpiDmExtendedDescriptor,       /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
  199     AcpiDmGpioDescriptor,           /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
  200     AcpiDmPinFunctionDescriptor,    /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
  201     AcpiDmSerialBusDescriptor,      /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
  202     AcpiDmPinConfigDescriptor,      /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
  203     AcpiDmPinGroupDescriptor,       /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
  204     AcpiDmPinGroupFunctionDescriptor, /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
  205     AcpiDmPinGroupConfigDescriptor, /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
  206 };
  207 
  208 
  209 /* Only used for single-threaded applications */
  210 /* TBD: remove when name is passed as parameter to the dump functions */
  211 
  212 static UINT32               ResourceName;
  213 
  214 
  215 /*******************************************************************************
  216  *
  217  * FUNCTION:    AcpiDmDescriptorName
  218  *
  219  * PARAMETERS:  None
  220  *
  221  * RETURN:      None
  222  *
  223  * DESCRIPTION: Emit a name for the descriptor if one is present (indicated
  224  *              by the name being changed from the default name.) A name is only
  225  *              emitted if a reference to the descriptor has been made somewhere
  226  *              in the original ASL code.
  227  *
  228  ******************************************************************************/
  229 
  230 void
  231 AcpiDmDescriptorName (
  232     void)
  233 {
  234 
  235     if (ResourceName == ACPI_DEFAULT_RESNAME)
  236     {
  237         return;
  238     }
  239 
  240     AcpiOsPrintf ("%4.4s", (char *) &ResourceName);
  241 }
  242 
  243 
  244 /*******************************************************************************
  245  *
  246  * FUNCTION:    AcpiDmDumpInteger*
  247  *
  248  * PARAMETERS:  Value               - Value to emit
  249  *              Name                - Associated name (emitted as a comment)
  250  *
  251  * RETURN:      None
  252  *
  253  * DESCRIPTION: Integer output helper functions
  254  *
  255  ******************************************************************************/
  256 
  257 void
  258 AcpiDmDumpInteger8 (
  259     UINT8                   Value,
  260     const char              *Name)
  261 {
  262     AcpiOsPrintf ("0x%2.2X,               // %s\n", Value, Name);
  263 }
  264 
  265 void
  266 AcpiDmDumpInteger16 (
  267     UINT16                  Value,
  268     const char              *Name)
  269 {
  270     AcpiOsPrintf ("0x%4.4X,             // %s\n", Value, Name);
  271 }
  272 
  273 void
  274 AcpiDmDumpInteger32 (
  275     UINT32                  Value,
  276     const char              *Name)
  277 {
  278     AcpiOsPrintf ("0x%8.8X,         // %s\n", Value, Name);
  279 }
  280 
  281 void
  282 AcpiDmDumpInteger64 (
  283     UINT64                  Value,
  284     const char              *Name)
  285 {
  286     AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name);
  287 }
  288 
  289 
  290 /*******************************************************************************
  291  *
  292  * FUNCTION:    AcpiDmBitList
  293  *
  294  * PARAMETERS:  Mask            - 16-bit value corresponding to 16 interrupt
  295  *                                or DMA values
  296  *
  297  * RETURN:      None
  298  *
  299  * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels.
  300  *
  301  ******************************************************************************/
  302 
  303 void
  304 AcpiDmBitList (
  305     UINT16                  Mask)
  306 {
  307     UINT32                  i;
  308     BOOLEAN                 Previous = FALSE;
  309 
  310 
  311     /* Open the initializer list */
  312 
  313     AcpiOsPrintf ("{");
  314 
  315     /* Examine each bit */
  316 
  317     for (i = 0; i < 16; i++)
  318     {
  319         /* Only interested in bits that are set to 1 */
  320 
  321         if (Mask & 1)
  322         {
  323             if (Previous)
  324             {
  325                 AcpiOsPrintf (",");
  326             }
  327 
  328             Previous = TRUE;
  329             AcpiOsPrintf ("%u", i);
  330         }
  331 
  332         Mask >>= 1;
  333     }
  334 
  335     /* Close list */
  336 
  337     AcpiOsPrintf ("}\n");
  338 }
  339 
  340 
  341 /*******************************************************************************
  342  *
  343  * FUNCTION:    AcpiDmResourceTemplate
  344  *
  345  * PARAMETERS:  Info            - Current parse tree walk info
  346  *              ByteData        - Pointer to the byte list data
  347  *              ByteCount       - Length of the byte list
  348  *
  349  * RETURN:      None
  350  *
  351  * DESCRIPTION: Dump the contents of a Resource Template containing a set of
  352  *              Resource Descriptors.
  353  *
  354  ******************************************************************************/
  355 
  356 void
  357 AcpiDmResourceTemplate (
  358     ACPI_OP_WALK_INFO       *Info,
  359     ACPI_PARSE_OBJECT       *Op,
  360     UINT8                   *ByteData,
  361     UINT32                  ByteCount)
  362 {
  363     ACPI_STATUS             Status;
  364     UINT32                  CurrentByteOffset;
  365     UINT8                   ResourceType;
  366     UINT32                  ResourceLength;
  367     void                    *Aml;
  368     UINT32                  Level;
  369     BOOLEAN                 DependentFns = FALSE;
  370     UINT8                   ResourceIndex;
  371     ACPI_NAMESPACE_NODE     *Node;
  372 
  373 
  374     if (Op->Asl.AmlOpcode != AML_FIELD_OP)
  375     {
  376         Info->MappingOp = Op;
  377     }
  378 
  379     Level = Info->Level;
  380     ResourceName = ACPI_DEFAULT_RESNAME;
  381     Node = Op->Common.Node;
  382     if (Node)
  383     {
  384         Node = Node->Child;
  385     }
  386 
  387     for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;)
  388     {
  389         Aml = &ByteData[CurrentByteOffset];
  390 
  391         /* Get the descriptor type and length */
  392 
  393         ResourceType = AcpiUtGetResourceType (Aml);
  394         ResourceLength = AcpiUtGetResourceLength (Aml);
  395 
  396         /* Validate the Resource Type and Resource Length */
  397 
  398         Status = AcpiUtValidateResource (NULL, Aml, &ResourceIndex);
  399         if (ACPI_FAILURE (Status))
  400         {
  401             AcpiOsPrintf (
  402                 "/*** Could not validate Resource, type (%X) %s***/\n",
  403                 ResourceType, AcpiFormatException (Status));
  404             return;
  405         }
  406 
  407         /* Point to next descriptor */
  408 
  409         CurrentByteOffset += AcpiUtGetDescriptorLength (Aml);
  410 
  411         /* Descriptor pre-processing */
  412 
  413         switch (ResourceType)
  414         {
  415         case ACPI_RESOURCE_NAME_START_DEPENDENT:
  416 
  417             /* Finish a previous StartDependentFns */
  418 
  419             if (DependentFns)
  420             {
  421                 Level--;
  422                 AcpiDmIndent (Level);
  423                 AcpiOsPrintf ("}\n");
  424             }
  425             break;
  426 
  427         case ACPI_RESOURCE_NAME_END_DEPENDENT:
  428 
  429             Level--;
  430             DependentFns = FALSE;
  431             break;
  432 
  433         case ACPI_RESOURCE_NAME_END_TAG:
  434 
  435             /* Normal exit, the resource list is finished */
  436 
  437             if (DependentFns)
  438             {
  439                 /*
  440                  * Close an open StartDependentDescriptor. This indicates a
  441                  * missing EndDependentDescriptor.
  442                  */
  443                 Level--;
  444 
  445                 /* Go ahead and insert EndDependentFn() */
  446 
  447                 AcpiDmEndDependentDescriptor (Info, Aml, ResourceLength, Level);
  448 
  449                 AcpiDmIndent (Level);
  450                 AcpiOsPrintf (
  451                     "/*** Disassembler: inserted "
  452                     "missing EndDependentFn () ***/\n");
  453             }
  454             return;
  455 
  456         default:
  457 
  458             break;
  459         }
  460 
  461         /* Disassemble the resource structure */
  462 
  463         if (Node)
  464         {
  465             ResourceName = Node->Name.Integer;
  466             Node = Node->Peer;
  467         }
  468 
  469         AcpiGbl_DmResourceDispatch [ResourceIndex] (
  470             Info, Aml, ResourceLength, Level);
  471 
  472         /* Descriptor post-processing */
  473 
  474         if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT)
  475         {
  476             DependentFns = TRUE;
  477             Level++;
  478         }
  479     }
  480 }
  481 
  482 
  483 /*******************************************************************************
  484  *
  485  * FUNCTION:    AcpiDmIsResourceTemplate
  486  *
  487  * PARAMETERS:  WalkState           - Current walk info
  488  *              Op                  - Buffer Op to be examined
  489  *
  490  * RETURN:      Status. AE_OK if valid template
  491  *
  492  * DESCRIPTION: Walk a byte list to determine if it consists of a valid set
  493  *              of resource descriptors. Nothing is output.
  494  *
  495  ******************************************************************************/
  496 
  497 ACPI_STATUS
  498 AcpiDmIsResourceTemplate (
  499     ACPI_WALK_STATE         *WalkState,
  500     ACPI_PARSE_OBJECT       *Op)
  501 {
  502     ACPI_STATUS             Status;
  503     ACPI_PARSE_OBJECT       *NextOp;
  504     UINT8                   *Aml;
  505     UINT8                   *EndAml;
  506     UINT32                  BufferLength;
  507     UINT32                  DeclaredBufferLength;
  508 
  509 
  510     /* This op must be a buffer */
  511 
  512     if (Op->Common.AmlOpcode != AML_BUFFER_OP)
  513     {
  514         return (AE_TYPE);
  515     }
  516 
  517     /*
  518      * Get the declared length of the buffer.
  519      * This is the nn in "Buffer (nn)"
  520      */
  521     NextOp = Op->Common.Value.Arg;
  522     if (!NextOp)
  523     {
  524         AcpiOsPrintf ("NULL byte list in buffer\n");
  525         return (AE_TYPE);
  526     }
  527 
  528     DeclaredBufferLength = NextOp->Common.Value.Size;
  529 
  530     /* Get the length of the raw initialization byte list */
  531 
  532     NextOp = NextOp->Common.Next;
  533     if (!NextOp)
  534     {
  535         return (AE_TYPE);
  536     }
  537 
  538     Aml = NextOp->Named.Data;
  539     BufferLength = NextOp->Common.Value.Size;
  540 
  541     /*
  542      * Any buffer smaller than one byte cannot possibly be a resource
  543      * template. Two bytes could possibly be a "NULL" resource template
  544      * with a lone end tag descriptor (as generated via
  545      * "ResourceTemplate(){}"), but this would be an extremely unusual
  546      * case, as the template would be essentially useless. The disassembler
  547      * therefore does not recognize any two-byte buffer as a resource
  548      * template.
  549      */
  550     if (BufferLength <= 2)
  551     {
  552         return (AE_TYPE);
  553     }
  554 
  555     /*
  556      * Not a template if declared buffer length != actual length of the
  557      * initialization byte list. Because the resource macros will create
  558      * a buffer of the exact required length (buffer length will be equal
  559      * to the actual length).
  560      *
  561      * NOTE (April 2017): Resource templates with this issue have been
  562      * seen in the field. We still don't want to attempt to disassemble
  563      * a buffer like this to a resource template because this output
  564      * would not match the original input buffer (it would be shorter
  565      * than the original when the disassembled code is recompiled).
  566      * Basically, a buffer like this appears to be hand crafted in the
  567      * first place, so just emitting a buffer object instead of a
  568      * resource template more closely resembles the original ASL code.
  569      */
  570     if (DeclaredBufferLength != BufferLength)
  571     {
  572         return (AE_TYPE);
  573     }
  574 
  575     /* Walk the byte list, abort on any invalid descriptor type or length */
  576 
  577     Status = AcpiUtWalkAmlResources (WalkState, Aml, BufferLength,
  578         NULL, ACPI_CAST_INDIRECT_PTR (void, &EndAml));
  579     if (ACPI_FAILURE (Status))
  580     {
  581         return (AE_TYPE);
  582     }
  583 
  584     /*
  585      * For the resource template to be valid, one EndTag must appear
  586      * at the very end of the ByteList, not before. (For proper disassembly
  587      * of a ResourceTemplate, the buffer must not have any extra data after
  588      * the EndTag.)
  589      */
  590     if ((Aml + BufferLength - sizeof (AML_RESOURCE_END_TAG)) != EndAml)
  591     {
  592         return (AE_AML_NO_RESOURCE_END_TAG);
  593     }
  594 
  595     /*
  596      * All resource descriptors are valid, therefore this list appears
  597      * to be a valid resource template
  598      */
  599     return (AE_OK);
  600 }

Cache object: 12fc7597a479beaee563b57c85b351e3


[ 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.