Skip to content

Commit

Permalink
Merge pull request #663 from SchmErik/ghi-659
Browse files Browse the repository at this point in the history
Fix for github issue 659
  • Loading branch information
acpibob committed Feb 18, 2021
2 parents 79acf21 + 3697e5c commit 52a8236
Showing 1 changed file with 98 additions and 50 deletions.
148 changes: 98 additions & 50 deletions source/compiler/aslexternal.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,57 @@ ExDoExternal (
}


/*******************************************************************************
*
* FUNCTION: ExFindUnvisitedExternal
*
* PARAMETERS: Name - Name to find in the external list
*
* RETURN: ACPI_PARSE_OBJECT
*
* DESCRIPTION: Find an entry in the external list that matches the Name
* argument
*
******************************************************************************/

static ACPI_PARSE_OBJECT *
ExFindUnvisitedExternal (
char *Name)
{
ACPI_PARSE_OBJECT *Current;
ACPI_PARSE_OBJECT *NameOp;
char *ExternalName;


Current = AslGbl_ExternalsListHead;
while (Current)
{
/* Skip if External node already handled */

if (Current->Asl.Child->Asl.CompileFlags & OP_VISITED)
{
Current = Current->Asl.Next;
continue;
}

NameOp = Current->Asl.Child->Asl.Child;
ExternalName = AcpiNsGetNormalizedPathname (NameOp->Asl.Node, TRUE);
if (strcmp (Name, ExternalName))
{
ACPI_FREE (ExternalName);
Current = Current->Asl.Next;
continue;
}
else
{
ACPI_FREE (ExternalName);
return Current;
}
}
return NULL;
}


/*******************************************************************************
*
* FUNCTION: ExInsertArgCount
Expand All @@ -301,72 +352,52 @@ ExInsertArgCount (
ACPI_PARSE_OBJECT *NameOp;
ACPI_PARSE_OBJECT *Child;
ACPI_PARSE_OBJECT *ArgCountOp;
char * ExternalName;
char * CallName;
UINT16 ArgCount = 0;
ACPI_STATUS Status;


CallName = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);

Next = AslGbl_ExternalsListHead;
while (Next)
Next = ExFindUnvisitedExternal (CallName);
if (!Next)
{
ArgCount = 0;

/* Skip if External node already handled */

if (Next->Asl.Child->Asl.CompileFlags & OP_VISITED)
{
Next = Next->Asl.Next;
continue;
}

NameOp = Next->Asl.Child->Asl.Child;
ExternalName = AcpiNsGetNormalizedPathname (NameOp->Asl.Node, TRUE);

if (strcmp (CallName, ExternalName))
{
ACPI_FREE (ExternalName);
Next = Next->Asl.Next;
continue;
}
goto Cleanup;
}

Next->Asl.Child->Asl.CompileFlags |= OP_VISITED;
Next->Asl.Child->Asl.CompileFlags |= OP_VISITED;
NameOp = Next->Asl.Child->Asl.Child;

/*
* Since we will reposition Externals to the Root, set Namepath
* to the fully qualified name and recalculate the aml length
*/
Status = UtInternalizeName (ExternalName,
&NameOp->Asl.Value.String);

ACPI_FREE (ExternalName);
if (ACPI_FAILURE (Status))
{
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
NULL, "- Could not Internalize External");
break;
}
/*
* Since we will reposition Externals to the Root, set Namepath
* to the fully qualified name and recalculate the aml length
*/
Status = UtInternalizeName (CallName,
&NameOp->Asl.Value.String);
if (ACPI_FAILURE (Status))
{
AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
NULL, "- Could not Internalize External");
goto Cleanup;
}

NameOp->Asl.AmlLength = strlen (NameOp->Asl.Value.String);
NameOp->Asl.AmlLength = strlen (NameOp->Asl.Value.String);

/* Get argument count */
/* Get argument count */

Child = Op->Asl.Child;
while (Child)
{
ArgCount++;
Child = Child->Asl.Next;
}
Child = Op->Asl.Child;
while (Child)
{
ArgCount++;
Child = Child->Asl.Next;
}

/* Setup ArgCount operand */
/* Setup ArgCount operand */

ArgCountOp = Next->Asl.Child->Asl.Child->Asl.Next->Asl.Next;
ArgCountOp->Asl.Value.Integer = ArgCount;
break;
}
ArgCountOp = Next->Asl.Child->Asl.Child->Asl.Next->Asl.Next;
ArgCountOp->Asl.Value.Integer = ArgCount;

Cleanup:
ACPI_FREE (CallName);
}

Expand All @@ -389,6 +420,9 @@ ExAmlExternalWalkBegin (
UINT32 Level,
void *Context)
{
ACPI_PARSE_OBJECT *ExternalListOp;
char *Name;


/* External list head saved in the definition block op */

Expand All @@ -402,6 +436,20 @@ ExAmlExternalWalkBegin (
return (AE_OK);
}

if (Op->Asl.ParseOpcode == PARSEOP_NAMESEG ||
Op->Asl.ParseOpcode == PARSEOP_NAMESTRING)
{
Name = AcpiNsGetNormalizedPathname (Op->Asl.Node, TRUE);
ExternalListOp = ExFindUnvisitedExternal (Name);
if (ExternalListOp)
{
ExternalListOp->Asl.Child->Asl.CompileFlags |= OP_VISITED;
}

ACPI_FREE (Name);
return (AE_OK);
}

if (Op->Asl.ParseOpcode != PARSEOP_METHODCALL)
{
return (AE_OK);
Expand Down

0 comments on commit 52a8236

Please sign in to comment.