Home | History | Annotate | Line # | Download | only in disassembler
dmwalk.c revision 1.1.1.2.2.2
      1  1.1.1.2.2.2  bouyer /*******************************************************************************
      2  1.1.1.2.2.2  bouyer  *
      3  1.1.1.2.2.2  bouyer  * Module Name: dmwalk - AML disassembly tree walk
      4  1.1.1.2.2.2  bouyer  *
      5  1.1.1.2.2.2  bouyer  ******************************************************************************/
      6  1.1.1.2.2.2  bouyer 
      7  1.1.1.2.2.2  bouyer /*
      8  1.1.1.2.2.2  bouyer  * Copyright (C) 2000 - 2011, Intel Corp.
      9  1.1.1.2.2.2  bouyer  * All rights reserved.
     10  1.1.1.2.2.2  bouyer  *
     11  1.1.1.2.2.2  bouyer  * Redistribution and use in source and binary forms, with or without
     12  1.1.1.2.2.2  bouyer  * modification, are permitted provided that the following conditions
     13  1.1.1.2.2.2  bouyer  * are met:
     14  1.1.1.2.2.2  bouyer  * 1. Redistributions of source code must retain the above copyright
     15  1.1.1.2.2.2  bouyer  *    notice, this list of conditions, and the following disclaimer,
     16  1.1.1.2.2.2  bouyer  *    without modification.
     17  1.1.1.2.2.2  bouyer  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.1.1.2.2.2  bouyer  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.1.1.2.2.2  bouyer  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.1.1.2.2.2  bouyer  *    including a substantially similar Disclaimer requirement for further
     21  1.1.1.2.2.2  bouyer  *    binary redistribution.
     22  1.1.1.2.2.2  bouyer  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.1.1.2.2.2  bouyer  *    of any contributors may be used to endorse or promote products derived
     24  1.1.1.2.2.2  bouyer  *    from this software without specific prior written permission.
     25  1.1.1.2.2.2  bouyer  *
     26  1.1.1.2.2.2  bouyer  * Alternatively, this software may be distributed under the terms of the
     27  1.1.1.2.2.2  bouyer  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.1.1.2.2.2  bouyer  * Software Foundation.
     29  1.1.1.2.2.2  bouyer  *
     30  1.1.1.2.2.2  bouyer  * NO WARRANTY
     31  1.1.1.2.2.2  bouyer  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.1.1.2.2.2  bouyer  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.2.2.2  bouyer  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.1.1.2.2.2  bouyer  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.1.1.2.2.2  bouyer  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.1.1.2.2.2  bouyer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.1.1.2.2.2  bouyer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.1.1.2.2.2  bouyer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.1.1.2.2.2  bouyer  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.1.1.2.2.2  bouyer  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.1.1.2.2.2  bouyer  * POSSIBILITY OF SUCH DAMAGES.
     42  1.1.1.2.2.2  bouyer  */
     43  1.1.1.2.2.2  bouyer 
     44  1.1.1.2.2.2  bouyer 
     45  1.1.1.2.2.2  bouyer #include "acpi.h"
     46  1.1.1.2.2.2  bouyer #include "accommon.h"
     47  1.1.1.2.2.2  bouyer #include "acparser.h"
     48  1.1.1.2.2.2  bouyer #include "amlcode.h"
     49  1.1.1.2.2.2  bouyer #include "acdisasm.h"
     50  1.1.1.2.2.2  bouyer #include "acdebug.h"
     51  1.1.1.2.2.2  bouyer 
     52  1.1.1.2.2.2  bouyer 
     53  1.1.1.2.2.2  bouyer #ifdef ACPI_DISASSEMBLER
     54  1.1.1.2.2.2  bouyer 
     55  1.1.1.2.2.2  bouyer #define _COMPONENT          ACPI_CA_DEBUGGER
     56  1.1.1.2.2.2  bouyer         ACPI_MODULE_NAME    ("dmwalk")
     57  1.1.1.2.2.2  bouyer 
     58  1.1.1.2.2.2  bouyer 
     59  1.1.1.2.2.2  bouyer #define DB_FULL_OP_INFO     "[%4.4s] @%5.5X #%4.4X:  "
     60  1.1.1.2.2.2  bouyer 
     61  1.1.1.2.2.2  bouyer /* Stub for non-compiler code */
     62  1.1.1.2.2.2  bouyer 
     63  1.1.1.2.2.2  bouyer #ifndef ACPI_ASL_COMPILER
     64  1.1.1.2.2.2  bouyer void
     65  1.1.1.2.2.2  bouyer AcpiDmEmitExternals (
     66  1.1.1.2.2.2  bouyer     void)
     67  1.1.1.2.2.2  bouyer {
     68  1.1.1.2.2.2  bouyer     return;
     69  1.1.1.2.2.2  bouyer }
     70  1.1.1.2.2.2  bouyer #endif
     71  1.1.1.2.2.2  bouyer 
     72  1.1.1.2.2.2  bouyer /* Local prototypes */
     73  1.1.1.2.2.2  bouyer 
     74  1.1.1.2.2.2  bouyer static ACPI_STATUS
     75  1.1.1.2.2.2  bouyer AcpiDmDescendingOp (
     76  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op,
     77  1.1.1.2.2.2  bouyer     UINT32                  Level,
     78  1.1.1.2.2.2  bouyer     void                    *Context);
     79  1.1.1.2.2.2  bouyer 
     80  1.1.1.2.2.2  bouyer static ACPI_STATUS
     81  1.1.1.2.2.2  bouyer AcpiDmAscendingOp (
     82  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op,
     83  1.1.1.2.2.2  bouyer     UINT32                  Level,
     84  1.1.1.2.2.2  bouyer     void                    *Context);
     85  1.1.1.2.2.2  bouyer 
     86  1.1.1.2.2.2  bouyer static UINT32
     87  1.1.1.2.2.2  bouyer AcpiDmBlockType (
     88  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op);
     89  1.1.1.2.2.2  bouyer 
     90  1.1.1.2.2.2  bouyer 
     91  1.1.1.2.2.2  bouyer /*******************************************************************************
     92  1.1.1.2.2.2  bouyer  *
     93  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmDisassemble
     94  1.1.1.2.2.2  bouyer  *
     95  1.1.1.2.2.2  bouyer  * PARAMETERS:  WalkState       - Current state
     96  1.1.1.2.2.2  bouyer  *              Origin          - Starting object
     97  1.1.1.2.2.2  bouyer  *              NumOpcodes      - Max number of opcodes to be displayed
     98  1.1.1.2.2.2  bouyer  *
     99  1.1.1.2.2.2  bouyer  * RETURN:      None
    100  1.1.1.2.2.2  bouyer  *
    101  1.1.1.2.2.2  bouyer  * DESCRIPTION: Disassemble parser object and its children.  This is the
    102  1.1.1.2.2.2  bouyer  *              main entry point of the disassembler.
    103  1.1.1.2.2.2  bouyer  *
    104  1.1.1.2.2.2  bouyer  ******************************************************************************/
    105  1.1.1.2.2.2  bouyer 
    106  1.1.1.2.2.2  bouyer void
    107  1.1.1.2.2.2  bouyer AcpiDmDisassemble (
    108  1.1.1.2.2.2  bouyer     ACPI_WALK_STATE         *WalkState,
    109  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Origin,
    110  1.1.1.2.2.2  bouyer     UINT32                  NumOpcodes)
    111  1.1.1.2.2.2  bouyer {
    112  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op = Origin;
    113  1.1.1.2.2.2  bouyer     ACPI_OP_WALK_INFO       Info;
    114  1.1.1.2.2.2  bouyer 
    115  1.1.1.2.2.2  bouyer 
    116  1.1.1.2.2.2  bouyer     if (!Op)
    117  1.1.1.2.2.2  bouyer     {
    118  1.1.1.2.2.2  bouyer         return;
    119  1.1.1.2.2.2  bouyer     }
    120  1.1.1.2.2.2  bouyer 
    121  1.1.1.2.2.2  bouyer     Info.Flags = 0;
    122  1.1.1.2.2.2  bouyer     Info.Level = 0;
    123  1.1.1.2.2.2  bouyer     Info.Count = 0;
    124  1.1.1.2.2.2  bouyer     Info.WalkState = WalkState;
    125  1.1.1.2.2.2  bouyer     AcpiDmWalkParseTree (Op, AcpiDmDescendingOp, AcpiDmAscendingOp, &Info);
    126  1.1.1.2.2.2  bouyer     return;
    127  1.1.1.2.2.2  bouyer }
    128  1.1.1.2.2.2  bouyer 
    129  1.1.1.2.2.2  bouyer 
    130  1.1.1.2.2.2  bouyer /*******************************************************************************
    131  1.1.1.2.2.2  bouyer  *
    132  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmWalkParseTree
    133  1.1.1.2.2.2  bouyer  *
    134  1.1.1.2.2.2  bouyer  * PARAMETERS:  Op                      - Root Op object
    135  1.1.1.2.2.2  bouyer  *              DescendingCallback      - Called during tree descent
    136  1.1.1.2.2.2  bouyer  *              AscendingCallback       - Called during tree ascent
    137  1.1.1.2.2.2  bouyer  *              Context                 - To be passed to the callbacks
    138  1.1.1.2.2.2  bouyer  *
    139  1.1.1.2.2.2  bouyer  * RETURN:      Status from callback(s)
    140  1.1.1.2.2.2  bouyer  *
    141  1.1.1.2.2.2  bouyer  * DESCRIPTION: Walk the entire parse tree.
    142  1.1.1.2.2.2  bouyer  *
    143  1.1.1.2.2.2  bouyer  ******************************************************************************/
    144  1.1.1.2.2.2  bouyer 
    145  1.1.1.2.2.2  bouyer void
    146  1.1.1.2.2.2  bouyer AcpiDmWalkParseTree (
    147  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op,
    148  1.1.1.2.2.2  bouyer     ASL_WALK_CALLBACK       DescendingCallback,
    149  1.1.1.2.2.2  bouyer     ASL_WALK_CALLBACK       AscendingCallback,
    150  1.1.1.2.2.2  bouyer     void                    *Context)
    151  1.1.1.2.2.2  bouyer {
    152  1.1.1.2.2.2  bouyer     BOOLEAN                 NodePreviouslyVisited;
    153  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *StartOp = Op;
    154  1.1.1.2.2.2  bouyer     ACPI_STATUS             Status;
    155  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Next;
    156  1.1.1.2.2.2  bouyer     ACPI_OP_WALK_INFO       *Info = Context;
    157  1.1.1.2.2.2  bouyer 
    158  1.1.1.2.2.2  bouyer 
    159  1.1.1.2.2.2  bouyer     Info->Level = 0;
    160  1.1.1.2.2.2  bouyer     NodePreviouslyVisited = FALSE;
    161  1.1.1.2.2.2  bouyer 
    162  1.1.1.2.2.2  bouyer     while (Op)
    163  1.1.1.2.2.2  bouyer     {
    164  1.1.1.2.2.2  bouyer         if (NodePreviouslyVisited)
    165  1.1.1.2.2.2  bouyer         {
    166  1.1.1.2.2.2  bouyer             if (AscendingCallback)
    167  1.1.1.2.2.2  bouyer             {
    168  1.1.1.2.2.2  bouyer                 Status = AscendingCallback (Op, Info->Level, Context);
    169  1.1.1.2.2.2  bouyer                 if (ACPI_FAILURE (Status))
    170  1.1.1.2.2.2  bouyer                 {
    171  1.1.1.2.2.2  bouyer                     return;
    172  1.1.1.2.2.2  bouyer                 }
    173  1.1.1.2.2.2  bouyer             }
    174  1.1.1.2.2.2  bouyer         }
    175  1.1.1.2.2.2  bouyer         else
    176  1.1.1.2.2.2  bouyer         {
    177  1.1.1.2.2.2  bouyer             /* Let the callback process the node */
    178  1.1.1.2.2.2  bouyer 
    179  1.1.1.2.2.2  bouyer             Status = DescendingCallback (Op, Info->Level, Context);
    180  1.1.1.2.2.2  bouyer             if (ACPI_SUCCESS (Status))
    181  1.1.1.2.2.2  bouyer             {
    182  1.1.1.2.2.2  bouyer                 /* Visit children first, once */
    183  1.1.1.2.2.2  bouyer 
    184  1.1.1.2.2.2  bouyer                 Next = AcpiPsGetArg (Op, 0);
    185  1.1.1.2.2.2  bouyer                 if (Next)
    186  1.1.1.2.2.2  bouyer                 {
    187  1.1.1.2.2.2  bouyer                     Info->Level++;
    188  1.1.1.2.2.2  bouyer                     Op = Next;
    189  1.1.1.2.2.2  bouyer                     continue;
    190  1.1.1.2.2.2  bouyer                 }
    191  1.1.1.2.2.2  bouyer             }
    192  1.1.1.2.2.2  bouyer             else if (Status != AE_CTRL_DEPTH)
    193  1.1.1.2.2.2  bouyer             {
    194  1.1.1.2.2.2  bouyer                 /* Exit immediately on any error */
    195  1.1.1.2.2.2  bouyer 
    196  1.1.1.2.2.2  bouyer                 return;
    197  1.1.1.2.2.2  bouyer             }
    198  1.1.1.2.2.2  bouyer         }
    199  1.1.1.2.2.2  bouyer 
    200  1.1.1.2.2.2  bouyer         /* Terminate walk at start op */
    201  1.1.1.2.2.2  bouyer 
    202  1.1.1.2.2.2  bouyer         if (Op == StartOp)
    203  1.1.1.2.2.2  bouyer         {
    204  1.1.1.2.2.2  bouyer             break;
    205  1.1.1.2.2.2  bouyer         }
    206  1.1.1.2.2.2  bouyer 
    207  1.1.1.2.2.2  bouyer         /* No more children, re-visit this node */
    208  1.1.1.2.2.2  bouyer 
    209  1.1.1.2.2.2  bouyer         if (!NodePreviouslyVisited)
    210  1.1.1.2.2.2  bouyer         {
    211  1.1.1.2.2.2  bouyer             NodePreviouslyVisited = TRUE;
    212  1.1.1.2.2.2  bouyer             continue;
    213  1.1.1.2.2.2  bouyer         }
    214  1.1.1.2.2.2  bouyer 
    215  1.1.1.2.2.2  bouyer         /* No more children, visit peers */
    216  1.1.1.2.2.2  bouyer 
    217  1.1.1.2.2.2  bouyer         if (Op->Common.Next)
    218  1.1.1.2.2.2  bouyer         {
    219  1.1.1.2.2.2  bouyer             Op = Op->Common.Next;
    220  1.1.1.2.2.2  bouyer             NodePreviouslyVisited = FALSE;
    221  1.1.1.2.2.2  bouyer         }
    222  1.1.1.2.2.2  bouyer         else
    223  1.1.1.2.2.2  bouyer         {
    224  1.1.1.2.2.2  bouyer             /* No peers, re-visit parent */
    225  1.1.1.2.2.2  bouyer 
    226  1.1.1.2.2.2  bouyer             if (Info->Level != 0 )
    227  1.1.1.2.2.2  bouyer             {
    228  1.1.1.2.2.2  bouyer                 Info->Level--;
    229  1.1.1.2.2.2  bouyer             }
    230  1.1.1.2.2.2  bouyer 
    231  1.1.1.2.2.2  bouyer             Op = Op->Common.Parent;
    232  1.1.1.2.2.2  bouyer             NodePreviouslyVisited = TRUE;
    233  1.1.1.2.2.2  bouyer         }
    234  1.1.1.2.2.2  bouyer     }
    235  1.1.1.2.2.2  bouyer 
    236  1.1.1.2.2.2  bouyer     /* If we get here, the walk completed with no errors */
    237  1.1.1.2.2.2  bouyer 
    238  1.1.1.2.2.2  bouyer     return;
    239  1.1.1.2.2.2  bouyer }
    240  1.1.1.2.2.2  bouyer 
    241  1.1.1.2.2.2  bouyer 
    242  1.1.1.2.2.2  bouyer /*******************************************************************************
    243  1.1.1.2.2.2  bouyer  *
    244  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmBlockType
    245  1.1.1.2.2.2  bouyer  *
    246  1.1.1.2.2.2  bouyer  * PARAMETERS:  Op              - Object to be examined
    247  1.1.1.2.2.2  bouyer  *
    248  1.1.1.2.2.2  bouyer  * RETURN:      BlockType - not a block, parens, braces, or even both.
    249  1.1.1.2.2.2  bouyer  *
    250  1.1.1.2.2.2  bouyer  * DESCRIPTION: Type of block for this op (parens or braces)
    251  1.1.1.2.2.2  bouyer  *
    252  1.1.1.2.2.2  bouyer  ******************************************************************************/
    253  1.1.1.2.2.2  bouyer 
    254  1.1.1.2.2.2  bouyer static UINT32
    255  1.1.1.2.2.2  bouyer AcpiDmBlockType (
    256  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op)
    257  1.1.1.2.2.2  bouyer {
    258  1.1.1.2.2.2  bouyer     const ACPI_OPCODE_INFO  *OpInfo;
    259  1.1.1.2.2.2  bouyer 
    260  1.1.1.2.2.2  bouyer 
    261  1.1.1.2.2.2  bouyer     if (!Op)
    262  1.1.1.2.2.2  bouyer     {
    263  1.1.1.2.2.2  bouyer         return (BLOCK_NONE);
    264  1.1.1.2.2.2  bouyer     }
    265  1.1.1.2.2.2  bouyer 
    266  1.1.1.2.2.2  bouyer     switch (Op->Common.AmlOpcode)
    267  1.1.1.2.2.2  bouyer     {
    268  1.1.1.2.2.2  bouyer     case AML_ELSE_OP:
    269  1.1.1.2.2.2  bouyer 
    270  1.1.1.2.2.2  bouyer         return (BLOCK_BRACE);
    271  1.1.1.2.2.2  bouyer 
    272  1.1.1.2.2.2  bouyer     case AML_METHOD_OP:
    273  1.1.1.2.2.2  bouyer     case AML_DEVICE_OP:
    274  1.1.1.2.2.2  bouyer     case AML_SCOPE_OP:
    275  1.1.1.2.2.2  bouyer     case AML_PROCESSOR_OP:
    276  1.1.1.2.2.2  bouyer     case AML_POWER_RES_OP:
    277  1.1.1.2.2.2  bouyer     case AML_THERMAL_ZONE_OP:
    278  1.1.1.2.2.2  bouyer     case AML_IF_OP:
    279  1.1.1.2.2.2  bouyer     case AML_WHILE_OP:
    280  1.1.1.2.2.2  bouyer     case AML_FIELD_OP:
    281  1.1.1.2.2.2  bouyer     case AML_INDEX_FIELD_OP:
    282  1.1.1.2.2.2  bouyer     case AML_BANK_FIELD_OP:
    283  1.1.1.2.2.2  bouyer 
    284  1.1.1.2.2.2  bouyer         return (BLOCK_PAREN | BLOCK_BRACE);
    285  1.1.1.2.2.2  bouyer 
    286  1.1.1.2.2.2  bouyer     case AML_BUFFER_OP:
    287  1.1.1.2.2.2  bouyer 
    288  1.1.1.2.2.2  bouyer         if (Op->Common.DisasmOpcode == ACPI_DASM_UNICODE)
    289  1.1.1.2.2.2  bouyer         {
    290  1.1.1.2.2.2  bouyer             return (BLOCK_NONE);
    291  1.1.1.2.2.2  bouyer         }
    292  1.1.1.2.2.2  bouyer 
    293  1.1.1.2.2.2  bouyer         /*lint -fallthrough */
    294  1.1.1.2.2.2  bouyer 
    295  1.1.1.2.2.2  bouyer     case AML_PACKAGE_OP:
    296  1.1.1.2.2.2  bouyer     case AML_VAR_PACKAGE_OP:
    297  1.1.1.2.2.2  bouyer 
    298  1.1.1.2.2.2  bouyer         return (BLOCK_PAREN | BLOCK_BRACE);
    299  1.1.1.2.2.2  bouyer 
    300  1.1.1.2.2.2  bouyer     case AML_EVENT_OP:
    301  1.1.1.2.2.2  bouyer 
    302  1.1.1.2.2.2  bouyer         return (BLOCK_PAREN);
    303  1.1.1.2.2.2  bouyer 
    304  1.1.1.2.2.2  bouyer     default:
    305  1.1.1.2.2.2  bouyer 
    306  1.1.1.2.2.2  bouyer         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    307  1.1.1.2.2.2  bouyer         if (OpInfo->Flags & AML_HAS_ARGS)
    308  1.1.1.2.2.2  bouyer         {
    309  1.1.1.2.2.2  bouyer             return (BLOCK_PAREN);
    310  1.1.1.2.2.2  bouyer         }
    311  1.1.1.2.2.2  bouyer 
    312  1.1.1.2.2.2  bouyer         return (BLOCK_NONE);
    313  1.1.1.2.2.2  bouyer     }
    314  1.1.1.2.2.2  bouyer }
    315  1.1.1.2.2.2  bouyer 
    316  1.1.1.2.2.2  bouyer 
    317  1.1.1.2.2.2  bouyer /*******************************************************************************
    318  1.1.1.2.2.2  bouyer  *
    319  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmListType
    320  1.1.1.2.2.2  bouyer  *
    321  1.1.1.2.2.2  bouyer  * PARAMETERS:  Op              - Object to be examined
    322  1.1.1.2.2.2  bouyer  *
    323  1.1.1.2.2.2  bouyer  * RETURN:      ListType - has commas or not.
    324  1.1.1.2.2.2  bouyer  *
    325  1.1.1.2.2.2  bouyer  * DESCRIPTION: Type of block for this op (parens or braces)
    326  1.1.1.2.2.2  bouyer  *
    327  1.1.1.2.2.2  bouyer  ******************************************************************************/
    328  1.1.1.2.2.2  bouyer 
    329  1.1.1.2.2.2  bouyer UINT32
    330  1.1.1.2.2.2  bouyer AcpiDmListType (
    331  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op)
    332  1.1.1.2.2.2  bouyer {
    333  1.1.1.2.2.2  bouyer     const ACPI_OPCODE_INFO  *OpInfo;
    334  1.1.1.2.2.2  bouyer 
    335  1.1.1.2.2.2  bouyer 
    336  1.1.1.2.2.2  bouyer     if (!Op)
    337  1.1.1.2.2.2  bouyer     {
    338  1.1.1.2.2.2  bouyer         return (BLOCK_NONE);
    339  1.1.1.2.2.2  bouyer     }
    340  1.1.1.2.2.2  bouyer 
    341  1.1.1.2.2.2  bouyer     switch (Op->Common.AmlOpcode)
    342  1.1.1.2.2.2  bouyer     {
    343  1.1.1.2.2.2  bouyer 
    344  1.1.1.2.2.2  bouyer     case AML_ELSE_OP:
    345  1.1.1.2.2.2  bouyer     case AML_METHOD_OP:
    346  1.1.1.2.2.2  bouyer     case AML_DEVICE_OP:
    347  1.1.1.2.2.2  bouyer     case AML_SCOPE_OP:
    348  1.1.1.2.2.2  bouyer     case AML_POWER_RES_OP:
    349  1.1.1.2.2.2  bouyer     case AML_PROCESSOR_OP:
    350  1.1.1.2.2.2  bouyer     case AML_THERMAL_ZONE_OP:
    351  1.1.1.2.2.2  bouyer     case AML_IF_OP:
    352  1.1.1.2.2.2  bouyer     case AML_WHILE_OP:
    353  1.1.1.2.2.2  bouyer     case AML_FIELD_OP:
    354  1.1.1.2.2.2  bouyer     case AML_INDEX_FIELD_OP:
    355  1.1.1.2.2.2  bouyer     case AML_BANK_FIELD_OP:
    356  1.1.1.2.2.2  bouyer 
    357  1.1.1.2.2.2  bouyer         return (BLOCK_NONE);
    358  1.1.1.2.2.2  bouyer 
    359  1.1.1.2.2.2  bouyer     case AML_BUFFER_OP:
    360  1.1.1.2.2.2  bouyer     case AML_PACKAGE_OP:
    361  1.1.1.2.2.2  bouyer     case AML_VAR_PACKAGE_OP:
    362  1.1.1.2.2.2  bouyer 
    363  1.1.1.2.2.2  bouyer         return (BLOCK_COMMA_LIST);
    364  1.1.1.2.2.2  bouyer 
    365  1.1.1.2.2.2  bouyer     default:
    366  1.1.1.2.2.2  bouyer 
    367  1.1.1.2.2.2  bouyer         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    368  1.1.1.2.2.2  bouyer         if (OpInfo->Flags & AML_HAS_ARGS)
    369  1.1.1.2.2.2  bouyer         {
    370  1.1.1.2.2.2  bouyer             return (BLOCK_COMMA_LIST);
    371  1.1.1.2.2.2  bouyer         }
    372  1.1.1.2.2.2  bouyer 
    373  1.1.1.2.2.2  bouyer         return (BLOCK_NONE);
    374  1.1.1.2.2.2  bouyer     }
    375  1.1.1.2.2.2  bouyer }
    376  1.1.1.2.2.2  bouyer 
    377  1.1.1.2.2.2  bouyer 
    378  1.1.1.2.2.2  bouyer /*******************************************************************************
    379  1.1.1.2.2.2  bouyer  *
    380  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmDescendingOp
    381  1.1.1.2.2.2  bouyer  *
    382  1.1.1.2.2.2  bouyer  * PARAMETERS:  ASL_WALK_CALLBACK
    383  1.1.1.2.2.2  bouyer  *
    384  1.1.1.2.2.2  bouyer  * RETURN:      Status
    385  1.1.1.2.2.2  bouyer  *
    386  1.1.1.2.2.2  bouyer  * DESCRIPTION: First visitation of a parse object during tree descent.
    387  1.1.1.2.2.2  bouyer  *              Decode opcode name and begin parameter list(s), if any.
    388  1.1.1.2.2.2  bouyer  *
    389  1.1.1.2.2.2  bouyer  ******************************************************************************/
    390  1.1.1.2.2.2  bouyer 
    391  1.1.1.2.2.2  bouyer static ACPI_STATUS
    392  1.1.1.2.2.2  bouyer AcpiDmDescendingOp (
    393  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op,
    394  1.1.1.2.2.2  bouyer     UINT32                  Level,
    395  1.1.1.2.2.2  bouyer     void                    *Context)
    396  1.1.1.2.2.2  bouyer {
    397  1.1.1.2.2.2  bouyer     ACPI_OP_WALK_INFO       *Info = Context;
    398  1.1.1.2.2.2  bouyer     const ACPI_OPCODE_INFO  *OpInfo;
    399  1.1.1.2.2.2  bouyer     UINT32                  Name;
    400  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *NextOp;
    401  1.1.1.2.2.2  bouyer 
    402  1.1.1.2.2.2  bouyer 
    403  1.1.1.2.2.2  bouyer     if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
    404  1.1.1.2.2.2  bouyer     {
    405  1.1.1.2.2.2  bouyer         /* Ignore this op -- it was handled elsewhere */
    406  1.1.1.2.2.2  bouyer 
    407  1.1.1.2.2.2  bouyer         return (AE_CTRL_DEPTH);
    408  1.1.1.2.2.2  bouyer     }
    409  1.1.1.2.2.2  bouyer 
    410  1.1.1.2.2.2  bouyer     /* Level 0 is at the Definition Block level */
    411  1.1.1.2.2.2  bouyer 
    412  1.1.1.2.2.2  bouyer     if (Level == 0)
    413  1.1.1.2.2.2  bouyer     {
    414  1.1.1.2.2.2  bouyer         /* In verbose mode, print the AML offset, opcode and depth count */
    415  1.1.1.2.2.2  bouyer 
    416  1.1.1.2.2.2  bouyer         if (Info->WalkState)
    417  1.1.1.2.2.2  bouyer         {
    418  1.1.1.2.2.2  bouyer             VERBOSE_PRINT ((DB_FULL_OP_INFO,
    419  1.1.1.2.2.2  bouyer                 (Info->WalkState->MethodNode ?
    420  1.1.1.2.2.2  bouyer                     Info->WalkState->MethodNode->Name.Ascii : "   "),
    421  1.1.1.2.2.2  bouyer                 Op->Common.AmlOffset, (UINT32) Op->Common.AmlOpcode));
    422  1.1.1.2.2.2  bouyer         }
    423  1.1.1.2.2.2  bouyer 
    424  1.1.1.2.2.2  bouyer         if (Op->Common.AmlOpcode == AML_SCOPE_OP)
    425  1.1.1.2.2.2  bouyer         {
    426  1.1.1.2.2.2  bouyer             /* This is the beginning of the Definition Block */
    427  1.1.1.2.2.2  bouyer 
    428  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("{\n");
    429  1.1.1.2.2.2  bouyer 
    430  1.1.1.2.2.2  bouyer             /* Emit all External() declarations here */
    431  1.1.1.2.2.2  bouyer 
    432  1.1.1.2.2.2  bouyer             AcpiDmEmitExternals ();
    433  1.1.1.2.2.2  bouyer             return (AE_OK);
    434  1.1.1.2.2.2  bouyer         }
    435  1.1.1.2.2.2  bouyer     }
    436  1.1.1.2.2.2  bouyer     else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
    437  1.1.1.2.2.2  bouyer              (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
    438  1.1.1.2.2.2  bouyer              (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
    439  1.1.1.2.2.2  bouyer     {
    440  1.1.1.2.2.2  bouyer             /*
    441  1.1.1.2.2.2  bouyer              * This is a first-level element of a term list,
    442  1.1.1.2.2.2  bouyer              * indent a new line
    443  1.1.1.2.2.2  bouyer              */
    444  1.1.1.2.2.2  bouyer             AcpiDmIndent (Level);
    445  1.1.1.2.2.2  bouyer             Info->LastLevel = Level;
    446  1.1.1.2.2.2  bouyer             Info->Count = 0;
    447  1.1.1.2.2.2  bouyer     }
    448  1.1.1.2.2.2  bouyer 
    449  1.1.1.2.2.2  bouyer     /*
    450  1.1.1.2.2.2  bouyer      * This is an inexpensive mechanism to try and keep lines from getting
    451  1.1.1.2.2.2  bouyer      * too long. When the limit is hit, start a new line at the previous
    452  1.1.1.2.2.2  bouyer      * indent plus one. A better but more expensive mechanism would be to
    453  1.1.1.2.2.2  bouyer      * keep track of the current column.
    454  1.1.1.2.2.2  bouyer      */
    455  1.1.1.2.2.2  bouyer     Info->Count++;
    456  1.1.1.2.2.2  bouyer     if (Info->Count /*+Info->LastLevel*/ > 10)
    457  1.1.1.2.2.2  bouyer     {
    458  1.1.1.2.2.2  bouyer         Info->Count = 0;
    459  1.1.1.2.2.2  bouyer         AcpiOsPrintf ("\n");
    460  1.1.1.2.2.2  bouyer         AcpiDmIndent (Info->LastLevel + 1);
    461  1.1.1.2.2.2  bouyer     }
    462  1.1.1.2.2.2  bouyer 
    463  1.1.1.2.2.2  bouyer     /* Print the opcode name */
    464  1.1.1.2.2.2  bouyer 
    465  1.1.1.2.2.2  bouyer     AcpiDmDisassembleOneOp (NULL, Info, Op);
    466  1.1.1.2.2.2  bouyer 
    467  1.1.1.2.2.2  bouyer     if (Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX)
    468  1.1.1.2.2.2  bouyer     {
    469  1.1.1.2.2.2  bouyer         return (AE_OK);
    470  1.1.1.2.2.2  bouyer     }
    471  1.1.1.2.2.2  bouyer 
    472  1.1.1.2.2.2  bouyer     if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
    473  1.1.1.2.2.2  bouyer         (Op->Common.AmlOpcode == AML_RETURN_OP))
    474  1.1.1.2.2.2  bouyer     {
    475  1.1.1.2.2.2  bouyer         Info->Level--;
    476  1.1.1.2.2.2  bouyer     }
    477  1.1.1.2.2.2  bouyer 
    478  1.1.1.2.2.2  bouyer     /* Start the opcode argument list if necessary */
    479  1.1.1.2.2.2  bouyer 
    480  1.1.1.2.2.2  bouyer     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
    481  1.1.1.2.2.2  bouyer 
    482  1.1.1.2.2.2  bouyer     if ((OpInfo->Flags & AML_HAS_ARGS) ||
    483  1.1.1.2.2.2  bouyer         (Op->Common.AmlOpcode == AML_EVENT_OP))
    484  1.1.1.2.2.2  bouyer     {
    485  1.1.1.2.2.2  bouyer         /* This opcode has an argument list */
    486  1.1.1.2.2.2  bouyer 
    487  1.1.1.2.2.2  bouyer         if (AcpiDmBlockType (Op) & BLOCK_PAREN)
    488  1.1.1.2.2.2  bouyer         {
    489  1.1.1.2.2.2  bouyer             AcpiOsPrintf (" (");
    490  1.1.1.2.2.2  bouyer         }
    491  1.1.1.2.2.2  bouyer 
    492  1.1.1.2.2.2  bouyer         /* If this is a named opcode, print the associated name value */
    493  1.1.1.2.2.2  bouyer 
    494  1.1.1.2.2.2  bouyer         if (OpInfo->Flags & AML_NAMED)
    495  1.1.1.2.2.2  bouyer         {
    496  1.1.1.2.2.2  bouyer             switch (Op->Common.AmlOpcode)
    497  1.1.1.2.2.2  bouyer             {
    498  1.1.1.2.2.2  bouyer             case AML_ALIAS_OP:
    499  1.1.1.2.2.2  bouyer 
    500  1.1.1.2.2.2  bouyer                 NextOp = AcpiPsGetDepthNext (NULL, Op);
    501  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    502  1.1.1.2.2.2  bouyer                 AcpiDmNamestring (NextOp->Common.Value.Name);
    503  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    504  1.1.1.2.2.2  bouyer 
    505  1.1.1.2.2.2  bouyer                 /*lint -fallthrough */
    506  1.1.1.2.2.2  bouyer 
    507  1.1.1.2.2.2  bouyer             default:
    508  1.1.1.2.2.2  bouyer 
    509  1.1.1.2.2.2  bouyer                 Name = AcpiPsGetName (Op);
    510  1.1.1.2.2.2  bouyer                 if (Op->Named.Path)
    511  1.1.1.2.2.2  bouyer                 {
    512  1.1.1.2.2.2  bouyer                     AcpiDmNamestring ((char *) Op->Named.Path);
    513  1.1.1.2.2.2  bouyer                 }
    514  1.1.1.2.2.2  bouyer                 else
    515  1.1.1.2.2.2  bouyer                 {
    516  1.1.1.2.2.2  bouyer                     AcpiDmDumpName (Name);
    517  1.1.1.2.2.2  bouyer                 }
    518  1.1.1.2.2.2  bouyer 
    519  1.1.1.2.2.2  bouyer                 if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP)
    520  1.1.1.2.2.2  bouyer                 {
    521  1.1.1.2.2.2  bouyer                     if (AcpiGbl_DbOpt_verbose)
    522  1.1.1.2.2.2  bouyer                     {
    523  1.1.1.2.2.2  bouyer                         (void) AcpiPsDisplayObjectPathname (NULL, Op);
    524  1.1.1.2.2.2  bouyer                     }
    525  1.1.1.2.2.2  bouyer                 }
    526  1.1.1.2.2.2  bouyer                 break;
    527  1.1.1.2.2.2  bouyer             }
    528  1.1.1.2.2.2  bouyer 
    529  1.1.1.2.2.2  bouyer             switch (Op->Common.AmlOpcode)
    530  1.1.1.2.2.2  bouyer             {
    531  1.1.1.2.2.2  bouyer             case AML_METHOD_OP:
    532  1.1.1.2.2.2  bouyer 
    533  1.1.1.2.2.2  bouyer                 AcpiDmMethodFlags (Op);
    534  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (")");
    535  1.1.1.2.2.2  bouyer                 break;
    536  1.1.1.2.2.2  bouyer 
    537  1.1.1.2.2.2  bouyer 
    538  1.1.1.2.2.2  bouyer             case AML_NAME_OP:
    539  1.1.1.2.2.2  bouyer 
    540  1.1.1.2.2.2  bouyer                 /* Check for _HID and related EISAID() */
    541  1.1.1.2.2.2  bouyer 
    542  1.1.1.2.2.2  bouyer                 AcpiDmIsEisaId (Op);
    543  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    544  1.1.1.2.2.2  bouyer                 break;
    545  1.1.1.2.2.2  bouyer 
    546  1.1.1.2.2.2  bouyer 
    547  1.1.1.2.2.2  bouyer             case AML_REGION_OP:
    548  1.1.1.2.2.2  bouyer 
    549  1.1.1.2.2.2  bouyer                 AcpiDmRegionFlags (Op);
    550  1.1.1.2.2.2  bouyer                 break;
    551  1.1.1.2.2.2  bouyer 
    552  1.1.1.2.2.2  bouyer 
    553  1.1.1.2.2.2  bouyer             case AML_POWER_RES_OP:
    554  1.1.1.2.2.2  bouyer 
    555  1.1.1.2.2.2  bouyer                 /* Mark the next two Ops as part of the parameter list */
    556  1.1.1.2.2.2  bouyer 
    557  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    558  1.1.1.2.2.2  bouyer                 NextOp = AcpiPsGetDepthNext (NULL, Op);
    559  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    560  1.1.1.2.2.2  bouyer 
    561  1.1.1.2.2.2  bouyer                 NextOp = NextOp->Common.Next;
    562  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    563  1.1.1.2.2.2  bouyer                 return (AE_OK);
    564  1.1.1.2.2.2  bouyer 
    565  1.1.1.2.2.2  bouyer 
    566  1.1.1.2.2.2  bouyer             case AML_PROCESSOR_OP:
    567  1.1.1.2.2.2  bouyer 
    568  1.1.1.2.2.2  bouyer                 /* Mark the next three Ops as part of the parameter list */
    569  1.1.1.2.2.2  bouyer 
    570  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    571  1.1.1.2.2.2  bouyer                 NextOp = AcpiPsGetDepthNext (NULL, Op);
    572  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    573  1.1.1.2.2.2  bouyer 
    574  1.1.1.2.2.2  bouyer                 NextOp = NextOp->Common.Next;
    575  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    576  1.1.1.2.2.2  bouyer 
    577  1.1.1.2.2.2  bouyer                 NextOp = NextOp->Common.Next;
    578  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    579  1.1.1.2.2.2  bouyer                 return (AE_OK);
    580  1.1.1.2.2.2  bouyer 
    581  1.1.1.2.2.2  bouyer 
    582  1.1.1.2.2.2  bouyer             case AML_MUTEX_OP:
    583  1.1.1.2.2.2  bouyer             case AML_DATA_REGION_OP:
    584  1.1.1.2.2.2  bouyer 
    585  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    586  1.1.1.2.2.2  bouyer                 return (AE_OK);
    587  1.1.1.2.2.2  bouyer 
    588  1.1.1.2.2.2  bouyer 
    589  1.1.1.2.2.2  bouyer             case AML_EVENT_OP:
    590  1.1.1.2.2.2  bouyer             case AML_ALIAS_OP:
    591  1.1.1.2.2.2  bouyer 
    592  1.1.1.2.2.2  bouyer                 return (AE_OK);
    593  1.1.1.2.2.2  bouyer 
    594  1.1.1.2.2.2  bouyer 
    595  1.1.1.2.2.2  bouyer             case AML_SCOPE_OP:
    596  1.1.1.2.2.2  bouyer             case AML_DEVICE_OP:
    597  1.1.1.2.2.2  bouyer             case AML_THERMAL_ZONE_OP:
    598  1.1.1.2.2.2  bouyer 
    599  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (")");
    600  1.1.1.2.2.2  bouyer                 break;
    601  1.1.1.2.2.2  bouyer 
    602  1.1.1.2.2.2  bouyer 
    603  1.1.1.2.2.2  bouyer             default:
    604  1.1.1.2.2.2  bouyer 
    605  1.1.1.2.2.2  bouyer                 AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
    606  1.1.1.2.2.2  bouyer                 break;
    607  1.1.1.2.2.2  bouyer             }
    608  1.1.1.2.2.2  bouyer         }
    609  1.1.1.2.2.2  bouyer 
    610  1.1.1.2.2.2  bouyer         else switch (Op->Common.AmlOpcode)
    611  1.1.1.2.2.2  bouyer         {
    612  1.1.1.2.2.2  bouyer         case AML_FIELD_OP:
    613  1.1.1.2.2.2  bouyer         case AML_BANK_FIELD_OP:
    614  1.1.1.2.2.2  bouyer         case AML_INDEX_FIELD_OP:
    615  1.1.1.2.2.2  bouyer 
    616  1.1.1.2.2.2  bouyer             Info->BitOffset = 0;
    617  1.1.1.2.2.2  bouyer 
    618  1.1.1.2.2.2  bouyer             /* Name of the parent OperationRegion */
    619  1.1.1.2.2.2  bouyer 
    620  1.1.1.2.2.2  bouyer             NextOp = AcpiPsGetDepthNext (NULL, Op);
    621  1.1.1.2.2.2  bouyer             AcpiDmNamestring (NextOp->Common.Value.Name);
    622  1.1.1.2.2.2  bouyer             AcpiOsPrintf (", ");
    623  1.1.1.2.2.2  bouyer             NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    624  1.1.1.2.2.2  bouyer 
    625  1.1.1.2.2.2  bouyer             switch (Op->Common.AmlOpcode)
    626  1.1.1.2.2.2  bouyer             {
    627  1.1.1.2.2.2  bouyer             case AML_BANK_FIELD_OP:
    628  1.1.1.2.2.2  bouyer 
    629  1.1.1.2.2.2  bouyer                 /* Namestring - Bank Name */
    630  1.1.1.2.2.2  bouyer 
    631  1.1.1.2.2.2  bouyer                 NextOp = AcpiPsGetDepthNext (NULL, NextOp);
    632  1.1.1.2.2.2  bouyer                 AcpiDmNamestring (NextOp->Common.Value.Name);
    633  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    634  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    635  1.1.1.2.2.2  bouyer 
    636  1.1.1.2.2.2  bouyer                 /*
    637  1.1.1.2.2.2  bouyer                  * Bank Value. This is a TermArg in the middle of the parameter
    638  1.1.1.2.2.2  bouyer                  * list, must handle it here.
    639  1.1.1.2.2.2  bouyer                  *
    640  1.1.1.2.2.2  bouyer                  * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMLIST
    641  1.1.1.2.2.2  bouyer                  * eliminates newline in the output.
    642  1.1.1.2.2.2  bouyer                  */
    643  1.1.1.2.2.2  bouyer                 NextOp = NextOp->Common.Next;
    644  1.1.1.2.2.2  bouyer 
    645  1.1.1.2.2.2  bouyer                 Info->Flags = ACPI_PARSEOP_PARAMLIST;
    646  1.1.1.2.2.2  bouyer                 AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
    647  1.1.1.2.2.2  bouyer                 Info->Flags = 0;
    648  1.1.1.2.2.2  bouyer                 Info->Level = Level;
    649  1.1.1.2.2.2  bouyer 
    650  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    651  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    652  1.1.1.2.2.2  bouyer                 break;
    653  1.1.1.2.2.2  bouyer 
    654  1.1.1.2.2.2  bouyer             case AML_INDEX_FIELD_OP:
    655  1.1.1.2.2.2  bouyer 
    656  1.1.1.2.2.2  bouyer                 /* Namestring - Data Name */
    657  1.1.1.2.2.2  bouyer 
    658  1.1.1.2.2.2  bouyer                 NextOp = AcpiPsGetDepthNext (NULL, NextOp);
    659  1.1.1.2.2.2  bouyer                 AcpiDmNamestring (NextOp->Common.Value.Name);
    660  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (", ");
    661  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    662  1.1.1.2.2.2  bouyer                 break;
    663  1.1.1.2.2.2  bouyer 
    664  1.1.1.2.2.2  bouyer             default:
    665  1.1.1.2.2.2  bouyer 
    666  1.1.1.2.2.2  bouyer                 break;
    667  1.1.1.2.2.2  bouyer             }
    668  1.1.1.2.2.2  bouyer 
    669  1.1.1.2.2.2  bouyer             AcpiDmFieldFlags (NextOp);
    670  1.1.1.2.2.2  bouyer             break;
    671  1.1.1.2.2.2  bouyer 
    672  1.1.1.2.2.2  bouyer 
    673  1.1.1.2.2.2  bouyer         case AML_BUFFER_OP:
    674  1.1.1.2.2.2  bouyer 
    675  1.1.1.2.2.2  bouyer             /* The next op is the size parameter */
    676  1.1.1.2.2.2  bouyer 
    677  1.1.1.2.2.2  bouyer             NextOp = AcpiPsGetDepthNext (NULL, Op);
    678  1.1.1.2.2.2  bouyer             if (!NextOp)
    679  1.1.1.2.2.2  bouyer             {
    680  1.1.1.2.2.2  bouyer                 /* Single-step support */
    681  1.1.1.2.2.2  bouyer 
    682  1.1.1.2.2.2  bouyer                 return (AE_OK);
    683  1.1.1.2.2.2  bouyer             }
    684  1.1.1.2.2.2  bouyer 
    685  1.1.1.2.2.2  bouyer             if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
    686  1.1.1.2.2.2  bouyer             {
    687  1.1.1.2.2.2  bouyer                 /*
    688  1.1.1.2.2.2  bouyer                  * We have a resource list.  Don't need to output
    689  1.1.1.2.2.2  bouyer                  * the buffer size Op.  Open up a new block
    690  1.1.1.2.2.2  bouyer                  */
    691  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
    692  1.1.1.2.2.2  bouyer                 NextOp = NextOp->Common.Next;
    693  1.1.1.2.2.2  bouyer                 AcpiOsPrintf (")\n");
    694  1.1.1.2.2.2  bouyer                 AcpiDmIndent (Info->Level);
    695  1.1.1.2.2.2  bouyer                 AcpiOsPrintf ("{\n");
    696  1.1.1.2.2.2  bouyer                 return (AE_OK);
    697  1.1.1.2.2.2  bouyer             }
    698  1.1.1.2.2.2  bouyer 
    699  1.1.1.2.2.2  bouyer             /* Normal Buffer, mark size as in the parameter list */
    700  1.1.1.2.2.2  bouyer 
    701  1.1.1.2.2.2  bouyer             NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    702  1.1.1.2.2.2  bouyer             return (AE_OK);
    703  1.1.1.2.2.2  bouyer 
    704  1.1.1.2.2.2  bouyer 
    705  1.1.1.2.2.2  bouyer         case AML_VAR_PACKAGE_OP:
    706  1.1.1.2.2.2  bouyer         case AML_IF_OP:
    707  1.1.1.2.2.2  bouyer         case AML_WHILE_OP:
    708  1.1.1.2.2.2  bouyer 
    709  1.1.1.2.2.2  bouyer             /* The next op is the size or predicate parameter */
    710  1.1.1.2.2.2  bouyer 
    711  1.1.1.2.2.2  bouyer             NextOp = AcpiPsGetDepthNext (NULL, Op);
    712  1.1.1.2.2.2  bouyer             if (NextOp)
    713  1.1.1.2.2.2  bouyer             {
    714  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    715  1.1.1.2.2.2  bouyer             }
    716  1.1.1.2.2.2  bouyer             return (AE_OK);
    717  1.1.1.2.2.2  bouyer 
    718  1.1.1.2.2.2  bouyer 
    719  1.1.1.2.2.2  bouyer         case AML_PACKAGE_OP:
    720  1.1.1.2.2.2  bouyer 
    721  1.1.1.2.2.2  bouyer             /* The next op is the size or predicate parameter */
    722  1.1.1.2.2.2  bouyer 
    723  1.1.1.2.2.2  bouyer             NextOp = AcpiPsGetDepthNext (NULL, Op);
    724  1.1.1.2.2.2  bouyer             if (NextOp)
    725  1.1.1.2.2.2  bouyer             {
    726  1.1.1.2.2.2  bouyer                 NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
    727  1.1.1.2.2.2  bouyer             }
    728  1.1.1.2.2.2  bouyer             return (AE_OK);
    729  1.1.1.2.2.2  bouyer 
    730  1.1.1.2.2.2  bouyer 
    731  1.1.1.2.2.2  bouyer         case AML_MATCH_OP:
    732  1.1.1.2.2.2  bouyer 
    733  1.1.1.2.2.2  bouyer             AcpiDmMatchOp (Op);
    734  1.1.1.2.2.2  bouyer             break;
    735  1.1.1.2.2.2  bouyer 
    736  1.1.1.2.2.2  bouyer 
    737  1.1.1.2.2.2  bouyer         default:
    738  1.1.1.2.2.2  bouyer 
    739  1.1.1.2.2.2  bouyer             break;
    740  1.1.1.2.2.2  bouyer         }
    741  1.1.1.2.2.2  bouyer 
    742  1.1.1.2.2.2  bouyer         if (AcpiDmBlockType (Op) & BLOCK_BRACE)
    743  1.1.1.2.2.2  bouyer         {
    744  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("\n");
    745  1.1.1.2.2.2  bouyer             AcpiDmIndent (Level);
    746  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("{\n");
    747  1.1.1.2.2.2  bouyer         }
    748  1.1.1.2.2.2  bouyer     }
    749  1.1.1.2.2.2  bouyer 
    750  1.1.1.2.2.2  bouyer     return (AE_OK);
    751  1.1.1.2.2.2  bouyer }
    752  1.1.1.2.2.2  bouyer 
    753  1.1.1.2.2.2  bouyer 
    754  1.1.1.2.2.2  bouyer /*******************************************************************************
    755  1.1.1.2.2.2  bouyer  *
    756  1.1.1.2.2.2  bouyer  * FUNCTION:    AcpiDmAscendingOp
    757  1.1.1.2.2.2  bouyer  *
    758  1.1.1.2.2.2  bouyer  * PARAMETERS:  ASL_WALK_CALLBACK
    759  1.1.1.2.2.2  bouyer  *
    760  1.1.1.2.2.2  bouyer  * RETURN:      Status
    761  1.1.1.2.2.2  bouyer  *
    762  1.1.1.2.2.2  bouyer  * DESCRIPTION: Second visitation of a parse object, during ascent of parse
    763  1.1.1.2.2.2  bouyer  *              tree.  Close out any parameter lists and complete the opcode.
    764  1.1.1.2.2.2  bouyer  *
    765  1.1.1.2.2.2  bouyer  ******************************************************************************/
    766  1.1.1.2.2.2  bouyer 
    767  1.1.1.2.2.2  bouyer static ACPI_STATUS
    768  1.1.1.2.2.2  bouyer AcpiDmAscendingOp (
    769  1.1.1.2.2.2  bouyer     ACPI_PARSE_OBJECT       *Op,
    770  1.1.1.2.2.2  bouyer     UINT32                  Level,
    771  1.1.1.2.2.2  bouyer     void                    *Context)
    772  1.1.1.2.2.2  bouyer {
    773  1.1.1.2.2.2  bouyer     ACPI_OP_WALK_INFO       *Info = Context;
    774  1.1.1.2.2.2  bouyer 
    775  1.1.1.2.2.2  bouyer 
    776  1.1.1.2.2.2  bouyer     if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
    777  1.1.1.2.2.2  bouyer     {
    778  1.1.1.2.2.2  bouyer         /* Ignore this op -- it was handled elsewhere */
    779  1.1.1.2.2.2  bouyer 
    780  1.1.1.2.2.2  bouyer         return (AE_OK);
    781  1.1.1.2.2.2  bouyer     }
    782  1.1.1.2.2.2  bouyer 
    783  1.1.1.2.2.2  bouyer     if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP))
    784  1.1.1.2.2.2  bouyer     {
    785  1.1.1.2.2.2  bouyer         /* Indicates the end of the current descriptor block (table) */
    786  1.1.1.2.2.2  bouyer 
    787  1.1.1.2.2.2  bouyer         AcpiOsPrintf ("}\n\n");
    788  1.1.1.2.2.2  bouyer         return (AE_OK);
    789  1.1.1.2.2.2  bouyer     }
    790  1.1.1.2.2.2  bouyer 
    791  1.1.1.2.2.2  bouyer     switch (AcpiDmBlockType (Op))
    792  1.1.1.2.2.2  bouyer     {
    793  1.1.1.2.2.2  bouyer     case BLOCK_PAREN:
    794  1.1.1.2.2.2  bouyer 
    795  1.1.1.2.2.2  bouyer         /* Completed an op that has arguments, add closing paren */
    796  1.1.1.2.2.2  bouyer 
    797  1.1.1.2.2.2  bouyer         AcpiOsPrintf (")");
    798  1.1.1.2.2.2  bouyer 
    799  1.1.1.2.2.2  bouyer         /* Could be a nested operator, check if comma required */
    800  1.1.1.2.2.2  bouyer 
    801  1.1.1.2.2.2  bouyer         if (!AcpiDmCommaIfListMember (Op))
    802  1.1.1.2.2.2  bouyer         {
    803  1.1.1.2.2.2  bouyer             if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
    804  1.1.1.2.2.2  bouyer                      (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
    805  1.1.1.2.2.2  bouyer                      (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
    806  1.1.1.2.2.2  bouyer             {
    807  1.1.1.2.2.2  bouyer                 /*
    808  1.1.1.2.2.2  bouyer                  * This is a first-level element of a term list
    809  1.1.1.2.2.2  bouyer                  * start a new line
    810  1.1.1.2.2.2  bouyer                  */
    811  1.1.1.2.2.2  bouyer                 if (!(Info->Flags & ACPI_PARSEOP_PARAMLIST))
    812  1.1.1.2.2.2  bouyer                 {
    813  1.1.1.2.2.2  bouyer                     AcpiOsPrintf ("\n");
    814  1.1.1.2.2.2  bouyer                 }
    815  1.1.1.2.2.2  bouyer             }
    816  1.1.1.2.2.2  bouyer         }
    817  1.1.1.2.2.2  bouyer         break;
    818  1.1.1.2.2.2  bouyer 
    819  1.1.1.2.2.2  bouyer 
    820  1.1.1.2.2.2  bouyer     case BLOCK_BRACE:
    821  1.1.1.2.2.2  bouyer     case (BLOCK_BRACE | BLOCK_PAREN):
    822  1.1.1.2.2.2  bouyer 
    823  1.1.1.2.2.2  bouyer         /* Completed an op that has a term list, add closing brace */
    824  1.1.1.2.2.2  bouyer 
    825  1.1.1.2.2.2  bouyer         if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)
    826  1.1.1.2.2.2  bouyer         {
    827  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("}");
    828  1.1.1.2.2.2  bouyer         }
    829  1.1.1.2.2.2  bouyer         else
    830  1.1.1.2.2.2  bouyer         {
    831  1.1.1.2.2.2  bouyer             AcpiDmIndent (Level);
    832  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("}");
    833  1.1.1.2.2.2  bouyer         }
    834  1.1.1.2.2.2  bouyer 
    835  1.1.1.2.2.2  bouyer         AcpiDmCommaIfListMember (Op);
    836  1.1.1.2.2.2  bouyer 
    837  1.1.1.2.2.2  bouyer         if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN)
    838  1.1.1.2.2.2  bouyer         {
    839  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("\n");
    840  1.1.1.2.2.2  bouyer             if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST))
    841  1.1.1.2.2.2  bouyer             {
    842  1.1.1.2.2.2  bouyer                 if ((Op->Common.AmlOpcode == AML_IF_OP)  &&
    843  1.1.1.2.2.2  bouyer                     (Op->Common.Next) &&
    844  1.1.1.2.2.2  bouyer                     (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP))
    845  1.1.1.2.2.2  bouyer                 {
    846  1.1.1.2.2.2  bouyer                     break;
    847  1.1.1.2.2.2  bouyer                 }
    848  1.1.1.2.2.2  bouyer 
    849  1.1.1.2.2.2  bouyer                 if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
    850  1.1.1.2.2.2  bouyer                     (!Op->Common.Next))
    851  1.1.1.2.2.2  bouyer                 {
    852  1.1.1.2.2.2  bouyer                     break;
    853  1.1.1.2.2.2  bouyer                 }
    854  1.1.1.2.2.2  bouyer                 AcpiOsPrintf ("\n");
    855  1.1.1.2.2.2  bouyer             }
    856  1.1.1.2.2.2  bouyer         }
    857  1.1.1.2.2.2  bouyer         break;
    858  1.1.1.2.2.2  bouyer 
    859  1.1.1.2.2.2  bouyer 
    860  1.1.1.2.2.2  bouyer     case BLOCK_NONE:
    861  1.1.1.2.2.2  bouyer     default:
    862  1.1.1.2.2.2  bouyer 
    863  1.1.1.2.2.2  bouyer         /* Could be a nested operator, check if comma required */
    864  1.1.1.2.2.2  bouyer 
    865  1.1.1.2.2.2  bouyer         if (!AcpiDmCommaIfListMember (Op))
    866  1.1.1.2.2.2  bouyer         {
    867  1.1.1.2.2.2  bouyer             if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
    868  1.1.1.2.2.2  bouyer                      (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
    869  1.1.1.2.2.2  bouyer                      (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
    870  1.1.1.2.2.2  bouyer             {
    871  1.1.1.2.2.2  bouyer                 /*
    872  1.1.1.2.2.2  bouyer                  * This is a first-level element of a term list
    873  1.1.1.2.2.2  bouyer                  * start a new line
    874  1.1.1.2.2.2  bouyer                  */
    875  1.1.1.2.2.2  bouyer                 AcpiOsPrintf ("\n");
    876  1.1.1.2.2.2  bouyer             }
    877  1.1.1.2.2.2  bouyer         }
    878  1.1.1.2.2.2  bouyer         else if (Op->Common.Parent)
    879  1.1.1.2.2.2  bouyer         {
    880  1.1.1.2.2.2  bouyer             switch (Op->Common.Parent->Common.AmlOpcode)
    881  1.1.1.2.2.2  bouyer             {
    882  1.1.1.2.2.2  bouyer             case AML_PACKAGE_OP:
    883  1.1.1.2.2.2  bouyer             case AML_VAR_PACKAGE_OP:
    884  1.1.1.2.2.2  bouyer 
    885  1.1.1.2.2.2  bouyer                 if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
    886  1.1.1.2.2.2  bouyer                 {
    887  1.1.1.2.2.2  bouyer                     AcpiOsPrintf ("\n");
    888  1.1.1.2.2.2  bouyer                 }
    889  1.1.1.2.2.2  bouyer                 break;
    890  1.1.1.2.2.2  bouyer 
    891  1.1.1.2.2.2  bouyer             default:
    892  1.1.1.2.2.2  bouyer 
    893  1.1.1.2.2.2  bouyer                 break;
    894  1.1.1.2.2.2  bouyer             }
    895  1.1.1.2.2.2  bouyer         }
    896  1.1.1.2.2.2  bouyer         break;
    897  1.1.1.2.2.2  bouyer     }
    898  1.1.1.2.2.2  bouyer 
    899  1.1.1.2.2.2  bouyer     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)
    900  1.1.1.2.2.2  bouyer     {
    901  1.1.1.2.2.2  bouyer         if ((Op->Common.Next) &&
    902  1.1.1.2.2.2  bouyer             (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
    903  1.1.1.2.2.2  bouyer         {
    904  1.1.1.2.2.2  bouyer             return (AE_OK);
    905  1.1.1.2.2.2  bouyer         }
    906  1.1.1.2.2.2  bouyer 
    907  1.1.1.2.2.2  bouyer         /*
    908  1.1.1.2.2.2  bouyer          * Just completed a parameter node for something like "Buffer (param)".
    909  1.1.1.2.2.2  bouyer          * Close the paren and open up the term list block with a brace
    910  1.1.1.2.2.2  bouyer          */
    911  1.1.1.2.2.2  bouyer         if (Op->Common.Next)
    912  1.1.1.2.2.2  bouyer         {
    913  1.1.1.2.2.2  bouyer             AcpiOsPrintf (")\n");
    914  1.1.1.2.2.2  bouyer             AcpiDmIndent (Level - 1);
    915  1.1.1.2.2.2  bouyer             AcpiOsPrintf ("{\n");
    916  1.1.1.2.2.2  bouyer         }
    917  1.1.1.2.2.2  bouyer         else
    918  1.1.1.2.2.2  bouyer         {
    919  1.1.1.2.2.2  bouyer             Op->Common.Parent->Common.DisasmFlags |=
    920  1.1.1.2.2.2  bouyer                                     ACPI_PARSEOP_EMPTY_TERMLIST;
    921  1.1.1.2.2.2  bouyer             AcpiOsPrintf (") {");
    922  1.1.1.2.2.2  bouyer         }
    923  1.1.1.2.2.2  bouyer     }
    924  1.1.1.2.2.2  bouyer 
    925  1.1.1.2.2.2  bouyer     if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
    926  1.1.1.2.2.2  bouyer         (Op->Common.AmlOpcode == AML_RETURN_OP))
    927  1.1.1.2.2.2  bouyer     {
    928  1.1.1.2.2.2  bouyer         Info->Level++;
    929  1.1.1.2.2.2  bouyer     }
    930  1.1.1.2.2.2  bouyer     return (AE_OK);
    931  1.1.1.2.2.2  bouyer }
    932  1.1.1.2.2.2  bouyer 
    933  1.1.1.2.2.2  bouyer 
    934  1.1.1.2.2.2  bouyer #endif  /* ACPI_DISASSEMBLER */
    935