diff options
Diffstat (limited to 'source/compiler/aslcodegen.c')
| -rw-r--r-- | source/compiler/aslcodegen.c | 101 |
1 files changed, 88 insertions, 13 deletions
diff --git a/source/compiler/aslcodegen.c b/source/compiler/aslcodegen.c index 941525392e804..f970238bb1b5d 100644 --- a/source/compiler/aslcodegen.c +++ b/source/compiler/aslcodegen.c @@ -44,6 +44,7 @@ #include "aslcompiler.h" #include "aslcompiler.y.h" #include "amlcode.h" +#include "acconvert.h" #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("aslcodegen") @@ -57,12 +58,6 @@ CgAmlWriteWalk ( void *Context); static void -CgLocalWriteAmlData ( - ACPI_PARSE_OBJECT *Op, - void *Buffer, - UINT32 Length); - -static void CgWriteAmlOpcode ( ACPI_PARSE_OBJECT *Op); @@ -206,7 +201,7 @@ CgAmlWriteWalk ( * ******************************************************************************/ -static void +void CgLocalWriteAmlData ( ACPI_PARSE_OBJECT *Op, void *Buffer, @@ -261,6 +256,15 @@ CgWriteAmlOpcode ( return; } + /* + * Before printing the bytecode, generate comment byte codes + * associated with this node. + */ + if (Gbl_CaptureComments) + { + CgWriteAmlComment(Op); + } + switch (Op->Asl.AmlOpcode) { case AML_UNASSIGNED_OPCODE: @@ -416,6 +420,8 @@ CgWriteTableHeader ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *Child; + UINT32 CommentLength; + ACPI_COMMENT_NODE *Current; /* AML filename */ @@ -425,6 +431,21 @@ CgWriteTableHeader ( /* Signature */ Child = Child->Asl.Next; + + /* + * For ASL-/ASL+ converter: replace the table signature with + * "XXXX" and save the original table signature. This results in an AML + * file with the signature "XXXX". The converter should remove this AML + * file. In the event where this AML file does not get deleted, the + * "XXXX" table signature prevents this AML file from running on the AML + * interpreter. + */ + if (Gbl_CaptureComments) + { + strncpy(AcpiGbl_TableSig, Child->Asl.Value.String, 4); + Child->Asl.Value.String = ACPI_SIG_XXXX; + } + strncpy (TableHeader.Signature, Child->Asl.Value.String, 4); /* Revision */ @@ -466,6 +487,50 @@ CgWriteTableHeader ( TableHeader.Length = sizeof (ACPI_TABLE_HEADER) + Op->Asl.AmlSubtreeLength; + + /* Calculate the comment lengths for this definition block parseOp */ + + if (Gbl_CaptureComments) + { + CvDbgPrint ("Calculating comment lengths for %s in write header\n", + Op->Asl.ParseOpName); + + /* + * Take the filename without extensions, add 3 for the new extension + * and another 3 for the a908 bytecode and null terminator. + */ + TableHeader.Length += strrchr (Gbl_ParseTreeRoot->Asl.Filename, '.') + - Gbl_ParseTreeRoot->Asl.Filename + 1 + 3 + 3; + Op->Asl.AmlSubtreeLength += + strlen (Gbl_ParseTreeRoot->Asl.Filename) + 3; + CvDbgPrint (" Length: %lu\n", + strlen (Gbl_ParseTreeRoot->Asl.Filename) + 3); + + if (Op->Asl.CommentList) + { + Current = Op->Asl.CommentList; + while (Current) + { + CommentLength = strlen (Current->Comment)+3; + CvDbgPrint ("Length of standard comment): %d\n", CommentLength); + CvDbgPrint (" Comment string: %s\n\n", Current->Comment); + TableHeader.Length += CommentLength; + Op->Asl.AmlSubtreeLength += CommentLength; + Current = Current->Next; + CvDbgPrint (" Length: %u\n", CommentLength); + } + } + if (Op->Asl.CloseBraceComment) + { + CommentLength = strlen (Op->Asl.CloseBraceComment)+3; + CvDbgPrint ("Length of inline comment +3: %d\n", CommentLength); + CvDbgPrint (" Comment string: %s\n\n", Op->Asl.CloseBraceComment); + TableHeader.Length += CommentLength; + Op->Asl.AmlSubtreeLength += CommentLength; + CvDbgPrint (" Length: %u\n", CommentLength); + } + } + TableHeader.Checksum = 0; Op->Asl.FinalAmlOffset = ftell (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); @@ -492,13 +557,13 @@ CgWriteTableHeader ( static void CgUpdateHeader ( - ACPI_PARSE_OBJECT *Op) + ACPI_PARSE_OBJECT *Op) { - signed char Sum; - UINT32 i; - UINT32 Length; - UINT8 FileByte; - UINT8 Checksum; + signed char Sum; + UINT32 i; + UINT32 Length; + UINT8 FileByte; + UINT8 Checksum; /* Calculate the checksum over the entire definition block */ @@ -580,6 +645,12 @@ CgWriteNode ( ASL_RESOURCE_NODE *Rnode; + /* Write all comments here. */ + if (Gbl_CaptureComments) + { + CgWriteAmlComment(Op); + } + /* Always check for DEFAULT_ARG and other "Noop" nodes */ /* TBD: this may not be the best place for this check */ @@ -641,6 +712,10 @@ CgWriteNode ( case PARSEOP_DEFINITION_BLOCK: CgWriteTableHeader (Op); + if (Gbl_CaptureComments) + { + CgWriteAmlDefBlockComment (Op); + } break; case PARSEOP_NAMESEG: |
