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

📄 asloperands.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
            /* No length AND no initializer list -- issue a remark */            AslError (ASL_REMARK, ASL_MSG_PACKAGE_LENGTH,                PackageLengthOp, NULL);            /* But go ahead and put the buffer length of zero into the AML */        }    }    /*     * If the PackageLength is a constant <= 255, we can change the     * AML opcode from VarPackage to a simple (ACPI 1.0) Package opcode.     */    if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) &&        (Op->Asl.Child->Asl.Value.Integer <= 255))    {        Op->Asl.AmlOpcode = AML_PACKAGE_OP;        Op->Asl.ParseOpcode = PARSEOP_PACKAGE;        /*         * Just set the package size node to be the package length, regardless         * of whether it was previously an integer or a default_arg placeholder         */        PackageLengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;        PackageLengthOp->Asl.AmlLength = 1;        PackageLengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;        PackageLengthOp->Asl.Value.Integer = PackageLength;    }    /* Remaining nodes are handled via the tree walk */}/******************************************************************************* * * FUNCTION:    OpnDoLoadTable * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the LOADTABLE ASL keyword. * ******************************************************************************/static voidOpnDoLoadTable (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Next;    /* Opcode is parent node */    /* First child is the table signature */    Next = Op->Asl.Child;    /* Second child is the OEM ID*/    Next = Next->Asl.Next;    /* Third child is the OEM table ID */    Next = Next->Asl.Next;    /* Fourth child is the RootPath string */    Next = Next->Asl.Next;    if (Next->Asl.ParseOpcode == PARSEOP_ZERO)    {        Next->Asl.ParseOpcode    = PARSEOP_STRING_LITERAL;        Next->Asl.Value.String   = "\\";        Next->Asl.AmlLength      = 2;        OpcGenerateAmlOpcode (Next);    }#ifdef ASL_FUTURE_IMPLEMENTATION    /* TBD: NOT IMPLEMENTED */    /* Fifth child is the [optional] ParameterPathString */    /* Sixth child is the [optional] ParameterData */    Next = Next->Asl.Next;    if (Next->Asl.ParseOpcode == DEFAULT_ARG)    {        Next->Asl.AmlLength = 1;        Next->Asl.ParseOpcode = ZERO;        OpcGenerateAmlOpcode (Next);    }    Next = Next->Asl.Next;    if (Next->Asl.ParseOpcode == DEFAULT_ARG)    {        Next->Asl.AmlLength = 1;        Next->Asl.ParseOpcode = ZERO;        OpcGenerateAmlOpcode (Next);    }#endif}/******************************************************************************* * * FUNCTION:    OpnDoDefinitionBlock * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Construct the AML operands for the DEFINITIONBLOCK ASL keyword * ******************************************************************************/static voidOpnDoDefinitionBlock (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Child;    ACPI_SIZE               Length;    ACPI_NATIVE_UINT        i;    char                    *Filename;    /*     * These nodes get stuffed into the table header.  They are special     * cased when the table is written to the output file.     *     * Mark all of these nodes as non-usable so they won't get output     * as AML opcodes!     */    /* Get AML filename. Use it if non-null */    Child = Op->Asl.Child;    if (Child->Asl.Value.Buffer  &&        *Child->Asl.Value.Buffer &&        (Gbl_UseDefaultAmlFilename))    {        /*         * We will use the AML filename that is embedded in the source file         * for the output filename.         */        Filename = ACPI_ALLOCATE (strlen (Gbl_DirectoryPath) +                    strlen ((char *) Child->Asl.Value.Buffer) + 1);        /* Prepend the current directory path */        strcpy (Filename, Gbl_DirectoryPath);        strcat (Filename, (char *) Child->Asl.Value.Buffer);        Gbl_OutputFilenamePrefix = Filename;    }    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;    /* Signature */    Child = Child->Asl.Next;    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;    if (Child->Asl.Value.String)    {        Gbl_TableSignature = Child->Asl.Value.String;        if (ACPI_STRLEN (Gbl_TableSignature) != 4)        {            AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,                "Length not exactly 4");        }        for (i = 0; i < 4; i++)        {            if (!isalnum (Gbl_TableSignature[i]))            {                AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,                    "Contains non-alphanumeric characters");            }        }    }    /* Revision */    Child = Child->Asl.Next;    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;    /*     * We used the revision to set the integer width earlier     */    /* OEMID */    Child = Child->Asl.Next;    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;    /* OEM TableID */    Child = Child->Asl.Next;    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;    if (Child->Asl.Value.String)    {        Length = ACPI_STRLEN (Child->Asl.Value.String);        Gbl_TableId = AcpiOsAllocate (Length + 1);        ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);        for (i = 0; i < Length; i++)        {            if (Gbl_TableId[i] == ' ')            {                Gbl_TableId[i] = 0;                break;            }        }    }    /* OEM Revision */    Child = Child->Asl.Next;    Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;}/******************************************************************************* * * FUNCTION:    UtGetArg * * PARAMETERS:  Op              - Get an argument for this op *              Argn            - Nth argument to get * * RETURN:      The argument (as an Op object).  NULL if argument does not exist * * DESCRIPTION: Get the specified op's argument (peer) * ******************************************************************************/ACPI_PARSE_OBJECT *UtGetArg (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Argn){    ACPI_PARSE_OBJECT       *Arg = NULL;    /* Get the requested argument object */    Arg = Op->Asl.Child;    while (Arg && Argn)    {        Argn--;        Arg = Arg->Asl.Next;    }    return (Arg);}/******************************************************************************* * * FUNCTION:    OpnAttachNameToNode * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: For the named ASL/AML operators, get the actual name from the *              argument list and attach it to the parent node so that we *              can get to it quickly later. * ******************************************************************************/static voidOpnAttachNameToNode (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Child = NULL;    if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)    {        Child = UtGetArg (Op, 0);    }    else switch (Op->Asl.AmlOpcode)    {    case AML_DATA_REGION_OP:    case AML_DEVICE_OP:    case AML_EVENT_OP:    case AML_METHOD_OP:    case AML_MUTEX_OP:    case AML_REGION_OP:    case AML_POWER_RES_OP:    case AML_PROCESSOR_OP:    case AML_THERMAL_ZONE_OP:    case AML_NAME_OP:    case AML_SCOPE_OP:        Child = UtGetArg (Op, 0);        break;    case AML_ALIAS_OP:        Child = UtGetArg (Op, 1);        break;    case AML_CREATE_BIT_FIELD_OP:    case AML_CREATE_BYTE_FIELD_OP:    case AML_CREATE_WORD_FIELD_OP:    case AML_CREATE_DWORD_FIELD_OP:    case AML_CREATE_QWORD_FIELD_OP:        Child = UtGetArg (Op, 2);        break;    case AML_CREATE_FIELD_OP:        Child = UtGetArg (Op, 3);        break;    case AML_BANK_FIELD_OP:    case AML_INDEX_FIELD_OP:    case AML_FIELD_OP:        return;    default:        return;    }    if (Child)    {        UtAttachNamepathToOwner (Op, Child);    }}/******************************************************************************* * * FUNCTION:    OpnGenerateAmlOperands * * PARAMETERS:  Op        - The parent parse node * * RETURN:      None * * DESCRIPTION: Prepare nodes to be output as AML data and operands.  The more *              complex AML opcodes require processing of the child nodes *              (arguments/operands). * ******************************************************************************/voidOpnGenerateAmlOperands (    ACPI_PARSE_OBJECT       *Op){    if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)    {        return;    }    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_DEFINITIONBLOCK:        OpnDoDefinitionBlock (Op);        break;    case PARSEOP_METHOD:        OpnDoMethod (Op);        break;    case PARSEOP_MUTEX:        OpnDoMutex (Op);        break;    case PARSEOP_FIELD:        OpnDoField (Op);        break;    case PARSEOP_INDEXFIELD:        OpnDoIndexField (Op);        break;    case PARSEOP_BANKFIELD:        OpnDoBankField (Op);        break;    case PARSEOP_BUFFER:        OpnDoBuffer (Op);        break;    case PARSEOP_LOADTABLE:        OpnDoLoadTable (Op);        break;    case PARSEOP_OPERATIONREGION:        OpnDoRegion (Op);        break;    case PARSEOP_RESOURCETEMPLATE:        RsDoResourceTemplate (Op);        break;    case PARSEOP_NAMESEG:    case PARSEOP_NAMESTRING:    case PARSEOP_METHODCALL:    case PARSEOP_STRING_LITERAL:        break;    default:        break;    }    /* TBD: move */    OpnAttachNameToNode (Op);}

⌨️ 快捷键说明

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