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

📄 rscreate.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* Validate/Allocate/Clear caller buffer */    Status = AcpiUtInitializeBuffer (OutputBuffer, BufferSizeNeeded);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Loop through the ACPI_INTERNAL_OBJECTS - Each object     * should be a package that in turn contains an     * ACPI_INTEGER Address, a UINT8 Pin, a Name and a UINT8 SourceIndex.     */    TopObjectList    = PackageObject->Package.Elements;    NumberOfElements = PackageObject->Package.Count;    Buffer           = OutputBuffer->Pointer;    UserPrt          = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, Buffer);    for (Index = 0; Index < NumberOfElements; Index++)    {        /*         * Point UserPrt past this current structure         *         * NOTE: On the first iteration, UserPrt->Length will         * be zero because we cleared the return buffer earlier         */        Buffer += UserPrt->Length;        UserPrt = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, Buffer);        /*         * Fill in the Length field with the information we have at this point.         * The minus four is to subtract the size of the UINT8 Source[4] member         * because it is added below.         */        UserPrt->Length = (sizeof (ACPI_PCI_ROUTING_TABLE) - 4);        /* Each element of the top-level package must also be a package */        if (ACPI_GET_OBJECT_TYPE (*TopObjectList) != ACPI_TYPE_PACKAGE)        {            ACPI_ERROR ((AE_INFO,                "(PRT[%X]) Need sub-package, found %s",                Index, AcpiUtGetObjectTypeName (*TopObjectList)));            return_ACPI_STATUS (AE_AML_OPERAND_TYPE);        }        /* Each sub-package must be of length 4 */        if ((*TopObjectList)->Package.Count != 4)        {            ACPI_ERROR ((AE_INFO,                "(PRT[%X]) Need package of length 4, found length %d",                Index, (*TopObjectList)->Package.Count));            return_ACPI_STATUS (AE_AML_PACKAGE_LIMIT);        }        /*         * Dereference the sub-package.         * The SubObjectList will now point to an array of the four IRQ         * elements: [Address, Pin, Source, SourceIndex]         */        SubObjectList = (*TopObjectList)->Package.Elements;        /* 1) First subobject: Dereference the PRT.Address */        ObjDesc = SubObjectList[0];        if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)        {            UserPrt->Address = ObjDesc->Integer.Value;        }        else        {            ACPI_ERROR ((AE_INFO,                "(PRT[%X].Address) Need Integer, found %s",                Index, AcpiUtGetObjectTypeName (ObjDesc)));            return_ACPI_STATUS (AE_BAD_DATA);        }        /* 2) Second subobject: Dereference the PRT.Pin */        ObjDesc = SubObjectList[1];        if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)        {            UserPrt->Pin = (UINT32) ObjDesc->Integer.Value;        }        else        {            ACPI_ERROR ((AE_INFO,                "(PRT[%X].Pin) Need Integer, found %s",                Index, AcpiUtGetObjectTypeName (ObjDesc)));            return_ACPI_STATUS (AE_BAD_DATA);        }        /*         * 3) Third subobject: Dereference the PRT.SourceName         * The name may be unresolved (slack mode), so allow a null object         */        ObjDesc = SubObjectList[2];        if (ObjDesc)        {            switch (ACPI_GET_OBJECT_TYPE (ObjDesc))            {            case ACPI_TYPE_LOCAL_REFERENCE:                if (ObjDesc->Reference.Opcode != AML_INT_NAMEPATH_OP)                {                    ACPI_ERROR ((AE_INFO,                        "(PRT[%X].Source) Need name, found reference op %X",                        Index, ObjDesc->Reference.Opcode));                    return_ACPI_STATUS (AE_BAD_DATA);                }                Node = ObjDesc->Reference.Node;                /* Use *remaining* length of the buffer as max for pathname */                PathBuffer.Length = OutputBuffer->Length -                                    (UINT32) ((UINT8 *) UserPrt->Source -                                    (UINT8 *) OutputBuffer->Pointer);                PathBuffer.Pointer = UserPrt->Source;                Status = AcpiNsHandleToPathname ((ACPI_HANDLE) Node, &PathBuffer);                /* +1 to include null terminator */                UserPrt->Length += (UINT32) ACPI_STRLEN (UserPrt->Source) + 1;                break;            case ACPI_TYPE_STRING:                ACPI_STRCPY (UserPrt->Source, ObjDesc->String.Pointer);                /*                 * Add to the Length field the length of the string                 * (add 1 for terminator)                 */                UserPrt->Length += ObjDesc->String.Length + 1;                break;            case ACPI_TYPE_INTEGER:                /*                 * If this is a number, then the Source Name is NULL, since the                 * entire buffer was zeroed out, we can leave this alone.                 *                 * Add to the Length field the length of the UINT32 NULL                 */                UserPrt->Length += sizeof (UINT32);                break;            default:               ACPI_ERROR ((AE_INFO,                   "(PRT[%X].Source) Need Ref/String/Integer, found %s",                   Index, AcpiUtGetObjectTypeName (ObjDesc)));               return_ACPI_STATUS (AE_BAD_DATA);            }        }        /* Now align the current length */        UserPrt->Length = (UINT32) ACPI_ROUND_UP_TO_64BIT (UserPrt->Length);        /* 4) Fourth subobject: Dereference the PRT.SourceIndex */        ObjDesc = SubObjectList[3];        if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)        {            UserPrt->SourceIndex = (UINT32) ObjDesc->Integer.Value;        }        else        {            ACPI_ERROR ((AE_INFO,                "(PRT[%X].SourceIndex) Need Integer, found %s",                Index, AcpiUtGetObjectTypeName (ObjDesc)));            return_ACPI_STATUS (AE_BAD_DATA);        }        /* Point to the next ACPI_OPERAND_OBJECT in the top level package */        TopObjectList++;    }    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",            OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiRsCreateAmlResources * * PARAMETERS:  LinkedListBuffer        - Pointer to the resource linked list *              OutputBuffer            - Pointer to the user's buffer * * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code. *              If the OutputBuffer is too small, the error will be *              AE_BUFFER_OVERFLOW and OutputBuffer->Length will point *              to the size buffer needed. * * DESCRIPTION: Takes the linked list of device resources and *              creates a bytestream to be used as input for the *              _SRS control method. * ******************************************************************************/ACPI_STATUSAcpiRsCreateAmlResources (    ACPI_RESOURCE           *LinkedListBuffer,    ACPI_BUFFER             *OutputBuffer){    ACPI_STATUS             Status;    ACPI_SIZE               AmlSizeNeeded = 0;    ACPI_FUNCTION_TRACE (RsCreateAmlResources);    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "LinkedListBuffer = %p\n",        LinkedListBuffer));    /*     * Params already validated, so we don't re-validate here     *     * Pass the LinkedListBuffer into a module that calculates     * the buffer size needed for the byte stream.     */    Status = AcpiRsGetAmlLength (LinkedListBuffer,                &AmlSizeNeeded);    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",        (UINT32) AmlSizeNeeded, AcpiFormatException (Status)));    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Validate/Allocate/Clear caller buffer */    Status = AcpiUtInitializeBuffer (OutputBuffer, AmlSizeNeeded);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /* Do the conversion */    Status = AcpiRsConvertResourcesToAml (LinkedListBuffer, AmlSizeNeeded,                    OutputBuffer->Pointer);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",            OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));    return_ACPI_STATUS (AE_OK);}

⌨️ 快捷键说明

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