summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/dsmthdat.c
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2003-12-09 02:45:16 +0000
committernjl <njl@FreeBSD.org>2003-12-09 02:45:16 +0000
commit2a9caa496cc3521e5c9352c255b827c90efb3839 (patch)
tree24e5ad5d8b4fb5681ddaa34c6ae30814c80ffe56 /sys/contrib/dev/acpica/dsmthdat.c
parentdc49a5b908c59c6ae7c8b069908225dd6c21c041 (diff)
downloadFreeBSD-src-2a9caa496cc3521e5c9352c255b827c90efb3839.zip
FreeBSD-src-2a9caa496cc3521e5c9352c255b827c90efb3839.tar.gz
Import ACPI-CA 20031203
Diffstat (limited to 'sys/contrib/dev/acpica/dsmthdat.c')
-rw-r--r--sys/contrib/dev/acpica/dsmthdat.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/sys/contrib/dev/acpica/dsmthdat.c b/sys/contrib/dev/acpica/dsmthdat.c
index 3515957..2a63234 100644
--- a/sys/contrib/dev/acpica/dsmthdat.c
+++ b/sys/contrib/dev/acpica/dsmthdat.c
@@ -1,7 +1,7 @@
/*******************************************************************************
*
* Module Name: dsmthdat - control method arguments and local variables
- * $Revision: 71 $
+ * $Revision: 74 $
*
******************************************************************************/
@@ -410,7 +410,7 @@ AcpiDsMethodDataSetValue (
return_ACPI_STATUS (Status);
}
- /*
+ /*
* Increment ref count so object can't be deleted while installed.
* NOTE: We do not copy the object in order to preserve the call by
* reference semantics of ACPI Control Method invocation.
@@ -662,13 +662,13 @@ AcpiDsStoreObjectToLocal (
ACPI_STATUS Status;
ACPI_NAMESPACE_NODE *Node;
ACPI_OPERAND_OBJECT *CurrentObjDesc;
+ ACPI_OPERAND_OBJECT *NewObjDesc;
ACPI_FUNCTION_TRACE ("DsStoreObjectToLocal");
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%d Idx=%d Obj=%p\n",
Opcode, Index, ObjDesc));
-
/* Parameter validation */
if (!ObjDesc)
@@ -693,6 +693,21 @@ AcpiDsStoreObjectToLocal (
}
/*
+ * If the reference count on the object is more than one, we must
+ * take a copy of the object before we store.
+ */
+ NewObjDesc = ObjDesc;
+ if (ObjDesc->Common.ReferenceCount > 1)
+ {
+ Status = AcpiUtCopyIobjectToIobject (ObjDesc, &NewObjDesc, WalkState);
+ NewObjDesc;
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
* If there is an object already in this slot, we either
* have to delete it, or if this is an argument and there
* is an object reference stored there, we have to do
@@ -725,8 +740,8 @@ AcpiDsStoreObjectToLocal (
*/
if (ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) != ACPI_DESC_TYPE_OPERAND)
{
- ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: %X\n",
- CurrentObjDesc->Common.Type));
+ ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: [%s]\n",
+ AcpiUtGetDescriptorName (CurrentObjDesc)));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
@@ -738,15 +753,22 @@ AcpiDsStoreObjectToLocal (
(CurrentObjDesc->Reference.Opcode == AML_REF_OF_OP))
{
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
- "Arg (%p) is an ObjRef(Node), storing in node %p\n",
- ObjDesc, CurrentObjDesc));
+ "Arg (%p) is an ObjRef(Node), storing in node %p\n",
+ NewObjDesc, CurrentObjDesc));
/*
* Store this object to the Node
* (perform the indirect store)
*/
- Status = AcpiExStoreObjectToNode (ObjDesc,
+ Status = AcpiExStoreObjectToNode (NewObjDesc,
CurrentObjDesc->Reference.Object, WalkState);
+
+ /* Remove local reference if we copied the object above */
+
+ if (NewObjDesc != ObjDesc)
+ {
+ AcpiUtRemoveReference (NewObjDesc);
+ }
return_ACPI_STATUS (Status);
}
}
@@ -759,12 +781,19 @@ AcpiDsStoreObjectToLocal (
}
/*
- * Install the ObjStack descriptor (*ObjDesc) into
+ * Install the Obj descriptor (*NewObjDesc) into
* the descriptor for the Arg or Local.
- * Install the new object in the stack entry
* (increments the object reference count by one)
*/
- Status = AcpiDsMethodDataSetValue (Opcode, Index, ObjDesc, WalkState);
+ Status = AcpiDsMethodDataSetValue (Opcode, Index, NewObjDesc, WalkState);
+
+ /* Remove local reference if we copied the object above */
+
+ if (NewObjDesc != ObjDesc)
+ {
+ AcpiUtRemoveReference (NewObjDesc);
+ }
+
return_ACPI_STATUS (Status);
}
OpenPOWER on IntegriCloud