xref: /freebsd/sys/contrib/dev/acpica/compiler/asloperands.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: asloperands - AML operand processing
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
11*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
1253289f6aSNate Lawson  * All rights reserved.
1353289f6aSNate Lawson  *
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  *
119d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim  * are met:
122d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim  *    without modification.
125d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim  *    binary redistribution.
130d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim  *    from this software without specific prior written permission.
13353289f6aSNate Lawson  *
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
147d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim  * Software Foundation.
14953289f6aSNate Lawson  *
1500d84335fSJung-uk Kim  *****************************************************************************/
15153289f6aSNate Lawson 
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
15353289f6aSNate Lawson #include "aslcompiler.y.h"
154ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
15553289f6aSNate Lawson 
15653289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
15753289f6aSNate Lawson         ACPI_MODULE_NAME    ("asloperands")
15853289f6aSNate Lawson 
159fba7fc7eSJung-uk Kim /* Local prototypes */
160fba7fc7eSJung-uk Kim 
161fba7fc7eSJung-uk Kim static void
162fba7fc7eSJung-uk Kim OpnDoField (
163fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
164fba7fc7eSJung-uk Kim 
165fba7fc7eSJung-uk Kim static void
166fba7fc7eSJung-uk Kim OpnDoBankField (
167fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
168fba7fc7eSJung-uk Kim 
169fba7fc7eSJung-uk Kim static void
170fba7fc7eSJung-uk Kim OpnDoBuffer (
171fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
172fba7fc7eSJung-uk Kim 
173fba7fc7eSJung-uk Kim static void
174fba7fc7eSJung-uk Kim OpnDoDefinitionBlock (
175fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
176fba7fc7eSJung-uk Kim 
177fba7fc7eSJung-uk Kim static void
178fba7fc7eSJung-uk Kim OpnDoFieldCommon (
179fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *FieldOp,
180fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
181fba7fc7eSJung-uk Kim 
182fba7fc7eSJung-uk Kim static void
183fba7fc7eSJung-uk Kim OpnDoIndexField (
184fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
185fba7fc7eSJung-uk Kim 
186fba7fc7eSJung-uk Kim static void
187fba7fc7eSJung-uk Kim OpnDoLoadTable (
188fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
189fba7fc7eSJung-uk Kim 
190fba7fc7eSJung-uk Kim static void
191fba7fc7eSJung-uk Kim OpnDoMethod (
192fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
193fba7fc7eSJung-uk Kim 
194fba7fc7eSJung-uk Kim static void
195fba7fc7eSJung-uk Kim OpnDoMutex (
196fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
197fba7fc7eSJung-uk Kim 
198fba7fc7eSJung-uk Kim static void
199fba7fc7eSJung-uk Kim OpnDoRegion (
200fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
201fba7fc7eSJung-uk Kim 
202fba7fc7eSJung-uk Kim static void
203fba7fc7eSJung-uk Kim OpnAttachNameToNode (
204fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
205fba7fc7eSJung-uk Kim 
206fba7fc7eSJung-uk Kim 
207fba7fc7eSJung-uk Kim /*******************************************************************************
208fba7fc7eSJung-uk Kim  *
209fba7fc7eSJung-uk Kim  * FUNCTION:    OpnDoMutex
210fba7fc7eSJung-uk Kim  *
211fba7fc7eSJung-uk Kim  * PARAMETERS:  Op        - The parent parse node
212fba7fc7eSJung-uk Kim  *
213fba7fc7eSJung-uk Kim  * RETURN:      None
214fba7fc7eSJung-uk Kim  *
215fba7fc7eSJung-uk Kim  * DESCRIPTION: Construct the operands for the MUTEX ASL keyword.
216fba7fc7eSJung-uk Kim  *
217fba7fc7eSJung-uk Kim  ******************************************************************************/
218fba7fc7eSJung-uk Kim 
219fba7fc7eSJung-uk Kim static void
OpnDoMutex(ACPI_PARSE_OBJECT * Op)220fba7fc7eSJung-uk Kim OpnDoMutex (
221fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
222fba7fc7eSJung-uk Kim {
223fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Next;
224fba7fc7eSJung-uk Kim 
225fba7fc7eSJung-uk Kim 
226fba7fc7eSJung-uk Kim     Next = Op->Asl.Child;
227fba7fc7eSJung-uk Kim     Next = Next->Asl.Next;
228fba7fc7eSJung-uk Kim 
229fba7fc7eSJung-uk Kim     if (Next->Asl.Value.Integer > 15)
230fba7fc7eSJung-uk Kim     {
231fba7fc7eSJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
232fba7fc7eSJung-uk Kim     }
233fba7fc7eSJung-uk Kim     return;
234fba7fc7eSJung-uk Kim }
235fba7fc7eSJung-uk Kim 
23653289f6aSNate Lawson 
23753289f6aSNate Lawson /*******************************************************************************
23853289f6aSNate Lawson  *
23953289f6aSNate Lawson  * FUNCTION:    OpnDoMethod
24053289f6aSNate Lawson  *
24153289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
24253289f6aSNate Lawson  *
24353289f6aSNate Lawson  * RETURN:      None
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * DESCRIPTION: Construct the operands for the METHOD ASL keyword.
24653289f6aSNate Lawson  *
24753289f6aSNate Lawson  ******************************************************************************/
24853289f6aSNate Lawson 
249fba7fc7eSJung-uk Kim static void
OpnDoMethod(ACPI_PARSE_OBJECT * Op)25053289f6aSNate Lawson OpnDoMethod (
25153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
25253289f6aSNate Lawson {
25353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
25453289f6aSNate Lawson 
25553289f6aSNate Lawson     /* Optional arguments for this opcode with defaults */
25653289f6aSNate Lawson 
25753289f6aSNate Lawson     UINT8                   NumArgs = 0;
25853289f6aSNate Lawson     UINT8                   Serialized = 0;
25953289f6aSNate Lawson     UINT8                   Concurrency = 0;
26053289f6aSNate Lawson     UINT8                   MethodFlags;
26153289f6aSNate Lawson 
26253289f6aSNate Lawson 
26353289f6aSNate Lawson     /* Opcode and package length first */
26453289f6aSNate Lawson     /* Method name */
26553289f6aSNate Lawson 
26653289f6aSNate Lawson     Next = Op->Asl.Child;
26753289f6aSNate Lawson 
26853289f6aSNate Lawson     /* Num args */
26953289f6aSNate Lawson 
27053289f6aSNate Lawson     Next = Next->Asl.Next;
27153289f6aSNate Lawson     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
27253289f6aSNate Lawson     {
27353289f6aSNate Lawson         NumArgs = (UINT8) Next->Asl.Value.Integer;
27453289f6aSNate Lawson         Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
27553289f6aSNate Lawson     }
27653289f6aSNate Lawson 
27753289f6aSNate Lawson     /* Serialized Flag */
27853289f6aSNate Lawson 
27953289f6aSNate Lawson     Next = Next->Asl.Next;
28053289f6aSNate Lawson     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
28153289f6aSNate Lawson     {
28253289f6aSNate Lawson         Serialized = (UINT8) Next->Asl.Value.Integer;
28353289f6aSNate Lawson         Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
28453289f6aSNate Lawson     }
28553289f6aSNate Lawson 
286fba7fc7eSJung-uk Kim     /* Concurrency value (valid values are 0-15) */
28753289f6aSNate Lawson 
28853289f6aSNate Lawson     Next = Next->Asl.Next;
28953289f6aSNate Lawson     if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
29053289f6aSNate Lawson     {
291042ff955SJung-uk Kim         /* This is a ByteConstExpr, so eval the constant now */
292042ff955SJung-uk Kim 
293042ff955SJung-uk Kim         OpcAmlConstantWalk (Next, 0, NULL);
294042ff955SJung-uk Kim 
295fba7fc7eSJung-uk Kim         if (Next->Asl.Value.Integer > 15)
296fba7fc7eSJung-uk Kim         {
297fba7fc7eSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
298fba7fc7eSJung-uk Kim         }
299f8146b88SJung-uk Kim 
30053289f6aSNate Lawson         Concurrency = (UINT8) Next->Asl.Value.Integer;
30153289f6aSNate Lawson     }
30253289f6aSNate Lawson 
30353289f6aSNate Lawson     /* Put the bits in their proper places */
30453289f6aSNate Lawson 
305f8146b88SJung-uk Kim     MethodFlags = (UINT8)
306f8146b88SJung-uk Kim         ((NumArgs & 0x7) |
30753289f6aSNate Lawson         ((Serialized & 0x1) << 3) |
30853289f6aSNate Lawson         ((Concurrency & 0xF) << 4));
30953289f6aSNate Lawson 
31053289f6aSNate Lawson     /* Use the last node for the combined flags byte */
31153289f6aSNate Lawson 
31253289f6aSNate Lawson     Next->Asl.Value.Integer = MethodFlags;
31353289f6aSNate Lawson     Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
31453289f6aSNate Lawson     Next->Asl.AmlLength = 1;
31553289f6aSNate Lawson     Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
31653289f6aSNate Lawson 
31753289f6aSNate Lawson     /* Save the arg count in the first node */
31853289f6aSNate Lawson 
31953289f6aSNate Lawson     Op->Asl.Extra = NumArgs;
32053289f6aSNate Lawson }
32153289f6aSNate Lawson 
32253289f6aSNate Lawson 
32353289f6aSNate Lawson /*******************************************************************************
32453289f6aSNate Lawson  *
32553289f6aSNate Lawson  * FUNCTION:    OpnDoFieldCommon
32653289f6aSNate Lawson  *
32753289f6aSNate Lawson  * PARAMETERS:  FieldOp       - Node for an ASL field
32853289f6aSNate Lawson  *              Op            - The parent parse node
32953289f6aSNate Lawson  *
33053289f6aSNate Lawson  * RETURN:      None
33153289f6aSNate Lawson  *
33253289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the various field keywords,
33353289f6aSNate Lawson  *              FIELD, BANKFIELD, INDEXFIELD
33453289f6aSNate Lawson  *
33553289f6aSNate Lawson  ******************************************************************************/
33653289f6aSNate Lawson 
337fba7fc7eSJung-uk Kim static void
OpnDoFieldCommon(ACPI_PARSE_OBJECT * FieldOp,ACPI_PARSE_OBJECT * Op)33853289f6aSNate Lawson OpnDoFieldCommon (
33953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *FieldOp,
34053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
34153289f6aSNate Lawson {
34253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
34353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *PkgLengthNode;
34453289f6aSNate Lawson     UINT32                  CurrentBitOffset;
34553289f6aSNate Lawson     UINT32                  NewBitOffset;
34653289f6aSNate Lawson     UINT8                   AccessType;
34753289f6aSNate Lawson     UINT8                   LockRule;
34853289f6aSNate Lawson     UINT8                   UpdateRule;
34953289f6aSNate Lawson     UINT8                   FieldFlags;
35053289f6aSNate Lawson     UINT32                  MinimumLength;
35153289f6aSNate Lawson 
35253289f6aSNate Lawson 
35353289f6aSNate Lawson     /* AccessType -- not optional, so no need to check for DEFAULT_ARG */
35453289f6aSNate Lawson 
35553289f6aSNate Lawson     AccessType = (UINT8) Op->Asl.Value.Integer;
35653289f6aSNate Lawson     Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
35753289f6aSNate Lawson 
35853289f6aSNate Lawson     /* Set the access type in the parent (field) node for use later */
35953289f6aSNate Lawson 
36053289f6aSNate Lawson     FieldOp->Asl.Value.Integer = AccessType;
36153289f6aSNate Lawson 
36253289f6aSNate Lawson     /* LockRule -- not optional, so no need to check for DEFAULT_ARG */
36353289f6aSNate Lawson 
36453289f6aSNate Lawson     Next = Op->Asl.Next;
36553289f6aSNate Lawson     LockRule = (UINT8) Next->Asl.Value.Integer;
36653289f6aSNate Lawson     Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
36753289f6aSNate Lawson 
36853289f6aSNate Lawson     /* UpdateRule -- not optional, so no need to check for DEFAULT_ARG */
36953289f6aSNate Lawson 
37053289f6aSNate Lawson     Next = Next->Asl.Next;
37153289f6aSNate Lawson     UpdateRule = (UINT8) Next->Asl.Value.Integer;
37253289f6aSNate Lawson 
37353289f6aSNate Lawson     /*
37453289f6aSNate Lawson      * Generate the flags byte. The various fields are already
37553289f6aSNate Lawson      * in the right bit position via translation from the
37653289f6aSNate Lawson      * keywords by the parser.
37753289f6aSNate Lawson      */
37853289f6aSNate Lawson     FieldFlags = (UINT8) (AccessType | LockRule | UpdateRule);
37953289f6aSNate Lawson 
38053289f6aSNate Lawson     /* Use the previous node to be the FieldFlags node */
38153289f6aSNate Lawson 
38253289f6aSNate Lawson     /* Set the node to RAW_DATA */
38353289f6aSNate Lawson 
38453289f6aSNate Lawson     Next->Asl.Value.Integer = FieldFlags;
38553289f6aSNate Lawson     Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
38653289f6aSNate Lawson     Next->Asl.AmlLength = 1;
38753289f6aSNate Lawson     Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
38853289f6aSNate Lawson 
38953289f6aSNate Lawson     /* Process the FieldUnitList */
39053289f6aSNate Lawson 
39153289f6aSNate Lawson     Next = Next->Asl.Next;
39253289f6aSNate Lawson     CurrentBitOffset = 0;
39353289f6aSNate Lawson 
39453289f6aSNate Lawson     while (Next)
39553289f6aSNate Lawson     {
39653289f6aSNate Lawson         /* Save the offset of this field unit */
39753289f6aSNate Lawson 
39853289f6aSNate Lawson         Next->Asl.ExtraValue = CurrentBitOffset;
39953289f6aSNate Lawson 
40053289f6aSNate Lawson         switch (Next->Asl.ParseOpcode)
40153289f6aSNate Lawson         {
40253289f6aSNate Lawson         case PARSEOP_ACCESSAS:
40353289f6aSNate Lawson 
40453289f6aSNate Lawson             PkgLengthNode = Next->Asl.Child;
40553289f6aSNate Lawson             AccessType = (UINT8) PkgLengthNode->Asl.Value.Integer;
40653289f6aSNate Lawson 
40753289f6aSNate Lawson             /* Nothing additional to do */
40853289f6aSNate Lawson             break;
40953289f6aSNate Lawson 
41053289f6aSNate Lawson         case PARSEOP_OFFSET:
41153289f6aSNate Lawson 
41253289f6aSNate Lawson             /* New offset into the field */
41353289f6aSNate Lawson 
41453289f6aSNate Lawson             PkgLengthNode = Next->Asl.Child;
41553289f6aSNate Lawson             NewBitOffset = ((UINT32) PkgLengthNode->Asl.Value.Integer) * 8;
41653289f6aSNate Lawson 
41753289f6aSNate Lawson             /*
41853289f6aSNate Lawson              * Examine the specified offset in relation to the
41953289f6aSNate Lawson              * current offset counter.
42053289f6aSNate Lawson              */
42153289f6aSNate Lawson             if (NewBitOffset < CurrentBitOffset)
42253289f6aSNate Lawson             {
42353289f6aSNate Lawson                 /*
42453289f6aSNate Lawson                  * Not allowed to specify a backwards offset!
42553289f6aSNate Lawson                  * Issue error and ignore this node.
42653289f6aSNate Lawson                  */
427fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_BACKWARDS_OFFSET, PkgLengthNode,
428fba7fc7eSJung-uk Kim                     NULL);
42953289f6aSNate Lawson                 Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
43053289f6aSNate Lawson                 PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
43153289f6aSNate Lawson             }
432ab71bbb7SJung-uk Kim #ifdef _OBSOLETE_CODE
433ab71bbb7SJung-uk Kim             /*
434ab71bbb7SJung-uk Kim              * January 2022: removed this check due to complaints by users
435ab71bbb7SJung-uk Kim              * for too many (invalid) remarks.
436ab71bbb7SJung-uk Kim              */
4376f1f1a63SJung-uk Kim             else if (NewBitOffset == CurrentBitOffset)
43853289f6aSNate Lawson             {
43953289f6aSNate Lawson                 /*
4406f1f1a63SJung-uk Kim                  * This Offset() operator is redundant and not needed,
4416f1f1a63SJung-uk Kim                  * because the offset value is the same as the current
4426f1f1a63SJung-uk Kim                  * offset.
4436f1f1a63SJung-uk Kim                  */
4446f1f1a63SJung-uk Kim                 AslError (ASL_REMARK, ASL_MSG_OFFSET, PkgLengthNode, NULL);
4456f1f1a63SJung-uk Kim 
4466f1f1a63SJung-uk Kim                 if (AslGbl_OptimizeTrivialParseNodes)
4476f1f1a63SJung-uk Kim                 {
4486f1f1a63SJung-uk Kim                     /*
4496f1f1a63SJung-uk Kim                      * Optimize this Offset() operator by removing/ignoring
4506f1f1a63SJung-uk Kim                      * it. Set the related nodes to default.
45153289f6aSNate Lawson                      */
45253289f6aSNate Lawson                     Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
45353289f6aSNate Lawson                     PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
4546f1f1a63SJung-uk Kim 
4556f1f1a63SJung-uk Kim                     AslError (ASL_OPTIMIZATION, ASL_MSG_OFFSET, PkgLengthNode,
4566f1f1a63SJung-uk Kim                         "Optimizer has removed statement");
4576f1f1a63SJung-uk Kim                 }
4586f1f1a63SJung-uk Kim                 else
4596f1f1a63SJung-uk Kim                 {
4606f1f1a63SJung-uk Kim                     /* Optimization is disabled, treat as a valid Offset */
4616f1f1a63SJung-uk Kim 
4626f1f1a63SJung-uk Kim                     PkgLengthNode->Asl.Value.Integer =
4636f1f1a63SJung-uk Kim                         NewBitOffset - CurrentBitOffset;
4646f1f1a63SJung-uk Kim                     CurrentBitOffset = NewBitOffset;
4656f1f1a63SJung-uk Kim                 }
46653289f6aSNate Lawson             }
467ab71bbb7SJung-uk Kim #endif
46853289f6aSNate Lawson             else
46953289f6aSNate Lawson             {
47053289f6aSNate Lawson                 /*
47153289f6aSNate Lawson                  * Valid new offset - set the value to be inserted into the AML
47253289f6aSNate Lawson                  * and update the offset counter.
47353289f6aSNate Lawson                  */
474fba7fc7eSJung-uk Kim                 PkgLengthNode->Asl.Value.Integer =
475fba7fc7eSJung-uk Kim                     NewBitOffset - CurrentBitOffset;
47653289f6aSNate Lawson                 CurrentBitOffset = NewBitOffset;
47753289f6aSNate Lawson             }
47853289f6aSNate Lawson             break;
47953289f6aSNate Lawson 
48053289f6aSNate Lawson         case PARSEOP_NAMESEG:
48153289f6aSNate Lawson         case PARSEOP_RESERVED_BYTES:
48253289f6aSNate Lawson 
48353289f6aSNate Lawson             /* Named or reserved field entry */
48453289f6aSNate Lawson 
48553289f6aSNate Lawson             PkgLengthNode = Next->Asl.Child;
48653289f6aSNate Lawson             NewBitOffset = (UINT32) PkgLengthNode->Asl.Value.Integer;
48753289f6aSNate Lawson             CurrentBitOffset += NewBitOffset;
48853289f6aSNate Lawson 
489493deb39SJung-uk Kim             if ((NewBitOffset == 0) &&
4900d84335fSJung-uk Kim                 (Next->Asl.ParseOpcode == PARSEOP_RESERVED_BYTES) &&
4916f1f1a63SJung-uk Kim                 AslGbl_OptimizeTrivialParseNodes)
492493deb39SJung-uk Kim             {
493493deb39SJung-uk Kim                 /*
494493deb39SJung-uk Kim                  * Unnamed field with a bit length of zero. We can
495493deb39SJung-uk Kim                  * safely just ignore this. However, we will not ignore
496493deb39SJung-uk Kim                  * a named field of zero length, we don't want to just
497493deb39SJung-uk Kim                  * toss out a name.
498493deb39SJung-uk Kim                  */
499493deb39SJung-uk Kim                 Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
500493deb39SJung-uk Kim                 PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
501493deb39SJung-uk Kim                 break;
502493deb39SJung-uk Kim             }
503493deb39SJung-uk Kim 
50453289f6aSNate Lawson             /* Save the current AccessAs value for error checking later */
50553289f6aSNate Lawson 
50653289f6aSNate Lawson             switch (AccessType)
50753289f6aSNate Lawson             {
50853289f6aSNate Lawson                 case AML_FIELD_ACCESS_ANY:
50953289f6aSNate Lawson                 case AML_FIELD_ACCESS_BYTE:
51053289f6aSNate Lawson                 case AML_FIELD_ACCESS_BUFFER:
51153289f6aSNate Lawson                 default:
512a9d8d09cSJung-uk Kim 
51353289f6aSNate Lawson                     MinimumLength = 8;
51453289f6aSNate Lawson                     break;
51553289f6aSNate Lawson 
51653289f6aSNate Lawson                 case AML_FIELD_ACCESS_WORD:
51753289f6aSNate Lawson                     MinimumLength = 16;
51853289f6aSNate Lawson                     break;
51953289f6aSNate Lawson 
52053289f6aSNate Lawson                 case AML_FIELD_ACCESS_DWORD:
52153289f6aSNate Lawson                     MinimumLength = 32;
52253289f6aSNate Lawson                     break;
52353289f6aSNate Lawson 
52453289f6aSNate Lawson                 case AML_FIELD_ACCESS_QWORD:
52553289f6aSNate Lawson                     MinimumLength = 64;
52653289f6aSNate Lawson                     break;
52753289f6aSNate Lawson             }
52853289f6aSNate Lawson 
52953289f6aSNate Lawson             PkgLengthNode->Asl.ExtraValue = MinimumLength;
53053289f6aSNate Lawson             break;
53153289f6aSNate Lawson 
53253289f6aSNate Lawson         default:
533a9d8d09cSJung-uk Kim 
53453289f6aSNate Lawson             /* All supported field opcodes must appear above */
535a9d8d09cSJung-uk Kim 
53653289f6aSNate Lawson             break;
53753289f6aSNate Lawson         }
53853289f6aSNate Lawson 
53953289f6aSNate Lawson         /* Move on to next entry in the field list */
54053289f6aSNate Lawson 
54153289f6aSNate Lawson         Next = Next->Asl.Next;
54253289f6aSNate Lawson     }
54353289f6aSNate Lawson }
54453289f6aSNate Lawson 
54553289f6aSNate Lawson 
54653289f6aSNate Lawson /*******************************************************************************
54753289f6aSNate Lawson  *
54853289f6aSNate Lawson  * FUNCTION:    OpnDoField
54953289f6aSNate Lawson  *
55053289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
55153289f6aSNate Lawson  *
55253289f6aSNate Lawson  * RETURN:      None
55353289f6aSNate Lawson  *
55453289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the FIELD ASL keyword
55553289f6aSNate Lawson  *
55653289f6aSNate Lawson  ******************************************************************************/
55753289f6aSNate Lawson 
558fba7fc7eSJung-uk Kim static void
OpnDoField(ACPI_PARSE_OBJECT * Op)55953289f6aSNate Lawson OpnDoField (
56053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
56153289f6aSNate Lawson {
56253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
56353289f6aSNate Lawson 
56453289f6aSNate Lawson 
56553289f6aSNate Lawson     /* Opcode is parent node */
56653289f6aSNate Lawson     /* First child is field name */
56753289f6aSNate Lawson 
56853289f6aSNate Lawson     Next = Op->Asl.Child;
56953289f6aSNate Lawson 
57053289f6aSNate Lawson     /* Second child is the AccessType */
57153289f6aSNate Lawson 
57253289f6aSNate Lawson     OpnDoFieldCommon (Op, Next->Asl.Next);
57353289f6aSNate Lawson }
57453289f6aSNate Lawson 
57553289f6aSNate Lawson 
57653289f6aSNate Lawson /*******************************************************************************
57753289f6aSNate Lawson  *
57853289f6aSNate Lawson  * FUNCTION:    OpnDoIndexField
57953289f6aSNate Lawson  *
58053289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
58153289f6aSNate Lawson  *
58253289f6aSNate Lawson  * RETURN:      None
58353289f6aSNate Lawson  *
58453289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the INDEXFIELD ASL keyword
58553289f6aSNate Lawson  *
58653289f6aSNate Lawson  ******************************************************************************/
58753289f6aSNate Lawson 
588fba7fc7eSJung-uk Kim static void
OpnDoIndexField(ACPI_PARSE_OBJECT * Op)58953289f6aSNate Lawson OpnDoIndexField (
59053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
59153289f6aSNate Lawson {
59253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
59353289f6aSNate Lawson 
59453289f6aSNate Lawson 
59553289f6aSNate Lawson     /* Opcode is parent node */
59653289f6aSNate Lawson     /* First child is the index name */
59753289f6aSNate Lawson 
59853289f6aSNate Lawson     Next = Op->Asl.Child;
59953289f6aSNate Lawson 
60053289f6aSNate Lawson     /* Second child is the data name */
60153289f6aSNate Lawson 
60253289f6aSNate Lawson     Next = Next->Asl.Next;
60353289f6aSNate Lawson 
60453289f6aSNate Lawson     /* Third child is the AccessType */
60553289f6aSNate Lawson 
60653289f6aSNate Lawson     OpnDoFieldCommon (Op, Next->Asl.Next);
60753289f6aSNate Lawson }
60853289f6aSNate Lawson 
60953289f6aSNate Lawson 
61053289f6aSNate Lawson /*******************************************************************************
61153289f6aSNate Lawson  *
61253289f6aSNate Lawson  * FUNCTION:    OpnDoBankField
61353289f6aSNate Lawson  *
61453289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
61553289f6aSNate Lawson  *
61653289f6aSNate Lawson  * RETURN:      None
61753289f6aSNate Lawson  *
61853289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the BANKFIELD ASL keyword
61953289f6aSNate Lawson  *
62053289f6aSNate Lawson  ******************************************************************************/
62153289f6aSNate Lawson 
622fba7fc7eSJung-uk Kim static void
OpnDoBankField(ACPI_PARSE_OBJECT * Op)62353289f6aSNate Lawson OpnDoBankField (
62453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
62553289f6aSNate Lawson {
62653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
62753289f6aSNate Lawson 
62853289f6aSNate Lawson 
62953289f6aSNate Lawson     /* Opcode is parent node */
63053289f6aSNate Lawson     /* First child is the region name */
63153289f6aSNate Lawson 
63253289f6aSNate Lawson     Next = Op->Asl.Child;
63353289f6aSNate Lawson 
63453289f6aSNate Lawson     /* Second child is the bank name */
63553289f6aSNate Lawson 
63653289f6aSNate Lawson     Next = Next->Asl.Next;
63753289f6aSNate Lawson 
63853289f6aSNate Lawson     /* Third child is the bank value */
63953289f6aSNate Lawson 
64053289f6aSNate Lawson     Next = Next->Asl.Next;
64153289f6aSNate Lawson 
64253289f6aSNate Lawson     /* Fourth child is the AccessType */
64353289f6aSNate Lawson 
64453289f6aSNate Lawson     OpnDoFieldCommon (Op, Next->Asl.Next);
64553289f6aSNate Lawson }
64653289f6aSNate Lawson 
64753289f6aSNate Lawson 
64853289f6aSNate Lawson /*******************************************************************************
64953289f6aSNate Lawson  *
65053289f6aSNate Lawson  * FUNCTION:    OpnDoRegion
65153289f6aSNate Lawson  *
65253289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
65353289f6aSNate Lawson  *
65453289f6aSNate Lawson  * RETURN:      None
65553289f6aSNate Lawson  *
65653289f6aSNate Lawson  * DESCRIPTION: Tries to get the length of the region. Can only do this at
65753289f6aSNate Lawson  *              compile time if the length is a constant.
65853289f6aSNate Lawson  *
65953289f6aSNate Lawson  ******************************************************************************/
66053289f6aSNate Lawson 
661fba7fc7eSJung-uk Kim static void
OpnDoRegion(ACPI_PARSE_OBJECT * Op)66253289f6aSNate Lawson OpnDoRegion (
66353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
66453289f6aSNate Lawson {
66553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
666cd6518c7SJung-uk Kim     ACPI_ADR_SPACE_TYPE     SpaceId;
66753289f6aSNate Lawson 
66853289f6aSNate Lawson 
66953289f6aSNate Lawson     /* Opcode is parent node */
67053289f6aSNate Lawson     /* First child is the region name */
67153289f6aSNate Lawson 
67253289f6aSNate Lawson     Next = Op->Asl.Child;
67353289f6aSNate Lawson 
67453289f6aSNate Lawson     /* Second child is the space ID */
67553289f6aSNate Lawson 
67653289f6aSNate Lawson     Next = Next->Asl.Next;
677cd6518c7SJung-uk Kim     SpaceId = (ACPI_ADR_SPACE_TYPE) Next->Common.Value.Integer;
67853289f6aSNate Lawson 
67953289f6aSNate Lawson     /* Third child is the region offset */
68053289f6aSNate Lawson 
68153289f6aSNate Lawson     Next = Next->Asl.Next;
68253289f6aSNate Lawson 
68353289f6aSNate Lawson     /* Fourth child is the region length */
68453289f6aSNate Lawson 
68553289f6aSNate Lawson     Next = Next->Asl.Next;
68653289f6aSNate Lawson     if (Next->Asl.ParseOpcode == PARSEOP_INTEGER)
68753289f6aSNate Lawson     {
688cd6518c7SJung-uk Kim         /* Check for zero length */
689cd6518c7SJung-uk Kim 
69053289f6aSNate Lawson         Op->Asl.Value.Integer = Next->Asl.Value.Integer;
691cd6518c7SJung-uk Kim         if (!Op->Asl.Value.Integer && (SpaceId < ACPI_NUM_PREDEFINED_REGIONS))
692cd6518c7SJung-uk Kim         {
693cd6518c7SJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_REGION_LENGTH, Op, NULL);
694cd6518c7SJung-uk Kim         }
69553289f6aSNate Lawson     }
69653289f6aSNate Lawson     else
69753289f6aSNate Lawson     {
6989a179dd8SJung-uk Kim         Op->Asl.Value.Integer = ACPI_UINT64_MAX;
69953289f6aSNate Lawson     }
70053289f6aSNate Lawson }
70153289f6aSNate Lawson 
70253289f6aSNate Lawson 
70353289f6aSNate Lawson /*******************************************************************************
70453289f6aSNate Lawson  *
70553289f6aSNate Lawson  * FUNCTION:    OpnDoBuffer
70653289f6aSNate Lawson  *
70753289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
70853289f6aSNate Lawson  *
70953289f6aSNate Lawson  * RETURN:      None
71053289f6aSNate Lawson  *
71153289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the BUFFER ASL keyword. We
71253289f6aSNate Lawson  *              build a single raw byte buffer from the initialization nodes,
71353289f6aSNate Lawson  *              each parse node contains a buffer byte.
71453289f6aSNate Lawson  *
71553289f6aSNate Lawson  ******************************************************************************/
71653289f6aSNate Lawson 
717fba7fc7eSJung-uk Kim static void
OpnDoBuffer(ACPI_PARSE_OBJECT * Op)71853289f6aSNate Lawson OpnDoBuffer (
71953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
72053289f6aSNate Lawson {
72153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *InitializerOp;
72253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *BufferLengthOp;
72353289f6aSNate Lawson 
72453289f6aSNate Lawson     /* Optional arguments for this opcode with defaults */
72553289f6aSNate Lawson 
72653289f6aSNate Lawson     UINT32                  BufferLength = 0;
72753289f6aSNate Lawson 
72853289f6aSNate Lawson 
72953289f6aSNate Lawson     /* Opcode and package length first */
73053289f6aSNate Lawson     /* Buffer Length is next, followed by the initializer list */
73153289f6aSNate Lawson 
73253289f6aSNate Lawson     BufferLengthOp = Op->Asl.Child;
73353289f6aSNate Lawson     InitializerOp = BufferLengthOp->Asl.Next;
73453289f6aSNate Lawson 
73553289f6aSNate Lawson     /*
73653289f6aSNate Lawson      * If the BufferLength is not an INTEGER or was not specified in the ASL
73753289f6aSNate Lawson      * (DEFAULT_ARG), it is a TermArg that is
73853289f6aSNate Lawson      * evaluated at run-time, and we are therefore finished.
73953289f6aSNate Lawson      */
74053289f6aSNate Lawson     if ((BufferLengthOp->Asl.ParseOpcode != PARSEOP_INTEGER) &&
74153289f6aSNate Lawson         (BufferLengthOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
74253289f6aSNate Lawson     {
74353289f6aSNate Lawson         return;
74453289f6aSNate Lawson     }
74553289f6aSNate Lawson 
74653289f6aSNate Lawson     /*
74753289f6aSNate Lawson      * We want to count the number of items in the initializer list, because if
74853289f6aSNate Lawson      * it is larger than the buffer length, we will define the buffer size
74953289f6aSNate Lawson      * to be the size of the initializer list (as per the ACPI Specification)
75053289f6aSNate Lawson      */
75153289f6aSNate Lawson     switch (InitializerOp->Asl.ParseOpcode)
75253289f6aSNate Lawson     {
75353289f6aSNate Lawson     case PARSEOP_INTEGER:
75453289f6aSNate Lawson     case PARSEOP_BYTECONST:
75553289f6aSNate Lawson     case PARSEOP_WORDCONST:
75653289f6aSNate Lawson     case PARSEOP_DWORDCONST:
75753289f6aSNate Lawson 
75853289f6aSNate Lawson         /* The peer list contains the byte list (if any...) */
75953289f6aSNate Lawson 
76053289f6aSNate Lawson         while (InitializerOp)
76153289f6aSNate Lawson         {
76253289f6aSNate Lawson             /* For buffers, this is a list of raw bytes */
76353289f6aSNate Lawson 
76453289f6aSNate Lawson             InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
76553289f6aSNate Lawson             InitializerOp->Asl.AmlLength = 1;
76653289f6aSNate Lawson             InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
76753289f6aSNate Lawson 
76853289f6aSNate Lawson             BufferLength++;
76953289f6aSNate Lawson             InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
77053289f6aSNate Lawson         }
77153289f6aSNate Lawson         break;
77253289f6aSNate Lawson 
77353289f6aSNate Lawson     case PARSEOP_STRING_LITERAL:
77453289f6aSNate Lawson 
77553289f6aSNate Lawson         /*
77653289f6aSNate Lawson          * Only one initializer, the string. Buffer must be big enough to hold
77753289f6aSNate Lawson          * the string plus the null termination byte
77853289f6aSNate Lawson          */
77953289f6aSNate Lawson         BufferLength = strlen (InitializerOp->Asl.Value.String) + 1;
78053289f6aSNate Lawson 
78153289f6aSNate Lawson         InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
78253289f6aSNate Lawson         InitializerOp->Asl.AmlLength = BufferLength;
78353289f6aSNate Lawson         InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
78453289f6aSNate Lawson         break;
78553289f6aSNate Lawson 
78653289f6aSNate Lawson     case PARSEOP_RAW_DATA:
78753289f6aSNate Lawson 
78853289f6aSNate Lawson         /* Buffer nodes are already initialized (e.g. Unicode operator) */
78953289f6aSNate Lawson         return;
79053289f6aSNate Lawson 
79153289f6aSNate Lawson     case PARSEOP_DEFAULT_ARG:
79253289f6aSNate Lawson         break;
79353289f6aSNate Lawson 
79453289f6aSNate Lawson     default:
795a9d8d09cSJung-uk Kim 
79653289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, InitializerOp,
79753289f6aSNate Lawson             "Unknown buffer initializer opcode");
79853289f6aSNate Lawson         printf ("Unknown buffer initializer opcode [%s]\n",
79953289f6aSNate Lawson             UtGetOpName (InitializerOp->Asl.ParseOpcode));
80053289f6aSNate Lawson         return;
80153289f6aSNate Lawson     }
80253289f6aSNate Lawson 
80353289f6aSNate Lawson     /* Check if initializer list is longer than the buffer length */
80453289f6aSNate Lawson 
80553289f6aSNate Lawson     if (BufferLengthOp->Asl.Value.Integer > BufferLength)
80653289f6aSNate Lawson     {
80753289f6aSNate Lawson         BufferLength = (UINT32) BufferLengthOp->Asl.Value.Integer;
80853289f6aSNate Lawson     }
80953289f6aSNate Lawson 
81053289f6aSNate Lawson     if (!BufferLength)
81153289f6aSNate Lawson     {
812fba7fc7eSJung-uk Kim         /* No length AND no items -- issue notice */
81353289f6aSNate Lawson 
814fba7fc7eSJung-uk Kim         AslError (ASL_REMARK, ASL_MSG_BUFFER_LENGTH, BufferLengthOp, NULL);
81553289f6aSNate Lawson 
81653289f6aSNate Lawson         /* But go ahead and put the buffer length of zero into the AML */
81753289f6aSNate Lawson     }
81853289f6aSNate Lawson 
81953289f6aSNate Lawson     /*
82053289f6aSNate Lawson      * Just set the buffer size node to be the buffer length, regardless
82153289f6aSNate Lawson      * of whether it was previously an integer or a default_arg placeholder
82253289f6aSNate Lawson      */
82353289f6aSNate Lawson     BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER;
82453289f6aSNate Lawson     BufferLengthOp->Asl.AmlOpcode = AML_DWORD_OP;
82553289f6aSNate Lawson     BufferLengthOp->Asl.Value.Integer = BufferLength;
82653289f6aSNate Lawson 
82753289f6aSNate Lawson     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
8289ad8b64eSJung-uk Kim     UtSetParseOpName (BufferLengthOp);
82953289f6aSNate Lawson 
83053289f6aSNate Lawson     /* Remaining nodes are handled via the tree walk */
83153289f6aSNate Lawson }
83253289f6aSNate Lawson 
83353289f6aSNate Lawson 
83453289f6aSNate Lawson /*******************************************************************************
83553289f6aSNate Lawson  *
83653289f6aSNate Lawson  * FUNCTION:    OpnDoPackage
83753289f6aSNate Lawson  *
83853289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
83953289f6aSNate Lawson  *
84053289f6aSNate Lawson  * RETURN:      None
84153289f6aSNate Lawson  *
842fba7fc7eSJung-uk Kim  * DESCRIPTION: Construct the AML operands for the PACKAGE ASL keyword. NOTE:
843fba7fc7eSJung-uk Kim  *              can only be called after constants have been folded, to ensure
844fba7fc7eSJung-uk Kim  *              that the PackageLength operand has been fully reduced.
84553289f6aSNate Lawson  *
84653289f6aSNate Lawson  ******************************************************************************/
84753289f6aSNate Lawson 
84853289f6aSNate Lawson void
OpnDoPackage(ACPI_PARSE_OBJECT * Op)84953289f6aSNate Lawson OpnDoPackage (
85053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
85153289f6aSNate Lawson {
85253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *InitializerOp;
85353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *PackageLengthOp;
85453289f6aSNate Lawson     UINT32                  PackageLength = 0;
85553289f6aSNate Lawson 
85653289f6aSNate Lawson 
857fba7fc7eSJung-uk Kim     /* Opcode and package length first, followed by the initializer list */
85853289f6aSNate Lawson 
85953289f6aSNate Lawson     PackageLengthOp = Op->Asl.Child;
86053289f6aSNate Lawson     InitializerOp = PackageLengthOp->Asl.Next;
86153289f6aSNate Lawson 
862fba7fc7eSJung-uk Kim     /* Count the number of items in the initializer list */
863fba7fc7eSJung-uk Kim 
86453289f6aSNate Lawson     if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
86553289f6aSNate Lawson     {
86653289f6aSNate Lawson         /* The peer list contains the byte list (if any...) */
86753289f6aSNate Lawson 
86853289f6aSNate Lawson         while (InitializerOp)
86953289f6aSNate Lawson         {
87053289f6aSNate Lawson             PackageLength++;
87153289f6aSNate Lawson             InitializerOp = InitializerOp->Asl.Next;
87253289f6aSNate Lawson         }
87353289f6aSNate Lawson     }
87453289f6aSNate Lawson 
875fba7fc7eSJung-uk Kim     /* If package length is a constant, compare to the initializer list */
87653289f6aSNate Lawson 
87753289f6aSNate Lawson     if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||
878fba7fc7eSJung-uk Kim         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST))
87953289f6aSNate Lawson     {
8802272d050SJung-uk Kim         if (PackageLengthOp->Asl.Value.Integer > PackageLength)
88153289f6aSNate Lawson         {
8822272d050SJung-uk Kim             /*
8832272d050SJung-uk Kim              * Allow package length to be longer than the initializer
8842272d050SJung-uk Kim              * list -- but if the length of initializer list is nonzero,
8852272d050SJung-uk Kim              * issue a message since this is probably a coding error,
8862272d050SJung-uk Kim              * even though technically legal.
8872272d050SJung-uk Kim              */
8882272d050SJung-uk Kim             if (PackageLength > 0)
8892272d050SJung-uk Kim             {
8902272d050SJung-uk Kim                 AslError (ASL_REMARK, ASL_MSG_LIST_LENGTH_SHORT,
8912272d050SJung-uk Kim                     PackageLengthOp, NULL);
8922272d050SJung-uk Kim             }
893fba7fc7eSJung-uk Kim 
89453289f6aSNate Lawson             PackageLength = (UINT32) PackageLengthOp->Asl.Value.Integer;
89553289f6aSNate Lawson         }
8962272d050SJung-uk Kim         else if (PackageLengthOp->Asl.Value.Integer < PackageLength)
897fba7fc7eSJung-uk Kim         {
898fba7fc7eSJung-uk Kim             /*
8992272d050SJung-uk Kim              * The package length is smaller than the length of the
9002272d050SJung-uk Kim              * initializer list. This is an error as per the ACPI spec.
901fba7fc7eSJung-uk Kim              */
9022272d050SJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH_LONG,
9032272d050SJung-uk Kim                 PackageLengthOp, NULL);
904fba7fc7eSJung-uk Kim         }
90553289f6aSNate Lawson     }
90653289f6aSNate Lawson 
907fba7fc7eSJung-uk Kim     if (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
908fba7fc7eSJung-uk Kim     {
90953289f6aSNate Lawson         /*
910fba7fc7eSJung-uk Kim          * This is the case if the PackageLength was left empty - Package()
911fba7fc7eSJung-uk Kim          * The package length becomes the length of the initializer list
91253289f6aSNate Lawson          */
913fba7fc7eSJung-uk Kim         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_INTEGER;
914fba7fc7eSJung-uk Kim         Op->Asl.Child->Asl.Value.Integer = PackageLength;
9159ad8b64eSJung-uk Kim         UtSetParseOpName (Op);
916fba7fc7eSJung-uk Kim 
917fba7fc7eSJung-uk Kim         /* Set the AML opcode */
918fba7fc7eSJung-uk Kim 
919fba7fc7eSJung-uk Kim         (void) OpcSetOptimalIntegerSize (Op->Asl.Child);
920fba7fc7eSJung-uk Kim     }
921fba7fc7eSJung-uk Kim 
922fba7fc7eSJung-uk Kim     /* If not a variable-length package, check for a zero package length */
923fba7fc7eSJung-uk Kim 
92453289f6aSNate Lawson     if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||
925fba7fc7eSJung-uk Kim         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST)   ||
9263f0275a0SJung-uk Kim         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_ZERO)         ||
92753289f6aSNate Lawson         (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG))
92853289f6aSNate Lawson     {
92953289f6aSNate Lawson         if (!PackageLength)
93053289f6aSNate Lawson         {
931fba7fc7eSJung-uk Kim             /* No length AND no initializer list -- issue a remark */
93253289f6aSNate Lawson 
933fba7fc7eSJung-uk Kim             AslError (ASL_REMARK, ASL_MSG_PACKAGE_LENGTH,
934fba7fc7eSJung-uk Kim                 PackageLengthOp, NULL);
93553289f6aSNate Lawson 
93653289f6aSNate Lawson             /* But go ahead and put the buffer length of zero into the AML */
93753289f6aSNate Lawson         }
93853289f6aSNate Lawson     }
93953289f6aSNate Lawson 
94053289f6aSNate Lawson     /*
941fba7fc7eSJung-uk Kim      * If the PackageLength is a constant <= 255, we can change the
942fba7fc7eSJung-uk Kim      * AML opcode from VarPackage to a simple (ACPI 1.0) Package opcode.
943fba7fc7eSJung-uk Kim      */
9443f0275a0SJung-uk Kim     if (((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) &&
9453f0275a0SJung-uk Kim             (Op->Asl.Child->Asl.Value.Integer <= 255))  ||
9463f0275a0SJung-uk Kim         (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_ONE) ||
9473f0275a0SJung-uk Kim         (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_ONES)||
9483f0275a0SJung-uk Kim         (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_ZERO))
949fba7fc7eSJung-uk Kim     {
950fba7fc7eSJung-uk Kim         Op->Asl.AmlOpcode = AML_PACKAGE_OP;
951fba7fc7eSJung-uk Kim         Op->Asl.ParseOpcode = PARSEOP_PACKAGE;
952fba7fc7eSJung-uk Kim 
953fba7fc7eSJung-uk Kim         /*
954fba7fc7eSJung-uk Kim          * Just set the package size node to be the package length, regardless
95553289f6aSNate Lawson          * of whether it was previously an integer or a default_arg placeholder
95653289f6aSNate Lawson          */
95753289f6aSNate Lawson         PackageLengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
95853289f6aSNate Lawson         PackageLengthOp->Asl.AmlLength = 1;
95953289f6aSNate Lawson         PackageLengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
96053289f6aSNate Lawson         PackageLengthOp->Asl.Value.Integer = PackageLength;
961fba7fc7eSJung-uk Kim     }
96253289f6aSNate Lawson 
96353289f6aSNate Lawson     /* Remaining nodes are handled via the tree walk */
96453289f6aSNate Lawson }
96553289f6aSNate Lawson 
96653289f6aSNate Lawson 
96753289f6aSNate Lawson /*******************************************************************************
96853289f6aSNate Lawson  *
96953289f6aSNate Lawson  * FUNCTION:    OpnDoLoadTable
97053289f6aSNate Lawson  *
97153289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
97253289f6aSNate Lawson  *
97353289f6aSNate Lawson  * RETURN:      None
97453289f6aSNate Lawson  *
97553289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the LOADTABLE ASL keyword.
97653289f6aSNate Lawson  *
97753289f6aSNate Lawson  ******************************************************************************/
97853289f6aSNate Lawson 
979fba7fc7eSJung-uk Kim static void
OpnDoLoadTable(ACPI_PARSE_OBJECT * Op)98053289f6aSNate Lawson OpnDoLoadTable (
98153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
98253289f6aSNate Lawson {
98353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Next;
98453289f6aSNate Lawson 
98553289f6aSNate Lawson 
98653289f6aSNate Lawson     /* Opcode is parent node */
98753289f6aSNate Lawson     /* First child is the table signature */
98853289f6aSNate Lawson 
98953289f6aSNate Lawson     Next = Op->Asl.Child;
99053289f6aSNate Lawson 
99153289f6aSNate Lawson     /* Second child is the OEM ID*/
99253289f6aSNate Lawson 
99353289f6aSNate Lawson     Next = Next->Asl.Next;
99453289f6aSNate Lawson 
99553289f6aSNate Lawson     /* Third child is the OEM table ID */
99653289f6aSNate Lawson 
99753289f6aSNate Lawson     Next = Next->Asl.Next;
99853289f6aSNate Lawson 
99953289f6aSNate Lawson     /* Fourth child is the RootPath string */
100053289f6aSNate Lawson 
100153289f6aSNate Lawson     Next = Next->Asl.Next;
100253289f6aSNate Lawson     if (Next->Asl.ParseOpcode == PARSEOP_ZERO)
100353289f6aSNate Lawson     {
100453289f6aSNate Lawson         Next->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
100553289f6aSNate Lawson         Next->Asl.Value.String = "\\";
100653289f6aSNate Lawson         Next->Asl.AmlLength = 2;
100753289f6aSNate Lawson         OpcGenerateAmlOpcode (Next);
100853289f6aSNate Lawson     }
100953289f6aSNate Lawson 
1010fba7fc7eSJung-uk Kim #ifdef ASL_FUTURE_IMPLEMENTATION
1011fba7fc7eSJung-uk Kim 
1012fba7fc7eSJung-uk Kim     /* TBD: NOT IMPLEMENTED */
101353289f6aSNate Lawson     /* Fifth child is the [optional] ParameterPathString */
101453289f6aSNate Lawson     /* Sixth child is the [optional] ParameterData */
101553289f6aSNate Lawson 
101653289f6aSNate Lawson     Next = Next->Asl.Next;
101753289f6aSNate Lawson     if (Next->Asl.ParseOpcode == DEFAULT_ARG)
101853289f6aSNate Lawson     {
101953289f6aSNate Lawson         Next->Asl.AmlLength = 1;
102053289f6aSNate Lawson         Next->Asl.ParseOpcode = ZERO;
102153289f6aSNate Lawson         OpcGenerateAmlOpcode (Next);
102253289f6aSNate Lawson     }
102353289f6aSNate Lawson 
102453289f6aSNate Lawson 
102553289f6aSNate Lawson     Next = Next->Asl.Next;
102653289f6aSNate Lawson     if (Next->Asl.ParseOpcode == DEFAULT_ARG)
102753289f6aSNate Lawson     {
102853289f6aSNate Lawson         Next->Asl.AmlLength = 1;
102953289f6aSNate Lawson         Next->Asl.ParseOpcode = ZERO;
103053289f6aSNate Lawson         OpcGenerateAmlOpcode (Next);
103153289f6aSNate Lawson     }
1032fba7fc7eSJung-uk Kim #endif
103353289f6aSNate Lawson }
103453289f6aSNate Lawson 
103553289f6aSNate Lawson 
103653289f6aSNate Lawson /*******************************************************************************
103753289f6aSNate Lawson  *
103853289f6aSNate Lawson  * FUNCTION:    OpnDoDefinitionBlock
103953289f6aSNate Lawson  *
104053289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
104153289f6aSNate Lawson  *
104253289f6aSNate Lawson  * RETURN:      None
104353289f6aSNate Lawson  *
104453289f6aSNate Lawson  * DESCRIPTION: Construct the AML operands for the DEFINITIONBLOCK ASL keyword
104553289f6aSNate Lawson  *
104653289f6aSNate Lawson  ******************************************************************************/
104753289f6aSNate Lawson 
1048fba7fc7eSJung-uk Kim static void
OpnDoDefinitionBlock(ACPI_PARSE_OBJECT * Op)104953289f6aSNate Lawson OpnDoDefinitionBlock (
105053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
105153289f6aSNate Lawson {
105253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Child;
105353289f6aSNate Lawson     ACPI_SIZE               Length;
1054a9f12690SJung-uk Kim     UINT32                  i;
1055a9f12690SJung-uk Kim     char                    *Filename;
105644b0f624SJung-uk Kim     ACPI_STATUS             Status;
105753289f6aSNate Lawson 
105853289f6aSNate Lawson 
105953289f6aSNate Lawson     /*
106053289f6aSNate Lawson      * These nodes get stuffed into the table header. They are special
106153289f6aSNate Lawson      * cased when the table is written to the output file.
106253289f6aSNate Lawson      *
106353289f6aSNate Lawson      * Mark all of these nodes as non-usable so they won't get output
106453289f6aSNate Lawson      * as AML opcodes!
106553289f6aSNate Lawson      */
106653289f6aSNate Lawson 
10671a39cfb0SJung-uk Kim     /* Get AML filename. Use it if non-null */
106853289f6aSNate Lawson 
106953289f6aSNate Lawson     Child = Op->Asl.Child;
10701a39cfb0SJung-uk Kim     if (Child->Asl.Value.Buffer  &&
10711a39cfb0SJung-uk Kim         *Child->Asl.Value.Buffer &&
10726f1f1a63SJung-uk Kim         (AslGbl_UseDefaultAmlFilename))
107353289f6aSNate Lawson     {
1074a9f12690SJung-uk Kim         /*
107544b0f624SJung-uk Kim          * The walk may traverse multiple definition blocks. Switch files
107644b0f624SJung-uk Kim          * to ensure that the correct files are manipulated.
107744b0f624SJung-uk Kim          */
107844b0f624SJung-uk Kim         FlSwitchFileSet (Op->Asl.Filename);
107944b0f624SJung-uk Kim 
108044b0f624SJung-uk Kim         /*
1081a9f12690SJung-uk Kim          * We will use the AML filename that is embedded in the source file
1082a9f12690SJung-uk Kim          * for the output filename.
1083a9f12690SJung-uk Kim          */
10846f1f1a63SJung-uk Kim         Filename = UtLocalCacheCalloc (strlen (AslGbl_DirectoryPath) +
1085a9f12690SJung-uk Kim             strlen ((char *) Child->Asl.Value.Buffer) + 1);
1086a9f12690SJung-uk Kim 
1087a9f12690SJung-uk Kim         /* Prepend the current directory path */
1088a9f12690SJung-uk Kim 
10896f1f1a63SJung-uk Kim         strcpy (Filename, AslGbl_DirectoryPath);
1090a9f12690SJung-uk Kim         strcat (Filename, (char *) Child->Asl.Value.Buffer);
1091a9f12690SJung-uk Kim 
10926f1f1a63SJung-uk Kim         AslGbl_OutputFilenamePrefix = Filename;
10936f1f1a63SJung-uk Kim         UtConvertBackslashes (AslGbl_OutputFilenamePrefix);
109444b0f624SJung-uk Kim 
109544b0f624SJung-uk Kim         /*
109644b0f624SJung-uk Kim          * Use the definition block file parameter instead of the input
109744b0f624SJung-uk Kim          * filename. Since all files were opened previously, remove the
109844b0f624SJung-uk Kim          * existing file and open a new file with the name of this
1099cfd1ed46SJung-uk Kim          * definition block parameter. Since AML code generation has yet
110044b0f624SJung-uk Kim          * to happen, the previous file can be removed without any impacts.
110144b0f624SJung-uk Kim          */
110244b0f624SJung-uk Kim         FlCloseFile (ASL_FILE_AML_OUTPUT);
110344b0f624SJung-uk Kim         FlDeleteFile (ASL_FILE_AML_OUTPUT);
110444b0f624SJung-uk Kim         Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix);
110544b0f624SJung-uk Kim         if (ACPI_FAILURE (Status))
110644b0f624SJung-uk Kim         {
110744b0f624SJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_OUTPUT_FILE_OPEN, NULL, NULL);
110844b0f624SJung-uk Kim             return;
110944b0f624SJung-uk Kim         }
111053289f6aSNate Lawson     }
1111f8146b88SJung-uk Kim 
111253289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
111353289f6aSNate Lawson 
111453289f6aSNate Lawson     /* Signature */
111553289f6aSNate Lawson 
111653289f6aSNate Lawson     Child = Child->Asl.Next;
111753289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
111853289f6aSNate Lawson     if (Child->Asl.Value.String)
111953289f6aSNate Lawson     {
112044b0f624SJung-uk Kim         AslGbl_FilesList->TableSignature = Child->Asl.Value.String;
11216f1f1a63SJung-uk Kim         AslGbl_TableSignature = Child->Asl.Value.String;
1122278f0de6SJung-uk Kim         if (strlen (AslGbl_TableSignature) != ACPI_NAMESEG_SIZE)
112353289f6aSNate Lawson         {
1124fba7fc7eSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
1125835b56bfSJung-uk Kim                 "Length must be exactly 4 characters");
112653289f6aSNate Lawson         }
112753289f6aSNate Lawson 
1128278f0de6SJung-uk Kim         for (i = 0; i < ACPI_NAMESEG_SIZE; i++)
112953289f6aSNate Lawson         {
11306f1f1a63SJung-uk Kim             if (!isalnum ((int) AslGbl_TableSignature[i]))
113153289f6aSNate Lawson             {
1132fba7fc7eSJung-uk Kim                 AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
1133fba7fc7eSJung-uk Kim                     "Contains non-alphanumeric characters");
113453289f6aSNate Lawson             }
113553289f6aSNate Lawson         }
113653289f6aSNate Lawson     }
113753289f6aSNate Lawson 
113853289f6aSNate Lawson     /* Revision */
113953289f6aSNate Lawson 
114053289f6aSNate Lawson     Child = Child->Asl.Next;
114153289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
1142835b56bfSJung-uk Kim 
11431a39cfb0SJung-uk Kim     /*
11441a39cfb0SJung-uk Kim      * We used the revision to set the integer width earlier
11451a39cfb0SJung-uk Kim      */
114653289f6aSNate Lawson 
114753289f6aSNate Lawson     /* OEMID */
114853289f6aSNate Lawson 
114953289f6aSNate Lawson     Child = Child->Asl.Next;
115053289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
1151835b56bfSJung-uk Kim     if (Child->Asl.Value.String &&
1152835b56bfSJung-uk Kim         strlen (Child->Asl.Value.String) > ACPI_OEM_ID_SIZE)
1153835b56bfSJung-uk Kim     {
1154835b56bfSJung-uk Kim         AslError (ASL_ERROR, ASL_MSG_OEM_ID, Child,
1155835b56bfSJung-uk Kim             "Length cannot exceed 6 characters");
1156835b56bfSJung-uk Kim     }
115753289f6aSNate Lawson 
115853289f6aSNate Lawson     /* OEM TableID */
115953289f6aSNate Lawson 
116053289f6aSNate Lawson     Child = Child->Asl.Next;
116153289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
116253289f6aSNate Lawson     if (Child->Asl.Value.String)
116353289f6aSNate Lawson     {
11645ef50723SJung-uk Kim         Length = strlen (Child->Asl.Value.String);
1165835b56bfSJung-uk Kim         if (Length > ACPI_OEM_TABLE_ID_SIZE)
1166835b56bfSJung-uk Kim         {
1167835b56bfSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_OEM_TABLE_ID, Child,
1168835b56bfSJung-uk Kim                 "Length cannot exceed 8 characters");
1169835b56bfSJung-uk Kim         }
1170835b56bfSJung-uk Kim 
11716f1f1a63SJung-uk Kim         AslGbl_TableId = UtLocalCacheCalloc (Length + 1);
11726f1f1a63SJung-uk Kim         strcpy (AslGbl_TableId, Child->Asl.Value.String);
117344b0f624SJung-uk Kim         AslGbl_FilesList->TableId = AslGbl_TableId;
117453289f6aSNate Lawson 
1175bf6fac21SJung-uk Kim         /*
1176bf6fac21SJung-uk Kim          * Convert anything non-alphanumeric to an underscore. This
1177bf6fac21SJung-uk Kim          * allows us to use the TableID to generate unique C symbols.
1178bf6fac21SJung-uk Kim          */
117953289f6aSNate Lawson         for (i = 0; i < Length; i++)
118053289f6aSNate Lawson         {
11816f1f1a63SJung-uk Kim             if (!isalnum ((int) AslGbl_TableId[i]))
118253289f6aSNate Lawson             {
11836f1f1a63SJung-uk Kim                 AslGbl_TableId[i] = '_';
118453289f6aSNate Lawson             }
118553289f6aSNate Lawson         }
118653289f6aSNate Lawson     }
118753289f6aSNate Lawson 
118853289f6aSNate Lawson     /* OEM Revision */
118953289f6aSNate Lawson 
119053289f6aSNate Lawson     Child = Child->Asl.Next;
119153289f6aSNate Lawson     Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
119253289f6aSNate Lawson }
119353289f6aSNate Lawson 
119453289f6aSNate Lawson 
119553289f6aSNate Lawson /*******************************************************************************
119653289f6aSNate Lawson  *
119753289f6aSNate Lawson  * FUNCTION:    UtGetArg
119853289f6aSNate Lawson  *
119953289f6aSNate Lawson  * PARAMETERS:  Op              - Get an argument for this op
120053289f6aSNate Lawson  *              Argn            - Nth argument to get
120153289f6aSNate Lawson  *
120253289f6aSNate Lawson  * RETURN:      The argument (as an Op object). NULL if argument does not exist
120353289f6aSNate Lawson  *
120453289f6aSNate Lawson  * DESCRIPTION: Get the specified op's argument (peer)
120553289f6aSNate Lawson  *
120653289f6aSNate Lawson  ******************************************************************************/
120753289f6aSNate Lawson 
120853289f6aSNate Lawson ACPI_PARSE_OBJECT *
UtGetArg(ACPI_PARSE_OBJECT * Op,UINT32 Argn)120953289f6aSNate Lawson UtGetArg (
121053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
121153289f6aSNate Lawson     UINT32                  Argn)
121253289f6aSNate Lawson {
121353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Arg = NULL;
121453289f6aSNate Lawson 
121553289f6aSNate Lawson 
121653289f6aSNate Lawson     /* Get the requested argument object */
121753289f6aSNate Lawson 
121853289f6aSNate Lawson     Arg = Op->Asl.Child;
121953289f6aSNate Lawson     while (Arg && Argn)
122053289f6aSNate Lawson     {
122153289f6aSNate Lawson         Argn--;
122253289f6aSNate Lawson         Arg = Arg->Asl.Next;
122353289f6aSNate Lawson     }
122453289f6aSNate Lawson 
122553289f6aSNate Lawson     return (Arg);
122653289f6aSNate Lawson }
122753289f6aSNate Lawson 
122853289f6aSNate Lawson 
122953289f6aSNate Lawson /*******************************************************************************
123053289f6aSNate Lawson  *
123153289f6aSNate Lawson  * FUNCTION:    OpnAttachNameToNode
123253289f6aSNate Lawson  *
123353289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
123453289f6aSNate Lawson  *
123553289f6aSNate Lawson  * RETURN:      None
123653289f6aSNate Lawson  *
123753289f6aSNate Lawson  * DESCRIPTION: For the named ASL/AML operators, get the actual name from the
123853289f6aSNate Lawson  *              argument list and attach it to the parent node so that we
123953289f6aSNate Lawson  *              can get to it quickly later.
124053289f6aSNate Lawson  *
124153289f6aSNate Lawson  ******************************************************************************/
124253289f6aSNate Lawson 
1243fba7fc7eSJung-uk Kim static void
OpnAttachNameToNode(ACPI_PARSE_OBJECT * Op)124453289f6aSNate Lawson OpnAttachNameToNode (
124553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
124653289f6aSNate Lawson {
124753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Child = NULL;
124853289f6aSNate Lawson 
124953289f6aSNate Lawson 
1250f8146b88SJung-uk Kim     switch (Op->Asl.AmlOpcode)
125153289f6aSNate Lawson     {
125253289f6aSNate Lawson     case AML_DATA_REGION_OP:
125353289f6aSNate Lawson     case AML_DEVICE_OP:
125453289f6aSNate Lawson     case AML_EVENT_OP:
1255f8146b88SJung-uk Kim     case AML_EXTERNAL_OP:
125653289f6aSNate Lawson     case AML_METHOD_OP:
125753289f6aSNate Lawson     case AML_MUTEX_OP:
125853289f6aSNate Lawson     case AML_REGION_OP:
12590d84335fSJung-uk Kim     case AML_POWER_RESOURCE_OP:
126053289f6aSNate Lawson     case AML_PROCESSOR_OP:
126153289f6aSNate Lawson     case AML_THERMAL_ZONE_OP:
126253289f6aSNate Lawson     case AML_NAME_OP:
126353289f6aSNate Lawson     case AML_SCOPE_OP:
126453289f6aSNate Lawson 
126553289f6aSNate Lawson         Child = UtGetArg (Op, 0);
126653289f6aSNate Lawson         break;
126753289f6aSNate Lawson 
126853289f6aSNate Lawson     case AML_ALIAS_OP:
126953289f6aSNate Lawson 
127053289f6aSNate Lawson         Child = UtGetArg (Op, 1);
127153289f6aSNate Lawson         break;
127253289f6aSNate Lawson 
127353289f6aSNate Lawson     case AML_CREATE_BIT_FIELD_OP:
127453289f6aSNate Lawson     case AML_CREATE_BYTE_FIELD_OP:
127553289f6aSNate Lawson     case AML_CREATE_WORD_FIELD_OP:
127653289f6aSNate Lawson     case AML_CREATE_DWORD_FIELD_OP:
127753289f6aSNate Lawson     case AML_CREATE_QWORD_FIELD_OP:
127853289f6aSNate Lawson 
127953289f6aSNate Lawson         Child = UtGetArg (Op, 2);
128053289f6aSNate Lawson         break;
128153289f6aSNate Lawson 
128253289f6aSNate Lawson     case AML_CREATE_FIELD_OP:
128353289f6aSNate Lawson 
128453289f6aSNate Lawson         Child = UtGetArg (Op, 3);
128553289f6aSNate Lawson         break;
128653289f6aSNate Lawson 
128753289f6aSNate Lawson     case AML_BANK_FIELD_OP:
128853289f6aSNate Lawson     case AML_INDEX_FIELD_OP:
128953289f6aSNate Lawson     case AML_FIELD_OP:
129053289f6aSNate Lawson 
129153289f6aSNate Lawson         return;
129253289f6aSNate Lawson 
129353289f6aSNate Lawson     default:
1294a9d8d09cSJung-uk Kim 
129553289f6aSNate Lawson         return;
129653289f6aSNate Lawson     }
129753289f6aSNate Lawson 
129853289f6aSNate Lawson     if (Child)
129953289f6aSNate Lawson     {
130053289f6aSNate Lawson         UtAttachNamepathToOwner (Op, Child);
130153289f6aSNate Lawson     }
130253289f6aSNate Lawson }
130353289f6aSNate Lawson 
130453289f6aSNate Lawson 
130553289f6aSNate Lawson /*******************************************************************************
130653289f6aSNate Lawson  *
130753289f6aSNate Lawson  * FUNCTION:    OpnGenerateAmlOperands
130853289f6aSNate Lawson  *
130953289f6aSNate Lawson  * PARAMETERS:  Op        - The parent parse node
131053289f6aSNate Lawson  *
131153289f6aSNate Lawson  * RETURN:      None
131253289f6aSNate Lawson  *
131353289f6aSNate Lawson  * DESCRIPTION: Prepare nodes to be output as AML data and operands. The more
131453289f6aSNate Lawson  *              complex AML opcodes require processing of the child nodes
131553289f6aSNate Lawson  *              (arguments/operands).
131653289f6aSNate Lawson  *
131753289f6aSNate Lawson  ******************************************************************************/
131853289f6aSNate Lawson 
131953289f6aSNate Lawson void
OpnGenerateAmlOperands(ACPI_PARSE_OBJECT * Op)132053289f6aSNate Lawson OpnGenerateAmlOperands (
132153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
132253289f6aSNate Lawson {
132353289f6aSNate Lawson 
132453289f6aSNate Lawson 
132553289f6aSNate Lawson     if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
132653289f6aSNate Lawson     {
132753289f6aSNate Lawson         return;
132853289f6aSNate Lawson     }
132953289f6aSNate Lawson 
133053289f6aSNate Lawson     switch (Op->Asl.ParseOpcode)
133153289f6aSNate Lawson     {
1332f8146b88SJung-uk Kim     case PARSEOP_DEFINITION_BLOCK:
1333a9d8d09cSJung-uk Kim 
133453289f6aSNate Lawson         OpnDoDefinitionBlock (Op);
133553289f6aSNate Lawson         break;
133653289f6aSNate Lawson 
133753289f6aSNate Lawson     case PARSEOP_METHOD:
1338a9d8d09cSJung-uk Kim 
133953289f6aSNate Lawson         OpnDoMethod (Op);
134053289f6aSNate Lawson         break;
134153289f6aSNate Lawson 
1342fba7fc7eSJung-uk Kim     case PARSEOP_MUTEX:
1343a9d8d09cSJung-uk Kim 
1344fba7fc7eSJung-uk Kim         OpnDoMutex (Op);
1345fba7fc7eSJung-uk Kim         break;
1346fba7fc7eSJung-uk Kim 
134753289f6aSNate Lawson     case PARSEOP_FIELD:
1348a9d8d09cSJung-uk Kim 
134953289f6aSNate Lawson         OpnDoField (Op);
135053289f6aSNate Lawson         break;
135153289f6aSNate Lawson 
135253289f6aSNate Lawson     case PARSEOP_INDEXFIELD:
1353a9d8d09cSJung-uk Kim 
135453289f6aSNate Lawson         OpnDoIndexField (Op);
135553289f6aSNate Lawson         break;
135653289f6aSNate Lawson 
135753289f6aSNate Lawson     case PARSEOP_BANKFIELD:
1358a9d8d09cSJung-uk Kim 
135953289f6aSNate Lawson         OpnDoBankField (Op);
136053289f6aSNate Lawson         break;
136153289f6aSNate Lawson 
136253289f6aSNate Lawson     case PARSEOP_BUFFER:
1363a9d8d09cSJung-uk Kim 
136453289f6aSNate Lawson         OpnDoBuffer (Op);
136553289f6aSNate Lawson         break;
136653289f6aSNate Lawson 
136753289f6aSNate Lawson     case PARSEOP_LOADTABLE:
1368a9d8d09cSJung-uk Kim 
136953289f6aSNate Lawson         OpnDoLoadTable (Op);
137053289f6aSNate Lawson         break;
137153289f6aSNate Lawson 
137253289f6aSNate Lawson     case PARSEOP_OPERATIONREGION:
1373a9d8d09cSJung-uk Kim 
137453289f6aSNate Lawson         OpnDoRegion (Op);
137553289f6aSNate Lawson         break;
137653289f6aSNate Lawson 
137753289f6aSNate Lawson     case PARSEOP_RESOURCETEMPLATE:
1378a9d8d09cSJung-uk Kim 
137953289f6aSNate Lawson         RsDoResourceTemplate (Op);
138053289f6aSNate Lawson         break;
138153289f6aSNate Lawson 
138253289f6aSNate Lawson     case PARSEOP_NAMESEG:
138353289f6aSNate Lawson     case PARSEOP_NAMESTRING:
138453289f6aSNate Lawson     case PARSEOP_METHODCALL:
138553289f6aSNate Lawson     case PARSEOP_STRING_LITERAL:
138653289f6aSNate Lawson     default:
1387a9d8d09cSJung-uk Kim 
138853289f6aSNate Lawson         break;
138953289f6aSNate Lawson     }
139053289f6aSNate Lawson 
139153289f6aSNate Lawson     /* TBD: move */
139253289f6aSNate Lawson 
139353289f6aSNate Lawson     OpnAttachNameToNode (Op);
139453289f6aSNate Lawson }
1395