⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utobject.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
 ******************************************************************************/BOOLEANAcpiUtValidInternalObject (    void                    *Object){    ACPI_FUNCTION_NAME (UtValidInternalObject);    /* Check for a null pointer */    if (!Object)    {        ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));        return (FALSE);    }    /* Check the descriptor type field */    switch (ACPI_GET_DESCRIPTOR_TYPE (Object))    {    case ACPI_DESC_TYPE_OPERAND:        /* The object appears to be a valid ACPI_OPERAND_OBJECT  */        return (TRUE);    default:        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,                "%p is not not an ACPI operand obj [%s]\n",                Object, AcpiUtGetDescriptorName (Object)));        break;    }    return (FALSE);}/******************************************************************************* * * FUNCTION:    AcpiUtAllocateObjectDescDbg * * PARAMETERS:  ModuleName          - Caller's module name (for error output) *              LineNumber          - Caller's line number (for error output) *              ComponentId         - Caller's component ID (for error output) * * RETURN:      Pointer to newly allocated object descriptor.  Null on error * * DESCRIPTION: Allocate a new object descriptor.  Gracefully handle *              error conditions. * ******************************************************************************/void *AcpiUtAllocateObjectDescDbg (    char                    *ModuleName,    UINT32                  LineNumber,    UINT32                  ComponentId){    ACPI_OPERAND_OBJECT     *Object;    ACPI_FUNCTION_TRACE (UtAllocateObjectDescDbg);    Object = AcpiOsAcquireObject (AcpiGbl_OperandCache);    if (!Object)    {        ACPI_ERROR ((ModuleName, LineNumber,            "Could not allocate an object descriptor"));        return_PTR (NULL);    }    /* Mark the descriptor type */    ACPI_SET_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_OPERAND);    ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n",            Object, (UINT32) sizeof (ACPI_OPERAND_OBJECT)));    return_PTR (Object);}/******************************************************************************* * * FUNCTION:    AcpiUtDeleteObjectDesc * * PARAMETERS:  Object          - An Acpi internal object to be deleted * * RETURN:      None. * * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache * ******************************************************************************/voidAcpiUtDeleteObjectDesc (    ACPI_OPERAND_OBJECT     *Object){    ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);    /* Object must be an ACPI_OPERAND_OBJECT  */    if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)    {        ACPI_ERROR ((AE_INFO,            "%p is not an ACPI Operand object [%s]", Object,            AcpiUtGetDescriptorName (Object)));        return_VOID;    }    (void) AcpiOsReleaseObject (AcpiGbl_OperandCache, Object);    return_VOID;}/******************************************************************************* * * FUNCTION:    AcpiUtGetSimpleObjectSize * * PARAMETERS:  InternalObject     - An ACPI operand object *              ObjLength          - Where the length is returned * * RETURN:      Status * * DESCRIPTION: This function is called to determine the space required to *              contain a simple object for return to an external user. * *              The length includes the object structure plus any additional *              needed space. * ******************************************************************************/static ACPI_STATUSAcpiUtGetSimpleObjectSize (    ACPI_OPERAND_OBJECT     *InternalObject,    ACPI_SIZE               *ObjLength){    ACPI_SIZE               Length;    ACPI_STATUS             Status = AE_OK;    ACPI_FUNCTION_TRACE_PTR (UtGetSimpleObjectSize, InternalObject);    /*     * Handle a null object (Could be a uninitialized package     * element -- which is legal)     */    if (!InternalObject)    {        *ObjLength = 0;        return_ACPI_STATUS (AE_OK);    }    /* Start with the length of the Acpi object */    Length = sizeof (ACPI_OBJECT);    if (ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_NAMED)    {        /* Object is a named object (reference), just return the length */        *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);        return_ACPI_STATUS (Status);    }    /*     * The final length depends on the object type     * Strings and Buffers are packed right up against the parent object and     * must be accessed bytewise or there may be alignment problems on     * certain processors     */    switch (ACPI_GET_OBJECT_TYPE (InternalObject))    {    case ACPI_TYPE_STRING:        Length += (ACPI_SIZE) InternalObject->String.Length + 1;        break;    case ACPI_TYPE_BUFFER:        Length += (ACPI_SIZE) InternalObject->Buffer.Length;        break;    case ACPI_TYPE_INTEGER:    case ACPI_TYPE_PROCESSOR:    case ACPI_TYPE_POWER:        /*         * No extra data for these types         */        break;    case ACPI_TYPE_LOCAL_REFERENCE:        switch (InternalObject->Reference.Opcode)        {        case AML_INT_NAMEPATH_OP:            /*             * Get the actual length of the full pathname to this object.             * The reference will be converted to the pathname to the object             */            Length += ACPI_ROUND_UP_TO_NATIVE_WORD (                        AcpiNsGetPathnameLength (InternalObject->Reference.Node));            break;        default:            /*             * No other reference opcodes are supported.             * Notably, Locals and Args are not supported, but this may be             * required eventually.             */            ACPI_ERROR ((AE_INFO,                "Unsupported Reference opcode=%X in object %p",                InternalObject->Reference.Opcode, InternalObject));            Status = AE_TYPE;            break;        }        break;    default:        ACPI_ERROR ((AE_INFO, "Unsupported type=%X in object %p",            ACPI_GET_OBJECT_TYPE (InternalObject), InternalObject));        Status = AE_TYPE;        break;    }    /*     * Account for the space required by the object rounded up to the next     * multiple of the machine word size.  This keeps each object aligned     * on a machine word boundary. (preventing alignment faults on some     * machines.)     */    *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtGetElementLength * * PARAMETERS:  ACPI_PKG_CALLBACK * * RETURN:      Status * * DESCRIPTION: Get the length of one package element. * ******************************************************************************/static ACPI_STATUSAcpiUtGetElementLength (    UINT8                   ObjectType,    ACPI_OPERAND_OBJECT     *SourceObject,    ACPI_GENERIC_STATE      *State,    void                    *Context){    ACPI_STATUS             Status = AE_OK;    ACPI_PKG_INFO           *Info = (ACPI_PKG_INFO *) Context;    ACPI_SIZE               ObjectSpace;    switch (ObjectType)    {    case ACPI_COPY_TYPE_SIMPLE:        /*         * Simple object - just get the size (Null object/entry is handled         * here also) and sum it into the running package length         */        Status = AcpiUtGetSimpleObjectSize (SourceObject, &ObjectSpace);        if (ACPI_FAILURE (Status))        {            return (Status);        }        Info->Length += ObjectSpace;        break;    case ACPI_COPY_TYPE_PACKAGE:        /* Package object - nothing much to do here, let the walk handle it */        Info->NumPackages++;        State->Pkg.ThisTargetObj = NULL;        break;    default:        /* No other types allowed */        return (AE_BAD_PARAMETER);    }    return (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtGetPackageObjectSize * * PARAMETERS:  InternalObject      - An ACPI internal object *              ObjLength           - Where the length is returned * * RETURN:      Status * * DESCRIPTION: This function is called to determine the space required to *              contain a package object for return to an external user. * *              This is moderately complex since a package contains other *              objects including packages. * ******************************************************************************/static ACPI_STATUSAcpiUtGetPackageObjectSize (    ACPI_OPERAND_OBJECT     *InternalObject,    ACPI_SIZE               *ObjLength){    ACPI_STATUS             Status;    ACPI_PKG_INFO           Info;    ACPI_FUNCTION_TRACE_PTR (UtGetPackageObjectSize, InternalObject);    Info.Length      = 0;    Info.ObjectSpace = 0;    Info.NumPackages = 1;    Status = AcpiUtWalkPackageTree (InternalObject, NULL,                            AcpiUtGetElementLength, &Info);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * We have handled all of the objects in all levels of the package.     * just add the length of the package objects themselves.     * Round up to the next machine word.     */    Info.Length += ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) *                    (ACPI_SIZE) Info.NumPackages;    /* Return the total package length */    *ObjLength = Info.Length;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtGetObjectSize * * PARAMETERS:  InternalObject      - An ACPI internal object *              ObjLength           - Where the length will be returned * * RETURN:      Status * * DESCRIPTION: This function is called to determine the space required to *              contain an object for return to an API user. * ******************************************************************************/ACPI_STATUSAcpiUtGetObjectSize (    ACPI_OPERAND_OBJECT     *InternalObject,    ACPI_SIZE               *ObjLength){    ACPI_STATUS             Status;    ACPI_FUNCTION_ENTRY ();    if ((ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_OPERAND) &&        (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE))    {        Status = AcpiUtGetPackageObjectSize (InternalObject, ObjLength);    }    else    {        Status = AcpiUtGetSimpleObjectSize (InternalObject, ObjLength);    }    return (Status);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -