ACPI_STATUS FlOpenAmlOutputFile ( char *FilenamePrefix) { char *Filename; /* Output filename usually comes from the ASL itself */ Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; if (!Filename) { /* Create the output AML filename */ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } } /* Open the output AML file in binary mode */ FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); return (AE_OK); }
ACPI_STATUS FlOpenMiscOutputFiles ( char *FilenamePrefix) { char *Filename; /* Create/Open a map file if requested */ if (AslGbl_MapfileFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the hex file, text mode (closed at compiler exit) */ FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_MAP_OUTPUT); AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); } /* All done for disassembler */ if (AslGbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE) { return (AE_OK); } /* Create/Open a hex output file if asked */ if (AslGbl_HexOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the hex file, text mode */ FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_HEX_OUTPUT); AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); } /* Create/Open a debug output file if asked */ if (AslGbl_DebugFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the debug file as STDERR, text mode */ AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = freopen (Filename, "w+t", stderr); if (!AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) { /* * A problem with freopen is that on error, we no longer * have stderr and cannot emit normal error messages. * Emit error to stdout, close files, and exit. */ fprintf (stdout, "\nCould not open debug output file: %s\n\n", Filename); CmCleanupAndExit (); exit (1); } AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); } /* Create/Open a cross-reference output file if asked */ if (AslGbl_CrossReferenceOutput) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_XREF_OUTPUT); AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT); } /* Create/Open a listing output file if asked */ if (AslGbl_ListingFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the listing file, text mode */ FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); } /* Create the preprocessor output temp file if preprocessor enabled */ if (AslGbl_PreprocessFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); } /* * Create the "user" preprocessor output file if -li flag set. * Note, this file contains no embedded #line directives. */ if (AslGbl_PreprocessorOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t"); } /* All done for data table compiler */ if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) { return (AE_OK); } /* Create/Open a combined source output file */ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* * Open the source output file, binary mode (so that LF does not get * expanded to CR/LF on some systems, messing up our seek * calculations.) */ FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); /* // TBD: TEMP // AslCompilerin = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; */ /* Create/Open a assembly code source output file if asked */ if (AslGbl_AsmOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the assembly code source file, text mode */ FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); } /* Create/Open a C code source output file if asked */ if (AslGbl_C_OutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the C code source file, text mode */ FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); } /* Create/Open a C code source output file for the offset table if asked */ if (AslGbl_C_OffsetTableFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the C code source file, text mode */ FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); } /* Create/Open a assembly include output file if asked */ if (AslGbl_AsmIncludeOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the assembly include file, text mode */ FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); } /* Create/Open a C include output file if asked */ if (AslGbl_C_IncludeOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the C include file, text mode */ FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); } /* Create a namespace output file if asked */ if (AslGbl_NsOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the namespace file, text mode */ FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); } /* Create a debug file for the converter */ if (AcpiGbl_DebugAslConversion) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the converter debug file, text mode */ FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t"); AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT); AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT); AcpiGbl_ConvDebugFile = AslGbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle; } return (AE_OK); }
static void AdCreateTableHeader ( char *Filename, ACPI_TABLE_HEADER *Table) { char *NewFilename; UINT8 Checksum; /* * Print file header and dump original table header */ AdDisassemblerHeader (Filename); AcpiOsPrintf (" * Original Table Header:\n"); AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature); AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length); /* Print and validate the revision */ AcpiOsPrintf (" * Revision 0x%2.2X", Table->Revision); switch (Table->Revision) { case 0: AcpiOsPrintf (" **** Invalid Revision"); break; case 1: /* Revision of DSDT controls the ACPI integer width */ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT)) { AcpiOsPrintf (" **** 32-bit table (V1), no 64-bit math support"); } break; default: break; } AcpiOsPrintf ("\n"); /* Print and validate the table checksum */ AcpiOsPrintf (" * Checksum 0x%2.2X", Table->Checksum); Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); if (Checksum) { AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", (UINT8) (Table->Checksum - Checksum)); } AcpiOsPrintf ("\n"); AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId); AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId); AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision); AcpiOsPrintf (" * Compiler ID \"%.4s\"\n", Table->AslCompilerId); AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision); AcpiOsPrintf (" */\n"); /* Create AML output filename based on input filename */ if (Filename) { NewFilename = FlGenerateFilename (Filename, "aml"); } else { NewFilename = ACPI_ALLOCATE_ZEROED (9); strncat (NewFilename, Table->Signature, 4); strcat (NewFilename, ".aml"); } /* Open the ASL definition block */ AcpiOsPrintf ( "DefinitionBlock (\"%s\", \"%4.4s\", %hu, \"%.6s\", \"%.8s\", 0x%8.8X)\n", NewFilename, Table->Signature, Table->Revision, Table->OemId, Table->OemTableId, Table->OemRevision); ACPI_FREE (NewFilename); }
ACPI_STATUS AdAmlDisassemble ( BOOLEAN OutToFile, char *Filename, char *Prefix, char **OutFilename, BOOLEAN GetAllTables) { ACPI_STATUS Status; char *DisasmFilename = NULL; char *ExternalFilename; ACPI_EXTERNAL_FILE *ExternalFileList = AcpiGbl_ExternalFileList; FILE *File = NULL; ACPI_TABLE_HEADER *Table = NULL; ACPI_TABLE_HEADER *ExternalTable; ACPI_OWNER_ID OwnerId; /* * Input: AML code from either a file or via GetTables (memory or * registry) */ if (Filename) { Status = AcpiDbGetTableFromFile (Filename, &Table); if (ACPI_FAILURE (Status)) { return (Status); } /* * External filenames separated by commas * Example: iasl -e file1,file2,file3 -d xxx.aml */ while (ExternalFileList) { ExternalFilename = ExternalFileList->Path; if (!ACPI_STRCMP (ExternalFilename, Filename)) { /* Next external file */ ExternalFileList = ExternalFileList->Next; continue; } Status = AcpiDbGetTableFromFile (ExternalFilename, &ExternalTable); if (ACPI_FAILURE (Status)) { return (Status); } /* Load external table for symbol resolution */ if (ExternalTable) { Status = AdParseTable (ExternalTable, &OwnerId, TRUE, TRUE); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not parse external ACPI tables, %s\n", AcpiFormatException (Status)); return (Status); } /* * Load namespace from names created within control methods * Set owner id of nodes in external table */ AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId); AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); } /* Next external file */ ExternalFileList = ExternalFileList->Next; } /* Clear external list generated by Scope in external tables */ if (AcpiGbl_ExternalFileList) { AcpiDmClearExternalList (); } } else { Status = AdGetLocalTables (Filename, GetAllTables); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get ACPI tables, %s\n", AcpiFormatException (Status)); return (Status); } if (!AcpiGbl_DbOpt_disasm) { return (AE_OK); } /* Obtained the local tables, just disassemble the DSDT */ Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get DSDT, %s\n", AcpiFormatException (Status)); return (Status); } AcpiOsPrintf ("\nDisassembly of DSDT\n"); Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); } /* * Output: ASL code. Redirect to a file if requested */ if (OutToFile) { /* Create/Open a disassembly output file */ DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); if (!OutFilename) { fprintf (stderr, "Could not generate output filename\n"); Status = AE_ERROR; goto Cleanup; } File = fopen (DisasmFilename, "w+"); if (!File) { fprintf (stderr, "Could not open output file %s\n", DisasmFilename); Status = AE_ERROR; goto Cleanup; } AcpiOsRedirectOutput (File); } *OutFilename = DisasmFilename; if (!AcpiUtIsAmlTable (Table)) { AdDisassemblerHeader (Filename); AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", Table->Signature); AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " "FieldName : FieldValue\n */\n\n"); AcpiDmDumpDataTable (Table); fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", Table->Signature); fprintf (stderr, "Formatted output: %s - %u bytes\n", DisasmFilename, AdGetFileSize (File)); } else { /* Always parse the tables, only option is what to display */ Status = AdParseTable (Table, &OwnerId, TRUE, FALSE); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not parse ACPI tables, %s\n", AcpiFormatException (Status)); goto Cleanup; } if (AslCompilerdebug) { AcpiOsPrintf ("/**** Before second load\n"); NsSetupNamespaceListing (File); NsDisplayNamespace (); AcpiOsPrintf ("*****/\n"); } /* Load namespace from names created within control methods */ AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId); /* * Cross reference the namespace here, in order to * generate External() statements */ AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode, OwnerId); if (AslCompilerdebug) { AcpiDmDumpTree (AcpiGbl_ParseOpRoot); } /* Find possible calls to external control methods */ AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot); /* * If we found any external control methods, we must reparse * the entire tree with the new information (namely, the * number of arguments per method) */ if (AcpiDmGetExternalMethodCount ()) { fprintf (stderr, "\nFound %u external control methods, " "reparsing with new information\n", AcpiDmGetExternalMethodCount ()); /* Reparse, rebuild namespace. no need to xref namespace */ AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode); AcpiGbl_RootNode = NULL; AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; AcpiGbl_RootNodeStruct.Parent = NULL; AcpiGbl_RootNodeStruct.Child = NULL; AcpiGbl_RootNodeStruct.Peer = NULL; AcpiGbl_RootNodeStruct.Object = NULL; AcpiGbl_RootNodeStruct.Flags = 0; Status = AcpiNsRootInitialize (); AcpiDmAddExternalsToNamespace (); /* Parse the table again. No need to reload it, however */ Status = AdParseTable (Table, NULL, FALSE, FALSE); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not parse ACPI tables, %s\n", AcpiFormatException (Status)); goto Cleanup; } if (AslCompilerdebug) { AcpiOsPrintf ("/**** After second load and resource conversion\n"); NsSetupNamespaceListing (File); NsDisplayNamespace (); AcpiOsPrintf ("*****/\n"); AcpiDmDumpTree (AcpiGbl_ParseOpRoot); } } /* * Now that the namespace is finalized, we can perform namespace * transforms. * * 1) Convert fixed-offset references to resource descriptors * to symbolic references (Note: modifies namespace) */ AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode); /* Optional displays */ if (AcpiGbl_DbOpt_disasm) { /* This is the real disassembly */ AdDisplayTables (Filename, Table); /* Dump hex table if requested (-vt) */ AcpiDmDumpDataTable (Table); fprintf (stderr, "Disassembly completed\n"); fprintf (stderr, "ASL Output: %s - %u bytes\n", DisasmFilename, AdGetFileSize (File)); } } Cleanup: if (Table && !AcpiUtIsAmlTable (Table)) { ACPI_FREE (Table); } if (OutToFile && File) { if (AslCompilerdebug) /* Display final namespace, with transforms */ { NsSetupNamespaceListing (File); NsDisplayNamespace (); } fclose (File); AcpiOsRedirectOutput (stdout); } AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); AcpiGbl_ParseOpRoot = NULL; return (Status); }
static ACPI_STATUS DtCreateOneTemplate ( char *Signature, ACPI_DMTABLE_DATA *TableData) { char *DisasmFilename; FILE *File; ACPI_STATUS Status = AE_OK; ACPI_SIZE Actual; /* New file will have a .asl suffix */ DisasmFilename = FlGenerateFilename ( Signature, FILE_SUFFIX_ASL_CODE); if (!DisasmFilename) { fprintf (stderr, "Could not generate output filename\n"); return (AE_ERROR); } /* Probably should prompt to overwrite the file */ AcpiUtStrlwr (DisasmFilename); File = fopen (DisasmFilename, "w+"); if (!File) { fprintf (stderr, "Could not open output file %s\n", DisasmFilename); return (AE_ERROR); } /* Emit the common file header */ AcpiOsRedirectOutput (File); AcpiOsPrintf ("/*\n"); AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * ")); AcpiOsPrintf (" * Template for [%4.4s] ACPI Table\n", Signature); /* Dump the actual ACPI table */ if (TableData) { /* Normal case, tables that appear in AcpiDmTableData */ if (Gbl_VerboseTemplates) { AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]" " FieldName : HexFieldValue\n */\n\n"); } else { AcpiOsPrintf (" * Format: [ByteLength]" " FieldName : HexFieldValue\n */\n\n"); } AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TableData->Template)); } else { /* Special ACPI tables - DSDT, SSDT, FADT, RSDP */ AcpiOsPrintf (" */\n\n"); if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT)) { Actual = fwrite (TemplateDsdt, 1, sizeof (TemplateDsdt) -1, File); if (Actual != sizeof (TemplateDsdt) -1) { fprintf (stderr, "Could not write to output file %s\n", DisasmFilename); Status = AE_ERROR; goto Cleanup; } } else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) { Actual = fwrite (TemplateSsdt, 1, sizeof (TemplateSsdt) -1, File); if (Actual != sizeof (TemplateSsdt) -1) { fprintf (stderr, "Could not write to output file %s\n", DisasmFilename); Status = AE_ERROR; goto Cleanup; } } else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) /* FADT */ { AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TemplateFacs)); } else if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME)) { AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TemplateRsdp)); } else { fprintf (stderr, "%4.4s, Unrecognized ACPI table signature\n", Signature); Status = AE_ERROR; goto Cleanup; } } fprintf (stderr, "Created ACPI table template for [%4.4s], written to \"%s\"\n", Signature, DisasmFilename); Cleanup: fclose (File); AcpiOsRedirectOutput (stdout); ACPI_FREE (DisasmFilename); return (Status); }
ACPI_STATUS FlOpenMiscOutputFiles ( char *FilenamePrefix) { char *Filename; /* Create/Open a hex output file if asked */ if (Gbl_HexOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the hex file, text mode */ FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+"); AslCompilerSignon (ASL_FILE_HEX_OUTPUT); AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); } /* Create/Open a debug output file if asked */ if (Gbl_DebugFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the debug file as STDERR, text mode */ /* TBD: hide this behind a FlReopenFile function */ Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = freopen (Filename, "w+t", stderr); AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); } /* Create/Open a listing output file if asked */ if (Gbl_ListingFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the listing file, text mode */ FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+"); AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); } if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) { return (AE_OK); } /* Create/Open a combined source output file */ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* * Open the source output file, binary mode (so that LF does not get * expanded to CR/LF on some systems, messing up our seek * calculations.) */ FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); /* Create/Open a assembly code source output file if asked */ if (Gbl_AsmOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the assembly code source file, text mode */ FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+"); AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); } /* Create/Open a C code source output file if asked */ if (Gbl_C_OutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the C code source file, text mode */ FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+"); FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); } /* Create/Open a assembly include output file if asked */ if (Gbl_AsmIncludeOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the assembly include file, text mode */ FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+"); AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); } /* Create/Open a C include output file if asked */ if (Gbl_C_IncludeOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the C include file, text mode */ FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+"); FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); } /* Create a namespace output file if asked */ if (Gbl_NsOutputFlag) { Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); if (!Filename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); return (AE_ERROR); } /* Open the namespace file, text mode */ FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+"); AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); } return (AE_OK); }
ACPI_STATUS AdAmlDisassemble ( BOOLEAN OutToFile, char *Filename, char *Prefix, char **OutFilename) { ACPI_STATUS Status; char *DisasmFilename = NULL; FILE *File = NULL; ACPI_TABLE_HEADER *Table = NULL; ACPI_NEW_TABLE_DESC *ListHead = NULL; /* * Input: AML code from either a file or via GetTables (memory or * registry) */ if (Filename) { /* Get the list of all AML tables in the file */ Status = AcGetAllTablesFromFile (Filename, ACPI_GET_ALL_TABLES, &ListHead); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get ACPI tables from %s, %s\n", Filename, AcpiFormatException (Status)); return (Status); } /* Process any user-specified files for external objects */ Status = AdDoExternalFileList (Filename); if (ACPI_FAILURE (Status)) { return (Status); } } else { Status = AdGetLocalTables (); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get ACPI tables, %s\n", AcpiFormatException (Status)); return (Status); } if (!AcpiGbl_DmOpt_Disasm) { return (AE_OK); } /* Obtained the local tables, just disassemble the DSDT */ Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get DSDT, %s\n", AcpiFormatException (Status)); return (Status); } AcpiOsPrintf ("\nDisassembly of DSDT\n"); Prefix = AdGenerateFilename ("dsdt", Table->OemTableId); } /* * Output: ASL code. Redirect to a file if requested */ if (OutToFile) { /* Create/Open a disassembly output file */ DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY); if (!DisasmFilename) { fprintf (stderr, "Could not generate output filename\n"); Status = AE_ERROR; goto Cleanup; } File = fopen (DisasmFilename, "w+"); if (!File) { fprintf (stderr, "Could not open output file %s\n", DisasmFilename); Status = AE_ERROR; goto Cleanup; } AcpiOsRedirectOutput (File); } *OutFilename = DisasmFilename; /* Disassemble all AML tables within the file */ while (ListHead) { Status = AdDisassembleOneTable (ListHead->Table, File, Filename, DisasmFilename); if (ACPI_FAILURE (Status)) { break; } ListHead = ListHead->Next; } Cleanup: if (Table && !AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table)) { ACPI_FREE (Table); } if (File) { fclose (File); AcpiOsRedirectOutput (stdout); } AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot); AcpiGbl_ParseOpRoot = NULL; return (Status); }
static ACPI_STATUS DtCreateOneTemplate ( char *Signature, UINT32 TableCount, const ACPI_DMTABLE_DATA *TableData) { char *DisasmFilename; FILE *File; ACPI_STATUS Status = AE_OK; int Actual; UINT32 i; /* New file will have a .asl suffix */ DisasmFilename = FlGenerateFilename ( Signature, FILE_SUFFIX_ASL_CODE); if (!DisasmFilename) { fprintf (stderr, "Could not generate output filename\n"); return (AE_ERROR); } AcpiUtStrlwr (DisasmFilename); if (!UtQueryForOverwrite (DisasmFilename)) { return (AE_ERROR); } File = fopen (DisasmFilename, "w+"); if (!File) { fprintf (stderr, "Could not open output file %s\n", DisasmFilename); return (AE_ERROR); } /* Emit the common file header */ AcpiOsRedirectOutput (File); AcpiOsPrintf ("/*\n"); AcpiOsPrintf (ACPI_COMMON_HEADER ("iASL Compiler/Disassembler", " * ")); if (TableCount == 0) { AcpiOsPrintf (" * Template for [%4.4s] ACPI Table", Signature); } else { AcpiOsPrintf (" * Template for [%4.4s] and %u [SSDT] ACPI Tables", Signature, TableCount); } /* Dump the actual ACPI table */ if (TableData) { /* Normal case, tables that appear in AcpiDmTableData */ AcpiOsPrintf (" (static data table)\n"); if (AslGbl_VerboseTemplates) { AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength]" " FieldName : HexFieldValue\n */\n\n"); } else { AcpiOsPrintf (" * Format: [ByteLength]" " FieldName : HexFieldValue\n */\n"); } AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TableData->Template)); } else { /* Special ACPI tables - DSDT, SSDT, OSDT, FACS, RSDP */ AcpiOsPrintf (" (AML byte code table)\n"); AcpiOsPrintf (" */\n"); if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT)) { Actual = DtEmitDefinitionBlock ( File, DisasmFilename, ACPI_SIG_DSDT, 1); if (Actual < 0) { Status = AE_ERROR; goto Cleanup; } /* Emit any requested SSDTs into the same file */ for (i = 1; i <= TableCount; i++) { Actual = DtEmitDefinitionBlock ( File, DisasmFilename, ACPI_SIG_SSDT, i + 1); if (Actual < 0) { Status = AE_ERROR; goto Cleanup; } } } else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) { Actual = DtEmitDefinitionBlock ( File, DisasmFilename, ACPI_SIG_SSDT, 1); if (Actual < 0) { Status = AE_ERROR; goto Cleanup; } } else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_OSDT)) { Actual = DtEmitDefinitionBlock ( File, DisasmFilename, ACPI_SIG_OSDT, 1); if (Actual < 0) { Status = AE_ERROR; goto Cleanup; } } else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) { AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TemplateFacs)); } else if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME)) { AcpiDmDumpDataTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, TemplateRsdp)); } else { fprintf (stderr, "%4.4s, Unrecognized ACPI table signature\n", Signature); Status = AE_ERROR; goto Cleanup; } } if (TableCount == 0) { fprintf (stderr, "Created ACPI table template for [%4.4s], " "written to \"%s\"\n", Signature, DisasmFilename); } else { fprintf (stderr, "Created ACPI table templates for [%4.4s] " "and %u [SSDT], written to \"%s\"\n", Signature, TableCount, DisasmFilename); } Cleanup: fclose (File); AcpiOsRedirectOutput (stdout); return (Status); }
void MpEmitMappingInfo ( void) { char *NewFilename; /* Mapfile option enabled? */ if (!Gbl_MapfileFlag) { return; } /* Create/Open a map file */ NewFilename = FlGenerateFilename (Gbl_OutputFilenamePrefix, FILE_SUFFIX_MAP); if (!NewFilename) { AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 0, 0, 0, 0, NULL, NULL); } /* Open the hex file, text mode (closed at compiler exit) */ FlOpenFile (ASL_FILE_MAP_OUTPUT, NewFilename, "w+t"); AslCompilerSignon (ASL_FILE_MAP_OUTPUT); AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); if (!Gbl_GpioList) { FlPrintFile (ASL_FILE_MAP_OUTPUT, "\nNo GPIO devices found\n"); } if (!Gbl_SerialList) { FlPrintFile (ASL_FILE_MAP_OUTPUT, "\nNo Serial devices found (I2C/SPI/UART)\n"); } if (!Gbl_GpioList && !Gbl_SerialList) { return; } /* Headers */ FlPrintFile (ASL_FILE_MAP_OUTPUT, "\nResource Descriptor Connectivity Map\n"); FlPrintFile (ASL_FILE_MAP_OUTPUT, "------------------------------------\n"); /* Emit GPIO and Serial descriptors, then entire ACPI device tree */ MpEmitGpioInfo (); MpEmitSerialInfo (); MpEmitDeviceTree (); /* Clear the lists - no need to free memory here */ Gbl_SerialList = NULL; Gbl_GpioList = NULL; }