REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the DynamicTablesPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			907 lines
		
	
	
		
			59 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			907 lines
		
	
	
		
			59 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  AML grammar definitions.
 | 
						|
 | 
						|
  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>
 | 
						|
  Copyright (c) 2019 - 2021, Arm Limited. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#include <AmlEncoding/Aml.h>
 | 
						|
 | 
						|
/** AML grammar encoding table.
 | 
						|
 | 
						|
  The ASL language is a description language, used to define abstract
 | 
						|
  objects, like devices, thermal zones, etc. and their place in a hierarchical
 | 
						|
  tree. The following table stores the AML grammar definition. It can be used
 | 
						|
  to parse an AML bytestream. Each line corresponds to the definition of an
 | 
						|
  opcode and what is expected to be found with this opcode.
 | 
						|
  See table 20-440 in the ACPI 6.3 specification s20.3, and the AML
 | 
						|
  grammar definitions in s20.2.
 | 
						|
 | 
						|
  - OpCode/SubOpCode:
 | 
						|
  An OpCode/SubOpCode couple allows to identify an object type.
 | 
						|
  The OpCode and SubOpCode are one byte each. The SubOpCode is
 | 
						|
  used when the Opcode value is 0x5B (extended OpCode). Otherwise
 | 
						|
  the SubOpcode is set to 0. If the SubOpCode is 0 in the table
 | 
						|
  below, there is no SubOpCode in the AML bytestream, only the
 | 
						|
  OpCode is used to identify the object.
 | 
						|
 | 
						|
  - Fixed arguments:
 | 
						|
  The fixed arguments follow the OpCode and SubOpCode. Their number
 | 
						|
  and type can be found in the table below. There can be at the most
 | 
						|
  6 fixed arguments for an object.
 | 
						|
  Fixed arguments's type allow to know what is expected in the AML bytestream.
 | 
						|
  Knowing the size of the incoming element, AML bytes can be packed and parsed
 | 
						|
  accordingly. These types can be found in the same table 20-440 in the
 | 
						|
  ACPI 6.3, s20.3 specification.
 | 
						|
  E.g.: An AML object, a UINT8, a NULL terminated string, etc.
 | 
						|
 | 
						|
  -Attributes:
 | 
						|
  The attribute field gives additional information on each object. This can
 | 
						|
  be the presence of a variable list of arguments, the presence of a PkgLen,
 | 
						|
  etc.
 | 
						|
 | 
						|
  In summary, an AML object is described as:
 | 
						|
    OpCode [SubOpcode] [PkgLen] [FixedArgs] [VarArgs]
 | 
						|
 | 
						|
  OpCode                        {1 byte}
 | 
						|
  [SubOpCode]                   {1 byte.
 | 
						|
                                 Only relevant if the OpCode value is
 | 
						|
                                 0x5B (extended OpCode prefix).
 | 
						|
                                 Otherwise 0. Most objects don't have one.}
 | 
						|
  [PkgLen]                      {Size of the object.
 | 
						|
                                 It has a special encoding, cf. ACPI 6.3
 | 
						|
                                 specification, s20.2.4 "Package Length
 | 
						|
                                 Encoding".
 | 
						|
                                 Most objects don't have one.}
 | 
						|
  [FixedArgs[0..X]]             {Fixed list of arguments.
 | 
						|
    (where X <= 5)               Can be other objects or data (a byte,
 | 
						|
                                 a string, etc.). They belong to the
 | 
						|
                                 current AML object.
 | 
						|
                                 The number of fixed arguments varies according
 | 
						|
                                 to the object, but it is fixed for each kind of
 | 
						|
                                 object.}
 | 
						|
  [VarArgs]                     {Variable list of arguments.
 | 
						|
                                 They also belong to the current object and can
 | 
						|
                                 be objects or data.
 | 
						|
                                 Most objects don't have one.}
 | 
						|
    [ByteList]                  {This is a sub-type of a variable list of
 | 
						|
                                 arguments. It can only be found in buffer
 | 
						|
                                 objects.
 | 
						|
                                 A ByteList is either a list of bytes or
 | 
						|
                                 a list of resource data elements. Resource
 | 
						|
                                 data elements have specific opcodes.}
 | 
						|
    [FieldList]                 {This is a sub-type of a variable list of
 | 
						|
                                 arguments. It can only be found in Fields,
 | 
						|
                                 IndexFields and BankFields.
 | 
						|
                                 A FieldList is made of FieldElements.
 | 
						|
                                 FieldElements have specific opcodes.}
 | 
						|
*/
 | 
						|
GLOBAL_REMOVE_IF_UNREFERENCED
 | 
						|
