xref: /freebsd-src/sys/contrib/dev/acpica/components/disassembler/dmopcode.c (revision 804fe2660352e090f4481f2c1d646b508859e79a)
1a159c266SJung-uk Kim /*******************************************************************************
2a159c266SJung-uk Kim  *
3a159c266SJung-uk Kim  * Module Name: dmopcode - AML disassembler, specific AML opcodes
4a159c266SJung-uk Kim  *
5a159c266SJung-uk Kim  ******************************************************************************/
6a159c266SJung-uk Kim 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
11*804fe266SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp.
12a159c266SJung-uk Kim  * All rights reserved.
13a159c266SJung-uk Kim  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-uk Kim  *
119a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
121a159c266SJung-uk Kim  * are met:
122a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124a159c266SJung-uk Kim  *    without modification.
125a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129a159c266SJung-uk Kim  *    binary redistribution.
130a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132a159c266SJung-uk Kim  *    from this software without specific prior written permission.
133a159c266SJung-uk Kim  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148a159c266SJung-uk Kim  * Software Foundation.
149a159c266SJung-uk Kim  *
1500d84335fSJung-uk Kim  *****************************************************************************/
151a159c266SJung-uk Kim 
152a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
153a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
154a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
155a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
156313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h>
157313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
158fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
1590d84335fSJung-uk Kim #include <contrib/dev/acpica/include/acconvert.h>
160a159c266SJung-uk Kim 
161a159c266SJung-uk Kim 
162a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
163a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dmopcode")
164a159c266SJung-uk Kim 
1651c0e1b6dSJung-uk Kim 
166a159c266SJung-uk Kim /* Local prototypes */
167a159c266SJung-uk Kim 
168a159c266SJung-uk Kim static void
169a159c266SJung-uk Kim AcpiDmMatchKeyword (
170a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
171a159c266SJung-uk Kim 
172f8146b88SJung-uk Kim static void
173f8146b88SJung-uk Kim AcpiDmConvertToElseIf (
174f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
175f8146b88SJung-uk Kim 
176493deb39SJung-uk Kim static void
177493deb39SJung-uk Kim AcpiDmPromoteSubtree (
178493deb39SJung-uk Kim     ACPI_PARSE_OBJECT       *StartOp);
179493deb39SJung-uk Kim 
180a159c266SJung-uk Kim /*******************************************************************************
181a159c266SJung-uk Kim  *
182313a0c13SJung-uk Kim  * FUNCTION:    AcpiDmDisplayTargetPathname
183313a0c13SJung-uk Kim  *
184313a0c13SJung-uk Kim  * PARAMETERS:  Op              - Parse object
185313a0c13SJung-uk Kim  *
186313a0c13SJung-uk Kim  * RETURN:      None
187313a0c13SJung-uk Kim  *
188313a0c13SJung-uk Kim  * DESCRIPTION: For AML opcodes that have a target operand, display the full
189313a0c13SJung-uk Kim  *              pathname for the target, in a comment field. Handles Return()
190313a0c13SJung-uk Kim  *              statements also.
191313a0c13SJung-uk Kim  *
192313a0c13SJung-uk Kim  ******************************************************************************/
193313a0c13SJung-uk Kim 
194313a0c13SJung-uk Kim void
195313a0c13SJung-uk Kim AcpiDmDisplayTargetPathname (
196313a0c13SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
197313a0c13SJung-uk Kim {
198313a0c13SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
199313a0c13SJung-uk Kim     ACPI_PARSE_OBJECT       *PrevOp = NULL;
200313a0c13SJung-uk Kim     char                    *Pathname;
201313a0c13SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
202313a0c13SJung-uk Kim 
203313a0c13SJung-uk Kim 
204313a0c13SJung-uk Kim     if (Op->Common.AmlOpcode == AML_RETURN_OP)
205313a0c13SJung-uk Kim     {
206313a0c13SJung-uk Kim         PrevOp = Op->Asl.Value.Arg;
207313a0c13SJung-uk Kim     }
208313a0c13SJung-uk Kim     else
209313a0c13SJung-uk Kim     {
210313a0c13SJung-uk Kim         OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
211313a0c13SJung-uk Kim         if (!(OpInfo->Flags & AML_HAS_TARGET))
212313a0c13SJung-uk Kim         {
213313a0c13SJung-uk Kim             return;
214313a0c13SJung-uk Kim         }
215313a0c13SJung-uk Kim 
216313a0c13SJung-uk Kim         /* Target is the last Op in the arg list */
217313a0c13SJung-uk Kim 
218313a0c13SJung-uk Kim         NextOp = Op->Asl.Value.Arg;
219313a0c13SJung-uk Kim         while (NextOp)
220313a0c13SJung-uk Kim         {
221313a0c13SJung-uk Kim             PrevOp = NextOp;
222313a0c13SJung-uk Kim             NextOp = PrevOp->Asl.Next;
223313a0c13SJung-uk Kim         }
224313a0c13SJung-uk Kim     }
225313a0c13SJung-uk Kim 
226313a0c13SJung-uk Kim     if (!PrevOp)
227313a0c13SJung-uk Kim     {
228313a0c13SJung-uk Kim         return;
229313a0c13SJung-uk Kim     }
230313a0c13SJung-uk Kim 
231313a0c13SJung-uk Kim     /* We must have a namepath AML opcode */
232313a0c13SJung-uk Kim 
233313a0c13SJung-uk Kim     if (PrevOp->Asl.AmlOpcode != AML_INT_NAMEPATH_OP)
234313a0c13SJung-uk Kim     {
235313a0c13SJung-uk Kim         return;
236313a0c13SJung-uk Kim     }
237313a0c13SJung-uk Kim 
238313a0c13SJung-uk Kim     /* A null string is the "no target specified" case */
239313a0c13SJung-uk Kim 
240313a0c13SJung-uk Kim     if (!PrevOp->Asl.Value.String)
241313a0c13SJung-uk Kim     {
242313a0c13SJung-uk Kim         return;
243313a0c13SJung-uk Kim     }
244313a0c13SJung-uk Kim 
245313a0c13SJung-uk Kim     /* No node means "unresolved external reference" */
246313a0c13SJung-uk Kim 
247313a0c13SJung-uk Kim     if (!PrevOp->Asl.Node)
248313a0c13SJung-uk Kim     {
249313a0c13SJung-uk Kim         AcpiOsPrintf (" /* External reference */");
250313a0c13SJung-uk Kim         return;
251313a0c13SJung-uk Kim     }
252313a0c13SJung-uk Kim 
253313a0c13SJung-uk Kim     /* Ignore if path is already from the root */
254313a0c13SJung-uk Kim 
255313a0c13SJung-uk Kim     if (*PrevOp->Asl.Value.String == '\\')
256313a0c13SJung-uk Kim     {
257313a0c13SJung-uk Kim         return;
258313a0c13SJung-uk Kim     }
259313a0c13SJung-uk Kim 
260313a0c13SJung-uk Kim     /* Now: we can get the full pathname */
261313a0c13SJung-uk Kim 
262313a0c13SJung-uk Kim     Pathname = AcpiNsGetExternalPathname (PrevOp->Asl.Node);
263313a0c13SJung-uk Kim     if (!Pathname)
264313a0c13SJung-uk Kim     {
265313a0c13SJung-uk Kim         return;
266313a0c13SJung-uk Kim     }
267313a0c13SJung-uk Kim 
268313a0c13SJung-uk Kim     AcpiOsPrintf (" /* %s */", Pathname);
269313a0c13SJung-uk Kim     ACPI_FREE (Pathname);
270313a0c13SJung-uk Kim }
271313a0c13SJung-uk Kim 
272313a0c13SJung-uk Kim 
273313a0c13SJung-uk Kim /*******************************************************************************
274313a0c13SJung-uk Kim  *
275313a0c13SJung-uk Kim  * FUNCTION:    AcpiDmNotifyDescription
276313a0c13SJung-uk Kim  *
277313a0c13SJung-uk Kim  * PARAMETERS:  Op              - Name() parse object
278313a0c13SJung-uk Kim  *
279313a0c13SJung-uk Kim  * RETURN:      None
280313a0c13SJung-uk Kim  *
281313a0c13SJung-uk Kim  * DESCRIPTION: Emit a description comment for the value associated with a
282313a0c13SJung-uk Kim  *              Notify() operator.
283313a0c13SJung-uk Kim  *
284313a0c13SJung-uk Kim  ******************************************************************************/
285313a0c13SJung-uk Kim 
286313a0c13SJung-uk Kim void
287313a0c13SJung-uk Kim AcpiDmNotifyDescription (
288313a0c13SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
289313a0c13SJung-uk Kim {
290313a0c13SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
291313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
292313a0c13SJung-uk Kim     UINT8                   NotifyValue;
293313a0c13SJung-uk Kim     UINT8                   Type = ACPI_TYPE_ANY;
294313a0c13SJung-uk Kim 
295313a0c13SJung-uk Kim 
296313a0c13SJung-uk Kim     /* The notify value is the second argument */
297313a0c13SJung-uk Kim 
298313a0c13SJung-uk Kim     NextOp = Op->Asl.Value.Arg;
299313a0c13SJung-uk Kim     NextOp = NextOp->Asl.Next;
300313a0c13SJung-uk Kim 
301313a0c13SJung-uk Kim     switch (NextOp->Common.AmlOpcode)
302313a0c13SJung-uk Kim     {
303313a0c13SJung-uk Kim     case AML_ZERO_OP:
304313a0c13SJung-uk Kim     case AML_ONE_OP:
305313a0c13SJung-uk Kim 
306313a0c13SJung-uk Kim         NotifyValue = (UINT8) NextOp->Common.AmlOpcode;
307313a0c13SJung-uk Kim         break;
308313a0c13SJung-uk Kim 
309313a0c13SJung-uk Kim     case AML_BYTE_OP:
310313a0c13SJung-uk Kim 
311313a0c13SJung-uk Kim         NotifyValue = (UINT8) NextOp->Asl.Value.Integer;
312313a0c13SJung-uk Kim         break;
313313a0c13SJung-uk Kim 
314313a0c13SJung-uk Kim     default:
315313a0c13SJung-uk Kim         return;
316313a0c13SJung-uk Kim     }
317313a0c13SJung-uk Kim 
318313a0c13SJung-uk Kim     /*
319313a0c13SJung-uk Kim      * Attempt to get the namespace node so we can determine the object type.
320313a0c13SJung-uk Kim      * Some notify values are dependent on the object type (Device, Thermal,
321313a0c13SJung-uk Kim      * or Processor).
322313a0c13SJung-uk Kim      */
323313a0c13SJung-uk Kim     Node = Op->Asl.Node;
324313a0c13SJung-uk Kim     if (Node)
325313a0c13SJung-uk Kim     {
326313a0c13SJung-uk Kim         Type = Node->Type;
327313a0c13SJung-uk Kim     }
328313a0c13SJung-uk Kim 
329313a0c13SJung-uk Kim     AcpiOsPrintf (" // %s", AcpiUtGetNotifyName (NotifyValue, Type));
330313a0c13SJung-uk Kim }
331313a0c13SJung-uk Kim 
332313a0c13SJung-uk Kim 
333313a0c13SJung-uk Kim /*******************************************************************************
334313a0c13SJung-uk Kim  *
335f38b0f21SJung-uk Kim  * FUNCTION:    AcpiDmPredefinedDescription
336f38b0f21SJung-uk Kim  *
337f38b0f21SJung-uk Kim  * PARAMETERS:  Op              - Name() parse object
338f38b0f21SJung-uk Kim  *
339f38b0f21SJung-uk Kim  * RETURN:      None
340f38b0f21SJung-uk Kim  *
341f38b0f21SJung-uk Kim  * DESCRIPTION: Emit a description comment for a predefined ACPI name.
342f38b0f21SJung-uk Kim  *              Used for iASL compiler only.
343f38b0f21SJung-uk Kim  *
344f38b0f21SJung-uk Kim  ******************************************************************************/
345f38b0f21SJung-uk Kim 
346f38b0f21SJung-uk Kim void
347f38b0f21SJung-uk Kim AcpiDmPredefinedDescription (
348f38b0f21SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
349f38b0f21SJung-uk Kim {
350f38b0f21SJung-uk Kim #ifdef ACPI_ASL_COMPILER
351f38b0f21SJung-uk Kim     const AH_PREDEFINED_NAME    *Info;
352f38b0f21SJung-uk Kim     char                        *NameString;
353f38b0f21SJung-uk Kim     int                         LastCharIsDigit;
354f38b0f21SJung-uk Kim     int                         LastCharsAreHex;
355f38b0f21SJung-uk Kim 
356f38b0f21SJung-uk Kim 
357f38b0f21SJung-uk Kim     if (!Op)
358f38b0f21SJung-uk Kim     {
359f38b0f21SJung-uk Kim         return;
360f38b0f21SJung-uk Kim     }
361f38b0f21SJung-uk Kim 
362f38b0f21SJung-uk Kim     /* Ensure that the comment field is emitted only once */
363f38b0f21SJung-uk Kim 
364f8146b88SJung-uk Kim     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
365f38b0f21SJung-uk Kim     {
366f38b0f21SJung-uk Kim         return;
367f38b0f21SJung-uk Kim     }
368f8146b88SJung-uk Kim     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
369f38b0f21SJung-uk Kim 
370f38b0f21SJung-uk Kim     /* Predefined name must start with an underscore */
371f38b0f21SJung-uk Kim 
372f38b0f21SJung-uk Kim     NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
373f38b0f21SJung-uk Kim     if (NameString[0] != '_')
374f38b0f21SJung-uk Kim     {
375f38b0f21SJung-uk Kim         return;
376f38b0f21SJung-uk Kim     }
377f38b0f21SJung-uk Kim 
378f38b0f21SJung-uk Kim     /*
379f38b0f21SJung-uk Kim      * Check for the special ACPI names:
380f38b0f21SJung-uk Kim      * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
381f38b0f21SJung-uk Kim      * (where d=decimal_digit, x=hex_digit, a=anything)
382f38b0f21SJung-uk Kim      *
383f38b0f21SJung-uk Kim      * Convert these to the generic name for table lookup.
384f38b0f21SJung-uk Kim      * Note: NameString is guaranteed to be upper case here.
385f38b0f21SJung-uk Kim      */
386f38b0f21SJung-uk Kim     LastCharIsDigit =
3875ef50723SJung-uk Kim         (isdigit ((int) NameString[3]));    /* d */
388f38b0f21SJung-uk Kim     LastCharsAreHex =
3895ef50723SJung-uk Kim         (isxdigit ((int) NameString[2]) &&  /* xx */
3905ef50723SJung-uk Kim          isxdigit ((int) NameString[3]));
391f38b0f21SJung-uk Kim 
392f38b0f21SJung-uk Kim     switch (NameString[1])
393f38b0f21SJung-uk Kim     {
394f38b0f21SJung-uk Kim     case 'A':
395a9d8d09cSJung-uk Kim 
396f38b0f21SJung-uk Kim         if ((NameString[2] == 'C') && (LastCharIsDigit))
397f38b0f21SJung-uk Kim         {
398f38b0f21SJung-uk Kim             NameString = "_ACx";
399f38b0f21SJung-uk Kim         }
400f38b0f21SJung-uk Kim         else if ((NameString[2] == 'L') && (LastCharIsDigit))
401f38b0f21SJung-uk Kim         {
402f38b0f21SJung-uk Kim             NameString = "_ALx";
403f38b0f21SJung-uk Kim         }
404f38b0f21SJung-uk Kim         break;
405f38b0f21SJung-uk Kim 
406f38b0f21SJung-uk Kim     case 'E':
407a9d8d09cSJung-uk Kim 
408f38b0f21SJung-uk Kim         if ((NameString[2] == 'J') && (LastCharIsDigit))
409f38b0f21SJung-uk Kim         {
410f38b0f21SJung-uk Kim             NameString = "_EJx";
411f38b0f21SJung-uk Kim         }
412f38b0f21SJung-uk Kim         else if (LastCharsAreHex)
413f38b0f21SJung-uk Kim         {
414f38b0f21SJung-uk Kim             NameString = "_Exx";
415f38b0f21SJung-uk Kim         }
416f38b0f21SJung-uk Kim         break;
417f38b0f21SJung-uk Kim 
418f38b0f21SJung-uk Kim     case 'L':
419a9d8d09cSJung-uk Kim 
420f38b0f21SJung-uk Kim         if (LastCharsAreHex)
421f38b0f21SJung-uk Kim         {
422f38b0f21SJung-uk Kim             NameString = "_Lxx";
423f38b0f21SJung-uk Kim         }
424f38b0f21SJung-uk Kim         break;
425f38b0f21SJung-uk Kim 
426f38b0f21SJung-uk Kim     case 'Q':
427a9d8d09cSJung-uk Kim 
428f38b0f21SJung-uk Kim         if (LastCharsAreHex)
429f38b0f21SJung-uk Kim         {
430f38b0f21SJung-uk Kim             NameString = "_Qxx";
431f38b0f21SJung-uk Kim         }
432f38b0f21SJung-uk Kim         break;
433f38b0f21SJung-uk Kim 
434f38b0f21SJung-uk Kim     case 'T':
435a9d8d09cSJung-uk Kim 
436f38b0f21SJung-uk Kim         if (NameString[2] == '_')
437f38b0f21SJung-uk Kim         {
438f38b0f21SJung-uk Kim             NameString = "_T_x";
439f38b0f21SJung-uk Kim         }
440f38b0f21SJung-uk Kim         break;
441f38b0f21SJung-uk Kim 
442f38b0f21SJung-uk Kim     case 'W':
443a9d8d09cSJung-uk Kim 
444f38b0f21SJung-uk Kim         if (LastCharsAreHex)
445f38b0f21SJung-uk Kim         {
446f38b0f21SJung-uk Kim             NameString = "_Wxx";
447f38b0f21SJung-uk Kim         }
448f38b0f21SJung-uk Kim         break;
449f38b0f21SJung-uk Kim 
450f38b0f21SJung-uk Kim     default:
451a9d8d09cSJung-uk Kim 
452f38b0f21SJung-uk Kim         break;
453f38b0f21SJung-uk Kim     }
454f38b0f21SJung-uk Kim 
455f38b0f21SJung-uk Kim     /* Match the name in the info table */
456f38b0f21SJung-uk Kim 
457313a0c13SJung-uk Kim     Info = AcpiAhMatchPredefinedName (NameString);
458313a0c13SJung-uk Kim     if (Info)
459f38b0f21SJung-uk Kim     {
460f38b0f21SJung-uk Kim         AcpiOsPrintf ("  // %4.4s: %s",
461f38b0f21SJung-uk Kim             NameString, ACPI_CAST_PTR (char, Info->Description));
462f38b0f21SJung-uk Kim     }
463f38b0f21SJung-uk Kim 
464f38b0f21SJung-uk Kim #endif
465f38b0f21SJung-uk Kim     return;
466f38b0f21SJung-uk Kim }
467f38b0f21SJung-uk Kim 
468f38b0f21SJung-uk Kim 
469f38b0f21SJung-uk Kim /*******************************************************************************
470f38b0f21SJung-uk Kim  *
471f38b0f21SJung-uk Kim  * FUNCTION:    AcpiDmFieldPredefinedDescription
472f38b0f21SJung-uk Kim  *
473f38b0f21SJung-uk Kim  * PARAMETERS:  Op              - Parse object
474f38b0f21SJung-uk Kim  *
475f38b0f21SJung-uk Kim  * RETURN:      None
476f38b0f21SJung-uk Kim  *
477f38b0f21SJung-uk Kim  * DESCRIPTION: Emit a description comment for a resource descriptor tag
478f38b0f21SJung-uk Kim  *              (which is a predefined ACPI name.) Used for iASL compiler only.
479f38b0f21SJung-uk Kim  *
480f38b0f21SJung-uk Kim  ******************************************************************************/
481f38b0f21SJung-uk Kim 
482f38b0f21SJung-uk Kim void
483f38b0f21SJung-uk Kim AcpiDmFieldPredefinedDescription (
484f38b0f21SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
485f38b0f21SJung-uk Kim {
486f38b0f21SJung-uk Kim #ifdef ACPI_ASL_COMPILER
487f38b0f21SJung-uk Kim     ACPI_PARSE_OBJECT       *IndexOp;
488f38b0f21SJung-uk Kim     char                    *Tag;
489f38b0f21SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo;
490f38b0f21SJung-uk Kim     const AH_PREDEFINED_NAME *Info;
491f38b0f21SJung-uk Kim 
492f38b0f21SJung-uk Kim 
493f38b0f21SJung-uk Kim     if (!Op)
494f38b0f21SJung-uk Kim     {
495f38b0f21SJung-uk Kim         return;
496f38b0f21SJung-uk Kim     }
497f38b0f21SJung-uk Kim 
498f38b0f21SJung-uk Kim     /* Ensure that the comment field is emitted only once */
499f38b0f21SJung-uk Kim 
500f8146b88SJung-uk Kim     if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEFINED_CHECKED)
501f38b0f21SJung-uk Kim     {
502f38b0f21SJung-uk Kim         return;
503f38b0f21SJung-uk Kim     }
504f8146b88SJung-uk Kim     Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEFINED_CHECKED;
505f38b0f21SJung-uk Kim 
506f38b0f21SJung-uk Kim     /*
507f38b0f21SJung-uk Kim      * Op must be one of the Create* operators: CreateField, CreateBitField,
508f38b0f21SJung-uk Kim      * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
509f38b0f21SJung-uk Kim      */
510f38b0f21SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
511f38b0f21SJung-uk Kim     if (!(OpInfo->Flags & AML_CREATE))
512f38b0f21SJung-uk Kim     {
513f38b0f21SJung-uk Kim         return;
514f38b0f21SJung-uk Kim     }
515f38b0f21SJung-uk Kim 
516f38b0f21SJung-uk Kim     /* Second argument is the Index argument */
517f38b0f21SJung-uk Kim 
518f38b0f21SJung-uk Kim     IndexOp = Op->Common.Value.Arg;
519f38b0f21SJung-uk Kim     IndexOp = IndexOp->Common.Next;
520f38b0f21SJung-uk Kim 
521f38b0f21SJung-uk Kim     /* Index argument must be a namepath */
522f38b0f21SJung-uk Kim 
523f38b0f21SJung-uk Kim     if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
524f38b0f21SJung-uk Kim     {
525f38b0f21SJung-uk Kim         return;
526f38b0f21SJung-uk Kim     }
527f38b0f21SJung-uk Kim 
528f38b0f21SJung-uk Kim     /* Major cheat: We previously put the Tag ptr in the Node field */
529f38b0f21SJung-uk Kim 
530f38b0f21SJung-uk Kim     Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
5315f9b24faSJung-uk Kim     if (!Tag || (*Tag == 0))
532042ff955SJung-uk Kim     {
533042ff955SJung-uk Kim         return;
534042ff955SJung-uk Kim     }
535f38b0f21SJung-uk Kim 
5365f9b24faSJung-uk Kim     /* Is the tag a predefined name? */
537f38b0f21SJung-uk Kim 
538313a0c13SJung-uk Kim     Info = AcpiAhMatchPredefinedName (Tag);
5395f9b24faSJung-uk Kim     if (!Info)
540f38b0f21SJung-uk Kim     {
5415f9b24faSJung-uk Kim         /* Not a predefined name (does not start with underscore) */
5425f9b24faSJung-uk Kim 
5435f9b24faSJung-uk Kim         return;
544f38b0f21SJung-uk Kim     }
545f38b0f21SJung-uk Kim 
5465f9b24faSJung-uk Kim     AcpiOsPrintf ("  // %4.4s: %s", Tag,
5475f9b24faSJung-uk Kim         ACPI_CAST_PTR (char, Info->Description));
5485f9b24faSJung-uk Kim 
5495f9b24faSJung-uk Kim     /* String contains the prefix path, free it */
5500d84335fSJung-uk Kim 
5510d84335fSJung-uk Kim     ACPI_FREE (IndexOp->Common.Value.String);
5525f9b24faSJung-uk Kim     IndexOp->Common.Value.String = NULL;
553f38b0f21SJung-uk Kim #endif
5545f9b24faSJung-uk Kim 
555f38b0f21SJung-uk Kim     return;
556f38b0f21SJung-uk Kim }
557f38b0f21SJung-uk Kim 
558f38b0f21SJung-uk Kim 
559f38b0f21SJung-uk Kim /*******************************************************************************
560f38b0f21SJung-uk Kim  *
561a159c266SJung-uk Kim  * FUNCTION:    AcpiDmMethodFlags
562a159c266SJung-uk Kim  *
563a159c266SJung-uk Kim  * PARAMETERS:  Op              - Method Object to be examined
564a159c266SJung-uk Kim  *
565a159c266SJung-uk Kim  * RETURN:      None
566a159c266SJung-uk Kim  *
567a159c266SJung-uk Kim  * DESCRIPTION: Decode control method flags
568a159c266SJung-uk Kim  *
569a159c266SJung-uk Kim  ******************************************************************************/
570a159c266SJung-uk Kim 
571a159c266SJung-uk Kim void
572a159c266SJung-uk Kim AcpiDmMethodFlags (
573a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
574a159c266SJung-uk Kim {
575a159c266SJung-uk Kim     UINT32                  Flags;
576a159c266SJung-uk Kim     UINT32                  Args;
577a159c266SJung-uk Kim 
578a159c266SJung-uk Kim 
579a159c266SJung-uk Kim     /* The next Op contains the flags */
580a159c266SJung-uk Kim 
581a159c266SJung-uk Kim     Op = AcpiPsGetDepthNext (NULL, Op);
582a159c266SJung-uk Kim     Flags = (UINT8) Op->Common.Value.Integer;
583a159c266SJung-uk Kim     Args = Flags & 0x07;
584a159c266SJung-uk Kim 
585a159c266SJung-uk Kim     /* Mark the Op as completed */
586a159c266SJung-uk Kim 
587a159c266SJung-uk Kim     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
588a159c266SJung-uk Kim 
589a159c266SJung-uk Kim     /* 1) Method argument count */
590a159c266SJung-uk Kim 
591a159c266SJung-uk Kim     AcpiOsPrintf (", %u, ", Args);
592a159c266SJung-uk Kim 
593a159c266SJung-uk Kim     /* 2) Serialize rule */
594a159c266SJung-uk Kim 
595a159c266SJung-uk Kim     if (!(Flags & 0x08))
596a159c266SJung-uk Kim     {
597a159c266SJung-uk Kim         AcpiOsPrintf ("Not");
598a159c266SJung-uk Kim     }
599a159c266SJung-uk Kim 
600a159c266SJung-uk Kim     AcpiOsPrintf ("Serialized");
601a159c266SJung-uk Kim 
602a159c266SJung-uk Kim     /* 3) SyncLevel */
603a159c266SJung-uk Kim 
604a159c266SJung-uk Kim     if (Flags & 0xF0)
605a159c266SJung-uk Kim     {
606a159c266SJung-uk Kim         AcpiOsPrintf (", %u", Flags >> 4);
607a159c266SJung-uk Kim     }
608a159c266SJung-uk Kim }
609a159c266SJung-uk Kim 
610a159c266SJung-uk Kim 
611a159c266SJung-uk Kim /*******************************************************************************
612a159c266SJung-uk Kim  *
613a159c266SJung-uk Kim  * FUNCTION:    AcpiDmFieldFlags
614a159c266SJung-uk Kim  *
615a159c266SJung-uk Kim  * PARAMETERS:  Op              - Field Object to be examined
616a159c266SJung-uk Kim  *
617a159c266SJung-uk Kim  * RETURN:      None
618a159c266SJung-uk Kim  *
619a159c266SJung-uk Kim  * DESCRIPTION: Decode Field definition flags
620a159c266SJung-uk Kim  *
621a159c266SJung-uk Kim  ******************************************************************************/
622a159c266SJung-uk Kim 
623a159c266SJung-uk Kim void
624a159c266SJung-uk Kim AcpiDmFieldFlags (
625a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
626a159c266SJung-uk Kim {
627a159c266SJung-uk Kim     UINT32                  Flags;
628a159c266SJung-uk Kim 
629a159c266SJung-uk Kim 
630a159c266SJung-uk Kim     Op = Op->Common.Next;
631a159c266SJung-uk Kim     Flags = (UINT8) Op->Common.Value.Integer;
632a159c266SJung-uk Kim 
633a159c266SJung-uk Kim     /* Mark the Op as completed */
634a159c266SJung-uk Kim 
635a159c266SJung-uk Kim     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
636a159c266SJung-uk Kim 
637a159c266SJung-uk Kim     AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
638a159c266SJung-uk Kim     AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
639a159c266SJung-uk Kim     AcpiOsPrintf ("%s)",  AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
640a159c266SJung-uk Kim }
641a159c266SJung-uk Kim 
642a159c266SJung-uk Kim 
643a159c266SJung-uk Kim /*******************************************************************************
644a159c266SJung-uk Kim  *
645a159c266SJung-uk Kim  * FUNCTION:    AcpiDmAddressSpace
646a159c266SJung-uk Kim  *
647a159c266SJung-uk Kim  * PARAMETERS:  SpaceId         - ID to be translated
648a159c266SJung-uk Kim  *
649a159c266SJung-uk Kim  * RETURN:      None
650a159c266SJung-uk Kim  *
651a159c266SJung-uk Kim  * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
652a159c266SJung-uk Kim  *
653a159c266SJung-uk Kim  ******************************************************************************/
654a159c266SJung-uk Kim 
655a159c266SJung-uk Kim void
656a159c266SJung-uk Kim AcpiDmAddressSpace (
657a159c266SJung-uk Kim     UINT8                   SpaceId)
658a159c266SJung-uk Kim {
659a159c266SJung-uk Kim 
660a159c266SJung-uk Kim     if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
661a159c266SJung-uk Kim     {
662a159c266SJung-uk Kim         if (SpaceId == 0x7F)
663a159c266SJung-uk Kim         {
664a159c266SJung-uk Kim             AcpiOsPrintf ("FFixedHW, ");
665a159c266SJung-uk Kim         }
666a159c266SJung-uk Kim         else
667a159c266SJung-uk Kim         {
668a159c266SJung-uk Kim             AcpiOsPrintf ("0x%.2X, ", SpaceId);
669a159c266SJung-uk Kim         }
670a159c266SJung-uk Kim     }
671a159c266SJung-uk Kim     else
672a159c266SJung-uk Kim     {
673a159c266SJung-uk Kim         AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
674a159c266SJung-uk Kim     }
675a159c266SJung-uk Kim }
676a159c266SJung-uk Kim 
677a159c266SJung-uk Kim 
678a159c266SJung-uk Kim /*******************************************************************************
679a159c266SJung-uk Kim  *
680a159c266SJung-uk Kim  * FUNCTION:    AcpiDmRegionFlags
681a159c266SJung-uk Kim  *
682a159c266SJung-uk Kim  * PARAMETERS:  Op              - Object to be examined
683a159c266SJung-uk Kim  *
684a159c266SJung-uk Kim  * RETURN:      None
685a159c266SJung-uk Kim  *
686a159c266SJung-uk Kim  * DESCRIPTION: Decode OperationRegion flags
687a159c266SJung-uk Kim  *
688a159c266SJung-uk Kim  ******************************************************************************/
689a159c266SJung-uk Kim 
690a159c266SJung-uk Kim void
691a159c266SJung-uk Kim AcpiDmRegionFlags (
692a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
693a159c266SJung-uk Kim {
694a159c266SJung-uk Kim 
695a159c266SJung-uk Kim     /* The next Op contains the SpaceId */
696a159c266SJung-uk Kim 
697a159c266SJung-uk Kim     Op = AcpiPsGetDepthNext (NULL, Op);
698a159c266SJung-uk Kim 
699a159c266SJung-uk Kim     /* Mark the Op as completed */
700a159c266SJung-uk Kim 
701a159c266SJung-uk Kim     Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
702a159c266SJung-uk Kim 
703a159c266SJung-uk Kim     AcpiOsPrintf (", ");
704a159c266SJung-uk Kim     AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
705a159c266SJung-uk Kim }
706a159c266SJung-uk Kim 
707a159c266SJung-uk Kim 
708a159c266SJung-uk Kim /*******************************************************************************
709a159c266SJung-uk Kim  *
710a159c266SJung-uk Kim  * FUNCTION:    AcpiDmMatchOp
711a159c266SJung-uk Kim  *
712a159c266SJung-uk Kim  * PARAMETERS:  Op              - Match Object to be examined
713a159c266SJung-uk Kim  *
714a159c266SJung-uk Kim  * RETURN:      None
715a159c266SJung-uk Kim  *
716a159c266SJung-uk Kim  * DESCRIPTION: Decode Match opcode operands
717a159c266SJung-uk Kim  *
718a159c266SJung-uk Kim  ******************************************************************************/
719a159c266SJung-uk Kim 
720a159c266SJung-uk Kim void
721a159c266SJung-uk Kim AcpiDmMatchOp (
722a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
723a159c266SJung-uk Kim {
724a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
725a159c266SJung-uk Kim 
726a159c266SJung-uk Kim 
727a159c266SJung-uk Kim     NextOp = AcpiPsGetDepthNext (NULL, Op);
728a159c266SJung-uk Kim     NextOp = NextOp->Common.Next;
729a159c266SJung-uk Kim 
730a159c266SJung-uk Kim     if (!NextOp)
731a159c266SJung-uk Kim     {
732a159c266SJung-uk Kim         /* Handle partial tree during single-step */
733a159c266SJung-uk Kim 
734a159c266SJung-uk Kim         return;
735a159c266SJung-uk Kim     }
736a159c266SJung-uk Kim 
737a159c266SJung-uk Kim     /* Mark the two nodes that contain the encoding for the match keywords */
738a159c266SJung-uk Kim 
739a159c266SJung-uk Kim     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
740a159c266SJung-uk Kim 
741a159c266SJung-uk Kim     NextOp = NextOp->Common.Next;
742a159c266SJung-uk Kim     NextOp = NextOp->Common.Next;
743a159c266SJung-uk Kim     NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
744a159c266SJung-uk Kim }
745a159c266SJung-uk Kim 
746a159c266SJung-uk Kim 
747a159c266SJung-uk Kim /*******************************************************************************
748a159c266SJung-uk Kim  *
749a159c266SJung-uk Kim  * FUNCTION:    AcpiDmMatchKeyword
750a159c266SJung-uk Kim  *
751a159c266SJung-uk Kim  * PARAMETERS:  Op              - Match Object to be examined
752a159c266SJung-uk Kim  *
753a159c266SJung-uk Kim  * RETURN:      None
754a159c266SJung-uk Kim  *
755a159c266SJung-uk Kim  * DESCRIPTION: Decode Match opcode operands
756a159c266SJung-uk Kim  *
757a159c266SJung-uk Kim  ******************************************************************************/
758a159c266SJung-uk Kim 
759a159c266SJung-uk Kim static void
760a159c266SJung-uk Kim AcpiDmMatchKeyword (
761a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
762a159c266SJung-uk Kim {
763a159c266SJung-uk Kim 
764a159c266SJung-uk Kim     if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
765a159c266SJung-uk Kim     {
766a159c266SJung-uk Kim         AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
767a159c266SJung-uk Kim     }
768a159c266SJung-uk Kim     else
769a159c266SJung-uk Kim     {
770f8146b88SJung-uk Kim         AcpiOsPrintf ("%s",
771f8146b88SJung-uk Kim             AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]);
772a159c266SJung-uk Kim     }
773a159c266SJung-uk Kim }
774a159c266SJung-uk Kim 
775a159c266SJung-uk Kim 
776a159c266SJung-uk Kim /*******************************************************************************
777a159c266SJung-uk Kim  *
778a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDisassembleOneOp
779a159c266SJung-uk Kim  *
780a159c266SJung-uk Kim  * PARAMETERS:  WalkState           - Current walk info
781a159c266SJung-uk Kim  *              Info                - Parse tree walk info
782a159c266SJung-uk Kim  *              Op                  - Op that is to be printed
783a159c266SJung-uk Kim  *
784a159c266SJung-uk Kim  * RETURN:      None
785a159c266SJung-uk Kim  *
786a159c266SJung-uk Kim  * DESCRIPTION: Disassemble a single AML opcode
787a159c266SJung-uk Kim  *
788a159c266SJung-uk Kim  ******************************************************************************/
789a159c266SJung-uk Kim 
790a159c266SJung-uk Kim void
791a159c266SJung-uk Kim AcpiDmDisassembleOneOp (
792a159c266SJung-uk Kim     ACPI_WALK_STATE         *WalkState,
793a159c266SJung-uk Kim     ACPI_OP_WALK_INFO       *Info,
794a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
795a159c266SJung-uk Kim {
796a159c266SJung-uk Kim     const ACPI_OPCODE_INFO  *OpInfo = NULL;
797a159c266SJung-uk Kim     UINT32                  Offset;
798a159c266SJung-uk Kim     UINT32                  Length;
799a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Child;
800a159c266SJung-uk Kim     ACPI_STATUS             Status;
801a159c266SJung-uk Kim     UINT8                   *Aml;
802313a0c13SJung-uk Kim     const AH_DEVICE_ID      *IdInfo;
803a159c266SJung-uk Kim 
804a159c266SJung-uk Kim 
805a159c266SJung-uk Kim     if (!Op)
806a159c266SJung-uk Kim     {
807a159c266SJung-uk Kim         AcpiOsPrintf ("<NULL OP PTR>");
808a159c266SJung-uk Kim         return;
809a159c266SJung-uk Kim     }
810a159c266SJung-uk Kim 
811f8146b88SJung-uk Kim     if (Op->Common.DisasmFlags & ACPI_PARSEOP_ELSEIF)
812f8146b88SJung-uk Kim     {
813f8146b88SJung-uk Kim         return; /* ElseIf macro was already emitted */
814f8146b88SJung-uk Kim     }
815f8146b88SJung-uk Kim 
816a159c266SJung-uk Kim     switch (Op->Common.DisasmOpcode)
817a159c266SJung-uk Kim     {
818a159c266SJung-uk Kim     case ACPI_DASM_MATCHOP:
819a159c266SJung-uk Kim 
820a159c266SJung-uk Kim         AcpiDmMatchKeyword (Op);
821a159c266SJung-uk Kim         return;
822a159c266SJung-uk Kim 
823a159c266SJung-uk Kim     case ACPI_DASM_LNOT_SUFFIX:
824a9d8d09cSJung-uk Kim 
8251c0e1b6dSJung-uk Kim         if (!AcpiGbl_CstyleDisassembly)
8261c0e1b6dSJung-uk Kim         {
827a159c266SJung-uk Kim             switch (Op->Common.AmlOpcode)
828a159c266SJung-uk Kim             {
8290d84335fSJung-uk Kim             case AML_LOGICAL_EQUAL_OP:
830a159c266SJung-uk Kim                 AcpiOsPrintf ("LNotEqual");
831a159c266SJung-uk Kim                 break;
832a159c266SJung-uk Kim 
8330d84335fSJung-uk Kim             case AML_LOGICAL_GREATER_OP:
834a159c266SJung-uk Kim                 AcpiOsPrintf ("LLessEqual");
835a159c266SJung-uk Kim                 break;
836a159c266SJung-uk Kim 
8370d84335fSJung-uk Kim             case AML_LOGICAL_LESS_OP:
838a159c266SJung-uk Kim                 AcpiOsPrintf ("LGreaterEqual");
839a159c266SJung-uk Kim                 break;
840a159c266SJung-uk Kim 
841a159c266SJung-uk Kim             default:
842a159c266SJung-uk Kim                 break;
843a159c266SJung-uk Kim             }
8441c0e1b6dSJung-uk Kim         }
8451c0e1b6dSJung-uk Kim 
846a159c266SJung-uk Kim         Op->Common.DisasmOpcode = 0;
847a159c266SJung-uk Kim         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
848a159c266SJung-uk Kim         return;
849a159c266SJung-uk Kim 
850a159c266SJung-uk Kim     default:
851a159c266SJung-uk Kim         break;
852a159c266SJung-uk Kim     }
853a159c266SJung-uk Kim 
854a159c266SJung-uk Kim     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
855a159c266SJung-uk Kim 
856a159c266SJung-uk Kim     /* The op and arguments */
857a159c266SJung-uk Kim 
858a159c266SJung-uk Kim     switch (Op->Common.AmlOpcode)
859a159c266SJung-uk Kim     {
8600d84335fSJung-uk Kim     case AML_LOGICAL_NOT_OP:
861a159c266SJung-uk Kim 
862a159c266SJung-uk Kim         Child = Op->Common.Value.Arg;
8630d84335fSJung-uk Kim         if ((Child->Common.AmlOpcode == AML_LOGICAL_EQUAL_OP) ||
8640d84335fSJung-uk Kim             (Child->Common.AmlOpcode == AML_LOGICAL_GREATER_OP) ||
8650d84335fSJung-uk Kim             (Child->Common.AmlOpcode == AML_LOGICAL_LESS_OP))
866a159c266SJung-uk Kim         {
867a159c266SJung-uk Kim             Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
868a159c266SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
869a159c266SJung-uk Kim         }
870a159c266SJung-uk Kim         else
871a159c266SJung-uk Kim         {
872a159c266SJung-uk Kim             AcpiOsPrintf ("%s", OpInfo->Name);
873a159c266SJung-uk Kim         }
874a159c266SJung-uk Kim         break;
875a159c266SJung-uk Kim 
876a159c266SJung-uk Kim     case AML_BYTE_OP:
877a159c266SJung-uk Kim 
878a159c266SJung-uk Kim         AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
879a159c266SJung-uk Kim         break;
880a159c266SJung-uk Kim 
881a159c266SJung-uk Kim     case AML_WORD_OP:
882a159c266SJung-uk Kim 
883a159c266SJung-uk Kim         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
884a159c266SJung-uk Kim         {
885313a0c13SJung-uk Kim             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
886a159c266SJung-uk Kim         }
887a159c266SJung-uk Kim         else
888a159c266SJung-uk Kim         {
889a159c266SJung-uk Kim             AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
890a159c266SJung-uk Kim         }
891a159c266SJung-uk Kim         break;
892a159c266SJung-uk Kim 
893a159c266SJung-uk Kim     case AML_DWORD_OP:
894a159c266SJung-uk Kim 
895a159c266SJung-uk Kim         if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
896a159c266SJung-uk Kim         {
897313a0c13SJung-uk Kim             AcpiDmDecompressEisaId ((UINT32) Op->Common.Value.Integer);
898a159c266SJung-uk Kim         }
899a159c266SJung-uk Kim         else
900a159c266SJung-uk Kim         {
901a159c266SJung-uk Kim             AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
902a159c266SJung-uk Kim         }
903a159c266SJung-uk Kim         break;
904a159c266SJung-uk Kim 
905a159c266SJung-uk Kim     case AML_QWORD_OP:
906a159c266SJung-uk Kim 
907a159c266SJung-uk Kim         AcpiOsPrintf ("0x%8.8X%8.8X",
908a159c266SJung-uk Kim             ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
909a159c266SJung-uk Kim         break;
910a159c266SJung-uk Kim 
911a159c266SJung-uk Kim     case AML_STRING_OP:
912a159c266SJung-uk Kim 
9138d744e47SJung-uk Kim         AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
914313a0c13SJung-uk Kim 
915313a0c13SJung-uk Kim         /* For _HID/_CID strings, attempt to output a descriptive comment */
916313a0c13SJung-uk Kim 
917313a0c13SJung-uk Kim         if (Op->Common.DisasmOpcode == ACPI_DASM_HID_STRING)
918313a0c13SJung-uk Kim         {
919313a0c13SJung-uk Kim             /* If we know about the ID, emit the description */
920313a0c13SJung-uk Kim 
921313a0c13SJung-uk Kim             IdInfo = AcpiAhMatchHardwareId (Op->Common.Value.String);
922313a0c13SJung-uk Kim             if (IdInfo)
923313a0c13SJung-uk Kim             {
924313a0c13SJung-uk Kim                 AcpiOsPrintf (" /* %s */", IdInfo->Description);
925313a0c13SJung-uk Kim             }
926313a0c13SJung-uk Kim         }
927a159c266SJung-uk Kim         break;
928a159c266SJung-uk Kim 
929a159c266SJung-uk Kim     case AML_BUFFER_OP:
930a159c266SJung-uk Kim         /*
931a159c266SJung-uk Kim          * Determine the type of buffer. We can have one of the following:
932a159c266SJung-uk Kim          *
933a159c266SJung-uk Kim          * 1) ResourceTemplate containing Resource Descriptors.
934a159c266SJung-uk Kim          * 2) Unicode String buffer
935a159c266SJung-uk Kim          * 3) ASCII String buffer
936a159c266SJung-uk Kim          * 4) Raw data buffer (if none of the above)
937a159c266SJung-uk Kim          *
938a159c266SJung-uk Kim          * Since there are no special AML opcodes to differentiate these
939a159c266SJung-uk Kim          * types of buffers, we have to closely look at the data in the
940a159c266SJung-uk Kim          * buffer to determine the type.
941a159c266SJung-uk Kim          */
942a159c266SJung-uk Kim         if (!AcpiGbl_NoResourceDisassembly)
943a159c266SJung-uk Kim         {
944ed17e06eSJung-uk Kim             Status = AcpiDmIsResourceTemplate (WalkState, Op);
945a159c266SJung-uk Kim             if (ACPI_SUCCESS (Status))
946a159c266SJung-uk Kim             {
947a159c266SJung-uk Kim                 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
948a159c266SJung-uk Kim                 AcpiOsPrintf ("ResourceTemplate");
949a159c266SJung-uk Kim                 break;
950a159c266SJung-uk Kim             }
951a159c266SJung-uk Kim             else if (Status == AE_AML_NO_RESOURCE_END_TAG)
952a159c266SJung-uk Kim             {
953f8146b88SJung-uk Kim                 AcpiOsPrintf (
954f8146b88SJung-uk Kim                     "/**** Is ResourceTemplate, "
955f8146b88SJung-uk Kim                     "but EndTag not at buffer end ****/ ");
956a159c266SJung-uk Kim             }
957a159c266SJung-uk Kim         }
958a159c266SJung-uk Kim 
959313a0c13SJung-uk Kim         if (AcpiDmIsUuidBuffer (Op))
960313a0c13SJung-uk Kim         {
961313a0c13SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_UUID;
962313a0c13SJung-uk Kim             AcpiOsPrintf ("ToUUID (");
963313a0c13SJung-uk Kim         }
964313a0c13SJung-uk Kim         else if (AcpiDmIsUnicodeBuffer (Op))
965a159c266SJung-uk Kim         {
966a159c266SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
967a159c266SJung-uk Kim             AcpiOsPrintf ("Unicode (");
968a159c266SJung-uk Kim         }
969a159c266SJung-uk Kim         else if (AcpiDmIsStringBuffer (Op))
970a159c266SJung-uk Kim         {
971a159c266SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_STRING;
972a159c266SJung-uk Kim             AcpiOsPrintf ("Buffer");
973a159c266SJung-uk Kim         }
9741df130f1SJung-uk Kim         else if (AcpiDmIsPldBuffer (Op))
9751df130f1SJung-uk Kim         {
9761df130f1SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
9771c0e1b6dSJung-uk Kim             AcpiOsPrintf ("ToPLD (");
9781df130f1SJung-uk Kim         }
979a159c266SJung-uk Kim         else
980a159c266SJung-uk Kim         {
981a159c266SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
982a159c266SJung-uk Kim             AcpiOsPrintf ("Buffer");
983a159c266SJung-uk Kim         }
984a159c266SJung-uk Kim         break;
985a159c266SJung-uk Kim 
986a159c266SJung-uk Kim     case AML_INT_NAMEPATH_OP:
987a159c266SJung-uk Kim 
988a159c266SJung-uk Kim         AcpiDmNamestring (Op->Common.Value.Name);
989a159c266SJung-uk Kim         break;
990a159c266SJung-uk Kim 
991a159c266SJung-uk Kim     case AML_INT_NAMEDFIELD_OP:
992a159c266SJung-uk Kim 
993a159c266SJung-uk Kim         Length = AcpiDmDumpName (Op->Named.Name);
9940d84335fSJung-uk Kim 
9950d84335fSJung-uk Kim         AcpiOsPrintf (",");
9960d84335fSJung-uk Kim         ASL_CV_PRINT_ONE_COMMENT (Op, AML_NAMECOMMENT, NULL, 0);
9970d84335fSJung-uk Kim         AcpiOsPrintf ("%*.s  %u", (unsigned) (5 - Length), " ",
998a159c266SJung-uk Kim             (UINT32) Op->Common.Value.Integer);
9990d84335fSJung-uk Kim 
1000a159c266SJung-uk Kim         AcpiDmCommaIfFieldMember (Op);
1001a159c266SJung-uk Kim 
1002a159c266SJung-uk Kim         Info->BitOffset += (UINT32) Op->Common.Value.Integer;
1003a159c266SJung-uk Kim         break;
1004a159c266SJung-uk Kim 
1005a159c266SJung-uk Kim     case AML_INT_RESERVEDFIELD_OP:
1006a159c266SJung-uk Kim 
1007a159c266SJung-uk Kim         /* Offset() -- Must account for previous offsets */
1008a159c266SJung-uk Kim 
1009a159c266SJung-uk Kim         Offset = (UINT32) Op->Common.Value.Integer;
1010a159c266SJung-uk Kim         Info->BitOffset += Offset;
1011a159c266SJung-uk Kim 
1012a159c266SJung-uk Kim         if (Info->BitOffset % 8 == 0)
1013a159c266SJung-uk Kim         {
1014a159c266SJung-uk Kim             AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
1015a159c266SJung-uk Kim         }
1016a159c266SJung-uk Kim         else
1017a159c266SJung-uk Kim         {
1018a159c266SJung-uk Kim             AcpiOsPrintf ("    ,   %u", Offset);
1019a159c266SJung-uk Kim         }
1020a159c266SJung-uk Kim 
1021a159c266SJung-uk Kim         AcpiDmCommaIfFieldMember (Op);
1022a159c266SJung-uk Kim         break;
1023a159c266SJung-uk Kim 
1024a159c266SJung-uk Kim     case AML_INT_ACCESSFIELD_OP:
1025a159c266SJung-uk Kim     case AML_INT_EXTACCESSFIELD_OP:
1026a159c266SJung-uk Kim 
1027a159c266SJung-uk Kim         AcpiOsPrintf ("AccessAs (%s, ",
1028a159c266SJung-uk Kim             AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
1029a159c266SJung-uk Kim 
1030a159c266SJung-uk Kim         AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
1031a159c266SJung-uk Kim 
1032a159c266SJung-uk Kim         if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
1033a159c266SJung-uk Kim         {
1034f8146b88SJung-uk Kim             AcpiOsPrintf (" (0x%2.2X)", (unsigned)
1035f8146b88SJung-uk Kim                 ((Op->Common.Value.Integer >> 16) & 0xFF));
1036a159c266SJung-uk Kim         }
1037a159c266SJung-uk Kim 
1038a159c266SJung-uk Kim         AcpiOsPrintf (")");
1039a159c266SJung-uk Kim         AcpiDmCommaIfFieldMember (Op);
10400d84335fSJung-uk Kim         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
1041a159c266SJung-uk Kim         break;
1042a159c266SJung-uk Kim 
1043a159c266SJung-uk Kim     case AML_INT_CONNECTION_OP:
1044a159c266SJung-uk Kim         /*
1045a159c266SJung-uk Kim          * Two types of Connection() - one with a buffer object, the
1046a159c266SJung-uk Kim          * other with a namestring that points to a buffer object.
1047a159c266SJung-uk Kim          */
1048a159c266SJung-uk Kim         AcpiOsPrintf ("Connection (");
1049a159c266SJung-uk Kim         Child = Op->Common.Value.Arg;
1050a159c266SJung-uk Kim 
1051a159c266SJung-uk Kim         if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
1052a159c266SJung-uk Kim         {
1053a159c266SJung-uk Kim             AcpiOsPrintf ("\n");
1054a159c266SJung-uk Kim 
1055a159c266SJung-uk Kim             Aml = Child->Named.Data;
1056a159c266SJung-uk Kim             Length = (UINT32) Child->Common.Value.Integer;
1057a159c266SJung-uk Kim 
1058a159c266SJung-uk Kim             Info->Level += 1;
1059313a0c13SJung-uk Kim             Info->MappingOp = Op;
1060a159c266SJung-uk Kim             Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
1061313a0c13SJung-uk Kim 
1062a159c266SJung-uk Kim             AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
1063a159c266SJung-uk Kim 
1064a159c266SJung-uk Kim             Info->Level -= 1;
1065a159c266SJung-uk Kim             AcpiDmIndent (Info->Level);
1066a159c266SJung-uk Kim         }
1067a159c266SJung-uk Kim         else
1068a159c266SJung-uk Kim         {
1069a159c266SJung-uk Kim             AcpiDmNamestring (Child->Common.Value.Name);
1070a159c266SJung-uk Kim         }
1071a159c266SJung-uk Kim 
1072a159c266SJung-uk Kim         AcpiOsPrintf (")");
1073a159c266SJung-uk Kim         AcpiDmCommaIfFieldMember (Op);
10740d84335fSJung-uk Kim         ASL_CV_PRINT_ONE_COMMENT (Op, AML_COMMENT_END_NODE, NULL, 0);
10750d84335fSJung-uk Kim         ASL_CV_PRINT_ONE_COMMENT (Op, AMLCOMMENT_INLINE, NULL, 0);
1076a159c266SJung-uk Kim         AcpiOsPrintf ("\n");
1077a159c266SJung-uk Kim 
1078a159c266SJung-uk Kim         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
1079a159c266SJung-uk Kim         Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
1080a159c266SJung-uk Kim         break;
1081a159c266SJung-uk Kim 
1082a159c266SJung-uk Kim     case AML_INT_BYTELIST_OP:
1083a159c266SJung-uk Kim 
1084a159c266SJung-uk Kim         AcpiDmByteList (Info, Op);
1085a159c266SJung-uk Kim         break;
1086a159c266SJung-uk Kim 
1087a159c266SJung-uk Kim     case AML_INT_METHODCALL_OP:
1088a159c266SJung-uk Kim 
1089a159c266SJung-uk Kim         Op = AcpiPsGetDepthNext (NULL, Op);
1090a159c266SJung-uk Kim         Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
1091a159c266SJung-uk Kim 
1092a159c266SJung-uk Kim         AcpiDmNamestring (Op->Common.Value.Name);
1093a159c266SJung-uk Kim         break;
1094a159c266SJung-uk Kim 
109528482948SJung-uk Kim     case AML_WHILE_OP:
109628482948SJung-uk Kim 
10970d84335fSJung-uk Kim         if (Op->Common.DisasmOpcode == ACPI_DASM_SWITCH)
109828482948SJung-uk Kim         {
109928482948SJung-uk Kim             AcpiOsPrintf ("%s", "Switch");
110028482948SJung-uk Kim             break;
110128482948SJung-uk Kim         }
110228482948SJung-uk Kim 
110328482948SJung-uk Kim         AcpiOsPrintf ("%s", OpInfo->Name);
110428482948SJung-uk Kim         break;
110528482948SJung-uk Kim 
110628482948SJung-uk Kim     case AML_IF_OP:
110728482948SJung-uk Kim 
110828482948SJung-uk Kim         if (Op->Common.DisasmOpcode == ACPI_DASM_CASE)
110928482948SJung-uk Kim         {
111028482948SJung-uk Kim             AcpiOsPrintf ("%s", "Case");
111128482948SJung-uk Kim             break;
111228482948SJung-uk Kim         }
111328482948SJung-uk Kim 
111428482948SJung-uk Kim         AcpiOsPrintf ("%s", OpInfo->Name);
111528482948SJung-uk Kim         break;
111628482948SJung-uk Kim 
1117f8146b88SJung-uk Kim     case AML_ELSE_OP:
1118f8146b88SJung-uk Kim 
1119f8146b88SJung-uk Kim         AcpiDmConvertToElseIf (Op);
1120f8146b88SJung-uk Kim         break;
1121f8146b88SJung-uk Kim 
1122f8146b88SJung-uk Kim     case AML_EXTERNAL_OP:
1123f8146b88SJung-uk Kim 
11243920312eSJung-uk Kim         if (AcpiGbl_DmEmitExternalOpcodes)
11253920312eSJung-uk Kim         {
1126af051161SJung-uk Kim             AcpiDmEmitExternal (Op, AcpiPsGetArg(Op, 0));
11273920312eSJung-uk Kim         }
1128f8146b88SJung-uk Kim 
11290d84335fSJung-uk Kim         break;
11300d84335fSJung-uk Kim 
1131a159c266SJung-uk Kim     default:
1132a159c266SJung-uk Kim 
1133a159c266SJung-uk Kim         /* Just get the opcode name and print it */
1134a159c266SJung-uk Kim 
1135a159c266SJung-uk Kim         AcpiOsPrintf ("%s", OpInfo->Name);
1136a159c266SJung-uk Kim 
1137a159c266SJung-uk Kim 
1138a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER
1139a159c266SJung-uk Kim 
1140a159c266SJung-uk Kim         if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
1141a159c266SJung-uk Kim             (WalkState) &&
1142a159c266SJung-uk Kim             (WalkState->Results) &&
1143a159c266SJung-uk Kim             (WalkState->ResultCount))
1144a159c266SJung-uk Kim         {
1145fe0f0bbbSJung-uk Kim             AcpiDbDecodeInternalObject (
1146a159c266SJung-uk Kim                 WalkState->Results->Results.ObjDesc [
1147a159c266SJung-uk Kim                     (WalkState->ResultCount - 1) %
1148a159c266SJung-uk Kim                         ACPI_RESULTS_FRAME_OBJ_NUM]);
1149a159c266SJung-uk Kim         }
1150a159c266SJung-uk Kim #endif
1151a159c266SJung-uk Kim 
1152a159c266SJung-uk Kim         break;
1153a159c266SJung-uk Kim     }
1154a159c266SJung-uk Kim }
1155f8146b88SJung-uk Kim 
1156f8146b88SJung-uk Kim 
1157f8146b88SJung-uk Kim /*******************************************************************************
1158f8146b88SJung-uk Kim  *
1159f8146b88SJung-uk Kim  * FUNCTION:    AcpiDmConvertToElseIf
1160f8146b88SJung-uk Kim  *
1161f8146b88SJung-uk Kim  * PARAMETERS:  OriginalElseOp          - ELSE Object to be examined
1162f8146b88SJung-uk Kim  *
1163f8146b88SJung-uk Kim  * RETURN:      None. Emits either an "Else" or an "ElseIf" ASL operator.
1164f8146b88SJung-uk Kim  *
1165f8146b88SJung-uk Kim  * DESCRIPTION: Detect and convert an If..Else..If sequence to If..ElseIf
1166f8146b88SJung-uk Kim  *
1167f8146b88SJung-uk Kim  * EXAMPLE:
1168f8146b88SJung-uk Kim  *
1169f8146b88SJung-uk Kim  * This If..Else..If nested sequence:
1170f8146b88SJung-uk Kim  *
1171f8146b88SJung-uk Kim  *        If (Arg0 == 1)
1172f8146b88SJung-uk Kim  *        {
1173f8146b88SJung-uk Kim  *            Local0 = 4
1174f8146b88SJung-uk Kim  *        }
1175f8146b88SJung-uk Kim  *        Else
1176f8146b88SJung-uk Kim  *        {
1177f8146b88SJung-uk Kim  *            If (Arg0 == 2)
1178f8146b88SJung-uk Kim  *            {
1179f8146b88SJung-uk Kim  *                Local0 = 5
1180f8146b88SJung-uk Kim  *            }
1181f8146b88SJung-uk Kim  *        }
1182f8146b88SJung-uk Kim  *
1183f8146b88SJung-uk Kim  * Is converted to this simpler If..ElseIf sequence:
1184f8146b88SJung-uk Kim  *
1185f8146b88SJung-uk Kim  *        If (Arg0 == 1)
1186f8146b88SJung-uk Kim  *        {
1187f8146b88SJung-uk Kim  *            Local0 = 4
1188f8146b88SJung-uk Kim  *        }
1189f8146b88SJung-uk Kim  *        ElseIf (Arg0 == 2)
1190f8146b88SJung-uk Kim  *        {
1191f8146b88SJung-uk Kim  *            Local0 = 5
1192f8146b88SJung-uk Kim  *        }
1193f8146b88SJung-uk Kim  *
1194f8146b88SJung-uk Kim  * NOTE: There is no actual ElseIf AML opcode. ElseIf is essentially an ASL
1195f8146b88SJung-uk Kim  * macro that emits an Else opcode followed by an If opcode. This function
1196f8146b88SJung-uk Kim  * reverses these AML sequences back to an ElseIf macro where possible. This
1197f8146b88SJung-uk Kim  * can make the disassembled ASL code simpler and more like the original code.
1198f8146b88SJung-uk Kim  *
1199f8146b88SJung-uk Kim  ******************************************************************************/
1200f8146b88SJung-uk Kim 
1201f8146b88SJung-uk Kim static void
1202f8146b88SJung-uk Kim AcpiDmConvertToElseIf (
1203f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *OriginalElseOp)
1204f8146b88SJung-uk Kim {
1205f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *IfOp;
1206f8146b88SJung-uk Kim     ACPI_PARSE_OBJECT       *ElseOp;
1207f8146b88SJung-uk Kim 
1208f8146b88SJung-uk Kim 
1209f8146b88SJung-uk Kim     /*
1210f8146b88SJung-uk Kim      * To be able to perform the conversion, two conditions must be satisfied:
1211f8146b88SJung-uk Kim      * 1) The first child of the Else must be an If statement.
1212f8146b88SJung-uk Kim      * 2) The If block can only be followed by an Else block and these must
1213f8146b88SJung-uk Kim      *    be the only blocks under the original Else.
1214f8146b88SJung-uk Kim      */
1215f8146b88SJung-uk Kim     IfOp = OriginalElseOp->Common.Value.Arg;
1216493deb39SJung-uk Kim 
1217f8146b88SJung-uk Kim     if (!IfOp ||
1218f8146b88SJung-uk Kim         (IfOp->Common.AmlOpcode != AML_IF_OP) ||
1219f8146b88SJung-uk Kim         (IfOp->Asl.Next && (IfOp->Asl.Next->Common.AmlOpcode != AML_ELSE_OP)))
1220f8146b88SJung-uk Kim     {
1221493deb39SJung-uk Kim         /* Not a proper Else..If sequence, cannot convert to ElseIf */
1222f8146b88SJung-uk Kim 
122328482948SJung-uk Kim         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
122428482948SJung-uk Kim         {
122528482948SJung-uk Kim             AcpiOsPrintf ("%s", "Default");
122628482948SJung-uk Kim             return;
122728482948SJung-uk Kim         }
122828482948SJung-uk Kim 
1229f8146b88SJung-uk Kim         AcpiOsPrintf ("%s", "Else");
1230f8146b88SJung-uk Kim         return;
1231f8146b88SJung-uk Kim     }
1232f8146b88SJung-uk Kim 
1233493deb39SJung-uk Kim     /* Cannot have anything following the If...Else block */
1234493deb39SJung-uk Kim 
1235493deb39SJung-uk Kim     ElseOp = IfOp->Common.Next;
1236493deb39SJung-uk Kim     if (ElseOp && ElseOp->Common.Next)
1237493deb39SJung-uk Kim     {
123828482948SJung-uk Kim         if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
123928482948SJung-uk Kim         {
124028482948SJung-uk Kim             AcpiOsPrintf ("%s", "Default");
124128482948SJung-uk Kim             return;
124228482948SJung-uk Kim         }
124328482948SJung-uk Kim 
1244493deb39SJung-uk Kim         AcpiOsPrintf ("%s", "Else");
1245493deb39SJung-uk Kim         return;
1246493deb39SJung-uk Kim     }
1247493deb39SJung-uk Kim 
124828482948SJung-uk Kim     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_DEFAULT)
124928482948SJung-uk Kim     {
125028482948SJung-uk Kim         /*
125128482948SJung-uk Kim          * There is an ElseIf but in this case the Else is actually
125228482948SJung-uk Kim          * a Default block for a Switch/Case statement. No conversion.
125328482948SJung-uk Kim          */
125428482948SJung-uk Kim         AcpiOsPrintf ("%s", "Default");
125528482948SJung-uk Kim         return;
125628482948SJung-uk Kim     }
125728482948SJung-uk Kim 
125828482948SJung-uk Kim     if (OriginalElseOp->Common.DisasmOpcode == ACPI_DASM_CASE)
125928482948SJung-uk Kim     {
126028482948SJung-uk Kim         /*
126128482948SJung-uk Kim          * This ElseIf is actually a Case block for a Switch/Case
126228482948SJung-uk Kim          * statement. Print Case but do not return so that we can
126328482948SJung-uk Kim          * promote the subtree and keep the indentation level.
126428482948SJung-uk Kim          */
126528482948SJung-uk Kim         AcpiOsPrintf ("%s", "Case");
126628482948SJung-uk Kim     }
126728482948SJung-uk Kim     else
126828482948SJung-uk Kim     {
1269f8146b88SJung-uk Kim        /* Emit ElseIf, mark the IF as now an ELSEIF */
1270f8146b88SJung-uk Kim 
1271f8146b88SJung-uk Kim         AcpiOsPrintf ("%s", "ElseIf");
127228482948SJung-uk Kim     }
127328482948SJung-uk Kim 
1274f8146b88SJung-uk Kim     IfOp->Common.DisasmFlags |= ACPI_PARSEOP_ELSEIF;
1275f8146b88SJung-uk Kim 
1276f8146b88SJung-uk Kim     /* The IF parent will now be the same as the original ELSE parent */
1277f8146b88SJung-uk Kim 
1278f8146b88SJung-uk Kim     IfOp->Common.Parent = OriginalElseOp->Common.Parent;
1279f8146b88SJung-uk Kim 
1280f8146b88SJung-uk Kim     /*
1281f8146b88SJung-uk Kim      * Update the NEXT pointers to restructure the parse tree, essentially
1282f8146b88SJung-uk Kim      * promoting an If..Else block up to the same level as the original
1283f8146b88SJung-uk Kim      * Else.
1284f8146b88SJung-uk Kim      *
1285f8146b88SJung-uk Kim      * Check if the IF has a corresponding ELSE peer
1286f8146b88SJung-uk Kim      */
1287f8146b88SJung-uk Kim     ElseOp = IfOp->Common.Next;
1288f8146b88SJung-uk Kim     if (ElseOp &&
1289f8146b88SJung-uk Kim         (ElseOp->Common.AmlOpcode == AML_ELSE_OP))
1290f8146b88SJung-uk Kim     {
1291f8146b88SJung-uk Kim         /* If an ELSE matches the IF, promote it also */
1292f8146b88SJung-uk Kim 
1293f8146b88SJung-uk Kim         ElseOp->Common.Parent = OriginalElseOp->Common.Parent;
1294493deb39SJung-uk Kim 
1295493deb39SJung-uk Kim         /* Promote the entire block under the ElseIf (All Next OPs) */
1296493deb39SJung-uk Kim 
1297493deb39SJung-uk Kim         AcpiDmPromoteSubtree (OriginalElseOp);
1298f8146b88SJung-uk Kim     }
1299f8146b88SJung-uk Kim     else
1300f8146b88SJung-uk Kim     {
1301f8146b88SJung-uk Kim         /* Otherwise, set the IF NEXT to the original ELSE NEXT */
1302f8146b88SJung-uk Kim 
1303f8146b88SJung-uk Kim         IfOp->Common.Next = OriginalElseOp->Common.Next;
1304f8146b88SJung-uk Kim     }
1305f8146b88SJung-uk Kim 
1306f8146b88SJung-uk Kim     /* Detach the child IF block from the original ELSE */
1307f8146b88SJung-uk Kim 
1308f8146b88SJung-uk Kim     OriginalElseOp->Common.Value.Arg = NULL;
1309f8146b88SJung-uk Kim 
1310f8146b88SJung-uk Kim     /* Ignore the original ELSE from now on */
1311f8146b88SJung-uk Kim 
1312f8146b88SJung-uk Kim     OriginalElseOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
1313f8146b88SJung-uk Kim     OriginalElseOp->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
1314f8146b88SJung-uk Kim 
1315f8146b88SJung-uk Kim     /* Insert IF (now ELSEIF) as next peer of the original ELSE */
1316f8146b88SJung-uk Kim 
1317f8146b88SJung-uk Kim     OriginalElseOp->Common.Next = IfOp;
1318f8146b88SJung-uk Kim }
1319493deb39SJung-uk Kim 
1320493deb39SJung-uk Kim 
1321493deb39SJung-uk Kim /*******************************************************************************
1322493deb39SJung-uk Kim  *
1323493deb39SJung-uk Kim  * FUNCTION:    AcpiDmPromoteSubtree
1324493deb39SJung-uk Kim  *
1325493deb39SJung-uk Kim  * PARAMETERS:  StartOpOp           - Original parent of the entire subtree
1326493deb39SJung-uk Kim  *
1327493deb39SJung-uk Kim  * RETURN:      None
1328493deb39SJung-uk Kim  *
1329493deb39SJung-uk Kim  * DESCRIPTION: Promote an entire parse subtree up one level.
1330493deb39SJung-uk Kim  *
1331493deb39SJung-uk Kim  ******************************************************************************/
1332493deb39SJung-uk Kim 
1333493deb39SJung-uk Kim static void
1334493deb39SJung-uk Kim AcpiDmPromoteSubtree (
1335493deb39SJung-uk Kim     ACPI_PARSE_OBJECT       *StartOp)
1336493deb39SJung-uk Kim {
1337493deb39SJung-uk Kim     ACPI_PARSE_OBJECT       *Op;
1338493deb39SJung-uk Kim     ACPI_PARSE_OBJECT       *ParentOp;
1339493deb39SJung-uk Kim 
1340493deb39SJung-uk Kim 
1341493deb39SJung-uk Kim     /* New parent for subtree elements */
1342493deb39SJung-uk Kim 
1343493deb39SJung-uk Kim     ParentOp = StartOp->Common.Parent;
1344493deb39SJung-uk Kim 
1345493deb39SJung-uk Kim     /* First child starts the subtree */
1346493deb39SJung-uk Kim 
1347493deb39SJung-uk Kim     Op = StartOp->Common.Value.Arg;
1348493deb39SJung-uk Kim 
1349493deb39SJung-uk Kim     /* Walk the top-level elements of the subtree */
1350493deb39SJung-uk Kim 
1351493deb39SJung-uk Kim     while (Op)
1352493deb39SJung-uk Kim     {
1353493deb39SJung-uk Kim         Op->Common.Parent = ParentOp;
1354493deb39SJung-uk Kim         if (!Op->Common.Next)
1355493deb39SJung-uk Kim         {
1356493deb39SJung-uk Kim             /* Last Op in list, update its next field */
1357493deb39SJung-uk Kim 
1358493deb39SJung-uk Kim             Op->Common.Next = StartOp->Common.Next;
1359493deb39SJung-uk Kim             break;
1360493deb39SJung-uk Kim         }
1361493deb39SJung-uk Kim         Op = Op->Common.Next;
1362493deb39SJung-uk Kim     }
1363493deb39SJung-uk Kim }
1364