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

📄 asloperands.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
        case PARSEOP_NAMESEG:        case PARSEOP_RESERVED_BYTES:            /* Named or reserved field entry */            PkgLengthNode     = Next->Asl.Child;            NewBitOffset      = (UINT32) PkgLengthNode->Asl.Value.Integer;            CurrentBitOffset += NewBitOffset;            /* Save the current AccessAs value for error checking later */            switch (AccessType)            {                case AML_FIELD_ACCESS_ANY:                case AML_FIELD_ACCESS_BYTE:                case AML_FIELD_ACCESS_BUFFER:                default:                    MinimumLength = 8;                    break;                case AML_FIELD_ACCESS_WORD:                    MinimumLength = 16;                    break;                case AML_FIELD_ACCESS_DWORD:                    MinimumLength = 32;                    break;                case AML_FIELD_ACCESS_QWORD:                    MinimumLength = 64;                    break;            }            PkgLengthNode->Asl.ExtraValue = MinimumLength;            break;        default:            /* All supported field opcodes must appear above */            break;        }        /* Move on to next entry in the field list */        Next = Next->Asl.Next;    }}/******************************************************************************* * * FUNCTION:    OpnDoField * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the FIELD ASL keyword * ******************************************************************************/static voidOpnDoField (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Next;    /* Opcode is parent node */    /* First child is field name */    Next = Op->Asl.Child;    /* Second child is the AccessType */    OpnDoFieldCommon (Op, Next->Asl.Next);}/******************************************************************************* * * FUNCTION:    OpnDoIndexField * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the INDEXFIELD ASL keyword * ******************************************************************************/static voidOpnDoIndexField (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Next;    /* Opcode is parent node */    /* First child is the index name */    Next = Op->Asl.Child;    /* Second child is the data name */    Next = Next->Asl.Next;    /* Third child is the AccessType */    OpnDoFieldCommon (Op, Next->Asl.Next);}/******************************************************************************* * * FUNCTION:    OpnDoBankField * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the BANKFIELD ASL keyword * ******************************************************************************/static voidOpnDoBankField (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Next;    /* Opcode is parent node */    /* First child is the region name */    Next = Op->Asl.Child;    /* Second child is the bank name */    Next = Next->Asl.Next;    /* Third child is the bank value */    Next = Next->Asl.Next;    /* Fourth child is the AccessType */    OpnDoFieldCommon (Op, Next->Asl.Next);}/******************************************************************************* * * FUNCTION:    OpnDoRegion * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Tries to get the length of the region.  Can only do this at *              compile time if the length is a constant. * ******************************************************************************/static voidOpnDoRegion (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Next;    /* Opcode is parent node */    /* First child is the region name */    Next = Op->Asl.Child;    /* Second child is the space ID*/    Next = Next->Asl.Next;    /* Third child is the region offset */    Next = Next->Asl.Next;    /* Fourth child is the region length */    Next = Next->Asl.Next;    if (Next->Asl.ParseOpcode == PARSEOP_INTEGER)    {        Op->Asl.Value.Integer = Next->Asl.Value.Integer;    }    else    {        Op->Asl.Value.Integer = ACPI_INTEGER_MAX;    }}/******************************************************************************* * * FUNCTION:    OpnDoBuffer * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the BUFFER ASL keyword.  We *              build a single raw byte buffer from the initialization nodes, *              each parse node contains a buffer byte. * ******************************************************************************/static voidOpnDoBuffer (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *InitializerOp;    ACPI_PARSE_OBJECT       *BufferLengthOp;    /* Optional arguments for this opcode with defaults */    UINT32                  BufferLength = 0;    /* Opcode and package length first */    /* Buffer Length is next, followed by the initializer list */    BufferLengthOp = Op->Asl.Child;    InitializerOp = BufferLengthOp->Asl.Next;    /*     * If the BufferLength is not an INTEGER or was not specified in the ASL     * (DEFAULT_ARG), it is a TermArg that is     * evaluated at run-time, and we are therefore finished.     */    if ((BufferLengthOp->Asl.ParseOpcode != PARSEOP_INTEGER) &&        (BufferLengthOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))    {        return;    }    /*     * We want to count the number of items in the initializer list, because if     * it is larger than the buffer length, we will define the buffer size     * to be the size of the initializer list (as per the ACPI Specification)     */    switch (InitializerOp->Asl.ParseOpcode)    {    case PARSEOP_INTEGER:    case PARSEOP_BYTECONST:    case PARSEOP_WORDCONST:    case PARSEOP_DWORDCONST:        /* The peer list contains the byte list (if any...) */        while (InitializerOp)        {            /* For buffers, this is a list of raw bytes */            InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BYTE;            InitializerOp->Asl.AmlLength      = 1;            InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;            BufferLength++;            InitializerOp = ASL_GET_PEER_NODE (InitializerOp);        }        break;    case PARSEOP_STRING_LITERAL:        /*         * Only one initializer, the string.  Buffer must be big enough to hold         * the string plus the null termination byte         */        BufferLength = strlen (InitializerOp->Asl.Value.String) + 1;        InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BUFFER;        InitializerOp->Asl.AmlLength      = BufferLength;        InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;        break;    case PARSEOP_RAW_DATA:        /* Buffer nodes are already initialized (e.g. Unicode operator) */        return;    case PARSEOP_DEFAULT_ARG:        break;    default:        AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, InitializerOp,            "Unknown buffer initializer opcode");        printf ("Unknown buffer initializer opcode [%s]\n",                        UtGetOpName (InitializerOp->Asl.ParseOpcode));        return;    }    /* Check if initializer list is longer than the buffer length */    if (BufferLengthOp->Asl.Value.Integer > BufferLength)    {        BufferLength = (UINT32) BufferLengthOp->Asl.Value.Integer;    }    if (!BufferLength)    {        /* No length AND no items -- issue notice */        AslError (ASL_REMARK, ASL_MSG_BUFFER_LENGTH, BufferLengthOp, NULL);        /* But go ahead and put the buffer length of zero into the AML */    }    /*     * Just set the buffer size node to be the buffer length, regardless     * of whether it was previously an integer or a default_arg placeholder     */    BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;    BufferLengthOp->Asl.AmlOpcode     = AML_DWORD_OP;    BufferLengthOp->Asl.Value.Integer = BufferLength;    (void) OpcSetOptimalIntegerSize (BufferLengthOp);    /* Remaining nodes are handled via the tree walk */}/******************************************************************************* * * FUNCTION:    OpnDoPackage * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the PACKAGE ASL keyword.  NOTE: *              can only be called after constants have been folded, to ensure *              that the PackageLength operand has been fully reduced. * ******************************************************************************/voidOpnDoPackage (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *InitializerOp;    ACPI_PARSE_OBJECT       *PackageLengthOp;    UINT32                  PackageLength = 0;    /* Opcode and package length first, followed by the initializer list */    PackageLengthOp = Op->Asl.Child;    InitializerOp = PackageLengthOp->Asl.Next;    /* Count the number of items in the initializer list */    if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)    {        /* The peer list contains the byte list (if any...) */        while (InitializerOp)        {            PackageLength++;            InitializerOp = InitializerOp->Asl.Next;        }    }    /* If package length is a constant, compare to the initializer list */    if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||        (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST))    {        if (PackageLengthOp->Asl.Value.Integer >= PackageLength)        {            /* Allow package to be longer than the initializer list */            PackageLength = (UINT32) PackageLengthOp->Asl.Value.Integer;        }        else        {            /*             * Initializer list is longer than the package length. This             * is an error as per the ACPI spec.             */            AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH,                PackageLengthOp->Asl.Next, NULL);        }    }    if (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)    {        /*         * This is the case if the PackageLength was left empty - Package()         * The package length becomes the length of the initializer list         */        Op->Asl.Child->Asl.ParseOpcode = PARSEOP_INTEGER;        Op->Asl.Child->Asl.Value.Integer = PackageLength;        /* Set the AML opcode */        (void) OpcSetOptimalIntegerSize (Op->Asl.Child);    }    /* If not a variable-length package, check for a zero package length */    if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER)      ||        (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST)   ||        (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG))    {        if (!PackageLength)        {

⌨️ 快捷键说明

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