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

📄 aslcodegen.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    switch (Op->Asl.AmlOpcode)    {    case AML_UNASSIGNED_OPCODE:        /* These opcodes should not get here */        printf ("Found a node with an unassigned AML opcode\n");        fprintf (stderr, "Found a node with an unassigned AML opcode\n");        return;    case AML_INT_RESERVEDFIELD_OP:        /* Special opcodes for within a field definition */        Aml.Opcode = 0x00;        break;    case AML_INT_ACCESSFIELD_OP:        Aml.Opcode = 0x01;        break;    default:        Aml.Opcode = Op->Asl.AmlOpcode;        break;    }    switch (Aml.Opcode)    {    case AML_PACKAGE_LENGTH:        /* Value is the length to be encoded (Used in field definitions) */        PkgLen.Len = (UINT32) Op->Asl.Value.Integer;        break;    default:        /* Check for two-byte opcode */        if (Aml.Opcode > 0x00FF)        {            /* Write the high byte first */            CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1);        }        CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1);        /* Subtreelength doesn't include length of package length bytes */        PkgLen.Len = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes;        break;    }    /* Does this opcode have an associated "PackageLength" field? */    if (Op->Asl.CompileFlags & NODE_AML_PACKAGE)    {        if (Op->Asl.AmlPkgLenBytes == 1)        {            /* Simplest case -- no bytes to follow, just write the count */            CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1);        }        else if (Op->Asl.AmlPkgLenBytes != 0)        {            /*             * Encode the "bytes to follow" in the first byte, top two bits.             * The low-order nybble of the length is in the bottom 4 bits             */            PkgLenFirstByte = (UINT8)                (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) |                (PkgLen.LenBytes[0] & 0x0F));            CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1);            /*             * Shift the length over by the 4 bits we just stuffed             * in the first byte             */            PkgLen.Len >>= 4;            /* Now we can write the remaining bytes - either 1, 2, or 3 bytes */            for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++)            {                CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1);            }        }    }    switch (Aml.Opcode)    {    case AML_BYTE_OP:        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1);        break;    case AML_WORD_OP:        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2);       break;    case AML_DWORD_OP:        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4);        break;    case AML_QWORD_OP:        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8);        break;    case AML_STRING_OP:        CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);        break;    default:        /* All data opcodes must appear above */        break;    }}/******************************************************************************* * * FUNCTION:    CgWriteTableHeader * * PARAMETERS:  Op        - The DEFINITIONBLOCK node * * RETURN:      None * * DESCRIPTION: Write a table header corresponding to the DEFINITIONBLOCK * ******************************************************************************/static voidCgWriteTableHeader (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *Child;    /* AML filename */    Child = Op->Asl.Child;    /* Signature */    Child = Child->Asl.Next;    strncpy (TableHeader.Signature, Child->Asl.Value.String, 4);    /* Revision */    Child = Child->Asl.Next;    TableHeader.Revision = (UINT8) Child->Asl.Value.Integer;    /* Command-line Revision override */    if (Gbl_RevisionOverride)    {        TableHeader.Revision = Gbl_RevisionOverride;    }    /* OEMID */    Child = Child->Asl.Next;    strncpy (TableHeader.OemId, Child->Asl.Value.String, 6);    /* OEM TableID */    Child = Child->Asl.Next;    strncpy (TableHeader.OemTableId, Child->Asl.Value.String, 8);    /* OEM Revision */    Child = Child->Asl.Next;    TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;    /* Compiler ID */    strncpy (TableHeader.AslCompilerId, CompilerCreatorId, 4);    /* Compiler version */    TableHeader.AslCompilerRevision = CompilerCreatorRevision;    /* Table length. Checksum zero for now, will rewrite later */    TableHeader.Length   = Gbl_TableLength;    TableHeader.Checksum = 0;    CgLocalWriteAmlData (Op, &TableHeader, sizeof (ACPI_TABLE_HEADER));}/******************************************************************************* * * FUNCTION:    CgCloseTable * * PARAMETERS:  None. * * RETURN:      None. * * DESCRIPTION: Complete the ACPI table by calculating the checksum and *              re-writing the header. * ******************************************************************************/static voidCgCloseTable (    void){    signed char         Sum;    UINT8               FileByte;    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);    Sum = 0;    /* Calculate the checksum over the entire file */    while (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1) == AE_OK)    {        Sum = (signed char) (Sum + FileByte);    }    /* Re-write the table header with the checksum */    TableHeader.Checksum = (UINT8) (0 - Sum);    FlSeekFile (ASL_FILE_AML_OUTPUT, 0);    CgLocalWriteAmlData (NULL, &TableHeader, sizeof (ACPI_TABLE_HEADER));}/******************************************************************************* * * FUNCTION:    CgWriteNode * * PARAMETERS:  Op            - Parse node to write. * * RETURN:      None. * * DESCRIPTION: Write the AML that corresponds to a parse node. * ******************************************************************************/static voidCgWriteNode (    ACPI_PARSE_OBJECT       *Op){    ASL_RESOURCE_NODE       *Rnode;    /* Always check for DEFAULT_ARG and other "Noop" nodes */    /* TBD: this may not be the best place for this check */    if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)  ||        (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)     ||        (Op->Asl.ParseOpcode == PARSEOP_INCLUDE)      ||        (Op->Asl.ParseOpcode == PARSEOP_INCLUDE_END))    {        return;    }    Op->Asl.FinalAmlLength = 0;    switch (Op->Asl.AmlOpcode)    {    case AML_RAW_DATA_BYTE:    case AML_RAW_DATA_WORD:    case AML_RAW_DATA_DWORD:    case AML_RAW_DATA_QWORD:        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength);        return;    case AML_RAW_DATA_BUFFER:        CgLocalWriteAmlData (Op, Op->Asl.Value.Buffer, Op->Asl.AmlLength);        return;    case AML_RAW_DATA_CHAIN:        Rnode = ACPI_CAST_PTR (ASL_RESOURCE_NODE, Op->Asl.Value.Buffer);        while (Rnode)        {            CgLocalWriteAmlData (Op, Rnode->Buffer, Rnode->BufferLength);            Rnode = Rnode->Next;        }        return;    default:        /* Internal data opcodes must all appear above */        break;    }    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_DEFAULT_ARG:        break;    case PARSEOP_DEFINITIONBLOCK:        CgWriteTableHeader (Op);        break;    case PARSEOP_NAMESEG:    case PARSEOP_NAMESTRING:    case PARSEOP_METHODCALL:        CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);        break;    default:        CgWriteAmlOpcode (Op);        break;    }}

⌨️ 快捷键说明

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