130082d0cSmyers /*******************************************************************************
230082d0cSmyers  *
330082d0cSmyers  * Module Name: dmopcode - AML disassembler, specific AML opcodes
430082d0cSmyers  *
530082d0cSmyers  ******************************************************************************/
630082d0cSmyers 
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi  *
9*35786f68SRobert Mustacchi  * 1. Copyright Notice
10*35786f68SRobert Mustacchi  *
11*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
1230082d0cSmyers  * All rights reserved.
1330082d0cSmyers  *
14*35786f68SRobert Mustacchi  * 2. License
15*35786f68SRobert Mustacchi  *
16*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi  * property rights.
20*35786f68SRobert Mustacchi  *
21*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi  *
28*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi  *
37*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi  * conditions are met:
39*35786f68SRobert Mustacchi  *
40*35786f68SRobert Mustacchi  * 3. Conditions
41*35786f68SRobert Mustacchi  *
42*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi  *
54*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi  * make.
65*35786f68SRobert Mustacchi  *
66*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi  * distribution.
71*35786f68SRobert Mustacchi  *
72*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi  * Intel Code.
74*35786f68SRobert Mustacchi  *
75*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi  *
80*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi  *
82*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi  *
90*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi  * LIMITED REMEDY.
98*35786f68SRobert Mustacchi  *
99*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi  * such license, approval or letter.
113*35786f68SRobert Mustacchi  *
114*35786f68SRobert Mustacchi  *****************************************************************************
115*35786f68SRobert Mustacchi  *
116*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi  * following license:
118*35786f68SRobert Mustacchi  *
11926f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
12026f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
12126f3cdf0SGordon Ross  * are met:
12226f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
12326f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
12426f3cdf0SGordon Ross  *    without modification.
12526f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12626f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
12726f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
12826f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
12926f3cdf0SGordon Ross  *    binary redistribution.
13026f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
13126f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
13226f3cdf0SGordon Ross  *    from this software without specific prior written permission.
13326f3cdf0SGordon Ross  *
13426f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13526f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13726f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi  *
146*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi  * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi  * Software Foundation.
149*35786f68SRobert Mustacchi  *
150*35786f68SRobert Mustacchi  *****************************************************************************/
15130082d0cSmyers 
15230082d0cSmyers #include "acpi.h"
153aa2aa9a6SDana Myers #include "accommon.h"
15430082d0cSmyers #include "acparser.h"
15530082d0cSmyers #include "amlcode.h"
1567b1019a6SJerry Jelinek #include "acinterp.h"
1577b1019a6SJerry Jelinek #include "acnamesp.h"
1587b1019a6SJerry Jelinek #include "acdebug.h"
159*35786f68SRobert Mustacchi #include "acconvert.h"
16030082d0cSmyers 
16130082d0cSmyers 
16230082d0cSmyers #define _COMPONENT          ACPI_CA_DEBUGGER
16330082d0cSmyers         ACPI_MODULE_NAME    ("dmopcode")
16430082d0cSmyers 
1657b1019a6SJerry Jelinek 
16630082d0cSmyers /* Local prototypes */
16730082d0cSmyers 
16830082d0cSmyers static void
16930082d0cSmyers AcpiDmMatchKeyword (
17030082d0cSmyers     ACPI_PARSE_OBJECT       *Op);
17130082d0cSmyers 
1727b1019a6SJerry Jelinek static void
1737b1019a6SJerry Jelinek AcpiDmConvertToElseIf (
1747b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *Op);
1757b1019a6SJerry Jelinek 
176*35786f68SRobert Mustacchi static void
177*35786f68SRobert Mustacchi AcpiDmPromoteSubtree (
178*35786f68SRobert Mustacchi     ACPI_PARSE_OBJECT       *StartOp);
1797b1019a6SJerry Jelinek 
1807b1019a6SJerry Jelinek /*******************************************************************************
1817b1019a6SJerry Jelinek  *
1827b1019a6SJerry Jelinek  * FUNCTION:    AcpiDmDisplayTargetPathname
1837b1019a6SJerry Jelinek  *
1847b1019a6SJerry Jelinek  * PARAMETERS:  Op              - Parse object
1857b1019a6SJerry Jelinek  *
1867b1019a6SJerry Jelinek  * RETURN:      None
1877b1019a6SJerry Jelinek  *
1887b1019a6SJerry Jelinek  * DESCRIPTION: For AML opcodes that have a target operand, display the full
1897b1019a6SJerry Jelinek  *              pathname for the target, in a comment field. Handles Return()
1907b1019a6SJerry Jelinek  *              statements also.
1917b1019a6SJerry Jelinek  *
1927b1019a6SJerry Jelinek  ******************************************************************************/
1937b1019a6SJerry Jelinek 
1947b1019a6SJerry Jelinek void
AcpiDmDisplayTargetPathname(ACPI_PARSE_OBJECT * Op)1957b1019a6SJerry Jelinek AcpiDmDisplayTargetPathname (
1967b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
1977b1019a6SJerry Jelinek {
1987b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
1997b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *PrevOp = NULL;
2007b1019a6SJerry Jelinek     char                    *Pathname;
2017b1019a6SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
2027b1019a6SJerry Jelinek 
2037b1019a6SJerry Jelinek 
2047b1019a6SJerry Jelinek     if (Op->Common.AmlOpcode == AML_RETURN_OP)
2057b1019a6SJerry Jelinek     {
2067b1019a6SJerry Jelinek         PrevOp = Op->Asl.Value.Arg;
2077b1019a6SJerry Jelinek     }
2087b1019a6SJerry Jelinek     else
2097b1019a6SJerry Jelinek     {
2107b1019a6SJerry Jelinek         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
2117b1019a6SJerry Jelinek         if (!(OpInfo->Flags & AML_HAS_TARGET))
2127b1019a6SJerry Jelinek         {
2137b1019a6SJerry Jelinek             return;
2147b1019a6SJerry Jelinek         }
2157b1019a6SJerry Jelinek 
2167b1019a6SJerry Jelinek         /* Target is the last Op in the arg list */
2177b1019a6SJerry Jelinek 
2187b1019a6SJerry Jelinek         NextOp = Op->Asl.Value.Arg;
2197b1019a6SJerry Jelinek         while (NextOp)
2207b1019a6SJerry Jelinek         {
2217b1019a6SJerry Jelinek             PrevOp = NextOp;
2227b1019a6SJerry Jelinek             NextOp = PrevOp->Asl.Next;
2237b1019a6SJerry Jelinek         }
2247b1019a6SJerry Jelinek     }
2257b1019a6SJerry Jelinek 
2267b1019a6SJerry Jelinek     if (!PrevOp)
2277b1019a6SJerry Jelinek     {
2287b1019a6SJerry Jelinek         return;
2297b1019a6SJerry Jelinek     }
2307b1019a6SJerry Jelinek 
2317b1019a6SJerry Jelinek     /* We must have a namepath AML opcode */
2327b1019a6SJerry Jelinek 
2337b1019a6SJerry Jelinek     if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
2347b1019a6SJerry Jelinek     {
2357b1019a6SJerry Jelinek         return;
2367b1019a6SJerry Jelinek     }
2377b1019a6SJerry Jelinek 
2387b1019a6SJerry Jelinek     /* A null string is the "no target specified" case */
2397b1019a6SJerry Jelinek 
2407b1019a6SJerry Jelinek     if (!PrevOp->Asl.Value.String)
2417b1019a6SJerry Jelinek     {
2427b1019a6SJerry Jelinek         return;
2437b1019a6SJerry Jelinek     }
2447b1019a6SJerry Jelinek 
2457b1019a6SJerry Jelinek     /* No node means "unresolved external reference" */
2467b1019a6SJerry Jelinek 
2477b1019a6SJerry Jelinek     if (!PrevOp->Asl.Node)
2487b1019a6SJerry Jelinek     {
2497b1019a6SJerry Jelinek         AcpiOsPrintf (" /* External reference */");
2507b1019a6SJerry Jelinek         return;
2517b1019a6SJerry Jelinek     }
2527b1019a6SJerry Jelinek 
2537b1019a6SJerry Jelinek     /* Ignore if path is already from the root */
2547b1019a6SJerry Jelinek 
2557b1019a6SJerry Jelinek     if (*PrevOp->Asl.Value.String == '\\')
2567b1019a6SJerry Jelinek     {
2577b1019a6SJerry Jelinek         return;
2587b1019a6SJerry Jelinek     }
2597b1019a6SJerry Jelinek 
2607b1019a6SJerry Jelinek     /* Now: we can get the full pathname */
2617b1019a6SJerry Jelinek 
2627b1019a6SJerry Jelinek     Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node);
2637b1019a6SJerry Jelinek     if (!Pathname)
2647b1019a6SJerry Jelinek     {
2657b1019a6SJerry Jelinek         return;
2667b1019a6SJerry Jelinek     }
2677b1019a6SJerry Jelinek 
2687b1019a6SJerry Jelinek     AcpiOsPrintf (" /* %s */", Pathname);
2697b1019a6SJerry Jelinek     ACPI_FREE (Pathname);
2707b1019a6SJerry Jelinek }
2717b1019a6SJerry Jelinek 
2727b1019a6SJerry Jelinek 
2737b1019a6SJerry Jelinek /*******************************************************************************
2747b1019a6SJerry Jelinek  *
2757b1019a6SJerry Jelinek  * FUNCTION:    AcpiDmNotifyDescription
2767b1019a6SJerry Jelinek  *
2777b1019a6SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
2787b1019a6SJerry Jelinek  *
2797b1019a6SJerry Jelinek  * RETURN:      None
2807b1019a6SJerry Jelinek  *
2817b1019a6SJerry Jelinek  * DESCRIPTION: Emit a description comment for the value associated with a
2827b1019a6SJerry Jelinek  *              Notify() operator.
2837b1019a6SJerry Jelinek  *
2847b1019a6SJerry Jelinek  ******************************************************************************/
2857b1019a6SJerry Jelinek 
2867b1019a6SJerry Jelinek void
AcpiDmNotifyDescription(ACPI_PARSE_OBJECT * Op)2877b1019a6SJerry Jelinek AcpiDmNotifyDescription (
2887b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
2897b1019a6SJerry Jelinek {
2907b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *NextOp;
2917b1019a6SJerry Jelinek     ACPI_NAMESPACE_NODE     *Node;
2927b1019a6SJerry Jelinek     UINT8                   NotifyValue;
2937b1019a6SJerry Jelinek     UINT8                   Type = ACPI_TYPE_ANY;
2947b1019a6SJerry Jelinek 
2957b1019a6SJerry Jelinek 
2967b1019a6SJerry Jelinek     /* The notify value is the second argument */
2977b1019a6SJerry Jelinek 
2987b1019a6SJerry Jelinek     NextOp = Op->Asl.Value.Arg;
2997b1019a6SJerry Jelinek     NextOp = NextOp->Asl.Next;
3007b1019a6SJerry Jelinek 
3017b1019a6SJerry Jelinek     switch (NextOp->Common.AmlOpcode)
3027b1019a6SJerry Jelinek     {
3037b1019a6SJerry Jelinek     case AML_ZERO_OP:
3047b1019a6SJerry Jelinek     case AML_ONE_OP:
3057b1019a6SJerry Jelinek 
3067b1019a6SJerry Jelinek         NotifyValue = (UINT8) NextOp->Common.AmlOpcode;
3077b1019a6SJerry Jelinek         break;
3087b1019a6SJerry Jelinek 
3097b1019a6SJerry Jelinek     case AML_BYTE_OP:
3107b1019a6SJerry Jelinek 
3117b1019a6SJerry Jelinek         NotifyValue = (UINT8) NextOp->Asl.Value.Integer;
3127b1019a6SJerry Jelinek         break;
3137b1019a6SJerry Jelinek 
3147b1019a6SJerry Jelinek     default:
3157b1019a6SJerry Jelinek         return;
3167b1019a6SJerry Jelinek     }
3177b1019a6SJerry Jelinek 
3187b1019a6SJerry Jelinek     /*
3197b1019a6SJerry Jelinek      * Attempt to get the namespace node so we can determine the object type.
3207b1019a6SJerry Jelinek      * Some notify values are dependent on the object type (Device, Thermal,
3217b1019a6SJerry Jelinek      * or Processor).
3227b1019a6SJerry Jelinek      */
3237b1019a6SJerry Jelinek     Node = Op->Asl.Node;
3247b1019a6SJerry Jelinek     if (Node)
3257b1019a6SJerry Jelinek     {
3267b1019a6SJerry Jelinek         Type = Node->Type;
3277b1019a6SJerry Jelinek     }
3287b1019a6SJerry Jelinek 
3297b1019a6SJerry Jelinek     AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type));
3307b1019a6SJerry Jelinek }
3317b1019a6SJerry Jelinek 
3327b1019a6SJerry Jelinek 
3337b1019a6SJerry Jelinek /*******************************************************************************
3347b1019a6SJerry Jelinek  *
3357b1019a6SJerry Jelinek  * FUNCTION:    AcpiDmPredefinedDescription
3367b1019a6SJerry Jelinek  *
3377b1019a6SJerry Jelinek  * PARAMETERS:  Op              - Name() parse object
3387b1019a6SJerry Jelinek  *
3397b1019a6SJerry Jelinek  * RETURN:      None
3407b1019a6SJerry Jelinek  *
3417b1019a6SJerry Jelinek  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
3427b1019a6SJerry Jelinek  *              Used for iASL compiler only.
3437b1019a6SJerry Jelinek  *
3447b1019a6SJerry Jelinek  ******************************************************************************/
3457b1019a6SJerry Jelinek 
3467b1019a6SJerry Jelinek void
AcpiDmPredefinedDescription(ACPI_PARSE_OBJECT * Op)3477b1019a6SJerry Jelinek AcpiDmPredefinedDescription (
3487b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
3497b1019a6SJerry Jelinek {
3507b1019a6SJerry Jelinek #ifdef ACPI_ASL_COMPILER
3517b1019a6SJerry Jelinek     const AH_PREDEFINED_NAME    *Info;
3527b1019a6SJerry Jelinek     char                        *NameString;
3537b1019a6SJerry Jelinek     int                         LastCharIsDigit;
3547b1019a6SJerry Jelinek     int                         LastCharsAreHex;
3557b1019a6SJerry Jelinek 
3567b1019a6SJerry Jelinek 
3577b1019a6SJerry Jelinek     if (!Op)
3587b1019a6SJerry Jelinek     {
3597b1019a6SJerry Jelinek         return;
3607b1019a6SJerry Jelinek     }
3617b1019a6SJerry Jelinek 
3627b1019a6SJerry Jelinek     /* Ensure that the comment field is emitted only once */
3637b1019a6SJerry Jelinek 
3647b1019a6SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
3657b1019a6SJerry Jelinek     {
3667b1019a6SJerry Jelinek         return;
3677b1019a6SJerry Jelinek     }
3687b1019a6SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
3697b1019a6SJerry Jelinek 
3707b1019a6SJerry Jelinek     /* Predefined name must start with an underscore */
3717b1019a6SJerry Jelinek 
3727b1019a6SJerry Jelinek     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
3737b1019a6SJerry Jelinek     if (NameString[0] != '_')
3747b1019a6SJerry Jelinek     {
3757b1019a6SJerry Jelinek         return;
3767b1019a6SJerry Jelinek     }
3777b1019a6SJerry Jelinek 
3787b1019a6SJerry Jelinek     /*
3797b1019a6SJerry Jelinek      * Check for the special ACPI names:
3807b1019a6SJerry Jelinek      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
3817b1019a6SJerry Jelinek      * (where d=decimal_digit, x=hex_digit, a=anything)
3827b1019a6SJerry Jelinek      *
3837b1019a6SJerry Jelinek      * Convert these to the generic name for table lookup.
3847b1019a6SJerry Jelinek      * Note: NameString is guaranteed to be upper case here.
3857b1019a6SJerry Jelinek      */
3867b1019a6SJerry Jelinek     LastCharIsDigit =
3877b1019a6SJerry Jelinek         (isdigit ((int) NameString[3]));    /* d */
3887b1019a6SJerry Jelinek     LastCharsAreHex =
3897b1019a6SJerry Jelinek         (isxdigit ((int) NameString[2]) &&  /* xx */
3907b1019a6SJerry Jelinek          isxdigit ((int) NameString[3]));
3917b1019a6SJerry Jelinek 
3927b1019a6SJerry Jelinek     switch (NameString[1])
3937b1019a6SJerry Jelinek     {
3947b1019a6SJerry Jelinek     case 'A':
3957b1019a6SJerry Jelinek 
3967b1019a6SJerry Jelinek         if ((NameString[2] == 'C') && (LastCharIsDigit))
3977b1019a6SJerry Jelinek         {
3987b1019a6SJerry Jelinek             NameString = "_ACx";
3997b1019a6SJerry Jelinek         }
4007b1019a6SJerry Jelinek         else if ((NameString[2] == 'L') && (LastCharIsDigit))
4017b1019a6SJerry Jelinek         {
4027b1019a6SJerry Jelinek             NameString = "_ALx";
4037b1019a6SJerry Jelinek         }
4047b1019a6SJerry Jelinek         break;
4057b1019a6SJerry Jelinek 
4067b1019a6SJerry Jelinek     case 'E':
4077b1019a6SJerry Jelinek 
4087b1019a6SJerry Jelinek         if ((NameString[2] == 'J') && (LastCharIsDigit))
4097b1019a6SJerry Jelinek         {
4107b1019a6SJerry Jelinek             NameString = "_EJx";
4117b1019a6SJerry Jelinek         }
4127b1019a6SJerry Jelinek         else if (LastCharsAreHex)
4137b1019a6SJerry Jelinek         {
4147b1019a6SJerry Jelinek             NameString = "_Exx";
4157b1019a6SJerry Jelinek         }
4167b1019a6SJerry Jelinek         break;
4177b1019a6SJerry Jelinek 
4187b1019a6SJerry Jelinek     case 'L':
4197b1019a6SJerry Jelinek 
4207b1019a6SJerry Jelinek         if (LastCharsAreHex)
4217b1019a6SJerry Jelinek         {
4227b1019a6SJerry Jelinek             NameString = "_Lxx";
4237b1019a6SJerry Jelinek         }
4247b1019a6SJerry Jelinek         break;
4257b1019a6SJerry Jelinek 
4267b1019a6SJerry Jelinek     case 'Q':
4277b1019a6SJerry Jelinek 
4287b1019a6SJerry Jelinek         if (LastCharsAreHex)
4297b1019a6SJerry Jelinek         {
4307b1019a6SJerry Jelinek             NameString = "_Qxx";
4317b1019a6SJerry Jelinek         }
4327b1019a6SJerry Jelinek         break;
4337b1019a6SJerry Jelinek 
4347b1019a6SJerry Jelinek     case 'T':
4357b1019a6SJerry Jelinek 
4367b1019a6SJerry Jelinek         if (NameString[2] == '_')
4377b1019a6SJerry Jelinek         {
4387b1019a6SJerry Jelinek             NameString = "_T_x";
4397b1019a6SJerry Jelinek         }
4407b1019a6SJerry Jelinek         break;
4417b1019a6SJerry Jelinek 
4427b1019a6SJerry Jelinek     case 'W':
4437b1019a6SJerry Jelinek 
4447b1019a6SJerry Jelinek         if (LastCharsAreHex)
4457b1019a6SJerry Jelinek         {
4467b1019a6SJerry Jelinek             NameString = "_Wxx";
4477b1019a6SJerry Jelinek         }
4487b1019a6SJerry Jelinek         break;
4497b1019a6SJerry Jelinek 
4507b1019a6SJerry Jelinek     default:
4517b1019a6SJerry Jelinek 
4527b1019a6SJerry Jelinek         break;
4537b1019a6SJerry Jelinek     }
4547b1019a6SJerry Jelinek 
4557b1019a6SJerry Jelinek     /* Match the name in the info table */
4567b1019a6SJerry Jelinek 
4577b1019a6SJerry Jelinek     Info = AcpiAhMatchPredefinedName (NameString);
4587b1019a6SJerry Jelinek     if (Info)
4597b1019a6SJerry Jelinek     {
4607b1019a6SJerry Jelinek         AcpiOsPrintf ("  // %4.4s: %s",
4617b1019a6SJerry Jelinek             NameString, ACPI_CAST_PTR (char, Info->Description));
4627b1019a6SJerry Jelinek     }
4637b1019a6SJerry Jelinek 
4647b1019a6SJerry Jelinek #endif
4657b1019a6SJerry Jelinek     return;
4667b1019a6SJerry Jelinek }
4677b1019a6SJerry Jelinek 
4687b1019a6SJerry Jelinek 
4697b1019a6SJerry Jelinek /*******************************************************************************
4707b1019a6SJerry Jelinek  *
4717b1019a6SJerry Jelinek  * FUNCTION:    AcpiDmFieldPredefinedDescription
4727b1019a6SJerry Jelinek  *
4737b1019a6SJerry Jelinek  * PARAMETERS:  Op              - Parse object
4747b1019a6SJerry Jelinek  *
4757b1019a6SJerry Jelinek  * RETURN:      None
4767b1019a6SJerry Jelinek  *
4777b1019a6SJerry Jelinek  * DESCRIPTION: Emit a description comment for a resource descriptor tag
4787b1019a6SJerry Jelinek  *              (which is a predefined ACPI name.) Used for iASL compiler only.
4797b1019a6SJerry Jelinek  *
4807b1019a6SJerry Jelinek  ******************************************************************************/
4817b1019a6SJerry Jelinek 
4827b1019a6SJerry Jelinek void
AcpiDmFieldPredefinedDescription(ACPI_PARSE_OBJECT * Op)4837b1019a6SJerry Jelinek AcpiDmFieldPredefinedDescription (
4847b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *Op)
4857b1019a6SJerry Jelinek {
4867b1019a6SJerry Jelinek #ifdef ACPI_ASL_COMPILER
4877b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *IndexOp;
4887b1019a6SJerry Jelinek     char                    *Tag;
4897b1019a6SJerry Jelinek     const ACPI_OPCODE_INFO  *OpInfo;
4907b1019a6SJerry Jelinek     const AH_PREDEFINED_NAME *Info;
4917b1019a6SJerry Jelinek 
4927b1019a6SJerry Jelinek 
4937b1019a6SJerry Jelinek     if (!Op)
4947b1019a6SJerry Jelinek     {
4957b1019a6SJerry Jelinek         return;
4967b1019a6SJerry Jelinek     }
4977b1019a6SJerry Jelinek 
4987b1019a6SJerry Jelinek     /* Ensure that the comment field is emitted only once */
4997b1019a6SJerry Jelinek 
5007b1019a6SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
5017b1019a6SJerry Jelinek     {
5027b1019a6SJerry Jelinek         return;
5037b1019a6SJerry Jelinek     }
5047b1019a6SJerry Jelinek     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
5057b1019a6SJerry Jelinek 
5067b1019a6SJerry Jelinek     /*
5077b1019a6SJerry Jelinek      * Op must be one of the Create* operators: CreateField, CreateBitField,
5087b1019a6SJerry Jelinek      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
5097b1019a6SJerry Jelinek      */
5107b1019a6SJerry Jelinek     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
5117b1019a6SJerry Jelinek     if (!(OpInfo->Flags & AML_CREATE))
5127b1019a6SJerry Jelinek     {
5137b1019a6SJerry Jelinek         return;
5147b1019a6SJerry Jelinek     }
5157b1019a6SJerry Jelinek 
5167b1019a6SJerry Jelinek     /* Second argument is the Index argument */
5177b1019a6SJerry Jelinek 
5187b1019a6SJerry Jelinek     IndexOp = Op->Common.Value.Arg;
5197b1019a6SJerry Jelinek     IndexOp = IndexOp->Common.Next;
5207b1019a6SJerry Jelinek 
5217b1019a6SJerry Jelinek     /* Index argument must be a namepath */
5227b1019a6SJerry Jelinek 
5237b1019a6SJerry Jelinek     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
5247b1019a6SJerry Jelinek     {
5257b1019a6SJerry Jelinek         return;
5267b1019a6SJerry Jelinek     }
5277b1019a6SJerry Jelinek 
5287b1019a6SJerry Jelinek     /* Major cheat: We previously put the Tag ptr in the Node field */
5297b1019a6SJerry Jelinek 
5307b1019a6SJerry Jelinek     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
531*35786f68SRobert Mustacchi     if (!Tag || (*Tag == 0))
5327b1019a6SJerry Jelinek     {
5337b1019a6SJerry Jelinek         return;
5347b1019a6SJerry Jelinek     }
5357b1019a6SJerry Jelinek 
536*35786f68SRobert Mustacchi     /* Is the tag a predefined name? */
5377b1019a6SJerry Jelinek 
5387b1019a6SJerry Jelinek     Info = AcpiAhMatchPredefinedName (Tag);
539*35786f68SRobert Mustacchi     if (!Info)
5407b1019a6SJerry Jelinek     {
541*35786f68SRobert Mustacchi         /* Not a predefined name (does not start with underscore) */
542*35786f68SRobert Mustacchi 
543*35786f68SRobert Mustacchi         return;
5447b1019a6SJerry Jelinek     }
5457b1019a6SJerry Jelinek 
546*35786f68SRobert Mustacchi     AcpiOsPrintf ("  // %4.4s: %s", Tag,
547*35786f68SRobert Mustacchi         ACPI_CAST_PTR (char, Info->Description));
548*35786f68SRobert Mustacchi 
549*35786f68SRobert Mustacchi     /* String contains the prefix path, free it */
550*35786f68SRobert Mustacchi 
551*35786f68SRobert Mustacchi     ACPI_FREE (IndexOp->Common.Value.String);
552*35786f68SRobert Mustacchi     IndexOp->Common.Value.String = NULL;
5537b1019a6SJerry Jelinek #endif
554*35786f68SRobert Mustacchi 
5557b1019a6SJerry Jelinek     return;
5567b1019a6SJerry Jelinek }
5577b1019a6SJerry Jelinek 
55830082d0cSmyers 
55930082d0cSmyers /*******************************************************************************
56030082d0cSmyers  *
56130082d0cSmyers  * FUNCTION:    AcpiDmMethodFlags
56230082d0cSmyers  *
56330082d0cSmyers  * PARAMETERS:  Op              - Method Object to be examined
56430082d0cSmyers  *
56530082d0cSmyers  * RETURN:      None
56630082d0cSmyers  *
56730082d0cSmyers  * DESCRIPTION: Decode control method flags
56830082d0cSmyers  *
56930082d0cSmyers  ******************************************************************************/
57030082d0cSmyers 
57130082d0cSmyers void
AcpiDmMethodFlags(ACPI_PARSE_OBJECT * Op)57230082d0cSmyers AcpiDmMethodFlags (
57330082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
57430082d0cSmyers {
57530082d0cSmyers     UINT32                  Flags;
57630082d0cSmyers     UINT32                  Args;
57730082d0cSmyers 
57830082d0cSmyers 
57930082d0cSmyers     /* The next Op contains the flags */
58030082d0cSmyers 
58130082d0cSmyers     Op = AcpiPsGetDepthNext (NULL, Op);
58230082d0cSmyers     Flags = (UINT8) Op->Common.Value.Integer;
58330082d0cSmyers     Args = Flags & 0x07;
58430082d0cSmyers 
58530082d0cSmyers     /* Mark the Op as completed */
58630082d0cSmyers 
58730082d0cSmyers     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
58830082d0cSmyers 
58930082d0cSmyers     /* 1) Method argument count */
59030082d0cSmyers 
59126f3cdf0SGordon Ross     AcpiOsPrintf (", %u, ", Args);
59230082d0cSmyers 
59330082d0cSmyers     /* 2) Serialize rule */
59430082d0cSmyers 
59530082d0cSmyers     if (!(Flags & 0x08))
59630082d0cSmyers     {
59730082d0cSmyers         AcpiOsPrintf ("Not");
59830082d0cSmyers     }
59930082d0cSmyers 
60030082d0cSmyers     AcpiOsPrintf ("Serialized");
60130082d0cSmyers 
60230082d0cSmyers     /* 3) SyncLevel */
60330082d0cSmyers 
60430082d0cSmyers     if (Flags & 0xF0)
60530082d0cSmyers     {
60626f3cdf0SGordon Ross         AcpiOsPrintf (", %u", Flags >> 4);
60730082d0cSmyers     }
60830082d0cSmyers }
60930082d0cSmyers 
61030082d0cSmyers 
61130082d0cSmyers /*******************************************************************************
61230082d0cSmyers  *
61330082d0cSmyers  * FUNCTION:    AcpiDmFieldFlags
61430082d0cSmyers  *
61530082d0cSmyers  * PARAMETERS:  Op              - Field Object to be examined
61630082d0cSmyers  *
61730082d0cSmyers  * RETURN:      None
61830082d0cSmyers  *
61930082d0cSmyers  * DESCRIPTION: Decode Field definition flags
62030082d0cSmyers  *
62130082d0cSmyers  ******************************************************************************/
62230082d0cSmyers 
62330082d0cSmyers void
AcpiDmFieldFlags(ACPI_PARSE_OBJECT * Op)62430082d0cSmyers AcpiDmFieldFlags (
62530082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
62630082d0cSmyers {
62730082d0cSmyers     UINT32                  Flags;
62830082d0cSmyers 
62930082d0cSmyers 
63030082d0cSmyers     Op = Op->Common.Next;
63130082d0cSmyers     Flags = (UINT8) Op->Common.Value.Integer;
63230082d0cSmyers 
63330082d0cSmyers     /* Mark the Op as completed */
63430082d0cSmyers 
63530082d0cSmyers     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
63630082d0cSmyers 
63727f7c583Smyers     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
63830082d0cSmyers     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
63930082d0cSmyers     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
64030082d0cSmyers }
64130082d0cSmyers 
64230082d0cSmyers 
64330082d0cSmyers /*******************************************************************************
64430082d0cSmyers  *
64530082d0cSmyers  * FUNCTION:    AcpiDmAddressSpace
64630082d0cSmyers  *
64730082d0cSmyers  * PARAMETERS:  SpaceId         - ID to be translated
64830082d0cSmyers  *
64930082d0cSmyers  * RETURN:      None
65030082d0cSmyers  *
65130082d0cSmyers  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
65230082d0cSmyers  *
65330082d0cSmyers  ******************************************************************************/
65430082d0cSmyers 
65530082d0cSmyers void
AcpiDmAddressSpace(UINT8 SpaceId)65630082d0cSmyers AcpiDmAddressSpace (
65730082d0cSmyers     UINT8                   SpaceId)
65830082d0cSmyers {
65930082d0cSmyers 
66030082d0cSmyers     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
66130082d0cSmyers     {
66230082d0cSmyers         if (SpaceId == 0x7F)
66330082d0cSmyers         {
66430082d0cSmyers             AcpiOsPrintf ("FFixedHW, ");
66530082d0cSmyers         }
66630082d0cSmyers         else
66730082d0cSmyers         {
66830082d0cSmyers             AcpiOsPrintf ("0x%.2X, ", SpaceId);
66930082d0cSmyers         }
67030082d0cSmyers     }
67130082d0cSmyers     else
67230082d0cSmyers     {
67330082d0cSmyers         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
67430082d0cSmyers     }
67530082d0cSmyers }
67630082d0cSmyers 
67730082d0cSmyers 
67830082d0cSmyers /*******************************************************************************
67930082d0cSmyers  *
68030082d0cSmyers  * FUNCTION:    AcpiDmRegionFlags
68130082d0cSmyers  *
68230082d0cSmyers  * PARAMETERS:  Op              - Object to be examined
68330082d0cSmyers  *
68430082d0cSmyers  * RETURN:      None
68530082d0cSmyers  *
68630082d0cSmyers  * DESCRIPTION: Decode OperationRegion flags
68730082d0cSmyers  *
68830082d0cSmyers  ******************************************************************************/
68930082d0cSmyers 
69030082d0cSmyers void
AcpiDmRegionFlags(ACPI_PARSE_OBJECT * Op)69130082d0cSmyers AcpiDmRegionFlags (
69230082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
69330082d0cSmyers {
69430082d0cSmyers 
69530082d0cSmyers     /* The next Op contains the SpaceId */
69630082d0cSmyers 
69730082d0cSmyers     Op = AcpiPsGetDepthNext (NULL, Op);
69830082d0cSmyers 
69930082d0cSmyers     /* Mark the Op as completed */
70030082d0cSmyers 
70130082d0cSmyers     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
70230082d0cSmyers 
70330082d0cSmyers     AcpiOsPrintf (", ");
70430082d0cSmyers     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
70530082d0cSmyers }
70630082d0cSmyers 
70730082d0cSmyers 
70830082d0cSmyers /*******************************************************************************
70930082d0cSmyers  *
71030082d0cSmyers  * FUNCTION:    AcpiDmMatchOp
71130082d0cSmyers  *
71230082d0cSmyers  * PARAMETERS:  Op              - Match Object to be examined
71330082d0cSmyers  *
71430082d0cSmyers  * RETURN:      None
71530082d0cSmyers  *
71630082d0cSmyers  * DESCRIPTION: Decode Match opcode operands
71730082d0cSmyers  *
71830082d0cSmyers  ******************************************************************************/
71930082d0cSmyers 
72030082d0cSmyers void
AcpiDmMatchOp(ACPI_PARSE_OBJECT * Op)72130082d0cSmyers AcpiDmMatchOp (
72230082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
72330082d0cSmyers {
72430082d0cSmyers     ACPI_PARSE_OBJECT       *NextOp;
72530082d0cSmyers 
72630082d0cSmyers 
72730082d0cSmyers     NextOp = AcpiPsGetDepthNext (NULL, Op);
72830082d0cSmyers     NextOp = NextOp->Common.Next;
72930082d0cSmyers 
73030082d0cSmyers     if (!NextOp)
73130082d0cSmyers     {
73230082d0cSmyers         /* Handle partial tree during single-step */
73330082d0cSmyers 
73430082d0cSmyers         return;
73530082d0cSmyers     }
73630082d0cSmyers 
73730082d0cSmyers     /* Mark the two nodes that contain the encoding for the match keywords */
73830082d0cSmyers 
73930082d0cSmyers     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
74030082d0cSmyers 
74130082d0cSmyers     NextOp = NextOp->Common.Next;
74230082d0cSmyers     NextOp = NextOp->Common.Next;
74330082d0cSmyers     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
74430082d0cSmyers }
74530082d0cSmyers 
74630082d0cSmyers 
74730082d0cSmyers /*******************************************************************************
74830082d0cSmyers  *
74930082d0cSmyers  * FUNCTION:    AcpiDmMatchKeyword
75030082d0cSmyers  *
75130082d0cSmyers  * PARAMETERS:  Op              - Match Object to be examined
75230082d0cSmyers  *
75330082d0cSmyers  * RETURN:      None
75430082d0cSmyers  *
75530082d0cSmyers  * DESCRIPTION: Decode Match opcode operands
75630082d0cSmyers  *
75730082d0cSmyers  ******************************************************************************/
75830082d0cSmyers 
75930082d0cSmyers static void
AcpiDmMatchKeyword(ACPI_PARSE_OBJECT * Op)76030082d0cSmyers AcpiDmMatchKeyword (
76130082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
76230082d0cSmyers {
76330082d0cSmyers 
76427f7c583Smyers     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
76530082d0cSmyers     {
76630082d0cSmyers         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
76730082d0cSmyers     }
76830082d0cSmyers     else
76930082d0cSmyers     {
7707b1019a6SJerry Jelinek         AcpiOsPrintf ("%s",
7717b1019a6SJerry Jelinek             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
77230082d0cSmyers     }
77330082d0cSmyers }
77430082d0cSmyers 
77530082d0cSmyers 
77630082d0cSmyers /*******************************************************************************
77730082d0cSmyers  *
77830082d0cSmyers  * FUNCTION:    AcpiDmDisassembleOneOp
77930082d0cSmyers  *
78030082d0cSmyers  * PARAMETERS:  WalkState           - Current walk info
78130082d0cSmyers  *              Info                - Parse tree walk info
78230082d0cSmyers  *              Op                  - Op that is to be printed
78330082d0cSmyers  *
78430082d0cSmyers  * RETURN:      None
78530082d0cSmyers  *
78630082d0cSmyers  * DESCRIPTION: Disassemble a single AML opcode
78730082d0cSmyers  *
78830082d0cSmyers  ******************************************************************************/
78930082d0cSmyers 
79030082d0cSmyers void
AcpiDmDisassembleOneOp(ACPI_WALK_STATE * WalkState,ACPI_OP_WALK_INFO * Info,ACPI_PARSE_OBJECT * Op)79130082d0cSmyers AcpiDmDisassembleOneOp (
79230082d0cSmyers     ACPI_WALK_STATE         *WalkState,
79330082d0cSmyers     ACPI_OP_WALK_INFO       *Info,
79430082d0cSmyers     ACPI_PARSE_OBJECT       *Op)
79530082d0cSmyers {
79630082d0cSmyers     const ACPI_OPCODE_INFO  *OpInfo = NULL;
79730082d0cSmyers     UINT32                  Offset;
79830082d0cSmyers     UINT32                  Length;
79927f7c583Smyers     ACPI_PARSE_OBJECT       *Child;
800db2bae30SDana Myers     ACPI_STATUS             Status;
8017b1019a6SJerry Jelinek     UINT8                   *Aml;
8027b1019a6SJerry Jelinek     const AH_DEVICE_ID      *IdInfo;
80330082d0cSmyers 
80430082d0cSmyers 
80530082d0cSmyers     if (!Op)
80630082d0cSmyers     {
80730082d0cSmyers         AcpiOsPrintf ("<NULL OP PTR>");
80830082d0cSmyers         return;
80930082d0cSmyers     }
81030082d0cSmyers 
8117b1019a6SJerry Jelinek     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
8127b1019a6SJerry Jelinek     {
8137b1019a6SJerry Jelinek         return; /* ElseIf macro was already emitted */
8147b1019a6SJerry Jelinek     }
8157b1019a6SJerry Jelinek 
81630082d0cSmyers     switch (Op->Common.DisasmOpcode)
81730082d0cSmyers     {
81830082d0cSmyers     case ACPI_DASM_MATCHOP:
81930082d0cSmyers 
82030082d0cSmyers         AcpiDmMatchKeyword (Op);
82130082d0cSmyers         return;
82230082d0cSmyers 
82327f7c583Smyers     case ACPI_DASM_LNOT_SUFFIX:
82430082d0cSmyers 
8257b1019a6SJerry Jelinek         if (!AcpiGbl_CstyleDisassembly)
8267b1019a6SJerry Jelinek         {
8277b1019a6SJerry Jelinek             switch (Op->Common.AmlOpcode)
8287b1019a6SJerry Jelinek             {
829*35786f68SRobert Mustacchi             case AML_LOGICAL_EQUAL_OP:
8307b1019a6SJerry Jelinek                 AcpiOsPrintf ("LNotEqual");
8317b1019a6SJerry Jelinek                 break;
8327b1019a6SJerry Jelinek 
833*35786f68SRobert Mustacchi             case AML_LOGICAL_GREATER_OP:
8347b1019a6SJerry Jelinek                 AcpiOsPrintf ("LLessEqual");
8357b1019a6SJerry Jelinek                 break;
8367b1019a6SJerry Jelinek 
837*35786f68SRobert Mustacchi             case AML_LOGICAL_LESS_OP:
8387b1019a6SJerry Jelinek                 AcpiOsPrintf ("LGreaterEqual");
8397b1019a6SJerry Jelinek                 break;
8407b1019a6SJerry Jelinek 
8417b1019a6SJerry Jelinek             default:
8427b1019a6SJerry Jelinek                 break;
8437b1019a6SJerry Jelinek             }
84427f7c583Smyers         }
8457b1019a6SJerry Jelinek 
84627f7c583Smyers         Op->Common.DisasmOpcode = 0;
84727f7c583Smyers         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
84827f7c583Smyers         return;
84930082d0cSmyers 
85027f7c583Smyers     default:
85130082d0cSmyers         break;
85227f7c583Smyers     }
85330082d0cSmyers 
85427f7c583Smyers     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
85530082d0cSmyers 
85627f7c583Smyers     /* The op and arguments */
85730082d0cSmyers 
85827f7c583Smyers     switch (Op->Common.AmlOpcode)
85927f7c583Smyers     {
860*35786f68SRobert Mustacchi     case AML_LOGICAL_NOT_OP:
86130082d0cSmyers 
86227f7c583Smyers         Child = Op->Common.Value.Arg;
863*35786f68SRobert Mustacchi         if ((Child->Common.AmlOpcode == AML_LOGICAL_EQUAL_OP) ||
864*35786f68SRobert Mustacchi             (Child->Common.AmlOpcode == AML_LOGICAL_GREATER_OP) ||
865*35786f68SRobert Mustacchi             (Child->Common.AmlOpcode == AML_LOGICAL_LESS_OP))
86627f7c583Smyers         {
86727f7c583Smyers             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
86827f7c583Smyers             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
86927f7c583Smyers         }
87027f7c583Smyers         else
87127f7c583Smyers         {
87227f7c583Smyers             AcpiOsPrintf ("%s", OpInfo->Name);
87327f7c583Smyers         }
87430082d0cSmyers         break;
87530082d0cSmyers 
87630082d0cSmyers     case AML_BYTE_OP:
87730082d0cSmyers 
87830082d0cSmyers         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
87930082d0cSmyers         break;
88030082d0cSmyers 
88130082d0cSmyers     case AML_WORD_OP:
88230082d0cSmyers 
88330082d0cSmyers         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
88430082d0cSmyers         {
8857b1019a6SJerry Jelinek             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
88630082d0cSmyers         }
88730082d0cSmyers         else
88830082d0cSmyers         {
88930082d0cSmyers             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
89030082d0cSmyers         }
89130082d0cSmyers         break;
89230082d0cSmyers 
89330082d0cSmyers     case AML_DWORD_OP:
89430082d0cSmyers 
89530082d0cSmyers         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
89630082d0cSmyers         {
8977b1019a6SJerry Jelinek             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
89830082d0cSmyers         }
89930082d0cSmyers         else
90030082d0cSmyers         {
90130082d0cSmyers             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
90230082d0cSmyers         }
90330082d0cSmyers         break;
90430082d0cSmyers 
90530082d0cSmyers     case AML_QWORD_OP:
90630082d0cSmyers 
90726f3cdf0SGordon Ross         AcpiOsPrintf ("0x%8.8X%8.8X",
90826f3cdf0SGordon Ross             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
90930082d0cSmyers         break;
91030082d0cSmyers 
91130082d0cSmyers     case AML_STRING_OP:
91230082d0cSmyers 
9137b1019a6SJerry Jelinek         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
91430082d0cSmyers 
9157b1019a6SJerry Jelinek         /* For _HID/_CID strings, attempt to output a descriptive comment */
91630082d0cSmyers 
9177b1019a6SJerry Jelinek         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
9187b1019a6SJerry Jelinek         {
9197b1019a6SJerry Jelinek             /* If we know about the ID, emit the description */
92030082d0cSmyers 
9217b1019a6SJerry Jelinek             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
9227b1019a6SJerry Jelinek             if (IdInfo)
9237b1019a6SJerry Jelinek             {
9247b1019a6SJerry Jelinek                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
9257b1019a6SJerry Jelinek             }
9267b1019a6SJerry Jelinek         }
9277b1019a6SJerry Jelinek         break;
9287b1019a6SJerry Jelinek 
9297b1019a6SJerry Jelinek     case AML_BUFFER_OP:
93030082d0cSmyers         /*
9317b1019a6SJerry Jelinek          * Determine the type of buffer. We can have one of the following:
93230082d0cSmyers          *
93330082d0cSmyers          * 1) ResourceTemplate containing Resource Descriptors.
93430082d0cSmyers          * 2) Unicode String buffer
93530082d0cSmyers          * 3) ASCII String buffer
93630082d0cSmyers          * 4) Raw data buffer (if none of the above)
93730082d0cSmyers          *
93830082d0cSmyers          * Since there are no special AML opcodes to differentiate these
93930082d0cSmyers          * types of buffers, we have to closely look at the data in the
94030082d0cSmyers          * buffer to determine the type.
94130082d0cSmyers          */
9427b1019a6SJerry Jelinek         if (!AcpiGbl_NoResourceDisassembly)
94330082d0cSmyers         {
9447b1019a6SJerry Jelinek             Status = AcpiDmIsResourceTemplate (WalkState, Op);
9457b1019a6SJerry Jelinek             if (ACPI_SUCCESS (Status))
9467b1019a6SJerry Jelinek             {
9477b1019a6SJerry Jelinek                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
9487b1019a6SJerry Jelinek                 AcpiOsPrintf ("ResourceTemplate");
9497b1019a6SJerry Jelinek                 break;
9507b1019a6SJerry Jelinek             }
9517b1019a6SJerry Jelinek             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
9527b1019a6SJerry Jelinek             {
9537b1019a6SJerry Jelinek                 AcpiOsPrintf (
9547b1019a6SJerry Jelinek                     "/**** Is ResourceTemplate, "
9557b1019a6SJerry Jelinek                     "but EndTag not at buffer end ****/ ");
9567b1019a6SJerry Jelinek             }
95730082d0cSmyers         }
9587b1019a6SJerry Jelinek 
9597b1019a6SJerry Jelinek         if (AcpiDmIsUuidBuffer (Op))
960db2bae30SDana Myers         {
9617b1019a6SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
9627b1019a6SJerry Jelinek             AcpiOsPrintf ("ToUUID (");
963db2bae30SDana Myers         }
9647b1019a6SJerry Jelinek         else if (AcpiDmIsUnicodeBuffer (Op))
96530082d0cSmyers         {
96630082d0cSmyers             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
96730082d0cSmyers             AcpiOsPrintf ("Unicode (");
96830082d0cSmyers         }
96930082d0cSmyers         else if (AcpiDmIsStringBuffer (Op))
97030082d0cSmyers         {
97130082d0cSmyers             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
97230082d0cSmyers             AcpiOsPrintf ("Buffer");
97330082d0cSmyers         }
9747b1019a6SJerry Jelinek         else if (AcpiDmIsPldBuffer (Op))
97530082d0cSmyers         {
9767b1019a6SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
9777b1019a6SJerry Jelinek             AcpiOsPrintf ("ToPLD (");
97830082d0cSmyers         }
97930082d0cSmyers         else
98030082d0cSmyers         {
9817b1019a6SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
9827b1019a6SJerry Jelinek             AcpiOsPrintf ("Buffer");
98330082d0cSmyers         }
98430082d0cSmyers         break;
98530082d0cSmyers 
98630082d0cSmyers     case AML_INT_NAMEPATH_OP:
98730082d0cSmyers 
98830082d0cSmyers         AcpiDmNamestring (Op->Common.Value.Name);
98930082d0cSmyers         break;
99030082d0cSmyers 
99130082d0cSmyers     case AML_INT_NAMEDFIELD_OP:
99230082d0cSmyers 
993db2bae30SDana Myers         Length = AcpiDmDumpName (Op->Named.Name);
994*35786f68SRobert Mustacchi 
995*35786f68SRobert Mustacchi         AcpiOsPrintf (",");
996*35786f68SRobert Mustacchi         ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0);
997*35786f68SRobert Mustacchi         AcpiOsPrintf ("%*.s  %u", (unsigned) (5 - Length), " ",
99830082d0cSmyers             (UINT32) Op->Common.Value.Integer);
999*35786f68SRobert Mustacchi 
100030082d0cSmyers         AcpiDmCommaIfFieldMember (Op);
100130082d0cSmyers 
100230082d0cSmyers         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
100330082d0cSmyers         break;
100430082d0cSmyers 
100530082d0cSmyers     case AML_INT_RESERVEDFIELD_OP:
100630082d0cSmyers 
100730082d0cSmyers         /* Offset() -- Must account for previous offsets */
100830082d0cSmyers 
100930082d0cSmyers         Offset = (UINT32) Op->Common.Value.Integer;
101030082d0cSmyers         Info->BitOffset += Offset;
101130082d0cSmyers 
101230082d0cSmyers         if (Info->BitOffset % 8 == 0)
101330082d0cSmyers         {
10147b1019a6SJerry Jelinek             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
101530082d0cSmyers         }
101630082d0cSmyers         else
101730082d0cSmyers         {
101826f3cdf0SGordon Ross             AcpiOsPrintf ("    ,   %u", Offset);
101930082d0cSmyers         }
102030082d0cSmyers 
102130082d0cSmyers         AcpiDmCommaIfFieldMember (Op);
102230082d0cSmyers         break;
102330082d0cSmyers 
102430082d0cSmyers     case AML_INT_ACCESSFIELD_OP:
10257b1019a6SJerry Jelinek     case AML_INT_EXTACCESSFIELD_OP:
102630082d0cSmyers 
10277b1019a6SJerry Jelinek         AcpiOsPrintf ("AccessAs (%s, ",
10287b1019a6SJerry Jelinek             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
10297b1019a6SJerry Jelinek 
10307b1019a6SJerry Jelinek         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
10317b1019a6SJerry Jelinek 
10327b1019a6SJerry Jelinek         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
10337b1019a6SJerry Jelinek         {
10347b1019a6SJerry Jelinek             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
10357b1019a6SJerry Jelinek                 ((Op->Common.Value.Integer >> 16) & 0xFF));
10367b1019a6SJerry Jelinek         }
103730082d0cSmyers 
103830082d0cSmyers         AcpiOsPrintf (")");
103930082d0cSmyers         AcpiDmCommaIfFieldMember (Op);
1040*35786f68SRobert Mustacchi         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
104130082d0cSmyers         break;
104230082d0cSmyers 
10437b1019a6SJerry Jelinek     case AML_INT_CONNECTION_OP:
10447b1019a6SJerry Jelinek         /*
10457b1019a6SJerry Jelinek          * Two types of Connection() - one with a buffer object, the
10467b1019a6SJerry Jelinek          * other with a namestring that points to a buffer object.
10477b1019a6SJerry Jelinek          */
10487b1019a6SJerry Jelinek         AcpiOsPrintf ("Connection (");
10497b1019a6SJerry Jelinek         Child = Op->Common.Value.Arg;
10507b1019a6SJerry Jelinek 
10517b1019a6SJerry Jelinek         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
10527b1019a6SJerry Jelinek         {
10537b1019a6SJerry Jelinek             AcpiOsPrintf ("\n");
10547b1019a6SJerry Jelinek 
10557b1019a6SJerry Jelinek             Aml = Child->Named.Data;
10567b1019a6SJerry Jelinek             Length = (UINT32) Child->Common.Value.Integer;
10577b1019a6SJerry Jelinek 
10587b1019a6SJerry Jelinek             Info->Level += 1;
10597b1019a6SJerry Jelinek             Info->MappingOp = Op;
10607b1019a6SJerry Jelinek             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
10617b1019a6SJerry Jelinek 
10627b1019a6SJerry Jelinek             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
10637b1019a6SJerry Jelinek 
10647b1019a6SJerry Jelinek             Info->Level -= 1;
10657b1019a6SJerry Jelinek             AcpiDmIndent (Info->Level);
10667b1019a6SJerry Jelinek         }
10677b1019a6SJerry Jelinek         else
10687b1019a6SJerry Jelinek         {
10697b1019a6SJerry Jelinek             AcpiDmNamestring (Child->Common.Value.Name);
10707b1019a6SJerry Jelinek         }
10717b1019a6SJerry Jelinek 
10727b1019a6SJerry Jelinek         AcpiOsPrintf (")");
10737b1019a6SJerry Jelinek         AcpiDmCommaIfFieldMember (Op);
1074*35786f68SRobert Mustacchi         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
1075*35786f68SRobert Mustacchi         ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
10767b1019a6SJerry Jelinek         AcpiOsPrintf ("\n");
10777b1019a6SJerry Jelinek 
10787b1019a6SJerry Jelinek         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
10797b1019a6SJerry Jelinek         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
10807b1019a6SJerry Jelinek         break;
108130082d0cSmyers 
108230082d0cSmyers     case AML_INT_BYTELIST_OP:
108330082d0cSmyers 
108430082d0cSmyers         AcpiDmByteList (Info, Op);
108530082d0cSmyers         break;
108630082d0cSmyers 
108730082d0cSmyers     case AML_INT_METHODCALL_OP:
108830082d0cSmyers 
108930082d0cSmyers         Op = AcpiPsGetDepthNext (NULL, Op);
109030082d0cSmyers         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
109130082d0cSmyers 
109230082d0cSmyers         AcpiDmNamestring (Op->Common.Value.Name);
109330082d0cSmyers         break;
109430082d0cSmyers 
1095*35786f68SRobert Mustacchi     case AML_WHILE_OP:
1096*35786f68SRobert Mustacchi 
1097*35786f68SRobert Mustacchi         if (Op->Common.DisasmOpcode == ACPI_DASM_SWITCH)
1098*35786f68SRobert Mustacchi         {
1099*35786f68SRobert Mustacchi             AcpiOsPrintf ("%s", "Switch");
1100*35786f68SRobert Mustacchi             break;
1101*35786f68SRobert Mustacchi         }
1102*35786f68SRobert Mustacchi 
1103*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", OpInfo->Name);
1104*35786f68SRobert Mustacchi         break;
1105*35786f68SRobert Mustacchi 
1106*35786f68SRobert Mustacchi     case AML_IF_OP:
1107*35786f68SRobert Mustacchi 
1108*35786f68SRobert Mustacchi         if (Op->Common.DisasmOpcode == ACPI_DASM_CASE)
1109*35786f68SRobert Mustacchi         {
1110*35786f68SRobert Mustacchi             AcpiOsPrintf ("%s", "Case");
1111*35786f68SRobert Mustacchi             break;
1112*35786f68SRobert Mustacchi         }
1113*35786f68SRobert Mustacchi 
1114*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", OpInfo->Name);
1115*35786f68SRobert Mustacchi         break;
1116*35786f68SRobert Mustacchi 
11177b1019a6SJerry Jelinek     case AML_ELSE_OP:
11187b1019a6SJerry Jelinek 
11197b1019a6SJerry Jelinek         AcpiDmConvertToElseIf (Op);
11207b1019a6SJerry Jelinek         break;
11217b1019a6SJerry Jelinek 
11227b1019a6SJerry Jelinek     case AML_EXTERNAL_OP:
11237b1019a6SJerry Jelinek 
11247b1019a6SJerry Jelinek         if (AcpiGbl_DmEmitExternalOpcodes)
11257b1019a6SJerry Jelinek         {
1126*35786f68SRobert Mustacchi             AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0));
11277b1019a6SJerry Jelinek         }
112830082d0cSmyers 
1129*35786f68SRobert Mustacchi         break;
1130*35786f68SRobert Mustacchi 
113130082d0cSmyers     default:
113230082d0cSmyers 
113330082d0cSmyers         /* Just get the opcode name and print it */
113430082d0cSmyers 
113530082d0cSmyers         AcpiOsPrintf ("%s", OpInfo->Name);
113630082d0cSmyers 
113730082d0cSmyers 
113830082d0cSmyers #ifdef ACPI_DEBUGGER
113930082d0cSmyers 
114030082d0cSmyers         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
114130082d0cSmyers             (WalkState) &&
114230082d0cSmyers             (WalkState->Results) &&
1143db2bae30SDana Myers             (WalkState->ResultCount))
114430082d0cSmyers         {
11457b1019a6SJerry Jelinek             AcpiDbDecodeInternalObject (
114630082d0cSmyers                 WalkState->Results->Results.ObjDesc [
1147db2bae30SDana Myers                     (WalkState->ResultCount - 1) %
1148db2bae30SDana Myers                         ACPI_RESULTS_FRAME_OBJ_NUM]);
114930082d0cSmyers         }
115030082d0cSmyers #endif
1151db2bae30SDana Myers 
115230082d0cSmyers         break;
115330082d0cSmyers     }
115430082d0cSmyers }
115530082d0cSmyers 
11567b1019a6SJerry Jelinek 
11577b1019a6SJerry Jelinek /*******************************************************************************
11587b1019a6SJerry Jelinek  *
11597b1019a6SJerry Jelinek  * FUNCTION:    AcpiDmConvertToElseIf
11607b1019a6SJerry Jelinek  *
11617b1019a6SJerry Jelinek  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
11627b1019a6SJerry Jelinek  *
11637b1019a6SJerry Jelinek  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
11647b1019a6SJerry Jelinek  *
11657b1019a6SJerry Jelinek  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
11667b1019a6SJerry Jelinek  *
11677b1019a6SJerry Jelinek  * EXAMPLE:
11687b1019a6SJerry Jelinek  *
11697b1019a6SJerry Jelinek  * This If..Else..If nested sequence:
11707b1019a6SJerry Jelinek  *
11717b1019a6SJerry Jelinek  *        If (Arg0 == 1)
11727b1019a6SJerry Jelinek  *        {
11737b1019a6SJerry Jelinek  *            Local0 = 4
11747b1019a6SJerry Jelinek  *        }
11757b1019a6SJerry Jelinek  *        Else
11767b1019a6SJerry Jelinek  *        {
11777b1019a6SJerry Jelinek  *            If (Arg0 == 2)
11787b1019a6SJerry Jelinek  *            {
11797b1019a6SJerry Jelinek  *                Local0 = 5
11807b1019a6SJerry Jelinek  *            }
11817b1019a6SJerry Jelinek  *        }
11827b1019a6SJerry Jelinek  *
11837b1019a6SJerry Jelinek  * Is converted to this simpler If..ElseIf sequence:
11847b1019a6SJerry Jelinek  *
11857b1019a6SJerry Jelinek  *        If (Arg0 == 1)
11867b1019a6SJerry Jelinek  *        {
11877b1019a6SJerry Jelinek  *            Local0 = 4
11887b1019a6SJerry Jelinek  *        }
11897b1019a6SJerry Jelinek  *        ElseIf (Arg0 == 2)
11907b1019a6SJerry Jelinek  *        {
11917b1019a6SJerry Jelinek  *            Local0 = 5
11927b1019a6SJerry Jelinek  *        }
11937b1019a6SJerry Jelinek  *
11947b1019a6SJerry Jelinek  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
11957b1019a6SJerry Jelinek  * macro that emits an Else opcode followed by an If opcode. This function
11967b1019a6SJerry Jelinek  * reverses these AML sequences back to an ElseIf macro where possible. This
11977b1019a6SJerry Jelinek  * can make the disassembled ASL code simpler and more like the original code.
11987b1019a6SJerry Jelinek  *
11997b1019a6SJerry Jelinek  ******************************************************************************/
12007b1019a6SJerry Jelinek 
12017b1019a6SJerry Jelinek static void
AcpiDmConvertToElseIf(ACPI_PARSE_OBJECT * OriginalElseOp)12027b1019a6SJerry Jelinek AcpiDmConvertToElseIf (
12037b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *OriginalElseOp)
12047b1019a6SJerry Jelinek {
12057b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *IfOp;
12067b1019a6SJerry Jelinek     ACPI_PARSE_OBJECT       *ElseOp;
12077b1019a6SJerry Jelinek 
12087b1019a6SJerry Jelinek 
12097b1019a6SJerry Jelinek     /*
12107b1019a6SJerry Jelinek      * To be able to perform the conversion, two conditions must be satisfied:
12117b1019a6SJerry Jelinek      * 1) The first child of the Else must be an If statement.
12127b1019a6SJerry Jelinek      * 2) The If block can only be followed by an Else block and these must
12137b1019a6SJerry Jelinek      *    be the only blocks under the original Else.
12147b1019a6SJerry Jelinek      */
12157b1019a6SJerry Jelinek     IfOp = OriginalElseOp->Common.Value.Arg;
1216*35786f68SRobert Mustacchi 
12177b1019a6SJerry Jelinek     if (!IfOp ||
12187b1019a6SJerry Jelinek         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
12197b1019a6SJerry Jelinek         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
12207b1019a6SJerry Jelinek     {
1221*35786f68SRobert Mustacchi         /* Not a proper Else..If sequence, cannot convert to ElseIf */
1222*35786f68SRobert Mustacchi 
1223*35786f68SRobert Mustacchi         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
1224*35786f68SRobert Mustacchi         {
1225*35786f68SRobert Mustacchi             AcpiOsPrintf ("%s", "Default");
1226*35786f68SRobert Mustacchi             return;
1227*35786f68SRobert Mustacchi         }
12287b1019a6SJerry Jelinek 
12297b1019a6SJerry Jelinek         AcpiOsPrintf ("%s", "Else");
12307b1019a6SJerry Jelinek         return;
12317b1019a6SJerry Jelinek     }
12327b1019a6SJerry Jelinek 
1233*35786f68SRobert Mustacchi     /* Cannot have anything following the If...Else block */
1234*35786f68SRobert Mustacchi 
1235*35786f68SRobert Mustacchi     ElseOp = IfOp->Common.Next;
1236*35786f68SRobert Mustacchi     if (ElseOp && ElseOp->Common.Next)
1237*35786f68SRobert Mustacchi     {
1238*35786f68SRobert Mustacchi         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
1239*35786f68SRobert Mustacchi         {
1240*35786f68SRobert Mustacchi             AcpiOsPrintf ("%s", "Default");
1241*35786f68SRobert Mustacchi             return;
1242*35786f68SRobert Mustacchi         }
1243*35786f68SRobert Mustacchi 
1244*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", "Else");
1245*35786f68SRobert Mustacchi         return;
1246*35786f68SRobert Mustacchi     }
1247*35786f68SRobert Mustacchi 
1248*35786f68SRobert Mustacchi     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
1249*35786f68SRobert Mustacchi     {
1250*35786f68SRobert Mustacchi         /*
1251*35786f68SRobert Mustacchi          * There is an ElseIf but in this case the Else is actually
1252*35786f68SRobert Mustacchi          * a Default block for a Switch/Case statement. No conversion.
1253*35786f68SRobert Mustacchi          */
1254*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", "Default");
1255*35786f68SRobert Mustacchi         return;
1256*35786f68SRobert Mustacchi     }
1257*35786f68SRobert Mustacchi 
1258*35786f68SRobert Mustacchi     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_CASE)
1259*35786f68SRobert Mustacchi     {
1260*35786f68SRobert Mustacchi         /*
1261*35786f68SRobert Mustacchi          * This ElseIf is actually a Case block for a Switch/Case
1262*35786f68SRobert Mustacchi          * statement. Print Case but do not return so that we can
1263*35786f68SRobert Mustacchi          * promote the subtree and keep the indentation level.
1264*35786f68SRobert Mustacchi          */
1265*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", "Case");
1266*35786f68SRobert Mustacchi     }
1267*35786f68SRobert Mustacchi     else
1268*35786f68SRobert Mustacchi     {
1269*35786f68SRobert Mustacchi        /* Emit ElseIf, mark the IF as now an ELSEIF */
1270*35786f68SRobert Mustacchi 
1271*35786f68SRobert Mustacchi         AcpiOsPrintf ("%s", "ElseIf");
1272*35786f68SRobert Mustacchi     }
12737b1019a6SJerry Jelinek 
12747b1019a6SJerry Jelinek     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
12757b1019a6SJerry Jelinek 
12767b1019a6SJerry Jelinek     /* The IF parent will now be the same as the original ELSE parent */
12777b1019a6SJerry Jelinek 
12787b1019a6SJerry Jelinek     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
12797b1019a6SJerry Jelinek 
12807b1019a6SJerry Jelinek     /*
12817b1019a6SJerry Jelinek      * Update the NEXT pointers to restructure the parse tree, essentially
12827b1019a6SJerry Jelinek      * promoting an If..Else block up to the same level as the original
12837b1019a6SJerry Jelinek      * Else.
12847b1019a6SJerry Jelinek      *
12857b1019a6SJerry Jelinek      * Check if the IF has a corresponding ELSE peer
12867b1019a6SJerry Jelinek      */
12877b1019a6SJerry Jelinek     ElseOp = IfOp->Common.Next;
12887b1019a6SJerry Jelinek     if (ElseOp &&
12897b1019a6SJerry Jelinek         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
12907b1019a6SJerry Jelinek     {
12917b1019a6SJerry Jelinek         /* If an ELSE matches the IF, promote it also */
12927b1019a6SJerry Jelinek 
12937b1019a6SJerry Jelinek         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
1294*35786f68SRobert Mustacchi 
1295*35786f68SRobert Mustacchi         /* Promote the entire block under the ElseIf (All Next OPs) */
1296*35786f68SRobert Mustacchi 
1297*35786f68SRobert Mustacchi         AcpiDmPromoteSubtree (OriginalElseOp);
12987b1019a6SJerry Jelinek     }
12997b1019a6SJerry Jelinek     else
13007b1019a6SJerry Jelinek     {
13017b1019a6SJerry Jelinek         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
13027b1019a6SJerry Jelinek 
13037b1019a6SJerry Jelinek         IfOp->Common.Next = OriginalElseOp->Common.Next;
13047b1019a6SJerry Jelinek     }
13057b1019a6SJerry Jelinek 
13067b1019a6SJerry Jelinek     /* Detach the child IF block from the original ELSE */
13077b1019a6SJerry Jelinek 
13087b1019a6SJerry Jelinek     OriginalElseOp->Common.Value.Arg = NULL;
13097b1019a6SJerry Jelinek 
13107b1019a6SJerry Jelinek     /* Ignore the original ELSE from now on */
13117b1019a6SJerry Jelinek 
13127b1019a6SJerry Jelinek     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
13137b1019a6SJerry Jelinek     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
13147b1019a6SJerry Jelinek 
13157b1019a6SJerry Jelinek     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
13167b1019a6SJerry Jelinek 
13177b1019a6SJerry Jelinek     OriginalElseOp->Common.Next = IfOp;
13187b1019a6SJerry Jelinek }
1319*35786f68SRobert Mustacchi 
1320*35786f68SRobert Mustacchi 
1321*35786f68SRobert Mustacchi /*******************************************************************************
1322*35786f68SRobert Mustacchi  *
1323*35786f68SRobert Mustacchi  * FUNCTION:    AcpiDmPromoteSubtree
1324*35786f68SRobert Mustacchi  *
1325*35786f68SRobert Mustacchi  * PARAMETERS:  StartOpOp           - Original parent of the entire subtree
1326*35786f68SRobert Mustacchi  *
1327*35786f68SRobert Mustacchi  * RETURN:      None
1328*35786f68SRobert Mustacchi  *
1329*35786f68SRobert Mustacchi  * DESCRIPTION: Promote an entire parse subtree up one level.
1330*35786f68SRobert Mustacchi  *
1331*35786f68SRobert Mustacchi  ******************************************************************************/
1332*35786f68SRobert Mustacchi 
1333*35786f68SRobert Mustacchi static void
AcpiDmPromoteSubtree(ACPI_PARSE_OBJECT * StartOp)1334*35786f68SRobert Mustacchi AcpiDmPromoteSubtree (
1335*35786f68SRobert Mustacchi     ACPI_PARSE_OBJECT       *StartOp)
1336*35786f68SRobert Mustacchi {
1337*35786f68SRobert Mustacchi     ACPI_PARSE_OBJECT       *Op;
1338*35786f68SRobert Mustacchi     ACPI_PARSE_OBJECT       *ParentOp;
1339*35786f68SRobert Mustacchi 
1340*35786f68SRobert Mustacchi 
1341*35786f68SRobert Mustacchi     /* New parent for subtree elements */
1342*35786f68SRobert Mustacchi 
1343*35786f68SRobert Mustacchi     ParentOp = StartOp->Common.Parent;
1344*35786f68SRobert Mustacchi 
1345*35786f68SRobert Mustacchi     /* First child starts the subtree */
1346*35786f68SRobert Mustacchi 
1347*35786f68SRobert Mustacchi     Op = StartOp->Common.Value.Arg;
1348*35786f68SRobert Mustacchi 
1349*35786f68SRobert Mustacchi     /* Walk the top-level elements of the subtree */
1350*35786f68SRobert Mustacchi 
1351*35786f68SRobert Mustacchi     while (Op)
1352*35786f68SRobert Mustacchi     {
1353*35786f68SRobert Mustacchi         Op->Common.Parent = ParentOp;
1354*35786f68SRobert Mustacchi         if (!Op->Common.Next)
1355*35786f68SRobert Mustacchi         {
1356*35786f68SRobert Mustacchi             /* Last Op in list, update its next field */
1357*35786f68SRobert Mustacchi 
1358*35786f68SRobert Mustacchi             Op->Common.Next = StartOp->Common.Next;
1359*35786f68SRobert Mustacchi             break;
1360*35786f68SRobert Mustacchi         }
1361*35786f68SRobert Mustacchi         Op = Op->Common.Next;
1362*35786f68SRobert Mustacchi     }
1363*35786f68SRobert Mustacchi }
1364