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*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, 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 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 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 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 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 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 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 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 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 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 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 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 * 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 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 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