STATIC
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING  mAmlByteEncoding[] = {
 | 
						|
  // Comment                       Str                    OpCode                     SubOpCode               MaxIndex  NameIndex   0                 1                 2                 3                 4                 5                 Attribute
 | 
						|
  /* 0x00 */      { AML_OPCODE_DEF ("ZeroOp",             AML_ZERO_OP),               0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x01 */      { AML_OPCODE_DEF ("OneOp",              AML_ONE_OP),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x06 */      { AML_OPCODE_DEF ("AliasOp",            AML_ALIAS_OP),              0,                       2, 1, { EAmlName,   EAmlName,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x08 */      { AML_OPCODE_DEF ("NameOp",             AML_NAME_OP),               0,                       2, 0, { EAmlName,   EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x0A */      { AML_OPCODE_DEF ("BytePrefix",         AML_BYTE_PREFIX),           0,                       1, 0, { EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x0B */      { AML_OPCODE_DEF ("WordPrefix",         AML_WORD_PREFIX),           0,                       1, 0, { EAmlUInt16, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x0C */      { AML_OPCODE_DEF ("DWordPrefix",        AML_DWORD_PREFIX),          0,                       1, 0, { EAmlUInt32, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x0D */      { AML_OPCODE_DEF ("StringPrefix",       AML_STRING_PREFIX),         0,                       1, 0, { EAmlString, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x0E */      { AML_OPCODE_DEF ("QWordPrefix",        AML_QWORD_PREFIX),          0,                       1, 0, { EAmlUInt64, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x10 */      { AML_OPCODE_DEF ("ScopeOp",            AML_SCOPE_OP),              0,                       1, 0, { EAmlName,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x11 */      { AML_OPCODE_DEF ("BufferOp",           AML_BUFFER_OP),             0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_BYTE_LIST                    },
 | 
						|
  /* 0x12 */      { AML_OPCODE_DEF ("PackageOp",          AML_PACKAGE_OP),            0,                       1, 0, { EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ                    },
 | 
						|
  /* 0x13 */      { AML_OPCODE_DEF ("VarPackageOp",       AML_VAR_PACKAGE_OP),        0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ                    },
 | 
						|
  /* 0x14 */      { AML_OPCODE_DEF ("MethodOp",           AML_METHOD_OP),             0,                       2, 0, { EAmlName,   EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x15 */      { AML_OPCODE_DEF ("ExternalOp",         AML_EXTERNAL_OP),           0,                       3, 0, { EAmlName,   EAmlUInt8,  EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x2E */      { AML_OPCODE_DEF ("DualNamePrefix",     AML_DUAL_NAME_PREFIX),      0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x2F */      { AML_OPCODE_DEF ("MultiNamePrefix",    AML_MULTI_NAME_PREFIX),     0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x41 */      { AML_OPCODE_DEF ("NameChar_A",         'A'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x42 */      { AML_OPCODE_DEF ("NameChar_B",         'B'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x43 */      { AML_OPCODE_DEF ("NameChar_C",         'C'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x44 */      { AML_OPCODE_DEF ("NameChar_D",         'D'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x45 */      { AML_OPCODE_DEF ("NameChar_E",         'E'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x46 */      { AML_OPCODE_DEF ("NameChar_F",         'F'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x47 */      { AML_OPCODE_DEF ("NameChar_G",         'G'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x48 */      { AML_OPCODE_DEF ("NameChar_H",         'H'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x49 */      { AML_OPCODE_DEF ("NameChar_I",         'I'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4A */      { AML_OPCODE_DEF ("NameChar_J",         'J'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4B */      { AML_OPCODE_DEF ("NameChar_K",         'K'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4C */      { AML_OPCODE_DEF ("NameChar_L",         'L'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4D */      { AML_OPCODE_DEF ("NameChar_M",         'M'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4E */      { AML_OPCODE_DEF ("NameChar_N",         'N'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x4F */      { AML_OPCODE_DEF ("NameChar_O",         'O'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x50 */      { AML_OPCODE_DEF ("NameChar_P",         'P'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x51 */      { AML_OPCODE_DEF ("NameChar_Q",         'Q'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x52 */      { AML_OPCODE_DEF ("NameChar_R",         'R'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x53 */      { AML_OPCODE_DEF ("NameChar_S",         'S'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x54 */      { AML_OPCODE_DEF ("NameChar_T",         'T'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x55 */      { AML_OPCODE_DEF ("NameChar_U",         'U'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x56 */      { AML_OPCODE_DEF ("NameChar_V",         'V'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x57 */      { AML_OPCODE_DEF ("NameChar_W",         'W'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x58 */      { AML_OPCODE_DEF ("NameChar_X",         'X'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x59 */      { AML_OPCODE_DEF ("NameChar_Y",         'Y'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x5A */      { AML_OPCODE_DEF ("NameChar_Z",         'Z'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x5B 0x01 */ { AML_OPCODE_DEF ("MutexOp",            AML_EXT_OP),                AML_EXT_MUTEX_OP,        2, 0, { EAmlName,   EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x5B 0x02 */ { AML_OPCODE_DEF ("EventOp",            AML_EXT_OP),                AML_EXT_EVENT_OP,        1, 0, { EAmlName,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x5B 0x12 */ { AML_OPCODE_DEF ("CondRefOfOp",        AML_EXT_OP),                AML_EXT_COND_REF_OF_OP,  2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x13 */ { AML_OPCODE_DEF ("CreateFieldOp",      AML_EXT_OP),                AML_EXT_CREATE_FIELD_OP, 4, 3, { EAmlObject, EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x5B 0x1F */ { AML_OPCODE_DEF ("LoadTableOp",        AML_EXT_OP),                AML_EXT_LOAD_TABLE_OP,   6, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlObject, EAmlObject, EAmlObject }, 0                                                         },
 | 
						|
  /* 0x5B 0x20 */ { AML_OPCODE_DEF ("LoadOp",             AML_EXT_OP),                AML_EXT_LOAD_OP,         2, 0, { EAmlName,   EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x21 */ { AML_OPCODE_DEF ("StallOp",            AML_EXT_OP),                AML_EXT_STALL_OP,        1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x22 */ { AML_OPCODE_DEF ("SleepOp",            AML_EXT_OP),                AML_EXT_SLEEP_OP,        1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x23 */ { AML_OPCODE_DEF ("AcquireOp",          AML_EXT_OP),                AML_EXT_ACQUIRE_OP,      2, 0, { EAmlObject, EAmlUInt16, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x24 */ { AML_OPCODE_DEF ("SignalOp",           AML_EXT_OP),                AML_EXT_SIGNAL_OP,       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x25 */ { AML_OPCODE_DEF ("WaitOp",             AML_EXT_OP),                AML_EXT_WAIT_OP,         2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x26 */ { AML_OPCODE_DEF ("ResetOp",            AML_EXT_OP),                AML_EXT_RESET_OP,        1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x27 */ { AML_OPCODE_DEF ("ReleaseOp",          AML_EXT_OP),                AML_EXT_RELEASE_OP,      1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x28 */ { AML_OPCODE_DEF ("FromBCDOp",          AML_EXT_OP),                AML_EXT_FROM_BCD_OP,     2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x29 */ { AML_OPCODE_DEF ("ToBCDOp",            AML_EXT_OP),                AML_EXT_TO_BCD_OP,       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x2A */ { AML_OPCODE_DEF ("UnloadOp",           AML_EXT_OP),                AML_EXT_UNLOAD_OP,       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x30 */ { AML_OPCODE_DEF ("RevisionOp",         AML_EXT_OP),                AML_EXT_REVISION_OP,     0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x31 */ { AML_OPCODE_DEF ("DebugOp",            AML_EXT_OP),                AML_EXT_DEBUG_OP,        0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x32 */ { AML_OPCODE_DEF ("FatalOp",            AML_EXT_OP),                AML_EXT_FATAL_OP,        3, 0, { EAmlUInt8,  EAmlUInt32, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x33 */ { AML_OPCODE_DEF ("TimerOp",            AML_EXT_OP),                AML_EXT_TIMER_OP,        0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x5B 0x80 */ { AML_OPCODE_DEF ("OpRegionOp",         AML_EXT_OP),                AML_EXT_REGION_OP,       4, 0, { EAmlName,   EAmlUInt8,  EAmlObject, EAmlObject, EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x5B 0x81 */ { AML_OPCODE_DEF ("FieldOp",            AML_EXT_OP),                AML_EXT_FIELD_OP,        2, 0, { EAmlName,   EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_FIELD_LIST                   },
 | 
						|
  /* 0x5B 0x82 */ { AML_OPCODE_DEF ("DeviceOp",           AML_EXT_OP),                AML_EXT_DEVICE_OP,       1, 0, { EAmlName,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x5B 0x83 */ { AML_OPCODE_DEF ("ProcessorOp",        AML_EXT_OP),                AML_EXT_PROCESSOR_OP,    4, 0, { EAmlName,   EAmlUInt8,  EAmlUInt32, EAmlUInt8,  EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x5B 0x84 */ { AML_OPCODE_DEF ("PowerResOp",         AML_EXT_OP),                AML_EXT_POWER_RES_OP,    3, 0, { EAmlName,   EAmlUInt8,  EAmlUInt16, EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x5B 0x85 */ { AML_OPCODE_DEF ("ThermalZoneOp",      AML_EXT_OP),                AML_EXT_THERMAL_ZONE_OP, 1, 0, { EAmlName,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ | AML_IN_NAMESPACE },
 | 
						|
  /* 0x5B 0x86 */ { AML_OPCODE_DEF ("IndexFieldOp",       AML_EXT_OP),                AML_EXT_INDEX_FIELD_OP,  3, 0, { EAmlName,   EAmlName,   EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_FIELD_LIST                   },
 | 
						|
  /* 0x5B 0x87 */ { AML_OPCODE_DEF ("BankFieldOp",        AML_EXT_OP),                AML_EXT_BANK_FIELD_OP,   4, 0, { EAmlName,   EAmlName,   EAmlObject, EAmlUInt8,  EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_FIELD_LIST                   },
 | 
						|
  /* 0x5B 0x88 */ { AML_OPCODE_DEF ("DataRegionOp",       AML_EXT_OP),                AML_EXT_DATA_REGION_OP,  4, 0, { EAmlName,   EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x5C */      { AML_OPCODE_DEF ("RootChar",           AML_ROOT_CHAR),             0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x5E */      { AML_OPCODE_DEF ("ParentPrefixChar",   AML_PARENT_PREFIX_CHAR),    0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x5F */      { AML_OPCODE_DEF ("NameChar",           '_'),                       0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_NAME_CHAR                                          },
 | 
						|
  /* 0x60 */      { AML_OPCODE_DEF ("Local0Op",           AML_LOCAL0),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x61 */      { AML_OPCODE_DEF ("Local1Op",           AML_LOCAL1),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x62 */      { AML_OPCODE_DEF ("Local2Op",           AML_LOCAL2),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x63 */      { AML_OPCODE_DEF ("Local3Op",           AML_LOCAL3),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x64 */      { AML_OPCODE_DEF ("Local4Op",           AML_LOCAL4),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x65 */      { AML_OPCODE_DEF ("Local5Op",           AML_LOCAL5),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x66 */      { AML_OPCODE_DEF ("Local6Op",           AML_LOCAL6),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x67 */      { AML_OPCODE_DEF ("Local7Op",           AML_LOCAL7),                0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x68 */      { AML_OPCODE_DEF ("Arg0Op",             AML_ARG0),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x69 */      { AML_OPCODE_DEF ("Arg1Op",             AML_ARG1),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x6A */      { AML_OPCODE_DEF ("Arg2Op",             AML_ARG2),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x6B */      { AML_OPCODE_DEF ("Arg3Op",             AML_ARG3),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x6C */      { AML_OPCODE_DEF ("Arg4Op",             AML_ARG4),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x6D */      { AML_OPCODE_DEF ("Arg5Op",             AML_ARG5),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x6E */      { AML_OPCODE_DEF ("Arg6Op",             AML_ARG6),                  0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x70 */      { AML_OPCODE_DEF ("StoreOp",            AML_STORE_OP),              0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x71 */      { AML_OPCODE_DEF ("RefOfOp",            AML_REF_OF_OP),             0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x72 */      { AML_OPCODE_DEF ("AddOp",              AML_ADD_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x73 */      { AML_OPCODE_DEF ("ConcatOp",           AML_CONCAT_OP),             0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x74 */      { AML_OPCODE_DEF ("SubtractOp",         AML_SUBTRACT_OP),           0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x75 */      { AML_OPCODE_DEF ("IncrementOp",        AML_INCREMENT_OP),          0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x76 */      { AML_OPCODE_DEF ("DecrementOp",        AML_DECREMENT_OP),          0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x77 */      { AML_OPCODE_DEF ("MultiplyOp",         AML_MULTIPLY_OP),           0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x78 */      { AML_OPCODE_DEF ("DivideOp",           AML_DIVIDE_OP),             0,                       4, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x79 */      { AML_OPCODE_DEF ("ShiftLeftOp",        AML_SHIFT_LEFT_OP),         0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7A */      { AML_OPCODE_DEF ("ShiftRightOp",       AML_SHIFT_RIGHT_OP),        0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7B */      { AML_OPCODE_DEF ("AndOp",              AML_AND_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7C */      { AML_OPCODE_DEF ("NAndOp",             AML_NAND_OP),               0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7D */      { AML_OPCODE_DEF ("OrOp",               AML_OR_OP),                 0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7E */      { AML_OPCODE_DEF ("NorOp",              AML_NOR_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x7F */      { AML_OPCODE_DEF ("XOrOp",              AML_XOR_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x80 */      { AML_OPCODE_DEF ("NotOp",              AML_NOT_OP),                0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x81 */      { AML_OPCODE_DEF ("FindSetLeftBitOp",   AML_FIND_SET_LEFT_BIT_OP),  0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x82 */      { AML_OPCODE_DEF ("FindSetRightBitOp",  AML_FIND_SET_RIGHT_BIT_OP), 0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x83 */      { AML_OPCODE_DEF ("DerefOfOp",          AML_DEREF_OF_OP),           0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x84 */      { AML_OPCODE_DEF ("ConcatResOp",        AML_CONCAT_RES_OP),         0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x85 */      { AML_OPCODE_DEF ("ModOp",              AML_MOD_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x86 */      { AML_OPCODE_DEF ("NotifyOp",           AML_NOTIFY_OP),             0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x87 */      { AML_OPCODE_DEF ("SizeOfOp",           AML_SIZE_OF_OP),            0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x88 */      { AML_OPCODE_DEF ("IndexOp",            AML_INDEX_OP),              0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x89 */      { AML_OPCODE_DEF ("MatchOp",            AML_MATCH_OP),              0,                       6, 0, { EAmlObject, EAmlUInt8,  EAmlObject, EAmlUInt8,  EAmlObject, EAmlObject }, 0                                                         },
 | 
						|
  /* 0x8A */      { AML_OPCODE_DEF ("CreateDWordFieldOp", AML_CREATE_DWORD_FIELD_OP), 0,                       3, 2, { EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x8B */      { AML_OPCODE_DEF ("CreateWordFieldOp",  AML_CREATE_WORD_FIELD_OP),  0,                       3, 2, { EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x8C */      { AML_OPCODE_DEF ("CreateByteFieldOp",  AML_CREATE_BYTE_FIELD_OP),  0,                       3, 2, { EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x8D */      { AML_OPCODE_DEF ("CreateBitFieldOp",   AML_CREATE_BIT_FIELD_OP),   0,                       3, 2, { EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x8E */      { AML_OPCODE_DEF ("ObjectTypeOp",       AML_OBJECT_TYPE_OP),        0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x8F */      { AML_OPCODE_DEF ("CreateQWordFieldOp", AML_CREATE_QWORD_FIELD_OP), 0,                       3, 2, { EAmlObject, EAmlObject, EAmlName,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IN_NAMESPACE                                          },
 | 
						|
  /* 0x90 */      { AML_OPCODE_DEF ("LAndOp",             AML_LAND_OP),               0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x91 */      { AML_OPCODE_DEF ("LOrOp",              AML_LOR_OP),                0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x92 */      { AML_OPCODE_DEF ("LNotOp",             AML_LNOT_OP),               0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x93 */      { AML_OPCODE_DEF ("LEqualOp",           AML_LEQUAL_OP),             0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x94 */      { AML_OPCODE_DEF ("LGreaterOp",         AML_LGREATER_OP),           0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x95 */      { AML_OPCODE_DEF ("LLessOp",            AML_LLESS_OP),              0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x96 */      { AML_OPCODE_DEF ("ToBufferOp",         AML_TO_BUFFER_OP),          0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x97 */      { AML_OPCODE_DEF ("ToDecimalStringOp",  AML_TO_DEC_STRING_OP),      0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x98 */      { AML_OPCODE_DEF ("ToHexStringOp",      AML_TO_HEX_STRING_OP),      0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x99 */      { AML_OPCODE_DEF ("ToIntegerOp",        AML_TO_INTEGER_OP),         0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x9C */      { AML_OPCODE_DEF ("ToStringOp",         AML_TO_STRING_OP),          0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x9D */      { AML_OPCODE_DEF ("CopyObjectOp",       AML_COPY_OBJECT_OP),        0,                       2, 0, { EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x9E */      { AML_OPCODE_DEF ("MidOp",              AML_MID_OP),                0,                       3, 0, { EAmlObject, EAmlObject, EAmlObject, EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0x9F */      { AML_OPCODE_DEF ("ContinueOp",         AML_CONTINUE_OP),           0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0xA0 */      { AML_OPCODE_DEF ("IfOp",               AML_IF_OP),                 0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ                    },
 | 
						|
  /* 0xA1 */      { AML_OPCODE_DEF ("ElseOp",             AML_ELSE_OP),               0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ                    },
 | 
						|
  /* 0xA2 */      { AML_OPCODE_DEF ("WhileOp",            AML_WHILE_OP),              0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_HAS_PKG_LENGTH | AML_HAS_CHILD_OBJ                    },
 | 
						|
  /* 0xA3 */      { AML_OPCODE_DEF ("NoopOp",             AML_NOOP_OP),               0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0xA4 */      { AML_OPCODE_DEF ("ReturnOp",           AML_RETURN_OP),             0,                       1, 0, { EAmlObject, EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0xA5 */      { AML_OPCODE_DEF ("BreakOp",            AML_BREAK_OP),              0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0xCC */      { AML_OPCODE_DEF ("BreakPointOp",       AML_BREAK_POINT_OP),        0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
  /* 0xD0 */      { AML_OPCODE_DEF ("MethodInvocOp",      AML_METHOD_INVOC_OP),       0,                       2, 0, { EAmlName,   EAmlUInt8,  EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, AML_IS_PSEUDO_OPCODE | AML_HAS_CHILD_OBJ                  },
 | 
						|
  /* 0xFF */      { AML_OPCODE_DEF ("OnesOp",             AML_ONES_OP),               0,                       0, 0, { EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone,   EAmlNone   }, 0                                                         },
 | 
						|
};
 | 
						|
 | 
						|
/** AML grammar encoding for field elements.
 | 
						|
 | 
						|
  Some AML objects are expecting a FieldList. They are referred in this library
 | 
						|
  as field nodes. These objects have the following opcodes:
 | 
						|
   - FieldOp;
 | 
						|
   - IndexFieldOp;
 | 
						|
   - BankFieldOp.
 | 
						|
  In the AML grammar encoding table, they have the AML_HAS_FIELD_LIST
 | 
						|
  attribute.
 | 
						|
 | 
						|
  A field list is made of field elements.
 | 
						|
  According to the ACPI 6.3 specification, s20.2.5.2 "Named Objects Encoding",
 | 
						|
  field elements can be:
 | 
						|
   - NamedField           := NameSeg PkgLength;
 | 
						|
   - ReservedField        := 0x00 PkgLength;
 | 
						|
   - AccessField          := 0x01 AccessType AccessAttrib;
 | 
						|
   - ConnectField         := <0x02 NameString> | <0x02 BufferData>;
 | 
						|
   - ExtendedAccessField  := 0x03 AccessType ExtendedAccessAttrib AccessLength.
 | 
						|
 | 
						|
  A small set of opcodes describes field elements. They are referred in this
 | 
						|
  library as field opcodes.
 | 
						|
  The NamedField field element doesn't have a field opcode. A pseudo
 | 
						|
  OpCode/SubOpCode couple has been created for it.
 | 
						|
 | 
						|
  Field elements:
 | 
						|
   - don't have a SubOpCode;
 | 
						|
   - have at most 3 fixed arguments (6 for object opcodes,
 | 
						|
     8 for method invocations);
 | 
						|
   - don't have variable list of arguments;
 | 
						|
   - are not part of the AML namespace, except NamedField field elements.
 | 
						|
*/
 | 
						|
GLOBAL_REMOVE_IF_UNREFERENCED
 | 
						|
STATIC
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING  mAmlFieldEncoding[] = {
 | 
						|
  // Comment                       Str                    OpCode                     SubOpCode               MaxIndex  NameIndex   0                 1                 2                 3                 4                 5                 Attribute
 | 
						|
  /* 0x00 */ { AML_OPCODE_DEF ("FieldReservedOp",   AML_FIELD_RESERVED_OP),   0, 0, 0, { EAmlNone,   EAmlNone,        EAmlNone,  EAmlNone, EAmlNone, EAmlNone }, AML_IS_FIELD_ELEMENT | AML_HAS_PKG_LENGTH                      },
 | 
						|
  /* 0x01 */ { AML_OPCODE_DEF ("FieldAccessOp",     AML_FIELD_ACCESS_OP),     0, 2, 0, { EAmlUInt8,  EAmlUInt8,       EAmlNone,  EAmlNone, EAmlNone, EAmlNone }, AML_IS_FIELD_ELEMENT                                           },
 | 
						|
  /* 0x02 */ { AML_OPCODE_DEF ("FieldConnectionOp", AML_FIELD_CONNECTION_OP), 0, 1, 0, { EAmlObject, EAmlNone,        EAmlNone,  EAmlNone, EAmlNone, EAmlNone }, AML_IS_FIELD_ELEMENT                                           },
 | 
						|
  /* 0x03 */ { AML_OPCODE_DEF ("FieldExtAccessOp",  AML_FIELD_EXT_ACCESS_OP), 0, 3, 0, { EAmlUInt8,  EAmlUInt8,       EAmlUInt8, EAmlNone, EAmlNone, EAmlNone }, AML_IS_FIELD_ELEMENT                                           },
 | 
						|
  /* 0x04 */ { AML_OPCODE_DEF ("FieldNamed",        AML_FIELD_NAMED_OP),      0, 2, 0, { EAmlName,   EAmlFieldPkgLen, EAmlNone,  EAmlNone, EAmlNone, EAmlNone }, AML_IS_FIELD_ELEMENT | AML_IS_PSEUDO_OPCODE | AML_IN_NAMESPACE }
 | 
						|
};
 | 
						|
 | 
						|
/** Get the AML_BYTE_ENCODING entry in the AML encoding table.
 | 
						|
 | 
						|
  Note: For Pseudo OpCodes this function returns NULL.
 | 
						|
 | 
						|
  @param  [in]  Buffer    Pointer to an OpCode/SubOpCode couple.
 | 
						|
                          If *Buffer = 0x5b (extended OpCode),
 | 
						|
                          Buffer must be at least two bytes long.
 | 
						|
 | 
						|
  @return The corresponding AML_BYTE_ENCODING entry.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING *
 | 
						|
EFIAPI
 | 
						|
AmlGetByteEncoding (
 | 
						|
  IN  CONST UINT8  *Buffer
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8   OpCode;
 | 
						|
  UINT8   SubOpCode;
 | 
						|
  UINT32  Index;
 | 
						|
 | 
						|
  if (Buffer == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get OpCode and SubOpCode.
 | 
						|
  OpCode = Buffer[0];
 | 
						|
  if (OpCode == AML_EXT_OP) {
 | 
						|
    SubOpCode = Buffer[1];
 | 
						|
  } else {
 | 
						|
    SubOpCode = 0;
 | 
						|
  }
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlByteEncoding) / sizeof (mAmlByteEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlByteEncoding[Index].OpCode == OpCode) &&
 | 
						|
        (mAmlByteEncoding[Index].SubOpCode == SubOpCode))
 | 
						|
    {
 | 
						|
      if ((mAmlByteEncoding[Index].Attribute & AML_IS_PSEUDO_OPCODE) ==
 | 
						|
          AML_IS_PSEUDO_OPCODE)
 | 
						|
      {
 | 
						|
        // A pseudo OpCode cannot be parsed as it is internal to this library.
 | 
						|
        // The MethodInvocation encoding can be detected by NameSpace lookup.
 | 
						|
        ASSERT (0);
 | 
						|
        return NULL;
 | 
						|
      }
 | 
						|
 | 
						|
      return &mAmlByteEncoding[Index];
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/** Get the AML_BYTE_ENCODING entry in the AML encoding table
 | 
						|
    by providing an OpCode/SubOpCode couple.
 | 
						|
 | 
						|
  @param  [in]  OpCode     OpCode.
 | 
						|
  @param  [in]  SubOpCode  SubOpCode.
 | 
						|
 | 
						|
  @return The corresponding AML_BYTE_ENCODING entry.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING *
 | 
						|
EFIAPI
 | 
						|
AmlGetByteEncodingByOpCode (
 | 
						|
  IN  UINT8  OpCode,
 | 
						|
  IN  UINT8  SubOpCode
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Index;
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlByteEncoding) / sizeof (mAmlByteEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlByteEncoding[Index].OpCode == OpCode) &&
 | 
						|
        (mAmlByteEncoding[Index].SubOpCode == SubOpCode))
 | 
						|
    {
 | 
						|
      return &mAmlByteEncoding[Index];
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/** Get the AML_BYTE_ENCODING entry in the field encoding table.
 | 
						|
 | 
						|
  Note: For Pseudo OpCodes this function returns NULL.
 | 
						|
 | 
						|
  @param  [in]  Buffer  Pointer to a field OpCode.
 | 
						|
                        No SubOpCode is expected.
 | 
						|
 | 
						|
  @return The corresponding AML_BYTE_ENCODING entry
 | 
						|
          in the field encoding table.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING *
 | 
						|
EFIAPI
 | 
						|
AmlGetFieldEncoding (
 | 
						|
  IN  CONST UINT8  *Buffer
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8   OpCode;
 | 
						|
  UINT32  Index;
 | 
						|
 | 
						|
  if (Buffer == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get OpCode.
 | 
						|
  OpCode = *Buffer;
 | 
						|
 | 
						|
  // Search in the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlFieldEncoding) / sizeof (mAmlFieldEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if (mAmlFieldEncoding[Index].OpCode == OpCode) {
 | 
						|
      if ((mAmlFieldEncoding[Index].Attribute & AML_IS_PSEUDO_OPCODE) ==
 | 
						|
          AML_IS_PSEUDO_OPCODE)
 | 
						|
      {
 | 
						|
        // A pseudo OpCode cannot be parsed as it is internal to this library.
 | 
						|
        // The NamedField encoding can be detected because it begins with a
 | 
						|
        // char.
 | 
						|
        ASSERT (0);
 | 
						|
        return NULL;
 | 
						|
      }
 | 
						|
 | 
						|
      return &mAmlFieldEncoding[Index];
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/** Get the AML_BYTE_ENCODING entry in the field encoding table
 | 
						|
    by providing an OpCode/SubOpCode couple.
 | 
						|
 | 
						|
  @param  [in]  OpCode     OpCode.
 | 
						|
  @param  [in]  SubOpCode  SubOpCode.
 | 
						|
 | 
						|
  @return The corresponding AML_BYTE_ENCODING entry
 | 
						|
          in the field encoding table.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
AML_BYTE_ENCODING *
 | 
						|
EFIAPI
 | 
						|
AmlGetFieldEncodingByOpCode (
 | 
						|
  IN  UINT8  OpCode,
 | 
						|
  IN  UINT8  SubOpCode
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Index;
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlFieldEncoding) / sizeof (mAmlFieldEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlFieldEncoding[Index].OpCode == OpCode) &&
 | 
						|
        (mAmlFieldEncoding[Index].SubOpCode == SubOpCode))
 | 
						|
    {
 | 
						|
      return &mAmlFieldEncoding[Index];
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
// Enable this function for debug.
 | 
						|
#if !defined (MDEPKG_NDEBUG)
 | 
						|
 | 
						|
/** Look for an OpCode/SubOpCode couple in the AML grammar,
 | 
						|
    and return a corresponding string.
 | 
						|
 | 
						|
  @param  [in]  OpCode      The OpCode.
 | 
						|
  @param  [in]  SubOpCode   The SubOpCode.
 | 
						|
 | 
						|
  @return A string describing the OpCode/SubOpCode couple.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
CHAR8 *
 | 
						|
AmlGetOpCodeStr (
 | 
						|
  IN  UINT8  OpCode,
 | 
						|
  IN  UINT8  SubOpCode
 | 
						|
  )
 | 
						|
{
 | 
						|
  EAML_PARSE_INDEX  Index;
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlByteEncoding) / sizeof (mAmlByteEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlByteEncoding[Index].OpCode == OpCode) &&
 | 
						|
        (mAmlByteEncoding[Index].SubOpCode == SubOpCode))
 | 
						|
    {
 | 
						|
      return mAmlByteEncoding[Index].Str;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  ASSERT (0);
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
/** Look for an OpCode/SubOpCode couple in the AML field element grammar,
 | 
						|
    and return a corresponding string.
 | 
						|
 | 
						|
  @param  [in]  OpCode      The OpCode.
 | 
						|
  @param  [in]  SubOpCode   The SubOpCode. Must be zero.
 | 
						|
 | 
						|
  @return A string describing the OpCode/SubOpCode couple.
 | 
						|
          NULL if not found.
 | 
						|
**/
 | 
						|
CONST
 | 
						|
CHAR8 *
 | 
						|
AmlGetFieldOpCodeStr (
 | 
						|
  IN  UINT8  OpCode,
 | 
						|
  IN  UINT8  SubOpCode
 | 
						|
  )
 | 
						|
{
 | 
						|
  EAML_PARSE_INDEX  Index;
 | 
						|
 | 
						|
  if (SubOpCode != 0) {
 | 
						|
    ASSERT (0);
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlFieldEncoding) / sizeof (mAmlFieldEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlFieldEncoding[Index].OpCode == OpCode)) {
 | 
						|
      return mAmlFieldEncoding[Index].Str;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  ASSERT (0);
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
#endif // MDEPKG_NDEBUG
 | 
						|
 | 
						|
/** Check whether the OpCode/SubOpcode couple is a valid entry
 | 
						|
    in the AML grammar encoding table.
 | 
						|
 | 
						|
  @param  [in]  OpCode     OpCode to check.
 | 
						|
  @param  [in]  SubOpCode  SubOpCode to check.
 | 
						|
 | 
						|
  @retval TRUE    The OpCode/SubOpCode couple is valid.
 | 
						|
  @retval FALSE   Otherwise.
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
EFIAPI
 | 
						|
AmlIsOpCodeValid (
 | 
						|
  IN  UINT8  OpCode,
 | 
						|
  IN  UINT8  SubOpCode
 | 
						|
  )
 | 
						|
{
 | 
						|
  EAML_PARSE_INDEX  Index;
 | 
						|
 | 
						|
  // Search the table.
 | 
						|
  for (Index = 0;
 | 
						|
       Index < (sizeof (mAmlByteEncoding) / sizeof (mAmlByteEncoding[0]));
 | 
						|
       Index++)
 | 
						|
  {
 | 
						|
    if ((mAmlByteEncoding[Index].OpCode == OpCode) &&
 | 
						|
        (mAmlByteEncoding[Index].SubOpCode == SubOpCode))
 | 
						|
    {
 | 
						|
      return TRUE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
/** AML_PARSE_FORMAT to EAML_NODE_DATA_TYPE translation table.
 | 
						|
 | 
						|
  AML_PARSE_FORMAT describes an internal set of values identifying the types
 | 
						|
  that can be found while parsing an AML bytestream.
 | 
						|
  EAML_NODE_DATA_TYPE describes an external set of values allowing to identify
 | 
						|
  what type of data can be found in data nodes.
 | 
						|
*/
 | 
						|
GLOBAL_REMOVE_IF_UNREFERENCED
 | 
						|
STATIC
 | 
						|
CONST
 | 
						|
EAML_NODE_DATA_TYPE  mAmlTypeToNodeDataType[] = {
 | 
						|
  EAmlNodeDataTypeNone,         // EAmlNone
 | 
						|
  EAmlNodeDataTypeUInt,         // EAmlUInt8
 | 
						|
  EAmlNodeDataTypeUInt,         // EAmlUInt16
 | 
						|
  EAmlNodeDataTypeUInt,         // EAmlUInt32
 | 
						|
  EAmlNodeDataTypeUInt,         // EAmlUInt64
 | 
						|
  EAmlNodeDataTypeReserved5,    // EAmlObject
 | 
						|
  EAmlNodeDataTypeNameString,   // EAmlName
 | 
						|
  EAmlNodeDataTypeString,       // EAmlString
 | 
						|
  EAmlNodeDataTypeFieldPkgLen   // EAmlFieldPkgLen
 | 
						|
};
 | 
						|
 | 
						|
/** Convert an AML_PARSE_FORMAT to its corresponding EAML_NODE_DATA_TYPE.
 | 
						|
 | 
						|
  @param  [in]  AmlType   Input AML Type.
 | 
						|
 | 
						|
  @return The corresponding EAML_NODE_DATA_TYPE.
 | 
						|
          EAmlNodeDataTypeNone if not found.
 | 
						|
**/
 | 
						|
EAML_NODE_DATA_TYPE
 | 
						|
EFIAPI
 | 
						|
AmlTypeToNodeDataType (
 | 
						|
  IN  AML_PARSE_FORMAT  AmlType
 | 
						|
  )
 | 
						|
{
 | 
						|
  if (AmlType >=
 | 
						|
      (sizeof (mAmlTypeToNodeDataType) / sizeof (mAmlTypeToNodeDataType[0])))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EAmlNodeDataTypeNone;
 | 
						|
  }
 | 
						|
 | 
						|
  return mAmlTypeToNodeDataType[AmlType];
 | 
						|
}
 | 
						|
 | 
						|
/** Get the package length from the buffer.
 | 
						|
 | 
						|
  @param  [in]  Buffer      AML buffer.
 | 
						|
  @param  [out] PkgLength   The interpreted PkgLen value.
 | 
						|
                            Length cannot exceed 2^28.
 | 
						|
 | 
						|
  @return The number of bytes to represent the package length.
 | 
						|
          0 if an issue occurred.
 | 
						|
**/
 | 
						|
UINT32
 | 
						|
EFIAPI
 | 
						|
AmlGetPkgLength (
 | 
						|
  IN  CONST UINT8   *Buffer,
 | 
						|
  OUT       UINT32  *PkgLength
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8   LeadByte;
 | 
						|
  UINT8   ByteCount;
 | 
						|
  UINT32  RealLength;
 | 
						|
  UINT32  Offset;
 | 
						|
 | 
						|
  if ((Buffer == NULL)  ||
 | 
						|
      (PkgLength == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  /* From ACPI 6.3 specification, s20.2.4 "Package Length Encoding":
 | 
						|
 | 
						|
  PkgLength := PkgLeadByte |
 | 
						|
               <PkgLeadByte ByteData> |
 | 
						|
               <PkgLeadByte ByteData ByteData> |
 | 
						|
               <PkgLeadByte ByteData ByteData ByteData>
 | 
						|
 | 
						|
  PkgLeadByte := <bit 7-6: ByteData count that follows (0-3)>
 | 
						|
                 <bit 5-4: Only used if PkgLength < 63>
 | 
						|
                 <bit 3-0: Least significant package length nibble>
 | 
						|
 | 
						|
  Note:
 | 
						|
    The high 2 bits of the first byte reveal how many
 | 
						|
    follow bytes are in the PkgLength. If the
 | 
						|
    PkgLength has only one byte, bit 0 through 5 are
 | 
						|
    used to encode the package length (in other
 | 
						|
    words, values 0-63). If the package length value
 | 
						|
    is more than 63, more than one byte must be
 | 
						|
    used for the encoding in which case bit 4 and 5 of
 | 
						|
    the PkgLeadByte are reserved and must be zero.
 | 
						|
    If the multiple bytes encoding is used, bits 0-3 of
 | 
						|
    the PkgLeadByte become the least significant 4
 | 
						|
    bits of the resulting package length value. The next
 | 
						|
    ByteData will become the next least
 | 
						|
    significant 8 bits of the resulting value and so on,
 | 
						|
    up to 3 ByteData bytes. Thus, the maximum
 | 
						|
    package length is 2**28.
 | 
						|
  */
 | 
						|
 | 
						|
  LeadByte   = *Buffer;
 | 
						|
  ByteCount  = (LeadByte >> 6) & 0x03U;
 | 
						|
  Offset     = ByteCount + 1U;
 | 
						|
  RealLength = 0;
 | 
						|
 | 
						|
  // Switch on the number of bytes used to store the PkgLen.
 | 
						|
  switch (ByteCount) {
 | 
						|
    case 0:
 | 
						|
    {
 | 
						|
      RealLength = LeadByte;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    case 1:
 | 
						|
    {
 | 
						|
      RealLength = *(Buffer + 1);
 | 
						|
      RealLength = (RealLength << 4) | (LeadByte & 0xF);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    case 2:
 | 
						|
    {
 | 
						|
      RealLength  = *(Buffer + 1);
 | 
						|
      RealLength |= ((UINT32)(*(Buffer + 2))) << 8;
 | 
						|
      RealLength  = (RealLength << 4) | (LeadByte & 0xF);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    case 3:
 | 
						|
    {
 | 
						|
      RealLength  = *(Buffer + 1);
 | 
						|
      RealLength |= ((UINT32)(*(Buffer + 2))) << 8;
 | 
						|
      RealLength |= ((UINT32)(*(Buffer + 3))) << 16;
 | 
						|
      RealLength  = (RealLength << 4) | (LeadByte & 0xF);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    default:
 | 
						|
    {
 | 
						|
      ASSERT (0);
 | 
						|
      Offset = 0;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  } // switch
 | 
						|
 | 
						|
  *PkgLength = RealLength;
 | 
						|
 | 
						|
  return Offset;
 | 
						|
}
 | 
						|
 | 
						|
/** Convert the Length to the AML PkgLen encoding,
 | 
						|
    then and write it in the Buffer.
 | 
						|
 | 
						|
  @param  [in]    Length  Length to convert.
 | 
						|
                          Length cannot exceed 2^28.
 | 
						|
  @param  [out]   Buffer  Write the result in this Buffer.
 | 
						|
 | 
						|
  @return The number of bytes used to write the Length.
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
EFIAPI
 | 
						|
AmlSetPkgLength (
 | 
						|
  IN  UINT32  Length,
 | 
						|
  OUT UINT8   *Buffer
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8   LeadByte;
 | 
						|
  UINT8   Offset;
 | 
						|
  UINT8   CurrentOffset;
 | 
						|
  UINT8   CurrentShift;
 | 
						|
  UINT32  ComputedLength;
 | 
						|
 | 
						|
  if (Buffer == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  LeadByte = 0;
 | 
						|
  Offset   = 0;
 | 
						|
 | 
						|
  if ((Length < (1 << 6))) {
 | 
						|
    // Length < 2^6, only need one byte to encode it.
 | 
						|
    LeadByte = (UINT8)Length;
 | 
						|
  } else {
 | 
						|
    // Need more than one byte to encode it.
 | 
						|
    // Test Length to find how many bytes are needed.
 | 
						|
 | 
						|
    if (Length >= (1 << 28)) {
 | 
						|
      // Length >= 2^28, should not be possible.
 | 
						|
      ASSERT (0);
 | 
						|
      return 0;
 | 
						|
    } else if (Length >= (1 << 20)) {
 | 
						|
      // Length >= 2^20
 | 
						|
      Offset = 3;
 | 
						|
    } else if (Length >= (1 << 12)) {
 | 
						|
      // Length >= 2^12
 | 
						|
      Offset = 2;
 | 
						|
    } else if (Length >= (1 << 6)) {
 | 
						|
      // Length >= 2^6
 | 
						|
      Offset = 1;
 | 
						|
    } else {
 | 
						|
      // Should not be possible.
 | 
						|
      ASSERT (0);
 | 
						|
      return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    // Set the LeadByte.
 | 
						|
    LeadByte = (UINT8)(Offset << 6);
 | 
						|
    LeadByte = (UINT8)(LeadByte | (Length & 0xF));
 | 
						|
  }
 | 
						|
 | 
						|
  // Write to the Buffer.
 | 
						|
  *Buffer       = LeadByte;
 | 
						|
  CurrentOffset = 1;
 | 
						|
  while (CurrentOffset < (Offset + 1)) {
 | 
						|
    CurrentShift              = (UINT8)((CurrentOffset - 1) * 8);
 | 
						|
    ComputedLength            = Length & (UINT32)(0x00000FF0 << CurrentShift);
 | 
						|
    ComputedLength            = (ComputedLength) >> (4 + CurrentShift);
 | 
						|
    LeadByte                  = (UINT8)(ComputedLength & 0xFF);
 | 
						|
    *(Buffer + CurrentOffset) = LeadByte;
 | 
						|
    CurrentOffset++;
 | 
						|
  }
 | 
						|
 | 
						|
  return ++Offset;
 | 
						|
}
 | 
						|
 | 
						|
/** Compute the number of bytes required to write a package length.
 | 
						|
 | 
						|
  @param  [in]  Length  The length to convert in the AML package length
 | 
						|
                        encoding style.
 | 
						|
                        Length cannot exceed 2^28.
 | 
						|
 | 
						|
  @return The number of bytes required to write the Length.
 | 
						|
**/
 | 
						|
UINT8
 | 
						|
EFIAPI
 | 
						|
AmlComputePkgLengthWidth (
 | 
						|
  IN  UINT32  Length
 | 
						|
  )
 | 
						|
{
 | 
						|
  // Length >= 2^28, should not be possible.
 | 
						|
  if (Length >= (1 << 28)) {
 | 
						|
    ASSERT (0);
 | 
						|
    return 0;
 | 
						|
  } else if (Length >= (1 << 20)) {
 | 
						|
    // Length >= 2^20
 | 
						|
    return 4;
 | 
						|
  } else if (Length >= (1 << 12)) {
 | 
						|
    // Length >= 2^12
 | 
						|
    return 3;
 | 
						|
  } else if (Length >= (1 << 6)) {
 | 
						|
    // Length >= 2^6
 | 
						|
    return 2;
 | 
						|
  }
 | 
						|
 | 
						|
  // Length < 2^6
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
/** Given a length, compute the value of a PkgLen.
 | 
						|
 | 
						|
  In AML, some object have a PkgLen, telling the size of the AML object.
 | 
						|
  It can be encoded in 1 to 4 bytes. The bytes used to encode the PkgLen is
 | 
						|
  itself counted in the PkgLen value.
 | 
						|
  This means that if an AML object sees its size increment/decrement,
 | 
						|
  the number of bytes used to encode the PkgLen value can itself
 | 
						|
  increment/decrement.
 | 
						|
 | 
						|
  For instance, the AML encoding of a DeviceOp is:
 | 
						|
    DefDevice := DeviceOp PkgLength NameString TermList
 | 
						|
  If:
 | 
						|
   - sizeof (NameString) = 4 (the name is "DEV0" for instance);
 | 
						|
   - sizeof (TermList) = (2^6-6)
 | 
						|
  then the PkgLen is encoded on 1 byte. Indeed, its value is:
 | 
						|
    sizeof (PkgLen) + sizeof (NameString) + sizeof (TermList) =
 | 
						|
    sizeof (PkgLen) + 4 + (2^6-6)
 | 
						|
  So:
 | 
						|
    PkgLen = sizeof (PkgLen) + (2^6-2)
 | 
						|
 | 
						|
  The input arguments Length and PkgLen represent, for the DefDevice:
 | 
						|
    DefDevice := DeviceOp PkgLength NameString TermList
 | 
						|
                                    |------Length-----|
 | 
						|
                          |--------*PgkLength---------|
 | 
						|
 | 
						|
  @param  [in]  Length  The length to encode as a PkgLen.
 | 
						|
                        Length cannot exceed 2^28 - 4 (4 bytes for the
 | 
						|
                        PkgLen encoding).
 | 
						|
                        The size of the PkgLen encoding bytes should not be
 | 
						|
                        counted in this length value.
 | 
						|
  @param  [out] PkgLen  If success, contains the value of the PkgLen,
 | 
						|
                        ready to encode in the PkgLen format.
 | 
						|
                        This value takes into account the size of PkgLen
 | 
						|
                        encoding.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlComputePkgLength (
 | 
						|
  IN  UINT32  Length,
 | 
						|
  OUT UINT32  *PkgLen
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  PkgLenWidth;
 | 
						|
  UINT32  ReComputedPkgLenWidth;
 | 
						|
 | 
						|
  if (PkgLen == NULL) {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Compute the PkgLenWidth.
 | 
						|
  PkgLenWidth = AmlComputePkgLengthWidth (Length);
 | 
						|
  if (PkgLenWidth == 0) {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Add it to the Length.
 | 
						|
  Length += PkgLenWidth;
 | 
						|
 | 
						|
  // Check that adding the PkgLenWidth didn't trigger a domino effect,
 | 
						|
  // increasing the encoding width of the PkgLen again.
 | 
						|
  // The PkgLen is encoded in at most 4 bytes. It is possible to increase
 | 
						|
  // the PkgLen width if its encoding is less than 3 bytes.
 | 
						|
  ReComputedPkgLenWidth = AmlComputePkgLengthWidth (Length);
 | 
						|
  if (ReComputedPkgLenWidth != PkgLenWidth) {
 | 
						|
    if ((ReComputedPkgLenWidth != 0)   &&
 | 
						|
        (ReComputedPkgLenWidth < 4))
 | 
						|
    {
 | 
						|
      // No need to recompute the PkgLen since a new threshold cannot
 | 
						|
      // be reached by incrementing the value by one.
 | 
						|
      Length += 1;
 | 
						|
    } else {
 | 
						|
      ASSERT (0);
 | 
						|
      return EFI_INVALID_PARAMETER;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  *PkgLen = Length;
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |