/*******************************************************************************
*
*
******************************************************************************/
/*
* Copyright (C) 2000 - 2016, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*/
#include "acpi.h"
#include "accommon.h"
#include "acnamesp.h"
ACPI_MODULE_NAME ("utownerid")
/*******************************************************************************
*
* FUNCTION: AcpiUtAllocateOwnerId
*
* PARAMETERS: OwnerId - Where the new owner ID is returned
*
* RETURN: Status
*
* DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
* track objects created by the table or method, to be deleted
* when the method exits or the table is unloaded.
*
******************************************************************************/
{
UINT32 i;
UINT32 j;
UINT32 k;
/* Guard against multiple allocations of ID to the same location */
if (*OwnerId)
{
"Owner ID [0x%2.2X] already exists", *OwnerId));
}
/* Mutex for the global ID mask */
if (ACPI_FAILURE (Status))
{
}
/*
* Find a free owner ID, cycle through all possible IDs on repeated
* allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index
* may have to be scanned twice.
*/
for (i = 0, j = AcpiGbl_LastOwnerIdIndex;
i < (ACPI_NUM_OWNERID_MASKS + 1);
i++, j++)
{
if (j >= ACPI_NUM_OWNERID_MASKS)
{
j = 0; /* Wraparound to start of mask array */
}
for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++)
{
if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX)
{
/* There are no free IDs in this mask */
break;
}
if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
{
/*
* Found a free ID. The actual ID is the bit index plus one,
* making zero an invalid Owner ID. Save this as the last ID
* allocated and update the global ID mask.
*/
AcpiGbl_OwnerIdMask[j] |= (1 << k);
AcpiGbl_LastOwnerIdIndex = (UINT8) j;
/*
* Construct encoded ID from the index and bit position
*
* Note: Last [j].k (bit 255) is never used and is marked
* permanently allocated (prevents +1 overflow)
*/
"Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId));
goto Exit;
}
}
}
/*
* All OwnerIds have been allocated. This typically should
* not happen since the IDs are reused after deallocation. The IDs are
* allocated upon table load (one per table) and method execution, and
* they are released when a table is unloaded or a method completes
* execution.
*
* If this error happens, there may be very deep nesting of invoked
* control methods, or there may be a bug where the IDs are not released.
*/
"Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
Exit:
(void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
}
/*******************************************************************************
*
* FUNCTION: AcpiUtReleaseOwnerId
*
* PARAMETERS: OwnerIdPtr - Pointer to a previously allocated OwnerID
*
* RETURN: None. No error is returned because we are either exiting a
* control method or unloading a table. Either way, we would
* ignore any error anyway.
*
* DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
*
******************************************************************************/
void
{
/* Always clear the input OwnerId (zero is an invalid ID) */
*OwnerIdPtr = 0;
/* Zero is not a valid OwnerID */
if (OwnerId == 0)
{
}
/* Mutex for the global ID mask */
if (ACPI_FAILURE (Status))
{
}
/* Normalize the ID to zero */
OwnerId--;
/* Free the owner ID only if it is valid */
{
}
else
{
}
(void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
}