ACPI_STATUS FlParseInputPathname ( char *InputFilename) { char *Substring; if (!InputFilename) { return (AE_OK); } /* Get the path to the input filename's directory */ AslGbl_DirectoryPath = strdup (InputFilename); if (!AslGbl_DirectoryPath) { return (AE_NO_MEMORY); } Substring = strrchr (AslGbl_DirectoryPath, '\\'); if (!Substring) { Substring = strrchr (AslGbl_DirectoryPath, '/'); if (!Substring) { Substring = strrchr (AslGbl_DirectoryPath, ':'); } } if (!Substring) { AslGbl_DirectoryPath[0] = 0; if (AslGbl_UseDefaultAmlFilename) { AslGbl_OutputFilenamePrefix = strdup (InputFilename); } } else { if (AslGbl_UseDefaultAmlFilename) { AslGbl_OutputFilenamePrefix = strdup (Substring + 1); } *(Substring+1) = 0; } UtConvertBackslashes (AslGbl_OutputFilenamePrefix); return (AE_OK); }
static void OpnDoDefinitionBlock ( ACPI_PARSE_OBJECT *Op) { ACPI_PARSE_OBJECT *Child; ACPI_SIZE Length; UINT32 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 = UtStringCacheCalloc (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; UtConvertBackslashes (Gbl_OutputFilenamePrefix); } 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 ((int) 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 = UtStringCacheCalloc (Length + 1); ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String); /* * Convert anything non-alphanumeric to an underscore. This * allows us to use the TableID to generate unique C symbols. */ for (i = 0; i < Length; i++) { if (!isalnum ((int) Gbl_TableId[i])) { Gbl_TableId[i] = '_'; } } } /* OEM Revision */ Child = Child->Asl.Next; Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; }
char * FlMergePathnames ( char *PrefixDir, char *FilePathname) { char *CommonPath; char *Pathname; char *LastElement; DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" "Include: FilePathname - \"%s\"\n", PrefixDir, FilePathname); /* * If there is no prefix directory or if the file pathname is absolute, * just return the original file pathname */ if (!PrefixDir || (!*PrefixDir) || (*FilePathname == '/') || (FilePathname[1] == ':')) { Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1); strcpy (Pathname, FilePathname); goto ConvertBackslashes; } /* Need a local copy of the prefix directory path */ CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1); strcpy (CommonPath, PrefixDir); /* * Walk forward through the file path, and simultaneously backward * through the prefix directory path until there are no more * relative references at the start of the file path. */ while (*FilePathname && (!strncmp (FilePathname, "../", 3))) { /* Remove last element of the prefix directory path */ LastElement = strrchr (CommonPath, '/'); if (!LastElement) { goto ConcatenatePaths; } *LastElement = 0; /* Terminate CommonPath string */ FilePathname += 3; /* Point to next path element */ } /* * Remove the last element of the prefix directory path (it is the same as * the first element of the file pathname), and build the final merged * pathname. */ LastElement = strrchr (CommonPath, '/'); if (LastElement) { *LastElement = 0; } /* Build the final merged pathname */ ConcatenatePaths: Pathname = UtLocalCacheCalloc ( strlen (CommonPath) + strlen (FilePathname) + 2); if (LastElement && *CommonPath) { strcpy (Pathname, CommonPath); strcat (Pathname, "/"); } strcat (Pathname, FilePathname); /* Convert all backslashes to normal slashes */ ConvertBackslashes: UtConvertBackslashes (Pathname); DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", Pathname); return (Pathname); }
int ACPI_SYSTEM_XFACE main ( int argc, char **argv) { ACPI_STATUS Status; int Index1; int Index2; int ReturnStatus = 0; /* * Big-endian machines are not currently supported. ACPI tables must * be little-endian, and support for big-endian machines needs to * be implemented. */ if (AcpiIsBigEndianMachine ()) { fprintf (stderr, "iASL is not currently supported on big-endian machines.\n"); return (-1); } AcpiOsInitialize (); ACPI_DEBUG_INITIALIZE (); /* For debug version only */ /* Initialize preprocessor and compiler before command line processing */ signal (SIGINT, AslSignalHandler); AcpiGbl_ExternalFileList = NULL; AcpiDbgLevel = 0; PrInitializePreprocessor (); AslInitialize (); Index1 = Index2 = AslCommandLine (argc, argv); /* Allocate the line buffer(s), must be after command line */ Gbl_LineBufferSize /= 2; UtExpandLineBuffers (); /* Perform global actions first/only */ if (Gbl_DisassembleAll) { while (argv[Index1]) { Status = AcpiDmAddToExternalFileList (argv[Index1]); if (ACPI_FAILURE (Status)) { return (-1); } Index1++; } } /* Process each pathname/filename in the list, with possible wildcards */ while (argv[Index2]) { /* * If -p not specified, we will use the input filename as the * output filename prefix */ if (Gbl_UseDefaultAmlFilename) { Gbl_OutputFilenamePrefix = argv[Index2]; UtConvertBackslashes (Gbl_OutputFilenamePrefix); } Status = AslDoOneFile (argv[Index2]); if (ACPI_FAILURE (Status)) { ReturnStatus = -1; goto CleanupAndExit; } Index2++; } CleanupAndExit: UtFreeLineBuffers (); AslParserCleanup (); if (AcpiGbl_ExternalFileList) { AcpiDmClearExternalFileList(); } return (ReturnStatus); }
ACPI_STATUS FlSplitInputPathname ( char *InputPath, char **OutDirectoryPath, char **OutFilename) { char *Substring; char *DirectoryPath; char *Filename; if (OutDirectoryPath) { *OutDirectoryPath = NULL; } if (!InputPath) { return (AE_OK); } /* Get the path to the input filename's directory */ DirectoryPath = FlStrdup (InputPath); if (!DirectoryPath) { return (AE_NO_MEMORY); } /* Convert backslashes to slashes in the entire path */ UtConvertBackslashes (DirectoryPath); /* Backup to last slash or colon */ Substring = strrchr (DirectoryPath, '/'); if (!Substring) { Substring = strrchr (DirectoryPath, ':'); } /* Extract the simple filename */ if (!Substring) { Filename = FlStrdup (DirectoryPath); DirectoryPath[0] = 0; } else { Filename = FlStrdup (Substring + 1); *(Substring+1) = 0; } if (!Filename) { return (AE_NO_MEMORY); } if (OutDirectoryPath) { *OutDirectoryPath = DirectoryPath; } if (OutFilename) { *OutFilename = Filename; return (AE_OK); } return (AE_OK); }
static int AslDoOptions ( int argc, char **argv, BOOLEAN IsResponseFile) { ACPI_STATUS Status; UINT32 j; /* Get the command line options */ while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j) { case '@': /* Begin a response file */ if (IsResponseFile) { printf ("Nested command files are not supported\n"); return (-1); } if (AslDoResponseFile (AcpiGbl_Optarg)) { return (-1); } break; case 'a': /* Debug options */ switch (AcpiGbl_Optarg[0]) { case 'r': Gbl_EnableReferenceTypechecking = TRUE; break; default: printf ("Unknown option: -a%s\n", AcpiGbl_Optarg); return (-1); } break; case 'b': /* Debug options */ switch (AcpiGbl_Optarg[0]) { case 'f': AslCompilerdebug = 1; /* same as yydebug */ DtParserdebug = 1; PrParserdebug = 1; Gbl_DebugFlag = TRUE; Gbl_KeepPreprocessorTempFile = TRUE; break; case 'p': /* Prune ASL parse tree */ /* Get the required argument */ if (AcpiGetoptArgument (argc, argv)) { return (-1); } Gbl_PruneParseTree = TRUE; Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; case 's': Gbl_DebugFlag = TRUE; break; case 't': /* Get the required argument */ if (AcpiGetoptArgument (argc, argv)) { return (-1); } Gbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; default: printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); return (-1); } break; case 'c': switch (AcpiGbl_Optarg[0]) { case 'r': Gbl_NoResourceChecking = TRUE; break; default: printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); return (-1); } break; case 'd': /* Disassembler */ switch (AcpiGbl_Optarg[0]) { case '^': Gbl_DoCompile = FALSE; break; case 'a': Gbl_DoCompile = FALSE; Gbl_DisassembleAll = TRUE; break; case 'b': /* Do not convert buffers to resource descriptors */ AcpiGbl_NoResourceDisassembly = TRUE; break; case 'c': break; case 'f': AcpiGbl_ForceAmlDisassembly = TRUE; break; case 'l': /* Use legacy ASL code (not ASL+) for disassembly */ Gbl_DoCompile = FALSE; AcpiGbl_CstyleDisassembly = FALSE; break; default: printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); return (-1); } Gbl_DisasmFlag = TRUE; break; case 'D': /* Define a symbol */ PrAddDefine (AcpiGbl_Optarg, NULL, TRUE); break; case 'e': /* External files for disassembler */ /* Get entire list of external files */ AcpiGbl_Optind--; argv[AcpiGbl_Optind] = AcpiGbl_Optarg; while (argv[AcpiGbl_Optind] && (argv[AcpiGbl_Optind][0] != '-')) { Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]); if (ACPI_FAILURE (Status)) { printf ("Could not add %s to external list\n", argv[AcpiGbl_Optind]); return (-1); } AcpiGbl_Optind++; } break; case 'f': switch (AcpiGbl_Optarg[0]) { case '^': /* Ignore errors and force creation of aml file */ Gbl_IgnoreErrors = TRUE; break; case 'e': /* Disassembler: Get external declaration file */ if (AcpiGetoptArgument (argc, argv)) { return (-1); } Gbl_ExternalRefFilename = AcpiGbl_Optarg; break; default: printf ("Unknown option: -f%s\n", AcpiGbl_Optarg); return (-1); } break; case 'G': Gbl_CompileGeneric = TRUE; break; case 'g': /* Get all ACPI tables */ printf ("-g option is deprecated, use acpidump utility instead\n"); exit (1); case 'h': switch (AcpiGbl_Optarg[0]) { case '^': Usage (); exit (0); case 'c': UtDisplayConstantOpcodes (); exit (0); case 'f': AslFilenameHelp (); exit (0); case 'r': /* reserved names */ ApDisplayReservedNames (); exit (0); case 't': UtDisplaySupportedTables (); exit (0); default: printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); return (-1); } case 'I': /* Add an include file search directory */ FlAddIncludeDirectory (AcpiGbl_Optarg); break; case 'i': /* Output AML as an include file */ switch (AcpiGbl_Optarg[0]) { case 'a': /* Produce assembly code include file */ Gbl_AsmIncludeOutputFlag = TRUE; break; case 'c': /* Produce C include file */ Gbl_C_IncludeOutputFlag = TRUE; break; case 'n': /* Compiler/Disassembler: Ignore the NOOP operator */ AcpiGbl_IgnoreNoopOperator = TRUE; break; default: printf ("Unknown option: -i%s\n", AcpiGbl_Optarg); return (-1); } break; case 'l': /* Listing files */ switch (AcpiGbl_Optarg[0]) { case '^': /* Produce listing file (Mixed source/aml) */ Gbl_ListingFlag = TRUE; AcpiGbl_DmOpt_Listing = TRUE; break; case 'i': /* Produce preprocessor output file */ Gbl_PreprocessorOutputFlag = TRUE; break; case 'm': /* Produce hardware map summary file */ Gbl_MapfileFlag = TRUE; break; case 'n': /* Produce namespace file */ Gbl_NsOutputFlag = TRUE; break; case 's': /* Produce combined source file */ Gbl_SourceOutputFlag = TRUE; break; case 'x': /* Produce cross-reference file */ Gbl_CrossReferenceOutput = TRUE; break; default: printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); return (-1); } break; case 'm': /* Set line buffer size */ Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024; if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE) { Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE; } printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize); break; case 'n': /* Parse only */ Gbl_ParseOnlyFlag = TRUE; break; case 'o': /* Control compiler AML optimizations */ switch (AcpiGbl_Optarg[0]) { case 'a': /* Disable all optimizations */ Gbl_FoldConstants = FALSE; Gbl_IntegerOptimizationFlag = FALSE; Gbl_ReferenceOptimizationFlag = FALSE; break; case 'c': /* Display compile time(s) */ Gbl_CompileTimesFlag = TRUE; break; case 'e': /* Disable External opcode generation */ Gbl_DoExternals = FALSE; break; case 'f': /* Disable folding on "normal" expressions */ Gbl_FoldConstants = FALSE; break; case 'i': /* Disable integer optimization to constants */ Gbl_IntegerOptimizationFlag = FALSE; break; case 'n': /* Disable named reference optimization */ Gbl_ReferenceOptimizationFlag = FALSE; break; case 't': /* Disable heavy typechecking */ Gbl_DoTypechecking = FALSE; break; default: printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); return (-1); } break; case 'P': /* Preprocessor options */ switch (AcpiGbl_Optarg[0]) { case '^': /* Proprocess only, emit (.i) file */ Gbl_PreprocessOnly = TRUE; Gbl_PreprocessorOutputFlag = TRUE; break; case 'n': /* Disable preprocessor */ Gbl_PreprocessFlag = FALSE; break; default: printf ("Unknown option: -P%s\n", AcpiGbl_Optarg); return (-1); } break; case 'p': /* Override default AML output filename */ Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; UtConvertBackslashes (Gbl_OutputFilenamePrefix); Gbl_UseDefaultAmlFilename = FALSE; break; case 'r': /* Override revision found in table header */ Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; case 's': /* Create AML in a source code file */ switch (AcpiGbl_Optarg[0]) { case 'a': /* Produce assembly code output file */ Gbl_AsmOutputFlag = TRUE; break; case 'c': /* Produce C hex output file */ Gbl_C_OutputFlag = TRUE; break; case 'o': /* Produce AML offset table in C */ Gbl_C_OffsetTableFlag = TRUE; break; default: printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); return (-1); } break; case 't': /* Produce hex table output file */ switch (AcpiGbl_Optarg[0]) { case 'a': Gbl_HexOutputFlag = HEX_OUTPUT_ASM; break; case 'c': Gbl_HexOutputFlag = HEX_OUTPUT_C; break; case 's': Gbl_HexOutputFlag = HEX_OUTPUT_ASL; break; default: printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); return (-1); } break; case 'T': /* Create a ACPI table template file */ Gbl_DoTemplates = TRUE; break; case 'v': /* Version and verbosity settings */ switch (AcpiGbl_Optarg[0]) { case '^': printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); exit (0); case 'a': /* Disable all error/warning/remark messages */ Gbl_NoErrors = TRUE; break; case 'e': /* Disable all warning/remark messages (errors only) */ Gbl_DisplayRemarks = FALSE; Gbl_DisplayWarnings = FALSE; break; case 'i': /* * Support for integrated development environment(s). * * 1) No compiler signon * 2) Send stderr messages to stdout * 3) Less verbose error messages (single line only for each) * 4) Error/warning messages are formatted appropriately to * be recognized by MS Visual Studio */ Gbl_VerboseErrors = FALSE; Gbl_DoSignon = FALSE; Gbl_Files[ASL_FILE_STDERR].Handle = stdout; break; case 'o': Gbl_DisplayOptimizations = TRUE; break; case 'r': Gbl_DisplayRemarks = FALSE; break; case 's': Gbl_DoSignon = FALSE; break; case 't': Gbl_VerboseTemplates = TRUE; break; case 'w': /* Get the required argument */ if (AcpiGetoptArgument (argc, argv)) { return (-1); } Status = AslDisableException (AcpiGbl_Optarg); if (ACPI_FAILURE (Status)) { return (-1); } break; default: printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); return (-1); } break; case 'w': /* Set warning levels */ switch (AcpiGbl_Optarg[0]) { case '1': Gbl_WarningLevel = ASL_WARNING; break; case '2': Gbl_WarningLevel = ASL_WARNING2; break; case '3': Gbl_WarningLevel = ASL_WARNING3; break; case 'e': Gbl_WarningsAsErrors = TRUE; break; default: printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); return (-1); } break; case 'x': /* Set debug print output level */ AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); break; case 'z': Gbl_UseOriginalCompilerId = TRUE; break; default: return (-1); } return (0); }
ACPI_STATUS AslDoOneFile ( char *Filename) { ACPI_STATUS Status; /* Re-initialize "some" compiler/preprocessor globals */ AslInitializeGlobals (); PrInitializeGlobals (); /* * Extract the directory path. This path is used for possible include * files and the optional AML filename embedded in the input file * DefinitionBlock declaration. */ Status = FlSplitInputPathname (Filename, &AslGbl_DirectoryPath, NULL); if (ACPI_FAILURE (Status)) { return (Status); } /* Take a copy of the input filename, convert any backslashes */ AslGbl_Files[ASL_FILE_INPUT].Filename = UtLocalCacheCalloc (strlen (Filename) + 1); strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename); UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); /* * AML Disassembly (Optional) */ if (AcpiGbl_DisasmFlag) { Status = AslDoDisassembly (); if (Status != AE_CTRL_CONTINUE) { return (Status); } } /* * Open the input file. Here, this should be an ASCII source file, * either an ASL file or a Data Table file */ Status = FlOpenInputFile (AslGbl_Files[ASL_FILE_INPUT].Filename); if (ACPI_FAILURE (Status)) { AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); } AslGbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); /* Determine input file type */ AslGbl_FileType = AslDetectSourceFileType (&AslGbl_Files[ASL_FILE_INPUT]); if (AslGbl_FileType == ASL_INPUT_TYPE_BINARY) { return (AE_ERROR); } /* * If -p not specified, we will use the input filename as the * output filename prefix */ if (AslGbl_UseDefaultAmlFilename) { AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; } /* Open the optional output files (listings, etc.) */ Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); if (ACPI_FAILURE (Status)) { AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); } /* * Compilation of ASL source versus DataTable source uses different * compiler subsystems */ switch (AslGbl_FileType) { /* * Data Table Compilation */ case ASL_INPUT_TYPE_ASCII_DATA: Status = DtDoCompile (); if (ACPI_FAILURE (Status)) { return (Status); } if (AslGbl_Signature) { AslGbl_Signature = NULL; } /* Check if any errors occurred during compile */ Status = AslCheckForErrorExit (); if (ACPI_FAILURE (Status)) { return (Status); } /* Cleanup (for next source file) and exit */ AeClearErrorLog (); PrTerminatePreprocessor (); return (Status); /* * ASL Compilation */ case ASL_INPUT_TYPE_ASCII_ASL: /* ACPICA subsystem initialization */ Status = AdInitialize (); if (ACPI_FAILURE (Status)) { return (Status); } (void) CmDoCompile (); (void) AcpiTerminate (); /* Check if any errors occurred during compile */ Status = AslCheckForErrorExit (); if (ACPI_FAILURE (Status)) { return (Status); } /* Cleanup (for next source file) and exit */ AeClearErrorLog (); PrTerminatePreprocessor (); /* ASL-to-ASL+ conversion - Perform immediate disassembly */ if (AslGbl_DoAslConversion) { /* * New input file is the output AML file from above. * New output is from the input ASL file from above. */ AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; CvDbgPrint ("OUTPUTFILENAME: %s\n", AslGbl_OutputFilenamePrefix); AslGbl_Files[ASL_FILE_INPUT].Filename = AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; AcpiGbl_DisasmFlag = TRUE; fprintf (stderr, "\n"); AslDoDisassembly (); /* delete the AML file. This AML file should never be utilized by AML interpreters. */ FlDeleteFile (ASL_FILE_AML_OUTPUT); } return (AE_OK); /* * Binary ACPI table was auto-detected, disassemble it */ case ASL_INPUT_TYPE_BINARY_ACPI_TABLE: /* We have what appears to be an ACPI table, disassemble it */ FlCloseFile (ASL_FILE_INPUT); AslGbl_DoCompile = FALSE; AcpiGbl_DisasmFlag = TRUE; Status = AslDoDisassembly (); return (Status); /* Unknown binary table */ case ASL_INPUT_TYPE_BINARY: AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); default: printf ("Unknown file type %X\n", AslGbl_FileType); return (AE_ERROR); } }
/* * fwts_iasl_disassemble_aml() * invoke iasl to disassemble AML */ int fwts_iasl_disassemble_aml( char *tables[], char *names[], const int table_entries, const int which, const bool use_externals, const char *outputfile) { pid_t pid; int status, i; FILE *fpout, *fperr; fflush(stdout); fflush(stderr); pid = fork(); switch (pid) { case -1: return -1; case 0: /* Child */ init_asl_core(); /* Setup ACPICA disassembler globals */ Gbl_WarningLevel = ASL_WARNING3; Gbl_IgnoreErrors = TRUE; Gbl_DisasmFlag = TRUE; Gbl_DoCompile = FALSE; Gbl_OutputFilenamePrefix = (char*)outputfile; Gbl_UseDefaultAmlFilename = FALSE; AcpiGbl_CstyleDisassembly = FALSE; AcpiGbl_DmOpt_Verbose = FALSE; UtConvertBackslashes (Gbl_OutputFilenamePrefix); /* Do we need to include external tables in? */ if (use_externals) { /* * Add in external SSDT files and NOT the one we want * disassemble */ for (i = 0; i < table_entries; i++) { if ((i != which) && (names[i] != NULL) && (tables[i] != NULL) && (!strcmp(names[i], "SSDT") || !strcmp(names[i], "DSDT"))) { ACPI_STATUS acpi_status; /* * Add in external tables that are NOT the table * we intent to disassemble */ acpi_status = AcpiDmAddToExternalFileList(tables[i]); if (ACPI_FAILURE(acpi_status)) { (void)unlink(outputfile); _exit(1); } } } } /* Throw away noisy errors */ if ((fpout = freopen("/dev/null", "w", stdout)) == NULL) { _exit(1); } if ((fperr = freopen("/dev/null", "w", stderr)) == NULL) { fclose(fpout); _exit(1); } /* ...and do the ACPICA disassambly... */ AslDoOneFile((char *)tables[which]); fclose(fperr); fclose(fpout); _exit(0); break; default: /* Parent */ (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); } return 0; }
/* * fwts_iasl_assemble_aml() * invoke iasl and assemble some source, stdout into * stdout_output, stderr into stderr_output */ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stderr_output) { int stdout_fds[2], stderr_fds[2]; int status, ret = 0; size_t stdout_len = 0, stderr_len = 0; pid_t pid; bool stdout_eof = false, stderr_eof = false; fflush(stdout); fflush(stderr); if (pipe(stdout_fds) < 0) return -1; if (pipe(stderr_fds) < 0) return -1; pid = fork(); switch (pid) { case -1: (void)close(stdout_fds[0]); (void)close(stdout_fds[1]); (void)close(stderr_fds[0]); (void)close(stderr_fds[1]); return -1; case 0: /* Child */ init_asl_core(); /* stdout to be redirected down the writer end of pipe */ if (stdout_fds[1] != STDOUT_FILENO) if (dup2(stdout_fds[1], STDOUT_FILENO) < 0) _exit(EXIT_FAILURE); if (stderr_fds[1] != STDERR_FILENO) if (dup2(stderr_fds[1], STDERR_FILENO) < 0) _exit(EXIT_FAILURE); /* Close reader end */ (void)close(stdout_fds[0]); (void)close(stderr_fds[0]); /* Setup ACPICA compiler globals */ Gbl_DisasmFlag = FALSE; Gbl_DoCompile = TRUE; Gbl_PreprocessFlag = TRUE; Gbl_UseDefaultAmlFilename = FALSE; Gbl_OutputFilenamePrefix = (char*)source; UtConvertBackslashes (Gbl_OutputFilenamePrefix); (void)AslDoOneFile((char *)source); /* * We need to flush buffered I/O on IASL stdout * before we exit */ (void)fflush(stdout); (void)fflush(stderr); _exit(0); break; default: /* Parent */ /* Close writer end */ (void)close(stdout_fds[1]); (void)close(stderr_fds[1]); while (!stdout_eof && !stderr_eof) { if (fwts_iasl_read_output(stdout_fds[0], stdout_output, &stdout_len, &stdout_eof) < 0) break; if (fwts_iasl_read_output(stderr_fds[0], stderr_output, &stderr_len, &stderr_eof) < 0) break; } (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); (void)close(stdout_fds[0]); (void)close(stderr_fds[0]); break; } return ret; }
ACPI_STATUS AslDoOneFile ( char *Filename) { ACPI_STATUS Status; /* Re-initialize "some" compiler/preprocessor globals */ AslInitializeGlobals (); PrInitializeGlobals (); /* * Extract the directory path. This path is used for possible include * files and the optional AML filename embedded in the input file * DefinitionBlock declaration. */ Status = FlSplitInputPathname (Filename, &Gbl_DirectoryPath, NULL); if (ACPI_FAILURE (Status)) { return (Status); } Gbl_Files[ASL_FILE_INPUT].Filename = Filename; UtConvertBackslashes (Filename); /* * AML Disassembly (Optional) */ if (Gbl_DisasmFlag) { Status = AslDoDisassembly (); if (Status != AE_CTRL_CONTINUE) { return (Status); } } /* * Open the input file. Here, this should be an ASCII source file, * either an ASL file or a Data Table file */ Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename); if (ACPI_FAILURE (Status)) { AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); } /* Determine input file type */ Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]); if (Gbl_FileType == ASL_INPUT_TYPE_BINARY) { return (AE_ERROR); } /* * If -p not specified, we will use the input filename as the * output filename prefix */ if (Gbl_UseDefaultAmlFilename) { Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename; } /* Open the optional output files (listings, etc.) */ Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix); if (ACPI_FAILURE (Status)) { AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); } /* * Compilation of ASL source versus DataTable source uses different * compiler subsystems */ switch (Gbl_FileType) { /* * Data Table Compilation */ case ASL_INPUT_TYPE_ASCII_DATA: Status = DtDoCompile (); if (ACPI_FAILURE (Status)) { return (Status); } if (Gbl_Signature) { ACPI_FREE (Gbl_Signature); Gbl_Signature = NULL; } /* Check if any errors occurred during compile */ Status = AslCheckForErrorExit (); if (ACPI_FAILURE (Status)) { return (Status); } /* Cleanup (for next source file) and exit */ AeClearErrorLog (); PrTerminatePreprocessor (); return (Status); /* * ASL Compilation */ case ASL_INPUT_TYPE_ASCII_ASL: /* ACPICA subsystem initialization */ Status = AdInitialize (); if (ACPI_FAILURE (Status)) { return (Status); } (void) CmDoCompile (); (void) AcpiTerminate (); /* Check if any errors occurred during compile */ Status = AslCheckForErrorExit (); if (ACPI_FAILURE (Status)) { return (Status); } /* Cleanup (for next source file) and exit */ AeClearErrorLog (); PrTerminatePreprocessor (); return (AE_OK); /* * Binary ACPI table was auto-detected, disassemble it */ case ASL_INPUT_TYPE_ACPI_TABLE: /* We have what appears to be an ACPI table, disassemble it */ FlCloseFile (ASL_FILE_INPUT); Gbl_DoCompile = FALSE; Gbl_DisasmFlag = TRUE; Status = AslDoDisassembly (); return (Status); /* Unknown binary table */ case ASL_INPUT_TYPE_BINARY: AePrintErrorLog (ASL_FILE_STDERR); return (AE_ERROR); default: printf ("Unknown file type %X\n", Gbl_FileType); return (AE_ERROR); } }