xref: /freebsd/sys/contrib/dev/acpica/compiler/aslopcodes.c (revision efcc2a30547c400649a351e85e6cd97dab8f3817)
153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslopcode - AML opcode generation
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
8*efcc2a30SJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
953289f6aSNate Lawson  * All rights reserved.
1053289f6aSNate Lawson  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2553289f6aSNate Lawson  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
2953289f6aSNate Lawson  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
4353289f6aSNate Lawson 
4453289f6aSNate Lawson 
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
4653289f6aSNate Lawson #include "aslcompiler.y.h"
47ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
4853289f6aSNate Lawson 
4953289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
5053289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslopcodes")
5153289f6aSNate Lawson 
5253289f6aSNate Lawson 
53fba7fc7eSJung-uk Kim /* Local prototypes */
54fba7fc7eSJung-uk Kim 
55fba7fc7eSJung-uk Kim static void
56fba7fc7eSJung-uk Kim OpcDoAccessAs (
57fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
58fba7fc7eSJung-uk Kim 
59fba7fc7eSJung-uk Kim static void
603f0275a0SJung-uk Kim OpcDoConnection (
613f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
623f0275a0SJung-uk Kim 
633f0275a0SJung-uk Kim static void
64fba7fc7eSJung-uk Kim OpcDoUnicode (
65fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
66fba7fc7eSJung-uk Kim 
67fba7fc7eSJung-uk Kim static void
68fba7fc7eSJung-uk Kim OpcDoEisaId (
69fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
70fba7fc7eSJung-uk Kim 
71fba7fc7eSJung-uk Kim static void
72fba7fc7eSJung-uk Kim OpcDoUuId (
73fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op);
74fba7fc7eSJung-uk Kim 
75fba7fc7eSJung-uk Kim 
76fba7fc7eSJung-uk Kim /*******************************************************************************
77fba7fc7eSJung-uk Kim  *
78fba7fc7eSJung-uk Kim  * FUNCTION:    OpcAmlOpcodeUpdateWalk
79fba7fc7eSJung-uk Kim  *
80fba7fc7eSJung-uk Kim  * PARAMETERS:  ASL_WALK_CALLBACK
81fba7fc7eSJung-uk Kim  *
82fba7fc7eSJung-uk Kim  * RETURN:      Status
83fba7fc7eSJung-uk Kim  *
84fba7fc7eSJung-uk Kim  * DESCRIPTION: Opcode update walk, ascending callback
85fba7fc7eSJung-uk Kim  *
86fba7fc7eSJung-uk Kim  ******************************************************************************/
87fba7fc7eSJung-uk Kim 
88fba7fc7eSJung-uk Kim ACPI_STATUS
89fba7fc7eSJung-uk Kim OpcAmlOpcodeUpdateWalk (
90fba7fc7eSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
91fba7fc7eSJung-uk Kim     UINT32                  Level,
92fba7fc7eSJung-uk Kim     void                    *Context)
93fba7fc7eSJung-uk Kim {
94fba7fc7eSJung-uk Kim 
95fba7fc7eSJung-uk Kim     /*
96fba7fc7eSJung-uk Kim      * Handle the Package() case where the actual opcode cannot be determined
97fba7fc7eSJung-uk Kim      * until the PackageLength operand has been folded and minimized.
98fba7fc7eSJung-uk Kim      * (PackageOp versus VarPackageOp)
99fba7fc7eSJung-uk Kim      *
100fba7fc7eSJung-uk Kim      * This is (as of ACPI 3.0) the only case where the AML opcode can change
101fba7fc7eSJung-uk Kim      * based upon the value of a parameter.
102fba7fc7eSJung-uk Kim      *
103fba7fc7eSJung-uk Kim      * The parser always inserts a VarPackage opcode, which can possibly be
104fba7fc7eSJung-uk Kim      * optimized to a Package opcode.
105fba7fc7eSJung-uk Kim      */
106fba7fc7eSJung-uk Kim     if (Op->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE)
107fba7fc7eSJung-uk Kim     {
108fba7fc7eSJung-uk Kim         OpnDoPackage (Op);
109fba7fc7eSJung-uk Kim     }
110fba7fc7eSJung-uk Kim 
111fba7fc7eSJung-uk Kim     return (AE_OK);
112fba7fc7eSJung-uk Kim }
113fba7fc7eSJung-uk Kim 
114fba7fc7eSJung-uk Kim 
11553289f6aSNate Lawson /*******************************************************************************
11653289f6aSNate Lawson  *
11753289f6aSNate Lawson  * FUNCTION:    OpcAmlOpcodeWalk
11853289f6aSNate Lawson  *
11953289f6aSNate Lawson  * PARAMETERS:  ASL_WALK_CALLBACK
12053289f6aSNate Lawson  *
12153289f6aSNate Lawson  * RETURN:      Status
12253289f6aSNate Lawson  *
12353289f6aSNate Lawson  * DESCRIPTION: Parse tree walk to generate both the AML opcodes and the AML
12453289f6aSNate Lawson  *              operands.
12553289f6aSNate Lawson  *
12653289f6aSNate Lawson  ******************************************************************************/
12753289f6aSNate Lawson 
12853289f6aSNate Lawson ACPI_STATUS
12953289f6aSNate Lawson OpcAmlOpcodeWalk (
13053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op,
13153289f6aSNate Lawson     UINT32                  Level,
13253289f6aSNate Lawson     void                    *Context)
13353289f6aSNate Lawson {
13453289f6aSNate Lawson 
13553289f6aSNate Lawson     TotalParseNodes++;
13653289f6aSNate Lawson 
13753289f6aSNate Lawson     OpcGenerateAmlOpcode (Op);
13853289f6aSNate Lawson     OpnGenerateAmlOperands (Op);
13953289f6aSNate Lawson     return (AE_OK);
14053289f6aSNate Lawson }
14153289f6aSNate Lawson 
14253289f6aSNate Lawson 
14353289f6aSNate Lawson /*******************************************************************************
14453289f6aSNate Lawson  *
14553289f6aSNate Lawson  * FUNCTION:    OpcGetIntegerWidth
14653289f6aSNate Lawson  *
14753289f6aSNate Lawson  * PARAMETERS:  Op          - DEFINITION BLOCK op
14853289f6aSNate Lawson  *
14953289f6aSNate Lawson  * RETURN:      none
15053289f6aSNate Lawson  *
15153289f6aSNate Lawson  * DESCRIPTION: Extract integer width from the table revision
15253289f6aSNate Lawson  *
15353289f6aSNate Lawson  ******************************************************************************/
15453289f6aSNate Lawson 
15553289f6aSNate Lawson void
15653289f6aSNate Lawson OpcGetIntegerWidth (
15753289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
15853289f6aSNate Lawson {
15953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Child;
16053289f6aSNate Lawson 
161fba7fc7eSJung-uk Kim 
16253289f6aSNate Lawson     if (!Op)
16353289f6aSNate Lawson     {
16453289f6aSNate Lawson         return;
16553289f6aSNate Lawson     }
16653289f6aSNate Lawson 
167fba7fc7eSJung-uk Kim     if (Gbl_RevisionOverride)
168fba7fc7eSJung-uk Kim     {
169fba7fc7eSJung-uk Kim         AcpiUtSetIntegerWidth (Gbl_RevisionOverride);
170fba7fc7eSJung-uk Kim     }
171fba7fc7eSJung-uk Kim     else
172fba7fc7eSJung-uk Kim     {
17353289f6aSNate Lawson         Child = Op->Asl.Child;
17453289f6aSNate Lawson         Child = Child->Asl.Next;
17553289f6aSNate Lawson         Child = Child->Asl.Next;
17653289f6aSNate Lawson 
17753289f6aSNate Lawson         /* Use the revision to set the integer width */
17853289f6aSNate Lawson 
17953289f6aSNate Lawson         AcpiUtSetIntegerWidth ((UINT8) Child->Asl.Value.Integer);
18053289f6aSNate Lawson     }
181fba7fc7eSJung-uk Kim }
18253289f6aSNate Lawson 
18353289f6aSNate Lawson 
18453289f6aSNate Lawson /*******************************************************************************
18553289f6aSNate Lawson  *
18653289f6aSNate Lawson  * FUNCTION:    OpcSetOptimalIntegerSize
18753289f6aSNate Lawson  *
18853289f6aSNate Lawson  * PARAMETERS:  Op        - A parse tree node
18953289f6aSNate Lawson  *
19053289f6aSNate Lawson  * RETURN:      Integer width, in bytes. Also sets the node AML opcode to the
19153289f6aSNate Lawson  *              optimal integer AML prefix opcode.
19253289f6aSNate Lawson  *
19353289f6aSNate Lawson  * DESCRIPTION: Determine the optimal AML encoding of an integer. All leading
19453289f6aSNate Lawson  *              zeros can be truncated to squeeze the integer into the
19553289f6aSNate Lawson  *              minimal number of AML bytes.
19653289f6aSNate Lawson  *
19753289f6aSNate Lawson  ******************************************************************************/
19853289f6aSNate Lawson 
19953289f6aSNate Lawson UINT32
20053289f6aSNate Lawson OpcSetOptimalIntegerSize (
20153289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
20253289f6aSNate Lawson {
20353289f6aSNate Lawson 
204fba7fc7eSJung-uk Kim #if 0
20553289f6aSNate Lawson     /*
206fba7fc7eSJung-uk Kim      * TBD: - we don't want to optimize integers in the block header, but the
207fba7fc7eSJung-uk Kim      * code below does not work correctly.
208fba7fc7eSJung-uk Kim      */
209c8466860SMark Santcroos     if (Op->Asl.Parent &&
210c8466860SMark Santcroos         Op->Asl.Parent->Asl.Parent &&
211c8466860SMark Santcroos        (Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK))
212c8466860SMark Santcroos     {
2138ef1a331SJung-uk Kim         return (0);
214c8466860SMark Santcroos     }
215fba7fc7eSJung-uk Kim #endif
216c8466860SMark Santcroos 
217c8466860SMark Santcroos     /*
21853289f6aSNate Lawson      * Check for the special AML integers first - Zero, One, Ones.
21953289f6aSNate Lawson      * These are single-byte opcodes that are the smallest possible
22053289f6aSNate Lawson      * representation of an integer.
22153289f6aSNate Lawson      *
22253289f6aSNate Lawson      * This optimization is optional.
22353289f6aSNate Lawson      */
22453289f6aSNate Lawson     if (Gbl_IntegerOptimizationFlag)
22553289f6aSNate Lawson     {
22653289f6aSNate Lawson         switch (Op->Asl.Value.Integer)
22753289f6aSNate Lawson         {
22853289f6aSNate Lawson         case 0:
22953289f6aSNate Lawson 
23053289f6aSNate Lawson             Op->Asl.AmlOpcode = AML_ZERO_OP;
231fba7fc7eSJung-uk Kim             AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
232fba7fc7eSJung-uk Kim                 Op, "Zero");
2338ef1a331SJung-uk Kim             return (1);
23453289f6aSNate Lawson 
23553289f6aSNate Lawson         case 1:
23653289f6aSNate Lawson 
23753289f6aSNate Lawson             Op->Asl.AmlOpcode = AML_ONE_OP;
238fba7fc7eSJung-uk Kim             AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
239fba7fc7eSJung-uk Kim                 Op, "One");
2408ef1a331SJung-uk Kim             return (1);
24153289f6aSNate Lawson 
24253289f6aSNate Lawson         case ACPI_UINT32_MAX:
24353289f6aSNate Lawson 
24453289f6aSNate Lawson             /* Check for table integer width (32 or 64) */
24553289f6aSNate Lawson 
24653289f6aSNate Lawson             if (AcpiGbl_IntegerByteWidth == 4)
24753289f6aSNate Lawson             {
24853289f6aSNate Lawson                 Op->Asl.AmlOpcode = AML_ONES_OP;
249fba7fc7eSJung-uk Kim                 AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
250fba7fc7eSJung-uk Kim                     Op, "Ones");
2518ef1a331SJung-uk Kim                 return (1);
25253289f6aSNate Lawson             }
25353289f6aSNate Lawson             break;
25453289f6aSNate Lawson 
2559a179dd8SJung-uk Kim         case ACPI_UINT64_MAX:
25653289f6aSNate Lawson 
25753289f6aSNate Lawson             /* Check for table integer width (32 or 64) */
25853289f6aSNate Lawson 
25953289f6aSNate Lawson             if (AcpiGbl_IntegerByteWidth == 8)
26053289f6aSNate Lawson             {
26153289f6aSNate Lawson                 Op->Asl.AmlOpcode = AML_ONES_OP;
262fba7fc7eSJung-uk Kim                 AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
263fba7fc7eSJung-uk Kim                     Op, "Ones");
2648ef1a331SJung-uk Kim                 return (1);
26553289f6aSNate Lawson             }
26653289f6aSNate Lawson             break;
26753289f6aSNate Lawson 
26853289f6aSNate Lawson         default:
26953289f6aSNate Lawson             break;
27053289f6aSNate Lawson         }
27153289f6aSNate Lawson     }
27253289f6aSNate Lawson 
27353289f6aSNate Lawson     /* Find the best fit using the various AML integer prefixes */
27453289f6aSNate Lawson 
27553289f6aSNate Lawson     if (Op->Asl.Value.Integer <= ACPI_UINT8_MAX)
27653289f6aSNate Lawson     {
27753289f6aSNate Lawson         Op->Asl.AmlOpcode = AML_BYTE_OP;
2788ef1a331SJung-uk Kim         return (1);
27953289f6aSNate Lawson     }
28053289f6aSNate Lawson     if (Op->Asl.Value.Integer <= ACPI_UINT16_MAX)
28153289f6aSNate Lawson     {
28253289f6aSNate Lawson         Op->Asl.AmlOpcode = AML_WORD_OP;
2838ef1a331SJung-uk Kim         return (2);
28453289f6aSNate Lawson     }
28553289f6aSNate Lawson     if (Op->Asl.Value.Integer <= ACPI_UINT32_MAX)
28653289f6aSNate Lawson     {
28753289f6aSNate Lawson         Op->Asl.AmlOpcode = AML_DWORD_OP;
2888ef1a331SJung-uk Kim         return (4);
28953289f6aSNate Lawson     }
29053289f6aSNate Lawson     else
29153289f6aSNate Lawson     {
292fba7fc7eSJung-uk Kim         if (AcpiGbl_IntegerByteWidth == 4)
293fba7fc7eSJung-uk Kim         {
294fba7fc7eSJung-uk Kim             AslError (ASL_WARNING, ASL_MSG_INTEGER_LENGTH,
295fba7fc7eSJung-uk Kim                 Op, NULL);
296fba7fc7eSJung-uk Kim 
297fba7fc7eSJung-uk Kim             if (!Gbl_IgnoreErrors)
298fba7fc7eSJung-uk Kim             {
299fba7fc7eSJung-uk Kim                 /* Truncate the integer to 32-bit */
300fba7fc7eSJung-uk Kim                 Op->Asl.AmlOpcode = AML_DWORD_OP;
3018ef1a331SJung-uk Kim                 return (4);
302fba7fc7eSJung-uk Kim             }
303fba7fc7eSJung-uk Kim         }
304fba7fc7eSJung-uk Kim 
30553289f6aSNate Lawson         Op->Asl.AmlOpcode = AML_QWORD_OP;
3068ef1a331SJung-uk Kim         return (8);
30753289f6aSNate Lawson     }
30853289f6aSNate Lawson }
30953289f6aSNate Lawson 
31053289f6aSNate Lawson 
31153289f6aSNate Lawson /*******************************************************************************
31253289f6aSNate Lawson  *
31353289f6aSNate Lawson  * FUNCTION:    OpcDoAccessAs
31453289f6aSNate Lawson  *
31553289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node
31653289f6aSNate Lawson  *
31753289f6aSNate Lawson  * RETURN:      None
31853289f6aSNate Lawson  *
31953289f6aSNate Lawson  * DESCRIPTION: Implement the ACCESS_AS ASL keyword.
32053289f6aSNate Lawson  *
32153289f6aSNate Lawson  ******************************************************************************/
32253289f6aSNate Lawson 
323fba7fc7eSJung-uk Kim static void
32453289f6aSNate Lawson OpcDoAccessAs (
32553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
32653289f6aSNate Lawson {
3273f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *TypeOp;
3283f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *AttribOp;
3293f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *LengthOp;
3303f0275a0SJung-uk Kim     UINT8                   Attribute;
33153289f6aSNate Lawson 
33253289f6aSNate Lawson 
33353289f6aSNate Lawson     Op->Asl.AmlOpcodeLength = 1;
3343f0275a0SJung-uk Kim     TypeOp = Op->Asl.Child;
33553289f6aSNate Lawson 
33653289f6aSNate Lawson     /* First child is the access type */
33753289f6aSNate Lawson 
3383f0275a0SJung-uk Kim     TypeOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
3393f0275a0SJung-uk Kim     TypeOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
34053289f6aSNate Lawson 
34153289f6aSNate Lawson     /* Second child is the optional access attribute */
34253289f6aSNate Lawson 
3433f0275a0SJung-uk Kim     AttribOp = TypeOp->Asl.Next;
3443f0275a0SJung-uk Kim     if (AttribOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
34553289f6aSNate Lawson     {
3463f0275a0SJung-uk Kim         AttribOp->Asl.Value.Integer = 0;
34753289f6aSNate Lawson     }
3483f0275a0SJung-uk Kim     AttribOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
3493f0275a0SJung-uk Kim     AttribOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
3503f0275a0SJung-uk Kim 
3513f0275a0SJung-uk Kim     /* Only a few AccessAttributes support AccessLength */
3523f0275a0SJung-uk Kim 
3533f0275a0SJung-uk Kim     Attribute = (UINT8) AttribOp->Asl.Value.Integer;
3543f0275a0SJung-uk Kim     if ((Attribute != AML_FIELD_ATTRIB_MULTIBYTE) &&
3553f0275a0SJung-uk Kim         (Attribute != AML_FIELD_ATTRIB_RAW_BYTES) &&
3563f0275a0SJung-uk Kim         (Attribute != AML_FIELD_ATTRIB_RAW_PROCESS))
3573f0275a0SJung-uk Kim     {
3583f0275a0SJung-uk Kim         return;
3593f0275a0SJung-uk Kim     }
3603f0275a0SJung-uk Kim 
3613f0275a0SJung-uk Kim     Op->Asl.AmlOpcode = AML_FIELD_EXT_ACCESS_OP;
3623f0275a0SJung-uk Kim 
3633f0275a0SJung-uk Kim     /*
3643f0275a0SJung-uk Kim      * Child of Attributes is the AccessLength (required for Multibyte,
3653f0275a0SJung-uk Kim      * RawBytes, RawProcess.)
3663f0275a0SJung-uk Kim      */
3673f0275a0SJung-uk Kim     LengthOp = AttribOp->Asl.Child;
3683f0275a0SJung-uk Kim     if (!LengthOp)
3693f0275a0SJung-uk Kim     {
3703f0275a0SJung-uk Kim         return;
3713f0275a0SJung-uk Kim     }
3723f0275a0SJung-uk Kim 
3733f0275a0SJung-uk Kim     /* TBD: probably can remove */
3743f0275a0SJung-uk Kim 
3753f0275a0SJung-uk Kim     if (LengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
3763f0275a0SJung-uk Kim     {
3773f0275a0SJung-uk Kim         LengthOp->Asl.Value.Integer = 16;
3783f0275a0SJung-uk Kim     }
3793f0275a0SJung-uk Kim 
3803f0275a0SJung-uk Kim     LengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
3813f0275a0SJung-uk Kim     LengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
3823f0275a0SJung-uk Kim }
3833f0275a0SJung-uk Kim 
3843f0275a0SJung-uk Kim 
3853f0275a0SJung-uk Kim /*******************************************************************************
3863f0275a0SJung-uk Kim  *
3873f0275a0SJung-uk Kim  * FUNCTION:    OpcDoConnection
3883f0275a0SJung-uk Kim  *
3893f0275a0SJung-uk Kim  * PARAMETERS:  Op        - Parse node
3903f0275a0SJung-uk Kim  *
3913f0275a0SJung-uk Kim  * RETURN:      None
3923f0275a0SJung-uk Kim  *
3933f0275a0SJung-uk Kim  * DESCRIPTION: Implement the Connection ASL keyword.
3943f0275a0SJung-uk Kim  *
3953f0275a0SJung-uk Kim  ******************************************************************************/
3963f0275a0SJung-uk Kim 
3973f0275a0SJung-uk Kim static void
3983f0275a0SJung-uk Kim OpcDoConnection (
3993f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
4003f0275a0SJung-uk Kim {
4013f0275a0SJung-uk Kim     ASL_RESOURCE_NODE       *Rnode;
4023f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *BufferOp;
4033f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *BufferLengthOp;
4043f0275a0SJung-uk Kim     ACPI_PARSE_OBJECT       *BufferDataOp;
4053f0275a0SJung-uk Kim     UINT8                   State;
4063f0275a0SJung-uk Kim 
4073f0275a0SJung-uk Kim 
4083f0275a0SJung-uk Kim     Op->Asl.AmlOpcodeLength = 1;
4093f0275a0SJung-uk Kim 
4103f0275a0SJung-uk Kim     if (Op->Asl.Child->Asl.AmlOpcode == AML_INT_NAMEPATH_OP)
4113f0275a0SJung-uk Kim     {
4123f0275a0SJung-uk Kim         return;
4133f0275a0SJung-uk Kim     }
4143f0275a0SJung-uk Kim 
4153f0275a0SJung-uk Kim     BufferOp = Op->Asl.Child;
4163f0275a0SJung-uk Kim     BufferLengthOp = BufferOp->Asl.Child;
4173f0275a0SJung-uk Kim     BufferDataOp = BufferLengthOp->Asl.Next;
4183f0275a0SJung-uk Kim 
4193f0275a0SJung-uk Kim     State = ACPI_RSTATE_NORMAL;
4203f0275a0SJung-uk Kim     Rnode = RsDoOneResourceDescriptor (BufferDataOp->Asl.Next, 0, &State);
4213f0275a0SJung-uk Kim     if (!Rnode)
4223f0275a0SJung-uk Kim     {
4233f0275a0SJung-uk Kim         return; /* error */
4243f0275a0SJung-uk Kim     }
4253f0275a0SJung-uk Kim 
4263f0275a0SJung-uk Kim     /*
4273f0275a0SJung-uk Kim      * Transform the nodes into the following
4283f0275a0SJung-uk Kim      *
4293f0275a0SJung-uk Kim      * Op           -> AML_BUFFER_OP
4303f0275a0SJung-uk Kim      * First Child  -> BufferLength
4313f0275a0SJung-uk Kim      * Second Child -> Descriptor Buffer (raw byte data)
4323f0275a0SJung-uk Kim      */
4333f0275a0SJung-uk Kim     BufferOp->Asl.ParseOpcode         = PARSEOP_BUFFER;
4343f0275a0SJung-uk Kim     BufferOp->Asl.AmlOpcode           = AML_BUFFER_OP;
4353f0275a0SJung-uk Kim     BufferOp->Asl.CompileFlags        = NODE_AML_PACKAGE | NODE_IS_RESOURCE_DESC;
4363f0275a0SJung-uk Kim     UtSetParseOpName (BufferOp);
4373f0275a0SJung-uk Kim 
4383f0275a0SJung-uk Kim     BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;
4393f0275a0SJung-uk Kim     BufferLengthOp->Asl.Value.Integer = Rnode->BufferLength;
4403f0275a0SJung-uk Kim     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
4413f0275a0SJung-uk Kim     UtSetParseOpName (BufferLengthOp);
4423f0275a0SJung-uk Kim 
4433f0275a0SJung-uk Kim     BufferDataOp->Asl.ParseOpcode         = PARSEOP_RAW_DATA;
4443f0275a0SJung-uk Kim     BufferDataOp->Asl.AmlOpcode           = AML_RAW_DATA_CHAIN;
4453f0275a0SJung-uk Kim     BufferDataOp->Asl.AmlOpcodeLength     = 0;
4463f0275a0SJung-uk Kim     BufferDataOp->Asl.AmlLength           = Rnode->BufferLength;
4473f0275a0SJung-uk Kim     BufferDataOp->Asl.Value.Buffer        = (UINT8 *) Rnode;
4483f0275a0SJung-uk Kim     UtSetParseOpName (BufferDataOp);
44953289f6aSNate Lawson }
45053289f6aSNate Lawson 
45153289f6aSNate Lawson 
45253289f6aSNate Lawson /*******************************************************************************
45353289f6aSNate Lawson  *
45453289f6aSNate Lawson  * FUNCTION:    OpcDoUnicode
45553289f6aSNate Lawson  *
45653289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node
45753289f6aSNate Lawson  *
45853289f6aSNate Lawson  * RETURN:      None
45953289f6aSNate Lawson  *
46053289f6aSNate Lawson  * DESCRIPTION: Implement the UNICODE ASL "macro".  Convert the input string
46153289f6aSNate Lawson  *              to a unicode buffer. There is no Unicode AML opcode.
46253289f6aSNate Lawson  *
46353289f6aSNate Lawson  * Note:  The Unicode string is 16 bits per character, no leading signature,
46453289f6aSNate Lawson  *        with a 16-bit terminating NULL.
46553289f6aSNate Lawson  *
46653289f6aSNate Lawson  ******************************************************************************/
46753289f6aSNate Lawson 
468fba7fc7eSJung-uk Kim static void
46953289f6aSNate Lawson OpcDoUnicode (
47053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
47153289f6aSNate Lawson {
47253289f6aSNate Lawson     ACPI_PARSE_OBJECT       *InitializerOp;
47353289f6aSNate Lawson     UINT32                  Length;
47453289f6aSNate Lawson     UINT32                  Count;
47553289f6aSNate Lawson     UINT32                  i;
47653289f6aSNate Lawson     UINT8                   *AsciiString;
47753289f6aSNate Lawson     UINT16                  *UnicodeString;
47853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *BufferLengthOp;
47953289f6aSNate Lawson 
48053289f6aSNate Lawson 
48153289f6aSNate Lawson     /* Change op into a buffer object */
48253289f6aSNate Lawson 
48353289f6aSNate Lawson     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
48453289f6aSNate Lawson     Op->Asl.ParseOpcode = PARSEOP_BUFFER;
48553289f6aSNate Lawson     UtSetParseOpName (Op);
48653289f6aSNate Lawson 
48753289f6aSNate Lawson     /* Buffer Length is first, followed by the string */
48853289f6aSNate Lawson 
48953289f6aSNate Lawson     BufferLengthOp = Op->Asl.Child;
49053289f6aSNate Lawson     InitializerOp = BufferLengthOp->Asl.Next;
49153289f6aSNate Lawson 
49253289f6aSNate Lawson     AsciiString = (UINT8 *) InitializerOp->Asl.Value.String;
49353289f6aSNate Lawson 
49453289f6aSNate Lawson     /* Create a new buffer for the Unicode string */
49553289f6aSNate Lawson 
49653289f6aSNate Lawson     Count = strlen (InitializerOp->Asl.Value.String) + 1;
49753289f6aSNate Lawson     Length = Count * sizeof (UINT16);
49853289f6aSNate Lawson     UnicodeString = UtLocalCalloc (Length);
49953289f6aSNate Lawson 
50053289f6aSNate Lawson     /* Convert to Unicode string (including null terminator) */
50153289f6aSNate Lawson 
50253289f6aSNate Lawson     for (i = 0; i < Count; i++)
50353289f6aSNate Lawson     {
50453289f6aSNate Lawson         UnicodeString[i] = (UINT16) AsciiString[i];
50553289f6aSNate Lawson     }
50653289f6aSNate Lawson 
50753289f6aSNate Lawson     /*
50853289f6aSNate Lawson      * Just set the buffer size node to be the buffer length, regardless
50953289f6aSNate Lawson      * of whether it was previously an integer or a default_arg placeholder
51053289f6aSNate Lawson      */
51153289f6aSNate Lawson     BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;
51253289f6aSNate Lawson     BufferLengthOp->Asl.AmlOpcode     = AML_DWORD_OP;
51353289f6aSNate Lawson     BufferLengthOp->Asl.Value.Integer = Length;
51453289f6aSNate Lawson     UtSetParseOpName (BufferLengthOp);
51553289f6aSNate Lawson 
51653289f6aSNate Lawson     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
51753289f6aSNate Lawson 
51853289f6aSNate Lawson     /* The Unicode string is a raw data buffer */
51953289f6aSNate Lawson 
52053289f6aSNate Lawson     InitializerOp->Asl.Value.Buffer   = (UINT8 *) UnicodeString;
52153289f6aSNate Lawson     InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BUFFER;
52253289f6aSNate Lawson     InitializerOp->Asl.AmlLength      = Length;
52353289f6aSNate Lawson     InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;
52453289f6aSNate Lawson     InitializerOp->Asl.Child          = NULL;
52553289f6aSNate Lawson     UtSetParseOpName (InitializerOp);
52653289f6aSNate Lawson }
52753289f6aSNate Lawson 
52853289f6aSNate Lawson 
52953289f6aSNate Lawson /*******************************************************************************
53053289f6aSNate Lawson  *
53153289f6aSNate Lawson  * FUNCTION:    OpcDoEisaId
53253289f6aSNate Lawson  *
53353289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node
53453289f6aSNate Lawson  *
53553289f6aSNate Lawson  * RETURN:      None
53653289f6aSNate Lawson  *
53753289f6aSNate Lawson  * DESCRIPTION: Convert a string EISA ID to numeric representation. See the
53853289f6aSNate Lawson  *              Pnp BIOS Specification for details. Here is an excerpt:
53953289f6aSNate Lawson  *
54053289f6aSNate Lawson  *              A seven character ASCII representation of the product
54153289f6aSNate Lawson  *              identifier compressed into a 32-bit identifier. The seven
54253289f6aSNate Lawson  *              character ID consists of a three character manufacturer code,
54353289f6aSNate Lawson  *              a three character hexadecimal product identifier, and a one
54453289f6aSNate Lawson  *              character hexadecimal revision number. The manufacturer code
54553289f6aSNate Lawson  *              is a 3 uppercase character code that is compressed into 3 5-bit
54653289f6aSNate Lawson  *              values as follows:
54753289f6aSNate Lawson  *                  1) Find hex ASCII value for each letter
54853289f6aSNate Lawson  *                  2) Subtract 40h from each ASCII value
5498ef1a331SJung-uk Kim  *                  3) Retain 5 least significant bits for each letter by
55053289f6aSNate Lawson  *                     discarding upper 3 bits because they are always 0.
55153289f6aSNate Lawson  *                  4) Compressed code = concatenate 0 and the 3 5-bit values
55253289f6aSNate Lawson  *
55353289f6aSNate Lawson  *              The format of the compressed product identifier is as follows:
55453289f6aSNate Lawson  *              Byte 0: Bit 7       - Reserved (0)
55553289f6aSNate Lawson  *                      Bits 6-2:   - 1st character of compressed mfg code
55653289f6aSNate Lawson  *                      Bits 1-0    - Upper 2 bits of 2nd character of mfg code
55753289f6aSNate Lawson  *              Byte 1: Bits 7-5    - Lower 3 bits of 2nd character of mfg code
55853289f6aSNate Lawson  *                      Bits 4-0    - 3rd character of mfg code
55953289f6aSNate Lawson  *              Byte 2: Bits 7-4    - 1st hex digit of product number
56053289f6aSNate Lawson  *                      Bits 3-0    - 2nd hex digit of product number
56153289f6aSNate Lawson  *              Byte 3: Bits 7-4    - 3st hex digit of product number
56253289f6aSNate Lawson  *                      Bits 3-0    - Hex digit of the revision number
56353289f6aSNate Lawson  *
56453289f6aSNate Lawson  ******************************************************************************/
56553289f6aSNate Lawson 
566fba7fc7eSJung-uk Kim static void
56753289f6aSNate Lawson OpcDoEisaId (
56853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
56953289f6aSNate Lawson {
57053289f6aSNate Lawson     UINT32                  EisaId = 0;
57153289f6aSNate Lawson     UINT32                  BigEndianId;
57253289f6aSNate Lawson     char                    *InString;
57353289f6aSNate Lawson     ACPI_STATUS             Status = AE_OK;
574a9f12690SJung-uk Kim     UINT32                  i;
57553289f6aSNate Lawson 
57653289f6aSNate Lawson 
57753289f6aSNate Lawson     InString = (char *) Op->Asl.Value.String;
57853289f6aSNate Lawson 
57953289f6aSNate Lawson     /*
58053289f6aSNate Lawson      * The EISAID string must be exactly 7 characters and of the form
581fba7fc7eSJung-uk Kim      * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001")
58253289f6aSNate Lawson      */
58353289f6aSNate Lawson     if (ACPI_STRLEN (InString) != 7)
58453289f6aSNate Lawson     {
58553289f6aSNate Lawson         Status = AE_BAD_PARAMETER;
58653289f6aSNate Lawson     }
58753289f6aSNate Lawson     else
58853289f6aSNate Lawson     {
58953289f6aSNate Lawson         /* Check all 7 characters for correct format */
59053289f6aSNate Lawson 
59153289f6aSNate Lawson         for (i = 0; i < 7; i++)
59253289f6aSNate Lawson         {
593c8466860SMark Santcroos             /* First 3 characters must be uppercase letters */
59453289f6aSNate Lawson 
59553289f6aSNate Lawson             if (i < 3)
59653289f6aSNate Lawson             {
5979a179dd8SJung-uk Kim                 if (!isupper ((int) InString[i]))
59853289f6aSNate Lawson                 {
59953289f6aSNate Lawson                     Status = AE_BAD_PARAMETER;
60053289f6aSNate Lawson                 }
60153289f6aSNate Lawson             }
60253289f6aSNate Lawson 
60353289f6aSNate Lawson             /* Last 4 characters must be hex digits */
60453289f6aSNate Lawson 
6059a179dd8SJung-uk Kim             else if (!isxdigit ((int) InString[i]))
60653289f6aSNate Lawson             {
60753289f6aSNate Lawson                 Status = AE_BAD_PARAMETER;
60853289f6aSNate Lawson             }
60953289f6aSNate Lawson         }
61053289f6aSNate Lawson     }
61153289f6aSNate Lawson 
61253289f6aSNate Lawson     if (ACPI_FAILURE (Status))
61353289f6aSNate Lawson     {
61453289f6aSNate Lawson         AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String);
61553289f6aSNate Lawson     }
61653289f6aSNate Lawson     else
61753289f6aSNate Lawson     {
61853289f6aSNate Lawson         /* Create ID big-endian first (bits are contiguous) */
61953289f6aSNate Lawson 
6201a39cfb0SJung-uk Kim         BigEndianId =
62142fecd12SJung-uk Kim             (UINT32) ((UINT8) (InString[0] - 0x40)) << 26 |
62242fecd12SJung-uk Kim             (UINT32) ((UINT8) (InString[1] - 0x40)) << 21 |
62342fecd12SJung-uk Kim             (UINT32) ((UINT8) (InString[2] - 0x40)) << 16 |
62453289f6aSNate Lawson 
62553289f6aSNate Lawson             (UtHexCharToValue (InString[3])) << 12 |
62653289f6aSNate Lawson             (UtHexCharToValue (InString[4])) << 8  |
62753289f6aSNate Lawson             (UtHexCharToValue (InString[5])) << 4  |
62853289f6aSNate Lawson              UtHexCharToValue (InString[6]);
62953289f6aSNate Lawson 
63053289f6aSNate Lawson         /* Swap to little-endian to get final ID (see function header) */
63153289f6aSNate Lawson 
63253289f6aSNate Lawson         EisaId = AcpiUtDwordByteSwap (BigEndianId);
63353289f6aSNate Lawson     }
63453289f6aSNate Lawson 
63553289f6aSNate Lawson     /*
63653289f6aSNate Lawson      * Morph the Op into an integer, regardless of whether there
63753289f6aSNate Lawson      * was an error in the EISAID string
63853289f6aSNate Lawson      */
63953289f6aSNate Lawson     Op->Asl.Value.Integer = EisaId;
64053289f6aSNate Lawson 
64153289f6aSNate Lawson     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
64253289f6aSNate Lawson     Op->Asl.ParseOpcode = PARSEOP_INTEGER;
64353289f6aSNate Lawson     (void) OpcSetOptimalIntegerSize (Op);
64453289f6aSNate Lawson 
64553289f6aSNate Lawson     /* Op is now an integer */
64653289f6aSNate Lawson 
64753289f6aSNate Lawson     UtSetParseOpName (Op);
64853289f6aSNate Lawson }
64953289f6aSNate Lawson 
65053289f6aSNate Lawson 
65153289f6aSNate Lawson /*******************************************************************************
65253289f6aSNate Lawson  *
6533f0275a0SJung-uk Kim  * FUNCTION:    OpcDoUuId
654c8466860SMark Santcroos  *
655c8466860SMark Santcroos  * PARAMETERS:  Op        - Parse node
656c8466860SMark Santcroos  *
657c8466860SMark Santcroos  * RETURN:      None
658c8466860SMark Santcroos  *
659fba7fc7eSJung-uk Kim  * DESCRIPTION: Convert UUID string to 16-byte buffer
660c8466860SMark Santcroos  *
661c8466860SMark Santcroos  ******************************************************************************/
662c8466860SMark Santcroos 
663fba7fc7eSJung-uk Kim static void
664c8466860SMark Santcroos OpcDoUuId (
665c8466860SMark Santcroos     ACPI_PARSE_OBJECT       *Op)
666c8466860SMark Santcroos {
667c8466860SMark Santcroos     char                    *InString;
668c8466860SMark Santcroos     char                    *Buffer;
669c8466860SMark Santcroos     ACPI_STATUS             Status = AE_OK;
670c8466860SMark Santcroos     ACPI_PARSE_OBJECT       *NewOp;
671c8466860SMark Santcroos 
672c8466860SMark Santcroos 
673c8466860SMark Santcroos     InString = (char *) Op->Asl.Value.String;
674c8466860SMark Santcroos     Buffer = UtLocalCalloc (16);
675c8466860SMark Santcroos 
676d244b227SJung-uk Kim     Status = AuValidateUuid (InString);
677c8466860SMark Santcroos     if (ACPI_FAILURE (Status))
678c8466860SMark Santcroos     {
679c8466860SMark Santcroos         AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String);
680c8466860SMark Santcroos     }
681d244b227SJung-uk Kim     else
682c8466860SMark Santcroos     {
683d244b227SJung-uk Kim         (void) AuConvertStringToUuid (InString, Buffer);
684c8466860SMark Santcroos     }
685c8466860SMark Santcroos 
686c8466860SMark Santcroos     /* Change Op to a Buffer */
687c8466860SMark Santcroos 
688c8466860SMark Santcroos     Op->Asl.ParseOpcode = PARSEOP_BUFFER;
689c8466860SMark Santcroos     Op->Common.AmlOpcode = AML_BUFFER_OP;
690fba7fc7eSJung-uk Kim 
691fba7fc7eSJung-uk Kim     /* Disable further optimization */
692fba7fc7eSJung-uk Kim 
693fba7fc7eSJung-uk Kim     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
694c8466860SMark Santcroos     UtSetParseOpName (Op);
695c8466860SMark Santcroos 
696c8466860SMark Santcroos     /* Child node is the buffer length */
697c8466860SMark Santcroos 
698c8466860SMark Santcroos     NewOp = TrAllocateNode (PARSEOP_INTEGER);
699c8466860SMark Santcroos 
700c8466860SMark Santcroos     NewOp->Asl.AmlOpcode     = AML_BYTE_OP;
701c8466860SMark Santcroos     NewOp->Asl.Value.Integer = 16;
702c8466860SMark Santcroos     NewOp->Asl.Parent        = Op;
703c8466860SMark Santcroos 
704c8466860SMark Santcroos     Op->Asl.Child = NewOp;
705c8466860SMark Santcroos     Op = NewOp;
706c8466860SMark Santcroos 
707c8466860SMark Santcroos     /* Peer to the child is the raw buffer data */
708c8466860SMark Santcroos 
709c8466860SMark Santcroos     NewOp = TrAllocateNode (PARSEOP_RAW_DATA);
710c8466860SMark Santcroos     NewOp->Asl.AmlOpcode     = AML_RAW_DATA_BUFFER;
711c8466860SMark Santcroos     NewOp->Asl.AmlLength     = 16;
712c8466860SMark Santcroos     NewOp->Asl.Value.String  = (char *) Buffer;
713c8466860SMark Santcroos     NewOp->Asl.Parent        = Op->Asl.Parent;
714c8466860SMark Santcroos 
715c8466860SMark Santcroos     Op->Asl.Next = NewOp;
716c8466860SMark Santcroos }
717c8466860SMark Santcroos 
718c8466860SMark Santcroos 
719c8466860SMark Santcroos /*******************************************************************************
720c8466860SMark Santcroos  *
72153289f6aSNate Lawson  * FUNCTION:    OpcGenerateAmlOpcode
72253289f6aSNate Lawson  *
72353289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node
72453289f6aSNate Lawson  *
72553289f6aSNate Lawson  * RETURN:      None
72653289f6aSNate Lawson  *
72753289f6aSNate Lawson  * DESCRIPTION: Generate the AML opcode associated with the node and its
72853289f6aSNate Lawson  *              parse (lex/flex) keyword opcode. Essentially implements
72953289f6aSNate Lawson  *              a mapping between the parse opcodes and the actual AML opcodes.
73053289f6aSNate Lawson  *
73153289f6aSNate Lawson  ******************************************************************************/
73253289f6aSNate Lawson 
73353289f6aSNate Lawson void
73453289f6aSNate Lawson OpcGenerateAmlOpcode (
73553289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
73653289f6aSNate Lawson {
73753289f6aSNate Lawson 
73853289f6aSNate Lawson     UINT16                  Index;
73953289f6aSNate Lawson 
74053289f6aSNate Lawson 
74153289f6aSNate Lawson     Index = (UINT16) (Op->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE);
74253289f6aSNate Lawson 
74353289f6aSNate Lawson     Op->Asl.AmlOpcode     = AslKeywordMapping[Index].AmlOpcode;
74453289f6aSNate Lawson     Op->Asl.AcpiBtype     = AslKeywordMapping[Index].AcpiBtype;
74553289f6aSNate Lawson     Op->Asl.CompileFlags |= AslKeywordMapping[Index].Flags;
74653289f6aSNate Lawson 
74753289f6aSNate Lawson     if (!Op->Asl.Value.Integer)
74853289f6aSNate Lawson     {
74953289f6aSNate Lawson         Op->Asl.Value.Integer = AslKeywordMapping[Index].Value;
75053289f6aSNate Lawson     }
75153289f6aSNate Lawson 
75253289f6aSNate Lawson     /* Special handling for some opcodes */
75353289f6aSNate Lawson 
75453289f6aSNate Lawson     switch (Op->Asl.ParseOpcode)
75553289f6aSNate Lawson     {
75653289f6aSNate Lawson     case PARSEOP_INTEGER:
75753289f6aSNate Lawson         /*
75853289f6aSNate Lawson          * Set the opcode based on the size of the integer
75953289f6aSNate Lawson          */
76053289f6aSNate Lawson         (void) OpcSetOptimalIntegerSize (Op);
76153289f6aSNate Lawson         break;
76253289f6aSNate Lawson 
76353289f6aSNate Lawson     case PARSEOP_OFFSET:
76453289f6aSNate Lawson 
76553289f6aSNate Lawson         Op->Asl.AmlOpcodeLength = 1;
76653289f6aSNate Lawson         break;
76753289f6aSNate Lawson 
76853289f6aSNate Lawson     case PARSEOP_ACCESSAS:
76953289f6aSNate Lawson 
77053289f6aSNate Lawson         OpcDoAccessAs (Op);
77153289f6aSNate Lawson         break;
77253289f6aSNate Lawson 
7733f0275a0SJung-uk Kim     case PARSEOP_CONNECTION:
7743f0275a0SJung-uk Kim 
7753f0275a0SJung-uk Kim         OpcDoConnection (Op);
7763f0275a0SJung-uk Kim         break;
7773f0275a0SJung-uk Kim 
77853289f6aSNate Lawson     case PARSEOP_EISAID:
77953289f6aSNate Lawson 
78053289f6aSNate Lawson         OpcDoEisaId (Op);
78153289f6aSNate Lawson         break;
78253289f6aSNate Lawson 
783c8466860SMark Santcroos     case PARSEOP_TOUUID:
784c8466860SMark Santcroos 
785c8466860SMark Santcroos         OpcDoUuId (Op);
786c8466860SMark Santcroos         break;
787c8466860SMark Santcroos 
78853289f6aSNate Lawson     case PARSEOP_UNICODE:
78953289f6aSNate Lawson 
79053289f6aSNate Lawson         OpcDoUnicode (Op);
79153289f6aSNate Lawson         break;
79253289f6aSNate Lawson 
79353289f6aSNate Lawson     case PARSEOP_INCLUDE:
79453289f6aSNate Lawson 
79553289f6aSNate Lawson         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
79653289f6aSNate Lawson         Gbl_HasIncludeFiles = TRUE;
79753289f6aSNate Lawson         break;
79853289f6aSNate Lawson 
79953289f6aSNate Lawson     case PARSEOP_EXTERNAL:
80053289f6aSNate Lawson 
80153289f6aSNate Lawson         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
80253289f6aSNate Lawson         Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
80353289f6aSNate Lawson         break;
80453289f6aSNate Lawson 
805*efcc2a30SJung-uk Kim     case PARSEOP_TIMER:
806*efcc2a30SJung-uk Kim 
807*efcc2a30SJung-uk Kim         if (AcpiGbl_IntegerBitWidth == 32)
808*efcc2a30SJung-uk Kim         {
809*efcc2a30SJung-uk Kim             AslError (ASL_REMARK, ASL_MSG_TRUNCATION, Op, NULL);
810*efcc2a30SJung-uk Kim         }
811*efcc2a30SJung-uk Kim         break;
812*efcc2a30SJung-uk Kim 
81353289f6aSNate Lawson     default:
81453289f6aSNate Lawson         /* Nothing to do for other opcodes */
81553289f6aSNate Lawson         break;
81653289f6aSNate Lawson     }
81753289f6aSNate Lawson 
81853289f6aSNate Lawson     return;
81953289f6aSNate Lawson }
820