Home | History | Annotate | Line # | Download | only in compiler
dtsubtable.c revision 1.1.1.3.2.1
      1          1.1  jruoho /******************************************************************************
      2          1.1  jruoho  *
      3          1.1  jruoho  * Module Name: dtsubtable.c - handling of subtables within ACPI tables
      4          1.1  jruoho  *
      5          1.1  jruoho  *****************************************************************************/
      6          1.1  jruoho 
      7      1.1.1.2  jruoho /*
      8  1.1.1.3.2.1    yamt  * Copyright (C) 2000 - 2013, Intel Corp.
      9          1.1  jruoho  * All rights reserved.
     10          1.1  jruoho  *
     11      1.1.1.2  jruoho  * Redistribution and use in source and binary forms, with or without
     12      1.1.1.2  jruoho  * modification, are permitted provided that the following conditions
     13      1.1.1.2  jruoho  * are met:
     14      1.1.1.2  jruoho  * 1. Redistributions of source code must retain the above copyright
     15      1.1.1.2  jruoho  *    notice, this list of conditions, and the following disclaimer,
     16      1.1.1.2  jruoho  *    without modification.
     17      1.1.1.2  jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18      1.1.1.2  jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19      1.1.1.2  jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20      1.1.1.2  jruoho  *    including a substantially similar Disclaimer requirement for further
     21      1.1.1.2  jruoho  *    binary redistribution.
     22      1.1.1.2  jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23      1.1.1.2  jruoho  *    of any contributors may be used to endorse or promote products derived
     24      1.1.1.2  jruoho  *    from this software without specific prior written permission.
     25      1.1.1.2  jruoho  *
     26      1.1.1.2  jruoho  * Alternatively, this software may be distributed under the terms of the
     27      1.1.1.2  jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28      1.1.1.2  jruoho  * Software Foundation.
     29      1.1.1.2  jruoho  *
     30      1.1.1.2  jruoho  * NO WARRANTY
     31      1.1.1.2  jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32      1.1.1.2  jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33      1.1.1.2  jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34      1.1.1.2  jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35      1.1.1.2  jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36      1.1.1.2  jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37      1.1.1.2  jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38      1.1.1.2  jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39      1.1.1.2  jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40      1.1.1.2  jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41      1.1.1.2  jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42      1.1.1.2  jruoho  */
     43          1.1  jruoho 
     44          1.1  jruoho #define __DTSUBTABLE_C__
     45          1.1  jruoho 
     46          1.1  jruoho #include "aslcompiler.h"
     47          1.1  jruoho #include "dtcompiler.h"
     48          1.1  jruoho 
     49          1.1  jruoho #define _COMPONENT          DT_COMPILER
     50          1.1  jruoho         ACPI_MODULE_NAME    ("dtsubtable")
     51          1.1  jruoho 
     52          1.1  jruoho 
     53          1.1  jruoho /******************************************************************************
     54          1.1  jruoho  *
     55          1.1  jruoho  * FUNCTION:    DtCreateSubtable
     56          1.1  jruoho  *
     57          1.1  jruoho  * PARAMETERS:  Buffer              - Input buffer
     58          1.1  jruoho  *              Length              - Buffer length
     59          1.1  jruoho  *              RetSubtable         - Returned newly created subtable
     60          1.1  jruoho  *
     61          1.1  jruoho  * RETURN:      None
     62          1.1  jruoho  *
     63          1.1  jruoho  * DESCRIPTION: Create a subtable that is not listed with ACPI_DMTABLE_INFO
     64          1.1  jruoho  *              For example, FACS has 24 bytes reserved at the end
     65          1.1  jruoho  *              and it's not listed at AcpiDmTableInfoFacs
     66          1.1  jruoho  *
     67          1.1  jruoho  *****************************************************************************/
     68          1.1  jruoho 
     69          1.1  jruoho void
     70          1.1  jruoho DtCreateSubtable (
     71          1.1  jruoho     UINT8                   *Buffer,
     72          1.1  jruoho     UINT32                  Length,
     73          1.1  jruoho     DT_SUBTABLE             **RetSubtable)
     74          1.1  jruoho {
     75          1.1  jruoho     DT_SUBTABLE             *Subtable;
     76          1.1  jruoho 
     77          1.1  jruoho 
     78          1.1  jruoho     Subtable = UtLocalCalloc (sizeof (DT_SUBTABLE));
     79          1.1  jruoho 
     80          1.1  jruoho     /* Create a new buffer for the subtable data */
     81          1.1  jruoho 
     82          1.1  jruoho     Subtable->Buffer = UtLocalCalloc (Length);
     83          1.1  jruoho     ACPI_MEMCPY (Subtable->Buffer, Buffer, Length);
     84          1.1  jruoho 
     85          1.1  jruoho     Subtable->Length = Length;
     86          1.1  jruoho     Subtable->TotalLength = Length;
     87          1.1  jruoho 
     88          1.1  jruoho     *RetSubtable = Subtable;
     89          1.1  jruoho }
     90          1.1  jruoho 
     91          1.1  jruoho 
     92          1.1  jruoho /******************************************************************************
     93          1.1  jruoho  *
     94          1.1  jruoho  * FUNCTION:    DtInsertSubtable
     95          1.1  jruoho  *
     96          1.1  jruoho  * PARAMETERS:  ParentTable         - The Parent of the new subtable
     97          1.1  jruoho  *              Subtable            - The new subtable to insert
     98          1.1  jruoho  *
     99          1.1  jruoho  * RETURN:      None
    100          1.1  jruoho  *
    101          1.1  jruoho  * DESCRIPTION: Insert the new subtable to the parent table
    102          1.1  jruoho  *
    103          1.1  jruoho  *****************************************************************************/
    104          1.1  jruoho 
    105          1.1  jruoho void
    106          1.1  jruoho DtInsertSubtable (
    107          1.1  jruoho     DT_SUBTABLE             *ParentTable,
    108          1.1  jruoho     DT_SUBTABLE             *Subtable)
    109          1.1  jruoho {
    110          1.1  jruoho     DT_SUBTABLE             *ChildTable;
    111          1.1  jruoho 
    112          1.1  jruoho 
    113          1.1  jruoho     Subtable->Peer = NULL;
    114          1.1  jruoho     Subtable->Parent = ParentTable;
    115  1.1.1.3.2.1    yamt     Subtable->Depth = ParentTable->Depth + 1;
    116          1.1  jruoho 
    117          1.1  jruoho     /* Link the new entry into the child list */
    118          1.1  jruoho 
    119          1.1  jruoho     if (!ParentTable->Child)
    120          1.1  jruoho     {
    121          1.1  jruoho         ParentTable->Child = Subtable;
    122          1.1  jruoho     }
    123          1.1  jruoho     else
    124          1.1  jruoho     {
    125          1.1  jruoho         /* Walk to the end of the child list */
    126          1.1  jruoho 
    127          1.1  jruoho         ChildTable = ParentTable->Child;
    128          1.1  jruoho         while (ChildTable->Peer)
    129          1.1  jruoho         {
    130          1.1  jruoho             ChildTable = ChildTable->Peer;
    131          1.1  jruoho         }
    132          1.1  jruoho 
    133          1.1  jruoho         /* Add new subtable at the end of the child list */
    134          1.1  jruoho 
    135          1.1  jruoho         ChildTable->Peer = Subtable;
    136          1.1  jruoho     }
    137          1.1  jruoho }
    138          1.1  jruoho 
    139          1.1  jruoho 
    140          1.1  jruoho /******************************************************************************
    141          1.1  jruoho  *
    142          1.1  jruoho  * FUNCTION:    DtPushSubtable
    143          1.1  jruoho  *
    144          1.1  jruoho  * PARAMETERS:  Subtable            - Subtable to push
    145          1.1  jruoho  *
    146          1.1  jruoho  * RETURN:      None
    147          1.1  jruoho  *
    148          1.1  jruoho  * DESCRIPTION: Push a subtable onto a subtable stack
    149          1.1  jruoho  *
    150          1.1  jruoho  *****************************************************************************/
    151          1.1  jruoho 
    152          1.1  jruoho void
    153          1.1  jruoho DtPushSubtable (
    154          1.1  jruoho     DT_SUBTABLE             *Subtable)
    155          1.1  jruoho {
    156          1.1  jruoho 
    157          1.1  jruoho     Subtable->StackTop = Gbl_SubtableStack;
    158          1.1  jruoho     Gbl_SubtableStack = Subtable;
    159          1.1  jruoho }
    160          1.1  jruoho 
    161          1.1  jruoho 
    162          1.1  jruoho /******************************************************************************
    163          1.1  jruoho  *
    164          1.1  jruoho  * FUNCTION:    DtPopSubtable
    165          1.1  jruoho  *
    166          1.1  jruoho  * PARAMETERS:  None
    167          1.1  jruoho  *
    168          1.1  jruoho  * RETURN:      None
    169          1.1  jruoho  *
    170          1.1  jruoho  * DESCRIPTION: Pop a subtable from a subtable stack. Uses global SubtableStack
    171          1.1  jruoho  *
    172          1.1  jruoho  *****************************************************************************/
    173          1.1  jruoho 
    174          1.1  jruoho void
    175          1.1  jruoho DtPopSubtable (
    176          1.1  jruoho     void)
    177          1.1  jruoho {
    178          1.1  jruoho     DT_SUBTABLE             *Subtable;
    179          1.1  jruoho 
    180          1.1  jruoho 
    181          1.1  jruoho     Subtable = Gbl_SubtableStack;
    182          1.1  jruoho 
    183          1.1  jruoho     if (Subtable)
    184          1.1  jruoho     {
    185          1.1  jruoho         Gbl_SubtableStack = Subtable->StackTop;
    186          1.1  jruoho     }
    187          1.1  jruoho }
    188          1.1  jruoho 
    189          1.1  jruoho 
    190          1.1  jruoho /******************************************************************************
    191          1.1  jruoho  *
    192          1.1  jruoho  * FUNCTION:    DtPeekSubtable
    193          1.1  jruoho  *
    194          1.1  jruoho  * PARAMETERS:  None
    195          1.1  jruoho  *
    196          1.1  jruoho  * RETURN:      The subtable on top of stack
    197          1.1  jruoho  *
    198          1.1  jruoho  * DESCRIPTION: Get the subtable on top of stack
    199          1.1  jruoho  *
    200          1.1  jruoho  *****************************************************************************/
    201          1.1  jruoho 
    202          1.1  jruoho DT_SUBTABLE *
    203          1.1  jruoho DtPeekSubtable (
    204          1.1  jruoho     void)
    205          1.1  jruoho {
    206          1.1  jruoho 
    207          1.1  jruoho     return (Gbl_SubtableStack);
    208          1.1  jruoho }
    209          1.1  jruoho 
    210          1.1  jruoho 
    211          1.1  jruoho /******************************************************************************
    212          1.1  jruoho  *
    213          1.1  jruoho  * FUNCTION:    DtGetNextSubtable
    214          1.1  jruoho  *
    215          1.1  jruoho  * PARAMETERS:  ParentTable         - Parent table whose children we are
    216          1.1  jruoho  *                                    getting
    217          1.1  jruoho  *              ChildTable          - Previous child that was found.
    218          1.1  jruoho  *                                    The NEXT child will be returned
    219          1.1  jruoho  *
    220          1.1  jruoho  * RETURN:      Pointer to the NEXT child or NULL if none is found.
    221          1.1  jruoho  *
    222          1.1  jruoho  * DESCRIPTION: Return the next peer subtable within the tree.
    223          1.1  jruoho  *
    224          1.1  jruoho  *****************************************************************************/
    225          1.1  jruoho 
    226          1.1  jruoho DT_SUBTABLE *
    227          1.1  jruoho DtGetNextSubtable (
    228          1.1  jruoho     DT_SUBTABLE             *ParentTable,
    229          1.1  jruoho     DT_SUBTABLE             *ChildTable)
    230          1.1  jruoho {
    231          1.1  jruoho     ACPI_FUNCTION_ENTRY ();
    232          1.1  jruoho 
    233          1.1  jruoho 
    234          1.1  jruoho     if (!ChildTable)
    235          1.1  jruoho     {
    236          1.1  jruoho         /* It's really the parent's _scope_ that we want */
    237          1.1  jruoho 
    238          1.1  jruoho         return (ParentTable->Child);
    239          1.1  jruoho     }
    240          1.1  jruoho 
    241          1.1  jruoho     /* Otherwise just return the next peer (NULL if at end-of-list) */
    242          1.1  jruoho 
    243          1.1  jruoho     return (ChildTable->Peer);
    244          1.1  jruoho }
    245          1.1  jruoho 
    246          1.1  jruoho 
    247          1.1  jruoho /******************************************************************************
    248          1.1  jruoho  *
    249          1.1  jruoho  * FUNCTION:    DtGetParentSubtable
    250          1.1  jruoho  *
    251          1.1  jruoho  * PARAMETERS:  Subtable            - Current subtable
    252          1.1  jruoho  *
    253          1.1  jruoho  * RETURN:      Parent of the given subtable
    254          1.1  jruoho  *
    255          1.1  jruoho  * DESCRIPTION: Get the parent of the given subtable in the tree
    256          1.1  jruoho  *
    257          1.1  jruoho  *****************************************************************************/
    258          1.1  jruoho 
    259          1.1  jruoho DT_SUBTABLE *
    260          1.1  jruoho DtGetParentSubtable (
    261          1.1  jruoho     DT_SUBTABLE             *Subtable)
    262          1.1  jruoho {
    263          1.1  jruoho 
    264          1.1  jruoho     if (!Subtable)
    265          1.1  jruoho     {
    266          1.1  jruoho         return (NULL);
    267          1.1  jruoho     }
    268          1.1  jruoho 
    269          1.1  jruoho     return (Subtable->Parent);
    270          1.1  jruoho }
    271          1.1  jruoho 
    272          1.1  jruoho 
    273          1.1  jruoho /******************************************************************************
    274          1.1  jruoho  *
    275          1.1  jruoho  * FUNCTION:    DtGetSubtableLength
    276          1.1  jruoho  *
    277          1.1  jruoho  * PARAMETERS:  Field               - Current field list pointer
    278          1.1  jruoho  *              Info                - Data table info
    279          1.1  jruoho  *
    280          1.1  jruoho  * RETURN:      Subtable length
    281          1.1  jruoho  *
    282          1.1  jruoho  * DESCRIPTION: Get length of bytes needed to compile the subtable
    283          1.1  jruoho  *
    284          1.1  jruoho  *****************************************************************************/
    285          1.1  jruoho 
    286          1.1  jruoho UINT32
    287          1.1  jruoho DtGetSubtableLength (
    288          1.1  jruoho     DT_FIELD                *Field,
    289          1.1  jruoho     ACPI_DMTABLE_INFO       *Info)
    290          1.1  jruoho {
    291          1.1  jruoho     UINT32                  ByteLength = 0;
    292      1.1.1.3  jruoho     UINT8                   Step;
    293      1.1.1.3  jruoho     UINT8                   i;
    294          1.1  jruoho 
    295          1.1  jruoho 
    296          1.1  jruoho     /* Walk entire Info table; Null name terminates */
    297          1.1  jruoho 
    298          1.1  jruoho     for (; Info->Name; Info++)
    299          1.1  jruoho     {
    300  1.1.1.3.2.1    yamt         if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
    301  1.1.1.3.2.1    yamt         {
    302  1.1.1.3.2.1    yamt             continue;
    303  1.1.1.3.2.1    yamt         }
    304  1.1.1.3.2.1    yamt 
    305      1.1.1.3  jruoho         if (!Field)
    306      1.1.1.3  jruoho         {
    307      1.1.1.3  jruoho             goto Error;
    308      1.1.1.3  jruoho         }
    309      1.1.1.3  jruoho 
    310          1.1  jruoho         ByteLength += DtGetFieldLength (Field, Info);
    311      1.1.1.3  jruoho 
    312      1.1.1.3  jruoho         switch (Info->Opcode)
    313      1.1.1.3  jruoho         {
    314      1.1.1.3  jruoho         case ACPI_DMT_GAS:
    315  1.1.1.3.2.1    yamt 
    316      1.1.1.3  jruoho             Step = 5;
    317      1.1.1.3  jruoho             break;
    318      1.1.1.3  jruoho 
    319      1.1.1.3  jruoho         case ACPI_DMT_HESTNTFY:
    320  1.1.1.3.2.1    yamt 
    321      1.1.1.3  jruoho             Step = 9;
    322      1.1.1.3  jruoho             break;
    323      1.1.1.3  jruoho 
    324      1.1.1.3  jruoho         default:
    325  1.1.1.3.2.1    yamt 
    326      1.1.1.3  jruoho             Step = 1;
    327      1.1.1.3  jruoho             break;
    328      1.1.1.3  jruoho         }
    329      1.1.1.3  jruoho 
    330      1.1.1.3  jruoho         for (i = 0; i < Step; i++)
    331      1.1.1.3  jruoho         {
    332      1.1.1.3  jruoho             if (!Field)
    333      1.1.1.3  jruoho             {
    334      1.1.1.3  jruoho                 goto Error;
    335      1.1.1.3  jruoho             }
    336      1.1.1.3  jruoho 
    337      1.1.1.3  jruoho             Field = Field->Next;
    338      1.1.1.3  jruoho         }
    339          1.1  jruoho     }
    340          1.1  jruoho 
    341          1.1  jruoho     return (ByteLength);
    342      1.1.1.3  jruoho 
    343      1.1.1.3  jruoho Error:
    344      1.1.1.3  jruoho     if (!Field)
    345      1.1.1.3  jruoho     {
    346  1.1.1.3.2.1    yamt         snprintf (MsgBuffer, sizeof(MsgBuffer), "Found NULL field - Field name \"%s\" needed",
    347      1.1.1.3  jruoho             Info->Name);
    348      1.1.1.3  jruoho         DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, MsgBuffer);
    349      1.1.1.3  jruoho     }
    350      1.1.1.3  jruoho 
    351      1.1.1.3  jruoho     return (ASL_EOF);
    352          1.1  jruoho }
    353          1.1  jruoho 
    354          1.1  jruoho 
    355          1.1  jruoho /******************************************************************************
    356          1.1  jruoho  *
    357          1.1  jruoho  * FUNCTION:    DtSetSubtableLength
    358          1.1  jruoho  *
    359          1.1  jruoho  * PARAMETERS:  Subtable            - Subtable
    360          1.1  jruoho  *
    361          1.1  jruoho  * RETURN:      None
    362          1.1  jruoho  *
    363          1.1  jruoho  * DESCRIPTION: Set length of the subtable into its length field
    364          1.1  jruoho  *
    365          1.1  jruoho  *****************************************************************************/
    366          1.1  jruoho 
    367          1.1  jruoho void
    368          1.1  jruoho DtSetSubtableLength (
    369          1.1  jruoho     DT_SUBTABLE             *Subtable)
    370          1.1  jruoho {
    371          1.1  jruoho 
    372          1.1  jruoho     if (!Subtable->LengthField)
    373          1.1  jruoho     {
    374          1.1  jruoho         return;
    375          1.1  jruoho     }
    376          1.1  jruoho 
    377          1.1  jruoho     ACPI_MEMCPY (Subtable->LengthField, &Subtable->TotalLength,
    378          1.1  jruoho         Subtable->SizeOfLengthField);
    379          1.1  jruoho }
    380