static void LsWriteListingHexBytes ( UINT8 *Buffer, UINT32 Length, UINT32 FileId) { UINT32 i; /* Transfer all requested bytes */ for (i = 0; i < Length; i++) { /* Print line header when buffer is empty */ if (Gbl_CurrentHexColumn == 0) { if (Gbl_HasIncludeFiles) { FlPrintFile (FileId, "%*s", 10, " "); } switch (FileId) { case ASL_FILE_LISTING_OUTPUT: FlPrintFile (FileId, "%8.8X....", Gbl_CurrentAmlOffset); break; case ASL_FILE_ASM_SOURCE_OUTPUT: FlPrintFile (FileId, " db "); break; case ASL_FILE_C_SOURCE_OUTPUT: FlPrintFile (FileId, " "); break; default: /* No other types supported */ return; } } /* Transfer AML byte and update counts */ Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i]; Gbl_CurrentHexColumn++; Gbl_CurrentAmlOffset++; /* Flush buffer when it is full */ if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE) { LsFlushListingBuffer (FileId); } } }
void LsWriteSourceLines ( UINT32 ToLineNumber, UINT32 ToLogicalLineNumber, UINT32 FileId) { /* Nothing to do for these file types */ if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) { return; } Gbl_CurrentLine = ToLogicalLineNumber; /* Flush any hex bytes remaining from the last opcode */ LsFlushListingBuffer (FileId); /* Read lines and write them as long as we are not caught up */ if (Gbl_SourceLine < Gbl_CurrentLine) { /* * If we just completed writing some AML hex bytes, output a linefeed * to add some whitespace for readability. */ if (Gbl_HexBytesWereWritten) { FlPrintFile (FileId, "\n"); Gbl_HexBytesWereWritten = FALSE; } if (FileId == ASL_FILE_C_SOURCE_OUTPUT) { FlPrintFile (FileId, " /*\n"); } /* Write one line at a time until we have reached the target line # */ while ((Gbl_SourceLine < Gbl_CurrentLine) && LsWriteOneSourceLine (FileId)) { ; } if (FileId == ASL_FILE_C_SOURCE_OUTPUT) { FlPrintFile (FileId, " */"); } FlPrintFile (FileId, "\n"); } }
static void LsFinishSourceListing ( UINT32 FileId) { if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) || (FileId == ASL_FILE_C_INCLUDE_OUTPUT)) { return; } LsFlushListingBuffer (FileId); Gbl_CurrentAmlOffset = 0; /* Flush any remaining text in the source file */ if (FileId == ASL_FILE_C_SOURCE_OUTPUT) { FlPrintFile (FileId, " /*\n"); } while (LsWriteOneSourceLine (FileId)) { ; } if (FileId == ASL_FILE_C_SOURCE_OUTPUT) { FlPrintFile (FileId, "\n */\n };\n"); } FlPrintFile (FileId, "\n"); if (FileId == ASL_FILE_LISTING_OUTPUT) { /* Print a summary of the compile exceptions */ FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); AePrintErrorLog (FileId); FlPrintFile (FileId, "\n"); UtDisplaySummary (FileId); FlPrintFile (FileId, "\n"); } }
static void LsWriteNodeToListing ( ACPI_PARSE_OBJECT *Op, UINT32 FileId) { const ACPI_OPCODE_INFO *OpInfo; UINT32 OpClass; char *Pathname; UINT32 Length; UINT32 i; OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); OpClass = OpInfo->Class; /* TBD: clean this up with a single flag that says: * I start a named output block */ if (FileId == ASL_FILE_C_SOURCE_OUTPUT) { switch (Op->Asl.ParseOpcode) { case PARSEOP_DEFINITION_BLOCK: case PARSEOP_METHODCALL: case PARSEOP_INCLUDE: case PARSEOP_INCLUDE_END: case PARSEOP_DEFAULT_ARG: break; default: switch (OpClass) { case AML_CLASS_NAMED_OBJECT: switch (Op->Asl.AmlOpcode) { case AML_SCOPE_OP: case AML_ALIAS_OP: break; default: if (Op->Asl.ExternalName) { LsFlushListingBuffer (FileId); FlPrintFile (FileId, " };\n"); } break; } break; default: /* Don't care about other objects */ break; } break; } } /* These cases do not have a corresponding AML opcode */ switch (Op->Asl.ParseOpcode) { case PARSEOP_DEFINITION_BLOCK: /* Always start a definition block at AML offset zero */ Gbl_CurrentAmlOffset = 0; LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); /* Use the table Signature and TableId to build a unique name */ switch (FileId) { case ASL_FILE_ASM_SOURCE_OUTPUT: FlPrintFile (FileId, "%s_%s_Header \\\n", Gbl_TableSignature, Gbl_TableId); break; case ASL_FILE_C_SOURCE_OUTPUT: FlPrintFile (FileId, " unsigned char %s_%s_Header [] =\n {\n", Gbl_TableSignature, Gbl_TableId); break; case ASL_FILE_ASM_INCLUDE_OUTPUT: FlPrintFile (FileId, "extrn %s_%s_Header : byte\n", Gbl_TableSignature, Gbl_TableId); break; case ASL_FILE_C_INCLUDE_OUTPUT: FlPrintFile (FileId, "extern unsigned char %s_%s_Header [];\n", Gbl_TableSignature, Gbl_TableId); break; default: break; } return; case PARSEOP_METHODCALL: LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); return; case PARSEOP_INCLUDE: /* Flush everything up to and including the include source line */ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); /* Create a new listing node and push it */ LsPushNode (Op->Asl.Value.String); return; case PARSEOP_INCLUDE_END: /* Flush out the rest of the include file */ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); /* Pop off this listing node and go back to the parent file */ (void) LsPopNode (); return; case PARSEOP_DEFAULT_ARG: if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) { LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine, FileId); } return; default: /* All other opcodes have an AML opcode */ break; } /* * Otherwise, we look at the AML opcode because we can * switch on the opcode type, getting an entire class * at once */ switch (OpClass) { case AML_CLASS_ARGUMENT: /* argument type only */ case AML_CLASS_INTERNAL: break; case AML_CLASS_NAMED_OBJECT: switch (Op->Asl.AmlOpcode) { case AML_FIELD_OP: case AML_INDEX_FIELD_OP: case AML_BANK_FIELD_OP: /* * For fields, we want to dump all the AML after the * entire definition */ LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); break; case AML_NAME_OP: if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) { LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); } else { /* * For fields, we want to dump all the AML after the * entire definition */ LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId); } break; default: LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); break; } switch (Op->Asl.AmlOpcode) { case AML_SCOPE_OP: case AML_ALIAS_OP: /* These opcodes do not declare a new object, ignore them */ break; default: /* All other named object opcodes come here */ switch (FileId) { case ASL_FILE_ASM_SOURCE_OUTPUT: case ASL_FILE_C_SOURCE_OUTPUT: case ASL_FILE_ASM_INCLUDE_OUTPUT: case ASL_FILE_C_INCLUDE_OUTPUT: /* * For named objects, we will create a valid symbol so that the * AML code can be referenced from C or ASM */ if (Op->Asl.ExternalName) { /* Get the full pathname associated with this node */ Pathname = AcpiNsGetExternalPathname (Op->Asl.Node); Length = strlen (Pathname); if (Length >= 4) { /* Convert all dots in the path to underscores */ for (i = 0; i < Length; i++) { if (Pathname[i] == '.') { Pathname[i] = '_'; } } /* Create the appropriate symbol in the output file */ switch (FileId) { case ASL_FILE_ASM_SOURCE_OUTPUT: FlPrintFile (FileId, "%s_%s_%s \\\n", Gbl_TableSignature, Gbl_TableId, &Pathname[1]); break; case ASL_FILE_C_SOURCE_OUTPUT: FlPrintFile (FileId, " unsigned char %s_%s_%s [] =\n {\n", Gbl_TableSignature, Gbl_TableId, &Pathname[1]); break; case ASL_FILE_ASM_INCLUDE_OUTPUT: FlPrintFile (FileId, "extrn %s_%s_%s : byte\n", Gbl_TableSignature, Gbl_TableId, &Pathname[1]); break; case ASL_FILE_C_INCLUDE_OUTPUT: FlPrintFile (FileId, "extern unsigned char %s_%s_%s [];\n", Gbl_TableSignature, Gbl_TableId, &Pathname[1]); break; default: break; } } ACPI_FREE (Pathname); } break; default: /* Nothing to do for listing file */ break; } } break; case AML_CLASS_EXECUTE: case AML_CLASS_CREATE: default: if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) && (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)) { return; } LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); break; case AML_CLASS_UNKNOWN: break; } }