aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2007-09-24 17:12:36 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2007-09-24 17:12:36 +0000
commit66244a7bdd1ab681405a637139a6eff7ef5d403b (patch)
treea28daa1f294c591d2754125dda203b82bc7a6444
parent1859f337c47d9b8f944f93e80b08d698c4b66e11 (diff)
downloadsrc-66244a7bdd1ab681405a637139a6eff7ef5d403b.tar.gz
src-66244a7bdd1ab681405a637139a6eff7ef5d403b.zip
Fix global lock recursion bug.
This patch was part of ACPI-CA 20070508 release and the following is excerpt from its change log: Fixed a problem where the Global Lock handle was not properly updated if a thread that acquired the Global Lock via executing AML code then attempted to acquire the lock via the AcpiAcquireGlobalLock interface. Reported by Joe Liu. Approved by: re (kensmith) Tested by: ambrisko Obtained from: Intel
Notes
Notes: svn path=/vendor-sys/acpica/dist/; revision=172314
-rw-r--r--sys/contrib/dev/acpica/evmisc.c14
-rw-r--r--sys/contrib/dev/acpica/evxface.c11
2 files changed, 15 insertions, 10 deletions
diff --git a/sys/contrib/dev/acpica/evmisc.c b/sys/contrib/dev/acpica/evmisc.c
index 881519f0e6bc..7000543f114b 100644
--- a/sys/contrib/dev/acpica/evmisc.c
+++ b/sys/contrib/dev/acpica/evmisc.c
@@ -568,6 +568,20 @@ AcpiEvAcquireGlobalLock (
}
/*
+ * Update the global lock handle and check for wraparound. The handle is
+ * only used for the external global lock interfaces, but it is updated
+ * here to properly handle the case where a single thread may acquire the
+ * lock via both the AML and the AcpiAcquireGlobalLock interfaces. The
+ * handle is therefore updated on the first acquire from a given thread
+ * regardless of where the acquisition request originated.
+ */
+ AcpiGbl_GlobalLockHandle++;
+ if (AcpiGbl_GlobalLockHandle == 0)
+ {
+ AcpiGbl_GlobalLockHandle = 1;
+ }
+
+ /*
* Make sure that a global lock actually exists. If not, just treat
* the lock as a standard mutex.
*/
diff --git a/sys/contrib/dev/acpica/evxface.c b/sys/contrib/dev/acpica/evxface.c
index 021ebf7f88e6..15fbc9c65047 100644
--- a/sys/contrib/dev/acpica/evxface.c
+++ b/sys/contrib/dev/acpica/evxface.c
@@ -921,16 +921,7 @@ AcpiAcquireGlobalLock (
if (ACPI_SUCCESS (Status))
{
- /*
- * If this was the first acquisition of the Global Lock by this thread,
- * create a new handle. Otherwise, return the existing handle.
- */
- if (AcpiGbl_GlobalLockMutex->Mutex.AcquisitionDepth == 1)
- {
- AcpiGbl_GlobalLockHandle++;
- }
-
- /* Return the global lock handle */
+ /* Return the global lock handle (updated in AcpiEvAcquireGlobalLock) */
*Handle = AcpiGbl_GlobalLockHandle;
}