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

📄 utcopy.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
            return (Status);        }        break;    case ACPI_COPY_TYPE_PACKAGE:        /*         * Build the package object         */        TargetObject->Type              = ACPI_TYPE_PACKAGE;        TargetObject->Package.Count     = SourceObject->Package.Count;        TargetObject->Package.Elements  =            ACPI_CAST_PTR (ACPI_OBJECT, Info->FreeSpace);        /*         * Pass the new package object back to the package walk routine         */        State->Pkg.ThisTargetObj = TargetObject;        /*         * Save space for the array of objects (Package elements)         * update the buffer length counter         */        ObjectSpace = ACPI_ROUND_UP_TO_NATIVE_WORD (                            (ACPI_SIZE) TargetObject->Package.Count *                            sizeof (ACPI_OBJECT));        break;    default:        return (AE_BAD_PARAMETER);    }    Info->FreeSpace   += ObjectSpace;    Info->Length      += ObjectSpace;    return (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyIpackageToEpackage * * PARAMETERS:  InternalObject      - Pointer to the object we are returning *              Buffer              - Where the object is returned *              SpaceUsed           - Where the object length is returned * * RETURN:      Status * * DESCRIPTION: This function is called to place a package object in a user *              buffer.  A package object by definition contains other objects. * *              The buffer is assumed to have sufficient space for the object. *              The caller must have verified the buffer length needed using the *              AcpiUtGetObjectSize function before calling this function. * ******************************************************************************/static ACPI_STATUSAcpiUtCopyIpackageToEpackage (    ACPI_OPERAND_OBJECT     *InternalObject,    UINT8                   *Buffer,    ACPI_SIZE               *SpaceUsed){    ACPI_OBJECT             *ExternalObject;    ACPI_STATUS             Status;    ACPI_PKG_INFO           Info;    ACPI_FUNCTION_TRACE (UtCopyIpackageToEpackage);    /*     * First package at head of the buffer     */    ExternalObject = ACPI_CAST_PTR (ACPI_OBJECT, Buffer);    /*     * Free space begins right after the first package     */    Info.Length      = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));    Info.FreeSpace   = Buffer + ACPI_ROUND_UP_TO_NATIVE_WORD (                                    sizeof (ACPI_OBJECT));    Info.ObjectSpace = 0;    Info.NumPackages = 1;    ExternalObject->Type             = ACPI_GET_OBJECT_TYPE (InternalObject);    ExternalObject->Package.Count    = InternalObject->Package.Count;    ExternalObject->Package.Elements = ACPI_CAST_PTR (ACPI_OBJECT,                                            Info.FreeSpace);    /*     * Leave room for an array of ACPI_OBJECTS in the buffer     * and move the free space past it     */    Info.Length    += (ACPI_SIZE) ExternalObject->Package.Count *                            ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));    Info.FreeSpace += ExternalObject->Package.Count *                            ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));    Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject,                AcpiUtCopyIelementToEelement, &Info);    *SpaceUsed = Info.Length;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyIobjectToEobject * * PARAMETERS:  InternalObject      - The internal object to be converted *              BufferPtr           - Where the object is returned * * RETURN:      Status * * DESCRIPTION: This function is called to build an API object to be returned to *              the caller. * ******************************************************************************/ACPI_STATUSAcpiUtCopyIobjectToEobject (    ACPI_OPERAND_OBJECT     *InternalObject,    ACPI_BUFFER             *RetBuffer){    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (UtCopyIobjectToEobject);    if (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE)    {        /*         * Package object:  Copy all subobjects (including         * nested packages)         */        Status = AcpiUtCopyIpackageToEpackage (InternalObject,                        RetBuffer->Pointer, &RetBuffer->Length);    }    else    {        /*         * Build a simple object (no nested objects)         */        Status = AcpiUtCopyIsimpleToEsimple (InternalObject,                    ACPI_CAST_PTR (ACPI_OBJECT, RetBuffer->Pointer),                    ACPI_ADD_PTR (UINT8, RetBuffer->Pointer,                        ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))),                    &RetBuffer->Length);        /*         * build simple does not include the object size in the length         * so we add it in here         */        RetBuffer->Length += sizeof (ACPI_OBJECT);    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyEsimpleToIsimple * * PARAMETERS:  ExternalObject      - The external object to be converted *              RetInternalObject   - Where the internal object is returned * * RETURN:      Status * * DESCRIPTION: This function copies an external object to an internal one. *              NOTE: Pointers can be copied, we don't need to copy data. *              (The pointers have to be valid in our address space no matter *              what we do with them!) * ******************************************************************************/static ACPI_STATUSAcpiUtCopyEsimpleToIsimple (    ACPI_OBJECT             *ExternalObject,    ACPI_OPERAND_OBJECT     **RetInternalObject){    ACPI_OPERAND_OBJECT     *InternalObject;    ACPI_FUNCTION_TRACE (UtCopyEsimpleToIsimple);    /*     * Simple types supported are: String, Buffer, Integer     */    switch (ExternalObject->Type)    {    case ACPI_TYPE_STRING:    case ACPI_TYPE_BUFFER:    case ACPI_TYPE_INTEGER:        InternalObject = AcpiUtCreateInternalObject (                            (UINT8) ExternalObject->Type);        if (!InternalObject)        {            return_ACPI_STATUS (AE_NO_MEMORY);        }        break;    default:        /* All other types are not supported */        ACPI_ERROR ((AE_INFO, "Unsupported object type, cannot convert to internal object: %s",            AcpiUtGetTypeName (ExternalObject->Type)));        return_ACPI_STATUS (AE_SUPPORT);    }    /* Must COPY string and buffer contents */    switch (ExternalObject->Type)    {    case ACPI_TYPE_STRING:        InternalObject->String.Pointer =            ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) ExternalObject->String.Length + 1);        if (!InternalObject->String.Pointer)        {            goto ErrorExit;        }        ACPI_MEMCPY (InternalObject->String.Pointer,                     ExternalObject->String.Pointer,                     ExternalObject->String.Length);        InternalObject->String.Length  = ExternalObject->String.Length;        break;    case ACPI_TYPE_BUFFER:        InternalObject->Buffer.Pointer =            ACPI_ALLOCATE_ZEROED (ExternalObject->Buffer.Length);        if (!InternalObject->Buffer.Pointer)        {            goto ErrorExit;        }        ACPI_MEMCPY (InternalObject->Buffer.Pointer,                     ExternalObject->Buffer.Pointer,                     ExternalObject->Buffer.Length);        InternalObject->Buffer.Length  = ExternalObject->Buffer.Length;        /* Mark buffer data valid */        InternalObject->Buffer.Flags |= AOPOBJ_DATA_VALID;        break;    case ACPI_TYPE_INTEGER:        InternalObject->Integer.Value   = ExternalObject->Integer.Value;        break;    default:        /* Other types can't get here */        break;    }    *RetInternalObject = InternalObject;    return_ACPI_STATUS (AE_OK);ErrorExit:    AcpiUtRemoveReference (InternalObject);    return_ACPI_STATUS (AE_NO_MEMORY);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyEpackageToIpackage * * PARAMETERS:  ExternalObject      - The external object to be converted *              InternalObject      - Where the internal object is returned * * RETURN:      Status * * DESCRIPTION: Copy an external package object to an internal package. *              Handles nested packages. * ******************************************************************************/static ACPI_STATUSAcpiUtCopyEpackageToIpackage (    ACPI_OBJECT             *ExternalObject,    ACPI_OPERAND_OBJECT     **InternalObject){    ACPI_STATUS             Status = AE_OK;    ACPI_OPERAND_OBJECT     *PackageObject;    ACPI_OPERAND_OBJECT     **PackageElements;    ACPI_NATIVE_UINT        i;    ACPI_FUNCTION_TRACE (UtCopyEpackageToIpackage);    /* Create the package object */    PackageObject = AcpiUtCreatePackageObject (ExternalObject->Package.Count);    if (!PackageObject)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    PackageElements = PackageObject->Package.Elements;    /*     * Recursive implementation. Probably ok, since nested external packages     * as parameters should be very rare.     */    for (i = 0; i < ExternalObject->Package.Count; i++)    {        Status = AcpiUtCopyEobjectToIobject (                    &ExternalObject->Package.Elements[i],                    &PackageElements[i]);        if (ACPI_FAILURE (Status))        {            /* Truncate package and delete it */            PackageObject->Package.Count = (UINT32) i;            PackageElements[i] = NULL;            AcpiUtRemoveReference (PackageObject);            return_ACPI_STATUS (Status);        }    }    /* Mark package data valid */        PackageObject->Package.Flags |= AOPOBJ_DATA_VALID;    *InternalObject = PackageObject;    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiUtCopyEobjectToIobject * * PARAMETERS:  ExternalObject      - The external object to be converted *              InternalObject      - Where the internal object is returned * * RETURN:      Status              - the status of the call * * DESCRIPTION: Converts an external object to an internal object. * ******************************************************************************/ACPI_STATUSAcpiUtCopyEobjectToIobject (    ACPI_OBJECT             *ExternalObject,    ACPI_OPERAND_OBJECT     **InternalObject){

⌨️ 快捷键说明

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