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

📄 utcopy.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (UtCopyEobjectToIobject);    if (ExternalObject->Type == ACPI_TYPE_PACKAGE)    {        Status = AcpiUtCopyEpackageToIpackage (ExternalObject, InternalObject);    }    else    {        /*         * Build a simple object (no nested objects)         */        Status = AcpiUtCopyEsimpleToIsimple (ExternalObject, InternalObject);    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopySimpleObject * * PARAMETERS:  SourceDesc          - The internal object to be copied *              DestDesc            - New target object * * RETURN:      Status * * DESCRIPTION: Simple copy of one internal object to another.  Reference count *              of the destination object is preserved. * ******************************************************************************/static ACPI_STATUSAcpiUtCopySimpleObject (    ACPI_OPERAND_OBJECT     *SourceDesc,    ACPI_OPERAND_OBJECT     *DestDesc){    UINT16                  ReferenceCount;    ACPI_OPERAND_OBJECT     *NextObject;    /* Save fields from destination that we don't want to overwrite */    ReferenceCount = DestDesc->Common.ReferenceCount;    NextObject = DestDesc->Common.NextObject;    /* Copy the entire source object over the destination object*/    ACPI_MEMCPY ((char *) DestDesc, (char *) SourceDesc,                    sizeof (ACPI_OPERAND_OBJECT));    /* Restore the saved fields */    DestDesc->Common.ReferenceCount = ReferenceCount;    DestDesc->Common.NextObject = NextObject;    /* New object is not static, regardless of source */    DestDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER;    /* Handle the objects with extra data */    switch (ACPI_GET_OBJECT_TYPE (DestDesc))    {    case ACPI_TYPE_BUFFER:        /*         * Allocate and copy the actual buffer if and only if:         * 1) There is a valid buffer pointer         * 2) The buffer has a length > 0         */        if ((SourceDesc->Buffer.Pointer) &&            (SourceDesc->Buffer.Length))        {            DestDesc->Buffer.Pointer =                ACPI_ALLOCATE (SourceDesc->Buffer.Length);            if (!DestDesc->Buffer.Pointer)            {                return (AE_NO_MEMORY);            }            /* Copy the actual buffer data */            ACPI_MEMCPY (DestDesc->Buffer.Pointer,                    SourceDesc->Buffer.Pointer,                    SourceDesc->Buffer.Length);        }        break;    case ACPI_TYPE_STRING:        /*         * Allocate and copy the actual string if and only if:         * 1) There is a valid string pointer         * (Pointer to a NULL string is allowed)         */        if (SourceDesc->String.Pointer)        {            DestDesc->String.Pointer =                ACPI_ALLOCATE ((ACPI_SIZE) SourceDesc->String.Length + 1);            if (!DestDesc->String.Pointer)            {                return (AE_NO_MEMORY);            }            /* Copy the actual string data */            ACPI_MEMCPY (DestDesc->String.Pointer, SourceDesc->String.Pointer,                         (ACPI_SIZE) SourceDesc->String.Length + 1);        }        break;    case ACPI_TYPE_LOCAL_REFERENCE:        /*         * We copied the reference object, so we now must add a reference         * to the object pointed to by the reference         *         * DDBHandle reference (from Load/LoadTable is a special reference,         * it's Reference.Object is the table index, so does not need to         * increase the reference count         */        if (SourceDesc->Reference.Opcode == AML_LOAD_OP)        {            break;        }        AcpiUtAddReference (SourceDesc->Reference.Object);        break;    case ACPI_TYPE_REGION:        /*         * We copied the Region Handler, so we now must add a reference         */        if (DestDesc->Region.Handler)        {            AcpiUtAddReference (DestDesc->Region.Handler);        }        break;    default:        /* Nothing to do for other simple objects */        break;    }    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyIelementToIelement * * PARAMETERS:  ACPI_PKG_CALLBACK * * RETURN:      Status * * DESCRIPTION: Copy one package element to another package element * ******************************************************************************/static ACPI_STATUSAcpiUtCopyIelementToIelement (    UINT8                   ObjectType,    ACPI_OPERAND_OBJECT     *SourceObject,    ACPI_GENERIC_STATE      *State,    void                    *Context){    ACPI_STATUS             Status = AE_OK;    UINT32                  ThisIndex;    ACPI_OPERAND_OBJECT     **ThisTargetPtr;    ACPI_OPERAND_OBJECT     *TargetObject;    ACPI_FUNCTION_ENTRY ();    ThisIndex     = State->Pkg.Index;    ThisTargetPtr = (ACPI_OPERAND_OBJECT **)                        &State->Pkg.DestObject->Package.Elements[ThisIndex];    switch (ObjectType)    {    case ACPI_COPY_TYPE_SIMPLE:        /* A null source object indicates a (legal) null package element */        if (SourceObject)        {            /*             * This is a simple object, just copy it             */            TargetObject = AcpiUtCreateInternalObject (                                ACPI_GET_OBJECT_TYPE (SourceObject));            if (!TargetObject)            {                return (AE_NO_MEMORY);            }            Status = AcpiUtCopySimpleObject (SourceObject, TargetObject);            if (ACPI_FAILURE (Status))            {                goto ErrorExit;            }            *ThisTargetPtr = TargetObject;        }        else        {            /* Pass through a null element */            *ThisTargetPtr = NULL;        }        break;    case ACPI_COPY_TYPE_PACKAGE:        /*         * This object is a package - go down another nesting level         * Create and build the package object         */        TargetObject = AcpiUtCreatePackageObject (SourceObject->Package.Count);        if (!TargetObject)        {            return (AE_NO_MEMORY);        }        TargetObject->Common.Flags = SourceObject->Common.Flags;        /* Pass the new package object back to the package walk routine */        State->Pkg.ThisTargetObj = TargetObject;        /* Store the object pointer in the parent package object */        *ThisTargetPtr = TargetObject;        break;    default:        return (AE_BAD_PARAMETER);    }    return (Status);ErrorExit:    AcpiUtRemoveReference (TargetObject);    return (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyIpackageToIpackage * * PARAMETERS:  *SourceObj      - Pointer to the source package object *              *DestObj        - Where the internal object is returned * * RETURN:      Status          - the status of the call * * DESCRIPTION: This function is called to copy an internal package object *              into another internal package object. * ******************************************************************************/static ACPI_STATUSAcpiUtCopyIpackageToIpackage (    ACPI_OPERAND_OBJECT     *SourceObj,    ACPI_OPERAND_OBJECT     *DestObj,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status = AE_OK;    ACPI_FUNCTION_TRACE (UtCopyIpackageToIpackage);    DestObj->Common.Type    = ACPI_GET_OBJECT_TYPE (SourceObj);    DestObj->Common.Flags   = SourceObj->Common.Flags;    DestObj->Package.Count  = SourceObj->Package.Count;    /*     * Create the object array and walk the source package tree     */    DestObj->Package.Elements = ACPI_ALLOCATE_ZEROED (                                    ((ACPI_SIZE) SourceObj->Package.Count + 1) *                                    sizeof (void *));    if (!DestObj->Package.Elements)    {        ACPI_ERROR ((AE_INFO, "Package allocation failure"));        return_ACPI_STATUS (AE_NO_MEMORY);    }    /*     * Copy the package element-by-element by walking the package "tree".     * This handles nested packages of arbitrary depth.     */    Status = AcpiUtWalkPackageTree (SourceObj, DestObj,                AcpiUtCopyIelementToIelement, WalkState);    if (ACPI_FAILURE (Status))    {        /* On failure, delete the destination package object */        AcpiUtRemoveReference (DestObj);    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyIobjectToIobject * * PARAMETERS:  WalkState           - Current walk state *              SourceDesc          - The internal object to be copied *              DestDesc            - Where the copied object is returned * * RETURN:      Status * * DESCRIPTION: Copy an internal object to a new internal object * ******************************************************************************/ACPI_STATUSAcpiUtCopyIobjectToIobject (    ACPI_OPERAND_OBJECT     *SourceDesc,    ACPI_OPERAND_OBJECT     **DestDesc,    ACPI_WALK_STATE         *WalkState){    ACPI_STATUS             Status = AE_OK;    ACPI_FUNCTION_TRACE (UtCopyIobjectToIobject);    /* Create the top level object */    *DestDesc = AcpiUtCreateInternalObject (ACPI_GET_OBJECT_TYPE (SourceDesc));    if (!*DestDesc)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    /* Copy the object and possible subobjects */    if (ACPI_GET_OBJECT_TYPE (SourceDesc) == ACPI_TYPE_PACKAGE)    {        Status = AcpiUtCopyIpackageToIpackage (SourceDesc, *DestDesc,                        WalkState);    }    else    {        Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc);    }    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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