Check in files off the vendor branch as well as files with local patches.

This commit is contained in:
Nate Lawson 2004-03-18 17:46:27 +00:00
parent 55545f899c
commit fce89338bf
4 changed files with 75 additions and 23 deletions

View File

@ -1,7 +1,7 @@
/****************************************************************************** /******************************************************************************
* *
* Name: acconfig.h - Global configuration constants * Name: acconfig.h - Global configuration constants
* $Revision: 149 $ * $Revision: 150 $
* *
*****************************************************************************/ *****************************************************************************/
@ -137,7 +137,7 @@
/* Version string */ /* Version string */
#define ACPI_CA_VERSION 0x20040220 #define ACPI_CA_VERSION 0x20040311
/* Maximum objects in the various object caches */ /* Maximum objects in the various object caches */
@ -258,6 +258,10 @@
#define ACPI_SMBUS_BUFFER_SIZE 34 #define ACPI_SMBUS_BUFFER_SIZE 34
/* Number of strings associated with the _OSI reserved method */
#define ACPI_NUM_OSI_STRINGS 4
/****************************************************************************** /******************************************************************************
* *

View File

@ -1,7 +1,7 @@
/****************************************************************************** /******************************************************************************
* *
* Name: acutils.h -- prototypes for the common (subsystem-wide) procedures * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures
* $Revision: 159 $ * $Revision: 160 $
* *
*****************************************************************************/ *****************************************************************************/
@ -125,7 +125,6 @@ ACPI_STATUS (*ACPI_PKG_CALLBACK) (
ACPI_GENERIC_STATE *State, ACPI_GENERIC_STATE *State,
void *Context); void *Context);
ACPI_STATUS ACPI_STATUS
AcpiUtWalkPackageTree ( AcpiUtWalkPackageTree (
ACPI_OPERAND_OBJECT *SourceObject, ACPI_OPERAND_OBJECT *SourceObject,
@ -133,7 +132,6 @@ AcpiUtWalkPackageTree (
ACPI_PKG_CALLBACK WalkCallback, ACPI_PKG_CALLBACK WalkCallback,
void *Context); void *Context);
typedef struct acpi_pkg_info typedef struct acpi_pkg_info
{ {
UINT8 *FreeSpace; UINT8 *FreeSpace;
@ -549,6 +547,10 @@ AcpiUtDeleteInternalObjectList (
#define METHOD_NAME__PRS "_PRS" #define METHOD_NAME__PRS "_PRS"
ACPI_STATUS
AcpiUtOsiImplementation (
ACPI_WALK_STATE *WalkState);
ACPI_STATUS ACPI_STATUS
AcpiUtEvaluateObject ( AcpiUtEvaluateObject (
ACPI_NAMESPACE_NODE *PrefixNode, ACPI_NAMESPACE_NODE *PrefixNode,

View File

@ -1,7 +1,7 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: psparse - Parser top level AML parse routines * Module Name: psparse - Parser top level AML parse routines
* $Revision: 143 $ * $Revision: 144 $
* *
*****************************************************************************/ *****************************************************************************/
@ -522,7 +522,7 @@ AcpiPsParseLoop (
ACPI_STATUS Status = AE_OK; ACPI_STATUS Status = AE_OK;
ACPI_PARSE_OBJECT *Op = NULL; /* current op */ ACPI_PARSE_OBJECT *Op = NULL; /* current op */
ACPI_PARSE_OBJECT *Arg = NULL; ACPI_PARSE_OBJECT *Arg = NULL;
ACPI_PARSE_OBJECT PreOp; ACPI_PARSE_OBJECT *PreOp = NULL;
ACPI_PARSE_STATE *ParserState; ACPI_PARSE_STATE *ParserState;
UINT8 *AmlOpStart = NULL; UINT8 *AmlOpStart = NULL;
@ -654,8 +654,19 @@ AcpiPsParseLoop (
if (WalkState->OpInfo->Flags & AML_NAMED) if (WalkState->OpInfo->Flags & AML_NAMED)
{ {
PreOp.Common.Value.Arg = NULL; /* Allocate a new PreOp if necessary */
PreOp.Common.AmlOpcode = WalkState->Opcode;
if (!PreOp)
{
PreOp = AcpiPsAllocOp (WalkState->Opcode);
if (!PreOp)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
}
PreOp->Common.Value.Arg = NULL;
PreOp->Common.AmlOpcode = WalkState->Opcode;
/* /*
* Get and append arguments until we find the node that contains * Get and append arguments until we find the node that contains
@ -671,7 +682,7 @@ AcpiPsParseLoop (
goto CloseThisOp; goto CloseThisOp;
} }
AcpiPsAppendArg (&PreOp, Arg); AcpiPsAppendArg (PreOp, Arg);
INCREMENT_ARG_LIST (WalkState->ArgTypes); INCREMENT_ARG_LIST (WalkState->ArgTypes);
} }
@ -717,7 +728,7 @@ AcpiPsParseLoop (
goto CloseThisOp; goto CloseThisOp;
} }
AcpiPsAppendArg (Op, PreOp.Common.Value.Arg); AcpiPsAppendArg (Op, PreOp->Common.Value.Arg);
AcpiGbl_Depth++; AcpiGbl_Depth++;
if (Op->Common.AmlOpcode == AML_REGION_OP) if (Op->Common.AmlOpcode == AML_REGION_OP)
@ -993,6 +1004,11 @@ CloseThisOp:
AcpiPsCompleteThisOp (WalkState, Op); AcpiPsCompleteThisOp (WalkState, Op);
Op = NULL; Op = NULL;
if (PreOp)
{
AcpiPsFreeOp (PreOp);
PreOp = NULL;
}
switch (Status) switch (Status)
{ {
@ -1285,6 +1301,30 @@ AcpiPsParseAml (
{ {
ACPI_REPORT_METHOD_ERROR ("Method execution failed", ACPI_REPORT_METHOD_ERROR ("Method execution failed",
WalkState->MethodNode, NULL, Status); WalkState->MethodNode, NULL, Status);
/* Check for possible multi-thread reentrancy problem */
if ((Status == AE_ALREADY_EXISTS) &&
(!WalkState->MethodDesc->Method.Semaphore))
{
/*
* This method is marked NotSerialized, but it tried to create a named
* object, causing the second thread entrance to fail. We will workaround
* this by marking the method permanently as Serialized.
*/
WalkState->MethodDesc->Method.MethodFlags |= AML_METHOD_SERIALIZED;
WalkState->MethodDesc->Method.Concurrency = 1;
}
}
if (WalkState->MethodDesc)
{
/* Decrement the thread count on the method parse tree */
if (WalkState->MethodDesc->Method.ThreadCount)
{
WalkState->MethodDesc->Method.ThreadCount--;
}
} }
/* We are done with this walk, move on to the parent if any */ /* We are done with this walk, move on to the parent if any */

View File

@ -1,7 +1,7 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: utglobal - Global variables for the ACPI subsystem * Module Name: utglobal - Global variables for the ACPI subsystem
* $Revision: 193 $ * $Revision: 194 $
* *
*****************************************************************************/ *****************************************************************************/
@ -265,6 +265,15 @@ const char *AcpiGbl_HighestDstateNames[4] = {
"_S3D", "_S3D",
"_S4D"}; "_S4D"};
/* Strings supported by the _OSI predefined (internal) method */
const char *AcpiGbl_ValidOsiStrings[ACPI_NUM_OSI_STRINGS] = {
"Linux",
"Windows 2000",
"Windows 2001",
"Windows 2001.1"};
/****************************************************************************** /******************************************************************************
* *
* Namespace globals * Namespace globals
@ -275,14 +284,10 @@ const char *AcpiGbl_HighestDstateNames[4] = {
/* /*
* Predefined ACPI Names (Built-in to the Interpreter) * Predefined ACPI Names (Built-in to the Interpreter)
* *
* Initial values are currently supported only for types String and Number.
* Both are specified as strings in this table.
*
* NOTES: * NOTES:
* 1) _SB_ is defined to be a device to allow _SB_/_INI to be run * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run
* during the initialization sequence. * during the initialization sequence.
*/ */
const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] = const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
{ {
{"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL}, {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
@ -294,7 +299,7 @@ const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
{"_GL_", ACPI_TYPE_MUTEX, "0"}, {"_GL_", ACPI_TYPE_MUTEX, "0"},
#if defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) #if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
{"_OSI", ACPI_TYPE_METHOD, "1"}, {"_OSI", ACPI_TYPE_METHOD, "1"},
#endif #endif
{NULL, ACPI_TYPE_ANY, NULL} /* Table terminator */ {NULL, ACPI_TYPE_ANY, NULL} /* Table terminator */
@ -305,7 +310,6 @@ const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
* Properties of the ACPI Object Types, both internal and external. * Properties of the ACPI Object Types, both internal and external.
* The table is indexed by values of ACPI_OBJECT_TYPE * The table is indexed by values of ACPI_OBJECT_TYPE
*/ */
const UINT8 AcpiGbl_NsProperties[] = const UINT8 AcpiGbl_NsProperties[] =
{ {
ACPI_NS_NORMAL, /* 00 Any */ ACPI_NS_NORMAL, /* 00 Any */
@ -384,10 +388,8 @@ AcpiUtHexToAsciiChar (
* *
******************************************************************************/ ******************************************************************************/
ACPI_TABLE_LIST AcpiGbl_TableLists[NUM_ACPI_TABLE_TYPES]; ACPI_TABLE_LIST AcpiGbl_TableLists[NUM_ACPI_TABLE_TYPES];
ACPI_TABLE_SUPPORT AcpiGbl_TableData[NUM_ACPI_TABLE_TYPES] = ACPI_TABLE_SUPPORT AcpiGbl_TableData[NUM_ACPI_TABLE_TYPES] =
{ {
/*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */ /*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */
@ -551,9 +553,8 @@ AcpiUtGetEventName (
* *
* The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching; when * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching; when
* stored in a table it really means that we have thus far seen no evidence to * stored in a table it really means that we have thus far seen no evidence to
* indicatewhat type is actually going to be stored for this entry. * indicate what type is actually going to be stored for this entry.
*/ */
static const char AcpiGbl_BadType[] = "UNDEFINED"; static const char AcpiGbl_BadType[] = "UNDEFINED";
#define TYPE_NAME_LENGTH 12 /* Maximum length of each string */ #define TYPE_NAME_LENGTH 12 /* Maximum length of each string */
@ -858,6 +859,11 @@ AcpiUtInitGlobals (
ACPI_FUNCTION_TRACE ("UtInitGlobals"); ACPI_FUNCTION_TRACE ("UtInitGlobals");
/* Runtime configuration */
AcpiGbl_CreateOsiMethod = TRUE;
AcpiGbl_AllMethodsSerialized = FALSE;
/* Memory allocation and cache lists */ /* Memory allocation and cache lists */
ACPI_MEMSET (AcpiGbl_MemoryLists, 0, sizeof (ACPI_MEMORY_LIST) * ACPI_NUM_MEM_LISTS); ACPI_MEMSET (AcpiGbl_MemoryLists, 0, sizeof (ACPI_MEMORY_LIST) * ACPI_NUM_MEM_LISTS);