ACPI NameSpace Manager

date	99.04.08.23.22.00;	author rmoore1;	state Exp;
This commit is contained in:
aystarik 2005-06-29 17:14:33 +00:00
parent a97c12bc0f
commit a17b812721

View File

@ -1,258 +1,154 @@
/******************************************************************************
*
* Module Name: dswscope - Scope stack manipulation
* $Revision: 1.56 $
*
*****************************************************************************/
/*_________________________________________________________________________
|
|
| Copyright (C) Intel Corporation 1994-1997
|
| All rights reserved. No part of this program or publication may be
| reproduced, transmitted, transcribed, stored in a retrieval system, or
| translated into any language or computer language, in any form or by any
| means, electronic, mechanical, magnetic, optical, chemical, manual, or
| otherwise, without the prior written permission of Intel Corporation.
|__________________________________________________________________________
|
| ModuleName: nsstack - Scope stack manipulation
|__________________________________________________________________________
*/
/******************************************************************************
*
* 1. Copyright Notice
*
* Some or all of this work - Copyright (c) 1999 - 2002, Intel Corp.
* All rights reserved.
*
* 2. License
*
* 2.1. This is your license from Intel Corp. under its intellectual property
* rights. You may have additional license terms from the party that provided
* you this software, covering your right to use that party's intellectual
* property rights.
*
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
* copy of the source code appearing in this file ("Covered Code") an
* irrevocable, perpetual, worldwide 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, with the right to sublicense such rights; and
*
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
* license (with 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
* conditions are met:
*
* 3. Conditions
*
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
* Redistribution of source code of any substantial portion of the Covered
* Code or modification with rights to further distribute source 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 of Source with no Rights to Further Distribute Source.
* Redistribution of source code of any substantial portion of the Covered
* Code or modification without rights to further distribute source must
* include the following Disclaimer and Export Compliance provision in the
* documentation and/or other materials provided with distribution. In
* addition, Licensee may not authorize further sublicense of source of any
* portion of the Covered Code, and must include terms to the effect that the
* license from Licensee to its licensee is limited to the intellectual
* property embodied in the software Licensee provides to its licensee, and
* not to intellectual property embodied in modifications its licensee may
* make.
*
* 3.3. Redistribution of Executable. Redistribution in executable 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.4. Intel retains all right, title, and interest in and to the Original
* Intel Code.
*
* 3.5. 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
* without prior written authorization from Intel.
*
* 4. Disclaimer and Export Compliance
*
* 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
* LIMITED REMEDY.
*
* 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.
*
*****************************************************************************/
#define __NSSTACK_C__
#define __DSWSCOPE_C__
#include "acpi.h"
#include "acdispat.h"
#include <acpi.h>
#include <interpreter.h>
#include <namespace.h>
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dswscope")
#define _THIS_MODULE "nsstack.c"
#define _COMPONENT NAMESPACE
#define STACK_POP(head) head
static ST_KEY_DESC_TABLE KDT[] = {
{"0000", '1', "NsPushCurrentScope: null scope passed", "NsPushCurrentScope: null scope passed"},
{"0001", 'W', "NsPushCurrentScope: type code out of range", "NsPushCurrentScope: type code out of range"},
{"0002", '1', "Scope stack overflow", "Scope stack overflow"},
{"0003", '1', "NsPushMethodScope: null scope passed", "NsPushMethodScope: null scope passed"},
{"0004", '1', "Scope stack overflow", "Scope stack overflow"},
{"0005", 'W', "NsPopCurrent: type code out of range", "NsPopCurrent: type code out of range"},
{NULL, 'I', NULL, NULL}
};
/****************************************************************************
*
* FUNCTION: AcpiDsScopeStackClear
* FUNCTION: NsPushCurrentScope
*
* PARAMETERS: None
* PARAMETERS: nte *NewScope, name to be made current
* NsType Type, type of frame being pushed
*
* DESCRIPTION: Pop (and free) everything on the scope stack except the
* root scope object (which remains at the stack top.)
* DESCRIPTION: Push the current scope on the scope stack, and make the
* passed nte current.
*
***************************************************************************/
void
AcpiDsScopeStackClear (
ACPI_WALK_STATE *WalkState)
NsPushCurrentScope (nte *NewScope, NsType Type)
{
ACPI_GENERIC_STATE *ScopeInfo;
ACPI_FUNCTION_NAME ("DsScopeStackClear");
FUNCTION_TRACE ("NsPushCurrentScope");
while (WalkState->ScopeInfo)
if (!NewScope)
{
/* Pop a scope off the stack */
/* invalid scope */
ScopeInfo = WalkState->ScopeInfo;
WalkState->ScopeInfo = ScopeInfo->Scope.Next;
REPORT_ERROR (&KDT[0]);
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Popped object type (%s)\n", AcpiUtGetTypeName (ScopeInfo->Common.Value)));
AcpiUtDeleteGenericState (ScopeInfo);
else
{
if (OUTRANGE (Type, NsTypeNames) ||
BadType == NsTypeNames[Type])
{
/* type code out of range */
REPORT_WARNING (&KDT[1]);
}
if (CurrentScope < &ScopeStack[MAXNEST-1]) /* check for overflow */
{
/* no Scope stack overflow */
CurrentScope++;
CurrentScope->Scope = NewScope;
CurrentScope->Type = Type;
if (CurrentScope->Scope == Root)
{
NsCurrentSize = NsRootSize;
}
else
{
NsCurrentSize = TABLSIZE;
}
}
else
{
/* Scope stack overflow */
REPORT_ERROR (&KDT[2]);
}
}
}
/****************************************************************************
*
* FUNCTION: AcpiDsScopeStackPush
* FUNCTION: NsPushMethodScope
*
* PARAMETERS: *Node, - Name to be made current
* Type, - Type of frame being pushed
* PARAMETERS: NsHandle NewScope, name to be made current
*
* DESCRIPTION: Push the current scope on the scope stack, and make the
* passed Node current.
* passed nte current.
*
***************************************************************************/
ACPI_STATUS
AcpiDsScopeStackPush (
ACPI_NAMESPACE_NODE *Node,
ACPI_OBJECT_TYPE Type,
ACPI_WALK_STATE *WalkState)
void
NsPushMethodScope (NsHandle NewScope)
{
ACPI_GENERIC_STATE *ScopeInfo;
ACPI_GENERIC_STATE *OldScopeInfo;
FUNCTION_TRACE ("NsPushMethodScope");
ACPI_FUNCTION_TRACE ("DsScopeStackPush");
if (!Node)
if (!NewScope ||
(nte *) 0 == ((nte *) NewScope)->ChildScope)
{
/* Invalid scope */
/* NewScope or NewScope->ChildScope invalid */
ACPI_REPORT_ERROR (("DsScopeStackPush: null scope passed\n"));
return_ACPI_STATUS (AE_BAD_PARAMETER);
REPORT_ERROR (&KDT[3]);
}
/* Make sure object type is valid */
if (!AcpiUtValidObjectType (Type))
{
ACPI_REPORT_WARNING (("DsScopeStackPush: type code out of range\n"));
}
/* Allocate a new scope object */
ScopeInfo = AcpiUtCreateGenericState ();
if (!ScopeInfo)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Init new scope object */
ScopeInfo->Common.DataType = ACPI_DESC_TYPE_STATE_WSCOPE;
ScopeInfo->Scope.Node = Node;
ScopeInfo->Common.Value = (UINT16) Type;
WalkState->ScopeDepth++;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"[%.2d] Pushed scope ", (UINT32) WalkState->ScopeDepth));
OldScopeInfo = WalkState->ScopeInfo;
if (OldScopeInfo)
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[%4.4s] (%10s)",
OldScopeInfo->Scope.Node->Name.Ascii,
AcpiUtGetTypeName (OldScopeInfo->Common.Value)));
}
else
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[\\___] (%10s)", "ROOT"));
if (CurrentScope < &ScopeStack[MAXNEST-1]) /* check for overflow */
{
NsPushCurrentScope (((nte *) NewScope)->ChildScope, Method);
}
else
{
/* scope stack overflow */
REPORT_ERROR (&KDT[4]);
}
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
", New scope -> [%4.4s] (%s)\n",
ScopeInfo->Scope.Node->Name.Ascii,
AcpiUtGetTypeName (ScopeInfo->Common.Value)));
/* Push new scope object onto stack */
AcpiUtPushGenericState (&WalkState->ScopeInfo, ScopeInfo);
return_ACPI_STATUS (AE_OK);
}
/****************************************************************************
*
* FUNCTION: AcpiDsScopeStackPop
* FUNCTION: NsPopCurrent
*
* PARAMETERS: Type - The type of frame to be found
* PARAMETERS: NsType Type The type of frame to be found
*
* DESCRIPTION: Pop the scope stack until a frame of the requested type
* is found.
@ -265,51 +161,52 @@ AcpiDsScopeStackPush (
*
***************************************************************************/
ACPI_STATUS
AcpiDsScopeStackPop (
ACPI_WALK_STATE *WalkState)
INT32
NsPopCurrent (NsType Type)
{
ACPI_GENERIC_STATE *ScopeInfo;
ACPI_GENERIC_STATE *NewScopeInfo;
INT32 Count = 0;
ACPI_FUNCTION_TRACE ("DsScopeStackPop");
FUNCTION_TRACE ("NsPopCurrent");
/*
* Pop scope info object off the stack.
*/
ScopeInfo = AcpiUtPopGenericState (&WalkState->ScopeInfo);
if (!ScopeInfo)
if (OUTRANGE (Type, NsTypeNames) || BadType == NsTypeNames[Type])
{
return_ACPI_STATUS (AE_STACK_UNDERFLOW);
/* type code out of range */
REPORT_WARNING (&KDT[5]);
}
WalkState->ScopeDepth--;
DEBUG_PRINT (TRACE_EXEC, ("Popping Scope till type (%i) is found\n", Type));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"[%.2d] Popped scope [%4.4s] (%10s), New scope -> ",
(UINT32) WalkState->ScopeDepth,
ScopeInfo->Scope.Node->Name.Ascii,
AcpiUtGetTypeName (ScopeInfo->Common.Value)));
while (CurrentScope > &ScopeStack[0])
{
CurrentScope--;
NewScopeInfo = WalkState->ScopeInfo;
if (NewScopeInfo)
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[%4.4s] (%s)\n",
NewScopeInfo->Scope.Node->Name.Ascii,
AcpiUtGetTypeName (NewScopeInfo->Common.Value)));
}
else
{
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[\\___] (ROOT)\n"));
if (Root == CurrentScope->Scope)
{
NsCurrentSize = NsRootSize;
}
else
{
NsCurrentSize = TABLSIZE;
}
Count++;
DEBUG_PRINT (TRACE_EXEC, ("Popped %i ", (CurrentScope+1)->Type));
if ((Any == Type) || (Type == (CurrentScope + 1)->Type))
{
DEBUG_PRINT (TRACE_EXEC, ("Found %i\n", Type));
return Count;
}
}
AcpiUtDeleteGenericState (ScopeInfo);
return_ACPI_STATUS (AE_OK);
DEBUG_PRINT (TRACE_EXEC,("%i Not Found\n", Type));
return -Count;
}