[PATCH] ACPICA: update to version 20130725 (LP: #1205203)
Colin King
colin.king at canonical.com
Fri Jul 26 06:39:47 UTC 2013
From: Colin Ian King <colin.king at canonical.com>
Update ACPICA sources used by fwts to version 20130725. The complete
set of ACPICA changes are detailed here:
https://lists.acpica.org/pipermail/devel/2013-July/000547.html
I've regression tested the syntaxcheck, --disassemble-aml and method
tests with these changes against my database of ACPI tables and I observed
no regressions.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/acpica/source/common/dmextern.c | 47 ++++--
src/acpica/source/compiler/asloffset.c | 172 ++++++++++++++++------
src/acpica/source/compiler/asloperands.c | 9 +-
src/acpica/source/compiler/dttemplate.c | 23 ++-
src/acpica/source/components/executer/exoparg1.c | 50 ++++++-
src/acpica/source/components/namespace/nspredef.c | 15 +-
src/acpica/source/components/namespace/nswalk.c | 18 +--
src/acpica/source/components/namespace/nsxfeval.c | 14 +-
src/acpica/source/components/tables/tbfadt.c | 4 +-
src/acpica/source/components/tables/tbxfroot.c | 10 +-
src/acpica/source/components/utilities/utglobal.c | 1 -
src/acpica/source/components/utilities/utosi.c | 89 +++++++++--
src/acpica/source/components/utilities/utxface.c | 34 +++++
src/acpica/source/include/acglobal.h | 7 +-
src/acpica/source/include/aclocal.h | 17 +--
src/acpica/source/include/acnamesp.h | 4 +-
src/acpica/source/include/acpixf.h | 11 +-
src/acpica/source/include/actables.h | 4 +
src/acpica/source/include/actypes.h | 28 ++++
src/acpica/source/include/acutils.h | 4 +
20 files changed, 426 insertions(+), 135 deletions(-)
diff --git a/src/acpica/source/common/dmextern.c b/src/acpica/source/common/dmextern.c
index 0cd094f..87aeddc 100644
--- a/src/acpica/source/common/dmextern.c
+++ b/src/acpica/source/common/dmextern.c
@@ -791,34 +791,54 @@ AcpiDmEmitExternals (
AcpiDmUnresolvedWarning (1);
+ /* Emit any unresolved method externals in a single text block */
+
+ NextExternal = AcpiGbl_ExternalList;
+ while (NextExternal)
+ {
+ if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
+ (!NextExternal->Resolved))
+ {
+ AcpiOsPrintf (" External (%s%s",
+ NextExternal->Path,
+ AcpiDmGetObjectTypeName (NextExternal->Type));
+
+ AcpiOsPrintf (") // Warning: Unresolved Method, "
+ "guessing %u arguments (may be incorrect, see warning above)\n",
+ NextExternal->Value);
+
+ NextExternal->Emitted = TRUE;
+ }
+
+ NextExternal = NextExternal->Next;
+ }
+
+ AcpiOsPrintf ("\n");
+
/*
* Walk the list of externals (unresolved references)
* found during the AML parsing
*/
while (AcpiGbl_ExternalList)
{
- AcpiOsPrintf (" External (%s%s",
- AcpiGbl_ExternalList->Path,
- AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
-
- if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
+ if (!AcpiGbl_ExternalList->Emitted)
{
- if (AcpiGbl_ExternalList->Resolved)
+ AcpiOsPrintf (" External (%s%s",
+ AcpiGbl_ExternalList->Path,
+ AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
+
+ /* For methods, add a comment with the number of arguments */
+
+ if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
{
AcpiOsPrintf (") // %u Arguments\n",
AcpiGbl_ExternalList->Value);
}
else
{
- AcpiOsPrintf (") // Warning: unresolved Method, "
- "assuming %u arguments (may be incorrect, see warning above)\n",
- AcpiGbl_ExternalList->Value);
+ AcpiOsPrintf (")\n");
}
}
- else
- {
- AcpiOsPrintf (")\n");
- }
/* Free this external info block and move on to next external */
@@ -1003,5 +1023,4 @@ AcpiDmUnresolvedWarning (
(AcpiGbl_NumExternalMethods - AcpiGbl_ResolvedExternalMethods));
}
}
-
}
diff --git a/src/acpica/source/compiler/asloffset.c b/src/acpica/source/compiler/asloffset.c
index 3c6551e..1c6911f 100644
--- a/src/acpica/source/compiler/asloffset.c
+++ b/src/acpica/source/compiler/asloffset.c
@@ -129,10 +129,12 @@ static void
LsEmitOffsetTableEntry (
UINT32 FileId,
ACPI_NAMESPACE_NODE *Node,
+ UINT32 NamepathOffset,
UINT32 Offset,
char *OpName,
UINT64 Value,
- UINT8 AmlOpcode);
+ UINT8 AmlOpcode,
+ UINT16 ParentOpcode);
/*******************************************************************************
@@ -166,7 +168,8 @@ LsAmlOffsetWalk (
UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context);
ACPI_NAMESPACE_NODE *Node;
UINT32 Length;
- UINT32 OffsetOfOpcode;
+ UINT32 NamepathOffset;
+ UINT32 DataOffset;
ACPI_PARSE_OBJECT *NextOp;
@@ -191,8 +194,9 @@ LsAmlOffsetWalk (
if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE) &&
(Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
{
- LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset,
- Op->Asl.ParseOpName, 0, Op->Asl.Extra);
+ LsEmitOffsetTableEntry (FileId, Node, 0, Gbl_CurrentAmlOffset,
+ Op->Asl.ParseOpName, 0, Op->Asl.Extra, AML_BUFFER_OP);
+
Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength;
return (AE_OK);
}
@@ -210,22 +214,25 @@ LsAmlOffsetWalk (
}
Length = Op->Asl.FinalAmlLength;
+ NamepathOffset = Gbl_CurrentAmlOffset + Length;
/* Get to the NameSeg/NamePath Op (and length of the name) */
Op = Op->Asl.Child;
- OffsetOfOpcode = Length + Op->Asl.FinalAmlLength;
+
+ /* Get offset of last nameseg and the actual data */
+
+ NamepathOffset = Gbl_CurrentAmlOffset + Length +
+ (Op->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+ DataOffset = Gbl_CurrentAmlOffset + Length +
+ Op->Asl.FinalAmlLength;
/* Get actual value associated with the name */
Op = Op->Asl.Next;
switch (Op->Asl.AmlOpcode)
{
- /*
- * We are only interested in integer constants that can be changed
- * at boot time. Note, the One/Ones/Zero opcodes are considered
- * non-changeable, so we ignore them here.
- */
case AML_BYTE_OP:
case AML_WORD_OP:
case AML_DWORD_OP:
@@ -233,22 +240,32 @@ LsAmlOffsetWalk (
/* The +1 is to handle the integer size prefix (opcode) */
- LsEmitOffsetTableEntry (FileId, Node,
- (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
Op->Asl.ParseOpName, Op->Asl.Value.Integer,
- (UINT8) Op->Asl.AmlOpcode);
+ (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
+ break;
+
+ case AML_ONE_OP:
+ case AML_ONES_OP:
+ case AML_ZERO_OP:
+
+ /* For these, offset will point to the opcode */
+
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+ Op->Asl.ParseOpName, Op->Asl.Value.Integer,
+ (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
break;
case AML_PACKAGE_OP:
case AML_VAR_PACKAGE_OP:
+ /* Get the package element count */
+
NextOp = Op->Asl.Child;
- LsEmitOffsetTableEntry (FileId, Node,
- (Gbl_CurrentAmlOffset + OffsetOfOpcode),
- Op->Asl.ParseOpName,
- NextOp->Asl.Value.Integer,
- (UINT8) Op->Asl.AmlOpcode);
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+ Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+ (UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
break;
default:
@@ -267,7 +284,14 @@ LsAmlOffsetWalk (
/* Get the name/namepath node */
NextOp = Op->Asl.Child;
- OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1;
+
+ /* Get offset of last nameseg and the actual data */
+
+ NamepathOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+ DataOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength + 1);
/* Get the SpaceId node, then the Offset (address) node */
@@ -286,10 +310,9 @@ LsAmlOffsetWalk (
case AML_DWORD_OP:
case AML_QWORD_OP:
- LsEmitOffsetTableEntry (FileId, Node,
- (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
- (UINT8) NextOp->Asl.AmlOpcode);
+ (UINT8) NextOp->Asl.AmlOpcode, AML_REGION_OP);
Gbl_CurrentAmlOffset += Length;
return (AE_OK);
@@ -309,15 +332,62 @@ LsAmlOffsetWalk (
NextOp = Op->Asl.Child;
- /* Point to the *last* nameseg in the namepath */
+ /* Get offset of last nameseg and the actual data (flags byte) */
- OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE;
+ NamepathOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
- LsEmitOffsetTableEntry (FileId, Node,
- (Gbl_CurrentAmlOffset + OffsetOfOpcode + Length),
- Op->Asl.ParseOpName,
- *((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]),
- (UINT8) Op->Asl.AmlOpcode);
+ DataOffset = Gbl_CurrentAmlOffset + Length +
+ NextOp->Asl.FinalAmlLength;
+
+ /* Get the flags byte Op */
+
+ NextOp = NextOp->Asl.Next;
+
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+ Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+ (UINT8) Op->Asl.AmlOpcode, AML_METHOD_OP);
+ break;
+
+ case AML_PROCESSOR_OP:
+
+ /* Processor (Namepath, ProcessorId, Address, Length) */
+
+ Length = Op->Asl.FinalAmlLength;
+ NextOp = Op->Asl.Child; /* Get Namepath */
+
+ /* Get offset of last nameseg and the actual data (PBlock address) */
+
+ NamepathOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+ DataOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength + 1);
+
+ NextOp = NextOp->Asl.Next; /* Get ProcessorID (BYTE) */
+ NextOp = NextOp->Asl.Next; /* Get Address (DWORD) */
+
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
+ Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
+ (UINT8) AML_DWORD_OP, AML_PROCESSOR_OP);
+ break;
+
+ case AML_DEVICE_OP:
+ case AML_SCOPE_OP:
+ case AML_THERMAL_ZONE_OP:
+
+ /* Device/Scope/ThermalZone (Namepath) */
+
+ Length = Op->Asl.FinalAmlLength;
+ NextOp = Op->Asl.Child; /* Get Namepath */
+
+ /* Get offset of last nameseg */
+
+ NamepathOffset = Gbl_CurrentAmlOffset + Length +
+ (NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
+
+ LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, 0,
+ Op->Asl.ParseOpName, 0, (UINT8) 0, Op->Asl.AmlOpcode);
break;
default:
@@ -339,6 +409,7 @@ LsAmlOffsetWalk (
* OpName - Name of the AML opcode
* Value - Current value of the AML field
* AmlOpcode - Opcode associated with the field
+ * ObjectType - ACPI object type
*
* RETURN: None
*
@@ -350,10 +421,12 @@ static void
LsEmitOffsetTableEntry (
UINT32 FileId,
ACPI_NAMESPACE_NODE *Node,
+ UINT32 NamepathOffset,
UINT32 Offset,
char *OpName,
UINT64 Value,
- UINT8 AmlOpcode)
+ UINT8 AmlOpcode,
+ UINT16 ParentOpcode)
{
ACPI_BUFFER TargetPath;
ACPI_STATUS Status;
@@ -380,8 +453,9 @@ LsEmitOffsetTableEntry (
* Max Length for Integers is 8 bytes.
*/
FlPrintFile (FileId,
- " {%-29s 0x%8.8X, 0x%2.2X, 0x%8.8X%8.8X}, /* %s */\n",
- MsgBuffer, Offset, AmlOpcode, ACPI_FORMAT_UINT64 (Value), OpName);
+ " {%-29s 0x%4.4X, 0x%8.8X, 0x%2.2X, 0x%8.8X, 0x%8.8X%8.8X}, /* %s */\n",
+ MsgBuffer, ParentOpcode, NamepathOffset, AmlOpcode,
+ Offset, ACPI_FORMAT_UINT64 (Value), OpName);
}
@@ -407,10 +481,12 @@ LsDoOffsetTableHeader (
"#define __AML_OFFSET_TABLE_H\n\n");
FlPrintFile (FileId, "typedef struct {\n"
- " char *Pathname;\n"
- " unsigned long Offset;\n"
- " unsigned char Opcode;\n"
- " unsigned long long Value;\n"
+ " char *Pathname; /* Full pathname (from root) to the object */\n"
+ " unsigned short ParentOpcode; /* AML opcode for the parent object */\n"
+ " unsigned long NamesegOffset; /* Offset of last nameseg in the parent namepath */\n"
+ " unsigned char Opcode; /* AML opcode for the data */\n"
+ " unsigned long Offset; /* Offset for the data */\n"
+ " unsigned long long Value; /* Original value of the data (as applicable) */\n"
"} AML_OFFSET_TABLE_ENTRY;\n\n");
FlPrintFile (FileId,
@@ -418,29 +494,37 @@ LsDoOffsetTableHeader (
FlPrintFile (FileId,
"/*\n"
- " * Information about supported object types:\n"
+ " * Information specific to the supported object types:\n"
" *\n"
" * Integers:\n"
- " * Offset points to the actual integer data\n"
" * Opcode is the integer prefix, indicates length of the data\n"
+ " * (One of: BYTE, WORD, DWORD, QWORD, ZERO, ONE, ONES)\n"
+ " * Offset points to the actual integer data\n"
" * Value is the existing value in the AML\n"
" *\n"
" * Packages:\n"
- " * Offset points to the package opcode\n"
" * Opcode is the package or var_package opcode\n"
- " * Value is the package element cound\n"
+ " * Offset points to the package opcode\n"
+ " * Value is the package element count\n"
" *\n"
" * Operation Regions:\n"
- " * Offset points to the region address data\n"
" * Opcode is the address integer prefix, indicates length of the data\n"
+ " * Offset points to the region address\n"
" * Value is the existing address value in the AML\n"
" *\n"
" * Control Methods:\n"
- " * Offset points to the first byte of the namepath\n"
+ " * Offset points to the method flags byte\n"
+ " * Value is the existing flags value in the AML\n"
+ " *\n"
+ " * Processors:\n"
+ " * Offset points to the first byte of the PBlock Address\n"
" *\n"
" * Resource Descriptors:\n"
- " * Offset points to the start of the descriptor\n"
" * Opcode is the descriptor type\n"
+ " * Offset points to the start of the descriptor\n"
+ " *\n"
+ " * Scopes/Devices/ThermalZones:\n"
+ " * Nameseg offset only\n"
" */\n");
FlPrintFile (FileId,
@@ -455,6 +539,6 @@ LsDoOffsetTableFooter (
{
FlPrintFile (FileId,
- " {0,0,0,0} /* Table terminator */\n};\n\n");
+ " {NULL,0,0,0,0,0} /* Table terminator */\n};\n\n");
Gbl_CurrentAmlOffset = 0;
}
diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c
index a9f08d0..1a85a9f 100644
--- a/src/acpica/source/compiler/asloperands.c
+++ b/src/acpica/source/compiler/asloperands.c
@@ -1043,12 +1043,15 @@ OpnDoDefinitionBlock (
Gbl_TableId = AcpiOsAllocate (Length + 1);
ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
+ /*
+ * Convert anything non-alphanumeric to an underscore. This
+ * allows us to use the TableID to generate unique C symbols.
+ */
for (i = 0; i < Length; i++)
{
- if (Gbl_TableId[i] == ' ')
+ if (!isalnum ((int) Gbl_TableId[i]))
{
- Gbl_TableId[i] = 0;
- break;
+ Gbl_TableId[i] = '_';
}
}
}
diff --git a/src/acpica/source/compiler/dttemplate.c b/src/acpica/source/compiler/dttemplate.c
index 53cc34c..bdcad38 100644
--- a/src/acpica/source/compiler/dttemplate.c
+++ b/src/acpica/source/compiler/dttemplate.c
@@ -189,13 +189,21 @@ DtCreateTemplates (
AslInitializeGlobals ();
- AcpiUtStrupr (Signature);
- /* Create all known templates if requested */
+ /* Default (no signature) is DSDT */
+
+ if (!Signature)
+ {
+ Signature = "DSDT";
+ goto GetTemplate;
+ }
- if (!ACPI_STRNCMP (Signature, "ALL", 3) ||
+ AcpiUtStrupr (Signature);
+ if (!ACPI_STRCMP (Signature, "ALL") ||
!ACPI_STRCMP (Signature, "*"))
{
+ /* Create all available/known templates */
+
Status = DtCreateAllTemplates ();
return (Status);
}
@@ -208,7 +216,9 @@ DtCreateTemplates (
*/
if (strlen (Signature) != ACPI_NAME_SIZE)
{
- fprintf (stderr, "%s, Invalid ACPI table signature\n", Signature);
+ fprintf (stderr,
+ "%s: Invalid ACPI table signature (length must be 4 characters)\n",
+ Signature);
return (AE_ERROR);
}
@@ -225,19 +235,20 @@ DtCreateTemplates (
Signature = "FACP";
}
+GetTemplate:
TableData = AcpiDmGetTableData (Signature);
if (TableData)
{
if (!TableData->Template)
{
- fprintf (stderr, "%4.4s, No template available\n", Signature);
+ fprintf (stderr, "%4.4s: No template available\n", Signature);
return (AE_ERROR);
}
}
else if (!AcpiUtIsSpecialTable (Signature))
{
fprintf (stderr,
- "%4.4s, Unrecognized ACPI table signature\n", Signature);
+ "%4.4s: Unrecognized ACPI table signature\n", Signature);
return (AE_ERROR);
}
diff --git a/src/acpica/source/components/executer/exoparg1.c b/src/acpica/source/components/executer/exoparg1.c
index ee6ffc1..8bde71a 100644
--- a/src/acpica/source/components/executer/exoparg1.c
+++ b/src/acpica/source/components/executer/exoparg1.c
@@ -1081,10 +1081,17 @@ AcpiExOpcode_1A_0T_1R (
* add another reference to the referenced object, however.
*/
ReturnDesc = *(Operand[0]->Reference.Where);
- if (ReturnDesc)
+ if (!ReturnDesc)
{
- AcpiUtAddReference (ReturnDesc);
+ /*
+ * Element is NULL, do not allow the dereference.
+ * This provides compatibility with other ACPI
+ * implementations.
+ */
+ return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
}
+
+ AcpiUtAddReference (ReturnDesc);
break;
default:
@@ -1102,15 +1109,44 @@ AcpiExOpcode_1A_0T_1R (
ReturnDesc = Operand[0]->Reference.Object;
if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
- ACPI_DESC_TYPE_NAMED)
+ ACPI_DESC_TYPE_NAMED)
{
ReturnDesc = AcpiNsGetAttachedObject (
- (ACPI_NAMESPACE_NODE *) ReturnDesc);
- }
+ (ACPI_NAMESPACE_NODE *) ReturnDesc);
+ if (!ReturnDesc)
+ {
+ break;
+ }
- /* Add another reference to the object! */
+ /*
+ * June 2013:
+ * BufferFields/FieldUnits require additional resolution
+ */
+ switch (ReturnDesc->Common.Type)
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
- AcpiUtAddReference (ReturnDesc);
+ Status = AcpiExReadDataFromField (WalkState,
+ ReturnDesc, &TempDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ ReturnDesc = TempDesc;
+ break;
+
+ default:
+
+ /* Add another reference to the object */
+
+ AcpiUtAddReference (ReturnDesc);
+ break;
+ }
+ }
break;
default:
diff --git a/src/acpica/source/components/namespace/nspredef.c b/src/acpica/source/components/namespace/nspredef.c
index e7bc55b..15ba35e 100644
--- a/src/acpica/source/components/namespace/nspredef.c
+++ b/src/acpica/source/components/namespace/nspredef.c
@@ -237,11 +237,16 @@ AcpiNsCheckReturnValue (
goto Exit;
}
+ /*
+ *
+ * 4) If there is no return value and it is optional, just return
+ * AE_OK (_WAK).
+ */
if (!(*ReturnObjectPtr))
{
- Status = AE_AML_NO_RETURN_VALUE;
goto Exit;
}
+
/*
* For returned Package objects, check the type of all sub-objects.
* Note: Package may have been newly created by call above.
@@ -370,7 +375,13 @@ TypeErrorExit:
AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
- if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
+ if (!ReturnObject)
+ {
+ ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+ "Expected return object of type %s",
+ TypeBuffer));
+ }
+ else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
{
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
"Return type mismatch - found %s, expected %s",
diff --git a/src/acpica/source/components/namespace/nswalk.c b/src/acpica/source/components/namespace/nswalk.c
index 1084a02..20b1b32 100644
--- a/src/acpica/source/components/namespace/nswalk.c
+++ b/src/acpica/source/components/namespace/nswalk.c
@@ -237,9 +237,9 @@ AcpiNsGetNextNodeTyped (
* MaxDepth - Depth to which search is to reach
* Flags - Whether to unlock the NS before invoking
* the callback routine
- * PreOrderVisit - Called during tree pre-order visit
+ * DescendingCallback - Called during tree descent
* when an object of "Type" is found
- * PostOrderVisit - Called during tree post-order visit
+ * AscendingCallback - Called during tree ascent
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - from the UserFunction if terminated
@@ -267,8 +267,8 @@ AcpiNsWalkNamespace (
ACPI_HANDLE StartNode,
UINT32 MaxDepth,
UINT32 Flags,
- ACPI_WALK_CALLBACK PreOrderVisit,
- ACPI_WALK_CALLBACK PostOrderVisit,
+ ACPI_WALK_CALLBACK DescendingCallback,
+ ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue)
{
@@ -346,22 +346,22 @@ AcpiNsWalkNamespace (
}
/*
- * Invoke the user function, either pre-order or post-order
+ * Invoke the user function, either descending, ascending,
* or both.
*/
if (!NodePreviouslyVisited)
{
- if (PreOrderVisit)
+ if (DescendingCallback)
{
- Status = PreOrderVisit (ChildNode, Level,
+ Status = DescendingCallback (ChildNode, Level,
Context, ReturnValue);
}
}
else
{
- if (PostOrderVisit)
+ if (AscendingCallback)
{
- Status = PostOrderVisit (ChildNode, Level,
+ Status = AscendingCallback (ChildNode, Level,
Context, ReturnValue);
}
}
diff --git a/src/acpica/source/components/namespace/nsxfeval.c b/src/acpica/source/components/namespace/nsxfeval.c
index 901a931..650b774 100644
--- a/src/acpica/source/components/namespace/nsxfeval.c
+++ b/src/acpica/source/components/namespace/nsxfeval.c
@@ -646,9 +646,9 @@ AcpiNsResolveReferences (
* PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
* StartObject - Handle in namespace where search begins
* MaxDepth - Depth to which search is to reach
- * PreOrderVisit - Called during tree pre-order visit
+ * DescendingCallback - Called during tree descent
* when an object of "Type" is found
- * PostOrderVisit - Called during tree post-order visit
+ * AscendingCallback - Called during tree ascent
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - Location where return value of
@@ -677,8 +677,8 @@ AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
- ACPI_WALK_CALLBACK PreOrderVisit,
- ACPI_WALK_CALLBACK PostOrderVisit,
+ ACPI_WALK_CALLBACK DescendingCallback,
+ ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue)
{
@@ -692,7 +692,7 @@ AcpiWalkNamespace (
if ((Type > ACPI_TYPE_LOCAL_MAX) ||
(!MaxDepth) ||
- (!PreOrderVisit && !PostOrderVisit))
+ (!DescendingCallback && !AscendingCallback))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
@@ -727,8 +727,8 @@ AcpiWalkNamespace (
}
Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
- ACPI_NS_WALK_UNLOCK, PreOrderVisit,
- PostOrderVisit, Context, ReturnValue);
+ ACPI_NS_WALK_UNLOCK, DescendingCallback,
+ AscendingCallback, Context, ReturnValue);
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c
index 7e00831..d90baba 100644
--- a/src/acpica/source/components/tables/tbfadt.c
+++ b/src/acpica/source/components/tables/tbfadt.c
@@ -204,7 +204,7 @@ static ACPI_FADT_INFO FadtInfoTable[] =
ACPI_FADT_OFFSET (PmTimerBlock),
ACPI_FADT_OFFSET (PmTimerLength),
ACPI_PM_TIMER_WIDTH,
- ACPI_FADT_REQUIRED},
+ ACPI_FADT_SEPARATE_LENGTH}, /* ACPI 5.0A: Timer is optional */
{"Gpe0Block",
ACPI_FADT_OFFSET (XGpe0Block),
@@ -678,7 +678,7 @@ AcpiTbValidateFadt (
if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
{
/*
- * Field is required (PM1aEvent, PM1aControl, PmTimer).
+ * Field is required (PM1aEvent, PM1aControl).
* Both the address and length must be non-zero.
*/
if (!Address64->Address || !Length)
diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c
index 7e6a620..b9db205 100644
--- a/src/acpica/source/components/tables/tbxfroot.c
+++ b/src/acpica/source/components/tables/tbxfroot.c
@@ -123,12 +123,6 @@
#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME ("tbxfroot")
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiTbValidateRsdp (
- ACPI_TABLE_RSDP *Rsdp);
-
/*******************************************************************************
*
@@ -142,7 +136,7 @@ AcpiTbValidateRsdp (
*
******************************************************************************/
-static ACPI_STATUS
+ACPI_STATUS
AcpiTbValidateRsdp (
ACPI_TABLE_RSDP *Rsdp)
{
@@ -153,7 +147,7 @@ AcpiTbValidateRsdp (
* Note: Sometimes there exists more than one RSDP in memory; the valid
* RSDP has a valid checksum, all others have an invalid checksum.
*/
- if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP,
+ if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
sizeof (ACPI_SIG_RSDP)-1) != 0)
{
/* Nope, BAD Signature */
diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c
index 330b86b..1ce7610 100644
--- a/src/acpica/source/components/utilities/utglobal.c
+++ b/src/acpica/source/components/utilities/utglobal.c
@@ -391,7 +391,6 @@ AcpiUtInitGlobals (
AcpiGbl_TraceDbgLayer = 0;
AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING;
AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT;
- AcpiGbl_OsiData = 0;
AcpiGbl_OsiMutex = NULL;
AcpiGbl_RegMethodsExecuted = FALSE;
diff --git a/src/acpica/source/components/utilities/utosi.c b/src/acpica/source/components/utilities/utosi.c
index cda1bfe..55a1d92 100644
--- a/src/acpica/source/components/utilities/utosi.c
+++ b/src/acpica/source/components/utilities/utosi.c
@@ -153,21 +153,20 @@ static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] =
/* Feature Group Strings */
- {"Extended Address Space Descriptor", NULL, 0, 0}
+ {"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
/*
* All "optional" feature group strings (features that are implemented
- * by the host) should be dynamically added by the host via
- * AcpiInstallInterface and should not be manually added here.
- *
- * Examples of optional feature group strings:
- *
- * "Module Device"
- * "Processor Device"
- * "3.0 Thermal Model"
- * "3.0 _SCP Extensions"
- * "Processor Aggregator Device"
+ * by the host) should be dynamically modified to VALID by the host via
+ * AcpiInstallInterface or AcpiUpdateInterfaces. Such optional feature
+ * group strings are set as INVALID by default here.
*/
+
+ {"Module Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+ {"Processor Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+ {"3.0 Thermal Model", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+ {"3.0 _SCP Extensions", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
+ {"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
};
@@ -244,13 +243,26 @@ AcpiUtInterfaceTerminate (
{
AcpiGbl_SupportedInterfaces = NextInterface->Next;
- /* Only interfaces added at runtime can be freed */
-
if (NextInterface->Flags & ACPI_OSI_DYNAMIC)
{
+ /* Only interfaces added at runtime can be freed */
+
ACPI_FREE (NextInterface->Name);
ACPI_FREE (NextInterface);
}
+ else
+ {
+ /* Interface is in static list. Reset it to invalid or valid. */
+
+ if (NextInterface->Flags & ACPI_OSI_DEFAULT_INVALID)
+ {
+ NextInterface->Flags |= ACPI_OSI_INVALID;
+ }
+ else
+ {
+ NextInterface->Flags &= ~ACPI_OSI_INVALID;
+ }
+ }
NextInterface = AcpiGbl_SupportedInterfaces;
}
@@ -379,6 +391,57 @@ AcpiUtRemoveInterface (
/*******************************************************************************
*
+ * FUNCTION: AcpiUtUpdateInterfaces
+ *
+ * PARAMETERS: Action - Actions to be performed during the
+ * update
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ * strings or/and feature group strings.
+ * Caller MUST hold AcpiGbl_OsiMutex
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+ UINT8 Action)
+{
+ ACPI_INTERFACE_INFO *NextInterface;
+
+
+ NextInterface = AcpiGbl_SupportedInterfaces;
+ while (NextInterface)
+ {
+ if (((NextInterface->Flags & ACPI_OSI_FEATURE) &&
+ (Action & ACPI_FEATURE_STRINGS)) ||
+ (!(NextInterface->Flags & ACPI_OSI_FEATURE) &&
+ (Action & ACPI_VENDOR_STRINGS)))
+ {
+ if (Action & ACPI_DISABLE_INTERFACES)
+ {
+ /* Mark the interfaces as invalid */
+
+ NextInterface->Flags |= ACPI_OSI_INVALID;
+ }
+ else
+ {
+ /* Mark the interfaces as valid */
+
+ NextInterface->Flags &= ~ACPI_OSI_INVALID;
+ }
+ }
+
+ NextInterface = NextInterface->Next;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
* FUNCTION: AcpiUtGetInterface
*
* PARAMETERS: InterfaceName - The interface to find
diff --git a/src/acpica/source/components/utilities/utxface.c b/src/acpica/source/components/utilities/utxface.c
index f5e75ff..c1b3c46 100644
--- a/src/acpica/source/components/utilities/utxface.c
+++ b/src/acpica/source/components/utilities/utxface.c
@@ -571,6 +571,40 @@ ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
/*****************************************************************************
*
+ * FUNCTION: AcpiUpdateInterfaces
+ *
+ * PARAMETERS: Action - Actions to be performed during the
+ * update
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
+ * string or/and feature group strings.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiUpdateInterfaces (
+ UINT8 Action)
+{
+ ACPI_STATUS Status;
+
+
+ Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiUtUpdateInterfaces (Action);
+
+ AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
+ return (Status);
+}
+
+
+/*****************************************************************************
+ *
* FUNCTION: AcpiCheckAddressRange
*
* PARAMETERS: SpaceId - Address space ID
diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h
index 66abf13..9056b6d 100644
--- a/src/acpica/source/include/acglobal.h
+++ b/src/acpica/source/include/acglobal.h
@@ -212,6 +212,12 @@ UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE);
*/
UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE);
+/*
+ * We keep track of the latest version of Windows that has been requested by
+ * the BIOS.
+ */
+UINT8 ACPI_INIT_GLOBAL (AcpiGbl_OsiData, 0);
+
/* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */
@@ -362,7 +368,6 @@ ACPI_EXTERN UINT8 AcpiGbl_DebuggerConfiguration;
ACPI_EXTERN BOOLEAN AcpiGbl_StepToNextCall;
ACPI_EXTERN BOOLEAN AcpiGbl_AcpiHardwarePresent;
ACPI_EXTERN BOOLEAN AcpiGbl_EventsInitialized;
-ACPI_EXTERN UINT8 AcpiGbl_OsiData;
ACPI_EXTERN ACPI_INTERFACE_INFO *AcpiGbl_SupportedInterfaces;
ACPI_EXTERN ACPI_ADDRESS_RANGE *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];
diff --git a/src/acpica/source/include/aclocal.h b/src/acpica/source/include/aclocal.h
index dbf5db6..e45b9f5 100644
--- a/src/acpica/source/include/aclocal.h
+++ b/src/acpica/source/include/aclocal.h
@@ -1172,19 +1172,6 @@ typedef struct acpi_bit_register_info
/* Structs and definitions for _OSI support and I/O port validation */
-#define ACPI_OSI_WIN_2000 0x01
-#define ACPI_OSI_WIN_XP 0x02
-#define ACPI_OSI_WIN_XP_SP1 0x03
-#define ACPI_OSI_WINSRV_2003 0x04
-#define ACPI_OSI_WIN_XP_SP2 0x05
-#define ACPI_OSI_WINSRV_2003_SP1 0x06
-#define ACPI_OSI_WIN_VISTA 0x07
-#define ACPI_OSI_WINSRV_2008 0x08
-#define ACPI_OSI_WIN_VISTA_SP1 0x09
-#define ACPI_OSI_WIN_VISTA_SP2 0x0A
-#define ACPI_OSI_WIN_7 0x0B
-#define ACPI_OSI_WIN_8 0x0C
-
#define ACPI_ALWAYS_ILLEGAL 0x00
typedef struct acpi_interface_info
@@ -1198,6 +1185,9 @@ typedef struct acpi_interface_info
#define ACPI_OSI_INVALID 0x01
#define ACPI_OSI_DYNAMIC 0x02
+#define ACPI_OSI_FEATURE 0x04
+#define ACPI_OSI_DEFAULT_INVALID 0x08
+#define ACPI_OSI_OPTIONAL_FEATURE (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
typedef struct acpi_port_info
{
@@ -1293,6 +1283,7 @@ typedef struct acpi_external_list
UINT8 Type;
UINT8 Flags;
BOOLEAN Resolved;
+ BOOLEAN Emitted;
} ACPI_EXTERNAL_LIST;
diff --git a/src/acpica/source/include/acnamesp.h b/src/acpica/source/include/acnamesp.h
index 52e123c..74575ba 100644
--- a/src/acpica/source/include/acnamesp.h
+++ b/src/acpica/source/include/acnamesp.h
@@ -189,8 +189,8 @@ AcpiNsWalkNamespace (
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
UINT32 Flags,
- ACPI_WALK_CALLBACK PreOrderVisit,
- ACPI_WALK_CALLBACK PostOrderVisit,
+ ACPI_WALK_CALLBACK DescendingCallback,
+ ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue);
diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h
index 7042300..3971f57 100644
--- a/src/acpica/source/include/acpixf.h
+++ b/src/acpica/source/include/acpixf.h
@@ -119,7 +119,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
-#define ACPI_CA_VERSION 0x20130626
+#define ACPI_CA_VERSION 0x20130725
#include "acconfig.h"
#include "actypes.h"
@@ -133,6 +133,7 @@ extern UINT32 AcpiCurrentGpeCount;
extern ACPI_TABLE_FADT AcpiGbl_FADT;
extern BOOLEAN AcpiGbl_SystemAwakeAndRunning;
extern BOOLEAN AcpiGbl_ReducedHardware; /* ACPI 5.0 */
+extern UINT8 AcpiGbl_OsiData;
/* Runtime configuration of debug print levels */
@@ -249,6 +250,10 @@ ACPI_STATUS
AcpiRemoveInterface (
ACPI_STRING InterfaceName);
+ACPI_STATUS
+AcpiUpdateInterfaces (
+ UINT8 Action);
+
UINT32
AcpiCheckAddressRange (
ACPI_ADR_SPACE_TYPE SpaceId,
@@ -340,8 +345,8 @@ AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
- ACPI_WALK_CALLBACK PreOrderVisit,
- ACPI_WALK_CALLBACK PostOrderVisit,
+ ACPI_WALK_CALLBACK DescendingCallback,
+ ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue);
diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h
index dc1bb21..219f4c0 100644
--- a/src/acpica/source/include/actables.h
+++ b/src/acpica/source/include/actables.h
@@ -124,6 +124,10 @@ AcpiAllocateRootTable (
/*
* tbxfroot - Root pointer utilities
*/
+ACPI_STATUS
+AcpiTbValidateRsdp (
+ ACPI_TABLE_RSDP *Rsdp);
+
UINT8 *
AcpiTbScanMemoryForRsdp (
UINT8 *StartAddress,
diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h
index 50d315b..efe1e91 100644
--- a/src/acpica/source/include/actypes.h
+++ b/src/acpica/source/include/actypes.h
@@ -1316,4 +1316,32 @@ typedef struct acpi_memory_list
} ACPI_MEMORY_LIST;
+/* Definitions of _OSI support */
+
+#define ACPI_VENDOR_STRINGS 0x01
+#define ACPI_FEATURE_STRINGS 0x02
+#define ACPI_ENABLE_INTERFACES 0x00
+#define ACPI_DISABLE_INTERFACES 0x04
+
+#define ACPI_DISABLE_ALL_VENDOR_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_DISABLE_ALL_FEATURE_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_DISABLE_ALL_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_VENDOR_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
+#define ACPI_ENABLE_ALL_FEATURE_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
+#define ACPI_ENABLE_ALL_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
+
+#define ACPI_OSI_WIN_2000 0x01
+#define ACPI_OSI_WIN_XP 0x02
+#define ACPI_OSI_WIN_XP_SP1 0x03
+#define ACPI_OSI_WINSRV_2003 0x04
+#define ACPI_OSI_WIN_XP_SP2 0x05
+#define ACPI_OSI_WINSRV_2003_SP1 0x06
+#define ACPI_OSI_WIN_VISTA 0x07
+#define ACPI_OSI_WINSRV_2008 0x08
+#define ACPI_OSI_WIN_VISTA_SP1 0x09
+#define ACPI_OSI_WIN_VISTA_SP2 0x0A
+#define ACPI_OSI_WIN_7 0x0B
+#define ACPI_OSI_WIN_8 0x0C
+
+
#endif /* __ACTYPES_H__ */
diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h
index 62442de..e6ae828 100644
--- a/src/acpica/source/include/acutils.h
+++ b/src/acpica/source/include/acutils.h
@@ -742,6 +742,10 @@ ACPI_STATUS
AcpiUtRemoveInterface (
ACPI_STRING InterfaceName);
+ACPI_STATUS
+AcpiUtUpdateInterfaces (
+ UINT8 Action);
+
ACPI_INTERFACE_INFO *
AcpiUtGetInterface (
ACPI_STRING InterfaceName);
--
1.8.1.2
More information about the fwts-devel
mailing list