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