1 /** @file
2   ACPI Sdt Protocol Driver
3 
4   Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved. <BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include "AcpiTable.h"
16 
17 GLOBAL_REMOVE_IF_UNREFERENCED
18 AML_BYTE_ENCODING mAmlByteEncoding[] = {
19   //                             OpCode                      SubOpCode              Num 1           2           3           4           5           6           Attribute
20 /* ZeroOp - 0x00 */              {AML_ZERO_OP,               0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
21 /* OneOp  - 0x01 */              {AML_ONE_OP,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
22 /* AliasOp - 0x06 */             {AML_ALIAS_OP,              0,                      2, {AML_NAME,   AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
23 /* NameOp - 0x08 */              {AML_NAME_OP,               0,                      2, {AML_NAME,   AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
24 /* BytePrefix - 0x0A */          {AML_BYTE_PREFIX,           0,                      1, {AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
25 /* WordPrefix - 0x0B */          {AML_WORD_PREFIX,           0,                      1, {AML_UINT16, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
26 /* DWordPrefix - 0x0C */         {AML_DWORD_PREFIX,          0,                      1, {AML_UINT32, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
27 /* StringPrefix - 0x0D */        {AML_STRING_PREFIX,         0,                      1, {AML_STRING, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
28 /* QWordPrefix - 0x0E */         {AML_QWORD_PREFIX,          0,                      1, {AML_UINT64, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
29 /* ScopeOp - 0x10 */             {AML_SCOPE_OP,              0,                      1, {AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
30 /* BufferOp - 0x11 */            {AML_BUFFER_OP,             0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH},
31 /* PackageOp - 0x12 */           {AML_PACKAGE_OP,            0,                      1, {AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ},
32 /* VarPackageOp - 0x13 */        {AML_VAR_PACKAGE_OP,        0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ},
33 /* MethodOp - 0x14 */            {AML_METHOD_OP,             0,                      2, {AML_NAME,   AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
34 /* DualNamePrefix - 0x2F */      {AML_DUAL_NAME_PREFIX,      0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
35 /* MultiNamePrefix - 0x2F */     {AML_MULTI_NAME_PREFIX,     0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
36 /* NameChar - 0x41 */            {'A',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
37 /* NameChar - 0x42 */            {'B',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
38 /* NameChar - 0x43 */            {'C',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
39 /* NameChar - 0x44 */            {'D',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
40 /* NameChar - 0x45 */            {'E',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
41 /* NameChar - 0x46 */            {'F',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
42 /* NameChar - 0x47 */            {'G',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
43 /* NameChar - 0x48 */            {'H',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
44 /* NameChar - 0x49 */            {'I',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
45 /* NameChar - 0x4A */            {'J',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
46 /* NameChar - 0x4B */            {'K',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
47 /* NameChar - 0x4C */            {'L',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
48 /* NameChar - 0x4D */            {'M',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
49 /* NameChar - 0x4E */            {'N',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
50 /* NameChar - 0x4F */            {'O',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
51 /* NameChar - 0x50 */            {'P',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
52 /* NameChar - 0x51 */            {'Q',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
53 /* NameChar - 0x52 */            {'R',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
54 /* NameChar - 0x53 */            {'S',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
55 /* NameChar - 0x54 */            {'T',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
56 /* NameChar - 0x55 */            {'U',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
57 /* NameChar - 0x56 */            {'V',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
58 /* NameChar - 0x57 */            {'W',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
59 /* NameChar - 0x58 */            {'X',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
60 /* NameChar - 0x59 */            {'Y',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
61 /* NameChar - 0x5A */            {'Z',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
62 /* MutexOp - 0x5B 0x01 */        {AML_EXT_OP,                AML_EXT_MUTEX_OP,       2, {AML_NAME,   AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
63 /* EventOp - 0x5B 0x02 */        {AML_EXT_OP,                AML_EXT_EVENT_OP,       1, {AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
64 /* CondRefOfOp - 0x5B 0x12 */    {AML_EXT_OP,                AML_EXT_COND_REF_OF_OP, 2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
65 /* CreateFieldOp - 0x5B 0x13 */  {AML_EXT_OP,                AML_EXT_CREATE_FIELD_OP,4, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE},   0},
66 /* LoadTableOp - 0x5B 0x1F */    {AML_EXT_OP,                AML_EXT_LOAD_TABLE_OP,  6, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_OBJECT}, 0},
67 /* LoadOp - 0x5B 0x20 */         {AML_EXT_OP,                AML_EXT_LOAD_OP,        2, {AML_NAME,   AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
68 /* StallOp - 0x5B 0x21 */        {AML_EXT_OP,                AML_EXT_STALL_OP,       1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
69 /* SleepOp - 0x5B 0x22 */        {AML_EXT_OP,                AML_EXT_SLEEP_OP,       1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
70 /* AcquireOp - 0x5B 0x23 */      {AML_EXT_OP,                AML_EXT_ACQUIRE_OP,     2, {AML_OBJECT, AML_UINT16, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
71 /* SignalOp - 0x5B 0x24 */       {AML_EXT_OP,                AML_EXT_SIGNAL_OP,      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
72 /* WaitOp - 0x5B 0x25 */         {AML_EXT_OP,                AML_EXT_WAIT_OP,        2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
73 /* ResetOp - 0x5B 0x26 */        {AML_EXT_OP,                AML_EXT_RESET_OP,       1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
74 /* ReleaseOp - 0x5B 0x27 */      {AML_EXT_OP,                AML_EXT_RELEASE_OP,     1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
75 /* FromBCDOp - 0x5B 0x28 */      {AML_EXT_OP,                AML_EXT_FROM_BCD_OP,    2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
76 /* ToBCDOp - 0x5B 0x29 */        {AML_EXT_OP,                AML_EXT_TO_BCD_OP,      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
77 /* UnloadOp - 0x5B 0x2A */       {AML_EXT_OP,                AML_EXT_UNLOAD_OP,      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
78 /* RevisionOp - 0x5B 0x30 */     {AML_EXT_OP,                AML_EXT_REVISION_OP,    0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
79 /* DebugOp - 0x5B 0x31 */        {AML_EXT_OP,                AML_EXT_DEBUG_OP,       0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
80 /* FatalOp - 0x5B 0x32 */        {AML_EXT_OP,                AML_EXT_FATAL_OP,       3, {AML_UINT8,  AML_UINT32, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
81 /* TimerOp - 0x5B 0x33 */        {AML_EXT_OP,                AML_EXT_TIMER_OP,       0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
82 /* OpRegionOp - 0x5B 0x80 */     {AML_EXT_OP,                AML_EXT_REGION_OP,      4, {AML_NAME,   AML_UINT8,  AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
83 /* FieldOp - 0x5B 0x81 */        {AML_EXT_OP,                AML_EXT_FIELD_OP,       2, {AML_NAME,   AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH},
84 /* DeviceOp - 0x5B 0x82 */       {AML_EXT_OP,                AML_EXT_DEVICE_OP,      1, {AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
85 /* ProcessorOp - 0x5B 0x83 */    {AML_EXT_OP,                AML_EXT_PROCESSOR_OP,   4, {AML_NAME,   AML_UINT8,  AML_UINT32, AML_UINT8,  AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
86 /* PowerResOp - 0x5B 0x84 */     {AML_EXT_OP,                AML_EXT_POWER_RES_OP,   3, {AML_NAME,   AML_UINT8,  AML_UINT16, AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
87 /* ThermalZoneOp - 0x5B 0x85 */  {AML_EXT_OP,                AML_EXT_THERMAL_ZONE_OP,1, {AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE},
88 /* IndexFieldOp - 0x5B 0x86 */   {AML_EXT_OP,                AML_EXT_INDEX_FIELD_OP, 3, {AML_NAME,   AML_NAME,   AML_UINT8,  AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH},
89 /* BankFieldOp - 0x5B 0x87 */    {AML_EXT_OP,                AML_EXT_BANK_FIELD_OP,  4, {AML_NAME,   AML_NAME,   AML_OBJECT, AML_UINT8,  AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH},
90 /* DataRegionOp - 0x5B 0x88 */   {AML_EXT_OP,                AML_EXT_DATA_REGION_OP, 4, {AML_NAME,   AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE},   AML_IN_NAMESPACE},
91 /* RootChar - 0x5C */            {AML_ROOT_CHAR,             0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
92 /* ParentPrefixChar - 0x5E */    {AML_PARENT_PREFIX_CHAR,    0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
93 /* NameChar - 0x5F */            {'_',                       0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_IS_NAME_CHAR},
94 /* Local0Op - 0x60 */            {AML_LOCAL0,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
95 /* Local1Op - 0x61 */            {AML_LOCAL1,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
96 /* Local2Op - 0x62 */            {AML_LOCAL2,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
97 /* Local3Op - 0x63 */            {AML_LOCAL3,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
98 /* Local4Op - 0x64 */            {AML_LOCAL4,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
99 /* Local5Op - 0x65 */            {AML_LOCAL5,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
100 /* Local6Op - 0x66 */            {AML_LOCAL6,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
101 /* Local7Op - 0x67 */            {AML_LOCAL7,                0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
102 /* Arg0Op - 0x68 */              {AML_ARG0,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
103 /* Arg1Op - 0x69 */              {AML_ARG1,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
104 /* Arg2Op - 0x6A */              {AML_ARG2,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
105 /* Arg3Op - 0x6B */              {AML_ARG3,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
106 /* Arg4Op - 0x6C */              {AML_ARG4,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
107 /* Arg5Op - 0x6D */              {AML_ARG5,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
108 /* Arg6Op - 0x6E */              {AML_ARG6,                  0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
109 /* StoreOp - 0x70 */             {AML_STORE_OP,              0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
110 /* RefOfOp - 0x71 */             {AML_REF_OF_OP,             0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
111 /* AddOp - 0x72 */               {AML_ADD_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
112 /* ConcatOp - 0x73 */            {AML_CONCAT_OP,             0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
113 /* SubtractOp - 0x74 */          {AML_SUBTRACT_OP,           0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
114 /* IncrementOp - 0x75 */         {AML_INCREMENT_OP,          0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
115 /* DecrementOp - 0x76 */         {AML_DECREMENT_OP,          0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
116 /* MultiplyOp - 0x77 */          {AML_MULTIPLY_OP,           0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
117 /* DivideOp - 0x78 */            {AML_DIVIDE_OP,             0,                      4, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE},   0},
118 /* ShiftLeftOp - 0x79 */         {AML_SHIFT_LEFT_OP,         0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
119 /* ShiftRightOp - 0x7A */        {AML_SHIFT_RIGHT_OP,        0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
120 /* AndOp - 0x7B */               {AML_AND_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
121 /* NAndOp - 0x7C */              {AML_NAND_OP,               0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
122 /* OrOp - 0x7D */                {AML_OR_OP,                 0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
123 /* NorOp - 0x7E */               {AML_NOR_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
124 /* XOrOp - 0x7F */               {AML_XOR_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
125 /* NotOp - 0x80 */               {AML_NOT_OP,                0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
126 /* FindSetLeftBitOp - 0x81 */    {AML_FIND_SET_LEFT_BIT_OP,  0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
127 /* FindSetRightBitOp - 0x82 */   {AML_FIND_SET_RIGHT_BIT_OP, 0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
128 /* DerefOfOp - 0x83 */           {AML_DEREF_OF_OP,           0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
129 /* ConcatResOp - 0x84 */         {AML_CONCAT_RES_OP,         0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
130 /* ModOp - 0x85 */               {AML_MOD_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
131 /* NotifyOp - 0x86 */            {AML_NOTIFY_OP,             0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
132 /* SizeOfOp - 0x87 */            {AML_SIZE_OF_OP,            0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
133 /* IndexOp - 0x88 */             {AML_INDEX_OP,              0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
134 /* MatchOp - 0x89 */             {AML_MATCH_OP,              0,                      6, {AML_OBJECT, AML_UINT8,  AML_OBJECT, AML_UINT8,  AML_OBJECT, AML_OBJECT}, 0},
135 /* CreateDWordFieldOp - 0x8A */  {AML_CREATE_DWORD_FIELD_OP, 0,                      3, {AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE},   0},
136 /* CreateWordFieldOp - 0x8B */   {AML_CREATE_WORD_FIELD_OP,  0,                      3, {AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE},   0},
137 /* CreateByteFieldOp - 0x8C */   {AML_CREATE_BYTE_FIELD_OP,  0,                      3, {AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE},   0},
138 /* CreateBitFieldOp - 0x8D */    {AML_CREATE_BIT_FIELD_OP,   0,                      3, {AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE},   0},
139 /* ObjectTypeOp - 0x8E */        {AML_OBJECT_TYPE_OP,        0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
140 /* CreateQWordFieldOp - 0x8F */  {AML_CREATE_QWORD_FIELD_OP, 0,                      3, {AML_OBJECT, AML_OBJECT, AML_NAME,   AML_NONE,   AML_NONE,   AML_NONE},   0},
141 /* LAndOp - 0x90 */              {AML_LAND_OP,               0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
142 /* LOrOp - 0x91 */               {AML_LOR_OP,                0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
143 /* LNotOp - 0x92 */              {AML_LNOT_OP,               0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
144 /* LEqualOp - 0x93 */            {AML_LEQUAL_OP,             0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
145 /* LGreaterOp - 0x94 */          {AML_LGREATER_OP,           0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
146 /* LLessOp - 0x95 */             {AML_LLESS_OP,              0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
147 /* ToBufferOp - 0x96 */          {AML_TO_BUFFER_OP,          0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
148 /* ToDecimalStringOp - 0x97 */   {AML_TO_DEC_STRING_OP,      0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
149 /* ToHexStringOp - 0x98 */       {AML_TO_HEX_STRING_OP,      0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
150 /* ToIntegerOp - 0x99 */         {AML_TO_INTEGER_OP,         0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
151 /* ToStringOp - 0x9C */          {AML_TO_STRING_OP,          0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
152 /* CopyObjectOp - 0x9D */        {AML_COPY_OBJECT_OP,        0,                      2, {AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
153 /* MidOp - 0x9E */               {AML_MID_OP,                0,                      3, {AML_OBJECT, AML_OBJECT, AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE},   0},
154 /* ContinueOp - 0x9F */          {AML_CONTINUE_OP,           0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
155 /* IfOp - 0xA0 */                {AML_IF_OP,                 0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ},
156 /* ElseOp - 0xA1 */              {AML_ELSE_OP,               0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ},
157 /* WhileOp - 0xA2 */             {AML_WHILE_OP,              0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ},
158 /* NoopOp - 0xA3 */              {AML_NOOP_OP,               0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
159 /* ReturnOp - 0xA4 */            {AML_RETURN_OP,             0,                      1, {AML_OBJECT, AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
160 /* BreakOp - 0xA5 */             {AML_BREAK_OP,              0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
161 /* BreakPointOp - 0xCC */        {AML_BREAK_POINT_OP,        0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
162 /* OnesOp - 0xFF */              {AML_ONES_OP,               0,                      0, {AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE,   AML_NONE},   0},
163 };
164 
165 GLOBAL_REMOVE_IF_UNREFERENCED
166 EFI_ACPI_DATA_TYPE  mAmlTypeToAcpiType[] = {
167   EFI_ACPI_DATA_TYPE_NONE,             // AML_NONE
168   EFI_ACPI_DATA_TYPE_OPCODE,           // AML_OPCODE
169   EFI_ACPI_DATA_TYPE_UINT,             // AML_UINT8
170   EFI_ACPI_DATA_TYPE_UINT,             // AML_UINT16
171   EFI_ACPI_DATA_TYPE_UINT,             // AML_UINT32
172   EFI_ACPI_DATA_TYPE_UINT,             // AML_UINT64
173   EFI_ACPI_DATA_TYPE_NAME_STRING,      // AML_NAME
174   EFI_ACPI_DATA_TYPE_STRING,           // AML_STRING
175   EFI_ACPI_DATA_TYPE_CHILD             // AML_OBJECT
176 };
177 
178 /**
179   This function returns AmlByteEncoding according to OpCode Byte.
180 
181   @param[in]  OpByteBuffer        OpCode byte buffer.
182 
183   @return AmlByteEncoding
184 **/
185 AML_BYTE_ENCODING *
AmlSearchByOpByte(IN UINT8 * OpByteBuffer)186 AmlSearchByOpByte (
187   IN UINT8                *OpByteBuffer
188   )
189 {
190   UINT8       OpCode;
191   UINT8       SubOpCode;
192   UINTN       Index;
193 
194   //
195   // Get OpCode and SubOpCode
196   //
197   OpCode = OpByteBuffer[0];
198   if (OpCode == AML_EXT_OP) {
199     SubOpCode = OpByteBuffer[1];
200   } else {
201     SubOpCode = 0;
202   }
203 
204   //
205   // Search the table
206   //
207   for (Index = 0; Index < sizeof(mAmlByteEncoding)/sizeof(mAmlByteEncoding[0]); Index++) {
208     if ((mAmlByteEncoding[Index].OpCode == OpCode) && (mAmlByteEncoding[Index].SubOpCode == SubOpCode)) {
209       return &mAmlByteEncoding[Index];
210     }
211   }
212 
213   return NULL;
214 }
215 
216 /**
217   This function returns AcpiDataType according to AmlType.
218 
219   @param[in]  AmlType        AML Type.
220 
221   @return AcpiDataType
222 **/
223 EFI_ACPI_DATA_TYPE
AmlTypeToAcpiType(IN AML_OP_PARSE_FORMAT AmlType)224 AmlTypeToAcpiType (
225   IN AML_OP_PARSE_FORMAT  AmlType
226   )
227 {
228   if (AmlType >= sizeof(mAmlTypeToAcpiType)/sizeof(mAmlTypeToAcpiType[0])) {
229     ASSERT(FALSE);
230     return EFI_ACPI_DATA_TYPE_NONE;
231   }
232   return mAmlTypeToAcpiType [AmlType];
233 }
234 
235 /**
236   This function retuns package length from the buffer.
237 
238   @param[in]  Buffer    AML buffer
239   @param[out] PkgLength The total length of package.
240 
241   @return The byte data count to present the package length.
242 **/
243 UINTN
AmlGetPkgLength(IN UINT8 * Buffer,OUT UINTN * PkgLength)244 AmlGetPkgLength (
245   IN UINT8              *Buffer,
246   OUT UINTN             *PkgLength
247   )
248 {
249   UINT8             LeadByte;
250   UINT8             ByteCount;
251   UINTN             RealLength;
252   UINTN             Offset;
253 
254   //
255   // <bit 7-6: ByteData count that follows (0-3)>
256   // <bit 5-4: Only used if PkgLength < 63>
257   // <bit 3-0: Least significant package length nybble>
258   //
259   // Note: The high 2 bits of the first byte reveal how many follow bytes are in the
260   // If the PkgLength has only one byte, bit 0 through 5 are used to encode the
261   // package length (in other words, values 0-63). If the package length value is more than
262   // 63, more than one byte must be used for the encoding in which case bit 4 and 5 of the
263   // PkgLeadByte are reserved and must be zero. If the multiple bytes encoding is used,
264   // bits 0-3 of the PkgLeadByte become the least significant 4 bits of the resulting
265   // package length value. The next ByteData will become the next least significant 8 bits
266   // of the resulting value and so on, up to 3 ByteData bytes. Thus, the maximum package
267   // length is 2**28.
268   //
269 
270   LeadByte = *Buffer;
271   ByteCount = (UINT8)((LeadByte >> 6) & 0x03);
272   Offset = ByteCount + 1;
273   RealLength = 0;
274 
275   switch (ByteCount) {
276   case 0:
277     RealLength = (UINT32)LeadByte;
278     break;
279   case 1:
280     RealLength = *(Buffer + 1);
281     RealLength = (RealLength << 4) | (LeadByte & 0xF);
282     break;
283   case 2:
284     RealLength = *(Buffer + 1);
285     RealLength |= (UINTN)((*(Buffer + 2)) << 8);
286     RealLength = (RealLength << 4) | (LeadByte & 0xF);
287     break;
288   case 3:
289     RealLength = *(Buffer + 1);
290     RealLength |= (UINTN)((*(Buffer + 2)) << 8);
291     RealLength |= (UINTN)((*(Buffer + 3)) << 16);
292     RealLength = (RealLength << 4) | (LeadByte & 0xF);
293     break;
294   default:
295     ASSERT (0);
296     break;
297   }
298 
299   *PkgLength = RealLength;
300   return Offset;
301 }
302 
303