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

📄 utresrc.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* Walk the byte list, abort on any invalid descriptor type or length */    while (Aml < EndAml)    {        /* Validate the Resource Type and Resource Length */        Status = AcpiUtValidateResource (Aml, &ResourceIndex);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }        /* Get the length of this descriptor */        Length = AcpiUtGetDescriptorLength (Aml);        /* Invoke the user function */        if (UserFunction)        {            Status = UserFunction (Aml, Length, Offset, ResourceIndex, Context);            if (ACPI_FAILURE (Status))            {                return (Status);            }        }        /* An EndTag descriptor terminates this resource template */        if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)        {            /*             * There must be at least one more byte in the buffer for             * the 2nd byte of the EndTag             */            if ((Aml + 1) >= EndAml)            {                return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);            }            /* Return the pointer to the EndTag if requested */            if (!UserFunction)            {                *(void **) Context = Aml;            }            /* Normal exit */            return_ACPI_STATUS (AE_OK);        }        Aml += Length;        Offset += Length;    }    /* Did not find an EndTag descriptor */    return (AE_AML_NO_RESOURCE_END_TAG);}/******************************************************************************* * * FUNCTION:    AcpiUtValidateResource * * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor *              ReturnIndex     - Where the resource index is returned. NULL *                                if the index is not required. * * RETURN:      Status, and optionally the Index into the global resource tables * * DESCRIPTION: Validate an AML resource descriptor by checking the Resource *              Type and Resource Length. Returns an index into the global *              resource information/dispatch tables for later use. * ******************************************************************************/ACPI_STATUSAcpiUtValidateResource (    void                    *Aml,    UINT8                   *ReturnIndex){    UINT8                   ResourceType;    UINT8                   ResourceIndex;    ACPI_RS_LENGTH          ResourceLength;    ACPI_RS_LENGTH          MinimumResourceLength;    ACPI_FUNCTION_ENTRY ();    /*     * 1) Validate the ResourceType field (Byte 0)     */    ResourceType = ACPI_GET8 (Aml);    /*     * Byte 0 contains the descriptor name (Resource Type)     * Examine the large/small bit in the resource header     */    if (ResourceType & ACPI_RESOURCE_NAME_LARGE)    {        /* Verify the large resource type (name) against the max */        if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)        {            return (AE_AML_INVALID_RESOURCE_TYPE);        }        /*         * Large Resource Type -- bits 6:0 contain the name         * Translate range 0x80-0x8B to index range 0x10-0x1B         */        ResourceIndex = (UINT8) (ResourceType - 0x70);    }    else    {        /*         * Small Resource Type -- bits 6:3 contain the name         * Shift range to index range 0x00-0x0F         */        ResourceIndex = (UINT8)            ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);    }    /* Check validity of the resource type, zero indicates name is invalid */    if (!AcpiGbl_ResourceTypes[ResourceIndex])    {        return (AE_AML_INVALID_RESOURCE_TYPE);    }    /*     * 2) Validate the ResourceLength field. This ensures that the length     *    is at least reasonable, and guarantees that it is non-zero.     */    ResourceLength = AcpiUtGetResourceLength (Aml);    MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];    /* Validate based upon the type of resource - fixed length or variable */    switch (AcpiGbl_ResourceTypes[ResourceIndex])    {    case ACPI_FIXED_LENGTH:        /* Fixed length resource, length must match exactly */        if (ResourceLength != MinimumResourceLength)        {            return (AE_AML_BAD_RESOURCE_LENGTH);        }        break;    case ACPI_VARIABLE_LENGTH:        /* Variable length resource, length must be at least the minimum */        if (ResourceLength < MinimumResourceLength)        {            return (AE_AML_BAD_RESOURCE_LENGTH);        }        break;    case ACPI_SMALL_VARIABLE_LENGTH:        /* Small variable length resource, length can be (Min) or (Min-1) */        if ((ResourceLength > MinimumResourceLength) ||            (ResourceLength < (MinimumResourceLength - 1)))        {            return (AE_AML_BAD_RESOURCE_LENGTH);        }        break;    default:        /* Shouldn't happen (because of validation earlier), but be sure */        return (AE_AML_INVALID_RESOURCE_TYPE);    }    /* Optionally return the resource table index */    if (ReturnIndex)    {        *ReturnIndex = ResourceIndex;    }    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiUtGetResourceType * * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor * * RETURN:      The Resource Type with no extraneous bits (except the *              Large/Small descriptor bit -- this is left alone) * * DESCRIPTION: Extract the Resource Type/Name from the first byte of *              a resource descriptor. * ******************************************************************************/UINT8AcpiUtGetResourceType (    void                    *Aml){    ACPI_FUNCTION_ENTRY ();    /*     * Byte 0 contains the descriptor name (Resource Type)     * Examine the large/small bit in the resource header     */    if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)    {        /* Large Resource Type -- bits 6:0 contain the name */        return (ACPI_GET8 (Aml));    }    else    {        /* Small Resource Type -- bits 6:3 contain the name */        return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));    }}/******************************************************************************* * * FUNCTION:    AcpiUtGetResourceLength * * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor * * RETURN:      Byte Length * * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By *              definition, this does not include the size of the descriptor *              header or the length field itself. * ******************************************************************************/UINT16AcpiUtGetResourceLength (    void                    *Aml){    ACPI_RS_LENGTH          ResourceLength;    ACPI_FUNCTION_ENTRY ();    /*     * Byte 0 contains the descriptor name (Resource Type)     * Examine the large/small bit in the resource header     */    if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)    {        /* Large Resource type -- bytes 1-2 contain the 16-bit length */        ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));    }    else    {        /* Small Resource type -- bits 2:0 of byte 0 contain the length */        ResourceLength = (UINT16) (ACPI_GET8 (Aml) &                                    ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);    }    return (ResourceLength);}/******************************************************************************* * * FUNCTION:    AcpiUtGetResourceHeaderLength * * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor * * RETURN:      Length of the AML header (depends on large/small descriptor) * * DESCRIPTION: Get the length of the header for this resource. * ******************************************************************************/UINT8AcpiUtGetResourceHeaderLength (    void                    *Aml){    ACPI_FUNCTION_ENTRY ();    /* Examine the large/small bit in the resource header */    if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)    {        return (sizeof (AML_RESOURCE_LARGE_HEADER));    }    else    {        return (sizeof (AML_RESOURCE_SMALL_HEADER));    }}/******************************************************************************* * * FUNCTION:    AcpiUtGetDescriptorLength * * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor * * RETURN:      Byte length * * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the *              length of the descriptor header and the length field itself. *              Used to walk descriptor lists. * ******************************************************************************/UINT32AcpiUtGetDescriptorLength (    void                    *Aml){    ACPI_FUNCTION_ENTRY ();    /*     * Get the Resource Length (does not include header length) and add     * the header length (depends on if this is a small or large resource)     */    return (AcpiUtGetResourceLength (Aml) +            AcpiUtGetResourceHeaderLength (Aml));}/******************************************************************************* * * FUNCTION:    AcpiUtGetResourceEndTag * * PARAMETERS:  ObjDesc         - The resource template buffer object *              EndTag          - Where the pointer to the EndTag is returned * * RETURN:      Status, pointer to the end tag * * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template *              Note: allows a buffer length of zero. * ******************************************************************************/ACPI_STATUSAcpiUtGetResourceEndTag (    ACPI_OPERAND_OBJECT     *ObjDesc,    UINT8                   **EndTag){    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (UtGetResourceEndTag);    /* Allow a buffer length of zero */    if (!ObjDesc->Buffer.Length)    {        *EndTag = ObjDesc->Buffer.Pointer;        return_ACPI_STATUS (AE_OK);    }    /* Validate the template and get a pointer to the EndTag */    Status = AcpiUtWalkAmlResources (ObjDesc->Buffer.Pointer,                ObjDesc->Buffer.Length, NULL, EndTag);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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