diff options
Diffstat (limited to 'sys/contrib/dev/acpica/exmutex.c')
-rw-r--r-- | sys/contrib/dev/acpica/exmutex.c | 38 |
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); } |