Skip to content

Commit

Permalink
Namespace: Add support to convert "Zero" into NULL object reference
Browse files Browse the repository at this point in the history
Some configurable BIOS code sets NameString to Zero to indicate a NULL
object reference, this patch implements this to automatically convert this
for the external users. This patch also converts String -> Reference
repiar into a generic mechanism. Reported by Peter Wu, Fixed by Lv Zheng.

Link: https://bugs.acpica.org/show_bug.cgi?id=1333
Link: Bumblebee-Project/bbswitch#142
Reported-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Bartosz Skrzypczak <Barteks2x@gmail.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
  • Loading branch information
Lv Zheng committed May 22, 2017
1 parent 7523597 commit daa3db9
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 5 deletions.
46 changes: 46 additions & 0 deletions source/components/namespace/nsconvert.c
Expand Up @@ -672,3 +672,49 @@ AcpiNsConvertToReference (
*ReturnObject = NewObject;
return (AE_OK);
}


/*******************************************************************************
*
* FUNCTION: AcpiNsConvertToNullReference
*
* PARAMETERS: OriginalObject - Object to be converted
* ReturnObject - Where the new converted object is returned
*
* RETURN: Status. AE_OK if conversion was successful
*
* DESCRIPTION: Attempt to convert a Integer object to a ObjectReference.
* Buffer.
*
******************************************************************************/

ACPI_STATUS
AcpiNsConvertToNullReference (
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject)
{
ACPI_OPERAND_OBJECT *NewObject = NULL;
ACPI_STATUS Status = AE_OK;


ACPI_FUNCTION_NAME (NsConvertToNullReference);


/* Convert path into internal presentation */

/* Create and init a new internal ACPI object */

NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
if (!NewObject)
{
Status = AE_NO_MEMORY;
goto ErrorExit;
}
NewObject->Reference.Node = NULL;
NewObject->Reference.Object = NULL;
NewObject->Reference.Class = ACPI_REFCLASS_NAME;

ErrorExit:
*ReturnObject = NewObject;
return (Status);
}
59 changes: 54 additions & 5 deletions source/components/namespace/nsrepair.c
Expand Up @@ -222,11 +222,6 @@ static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] =
ACPI_NOT_PACKAGE_ELEMENT,
AcpiNsConvertToResource },

/* Object reference conversions */

{ "_DEP", ACPI_RTYPE_STRING, ACPI_ALL_PACKAGE_ELEMENTS,
AcpiNsConvertToReference },

/* Unicode conversions */

{ "_MLS", ACPI_RTYPE_STRING, 1,
Expand Down Expand Up @@ -352,6 +347,60 @@ AcpiNsSimpleRepair (
}
}

if (ExpectedBtypes & ACPI_RTYPE_REFERENCE)
{
if (ReturnObject->Common.Type == ACPI_TYPE_STRING)
{
/*
* _DLM contains an optional Buf/Ref PackageElement, so apply
* this workaround to only NameString typed PackageElement.
*/
if (AcpiGbl_ParseTableAsTermList)
{
AcpiUtAddReference (ReturnObject);
NewObject = ReturnObject;
if (!(NewObject->Common.Flags & AOPOBJ_NAMESTRING))
{
NewObject->String.ScopeNode = Info->Node;
NewObject->Common.Flags |= AOPOBJ_NAMESTRING;
}
goto ObjectRepaired;
}
else
{
Status = AcpiNsConvertToReference (Info->Node,
ReturnObject, &NewObject);
if (ACPI_SUCCESS (Status))
{
goto ObjectRepaired;
}
}
}
if (ReturnObject->Common.Type == ACPI_TYPE_INTEGER &&
ReturnObject->Integer.Value == 0)
{
if (AcpiGbl_ParseTableAsTermList)
{
Status = AcpiNsConvertToString (
ReturnObject, &NewObject);
if (ACPI_SUCCESS (Status))
{
NewObject->String.ScopeNode = Info->Node;
NewObject->Common.Flags |= AOPOBJ_NAMESTRING;
goto ObjectRepaired;
}
}
else
{
Status = AcpiNsConvertToNullReference (
ReturnObject, &NewObject);
if (ACPI_SUCCESS (Status))
{
goto ObjectRepaired;
}
}
}
}
if (ExpectedBtypes & ACPI_RTYPE_INTEGER)
{
Status = AcpiNsConvertToInteger (ReturnObject, &NewObject);
Expand Down
5 changes: 5 additions & 0 deletions source/include/acnamesp.h
Expand Up @@ -354,6 +354,11 @@ AcpiNsConvertToReference (
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject);

ACPI_STATUS
AcpiNsConvertToNullReference (
ACPI_OPERAND_OBJECT *OriginalObject,
ACPI_OPERAND_OBJECT **ReturnObject);


/*
* nsdump - Namespace dump/print utilities
Expand Down

0 comments on commit daa3db9

Please sign in to comment.