summaryrefslogtreecommitdiff
path: root/source/common/adwalk.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/common/adwalk.c')
-rw-r--r--source/common/adwalk.c82
1 files changed, 57 insertions, 25 deletions
diff --git a/source/common/adwalk.c b/source/common/adwalk.c
index 28255c6804ab..714d837d5ef8 100644
--- a/source/common/adwalk.c
+++ b/source/common/adwalk.c
@@ -327,6 +327,7 @@ AcpiDmConvertResourceIndexes (
WalkState);
if (ACPI_FAILURE (Status))
{
+ ACPI_FREE (WalkState);
return;
}
@@ -442,7 +443,7 @@ AcpiDmDumpDescending (
*
* DESCRIPTION: Check namepath Ops for orphaned method invocations
*
- * Note: Experimental.
+ * Note: Parts of this are experimental, under possible further development.
*
******************************************************************************/
@@ -508,6 +509,7 @@ AcpiDmFindOrphanDescending (
ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
}
break;
+
#endif
case AML_STORE_OP:
@@ -532,7 +534,7 @@ AcpiDmFindOrphanDescending (
/* One Arg means this is just a Store(Name,Target) */
AcpiDmAddOpToExternalList (ChildOp,
- ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
+ ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0);
return (AE_OK);
}
@@ -554,7 +556,7 @@ AcpiDmFindOrphanDescending (
(ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
!Op->Common.Node)
{
- ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
+ ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op);
/*
* Check if namepath is a predicate for if/while or lone parameter to
@@ -788,6 +790,7 @@ AcpiDmXrefDescendingOp (
Op->Common.Next->Common.Next->Common.Value.Integer;
}
+ Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE;
AcpiDmAddOpToExternalList (Op, Path,
(UINT8) ObjectType, ParamCount, Flags);
@@ -855,12 +858,12 @@ AcpiDmXrefDescendingOp (
Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
WalkState, &Node);
+
if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
{
/* Node was created by an External() statement */
Status = AE_NOT_FOUND;
- Flags = ACPI_EXT_RESOLVED_REFERENCE;
}
if (ACPI_FAILURE (Status))
@@ -880,12 +883,12 @@ AcpiDmXrefDescendingOp (
if (Node)
{
AcpiDmAddNodeToExternalList (Node,
- (UINT8) ObjectType, 0, Flags);
+ (UINT8) ObjectType, 7, Flags);
}
else
{
AcpiDmAddOpToExternalList (Op, Path,
- (UINT8) ObjectType, 0, Flags);
+ (UINT8) ObjectType, 7, Flags);
}
}
}
@@ -1067,40 +1070,69 @@ AcpiDmInspectPossibleArgs (
{
const ACPI_OPCODE_INFO *OpInfo;
UINT32 i;
- UINT32 Last = 0;
- UINT32 Lookahead;
+ UINT32 ArgumentCount = 0;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_PARSE_OBJECT *ExecuteOp;
- Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
+ if (!Op)
+ {
+ return (0);
+ }
/* Lookahead for the maximum number of possible arguments */
- for (i = 0; i < Lookahead; i++)
+ NextOp = Op->Common.Next;
+
+ for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++)
{
- if (!Op)
- {
- break;
- }
+ OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode);
- OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ /* Any one of these operators is "very probably" not a method arg */
- /*
- * Any one of these operators is "very probably" not a method arg
- */
- if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
- (Op->Common.AmlOpcode == AML_NOTIFY_OP))
+ if ((NextOp->Common.AmlOpcode == AML_STORE_OP) ||
+ (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) ||
+ (OpInfo->Class == AML_CLASS_CONTROL) ||
+ (OpInfo->Class == AML_CLASS_CREATE) ||
+ (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
{
break;
}
- if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
- (OpInfo->Class != AML_CLASS_CONTROL))
+ if (OpInfo->Class == AML_CLASS_EXECUTE)
{
- Last = i+1;
+ /* Probable that this is method arg if there is no target */
+
+ ExecuteOp = NextOp->Common.Value.Arg;
+ while (ExecuteOp)
+ {
+ if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ (ExecuteOp->Common.Value.Arg == NULL))
+ {
+ /* No target, could be a method arg */
+
+ break;
+ }
+
+ if (NextOp->Common.AmlOpcode == AML_REF_OF_OP)
+ {
+ break;
+ }
+
+ ExecuteOp = ExecuteOp->Common.Next;
+ }
+
+ if (!ExecuteOp)
+ {
+ /* Has a target, not method arg */
+
+ return (ArgumentCount);
+ }
}
- Op = Op->Common.Next;
+ ArgumentCount++;
+ NextOp = NextOp->Common.Next;
}
- return (Last);
+ return (ArgumentCount);
}