Home | History | Annotate | Line # | Download | only in compiler
asloperands.c revision 1.1.1.2.8.2
      1  1.1.1.2.8.2  jruoho 
      2  1.1.1.2.8.2  jruoho /******************************************************************************
      3  1.1.1.2.8.2  jruoho  *
      4  1.1.1.2.8.2  jruoho  * Module Name: asloperands - AML operand processing
      5  1.1.1.2.8.2  jruoho  *
      6  1.1.1.2.8.2  jruoho  *****************************************************************************/
      7  1.1.1.2.8.2  jruoho 
      8  1.1.1.2.8.2  jruoho /*
      9  1.1.1.2.8.2  jruoho  * Copyright (C) 2000 - 2011, Intel Corp.
     10  1.1.1.2.8.2  jruoho  * All rights reserved.
     11  1.1.1.2.8.2  jruoho  *
     12  1.1.1.2.8.2  jruoho  * Redistribution and use in source and binary forms, with or without
     13  1.1.1.2.8.2  jruoho  * modification, are permitted provided that the following conditions
     14  1.1.1.2.8.2  jruoho  * are met:
     15  1.1.1.2.8.2  jruoho  * 1. Redistributions of source code must retain the above copyright
     16  1.1.1.2.8.2  jruoho  *    notice, this list of conditions, and the following disclaimer,
     17  1.1.1.2.8.2  jruoho  *    without modification.
     18  1.1.1.2.8.2  jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  1.1.1.2.8.2  jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  1.1.1.2.8.2  jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  1.1.1.2.8.2  jruoho  *    including a substantially similar Disclaimer requirement for further
     22  1.1.1.2.8.2  jruoho  *    binary redistribution.
     23  1.1.1.2.8.2  jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     24  1.1.1.2.8.2  jruoho  *    of any contributors may be used to endorse or promote products derived
     25  1.1.1.2.8.2  jruoho  *    from this software without specific prior written permission.
     26  1.1.1.2.8.2  jruoho  *
     27  1.1.1.2.8.2  jruoho  * Alternatively, this software may be distributed under the terms of the
     28  1.1.1.2.8.2  jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     29  1.1.1.2.8.2  jruoho  * Software Foundation.
     30  1.1.1.2.8.2  jruoho  *
     31  1.1.1.2.8.2  jruoho  * NO WARRANTY
     32  1.1.1.2.8.2  jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  1.1.1.2.8.2  jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  1.1.1.2.8.2  jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  1.1.1.2.8.2  jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  1.1.1.2.8.2  jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  1.1.1.2.8.2  jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  1.1.1.2.8.2  jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  1.1.1.2.8.2  jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  1.1.1.2.8.2  jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  1.1.1.2.8.2  jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  1.1.1.2.8.2  jruoho  * POSSIBILITY OF SUCH DAMAGES.
     43  1.1.1.2.8.2  jruoho  */
     44  1.1.1.2.8.2  jruoho 
     45  1.1.1.2.8.2  jruoho 
     46  1.1.1.2.8.2  jruoho #include "aslcompiler.h"
     47  1.1.1.2.8.2  jruoho #include "aslcompiler.y.h"
     48  1.1.1.2.8.2  jruoho #include "amlcode.h"
     49  1.1.1.2.8.2  jruoho 
     50  1.1.1.2.8.2  jruoho #define _COMPONENT          ACPI_COMPILER
     51  1.1.1.2.8.2  jruoho         ACPI_MODULE_NAME    ("asloperands")
     52  1.1.1.2.8.2  jruoho 
     53  1.1.1.2.8.2  jruoho /* Local prototypes */
     54  1.1.1.2.8.2  jruoho 
     55  1.1.1.2.8.2  jruoho static void
     56  1.1.1.2.8.2  jruoho OpnDoField (
     57  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     58  1.1.1.2.8.2  jruoho 
     59  1.1.1.2.8.2  jruoho static void
     60  1.1.1.2.8.2  jruoho OpnDoBankField (
     61  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     62  1.1.1.2.8.2  jruoho 
     63  1.1.1.2.8.2  jruoho static void
     64  1.1.1.2.8.2  jruoho OpnDoBuffer (
     65  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     66  1.1.1.2.8.2  jruoho 
     67  1.1.1.2.8.2  jruoho static void
     68  1.1.1.2.8.2  jruoho OpnDoDefinitionBlock (
     69  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     70  1.1.1.2.8.2  jruoho 
     71  1.1.1.2.8.2  jruoho static void
     72  1.1.1.2.8.2  jruoho OpnDoFieldCommon (
     73  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *FieldOp,
     74  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     75  1.1.1.2.8.2  jruoho 
     76  1.1.1.2.8.2  jruoho static void
     77  1.1.1.2.8.2  jruoho OpnDoIndexField (
     78  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     79  1.1.1.2.8.2  jruoho 
     80  1.1.1.2.8.2  jruoho static void
     81  1.1.1.2.8.2  jruoho OpnDoLoadTable (
     82  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     83  1.1.1.2.8.2  jruoho 
     84  1.1.1.2.8.2  jruoho static void
     85  1.1.1.2.8.2  jruoho OpnDoMethod (
     86  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     87  1.1.1.2.8.2  jruoho 
     88  1.1.1.2.8.2  jruoho static void
     89  1.1.1.2.8.2  jruoho OpnDoMutex (
     90  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     91  1.1.1.2.8.2  jruoho 
     92  1.1.1.2.8.2  jruoho static void
     93  1.1.1.2.8.2  jruoho OpnDoRegion (
     94  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     95  1.1.1.2.8.2  jruoho 
     96  1.1.1.2.8.2  jruoho static void
     97  1.1.1.2.8.2  jruoho OpnAttachNameToNode (
     98  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op);
     99  1.1.1.2.8.2  jruoho 
    100  1.1.1.2.8.2  jruoho 
    101  1.1.1.2.8.2  jruoho /*******************************************************************************
    102  1.1.1.2.8.2  jruoho  *
    103  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoMutex
    104  1.1.1.2.8.2  jruoho  *
    105  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    106  1.1.1.2.8.2  jruoho  *
    107  1.1.1.2.8.2  jruoho  * RETURN:      None
    108  1.1.1.2.8.2  jruoho  *
    109  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the operands for the MUTEX ASL keyword.
    110  1.1.1.2.8.2  jruoho  *
    111  1.1.1.2.8.2  jruoho  ******************************************************************************/
    112  1.1.1.2.8.2  jruoho 
    113  1.1.1.2.8.2  jruoho static void
    114  1.1.1.2.8.2  jruoho OpnDoMutex (
    115  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    116  1.1.1.2.8.2  jruoho {
    117  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    118  1.1.1.2.8.2  jruoho 
    119  1.1.1.2.8.2  jruoho 
    120  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    121  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    122  1.1.1.2.8.2  jruoho 
    123  1.1.1.2.8.2  jruoho     if (Next->Asl.Value.Integer > 15)
    124  1.1.1.2.8.2  jruoho     {
    125  1.1.1.2.8.2  jruoho         AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
    126  1.1.1.2.8.2  jruoho     }
    127  1.1.1.2.8.2  jruoho     return;
    128  1.1.1.2.8.2  jruoho }
    129  1.1.1.2.8.2  jruoho 
    130  1.1.1.2.8.2  jruoho 
    131  1.1.1.2.8.2  jruoho /*******************************************************************************
    132  1.1.1.2.8.2  jruoho  *
    133  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoMethod
    134  1.1.1.2.8.2  jruoho  *
    135  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    136  1.1.1.2.8.2  jruoho  *
    137  1.1.1.2.8.2  jruoho  * RETURN:      None
    138  1.1.1.2.8.2  jruoho  *
    139  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the operands for the METHOD ASL keyword.
    140  1.1.1.2.8.2  jruoho  *
    141  1.1.1.2.8.2  jruoho  ******************************************************************************/
    142  1.1.1.2.8.2  jruoho 
    143  1.1.1.2.8.2  jruoho static void
    144  1.1.1.2.8.2  jruoho OpnDoMethod (
    145  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    146  1.1.1.2.8.2  jruoho {
    147  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    148  1.1.1.2.8.2  jruoho 
    149  1.1.1.2.8.2  jruoho     /* Optional arguments for this opcode with defaults */
    150  1.1.1.2.8.2  jruoho 
    151  1.1.1.2.8.2  jruoho     UINT8                   NumArgs = 0;
    152  1.1.1.2.8.2  jruoho     UINT8                   Serialized = 0;
    153  1.1.1.2.8.2  jruoho     UINT8                   Concurrency = 0;
    154  1.1.1.2.8.2  jruoho     UINT8                   MethodFlags;
    155  1.1.1.2.8.2  jruoho 
    156  1.1.1.2.8.2  jruoho 
    157  1.1.1.2.8.2  jruoho     /* Opcode and package length first */
    158  1.1.1.2.8.2  jruoho     /* Method name */
    159  1.1.1.2.8.2  jruoho 
    160  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    161  1.1.1.2.8.2  jruoho 
    162  1.1.1.2.8.2  jruoho     /* Num args */
    163  1.1.1.2.8.2  jruoho 
    164  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    165  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    166  1.1.1.2.8.2  jruoho     {
    167  1.1.1.2.8.2  jruoho         NumArgs = (UINT8) Next->Asl.Value.Integer;
    168  1.1.1.2.8.2  jruoho         Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    169  1.1.1.2.8.2  jruoho     }
    170  1.1.1.2.8.2  jruoho 
    171  1.1.1.2.8.2  jruoho     /* Serialized Flag */
    172  1.1.1.2.8.2  jruoho 
    173  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    174  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    175  1.1.1.2.8.2  jruoho     {
    176  1.1.1.2.8.2  jruoho         Serialized = (UINT8) Next->Asl.Value.Integer;
    177  1.1.1.2.8.2  jruoho         Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    178  1.1.1.2.8.2  jruoho     }
    179  1.1.1.2.8.2  jruoho 
    180  1.1.1.2.8.2  jruoho     /* Concurrency value (valid values are 0-15) */
    181  1.1.1.2.8.2  jruoho 
    182  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    183  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    184  1.1.1.2.8.2  jruoho     {
    185  1.1.1.2.8.2  jruoho         if (Next->Asl.Value.Integer > 15)
    186  1.1.1.2.8.2  jruoho         {
    187  1.1.1.2.8.2  jruoho             AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
    188  1.1.1.2.8.2  jruoho         }
    189  1.1.1.2.8.2  jruoho         Concurrency = (UINT8) Next->Asl.Value.Integer;
    190  1.1.1.2.8.2  jruoho     }
    191  1.1.1.2.8.2  jruoho 
    192  1.1.1.2.8.2  jruoho     /* Put the bits in their proper places */
    193  1.1.1.2.8.2  jruoho 
    194  1.1.1.2.8.2  jruoho     MethodFlags = (UINT8) ((NumArgs & 0x7) |
    195  1.1.1.2.8.2  jruoho                           ((Serialized & 0x1) << 3) |
    196  1.1.1.2.8.2  jruoho                           ((Concurrency & 0xF) << 4));
    197  1.1.1.2.8.2  jruoho 
    198  1.1.1.2.8.2  jruoho     /* Use the last node for the combined flags byte */
    199  1.1.1.2.8.2  jruoho 
    200  1.1.1.2.8.2  jruoho     Next->Asl.Value.Integer = MethodFlags;
    201  1.1.1.2.8.2  jruoho     Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    202  1.1.1.2.8.2  jruoho     Next->Asl.AmlLength = 1;
    203  1.1.1.2.8.2  jruoho     Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
    204  1.1.1.2.8.2  jruoho 
    205  1.1.1.2.8.2  jruoho     /* Save the arg count in the first node */
    206  1.1.1.2.8.2  jruoho 
    207  1.1.1.2.8.2  jruoho     Op->Asl.Extra = NumArgs;
    208  1.1.1.2.8.2  jruoho }
    209  1.1.1.2.8.2  jruoho 
    210  1.1.1.2.8.2  jruoho 
    211  1.1.1.2.8.2  jruoho /*******************************************************************************
    212  1.1.1.2.8.2  jruoho  *
    213  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoFieldCommon
    214  1.1.1.2.8.2  jruoho  *
    215  1.1.1.2.8.2  jruoho  * PARAMETERS:  FieldOp       - Node for an ASL field
    216  1.1.1.2.8.2  jruoho  *              Op            - The parent parse node
    217  1.1.1.2.8.2  jruoho  *
    218  1.1.1.2.8.2  jruoho  * RETURN:      None
    219  1.1.1.2.8.2  jruoho  *
    220  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the various field keywords,
    221  1.1.1.2.8.2  jruoho  *              FIELD, BANKFIELD, INDEXFIELD
    222  1.1.1.2.8.2  jruoho  *
    223  1.1.1.2.8.2  jruoho  ******************************************************************************/
    224  1.1.1.2.8.2  jruoho 
    225  1.1.1.2.8.2  jruoho static void
    226  1.1.1.2.8.2  jruoho OpnDoFieldCommon (
    227  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *FieldOp,
    228  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    229  1.1.1.2.8.2  jruoho {
    230  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    231  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *PkgLengthNode;
    232  1.1.1.2.8.2  jruoho     UINT32                  CurrentBitOffset;
    233  1.1.1.2.8.2  jruoho     UINT32                  NewBitOffset;
    234  1.1.1.2.8.2  jruoho     UINT8                   AccessType;
    235  1.1.1.2.8.2  jruoho     UINT8                   LockRule;
    236  1.1.1.2.8.2  jruoho     UINT8                   UpdateRule;
    237  1.1.1.2.8.2  jruoho     UINT8                   FieldFlags;
    238  1.1.1.2.8.2  jruoho     UINT32                  MinimumLength;
    239  1.1.1.2.8.2  jruoho 
    240  1.1.1.2.8.2  jruoho 
    241  1.1.1.2.8.2  jruoho     /* AccessType -- not optional, so no need to check for DEFAULT_ARG */
    242  1.1.1.2.8.2  jruoho 
    243  1.1.1.2.8.2  jruoho     AccessType = (UINT8) Op->Asl.Value.Integer;
    244  1.1.1.2.8.2  jruoho     Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    245  1.1.1.2.8.2  jruoho 
    246  1.1.1.2.8.2  jruoho     /* Set the access type in the parent (field) node for use later */
    247  1.1.1.2.8.2  jruoho 
    248  1.1.1.2.8.2  jruoho     FieldOp->Asl.Value.Integer = AccessType;
    249  1.1.1.2.8.2  jruoho 
    250  1.1.1.2.8.2  jruoho     /* LockRule -- not optional, so no need to check for DEFAULT_ARG */
    251  1.1.1.2.8.2  jruoho 
    252  1.1.1.2.8.2  jruoho     Next = Op->Asl.Next;
    253  1.1.1.2.8.2  jruoho     LockRule = (UINT8) Next->Asl.Value.Integer;
    254  1.1.1.2.8.2  jruoho     Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    255  1.1.1.2.8.2  jruoho 
    256  1.1.1.2.8.2  jruoho     /* UpdateRule -- not optional, so no need to check for DEFAULT_ARG */
    257  1.1.1.2.8.2  jruoho 
    258  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    259  1.1.1.2.8.2  jruoho     UpdateRule = (UINT8) Next->Asl.Value.Integer;
    260  1.1.1.2.8.2  jruoho 
    261  1.1.1.2.8.2  jruoho     /*
    262  1.1.1.2.8.2  jruoho      * Generate the flags byte.  The various fields are already
    263  1.1.1.2.8.2  jruoho      * in the right bit position via translation from the
    264  1.1.1.2.8.2  jruoho      * keywords by the parser.
    265  1.1.1.2.8.2  jruoho      */
    266  1.1.1.2.8.2  jruoho     FieldFlags = (UINT8) (AccessType | LockRule | UpdateRule);
    267  1.1.1.2.8.2  jruoho 
    268  1.1.1.2.8.2  jruoho     /* Use the previous node to be the FieldFlags node */
    269  1.1.1.2.8.2  jruoho 
    270  1.1.1.2.8.2  jruoho     /* Set the node to RAW_DATA */
    271  1.1.1.2.8.2  jruoho 
    272  1.1.1.2.8.2  jruoho     Next->Asl.Value.Integer = FieldFlags;
    273  1.1.1.2.8.2  jruoho     Next->Asl.AmlOpcode     = AML_RAW_DATA_BYTE;
    274  1.1.1.2.8.2  jruoho     Next->Asl.AmlLength     = 1;
    275  1.1.1.2.8.2  jruoho     Next->Asl.ParseOpcode   = PARSEOP_RAW_DATA;
    276  1.1.1.2.8.2  jruoho 
    277  1.1.1.2.8.2  jruoho     /* Process the FieldUnitList */
    278  1.1.1.2.8.2  jruoho 
    279  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    280  1.1.1.2.8.2  jruoho     CurrentBitOffset = 0;
    281  1.1.1.2.8.2  jruoho 
    282  1.1.1.2.8.2  jruoho     while (Next)
    283  1.1.1.2.8.2  jruoho     {
    284  1.1.1.2.8.2  jruoho         /* Save the offset of this field unit */
    285  1.1.1.2.8.2  jruoho 
    286  1.1.1.2.8.2  jruoho         Next->Asl.ExtraValue = CurrentBitOffset;
    287  1.1.1.2.8.2  jruoho 
    288  1.1.1.2.8.2  jruoho         switch (Next->Asl.ParseOpcode)
    289  1.1.1.2.8.2  jruoho         {
    290  1.1.1.2.8.2  jruoho         case PARSEOP_ACCESSAS:
    291  1.1.1.2.8.2  jruoho 
    292  1.1.1.2.8.2  jruoho             PkgLengthNode = Next->Asl.Child;
    293  1.1.1.2.8.2  jruoho             AccessType = (UINT8) PkgLengthNode->Asl.Value.Integer;
    294  1.1.1.2.8.2  jruoho 
    295  1.1.1.2.8.2  jruoho             /* Nothing additional to do */
    296  1.1.1.2.8.2  jruoho             break;
    297  1.1.1.2.8.2  jruoho 
    298  1.1.1.2.8.2  jruoho 
    299  1.1.1.2.8.2  jruoho         case PARSEOP_OFFSET:
    300  1.1.1.2.8.2  jruoho 
    301  1.1.1.2.8.2  jruoho             /* New offset into the field */
    302  1.1.1.2.8.2  jruoho 
    303  1.1.1.2.8.2  jruoho             PkgLengthNode = Next->Asl.Child;
    304  1.1.1.2.8.2  jruoho             NewBitOffset = ((UINT32) PkgLengthNode->Asl.Value.Integer) * 8;
    305  1.1.1.2.8.2  jruoho 
    306  1.1.1.2.8.2  jruoho             /*
    307  1.1.1.2.8.2  jruoho              * Examine the specified offset in relation to the
    308  1.1.1.2.8.2  jruoho              * current offset counter.
    309  1.1.1.2.8.2  jruoho              */
    310  1.1.1.2.8.2  jruoho             if (NewBitOffset < CurrentBitOffset)
    311  1.1.1.2.8.2  jruoho             {
    312  1.1.1.2.8.2  jruoho                 /*
    313  1.1.1.2.8.2  jruoho                  * Not allowed to specify a backwards offset!
    314  1.1.1.2.8.2  jruoho                  * Issue error and ignore this node.
    315  1.1.1.2.8.2  jruoho                  */
    316  1.1.1.2.8.2  jruoho                 AslError (ASL_ERROR, ASL_MSG_BACKWARDS_OFFSET, PkgLengthNode,
    317  1.1.1.2.8.2  jruoho                     NULL);
    318  1.1.1.2.8.2  jruoho                 Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    319  1.1.1.2.8.2  jruoho                 PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    320  1.1.1.2.8.2  jruoho             }
    321  1.1.1.2.8.2  jruoho             else if (NewBitOffset == CurrentBitOffset)
    322  1.1.1.2.8.2  jruoho             {
    323  1.1.1.2.8.2  jruoho                 /*
    324  1.1.1.2.8.2  jruoho                  * Offset is redundant; we don't need to output an
    325  1.1.1.2.8.2  jruoho                  * offset opcode.  Just set these nodes to default
    326  1.1.1.2.8.2  jruoho                  */
    327  1.1.1.2.8.2  jruoho                 Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    328  1.1.1.2.8.2  jruoho                 PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    329  1.1.1.2.8.2  jruoho             }
    330  1.1.1.2.8.2  jruoho             else
    331  1.1.1.2.8.2  jruoho             {
    332  1.1.1.2.8.2  jruoho                 /*
    333  1.1.1.2.8.2  jruoho                  * Valid new offset - set the value to be inserted into the AML
    334  1.1.1.2.8.2  jruoho                  * and update the offset counter.
    335  1.1.1.2.8.2  jruoho                  */
    336  1.1.1.2.8.2  jruoho                 PkgLengthNode->Asl.Value.Integer =
    337  1.1.1.2.8.2  jruoho                     NewBitOffset - CurrentBitOffset;
    338  1.1.1.2.8.2  jruoho                 CurrentBitOffset = NewBitOffset;
    339  1.1.1.2.8.2  jruoho             }
    340  1.1.1.2.8.2  jruoho             break;
    341  1.1.1.2.8.2  jruoho 
    342  1.1.1.2.8.2  jruoho 
    343  1.1.1.2.8.2  jruoho         case PARSEOP_NAMESEG:
    344  1.1.1.2.8.2  jruoho         case PARSEOP_RESERVED_BYTES:
    345  1.1.1.2.8.2  jruoho 
    346  1.1.1.2.8.2  jruoho             /* Named or reserved field entry */
    347  1.1.1.2.8.2  jruoho 
    348  1.1.1.2.8.2  jruoho             PkgLengthNode     = Next->Asl.Child;
    349  1.1.1.2.8.2  jruoho             NewBitOffset      = (UINT32) PkgLengthNode->Asl.Value.Integer;
    350  1.1.1.2.8.2  jruoho             CurrentBitOffset += NewBitOffset;
    351  1.1.1.2.8.2  jruoho 
    352  1.1.1.2.8.2  jruoho             /* Save the current AccessAs value for error checking later */
    353  1.1.1.2.8.2  jruoho 
    354  1.1.1.2.8.2  jruoho             switch (AccessType)
    355  1.1.1.2.8.2  jruoho             {
    356  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_ANY:
    357  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_BYTE:
    358  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_BUFFER:
    359  1.1.1.2.8.2  jruoho                 default:
    360  1.1.1.2.8.2  jruoho                     MinimumLength = 8;
    361  1.1.1.2.8.2  jruoho                     break;
    362  1.1.1.2.8.2  jruoho 
    363  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_WORD:
    364  1.1.1.2.8.2  jruoho                     MinimumLength = 16;
    365  1.1.1.2.8.2  jruoho                     break;
    366  1.1.1.2.8.2  jruoho 
    367  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_DWORD:
    368  1.1.1.2.8.2  jruoho                     MinimumLength = 32;
    369  1.1.1.2.8.2  jruoho                     break;
    370  1.1.1.2.8.2  jruoho 
    371  1.1.1.2.8.2  jruoho                 case AML_FIELD_ACCESS_QWORD:
    372  1.1.1.2.8.2  jruoho                     MinimumLength = 64;
    373  1.1.1.2.8.2  jruoho                     break;
    374  1.1.1.2.8.2  jruoho             }
    375  1.1.1.2.8.2  jruoho 
    376  1.1.1.2.8.2  jruoho             PkgLengthNode->Asl.ExtraValue = MinimumLength;
    377  1.1.1.2.8.2  jruoho             break;
    378  1.1.1.2.8.2  jruoho 
    379  1.1.1.2.8.2  jruoho         default:
    380  1.1.1.2.8.2  jruoho             /* All supported field opcodes must appear above */
    381  1.1.1.2.8.2  jruoho             break;
    382  1.1.1.2.8.2  jruoho         }
    383  1.1.1.2.8.2  jruoho 
    384  1.1.1.2.8.2  jruoho         /* Move on to next entry in the field list */
    385  1.1.1.2.8.2  jruoho 
    386  1.1.1.2.8.2  jruoho         Next = Next->Asl.Next;
    387  1.1.1.2.8.2  jruoho     }
    388  1.1.1.2.8.2  jruoho }
    389  1.1.1.2.8.2  jruoho 
    390  1.1.1.2.8.2  jruoho 
    391  1.1.1.2.8.2  jruoho /*******************************************************************************
    392  1.1.1.2.8.2  jruoho  *
    393  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoField
    394  1.1.1.2.8.2  jruoho  *
    395  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    396  1.1.1.2.8.2  jruoho  *
    397  1.1.1.2.8.2  jruoho  * RETURN:      None
    398  1.1.1.2.8.2  jruoho  *
    399  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the FIELD ASL keyword
    400  1.1.1.2.8.2  jruoho  *
    401  1.1.1.2.8.2  jruoho  ******************************************************************************/
    402  1.1.1.2.8.2  jruoho 
    403  1.1.1.2.8.2  jruoho static void
    404  1.1.1.2.8.2  jruoho OpnDoField (
    405  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    406  1.1.1.2.8.2  jruoho {
    407  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    408  1.1.1.2.8.2  jruoho 
    409  1.1.1.2.8.2  jruoho 
    410  1.1.1.2.8.2  jruoho     /* Opcode is parent node */
    411  1.1.1.2.8.2  jruoho     /* First child is field name */
    412  1.1.1.2.8.2  jruoho 
    413  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    414  1.1.1.2.8.2  jruoho 
    415  1.1.1.2.8.2  jruoho     /* Second child is the AccessType */
    416  1.1.1.2.8.2  jruoho 
    417  1.1.1.2.8.2  jruoho     OpnDoFieldCommon (Op, Next->Asl.Next);
    418  1.1.1.2.8.2  jruoho }
    419  1.1.1.2.8.2  jruoho 
    420  1.1.1.2.8.2  jruoho 
    421  1.1.1.2.8.2  jruoho /*******************************************************************************
    422  1.1.1.2.8.2  jruoho  *
    423  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoIndexField
    424  1.1.1.2.8.2  jruoho  *
    425  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    426  1.1.1.2.8.2  jruoho  *
    427  1.1.1.2.8.2  jruoho  * RETURN:      None
    428  1.1.1.2.8.2  jruoho  *
    429  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the INDEXFIELD ASL keyword
    430  1.1.1.2.8.2  jruoho  *
    431  1.1.1.2.8.2  jruoho  ******************************************************************************/
    432  1.1.1.2.8.2  jruoho 
    433  1.1.1.2.8.2  jruoho static void
    434  1.1.1.2.8.2  jruoho OpnDoIndexField (
    435  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    436  1.1.1.2.8.2  jruoho {
    437  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    438  1.1.1.2.8.2  jruoho 
    439  1.1.1.2.8.2  jruoho 
    440  1.1.1.2.8.2  jruoho     /* Opcode is parent node */
    441  1.1.1.2.8.2  jruoho     /* First child is the index name */
    442  1.1.1.2.8.2  jruoho 
    443  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    444  1.1.1.2.8.2  jruoho 
    445  1.1.1.2.8.2  jruoho     /* Second child is the data name */
    446  1.1.1.2.8.2  jruoho 
    447  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    448  1.1.1.2.8.2  jruoho 
    449  1.1.1.2.8.2  jruoho     /* Third child is the AccessType */
    450  1.1.1.2.8.2  jruoho 
    451  1.1.1.2.8.2  jruoho     OpnDoFieldCommon (Op, Next->Asl.Next);
    452  1.1.1.2.8.2  jruoho }
    453  1.1.1.2.8.2  jruoho 
    454  1.1.1.2.8.2  jruoho 
    455  1.1.1.2.8.2  jruoho /*******************************************************************************
    456  1.1.1.2.8.2  jruoho  *
    457  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoBankField
    458  1.1.1.2.8.2  jruoho  *
    459  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    460  1.1.1.2.8.2  jruoho  *
    461  1.1.1.2.8.2  jruoho  * RETURN:      None
    462  1.1.1.2.8.2  jruoho  *
    463  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the BANKFIELD ASL keyword
    464  1.1.1.2.8.2  jruoho  *
    465  1.1.1.2.8.2  jruoho  ******************************************************************************/
    466  1.1.1.2.8.2  jruoho 
    467  1.1.1.2.8.2  jruoho static void
    468  1.1.1.2.8.2  jruoho OpnDoBankField (
    469  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    470  1.1.1.2.8.2  jruoho {
    471  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    472  1.1.1.2.8.2  jruoho 
    473  1.1.1.2.8.2  jruoho 
    474  1.1.1.2.8.2  jruoho     /* Opcode is parent node */
    475  1.1.1.2.8.2  jruoho     /* First child is the region name */
    476  1.1.1.2.8.2  jruoho 
    477  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    478  1.1.1.2.8.2  jruoho 
    479  1.1.1.2.8.2  jruoho     /* Second child is the bank name */
    480  1.1.1.2.8.2  jruoho 
    481  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    482  1.1.1.2.8.2  jruoho 
    483  1.1.1.2.8.2  jruoho     /* Third child is the bank value */
    484  1.1.1.2.8.2  jruoho 
    485  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    486  1.1.1.2.8.2  jruoho 
    487  1.1.1.2.8.2  jruoho     /* Fourth child is the AccessType */
    488  1.1.1.2.8.2  jruoho 
    489  1.1.1.2.8.2  jruoho     OpnDoFieldCommon (Op, Next->Asl.Next);
    490  1.1.1.2.8.2  jruoho }
    491  1.1.1.2.8.2  jruoho 
    492  1.1.1.2.8.2  jruoho 
    493  1.1.1.2.8.2  jruoho /*******************************************************************************
    494  1.1.1.2.8.2  jruoho  *
    495  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoRegion
    496  1.1.1.2.8.2  jruoho  *
    497  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    498  1.1.1.2.8.2  jruoho  *
    499  1.1.1.2.8.2  jruoho  * RETURN:      None
    500  1.1.1.2.8.2  jruoho  *
    501  1.1.1.2.8.2  jruoho  * DESCRIPTION: Tries to get the length of the region.  Can only do this at
    502  1.1.1.2.8.2  jruoho  *              compile time if the length is a constant.
    503  1.1.1.2.8.2  jruoho  *
    504  1.1.1.2.8.2  jruoho  ******************************************************************************/
    505  1.1.1.2.8.2  jruoho 
    506  1.1.1.2.8.2  jruoho static void
    507  1.1.1.2.8.2  jruoho OpnDoRegion (
    508  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    509  1.1.1.2.8.2  jruoho {
    510  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    511  1.1.1.2.8.2  jruoho 
    512  1.1.1.2.8.2  jruoho 
    513  1.1.1.2.8.2  jruoho     /* Opcode is parent node */
    514  1.1.1.2.8.2  jruoho     /* First child is the region name */
    515  1.1.1.2.8.2  jruoho 
    516  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    517  1.1.1.2.8.2  jruoho 
    518  1.1.1.2.8.2  jruoho     /* Second child is the space ID*/
    519  1.1.1.2.8.2  jruoho 
    520  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    521  1.1.1.2.8.2  jruoho 
    522  1.1.1.2.8.2  jruoho     /* Third child is the region offset */
    523  1.1.1.2.8.2  jruoho 
    524  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    525  1.1.1.2.8.2  jruoho 
    526  1.1.1.2.8.2  jruoho     /* Fourth child is the region length */
    527  1.1.1.2.8.2  jruoho 
    528  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    529  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode == PARSEOP_INTEGER)
    530  1.1.1.2.8.2  jruoho     {
    531  1.1.1.2.8.2  jruoho         Op->Asl.Value.Integer = Next->Asl.Value.Integer;
    532  1.1.1.2.8.2  jruoho     }
    533  1.1.1.2.8.2  jruoho     else
    534  1.1.1.2.8.2  jruoho     {
    535  1.1.1.2.8.2  jruoho         Op->Asl.Value.Integer = ACPI_UINT64_MAX;
    536  1.1.1.2.8.2  jruoho     }
    537  1.1.1.2.8.2  jruoho }
    538  1.1.1.2.8.2  jruoho 
    539  1.1.1.2.8.2  jruoho 
    540  1.1.1.2.8.2  jruoho /*******************************************************************************
    541  1.1.1.2.8.2  jruoho  *
    542  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoBuffer
    543  1.1.1.2.8.2  jruoho  *
    544  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    545  1.1.1.2.8.2  jruoho  *
    546  1.1.1.2.8.2  jruoho  * RETURN:      None
    547  1.1.1.2.8.2  jruoho  *
    548  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the BUFFER ASL keyword.  We
    549  1.1.1.2.8.2  jruoho  *              build a single raw byte buffer from the initialization nodes,
    550  1.1.1.2.8.2  jruoho  *              each parse node contains a buffer byte.
    551  1.1.1.2.8.2  jruoho  *
    552  1.1.1.2.8.2  jruoho  ******************************************************************************/
    553  1.1.1.2.8.2  jruoho 
    554  1.1.1.2.8.2  jruoho static void
    555  1.1.1.2.8.2  jruoho OpnDoBuffer (
    556  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    557  1.1.1.2.8.2  jruoho {
    558  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *InitializerOp;
    559  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *BufferLengthOp;
    560  1.1.1.2.8.2  jruoho 
    561  1.1.1.2.8.2  jruoho     /* Optional arguments for this opcode with defaults */
    562  1.1.1.2.8.2  jruoho 
    563  1.1.1.2.8.2  jruoho     UINT32                  BufferLength = 0;
    564  1.1.1.2.8.2  jruoho 
    565  1.1.1.2.8.2  jruoho 
    566  1.1.1.2.8.2  jruoho     /* Opcode and package length first */
    567  1.1.1.2.8.2  jruoho     /* Buffer Length is next, followed by the initializer list */
    568  1.1.1.2.8.2  jruoho 
    569  1.1.1.2.8.2  jruoho     BufferLengthOp = Op->Asl.Child;
    570  1.1.1.2.8.2  jruoho     InitializerOp = BufferLengthOp->Asl.Next;
    571  1.1.1.2.8.2  jruoho 
    572  1.1.1.2.8.2  jruoho     /*
    573  1.1.1.2.8.2  jruoho      * If the BufferLength is not an INTEGER or was not specified in the ASL
    574  1.1.1.2.8.2  jruoho      * (DEFAULT_ARG), it is a TermArg that is
    575  1.1.1.2.8.2  jruoho      * evaluated at run-time, and we are therefore finished.
    576  1.1.1.2.8.2  jruoho      */
    577  1.1.1.2.8.2  jruoho     if ((BufferLengthOp->Asl.ParseOpcode != PARSEOP_INTEGER) &&
    578  1.1.1.2.8.2  jruoho         (BufferLengthOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
    579  1.1.1.2.8.2  jruoho     {
    580  1.1.1.2.8.2  jruoho         return;
    581  1.1.1.2.8.2  jruoho     }
    582  1.1.1.2.8.2  jruoho 
    583  1.1.1.2.8.2  jruoho     /*
    584  1.1.1.2.8.2  jruoho      * We want to count the number of items in the initializer list, because if
    585  1.1.1.2.8.2  jruoho      * it is larger than the buffer length, we will define the buffer size
    586  1.1.1.2.8.2  jruoho      * to be the size of the initializer list (as per the ACPI Specification)
    587  1.1.1.2.8.2  jruoho      */
    588  1.1.1.2.8.2  jruoho     switch (InitializerOp->Asl.ParseOpcode)
    589  1.1.1.2.8.2  jruoho     {
    590  1.1.1.2.8.2  jruoho     case PARSEOP_INTEGER:
    591  1.1.1.2.8.2  jruoho     case PARSEOP_BYTECONST:
    592  1.1.1.2.8.2  jruoho     case PARSEOP_WORDCONST:
    593  1.1.1.2.8.2  jruoho     case PARSEOP_DWORDCONST:
    594  1.1.1.2.8.2  jruoho 
    595  1.1.1.2.8.2  jruoho         /* The peer list contains the byte list (if any...) */
    596  1.1.1.2.8.2  jruoho 
    597  1.1.1.2.8.2  jruoho         while (InitializerOp)
    598  1.1.1.2.8.2  jruoho         {
    599  1.1.1.2.8.2  jruoho             /* For buffers, this is a list of raw bytes */
    600  1.1.1.2.8.2  jruoho 
    601  1.1.1.2.8.2  jruoho             InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BYTE;
    602  1.1.1.2.8.2  jruoho             InitializerOp->Asl.AmlLength      = 1;
    603  1.1.1.2.8.2  jruoho             InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;
    604  1.1.1.2.8.2  jruoho 
    605  1.1.1.2.8.2  jruoho             BufferLength++;
    606  1.1.1.2.8.2  jruoho             InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
    607  1.1.1.2.8.2  jruoho         }
    608  1.1.1.2.8.2  jruoho         break;
    609  1.1.1.2.8.2  jruoho 
    610  1.1.1.2.8.2  jruoho 
    611  1.1.1.2.8.2  jruoho     case PARSEOP_STRING_LITERAL:
    612  1.1.1.2.8.2  jruoho 
    613  1.1.1.2.8.2  jruoho         /*
    614  1.1.1.2.8.2  jruoho          * Only one initializer, the string.  Buffer must be big enough to hold
    615  1.1.1.2.8.2  jruoho          * the string plus the null termination byte
    616  1.1.1.2.8.2  jruoho          */
    617  1.1.1.2.8.2  jruoho         BufferLength = strlen (InitializerOp->Asl.Value.String) + 1;
    618  1.1.1.2.8.2  jruoho 
    619  1.1.1.2.8.2  jruoho         InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BUFFER;
    620  1.1.1.2.8.2  jruoho         InitializerOp->Asl.AmlLength      = BufferLength;
    621  1.1.1.2.8.2  jruoho         InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;
    622  1.1.1.2.8.2  jruoho         break;
    623  1.1.1.2.8.2  jruoho 
    624  1.1.1.2.8.2  jruoho 
    625  1.1.1.2.8.2  jruoho     case PARSEOP_RAW_DATA:
    626  1.1.1.2.8.2  jruoho 
    627  1.1.1.2.8.2  jruoho         /* Buffer nodes are already initialized (e.g. Unicode operator) */
    628  1.1.1.2.8.2  jruoho         return;
    629  1.1.1.2.8.2  jruoho 
    630  1.1.1.2.8.2  jruoho 
    631  1.1.1.2.8.2  jruoho     case PARSEOP_DEFAULT_ARG:
    632  1.1.1.2.8.2  jruoho         break;
    633  1.1.1.2.8.2  jruoho 
    634  1.1.1.2.8.2  jruoho 
    635  1.1.1.2.8.2  jruoho     default:
    636  1.1.1.2.8.2  jruoho         AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, InitializerOp,
    637  1.1.1.2.8.2  jruoho             "Unknown buffer initializer opcode");
    638  1.1.1.2.8.2  jruoho         printf ("Unknown buffer initializer opcode [%s]\n",
    639  1.1.1.2.8.2  jruoho                         UtGetOpName (InitializerOp->Asl.ParseOpcode));
    640  1.1.1.2.8.2  jruoho         return;
    641  1.1.1.2.8.2  jruoho     }
    642  1.1.1.2.8.2  jruoho 
    643  1.1.1.2.8.2  jruoho     /* Check if initializer list is longer than the buffer length */
    644  1.1.1.2.8.2  jruoho 
    645  1.1.1.2.8.2  jruoho     if (BufferLengthOp->Asl.Value.Integer > BufferLength)
    646  1.1.1.2.8.2  jruoho     {
    647  1.1.1.2.8.2  jruoho         BufferLength = (UINT32) BufferLengthOp->Asl.Value.Integer;
    648  1.1.1.2.8.2  jruoho     }
    649  1.1.1.2.8.2  jruoho 
    650  1.1.1.2.8.2  jruoho     if (!BufferLength)
    651  1.1.1.2.8.2  jruoho     {
    652  1.1.1.2.8.2  jruoho         /* No length AND no items -- issue notice */
    653  1.1.1.2.8.2  jruoho 
    654  1.1.1.2.8.2  jruoho         AslError (ASL_REMARK, ASL_MSG_BUFFER_LENGTH, BufferLengthOp, NULL);
    655  1.1.1.2.8.2  jruoho 
    656  1.1.1.2.8.2  jruoho         /* But go ahead and put the buffer length of zero into the AML */
    657  1.1.1.2.8.2  jruoho     }
    658  1.1.1.2.8.2  jruoho 
    659  1.1.1.2.8.2  jruoho     /*
    660  1.1.1.2.8.2  jruoho      * Just set the buffer size node to be the buffer length, regardless
    661  1.1.1.2.8.2  jruoho      * of whether it was previously an integer or a default_arg placeholder
    662  1.1.1.2.8.2  jruoho      */
    663  1.1.1.2.8.2  jruoho     BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;
    664  1.1.1.2.8.2  jruoho     BufferLengthOp->Asl.AmlOpcode     = AML_DWORD_OP;
    665  1.1.1.2.8.2  jruoho     BufferLengthOp->Asl.Value.Integer = BufferLength;
    666  1.1.1.2.8.2  jruoho 
    667  1.1.1.2.8.2  jruoho     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
    668  1.1.1.2.8.2  jruoho 
    669  1.1.1.2.8.2  jruoho     /* Remaining nodes are handled via the tree walk */
    670  1.1.1.2.8.2  jruoho }
    671  1.1.1.2.8.2  jruoho 
    672  1.1.1.2.8.2  jruoho 
    673  1.1.1.2.8.2  jruoho /*******************************************************************************
    674  1.1.1.2.8.2  jruoho  *
    675  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoPackage
    676  1.1.1.2.8.2  jruoho  *
    677  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    678  1.1.1.2.8.2  jruoho  *
    679  1.1.1.2.8.2  jruoho  * RETURN:      None
    680  1.1.1.2.8.2  jruoho  *
    681  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the PACKAGE ASL keyword.  NOTE:
    682  1.1.1.2.8.2  jruoho  *              can only be called after constants have been folded, to ensure
    683  1.1.1.2.8.2  jruoho  *              that the PackageLength operand has been fully reduced.
    684  1.1.1.2.8.2  jruoho  *
    685  1.1.1.2.8.2  jruoho  ******************************************************************************/
    686  1.1.1.2.8.2  jruoho 
    687  1.1.1.2.8.2  jruoho void
    688  1.1.1.2.8.2  jruoho OpnDoPackage (
    689  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    690  1.1.1.2.8.2  jruoho {
    691  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *InitializerOp;
    692  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *PackageLengthOp;
    693  1.1.1.2.8.2  jruoho     UINT32                  PackageLength = 0;
    694  1.1.1.2.8.2  jruoho 
    695  1.1.1.2.8.2  jruoho 
    696  1.1.1.2.8.2  jruoho     /* Opcode and package length first, followed by the initializer list */
    697  1.1.1.2.8.2  jruoho 
    698  1.1.1.2.8.2  jruoho     PackageLengthOp = Op->Asl.Child;
    699  1.1.1.2.8.2  jruoho     InitializerOp = PackageLengthOp->Asl.Next;
    700  1.1.1.2.8.2  jruoho 
    701  1.1.1.2.8.2  jruoho     /* Count the number of items in the initializer list */
    702  1.1.1.2.8.2  jruoho 
    703  1.1.1.2.8.2  jruoho     if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    704  1.1.1.2.8.2  jruoho     {
    705  1.1.1.2.8.2  jruoho         /* The peer list contains the byte list (if any...) */
    706  1.1.1.2.8.2  jruoho 
    707  1.1.1.2.8.2  jruoho         while (InitializerOp)
    708  1.1.1.2.8.2  jruoho         {
    709  1.1.1.2.8.2  jruoho             PackageLength++;
    710  1.1.1.2.8.2  jruoho             InitializerOp = InitializerOp->Asl.Next;
    711  1.1.1.2.8.2  jruoho         }
    712  1.1.1.2.8.2  jruoho     }
    713  1.1.1.2.8.2  jruoho 
    714  1.1.1.2.8.2  jruoho     /* If package length is a constant, compare to the initializer list */
    715  1.1.1.2.8.2  jruoho 
    716  1.1.1.2.8.2  jruoho     if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||
    717  1.1.1.2.8.2  jruoho         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST))
    718  1.1.1.2.8.2  jruoho     {
    719  1.1.1.2.8.2  jruoho         if (PackageLengthOp->Asl.Value.Integer > PackageLength)
    720  1.1.1.2.8.2  jruoho         {
    721  1.1.1.2.8.2  jruoho             /*
    722  1.1.1.2.8.2  jruoho              * Allow package length to be longer than the initializer
    723  1.1.1.2.8.2  jruoho              * list -- but if the length of initializer list is nonzero,
    724  1.1.1.2.8.2  jruoho              * issue a message since this is probably a coding error,
    725  1.1.1.2.8.2  jruoho              * even though technically legal.
    726  1.1.1.2.8.2  jruoho              */
    727  1.1.1.2.8.2  jruoho             if (PackageLength > 0)
    728  1.1.1.2.8.2  jruoho             {
    729  1.1.1.2.8.2  jruoho                 AslError (ASL_REMARK, ASL_MSG_LIST_LENGTH_SHORT,
    730  1.1.1.2.8.2  jruoho                     PackageLengthOp, NULL);
    731  1.1.1.2.8.2  jruoho             }
    732  1.1.1.2.8.2  jruoho 
    733  1.1.1.2.8.2  jruoho             PackageLength = (UINT32) PackageLengthOp->Asl.Value.Integer;
    734  1.1.1.2.8.2  jruoho         }
    735  1.1.1.2.8.2  jruoho         else if (PackageLengthOp->Asl.Value.Integer < PackageLength)
    736  1.1.1.2.8.2  jruoho         {
    737  1.1.1.2.8.2  jruoho             /*
    738  1.1.1.2.8.2  jruoho              * The package length is smaller than the length of the
    739  1.1.1.2.8.2  jruoho              * initializer list. This is an error as per the ACPI spec.
    740  1.1.1.2.8.2  jruoho              */
    741  1.1.1.2.8.2  jruoho             AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH_LONG,
    742  1.1.1.2.8.2  jruoho                 PackageLengthOp, NULL);
    743  1.1.1.2.8.2  jruoho         }
    744  1.1.1.2.8.2  jruoho     }
    745  1.1.1.2.8.2  jruoho 
    746  1.1.1.2.8.2  jruoho     if (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
    747  1.1.1.2.8.2  jruoho     {
    748  1.1.1.2.8.2  jruoho         /*
    749  1.1.1.2.8.2  jruoho          * This is the case if the PackageLength was left empty - Package()
    750  1.1.1.2.8.2  jruoho          * The package length becomes the length of the initializer list
    751  1.1.1.2.8.2  jruoho          */
    752  1.1.1.2.8.2  jruoho         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_INTEGER;
    753  1.1.1.2.8.2  jruoho         Op->Asl.Child->Asl.Value.Integer = PackageLength;
    754  1.1.1.2.8.2  jruoho 
    755  1.1.1.2.8.2  jruoho         /* Set the AML opcode */
    756  1.1.1.2.8.2  jruoho 
    757  1.1.1.2.8.2  jruoho         (void) OpcSetOptimalIntegerSize (Op->Asl.Child);
    758  1.1.1.2.8.2  jruoho     }
    759  1.1.1.2.8.2  jruoho 
    760  1.1.1.2.8.2  jruoho     /* If not a variable-length package, check for a zero package length */
    761  1.1.1.2.8.2  jruoho 
    762  1.1.1.2.8.2  jruoho     if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||
    763  1.1.1.2.8.2  jruoho         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST)   ||
    764  1.1.1.2.8.2  jruoho         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG))
    765  1.1.1.2.8.2  jruoho     {
    766  1.1.1.2.8.2  jruoho         if (!PackageLength)
    767  1.1.1.2.8.2  jruoho         {
    768  1.1.1.2.8.2  jruoho             /* No length AND no initializer list -- issue a remark */
    769  1.1.1.2.8.2  jruoho 
    770  1.1.1.2.8.2  jruoho             AslError (ASL_REMARK, ASL_MSG_PACKAGE_LENGTH,
    771  1.1.1.2.8.2  jruoho                 PackageLengthOp, NULL);
    772  1.1.1.2.8.2  jruoho 
    773  1.1.1.2.8.2  jruoho             /* But go ahead and put the buffer length of zero into the AML */
    774  1.1.1.2.8.2  jruoho         }
    775  1.1.1.2.8.2  jruoho     }
    776  1.1.1.2.8.2  jruoho 
    777  1.1.1.2.8.2  jruoho     /*
    778  1.1.1.2.8.2  jruoho      * If the PackageLength is a constant <= 255, we can change the
    779  1.1.1.2.8.2  jruoho      * AML opcode from VarPackage to a simple (ACPI 1.0) Package opcode.
    780  1.1.1.2.8.2  jruoho      */
    781  1.1.1.2.8.2  jruoho     if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) &&
    782  1.1.1.2.8.2  jruoho         (Op->Asl.Child->Asl.Value.Integer <= 255))
    783  1.1.1.2.8.2  jruoho     {
    784  1.1.1.2.8.2  jruoho         Op->Asl.AmlOpcode = AML_PACKAGE_OP;
    785  1.1.1.2.8.2  jruoho         Op->Asl.ParseOpcode = PARSEOP_PACKAGE;
    786  1.1.1.2.8.2  jruoho 
    787  1.1.1.2.8.2  jruoho         /*
    788  1.1.1.2.8.2  jruoho          * Just set the package size node to be the package length, regardless
    789  1.1.1.2.8.2  jruoho          * of whether it was previously an integer or a default_arg placeholder
    790  1.1.1.2.8.2  jruoho          */
    791  1.1.1.2.8.2  jruoho         PackageLengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    792  1.1.1.2.8.2  jruoho         PackageLengthOp->Asl.AmlLength = 1;
    793  1.1.1.2.8.2  jruoho         PackageLengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
    794  1.1.1.2.8.2  jruoho         PackageLengthOp->Asl.Value.Integer = PackageLength;
    795  1.1.1.2.8.2  jruoho     }
    796  1.1.1.2.8.2  jruoho 
    797  1.1.1.2.8.2  jruoho     /* Remaining nodes are handled via the tree walk */
    798  1.1.1.2.8.2  jruoho }
    799  1.1.1.2.8.2  jruoho 
    800  1.1.1.2.8.2  jruoho 
    801  1.1.1.2.8.2  jruoho /*******************************************************************************
    802  1.1.1.2.8.2  jruoho  *
    803  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoLoadTable
    804  1.1.1.2.8.2  jruoho  *
    805  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    806  1.1.1.2.8.2  jruoho  *
    807  1.1.1.2.8.2  jruoho  * RETURN:      None
    808  1.1.1.2.8.2  jruoho  *
    809  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the LOADTABLE ASL keyword.
    810  1.1.1.2.8.2  jruoho  *
    811  1.1.1.2.8.2  jruoho  ******************************************************************************/
    812  1.1.1.2.8.2  jruoho 
    813  1.1.1.2.8.2  jruoho static void
    814  1.1.1.2.8.2  jruoho OpnDoLoadTable (
    815  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    816  1.1.1.2.8.2  jruoho {
    817  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Next;
    818  1.1.1.2.8.2  jruoho 
    819  1.1.1.2.8.2  jruoho 
    820  1.1.1.2.8.2  jruoho     /* Opcode is parent node */
    821  1.1.1.2.8.2  jruoho     /* First child is the table signature */
    822  1.1.1.2.8.2  jruoho 
    823  1.1.1.2.8.2  jruoho     Next = Op->Asl.Child;
    824  1.1.1.2.8.2  jruoho 
    825  1.1.1.2.8.2  jruoho     /* Second child is the OEM ID*/
    826  1.1.1.2.8.2  jruoho 
    827  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    828  1.1.1.2.8.2  jruoho 
    829  1.1.1.2.8.2  jruoho     /* Third child is the OEM table ID */
    830  1.1.1.2.8.2  jruoho 
    831  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    832  1.1.1.2.8.2  jruoho 
    833  1.1.1.2.8.2  jruoho     /* Fourth child is the RootPath string */
    834  1.1.1.2.8.2  jruoho 
    835  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    836  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode == PARSEOP_ZERO)
    837  1.1.1.2.8.2  jruoho     {
    838  1.1.1.2.8.2  jruoho         Next->Asl.ParseOpcode    = PARSEOP_STRING_LITERAL;
    839  1.1.1.2.8.2  jruoho         Next->Asl.Value.String   = "\\";
    840  1.1.1.2.8.2  jruoho         Next->Asl.AmlLength      = 2;
    841  1.1.1.2.8.2  jruoho         OpcGenerateAmlOpcode (Next);
    842  1.1.1.2.8.2  jruoho     }
    843  1.1.1.2.8.2  jruoho 
    844  1.1.1.2.8.2  jruoho #ifdef ASL_FUTURE_IMPLEMENTATION
    845  1.1.1.2.8.2  jruoho 
    846  1.1.1.2.8.2  jruoho     /* TBD: NOT IMPLEMENTED */
    847  1.1.1.2.8.2  jruoho     /* Fifth child is the [optional] ParameterPathString */
    848  1.1.1.2.8.2  jruoho     /* Sixth child is the [optional] ParameterData */
    849  1.1.1.2.8.2  jruoho 
    850  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    851  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode == DEFAULT_ARG)
    852  1.1.1.2.8.2  jruoho     {
    853  1.1.1.2.8.2  jruoho         Next->Asl.AmlLength = 1;
    854  1.1.1.2.8.2  jruoho         Next->Asl.ParseOpcode = ZERO;
    855  1.1.1.2.8.2  jruoho         OpcGenerateAmlOpcode (Next);
    856  1.1.1.2.8.2  jruoho     }
    857  1.1.1.2.8.2  jruoho 
    858  1.1.1.2.8.2  jruoho 
    859  1.1.1.2.8.2  jruoho     Next = Next->Asl.Next;
    860  1.1.1.2.8.2  jruoho     if (Next->Asl.ParseOpcode == DEFAULT_ARG)
    861  1.1.1.2.8.2  jruoho     {
    862  1.1.1.2.8.2  jruoho         Next->Asl.AmlLength = 1;
    863  1.1.1.2.8.2  jruoho         Next->Asl.ParseOpcode = ZERO;
    864  1.1.1.2.8.2  jruoho         OpcGenerateAmlOpcode (Next);
    865  1.1.1.2.8.2  jruoho     }
    866  1.1.1.2.8.2  jruoho #endif
    867  1.1.1.2.8.2  jruoho }
    868  1.1.1.2.8.2  jruoho 
    869  1.1.1.2.8.2  jruoho 
    870  1.1.1.2.8.2  jruoho /*******************************************************************************
    871  1.1.1.2.8.2  jruoho  *
    872  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnDoDefinitionBlock
    873  1.1.1.2.8.2  jruoho  *
    874  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
    875  1.1.1.2.8.2  jruoho  *
    876  1.1.1.2.8.2  jruoho  * RETURN:      None
    877  1.1.1.2.8.2  jruoho  *
    878  1.1.1.2.8.2  jruoho  * DESCRIPTION: Construct the AML operands for the DEFINITIONBLOCK ASL keyword
    879  1.1.1.2.8.2  jruoho  *
    880  1.1.1.2.8.2  jruoho  ******************************************************************************/
    881  1.1.1.2.8.2  jruoho 
    882  1.1.1.2.8.2  jruoho static void
    883  1.1.1.2.8.2  jruoho OpnDoDefinitionBlock (
    884  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
    885  1.1.1.2.8.2  jruoho {
    886  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Child;
    887  1.1.1.2.8.2  jruoho     ACPI_SIZE               Length;
    888  1.1.1.2.8.2  jruoho     UINT32                  i;
    889  1.1.1.2.8.2  jruoho     char                    *Filename;
    890  1.1.1.2.8.2  jruoho 
    891  1.1.1.2.8.2  jruoho 
    892  1.1.1.2.8.2  jruoho     /*
    893  1.1.1.2.8.2  jruoho      * These nodes get stuffed into the table header.  They are special
    894  1.1.1.2.8.2  jruoho      * cased when the table is written to the output file.
    895  1.1.1.2.8.2  jruoho      *
    896  1.1.1.2.8.2  jruoho      * Mark all of these nodes as non-usable so they won't get output
    897  1.1.1.2.8.2  jruoho      * as AML opcodes!
    898  1.1.1.2.8.2  jruoho      */
    899  1.1.1.2.8.2  jruoho 
    900  1.1.1.2.8.2  jruoho     /* Get AML filename. Use it if non-null */
    901  1.1.1.2.8.2  jruoho 
    902  1.1.1.2.8.2  jruoho     Child = Op->Asl.Child;
    903  1.1.1.2.8.2  jruoho     if (Child->Asl.Value.Buffer  &&
    904  1.1.1.2.8.2  jruoho         *Child->Asl.Value.Buffer &&
    905  1.1.1.2.8.2  jruoho         (Gbl_UseDefaultAmlFilename))
    906  1.1.1.2.8.2  jruoho     {
    907  1.1.1.2.8.2  jruoho         /*
    908  1.1.1.2.8.2  jruoho          * We will use the AML filename that is embedded in the source file
    909  1.1.1.2.8.2  jruoho          * for the output filename.
    910  1.1.1.2.8.2  jruoho          */
    911  1.1.1.2.8.2  jruoho         Filename = ACPI_ALLOCATE (strlen (Gbl_DirectoryPath) +
    912  1.1.1.2.8.2  jruoho                     strlen ((char *) Child->Asl.Value.Buffer) + 1);
    913  1.1.1.2.8.2  jruoho 
    914  1.1.1.2.8.2  jruoho         /* Prepend the current directory path */
    915  1.1.1.2.8.2  jruoho 
    916  1.1.1.2.8.2  jruoho         strcpy (Filename, Gbl_DirectoryPath);
    917  1.1.1.2.8.2  jruoho         strcat (Filename, (char *) Child->Asl.Value.Buffer);
    918  1.1.1.2.8.2  jruoho 
    919  1.1.1.2.8.2  jruoho         Gbl_OutputFilenamePrefix = Filename;
    920  1.1.1.2.8.2  jruoho     }
    921  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    922  1.1.1.2.8.2  jruoho 
    923  1.1.1.2.8.2  jruoho     /* Signature */
    924  1.1.1.2.8.2  jruoho 
    925  1.1.1.2.8.2  jruoho     Child = Child->Asl.Next;
    926  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    927  1.1.1.2.8.2  jruoho     if (Child->Asl.Value.String)
    928  1.1.1.2.8.2  jruoho     {
    929  1.1.1.2.8.2  jruoho         Gbl_TableSignature = Child->Asl.Value.String;
    930  1.1.1.2.8.2  jruoho         if (ACPI_STRLEN (Gbl_TableSignature) != 4)
    931  1.1.1.2.8.2  jruoho         {
    932  1.1.1.2.8.2  jruoho             AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
    933  1.1.1.2.8.2  jruoho                 "Length not exactly 4");
    934  1.1.1.2.8.2  jruoho         }
    935  1.1.1.2.8.2  jruoho 
    936  1.1.1.2.8.2  jruoho         for (i = 0; i < 4; i++)
    937  1.1.1.2.8.2  jruoho         {
    938  1.1.1.2.8.2  jruoho             if (!isalnum ((int) Gbl_TableSignature[i]))
    939  1.1.1.2.8.2  jruoho             {
    940  1.1.1.2.8.2  jruoho                 AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
    941  1.1.1.2.8.2  jruoho                     "Contains non-alphanumeric characters");
    942  1.1.1.2.8.2  jruoho             }
    943  1.1.1.2.8.2  jruoho         }
    944  1.1.1.2.8.2  jruoho     }
    945  1.1.1.2.8.2  jruoho 
    946  1.1.1.2.8.2  jruoho     /* Revision */
    947  1.1.1.2.8.2  jruoho 
    948  1.1.1.2.8.2  jruoho     Child = Child->Asl.Next;
    949  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    950  1.1.1.2.8.2  jruoho     /*
    951  1.1.1.2.8.2  jruoho      * We used the revision to set the integer width earlier
    952  1.1.1.2.8.2  jruoho      */
    953  1.1.1.2.8.2  jruoho 
    954  1.1.1.2.8.2  jruoho     /* OEMID */
    955  1.1.1.2.8.2  jruoho 
    956  1.1.1.2.8.2  jruoho     Child = Child->Asl.Next;
    957  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    958  1.1.1.2.8.2  jruoho 
    959  1.1.1.2.8.2  jruoho     /* OEM TableID */
    960  1.1.1.2.8.2  jruoho 
    961  1.1.1.2.8.2  jruoho     Child = Child->Asl.Next;
    962  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    963  1.1.1.2.8.2  jruoho     if (Child->Asl.Value.String)
    964  1.1.1.2.8.2  jruoho     {
    965  1.1.1.2.8.2  jruoho         Length = ACPI_STRLEN (Child->Asl.Value.String);
    966  1.1.1.2.8.2  jruoho         Gbl_TableId = AcpiOsAllocate (Length + 1);
    967  1.1.1.2.8.2  jruoho         ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
    968  1.1.1.2.8.2  jruoho 
    969  1.1.1.2.8.2  jruoho         for (i = 0; i < Length; i++)
    970  1.1.1.2.8.2  jruoho         {
    971  1.1.1.2.8.2  jruoho             if (Gbl_TableId[i] == ' ')
    972  1.1.1.2.8.2  jruoho             {
    973  1.1.1.2.8.2  jruoho                 Gbl_TableId[i] = 0;
    974  1.1.1.2.8.2  jruoho                 break;
    975  1.1.1.2.8.2  jruoho             }
    976  1.1.1.2.8.2  jruoho         }
    977  1.1.1.2.8.2  jruoho     }
    978  1.1.1.2.8.2  jruoho 
    979  1.1.1.2.8.2  jruoho     /* OEM Revision */
    980  1.1.1.2.8.2  jruoho 
    981  1.1.1.2.8.2  jruoho     Child = Child->Asl.Next;
    982  1.1.1.2.8.2  jruoho     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
    983  1.1.1.2.8.2  jruoho }
    984  1.1.1.2.8.2  jruoho 
    985  1.1.1.2.8.2  jruoho 
    986  1.1.1.2.8.2  jruoho /*******************************************************************************
    987  1.1.1.2.8.2  jruoho  *
    988  1.1.1.2.8.2  jruoho  * FUNCTION:    UtGetArg
    989  1.1.1.2.8.2  jruoho  *
    990  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op              - Get an argument for this op
    991  1.1.1.2.8.2  jruoho  *              Argn            - Nth argument to get
    992  1.1.1.2.8.2  jruoho  *
    993  1.1.1.2.8.2  jruoho  * RETURN:      The argument (as an Op object).  NULL if argument does not exist
    994  1.1.1.2.8.2  jruoho  *
    995  1.1.1.2.8.2  jruoho  * DESCRIPTION: Get the specified op's argument (peer)
    996  1.1.1.2.8.2  jruoho  *
    997  1.1.1.2.8.2  jruoho  ******************************************************************************/
    998  1.1.1.2.8.2  jruoho 
    999  1.1.1.2.8.2  jruoho ACPI_PARSE_OBJECT *
   1000  1.1.1.2.8.2  jruoho UtGetArg (
   1001  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op,
   1002  1.1.1.2.8.2  jruoho     UINT32                  Argn)
   1003  1.1.1.2.8.2  jruoho {
   1004  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Arg = NULL;
   1005  1.1.1.2.8.2  jruoho 
   1006  1.1.1.2.8.2  jruoho 
   1007  1.1.1.2.8.2  jruoho     /* Get the requested argument object */
   1008  1.1.1.2.8.2  jruoho 
   1009  1.1.1.2.8.2  jruoho     Arg = Op->Asl.Child;
   1010  1.1.1.2.8.2  jruoho     while (Arg && Argn)
   1011  1.1.1.2.8.2  jruoho     {
   1012  1.1.1.2.8.2  jruoho         Argn--;
   1013  1.1.1.2.8.2  jruoho         Arg = Arg->Asl.Next;
   1014  1.1.1.2.8.2  jruoho     }
   1015  1.1.1.2.8.2  jruoho 
   1016  1.1.1.2.8.2  jruoho     return (Arg);
   1017  1.1.1.2.8.2  jruoho }
   1018  1.1.1.2.8.2  jruoho 
   1019  1.1.1.2.8.2  jruoho 
   1020  1.1.1.2.8.2  jruoho /*******************************************************************************
   1021  1.1.1.2.8.2  jruoho  *
   1022  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnAttachNameToNode
   1023  1.1.1.2.8.2  jruoho  *
   1024  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
   1025  1.1.1.2.8.2  jruoho  *
   1026  1.1.1.2.8.2  jruoho  * RETURN:      None
   1027  1.1.1.2.8.2  jruoho  *
   1028  1.1.1.2.8.2  jruoho  * DESCRIPTION: For the named ASL/AML operators, get the actual name from the
   1029  1.1.1.2.8.2  jruoho  *              argument list and attach it to the parent node so that we
   1030  1.1.1.2.8.2  jruoho  *              can get to it quickly later.
   1031  1.1.1.2.8.2  jruoho  *
   1032  1.1.1.2.8.2  jruoho  ******************************************************************************/
   1033  1.1.1.2.8.2  jruoho 
   1034  1.1.1.2.8.2  jruoho static void
   1035  1.1.1.2.8.2  jruoho OpnAttachNameToNode (
   1036  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
   1037  1.1.1.2.8.2  jruoho {
   1038  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Child = NULL;
   1039  1.1.1.2.8.2  jruoho 
   1040  1.1.1.2.8.2  jruoho 
   1041  1.1.1.2.8.2  jruoho     if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
   1042  1.1.1.2.8.2  jruoho     {
   1043  1.1.1.2.8.2  jruoho         Child = UtGetArg (Op, 0);
   1044  1.1.1.2.8.2  jruoho     }
   1045  1.1.1.2.8.2  jruoho     else switch (Op->Asl.AmlOpcode)
   1046  1.1.1.2.8.2  jruoho     {
   1047  1.1.1.2.8.2  jruoho     case AML_DATA_REGION_OP:
   1048  1.1.1.2.8.2  jruoho     case AML_DEVICE_OP:
   1049  1.1.1.2.8.2  jruoho     case AML_EVENT_OP:
   1050  1.1.1.2.8.2  jruoho     case AML_METHOD_OP:
   1051  1.1.1.2.8.2  jruoho     case AML_MUTEX_OP:
   1052  1.1.1.2.8.2  jruoho     case AML_REGION_OP:
   1053  1.1.1.2.8.2  jruoho     case AML_POWER_RES_OP:
   1054  1.1.1.2.8.2  jruoho     case AML_PROCESSOR_OP:
   1055  1.1.1.2.8.2  jruoho     case AML_THERMAL_ZONE_OP:
   1056  1.1.1.2.8.2  jruoho     case AML_NAME_OP:
   1057  1.1.1.2.8.2  jruoho     case AML_SCOPE_OP:
   1058  1.1.1.2.8.2  jruoho 
   1059  1.1.1.2.8.2  jruoho         Child = UtGetArg (Op, 0);
   1060  1.1.1.2.8.2  jruoho         break;
   1061  1.1.1.2.8.2  jruoho 
   1062  1.1.1.2.8.2  jruoho     case AML_ALIAS_OP:
   1063  1.1.1.2.8.2  jruoho 
   1064  1.1.1.2.8.2  jruoho         Child = UtGetArg (Op, 1);
   1065  1.1.1.2.8.2  jruoho         break;
   1066  1.1.1.2.8.2  jruoho 
   1067  1.1.1.2.8.2  jruoho     case AML_CREATE_BIT_FIELD_OP:
   1068  1.1.1.2.8.2  jruoho     case AML_CREATE_BYTE_FIELD_OP:
   1069  1.1.1.2.8.2  jruoho     case AML_CREATE_WORD_FIELD_OP:
   1070  1.1.1.2.8.2  jruoho     case AML_CREATE_DWORD_FIELD_OP:
   1071  1.1.1.2.8.2  jruoho     case AML_CREATE_QWORD_FIELD_OP:
   1072  1.1.1.2.8.2  jruoho 
   1073  1.1.1.2.8.2  jruoho         Child = UtGetArg (Op, 2);
   1074  1.1.1.2.8.2  jruoho         break;
   1075  1.1.1.2.8.2  jruoho 
   1076  1.1.1.2.8.2  jruoho     case AML_CREATE_FIELD_OP:
   1077  1.1.1.2.8.2  jruoho 
   1078  1.1.1.2.8.2  jruoho         Child = UtGetArg (Op, 3);
   1079  1.1.1.2.8.2  jruoho         break;
   1080  1.1.1.2.8.2  jruoho 
   1081  1.1.1.2.8.2  jruoho     case AML_BANK_FIELD_OP:
   1082  1.1.1.2.8.2  jruoho     case AML_INDEX_FIELD_OP:
   1083  1.1.1.2.8.2  jruoho     case AML_FIELD_OP:
   1084  1.1.1.2.8.2  jruoho 
   1085  1.1.1.2.8.2  jruoho         return;
   1086  1.1.1.2.8.2  jruoho 
   1087  1.1.1.2.8.2  jruoho     default:
   1088  1.1.1.2.8.2  jruoho         return;
   1089  1.1.1.2.8.2  jruoho     }
   1090  1.1.1.2.8.2  jruoho 
   1091  1.1.1.2.8.2  jruoho     if (Child)
   1092  1.1.1.2.8.2  jruoho     {
   1093  1.1.1.2.8.2  jruoho         UtAttachNamepathToOwner (Op, Child);
   1094  1.1.1.2.8.2  jruoho     }
   1095  1.1.1.2.8.2  jruoho }
   1096  1.1.1.2.8.2  jruoho 
   1097  1.1.1.2.8.2  jruoho 
   1098  1.1.1.2.8.2  jruoho /*******************************************************************************
   1099  1.1.1.2.8.2  jruoho  *
   1100  1.1.1.2.8.2  jruoho  * FUNCTION:    OpnGenerateAmlOperands
   1101  1.1.1.2.8.2  jruoho  *
   1102  1.1.1.2.8.2  jruoho  * PARAMETERS:  Op        - The parent parse node
   1103  1.1.1.2.8.2  jruoho  *
   1104  1.1.1.2.8.2  jruoho  * RETURN:      None
   1105  1.1.1.2.8.2  jruoho  *
   1106  1.1.1.2.8.2  jruoho  * DESCRIPTION: Prepare nodes to be output as AML data and operands.  The more
   1107  1.1.1.2.8.2  jruoho  *              complex AML opcodes require processing of the child nodes
   1108  1.1.1.2.8.2  jruoho  *              (arguments/operands).
   1109  1.1.1.2.8.2  jruoho  *
   1110  1.1.1.2.8.2  jruoho  ******************************************************************************/
   1111  1.1.1.2.8.2  jruoho 
   1112  1.1.1.2.8.2  jruoho void
   1113  1.1.1.2.8.2  jruoho OpnGenerateAmlOperands (
   1114  1.1.1.2.8.2  jruoho     ACPI_PARSE_OBJECT       *Op)
   1115  1.1.1.2.8.2  jruoho {
   1116  1.1.1.2.8.2  jruoho 
   1117  1.1.1.2.8.2  jruoho 
   1118  1.1.1.2.8.2  jruoho     if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
   1119  1.1.1.2.8.2  jruoho     {
   1120  1.1.1.2.8.2  jruoho         return;
   1121  1.1.1.2.8.2  jruoho     }
   1122  1.1.1.2.8.2  jruoho 
   1123  1.1.1.2.8.2  jruoho     switch (Op->Asl.ParseOpcode)
   1124  1.1.1.2.8.2  jruoho     {
   1125  1.1.1.2.8.2  jruoho     case PARSEOP_DEFINITIONBLOCK:
   1126  1.1.1.2.8.2  jruoho         OpnDoDefinitionBlock (Op);
   1127  1.1.1.2.8.2  jruoho         break;
   1128  1.1.1.2.8.2  jruoho 
   1129  1.1.1.2.8.2  jruoho     case PARSEOP_METHOD:
   1130  1.1.1.2.8.2  jruoho         OpnDoMethod (Op);
   1131  1.1.1.2.8.2  jruoho         break;
   1132  1.1.1.2.8.2  jruoho 
   1133  1.1.1.2.8.2  jruoho     case PARSEOP_MUTEX:
   1134  1.1.1.2.8.2  jruoho         OpnDoMutex (Op);
   1135  1.1.1.2.8.2  jruoho         break;
   1136  1.1.1.2.8.2  jruoho 
   1137  1.1.1.2.8.2  jruoho     case PARSEOP_FIELD:
   1138  1.1.1.2.8.2  jruoho         OpnDoField (Op);
   1139  1.1.1.2.8.2  jruoho         break;
   1140  1.1.1.2.8.2  jruoho 
   1141  1.1.1.2.8.2  jruoho     case PARSEOP_INDEXFIELD:
   1142  1.1.1.2.8.2  jruoho         OpnDoIndexField (Op);
   1143  1.1.1.2.8.2  jruoho         break;
   1144  1.1.1.2.8.2  jruoho 
   1145  1.1.1.2.8.2  jruoho     case PARSEOP_BANKFIELD:
   1146  1.1.1.2.8.2  jruoho         OpnDoBankField (Op);
   1147  1.1.1.2.8.2  jruoho         break;
   1148  1.1.1.2.8.2  jruoho 
   1149  1.1.1.2.8.2  jruoho     case PARSEOP_BUFFER:
   1150  1.1.1.2.8.2  jruoho         OpnDoBuffer (Op);
   1151  1.1.1.2.8.2  jruoho         break;
   1152  1.1.1.2.8.2  jruoho 
   1153  1.1.1.2.8.2  jruoho     case PARSEOP_LOADTABLE:
   1154  1.1.1.2.8.2  jruoho         OpnDoLoadTable (Op);
   1155  1.1.1.2.8.2  jruoho         break;
   1156  1.1.1.2.8.2  jruoho 
   1157  1.1.1.2.8.2  jruoho     case PARSEOP_OPERATIONREGION:
   1158  1.1.1.2.8.2  jruoho         OpnDoRegion (Op);
   1159  1.1.1.2.8.2  jruoho         break;
   1160  1.1.1.2.8.2  jruoho 
   1161  1.1.1.2.8.2  jruoho     case PARSEOP_RESOURCETEMPLATE:
   1162  1.1.1.2.8.2  jruoho         RsDoResourceTemplate (Op);
   1163  1.1.1.2.8.2  jruoho         break;
   1164  1.1.1.2.8.2  jruoho 
   1165  1.1.1.2.8.2  jruoho     case PARSEOP_NAMESEG:
   1166  1.1.1.2.8.2  jruoho     case PARSEOP_NAMESTRING:
   1167  1.1.1.2.8.2  jruoho     case PARSEOP_METHODCALL:
   1168  1.1.1.2.8.2  jruoho     case PARSEOP_STRING_LITERAL:
   1169  1.1.1.2.8.2  jruoho         break;
   1170  1.1.1.2.8.2  jruoho 
   1171  1.1.1.2.8.2  jruoho     default:
   1172  1.1.1.2.8.2  jruoho         break;
   1173  1.1.1.2.8.2  jruoho     }
   1174  1.1.1.2.8.2  jruoho 
   1175  1.1.1.2.8.2  jruoho     /* TBD: move */
   1176  1.1.1.2.8.2  jruoho 
   1177  1.1.1.2.8.2  jruoho     OpnAttachNameToNode (Op);
   1178  1.1.1.2.8.2  jruoho }
   1179  1.1.1.2.8.2  jruoho 
   1180  1.1.1.2.8.2  jruoho 
   1181