summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/exmutex.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/exmutex.c')
-rw-r--r--sys/contrib/dev/acpica/exmutex.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/sys/contrib/dev/acpica/exmutex.c b/sys/contrib/dev/acpica/exmutex.c
index 51d6be3..3f4c8f0 100644
--- a/sys/contrib/dev/acpica/exmutex.c
+++ b/sys/contrib/dev/acpica/exmutex.c
@@ -2,7 +2,7 @@
/******************************************************************************
*
* Module Name: exmutex - ASL Mutex Acquire/Release functions
- * $Revision: 13 $
+ * $Revision: 16 $
*
*****************************************************************************/
@@ -229,24 +229,38 @@ AcpiExAcquireMutex (
ACPI_FUNCTION_TRACE_PTR ("ExAcquireMutex", ObjDesc);
+
if (!ObjDesc)
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
+ /* Sanity check -- we must have a valid thread ID */
+
+ if (!WalkState->Thread)
+ {
+ ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], null thread info\n",
+ ObjDesc->Mutex.Node->Name.Ascii));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
/*
* Current Sync must be less than or equal to the sync level of the
* mutex. This mechanism provides some deadlock prevention
*/
if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel)
{
+ ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], incorrect SyncLevel\n",
+ ObjDesc->Mutex.Node->Name.Ascii));
return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
}
/*
* Support for multiple acquires by the owning thread
*/
- if (ObjDesc->Mutex.OwnerThread == WalkState->Thread)
+
+ if ((ObjDesc->Mutex.OwnerThread) &&
+ (ObjDesc->Mutex.OwnerThread->ThreadId == WalkState->Thread->ThreadId))
{
/*
* The mutex is already owned by this thread,
@@ -313,13 +327,29 @@ AcpiExReleaseMutex (
if (!ObjDesc->Mutex.OwnerThread)
{
+ ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], not acquired\n",
+ ObjDesc->Mutex.Node->Name.Ascii));
return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED);
}
+ /* Sanity check -- we must have a valid thread ID */
+
+ if (!WalkState->Thread)
+ {
+ ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], null thread info\n",
+ ObjDesc->Mutex.Node->Name.Ascii));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
/* The Mutex is owned, but this thread must be the owner */
- if (ObjDesc->Mutex.OwnerThread != WalkState->Thread)
+ if (ObjDesc->Mutex.OwnerThread->ThreadId != WalkState->Thread->ThreadId)
{
+ ACPI_REPORT_ERROR ((
+ "Thread %X cannot release Mutex [%4.4s] acquired by thread %X\n",
+ WalkState->Thread->ThreadId,
+ ObjDesc->Mutex.Node->Name.Ascii,
+ ObjDesc->Mutex.OwnerThread->ThreadId));
return_ACPI_STATUS (AE_AML_NOT_OWNER);
}
@@ -329,6 +359,8 @@ AcpiExReleaseMutex (
*/
if (ObjDesc->Mutex.SyncLevel > WalkState->Thread->CurrentSyncLevel)
{
+ ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], incorrect SyncLevel\n",
+ ObjDesc->Mutex.Node->Name.Ascii));
return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
}
OpenPOWER on IntegriCloud