![]() |
|
|||
File indexing completed on 2025-05-11 08:24:03
0001 /******************************************************************************* 0002 * 0003 * Module Name: utmutex - local mutex support 0004 * 0005 ******************************************************************************/ 0006 0007 /****************************************************************************** 0008 * 0009 * 1. Copyright Notice 0010 * 0011 * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 0012 * All rights reserved. 0013 * 0014 * 2. License 0015 * 0016 * 2.1. This is your license from Intel Corp. under its intellectual property 0017 * rights. You may have additional license terms from the party that provided 0018 * you this software, covering your right to use that party's intellectual 0019 * property rights. 0020 * 0021 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 0022 * copy of the source code appearing in this file ("Covered Code") an 0023 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 0024 * base code distributed originally by Intel ("Original Intel Code") to copy, 0025 * make derivatives, distribute, use and display any portion of the Covered 0026 * Code in any form, with the right to sublicense such rights; and 0027 * 0028 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 0029 * license (with the right to sublicense), under only those claims of Intel 0030 * patents that are infringed by the Original Intel Code, to make, use, sell, 0031 * offer to sell, and import the Covered Code and derivative works thereof 0032 * solely to the minimum extent necessary to exercise the above copyright 0033 * license, and in no event shall the patent license extend to any additions 0034 * to or modifications of the Original Intel Code. No other license or right 0035 * is granted directly or by implication, estoppel or otherwise; 0036 * 0037 * The above copyright and patent license is granted only if the following 0038 * conditions are met: 0039 * 0040 * 3. Conditions 0041 * 0042 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 0043 * Redistribution of source code of any substantial portion of the Covered 0044 * Code or modification with rights to further distribute source must include 0045 * the above Copyright Notice, the above License, this list of Conditions, 0046 * and the following Disclaimer and Export Compliance provision. In addition, 0047 * Licensee must cause all Covered Code to which Licensee contributes to 0048 * contain a file documenting the changes Licensee made to create that Covered 0049 * Code and the date of any change. Licensee must include in that file the 0050 * documentation of any changes made by any predecessor Licensee. Licensee 0051 * must include a prominent statement that the modification is derived, 0052 * directly or indirectly, from Original Intel Code. 0053 * 0054 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 0055 * Redistribution of source code of any substantial portion of the Covered 0056 * Code or modification without rights to further distribute source must 0057 * include the following Disclaimer and Export Compliance provision in the 0058 * documentation and/or other materials provided with distribution. In 0059 * addition, Licensee may not authorize further sublicense of source of any 0060 * portion of the Covered Code, and must include terms to the effect that the 0061 * license from Licensee to its licensee is limited to the intellectual 0062 * property embodied in the software Licensee provides to its licensee, and 0063 * not to intellectual property embodied in modifications its licensee may 0064 * make. 0065 * 0066 * 3.3. Redistribution of Executable. Redistribution in executable form of any 0067 * substantial portion of the Covered Code or modification must reproduce the 0068 * above Copyright Notice, and the following Disclaimer and Export Compliance 0069 * provision in the documentation and/or other materials provided with the 0070 * distribution. 0071 * 0072 * 3.4. Intel retains all right, title, and interest in and to the Original 0073 * Intel Code. 0074 * 0075 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 0076 * Intel shall be used in advertising or otherwise to promote the sale, use or 0077 * other dealings in products derived from or relating to the Covered Code 0078 * without prior written authorization from Intel. 0079 * 0080 * 4. Disclaimer and Export Compliance 0081 * 0082 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 0083 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 0084 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 0085 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 0086 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 0087 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 0088 * PARTICULAR PURPOSE. 0089 * 0090 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 0091 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 0092 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 0093 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 0094 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 0095 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 0096 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 0097 * LIMITED REMEDY. 0098 * 0099 * 4.3. Licensee shall not export, either directly or indirectly, any of this 0100 * software or system incorporating such software without first obtaining any 0101 * required license or other approval from the U. S. Department of Commerce or 0102 * any other agency or department of the United States Government. In the 0103 * event Licensee exports any such software from the United States or 0104 * re-exports any such software from a foreign destination, Licensee shall 0105 * ensure that the distribution and export/re-export of the software is in 0106 * compliance with all laws, regulations, orders, or other restrictions of the 0107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 0108 * any of its subsidiaries will export/re-export any technical data, process, 0109 * software, or service, directly or indirectly, to any country for which the 0110 * United States government or any agency thereof requires an export license, 0111 * other governmental approval, or letter of assurance, without first obtaining 0112 * such license, approval or letter. 0113 * 0114 ***************************************************************************** 0115 * 0116 * Alternatively, you may choose to be licensed under the terms of the 0117 * following license: 0118 * 0119 * Redistribution and use in source and binary forms, with or without 0120 * modification, are permitted provided that the following conditions 0121 * are met: 0122 * 1. Redistributions of source code must retain the above copyright 0123 * notice, this list of conditions, and the following disclaimer, 0124 * without modification. 0125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 0126 * substantially similar to the "NO WARRANTY" disclaimer below 0127 * ("Disclaimer") and any redistribution must be conditioned upon 0128 * including a substantially similar Disclaimer requirement for further 0129 * binary redistribution. 0130 * 3. Neither the names of the above-listed copyright holders nor the names 0131 * of any contributors may be used to endorse or promote products derived 0132 * from this software without specific prior written permission. 0133 * 0134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 0135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 0136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 0137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 0138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 0139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 0140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 0141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 0142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 0143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 0144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 0145 * 0146 * Alternatively, you may choose to be licensed under the terms of the 0147 * GNU General Public License ("GPL") version 2 as published by the Free 0148 * Software Foundation. 0149 * 0150 *****************************************************************************/ 0151 0152 #include "acpi.h" 0153 #include "accommon.h" 0154 0155 #define _COMPONENT ACPI_UTILITIES 0156 ACPI_MODULE_NAME ("utmutex") 0157 0158 /* Local prototypes */ 0159 0160 static ACPI_STATUS 0161 AcpiUtCreateMutex ( 0162 ACPI_MUTEX_HANDLE MutexId); 0163 0164 static void 0165 AcpiUtDeleteMutex ( 0166 ACPI_MUTEX_HANDLE MutexId); 0167 0168 0169 /******************************************************************************* 0170 * 0171 * FUNCTION: AcpiUtMutexInitialize 0172 * 0173 * PARAMETERS: None. 0174 * 0175 * RETURN: Status 0176 * 0177 * DESCRIPTION: Create the system mutex objects. This includes mutexes, 0178 * spin locks, and reader/writer locks. 0179 * 0180 ******************************************************************************/ 0181 0182 ACPI_STATUS 0183 AcpiUtMutexInitialize ( 0184 void) 0185 { 0186 UINT32 i; 0187 ACPI_STATUS Status; 0188 0189 0190 ACPI_FUNCTION_TRACE (UtMutexInitialize); 0191 0192 0193 /* Create each of the predefined mutex objects */ 0194 0195 for (i = 0; i < ACPI_NUM_MUTEX; i++) 0196 { 0197 Status = AcpiUtCreateMutex (i); 0198 if (ACPI_FAILURE (Status)) 0199 { 0200 return_ACPI_STATUS (Status); 0201 } 0202 } 0203 0204 /* Create the spinlocks for use at interrupt level or for speed */ 0205 0206 Status = AcpiOsCreateLock (&AcpiGbl_GpeLock); 0207 if (ACPI_FAILURE (Status)) 0208 { 0209 return_ACPI_STATUS (Status); 0210 } 0211 0212 Status = AcpiOsCreateLock (&AcpiGbl_HardwareLock); 0213 if (ACPI_FAILURE (Status)) 0214 { 0215 return_ACPI_STATUS (Status); 0216 } 0217 0218 Status = AcpiOsCreateLock (&AcpiGbl_ReferenceCountLock); 0219 if (ACPI_FAILURE (Status)) 0220 { 0221 return_ACPI_STATUS (Status); 0222 } 0223 0224 /* Mutex for _OSI support */ 0225 0226 Status = AcpiOsCreateMutex (&AcpiGbl_OsiMutex); 0227 if (ACPI_FAILURE (Status)) 0228 { 0229 return_ACPI_STATUS (Status); 0230 } 0231 0232 /* Create the reader/writer lock for namespace access */ 0233 0234 Status = AcpiUtCreateRwLock (&AcpiGbl_NamespaceRwLock); 0235 if (ACPI_FAILURE (Status)) 0236 { 0237 return_ACPI_STATUS (Status); 0238 } 0239 0240 return_ACPI_STATUS (Status); 0241 } 0242 0243 0244 /******************************************************************************* 0245 * 0246 * FUNCTION: AcpiUtMutexTerminate 0247 * 0248 * PARAMETERS: None. 0249 * 0250 * RETURN: None. 0251 * 0252 * DESCRIPTION: Delete all of the system mutex objects. This includes mutexes, 0253 * spin locks, and reader/writer locks. 0254 * 0255 ******************************************************************************/ 0256 0257 void 0258 AcpiUtMutexTerminate ( 0259 void) 0260 { 0261 UINT32 i; 0262 0263 0264 ACPI_FUNCTION_TRACE (UtMutexTerminate); 0265 0266 0267 /* Delete each predefined mutex object */ 0268 0269 for (i = 0; i < ACPI_NUM_MUTEX; i++) 0270 { 0271 AcpiUtDeleteMutex (i); 0272 } 0273 0274 AcpiOsDeleteMutex (AcpiGbl_OsiMutex); 0275 0276 /* Delete the spinlocks */ 0277 0278 AcpiOsDeleteLock (AcpiGbl_GpeLock); 0279 AcpiOsDeleteLock (AcpiGbl_HardwareLock); 0280 AcpiOsDeleteLock (AcpiGbl_ReferenceCountLock); 0281 0282 /* Delete the reader/writer lock */ 0283 0284 AcpiUtDeleteRwLock (&AcpiGbl_NamespaceRwLock); 0285 return_VOID; 0286 } 0287 0288 0289 /******************************************************************************* 0290 * 0291 * FUNCTION: AcpiUtCreateMutex 0292 * 0293 * PARAMETERS: MutexID - ID of the mutex to be created 0294 * 0295 * RETURN: Status 0296 * 0297 * DESCRIPTION: Create a mutex object. 0298 * 0299 ******************************************************************************/ 0300 0301 static ACPI_STATUS 0302 AcpiUtCreateMutex ( 0303 ACPI_MUTEX_HANDLE MutexId) 0304 { 0305 ACPI_STATUS Status = AE_OK; 0306 0307 0308 ACPI_FUNCTION_TRACE_U32 (UtCreateMutex, MutexId); 0309 0310 0311 if (!AcpiGbl_MutexInfo[MutexId].Mutex) 0312 { 0313 Status = AcpiOsCreateMutex (&AcpiGbl_MutexInfo[MutexId].Mutex); 0314 AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 0315 AcpiGbl_MutexInfo[MutexId].UseCount = 0; 0316 } 0317 0318 return_ACPI_STATUS (Status); 0319 } 0320 0321 0322 /******************************************************************************* 0323 * 0324 * FUNCTION: AcpiUtDeleteMutex 0325 * 0326 * PARAMETERS: MutexID - ID of the mutex to be deleted 0327 * 0328 * RETURN: Status 0329 * 0330 * DESCRIPTION: Delete a mutex object. 0331 * 0332 ******************************************************************************/ 0333 0334 static void 0335 AcpiUtDeleteMutex ( 0336 ACPI_MUTEX_HANDLE MutexId) 0337 { 0338 0339 ACPI_FUNCTION_TRACE_U32 (UtDeleteMutex, MutexId); 0340 0341 0342 AcpiOsDeleteMutex (AcpiGbl_MutexInfo[MutexId].Mutex); 0343 0344 AcpiGbl_MutexInfo[MutexId].Mutex = NULL; 0345 AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 0346 0347 return_VOID; 0348 } 0349 0350 0351 /******************************************************************************* 0352 * 0353 * FUNCTION: AcpiUtAcquireMutex 0354 * 0355 * PARAMETERS: MutexID - ID of the mutex to be acquired 0356 * 0357 * RETURN: Status 0358 * 0359 * DESCRIPTION: Acquire a mutex object. 0360 * 0361 ******************************************************************************/ 0362 0363 ACPI_STATUS 0364 AcpiUtAcquireMutex ( 0365 ACPI_MUTEX_HANDLE MutexId) 0366 { 0367 ACPI_STATUS Status; 0368 ACPI_THREAD_ID ThisThreadId; 0369 0370 0371 ACPI_FUNCTION_NAME (UtAcquireMutex); 0372 0373 0374 if (MutexId > ACPI_MAX_MUTEX) 0375 { 0376 return (AE_BAD_PARAMETER); 0377 } 0378 0379 ThisThreadId = AcpiOsGetThreadId (); 0380 0381 #ifdef ACPI_MUTEX_DEBUG 0382 { 0383 UINT32 i; 0384 /* 0385 * Mutex debug code, for internal debugging only. 0386 * 0387 * Deadlock prevention. Check if this thread owns any mutexes of value 0388 * greater than or equal to this one. If so, the thread has violated 0389 * the mutex ordering rule. This indicates a coding error somewhere in 0390 * the ACPI subsystem code. 0391 */ 0392 for (i = MutexId; i < ACPI_NUM_MUTEX; i++) 0393 { 0394 if (AcpiGbl_MutexInfo[i].ThreadId == ThisThreadId) 0395 { 0396 if (i == MutexId) 0397 { 0398 ACPI_ERROR ((AE_INFO, 0399 "Mutex [%s] already acquired by this thread [%u]", 0400 AcpiUtGetMutexName (MutexId), 0401 (UINT32) ThisThreadId)); 0402 0403 return (AE_ALREADY_ACQUIRED); 0404 } 0405 0406 ACPI_ERROR ((AE_INFO, 0407 "Invalid acquire order: Thread %u owns [%s], wants [%s]", 0408 (UINT32) ThisThreadId, AcpiUtGetMutexName (i), 0409 AcpiUtGetMutexName (MutexId))); 0410 0411 return (AE_ACQUIRE_DEADLOCK); 0412 } 0413 } 0414 } 0415 #endif 0416 0417 ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, 0418 "Thread %u attempting to acquire Mutex [%s]\n", 0419 (UINT32) ThisThreadId, AcpiUtGetMutexName (MutexId))); 0420 0421 Status = AcpiOsAcquireMutex ( 0422 AcpiGbl_MutexInfo[MutexId].Mutex, ACPI_WAIT_FOREVER); 0423 if (ACPI_SUCCESS (Status)) 0424 { 0425 ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, 0426 "Thread %u acquired Mutex [%s]\n", 0427 (UINT32) ThisThreadId, AcpiUtGetMutexName (MutexId))); 0428 0429 AcpiGbl_MutexInfo[MutexId].UseCount++; 0430 AcpiGbl_MutexInfo[MutexId].ThreadId = ThisThreadId; 0431 } 0432 else 0433 { 0434 ACPI_EXCEPTION ((AE_INFO, Status, 0435 "Thread %u could not acquire Mutex [%s] (0x%X)", 0436 (UINT32) ThisThreadId, AcpiUtGetMutexName (MutexId), MutexId)); 0437 } 0438 0439 return (Status); 0440 } 0441 0442 0443 /******************************************************************************* 0444 * 0445 * FUNCTION: AcpiUtReleaseMutex 0446 * 0447 * PARAMETERS: MutexID - ID of the mutex to be released 0448 * 0449 * RETURN: Status 0450 * 0451 * DESCRIPTION: Release a mutex object. 0452 * 0453 ******************************************************************************/ 0454 0455 ACPI_STATUS 0456 AcpiUtReleaseMutex ( 0457 ACPI_MUTEX_HANDLE MutexId) 0458 { 0459 ACPI_FUNCTION_NAME (UtReleaseMutex); 0460 0461 0462 ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %u releasing Mutex [%s]\n", 0463 (UINT32) AcpiOsGetThreadId (), AcpiUtGetMutexName (MutexId))); 0464 0465 if (MutexId > ACPI_MAX_MUTEX) 0466 { 0467 return (AE_BAD_PARAMETER); 0468 } 0469 0470 /* 0471 * Mutex must be acquired in order to release it! 0472 */ 0473 if (AcpiGbl_MutexInfo[MutexId].ThreadId == ACPI_MUTEX_NOT_ACQUIRED) 0474 { 0475 ACPI_ERROR ((AE_INFO, 0476 "Mutex [%s] (0x%X) is not acquired, cannot release", 0477 AcpiUtGetMutexName (MutexId), MutexId)); 0478 0479 return (AE_NOT_ACQUIRED); 0480 } 0481 0482 #ifdef ACPI_MUTEX_DEBUG 0483 { 0484 UINT32 i; 0485 /* 0486 * Mutex debug code, for internal debugging only. 0487 * 0488 * Deadlock prevention. Check if this thread owns any mutexes of value 0489 * greater than this one. If so, the thread has violated the mutex 0490 * ordering rule. This indicates a coding error somewhere in 0491 * the ACPI subsystem code. 0492 */ 0493 for (i = MutexId; i < ACPI_NUM_MUTEX; i++) 0494 { 0495 if (AcpiGbl_MutexInfo[i].ThreadId == AcpiOsGetThreadId ()) 0496 { 0497 if (i == MutexId) 0498 { 0499 continue; 0500 } 0501 0502 ACPI_ERROR ((AE_INFO, 0503 "Invalid release order: owns [%s], releasing [%s]", 0504 AcpiUtGetMutexName (i), AcpiUtGetMutexName (MutexId))); 0505 0506 return (AE_RELEASE_DEADLOCK); 0507 } 0508 } 0509 } 0510 #endif 0511 0512 /* Mark unlocked FIRST */ 0513 0514 AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 0515 0516 AcpiOsReleaseMutex (AcpiGbl_MutexInfo[MutexId].Mutex); 0517 return (AE_OK); 0518 }
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |