aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/dev/acpica/compiler/aslload.c
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2020-05-01 01:26:36 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2020-05-01 01:26:36 +0000
commit08ddfe865704486086ac90d3a344271bcea9e6c6 (patch)
tree6cf601f8049ea206a8e7c5feb5ca8c645188da01 /sys/contrib/dev/acpica/compiler/aslload.c
parent0c9cd5cacd11a390336e5711096cce239b5cf0b5 (diff)
parenta95d9dd0e22ace9a8f960e939af923c79e7a271e (diff)
downloadsrc-08ddfe865704486086ac90d3a344271bcea9e6c6.tar.gz
src-08ddfe865704486086ac90d3a344271bcea9e6c6.zip
MFV: r360512
Merge ACPICA 20200430.
Notes
Notes: svn path=/head/; revision=360517
Diffstat (limited to 'sys/contrib/dev/acpica/compiler/aslload.c')
-rw-r--r--sys/contrib/dev/acpica/compiler/aslload.c81
1 files changed, 41 insertions, 40 deletions
diff --git a/sys/contrib/dev/acpica/compiler/aslload.c b/sys/contrib/dev/acpica/compiler/aslload.c
index dd45323975d1..8f6fd16cee94 100644
--- a/sys/contrib/dev/acpica/compiler/aslload.c
+++ b/sys/contrib/dev/acpica/compiler/aslload.c
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Module Name: dswload - Dispatcher namespace load callbacks
+ * Module Name: aslload - compiler namespace load callbacks
*
*****************************************************************************/
@@ -201,7 +201,6 @@ LdAnalyzeExternals (
ACPI_NAMESPACE_NODE *Node,
ACPI_PARSE_OBJECT *Op,
ACPI_OBJECT_TYPE ExternalOpType,
- ACPI_OBJECT_TYPE ObjectType,
ACPI_WALK_STATE *WalkState);
@@ -515,7 +514,6 @@ LdNamespace1Begin (
ACPI_PARSE_OBJECT *MethodOp;
ACPI_STATUS Status;
ACPI_OBJECT_TYPE ObjectType;
- ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY;
char *Path;
UINT32 Flags = ACPI_NS_NO_UPSEARCH;
ACPI_PARSE_OBJECT *Arg;
@@ -689,8 +687,7 @@ LdNamespace1Begin (
*
* first child is name, next child is ObjectType
*/
- ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;
- ObjectType = ACPI_TYPE_ANY;
+ ObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;
/*
* We will mark every new node along the path as "External". This
@@ -709,7 +706,7 @@ LdNamespace1Begin (
* Store (\_SB_.PCI0.ABCD, Local0)
* }
*/
- Flags |= ACPI_NS_EXTERNAL;
+ Flags |= ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE;
break;
case PARSEOP_DEFAULT_ARG:
@@ -913,8 +910,7 @@ LdNamespace1Begin (
else if ((Node->Flags & ANOBJ_IS_EXTERNAL) ||
(Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
{
- Status = LdAnalyzeExternals (Node, Op, ActualObjectType,
- ObjectType, WalkState);
+ Status = LdAnalyzeExternals (Node, Op, ObjectType, WalkState);
if (ACPI_FAILURE (Status))
{
if (Status == AE_ERROR)
@@ -929,6 +925,19 @@ LdNamespace1Begin (
}
return_ACPI_STATUS (Status);
}
+
+ if (!(Node->Flags & ANOBJ_IS_EXTERNAL) &&
+ (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL))
+ {
+ /*
+ * If we get to here, it means that an actual definition of
+ * the object declared external exists. Meaning that Op
+ * loading this this Op should have no change to the ACPI
+ * namespace. By going to FinishNode, we skip the
+ * assignment of Node->Op = Op.
+ */
+ goto FinishNode;
+ }
}
else
{
@@ -980,30 +989,15 @@ LdNamespace1Begin (
}
}
-FinishNode:
- /*
- * Point the parse node to the new namespace node, and point
- * the Node back to the original Parse node
- */
- Op->Asl.Node = Node;
+ /* Point the Node back to the original Parse node */
+
Node->Op = Op;
- /*
- * Set the actual data type if appropriate (EXTERNAL term only)
- * As of 11/19/2019, ASL External() does not support parameter
- * counts. When an External method is loaded, the parameter count is
- * recorded in the external's arg count parameter. The parameter count may
- * or may not be known in the declaration. If the value of this node turns
- * out to be ASL_EXTERNAL_METHOD_UNKNOWN_PARAMS, it indicates that
- * we do not know the parameter count and that we must look at the usage of
- * the External method call to get this information.
- */
- if (ActualObjectType != ACPI_TYPE_ANY)
- {
- Node->Type = (UINT8) ActualObjectType;
- Node->Value = (UINT32)
- Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer;
- }
+FinishNode:
+
+ /* Point the parse node to the new namespace node */
+
+ Op->Asl.Node = Node;
if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
{
@@ -1013,6 +1007,13 @@ FinishNode:
*/
Node->Value = (UINT32) Op->Asl.Extra;
}
+ else if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
+ Node->Type == ACPI_TYPE_METHOD &&
+ (Node->Flags & ANOBJ_IS_EXTERNAL))
+ {
+ Node->Value =
+ (UINT32) Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer;
+ }
return_ACPI_STATUS (Status);
}
@@ -1020,7 +1021,7 @@ FinishNode:
/*******************************************************************************
*
- * FUNCTION: LdAnalyzeExternals
+ * FUNCTION: LdMatchExternType
*
* PARAMETERS: Type1
* Type2
@@ -1037,7 +1038,7 @@ FinishNode:
******************************************************************************/
static BOOLEAN
-LdTypesMatchExternType (
+LdMatchExternType (
ACPI_OBJECT_TYPE Type1,
ACPI_OBJECT_TYPE Type2)
{
@@ -1093,7 +1094,6 @@ LdTypesMatchExternType (
* PARAMETERS: Node - Node that represents the named object
* Op - Named object declaring this named object
* ExternalOpType - Type of ExternalOp
- * ObjectType - Type of Declared object
* WalkState - Current WalkState
*
* RETURN: Status
@@ -1111,7 +1111,6 @@ LdAnalyzeExternals (
ACPI_NAMESPACE_NODE *Node,
ACPI_PARSE_OBJECT *Op,
ACPI_OBJECT_TYPE ExternalOpType,
- ACPI_OBJECT_TYPE ObjectType,
ACPI_WALK_STATE *WalkState)
{
ACPI_STATUS Status = AE_OK;
@@ -1135,12 +1134,12 @@ LdAnalyzeExternals (
else
{
ActualExternalOpType = Node->Type;
- ActualOpType = ObjectType;
+ ActualOpType = ExternalOpType;
}
if ((ActualOpType != ACPI_TYPE_ANY) &&
(ActualExternalOpType != ACPI_TYPE_ANY) &&
- !LdTypesMatchExternType (ActualExternalOpType, ActualOpType))
+ !LdMatchExternType (ActualExternalOpType, ActualOpType))
{
if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL &&
Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
@@ -1168,6 +1167,8 @@ LdAnalyzeExternals (
}
}
+ /* Set the object type of the external */
+
if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
(Op->Asl.ParseOpcode != PARSEOP_EXTERNAL))
{
@@ -1176,13 +1177,13 @@ LdAnalyzeExternals (
* previously declared External
*/
Node->Flags &= ~ANOBJ_IS_EXTERNAL;
- Node->Type = (UINT8) ObjectType;
+ Node->Type = (UINT8) ExternalOpType;
/* Just retyped a node, probably will need to open a scope */
- if (AcpiNsOpensScope (ObjectType))
+ if (AcpiNsOpensScope (ExternalOpType))
{
- Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+ Status = AcpiDsScopeStackPush (Node, ExternalOpType, WalkState);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -1203,7 +1204,7 @@ LdAnalyzeExternals (
}
else if ((Node->Flags & ANOBJ_IS_EXTERNAL) &&
(Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
- (ObjectType == ACPI_TYPE_ANY))
+ (ExternalOpType == ACPI_TYPE_ANY))
{
/* Allow update of externals of unknown type. */