2005-06-29 21:25:34 +04:00
/******************************************************************************
2005-06-29 21:30:16 +04:00
*
* Module Name : isnames - interpreter / scanner name load / execute
2005-06-29 21:25:34 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/******************************************************************************
*
* 1. Copyright Notice
*
2005-06-29 21:30:16 +04:00
* Some or all of this work - Copyright ( c ) 1999 , Intel Corp . All rights
2005-06-29 21:25:34 +04:00
* reserved .
*
* 2. License
2005-06-29 21:30:16 +04:00
*
* 2.1 . Intel grants , free of charge , to any person ( " Licensee " ) obtaining a
* copy of the source code appearing in this file ( " Covered Code " ) a license
* under Intel ' s copyrights in the base code distributed originally by Intel
* ( " Original Intel Code " ) to copy , make derivatives , distribute , use and
* display any portion of the Covered Code in any form ; and
*
* 2.2 . Intel grants Licensee a non - exclusive and non - transferable patent
* license ( without the right to sublicense ) , under only those claims of Intel
* patents that are infringed by the Original Intel Code , to make , use , sell ,
* offer to sell , and import the Covered Code and derivative works thereof
* solely to the minimum extent necessary to exercise the above copyright
* license , and in no event shall the patent license extend to any additions to
* or modifications of the Original Intel Code . No other license or right is
* granted directly or by implication , estoppel or otherwise ;
*
* the above copyright and patent license is granted only if the following
2005-06-29 21:25:34 +04:00
* conditions are met :
*
2005-06-29 21:30:16 +04:00
* 3. Conditions
*
* 3.1 . Redistribution of source code of any substantial portion of the Covered
* Code or modification must include the above Copyright Notice , the above
* License , this list of Conditions , and the following Disclaimer and Export
* Compliance provision . In addition , Licensee must cause all Covered Code to
* which Licensee contributes to contain a file documenting the changes
* Licensee made to create that Covered Code and the date of any change .
* Licensee must include in that file the documentation of any changes made by
* any predecessor Licensee . Licensee must include a prominent statement that
* the modification is derived , directly or indirectly , from Original Intel
* Code .
*
* 3.2 . Redistribution in binary form of any substantial portion of the Covered
* Code or modification must reproduce the above Copyright Notice , and the
* following Disclaimer and Export Compliance provision in the documentation
* and / or other materials provided with the distribution .
*
* 3.3 . Intel retains all right , title , and interest in and to the Original
2005-06-29 21:25:34 +04:00
* Intel Code .
*
2005-06-29 21:30:16 +04:00
* 3.4 . Neither the name Intel nor any other trademark owned or controlled by
* Intel shall be used in advertising or otherwise to promote the sale , use or
* other dealings in products derived from or relating to the Covered Code
2005-06-29 21:25:34 +04:00
* without prior written authorization from Intel .
*
* 4. Disclaimer and Export Compliance
*
2005-06-29 21:30:16 +04:00
* 4.1 . INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
* HERE . ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
* IS PROVIDED " AS IS, " AND INTEL WILL NOT PROVIDE ANY SUPPORT , ASSISTANCE ,
* INSTALLATION , TRAINING OR OTHER SERVICES . INTEL WILL NOT PROVIDE ANY
* UPDATES , ENHANCEMENTS OR EXTENSIONS . INTEL SPECIFICALLY DISCLAIMS ANY
* IMPLIED WARRANTIES OF MERCHANTABILITY , NONINFRINGEMENT AND FITNESS FOR A
* PARTICULAR PURPOSE .
*
* 4.2 . IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE , ITS LICENSEES
* OR ANY OTHER THIRD PARTY , FOR ANY LOST PROFITS , LOST DATA , LOSS OF USE OR
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES , OR FOR ANY INDIRECT ,
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT , UNDER ANY
* CAUSE OF ACTION OR THEORY OF LIABILITY , AND IRRESPECTIVE OF WHETHER INTEL
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES . THESE LIMITATIONS
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
2005-06-29 21:25:34 +04:00
* LIMITED REMEDY .
*
2005-06-29 21:30:16 +04:00
* 4.3 . Licensee shall not export , either directly or indirectly , any of this
* software or system incorporating such software without first obtaining any
* required license or other approval from the U . S . Department of Commerce or
* any other agency or department of the United States Government . In the
* event Licensee exports any such software from the United States or re -
* exports any such software from a foreign destination , Licensee shall ensure
* that the distribution and export / re - export of the software is in compliance
* with all laws , regulations , orders , or other restrictions of the U . S . Export
* Administration Regulations . Licensee agrees that neither it nor any of its
* subsidiaries will export / re - export any technical data , process , software , or
* service , directly or indirectly , to any country for which the United States
* government or any agency thereof requires an export license , other
* governmental approval , or letter of assurance , without first obtaining such
* license , approval or letter .
2005-06-29 21:25:34 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-29 21:22:09 +04:00
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
# define __ISNAMES_C__
# include <acpi.h>
# include <interpreter.h>
# include <amlcode.h>
# include <namespace.h>
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
# define _THIS_MODULE "isnames.c"
2005-06-29 21:25:30 +04:00
# define _COMPONENT INTERPRETER
2005-06-29 21:30:16 +04:00
static ST_KEY_DESC_TABLE KDT [ ] = {
{ " 0000 " , ' 1 ' , " LastFQN: Allocation failure requesting " , " LastFQN: Allocation failure requesting " } ,
{ " 0001 " , ' 1 ' , " AmlAllocateNameString: name allocation failure " , " AmlAllocateNameString: name allocation failure " } ,
{ " 0002 " , ' 1 ' , " NamedObject/NameSpaceModifier Failure with at least one more byte available in package " , " NamedObject/NameSpaceModifier Failure with at least one more byte available in package " } ,
{ " 0003 " , ' 1 ' , " During LOAD this segment started with one or more valid characters, but fewer than 4 " , " During LOAD this segment started with one or more valid characters, but fewer than 4 " } ,
{ " 0004 " , ' 1 ' , " *UNEXPECTED END* [Name] " , " *UNEXPECTED END* [Name] " } ,
{ " 0005 " , ' 1 ' , " Ran out of segments after processing a prefix " , " Ran out of segments after processing a prefix (See Log for details) " } ,
{ NULL , ' I ' , NULL , NULL }
} ;
/* |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
*
* Functions that Load / Dump / Execute Names
*
* | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
*/
2005-06-29 21:25:30 +04:00
/*****************************************************************************
*
2005-06-29 21:30:16 +04:00
* FUNCTION : AmlAllocateNameString
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:25:45 +04:00
* PARAMETERS : PrefixCount - Count of parent levels . Special cases :
2005-06-29 21:30:16 +04:00
* - 1 = > root
* 0 = > none
2005-06-29 21:25:45 +04:00
* NumNameSegs - count of 4 - character name segments
2005-06-29 21:25:30 +04:00
*
* DESCRIPTION : Ensure allocated name string is long enough ,
* and set up prefix if any .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-29 21:30:16 +04:00
void
AmlAllocateNameString ( INT32 PrefixCount , INT32 NumNameSegs )
2005-06-29 20:55:03 +04:00
{
2005-06-29 21:30:16 +04:00
char * TempPtr ;
INT32 SizeNeeded ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:25:45 +04:00
FUNCTION_TRACE ( " AmlAllocateNameString " ) ;
2005-06-29 21:17:38 +04:00
2005-06-29 21:30:16 +04:00
/*
* Room for all \ and ^ prefixes , all segments , and a MultiNamePrefix .
2005-06-29 20:55:03 +04:00
* This may actually be somewhat longer than needed .
*/
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
/* !!!Commented out for now, until we link INT32 a library with ABS
* Fix below may or may not be sufficient ! ! !
SizeNeeded = abs ( PrefixCount ) + 4 * NumNameSegs + 2 ;
*/
2005-06-29 21:25:30 +04:00
if ( PrefixCount < 0 )
{
2005-06-29 21:30:16 +04:00
SizeNeeded = 1 /* root */ + 4 * NumNameSegs + 2 ;
2005-06-29 21:25:30 +04:00
}
else
2005-06-29 21:17:31 +04:00
{
2005-06-29 21:30:16 +04:00
SizeNeeded = PrefixCount + 4 * NumNameSegs + 2 ;
2005-06-29 21:25:30 +04:00
}
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
#if 0
if ( 2 = = PrefixCount )
{
Trace | = TraceNames ;
}
else
{
Trace & = ~ TraceNames ;
}
# endif
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
if ( SizeNeeded < INITIAL_NAME_BUF_SIZE )
2005-06-29 21:26:09 +04:00
{
2005-06-29 21:30:16 +04:00
SizeNeeded = INITIAL_NAME_BUF_SIZE ;
}
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
/* If need > current size, free and allocate a new one. */
if ( SizeNeeded > NameStringSize )
{
if ( NameString )
{
OsdFree ( NameString ) ;
}
else
{
RegisterStaticBlockPtr ( & NameString ) ;
}
NameString = OsdAllocate ( ( size_t ) SizeNeeded ) ;
if ( NameString )
{
NameStringSize = SizeNeeded ;
}
else
{
/* allocation failure */
REPORT_ERROR ( & KDT [ 1 ] ) ;
NameStringSize = 0 ;
FUNCTION_EXIT ;
return ;
}
2005-06-29 20:55:03 +04:00
}
TempPtr = NameString ;
/* Set up Root or Parent prefixes if needed */
2005-06-29 21:25:30 +04:00
if ( PrefixCount < 0 )
2005-06-29 20:55:03 +04:00
{
2005-06-29 21:30:16 +04:00
* TempPtr + + = AML_RootPrefix ;
2005-06-29 20:55:03 +04:00
}
else
{
while ( PrefixCount - - )
{
2005-06-29 21:30:16 +04:00
* TempPtr + + = AML_ParentPrefix ;
2005-06-29 20:55:03 +04:00
}
}
/* Set up Dual or Multi prefixes if needed */
2005-06-29 21:30:16 +04:00
2005-06-29 20:55:03 +04:00
if ( NumNameSegs > 2 )
{
2005-06-29 21:30:16 +04:00
/* set up multi prefixes */
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
* TempPtr + + = AML_MultiNamePrefixOp ;
2005-06-29 20:55:03 +04:00
* TempPtr + + = ( char ) NumNameSegs ;
}
2005-06-29 21:25:30 +04:00
2005-06-29 20:55:03 +04:00
else if ( 2 = = NumNameSegs )
{
/* Set up dual prefixes */
2005-06-29 21:30:16 +04:00
* TempPtr + + = AML_DualNamePrefix ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:30:16 +04:00
/* Terminate string following prefixes. AmlDoSeg() will append the segment(s) */
2005-06-29 21:22:15 +04:00
2005-06-29 21:30:16 +04:00
DEBUG_PRINT ( TRACE_NAMES , ( " AmlAllocateNameString: " ) ) ;
2005-06-29 21:25:45 +04:00
* TempPtr = 0 ;
2005-06-29 21:30:16 +04:00
for ( TempPtr = NameString ; * TempPtr ; + + TempPtr )
{
DEBUG_PRINT_RAW ( TRACE_NAMES , ( " %02x " , * TempPtr ) ) ;
}
2005-06-29 21:25:45 +04:00
2005-06-29 21:30:16 +04:00
DEBUG_PRINT_RAW ( TRACE_NAMES , ( " %s \n " , NameString ) ) ;
FUNCTION_EXIT ;
2005-06-29 21:26:29 +04:00
}
2005-06-29 21:25:30 +04:00
/*****************************************************************************
2005-06-29 21:22:03 +04:00
*
2005-06-29 21:30:16 +04:00
* FUNCTION : AmlGoodChar
*
* PARAMETERS : Character - The character to be examined
*
* RETURN : 1 if Character may appear in a name , else 0
*
* DESCRIPTION : Check for a printable character
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
INT32
AmlGoodChar ( INT32 Character )
{
return ( ( Character = = ' _ ' ) | | ( Character > = ' A ' & & Character < = ' Z ' ) | |
( Character > = ' 0 ' & & Character < = ' 9 ' ) ) ;
}
/*****************************************************************************
*
* FUNCTION : AmlDecodePackageLength
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:25:45 +04:00
* PARAMETERS : LastPkgLen - latest value decoded by DoPkgLength ( ) for
* most recently examined package or field
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:25:45 +04:00
* RETURN : Number of bytes contained in package length encoding
2005-06-29 21:25:30 +04:00
*
* DESCRIPTION : Decodes the Package Length . Upper 2 bits are are used to
* tell if type 1 , 2 , 3 , or 4.
2005-06-29 21:30:16 +04:00
* 0x3F = Max 1 byte encoding ,
* 0xFFF = Max 2 byte encoding ,
* 0xFFFFF = Max 3 Byte encoding ,
2005-06-29 21:25:30 +04:00
* 0xFFFFFFFFF = Max 4 Byte encoding .
2005-06-29 21:22:03 +04:00
*
2005-06-29 21:25:30 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
# define Type1 64 /* or 0x40 Max encoding size = 0x3F */
# define Type2 16384 /* or 0x4000 Max encoding size = 0xFFF */
# define Type3 4194304 /* or 0x400000 Max encoding size = 0xFFFFF */
# define Type4 1073741824 /* or 0x40000000 Max encoding size = 0xFFFFFFF */
2005-06-29 21:26:09 +04:00
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
INT32
AmlDecodePackageLength ( INT32 LastPkgLen )
{
INT32 NumBytes = 0 ;
2005-06-29 21:25:45 +04:00
FUNCTION_TRACE ( " AmlDecodePackageLength " ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
if ( LastPkgLen < Type1 )
2005-06-29 21:25:30 +04:00
NumBytes = 1 ;
2005-06-29 21:30:16 +04:00
else if ( LastPkgLen < Type2 )
2005-06-29 21:25:30 +04:00
NumBytes = 2 ;
2005-06-29 21:30:16 +04:00
else if ( LastPkgLen < Type3 )
2005-06-29 21:25:30 +04:00
NumBytes = 3 ;
2005-06-29 21:30:16 +04:00
else if ( LastPkgLen < Type4 )
2005-06-29 21:25:30 +04:00
NumBytes = 4 ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
FUNCTION_EXIT ;
return NumBytes ;
2005-06-29 21:25:30 +04:00
}
/*****************************************************************************
*
2005-06-29 21:30:16 +04:00
* FUNCTION : AmlDoSeg
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:30:16 +04:00
* PARAMETERS : LoadExecMode - MODE_Load or MODE_Exec
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:25:45 +04:00
* RETURN : Status
2005-06-29 21:25:30 +04:00
*
2005-06-29 21:30:16 +04:00
* DESCRIPTION : Print / exec a name segment ( 4 bytes )
2005-06-29 21:25:30 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-29 21:25:45 +04:00
ACPI_STATUS
2005-06-29 21:30:16 +04:00
AmlDoSeg ( OpMode LoadExecMode )
2005-06-29 21:25:30 +04:00
{
2005-06-29 21:30:16 +04:00
ACPI_STATUS Status = AE_OK ;
INT32 Index ;
char CharBuf [ 5 ] ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
FUNCTION_TRACE ( " AmlDoSeg " ) ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
/* If first character is a digit, we aren't looking at a valid name segment */
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
CharBuf [ 0 ] = AmlPeek ( ) ;
2005-06-29 20:55:03 +04:00
if ( ' 0 ' < = CharBuf [ 0 ] & & CharBuf [ 0 ] < = ' 9 ' )
{
2005-06-29 21:30:16 +04:00
DEBUG_PRINT ( ACPI_ERROR , ( " AmlDoSeg: leading digit: %c \n " , CharBuf [ 0 ] ) ) ;
Status = AE_PENDING ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:30:16 +04:00
else
2005-06-29 20:55:03 +04:00
{
2005-06-29 21:30:16 +04:00
DEBUG_PRINT ( TRACE_LOAD , ( " AmlDoSeg: \n " ) ) ;
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
for ( Index = 4 ; Index > 0 & & AmlGoodChar ( AmlPeek ( ) ) ; - - Index )
{
AmlConsumeStreamBytes ( 1 , ( UINT8 * ) & CharBuf [ 4 - Index ] ) ;
DEBUG_PRINT ( TRACE_LOAD , ( " %c \n " , CharBuf [ 4 - Index ] ) ) ;
}
}
2005-06-29 20:55:03 +04:00
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
if ( AE_OK = = Status )
2005-06-29 21:26:29 +04:00
{
2005-06-29 21:30:16 +04:00
/* valid name segment */
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
if ( 0 = = Index )
{
/* Found 4 valid characters */
CharBuf [ 4 ] = ' \0 ' ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
if ( NameStringSize )
{
strcat ( NameString , CharBuf ) ;
}
DEBUG_PRINT ( TRACE_NAMES , ( " AmlDoSeg: %s \n " , CharBuf ) ) ;
}
else if ( 4 = = Index )
2005-06-29 21:22:03 +04:00
{
2005-06-29 21:30:16 +04:00
/*
* First character was not a valid name character ,
* so we are looking at something other than a name .
*/
DEBUG_PRINT ( ACPI_ERROR , ( " Leading char not alpha: %02Xh (not a name) \n " , CharBuf [ 0 ] ) ) ;
Status = AE_PENDING ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:25:30 +04:00
2005-06-29 20:55:03 +04:00
else
{
2005-06-29 21:30:16 +04:00
/* Segment started with one or more valid characters, but fewer than 4 */
Status = AE_AML_ERROR ;
DEBUG_PRINT ( TRACE_LOAD , ( " *Bad char %02x in name* \n " , AmlPeek ( ) ) ) ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
if ( MODE_Load = = LoadExecMode )
{
/* second pass load mode */
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
REPORT_ERROR ( & KDT [ 3 ] ) ;
}
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
else
{
DEBUG_PRINT ( ACPI_ERROR , ( " AmlDoSeg: Bad char %02x in name \n " , AmlPeek ( ) ) ) ;
}
}
2005-06-29 21:26:38 +04:00
}
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
DEBUG_PRINT ( TRACE_EXEC , ( " Leave AmlDoSeg %s \n " , ExceptionNames [ Status ] ) ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
FUNCTION_EXIT ;
return Status ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:25:30 +04:00
/*****************************************************************************
2005-06-29 20:55:03 +04:00
*
2005-06-29 21:30:16 +04:00
* FUNCTION : AmlDoName
2005-06-29 20:55:03 +04:00
*
2005-06-29 21:25:45 +04:00
* PARAMETERS : DataType - Data type to be associated with this name
2005-06-29 21:30:16 +04:00
* LoadExecMode - MODE_Load or MODE_Exec
2005-06-29 20:55:03 +04:00
*
2005-06-29 21:25:45 +04:00
* RETURN : Status
2005-06-29 20:55:03 +04:00
*
2005-06-29 21:30:16 +04:00
* DESCRIPTION : Print a name , including any prefixes , enter it in the
* name space , and put its handle on the stack .
2005-06-29 20:55:03 +04:00
*
2005-06-29 21:25:30 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-06-29 21:22:58 +04:00
2005-06-29 21:25:45 +04:00
ACPI_STATUS
2005-06-29 21:30:16 +04:00
AmlDoName ( NsType DataType , OpMode LoadExecMode )
2005-06-29 20:55:03 +04:00
{
2005-06-29 21:30:16 +04:00
ACPI_STATUS Status = AE_OK ;
INT32 NumSegments ;
INT32 PrefixCount = 0 ;
UINT8 Prefix = 0 ;
NsHandle handle ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
FUNCTION_TRACE ( " AmlDoName " ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:22:03 +04:00
2005-06-29 21:30:16 +04:00
BREAKPOINT3 ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
CheckTrash ( " enter AmlDoName " ) ;
if ( TYPE_DefField = = DataType | |
TYPE_BankField = = DataType | |
TYPE_IndexField = = DataType )
{
/* Disallow prefixes for types associated with field names */
AmlAllocateNameString ( 0 , 1 ) ;
Status = AmlDoSeg ( LoadExecMode ) ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:25:30 +04:00
2005-06-29 20:55:03 +04:00
else
2005-06-29 21:30:16 +04:00
{
/* DataType is not a field name */
2005-06-29 21:22:32 +04:00
2005-06-29 21:30:16 +04:00
switch ( AmlPeekOp ( ) )
{
/* examine first character of name for root or parent prefix operators */
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
case AML_RootPrefix :
AmlConsumeStreamBytes ( 1 , & Prefix ) ;
2005-06-29 21:25:30 +04:00
DEBUG_PRINT ( TRACE_LOAD , ( " RootPrefix: %x \n " , Prefix ) ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
/*
2005-06-29 20:55:03 +04:00
* Remember that we have a RootPrefix - -
2005-06-29 21:30:16 +04:00
* see comment in AmlAllocateNameString ( )
2005-06-29 20:55:03 +04:00
*/
2005-06-29 21:25:30 +04:00
PrefixCount = - 1 ;
break ;
2005-06-29 21:22:32 +04:00
2005-06-29 21:30:16 +04:00
case AML_ParentPrefix :
2005-06-29 20:55:03 +04:00
do
{
2005-06-29 21:30:16 +04:00
AmlConsumeStreamBytes ( 1 , & Prefix ) ;
2005-06-29 21:25:30 +04:00
DEBUG_PRINT ( TRACE_LOAD , ( " ParentPrefix: %x \n " , Prefix ) ) ;
+ + PrefixCount ;
2005-06-29 21:30:16 +04:00
} while ( AmlPeekOp ( ) = = AML_ParentPrefix ) ;
2005-06-29 20:55:03 +04:00
break ;
default :
break ;
}
2005-06-29 21:30:16 +04:00
switch ( AmlPeekOp ( ) )
2005-06-29 20:55:03 +04:00
{
2005-06-29 21:30:16 +04:00
/* examine first character of name for name segment prefix operator */
case AML_DualNamePrefix :
AmlConsumeStreamBytes ( 1 , & Prefix ) ;
2005-06-29 21:25:30 +04:00
DEBUG_PRINT ( TRACE_LOAD , ( " DualNamePrefix: %x \n " , Prefix ) ) ;
2005-06-29 21:30:16 +04:00
AmlAllocateNameString ( PrefixCount , 2 ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:25:30 +04:00
/* Ensure PrefixCount != 0 to remember processing a prefix */
2005-06-29 21:30:16 +04:00
2005-06-29 21:25:30 +04:00
PrefixCount + = 2 ;
2005-06-29 21:30:16 +04:00
if ( ( Status = AmlDoSeg ( LoadExecMode ) ) = = AE_OK )
2005-06-29 21:22:25 +04:00
{
2005-06-29 21:30:16 +04:00
Status = AmlDoSeg ( LoadExecMode ) ;
2005-06-29 21:22:25 +04:00
}
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
break ;
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
case AML_MultiNamePrefixOp :
AmlConsumeStreamBytes ( 1 , & Prefix ) ;
2005-06-29 21:25:30 +04:00
DEBUG_PRINT ( TRACE_LOAD , ( " MultiNamePrefix: %x \n " , Prefix ) ) ;
2005-06-29 21:22:03 +04:00
2005-06-29 21:30:16 +04:00
NumSegments = AmlPeek ( ) ; /* fetch count of segments */
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
if ( AmlDoByteConst ( MODE_Load , 0 ) ! = AE_OK )
2005-06-29 21:26:09 +04:00
{
2005-06-29 21:30:16 +04:00
/* unexpected end of AML */
REPORT_ERROR ( & KDT [ 4 ] ) ;
Status = AE_AML_ERROR ;
2005-06-29 21:26:09 +04:00
break ;
}
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
AmlAllocateNameString ( PrefixCount , NumSegments ) ;
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
/* Ensure PrefixCount != 0 to remember processing a prefix */
2005-06-29 21:25:30 +04:00
PrefixCount + = 2 ;
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
while ( NumSegments & & ( Status = AmlDoSeg ( LoadExecMode ) ) = = AE_OK )
2005-06-29 21:22:25 +04:00
{
2005-06-29 21:25:30 +04:00
- - NumSegments ;
2005-06-29 21:22:25 +04:00
}
2005-06-29 20:55:03 +04:00
2005-06-29 21:25:30 +04:00
break ;
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
case 0 :
/* NullName valid as of 8-12-98 ASL/AML Grammar Update */
if ( - 1 = = PrefixCount )
{
/* RootPrefix followed by NULL */
DEBUG_PRINT ( TRACE_EXEC ,
( " AmlDoName: NameSeg is \" \\ \" followed by NULL \n " ) ) ;
}
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
AmlConsumeStreamBytes ( 1 , NULL ) ; /* consume NULL byte */
AmlAllocateNameString ( PrefixCount , 0 ) ;
break ;
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
default :
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
/* name segment string */
2005-06-29 21:26:38 +04:00
2005-06-29 21:30:16 +04:00
AmlAllocateNameString ( PrefixCount , 1 ) ;
Status = AmlDoSeg ( LoadExecMode ) ;
break ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
} /* switch (PeekOp ()) */
}
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
if ( AE_OK = = Status )
{
/* All prefixes have been handled, and the name is in NameString */
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
LocalDeleteObject ( ( OBJECT_DESCRIPTOR * * ) & ObjStack [ ObjStackTop ] ) ;
Status = NsEnter ( NameString , DataType , LoadExecMode ,
( NAME_TABLE_ENTRY * * ) & ObjStack [ ObjStackTop ] ) ;
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
/* Help view ObjStack during debugging */
2005-06-29 21:22:32 +04:00
2005-06-29 21:30:16 +04:00
handle = ObjStack [ ObjStackTop ] ;
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
/* Globally set this handle for use later */
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
if ( MODE_Load1 = = LoadExecMode )
{
LastMethod = handle ;
}
2005-06-29 21:24:40 +04:00
2005-06-29 21:30:16 +04:00
if ( MODE_Exec = = LoadExecMode & & ! ObjStack [ ObjStackTop ] )
{
DEBUG_PRINT ( ACPI_ERROR , ( " AmlDoName: Name Lookup Failure \n " ) ) ;
Status = AE_AML_ERROR ;
}
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
else if ( MODE_Load1 ! = LoadExecMode )
{
/* not first pass load */
if ( TYPE_Any = = DataType & &
TYPE_Method = = NsGetType ( ObjStack [ ObjStackTop ] ) )
{
/*
* Method reference call
* The name just looked up is a Method that was already
* defined , so this is a reference ( call ) . Scan the args .
* The arg count is in the MethodFlags , which is the first
* byte of the Method ' s AML .
*/
METHOD_INFO * MethodPtr = ( METHOD_INFO * ) NsGetValue ( ObjStack [ ObjStackTop ] ) ;
if ( MethodPtr )
{
/* MethodPtr valid */
INT32 MethodFlags ;
MethodFlags = AmlGetPCodeByte ( MethodPtr - > Offset ) ;
if ( AML_END_OF_BLOCK = = MethodFlags )
{
DEBUG_PRINT ( ACPI_ERROR , ( " AmlDoName: invoked Method %s has no AML \n " ,
NameString ) ) ;
Status = AE_AML_ERROR ;
}
else
{
/* MethodPtr points at valid method */
INT32 ArgCount = ( MethodFlags & METHOD_ARG_COUNT_MASK )
> > METHOD_ARG_COUNT_SHIFT ;
INT32 StackBeforeArgs = ObjStackTop ;
if ( ( ( Status = AmlPushIfExec ( MODE_Exec ) ) = = AE_OK ) & &
( ArgCount > 0 ) )
{
/* get arguments */
while ( ArgCount - - & & ( AE_OK = = Status ) )
{
/* get each argument */
if ( AE_OK = = ( Status = AmlDoOpCode ( LoadExecMode ) ) ) /* get argument */
{
/* argument on object stack */
/*
* Arguments ( e . g . , local variables and control
* method arguments ) passed to control methods
* are values , not references .
* TBD : RefOf problem with iGetRvalue ( ) conversion .
*/
if ( MODE_Exec = = LoadExecMode )
{
Status = AmlGetRvalue ( ( OBJECT_DESCRIPTOR * * )
& ObjStack [ ObjStackTop ] ) ;
}
if ( AE_OK = = Status )
{
Status = AmlPushIfExec ( LoadExecMode ) ; /* inc iObjStackTop */
}
}
}
}
if ( ( AE_OK = = Status ) & & ( MODE_Exec = = LoadExecMode ) )
{
/* execution mode */
/* Mark end of arg list */
LocalDeleteObject ( ( OBJECT_DESCRIPTOR * * ) & ObjStack [ ObjStackTop ] ) ;
ObjStack [ ObjStackTop ] = NULL ;
/* Establish Method's scope as current */
NsPushMethodScope ( ( NsHandle ) ObjStack [ StackBeforeArgs ] ) ;
DEBUG_PRINT ( TRACE_LOAD ,
( " Calling %4.4s, StackBeforeArgs %d ObjStackTop %d \n " ,
ObjStack [ StackBeforeArgs ] , StackBeforeArgs ,
ObjStackTop ) ) ;
/* Execute the Method, passing the stacked args */
Status = AmlExecuteMethod (
MethodPtr - > Offset + 1 , MethodPtr - > Length - 1 ,
( OBJECT_DESCRIPTOR * * ) & ObjStack [ StackBeforeArgs + 1 ] ) ;
DEBUG_PRINT ( TRACE_LOAD ,
( " AmlExec Status=%s, StackBeforeArgs %d ObjStackTop %d \n " ,
ExceptionNames [ Status ] , StackBeforeArgs , ObjStackTop ) ) ;
if ( AE_RETURN_VALUE = = Status )
{
/* recover returned value */
if ( StackBeforeArgs < ObjStackTop )
{
LocalDeleteObject ( ( OBJECT_DESCRIPTOR * * ) & ObjStack [ StackBeforeArgs ] ) ;
ObjStack [ StackBeforeArgs ] = ObjStack [ ObjStackTop - - ] ;
}
Status = AE_OK ;
}
/* Pop scope stack */
NsPopCurrent ( TYPE_Any ) ;
} /* execution mode */
/* Clean up object stack */
while ( ObjStackTop > StackBeforeArgs )
{
LocalDeleteObject ( ( OBJECT_DESCRIPTOR * * ) & ObjStack [ ObjStackTop ] ) ;
/* Zero out the slot and move on */
ObjStack [ ObjStackTop ] = NULL ;
ObjStackTop - - ;
}
}
}
}
}
}
2005-06-29 21:26:09 +04:00
2005-06-29 21:30:16 +04:00
else if ( AE_PENDING = = Status & & PrefixCount ! = 0 )
2005-06-29 20:55:03 +04:00
{
/* Ran out of segments after processing a prefix */
2005-06-29 21:30:16 +04:00
if ( MODE_Load1 = = LoadExecMode | | MODE_Load = = LoadExecMode )
{
DEBUG_PRINT ( ACPI_ERROR , ( " ***Malformed Name*** \n " ) ) ;
REPORT_ERROR ( & KDT [ 5 ] ) ;
}
else
{
DEBUG_PRINT ( ACPI_ERROR , ( " AmlDoName: Malformed Name \n " ) ) ;
}
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
Status = AE_AML_ERROR ;
2005-06-29 20:55:03 +04:00
}
2005-06-29 21:30:16 +04:00
CheckTrash ( " leave AmlDoName " ) ;
2005-06-29 21:25:30 +04:00
2005-06-29 21:30:16 +04:00
DEBUG_PRINT ( TRACE_EXEC , ( " Leave AmlDoName %s \n " , ExceptionNames [ Status ] ) ) ;
2005-06-29 20:55:03 +04:00
2005-06-29 21:30:16 +04:00
FUNCTION_EXIT ;
return Status ;
2005-06-29 20:55:03 +04:00
}