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