exmutex.c revision db2bae3047e71d795bde12e3baa621f4b6cc8930
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Module Name: exmutex - ASL Mutex Acquire/Release functions
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * $Revision: 1.43 $
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *****************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 1. Copyright Notice
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * All rights reserved.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2. License
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2.1. This is your license from Intel Corp. under its intellectual property
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * rights. You may have additional license terms from the party that provided
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * you this software, covering your right to use that party's intellectual
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * property rights.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * copy of the source code appearing in this file ("Covered Code") an
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * irrevocable, perpetual, worldwide license under Intel's copyrights in the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * base code distributed originally by Intel ("Original Intel Code") to copy,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * make derivatives, distribute, use and display any portion of the Covered
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Code in any form, with the right to sublicense such rights; and
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * license (with the right to sublicense), under only those claims of Intel
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * patents that are infringed by the Original Intel Code, to make, use, sell,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * offer to sell, and import the Covered Code and derivative works thereof
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * solely to the minimum extent necessary to exercise the above copyright
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * license, and in no event shall the patent license extend to any additions
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li * to or modifications of the Original Intel Code. No other license or right
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * is granted directly or by implication, estoppel or otherwise;
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * The above copyright and patent license is granted only if the following
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li * conditions are met:
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3. Conditions
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * 3.1. Redistribution of Source with Rights to Further Distribute Source.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Redistribution of source code of any substantial portion of the Covered
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Code or modification with rights to further distribute source must include
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * the above Copyright Notice, the above License, this list of Conditions,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * and the following Disclaimer and Export Compliance provision. In addition,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Licensee must cause all Covered Code to which Licensee contributes to
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * contain a file documenting the changes Licensee made to create that Covered
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Code and the date of any change. Licensee must include in that file the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * documentation of any changes made by any predecessor Licensee. Licensee
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * must include a prominent statement that the modification is derived,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * directly or indirectly, from Original Intel Code.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Redistribution of source code of any substantial portion of the Covered
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Code or modification without rights to further distribute source must
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * include the following Disclaimer and Export Compliance provision in the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * documentation and/or other materials provided with distribution. In
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * addition, Licensee may not authorize further sublicense of source of any
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * portion of the Covered Code, and must include terms to the effect that the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * license from Licensee to its licensee is limited to the intellectual
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * property embodied in the software Licensee provides to its licensee, and
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * not to intellectual property embodied in modifications its licensee may
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * make.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3.3. Redistribution of Executable. Redistribution in executable form of any
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * substantial portion of the Covered Code or modification must reproduce the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * above Copyright Notice, and the following Disclaimer and Export Compliance
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * provision in the documentation and/or other materials provided with the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * distribution.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3.4. Intel retains all right, title, and interest in and to the Original
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Intel Code.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3.5. Neither the name Intel nor any other trademark owned or controlled by
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Intel shall be used in advertising or otherwise to promote the sale, use or
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * other dealings in products derived from or relating to the Covered Code
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * without prior written authorization from Intel.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 4. Disclaimer and Export Compliance
020c47705d28102a8df83a43ddf08e34dde21f22ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARTICULAR PURPOSE.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
020c47705d28102a8df83a43ddf08e34dde21f22ql * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * LIMITED REMEDY.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 4.3. Licensee shall not export, either directly or indirectly, any of this
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * software or system incorporating such software without first obtaining any
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * required license or other approval from the U. S. Department of Commerce or
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * any other agency or department of the United States Government. In the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * event Licensee exports any such software from the United States or
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * re-exports any such software from a foreign destination, Licensee shall
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * ensure that the distribution and export/re-export of the software is in
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * compliance with all laws, regulations, orders, or other restrictions of the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * U.S. Export Administration Regulations. Licensee agrees that neither it nor
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * any of its subsidiaries will export/re-export any technical data, process,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * software, or service, directly or indirectly, to any country for which the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * United States government or any agency thereof requires an export license,
020c47705d28102a8df83a43ddf08e34dde21f22ql * other governmental approval, or letter of assurance, without first obtaining
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * such license, approval or letter.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *****************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql#define __EXMUTEX_C__
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql#include "acpi.h"
a72f7ea693101cc48bafbb4db6bb437d828011c4ql#include "acinterp.h"
a72f7ea693101cc48bafbb4db6bb437d828011c4ql#include "acevents.h"
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql#define _COMPONENT ACPI_EXECUTER
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_MODULE_NAME ("exmutex")
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/* Local prototypes */
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Listatic void
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael LiAcpiExLinkMutex (
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li ACPI_OPERAND_OBJECT *ObjDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_THREAD_STATE *Thread);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExUnlinkMutex
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: ObjDesc - The mutex to be unlinked
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li *
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li * RETURN: None
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * DESCRIPTION: Remove a mutex from the "AcquiredMutex" list
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ******************************************************************************/
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
a72f7ea693101cc48bafbb4db6bb437d828011c4qlvoid
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal IyerAcpiExUnlinkMutex (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_THREAD_STATE *Thread = ObjDesc->Mutex.OwnerThread;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!Thread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return;
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li }
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li /* Doubly linked list */
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li if (ObjDesc->Mutex.Next)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (ObjDesc->Mutex.Next)->Mutex.Prev = ObjDesc->Mutex.Prev;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.Prev)
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql (ObjDesc->Mutex.Prev)->Mutex.Next = ObjDesc->Mutex.Next;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql else
9aa73b6813b3fd35e78fcc44fd17535e765e504cQin Michael Li {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Thread->AcquiredMutexList = ObjDesc->Mutex.Next;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExLinkMutex
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: ObjDesc - The mutex to be linked
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Thread - Current executing thread object
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: None
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
020c47705d28102a8df83a43ddf08e34dde21f22ql * DESCRIPTION: Add a mutex to the "AcquiredMutex" list for this walk
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlstatic void
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExLinkMutex (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_THREAD_STATE *Thread)
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li{
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li ACPI_OPERAND_OBJECT *ListHead;
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li ListHead = Thread->AcquiredMutexList;
94d05f6c7f329fdf908da99ab50b37d3d33f9fe5Qin Michael Li
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* This object will be the first object in the list */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.Prev = NULL;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.Next = ListHead;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Update old first object to point back to this object */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ListHead)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ListHead->Mutex.Prev = ObjDesc;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Update list head */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Thread->AcquiredMutexList = ObjDesc;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExAcquireMutexObject
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: TimeDesc - Timeout in milliseconds
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * ObjDesc - Mutex object
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Thread - Current thread state
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: Status
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * DESCRIPTION: Acquire an AML mutex, low-level interface. Provides a common
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * path that supports multiple acquires by the same thread.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * MUTEX: Interpreter must be locked
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * NOTE: This interface is called from three places:
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 1) From AcpiExAcquireMutex, via an AML Acquire() operator
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2) From AcpiExAcquireGlobalLock when an AML Field access requires the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * global lock
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3) From the external interface, AcpiAcquireGlobalLock
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlACPI_STATUS
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExAcquireMutexObject (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql UINT16 Timeout,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_THREAD_ID ThreadId)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_STATUS Status;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_FUNCTION_TRACE_PTR (ExAcquireMutexObject, ObjDesc);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!ObjDesc)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_BAD_PARAMETER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Support for multiple acquires by the owning thread */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.ThreadId == ThreadId)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /*
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * The mutex is already owned by this thread, just increment the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * acquisition depth
a72f7ea693101cc48bafbb4db6bb437d828011c4ql */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.AcquisitionDepth++;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_OK);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Acquire the mutex, wait if necessary. Special case for Global Lock */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc == AcpiGbl_GlobalLockMutex)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Status = AcpiEvAcquireGlobalLock (Timeout);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql else
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Status = AcpiExSystemWaitMutex (ObjDesc->Mutex.OsMutex,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Timeout);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ACPI_FAILURE (Status))
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Includes failure from a timeout on TimeDesc */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (Status);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Acquired the mutex: update mutex object */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.ThreadId = ThreadId;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.AcquisitionDepth = 1;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OriginalSyncLevel = 0;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OwnerThread = NULL; /* Used only for AML Acquire() */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_OK);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExAcquireMutex
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: TimeDesc - Timeout integer
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * ObjDesc - Mutex object
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * WalkState - Current method execution state
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: Status
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * DESCRIPTION: Acquire an AML mutex
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlACPI_STATUS
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExAcquireMutex (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *TimeDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_WALK_STATE *WalkState)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_STATUS Status;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_FUNCTION_TRACE_PTR (ExAcquireMutex, ObjDesc);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!ObjDesc)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_BAD_PARAMETER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Must have a valid thread ID */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!WalkState->Thread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO, "Cannot acquire Mutex [%4.4s], null thread info",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_INTERNAL);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /*
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Current sync level must be less than or equal to the sync level of the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * mutex. This mechanism provides some deadlock prevention
a72f7ea693101cc48bafbb4db6bb437d828011c4ql */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql "Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%d)",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node),
a72f7ea693101cc48bafbb4db6bb437d828011c4ql WalkState->Thread->CurrentSyncLevel));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Status = AcpiExAcquireMutexObject ((UINT16) TimeDesc->Integer.Value,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc, WalkState->Thread->ThreadId);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ACPI_SUCCESS (Status) && ObjDesc->Mutex.AcquisitionDepth == 1)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Save Thread object, original/current sync levels */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OwnerThread = WalkState->Thread;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OriginalSyncLevel = WalkState->Thread->CurrentSyncLevel;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Link the mutex to the current thread for force-unlock at method exit */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiExLinkMutex (ObjDesc, WalkState->Thread);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (Status);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExReleaseMutexObject
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: ObjDesc - The object descriptor for this op
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: Status
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * DESCRIPTION: Release a previously acquired Mutex, low level interface.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Provides a common path that supports multiple releases (after
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * previous multiple acquires) by the same thread.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * MUTEX: Interpreter must be locked
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * NOTE: This interface is called from three places:
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 1) From AcpiExReleaseMutex, via an AML Acquire() operator
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 2) From AcpiExReleaseGlobalLock when an AML Field access requires the
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * global lock
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * 3) From the external interface, AcpiReleaseGlobalLock
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlACPI_STATUS
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExReleaseMutexObject (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_STATUS Status = AE_OK;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_FUNCTION_TRACE (ExReleaseMutexObject);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.AcquisitionDepth == 0)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return (AE_NOT_ACQUIRED);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Match multiple Acquires with multiple Releases */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.AcquisitionDepth--;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.AcquisitionDepth != 0)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Just decrement the depth and return */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_OK);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.OwnerThread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Unlink the mutex from the owner's list */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiExUnlinkMutex (ObjDesc);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OwnerThread = NULL;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Release the mutex, special case for Global Lock */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc == AcpiGbl_GlobalLockMutex)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Status = AcpiEvReleaseGlobalLock ();
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql else
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Clear mutex info */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.ThreadId = 0;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (Status);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExReleaseMutex
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: ObjDesc - The object descriptor for this op
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * WalkState - Current method execution state
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: Status
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * DESCRIPTION: Release a previously acquired Mutex.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlACPI_STATUS
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExReleaseMutex (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_WALK_STATE *WalkState)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_STATUS Status = AE_OK;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_FUNCTION_TRACE (ExReleaseMutex);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!ObjDesc)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_BAD_PARAMETER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* The mutex must have been previously acquired in order to release it */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!ObjDesc->Mutex.OwnerThread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], not acquired",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /*
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * The Mutex is owned, but this thread must be the owner.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Special case for Global Lock, any thread can release
a72f7ea693101cc48bafbb4db6bb437d828011c4ql */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if ((ObjDesc->Mutex.OwnerThread->ThreadId != WalkState->Thread->ThreadId) &&
a72f7ea693101cc48bafbb4db6bb437d828011c4ql (ObjDesc != AcpiGbl_GlobalLockMutex))
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql "Thread %X cannot release Mutex [%4.4s] acquired by thread %X",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql WalkState->Thread->ThreadId,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node),
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OwnerThread->ThreadId));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_NOT_OWNER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Must have a valid thread ID */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (!WalkState->Thread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], null thread info",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_INTERNAL);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /*
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * The sync level of the mutex must be less than or equal to the current
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * sync level
a72f7ea693101cc48bafbb4db6bb437d828011c4ql */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.SyncLevel > WalkState->Thread->CurrentSyncLevel)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_ERROR ((AE_INFO,
a72f7ea693101cc48bafbb4db6bb437d828011c4ql "Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %d current %d",
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiUtGetNodeName (ObjDesc->Mutex.Node),
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel));
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Status = AcpiExReleaseMutexObject (ObjDesc);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc->Mutex.AcquisitionDepth == 0)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Restore the original SyncLevel */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql return_ACPI_STATUS (Status);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql/*******************************************************************************
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * FUNCTION: AcpiExReleaseAllMutexes
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * PARAMETERS: Thread - Current executing thread object
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * RETURN: Status
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * DESCRIPTION: Release all mutexes held by this thread
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * NOTE: This function is called as the thread is exiting the interpreter.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * Mutexes are not released when an individual control method is exited, but
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * only when the parent thread actually exits the interpreter. This allows one
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * method to acquire a mutex, and a different method to release it, as long as
a72f7ea693101cc48bafbb4db6bb437d828011c4ql * this is performed underneath a single parent control method.
a72f7ea693101cc48bafbb4db6bb437d828011c4ql *
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ******************************************************************************/
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4qlvoid
a72f7ea693101cc48bafbb4db6bb437d828011c4qlAcpiExReleaseAllMutexes (
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_THREAD_STATE *Thread)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql{
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *Next = Thread->AcquiredMutexList;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_OPERAND_OBJECT *ObjDesc;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ACPI_FUNCTION_ENTRY ();
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Traverse the list of owned mutexes, releasing each one */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql while (Next)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc = Next;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Next = ObjDesc->Mutex.Next;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.Prev = NULL;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.Next = NULL;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.AcquisitionDepth = 0;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Release the mutex, special case for Global Lock */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql if (ObjDesc == AcpiGbl_GlobalLockMutex)
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Ignore errors */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql (void) AcpiEvReleaseGlobalLock ();
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql else
a72f7ea693101cc48bafbb4db6bb437d828011c4ql {
a72f7ea693101cc48bafbb4db6bb437d828011c4ql AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex);
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Mark mutex unowned */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.OwnerThread = NULL;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql ObjDesc->Mutex.ThreadId = 0;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql /* Update Thread SyncLevel (Last mutex is the important one) */
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel;
a72f7ea693101cc48bafbb4db6bb437d828011c4ql }
a72f7ea693101cc48bafbb4db6bb437d828011c4ql}
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql
a72f7ea693101cc48bafbb4db6bb437d828011c4ql