#!/import/bw/tools/local/perl-5.8.0/bin/perl eval 'exec /import/bw/tools/local/perl-5.8.0/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell use strict; use warnings; use Midas; use Midas::Error; my $status = midas(@ARGV); if($status == M_ARGERR) { my $code = qq{ use Pod::Usage; pod2usage(-exitval => $status, -verbose => 1); }; eval $code; if($@) { print STDERR "Midas having trouble reporting argument error.\n"; exit -1; } } exit($status); ############################################################################## __END__ =head1 NAME midas - assembles diags (Midas Is a Diag ASsembler) =head1 SYNOPSIS midas [options] =head1 DESCRIPTION This program builds assembly diags. It is substantially more involved than simply assembling the diag because it also has to link the diag, program the MMU, and generate several output files. The diag specified on the command line will be built. Pretty much everything else is configurable. =head2 Options The following are the options you need to get started: =over 4 =item -h Display man page. =item -verbose [level] / -noverbose (abbreviated -v / -nov) Sets verbosity level (default=2). -noverbose (or -nov) is a synonym for -verbose 0, which means to generate no output in the absence of errors. The highest level of verbosity currently defined is 3. =item -version Return version information and exit. =item -format Display help on the diag format and exit. =item -config EfileE Use this file as the config file instead of the one that is distributed with Midas. =item -project EprojectE Use this project for project-specific configuration. Default is the environment variable $PROJECT. Legal values are BW and N2. =back =head2 Common Options The following are the commonly-used options: =over 4 =item -diag_root EpathE Use the specified path as a base for finding standard include files. Default is $DV_ROOT. =item -build_dir EpathE Path (absolute or relative to where command is invoked) to directory where temporary files are generated and the build is done. Default is './build'. =item -dest_dir EpathE Path (absolute or relative to where command is invoked) of where to store output files. Default is '.'. =item -find_root EdirE Interpret the diag on the command-line as the name of a diag to search for. It does a breadth-first search under the specified directory. The default behavior is not to do any search, but to assume that the specified diag is a full or relative path to the file. =item -find This is a shortcut for "-find_root Ediag_rootE/verif/diag". =item -mmu Emmu_typeE Generate programming for the specified MMU. Recognized options are "ultra2", "niagara", "niagara2", and "rock". Default is project-specific: "niagara" for Niagara-1 and "niagara2" for Niagara-2. =item -ttefmt Ette_formatE Specifies TTE format for those MMUs that require it. May be "sun4u" or "sun4v". Default is project-specific: "sun4v" for Niagara-1 and Niagara-2. =item -tsbtagfmt EtsbtagfmtE Specifies the format of the TSB tag. Legal values are 'tagaccess' and 'tagtarget'. Default is project-specific: 'tagaccess' for Niagara-1 and 'tagtarget' for Niagara-2. =item -force_build or -f Build the diag, even if it looks like we have the same input as before and the same args as before. =item -copy_products / -nocopy_products By default, the product files generated in the build directory are hard-linked to the destination directory. The reason they are hard-linked and not copied is for speed. If the hard link fails, it will fall back to a copy in case the directories are on different physical disks. If -copy_products is given, however, it will always do a copy, not a hard link. Default is project-specific: -nocopy_products for Niagara-1. =item -E Stop after the preprocessing stage. =item -cleanup / -nocleanup If -cleanup is enabled, then after a successful build, the build directory is erased if and only if the build directory was created by this invocation of midas. Default is project-specific: -cleanup for Niagara-1. =item -force_cleanup / -noforce_cleanup If -cleanup is enabled, but this invocation of midas did not create the build directory, -force_cleanup will remove the build directory anyway. Default is project-specific: -noforce_cleanup for Niagara-1. =item -DEsymbolE or -DEsymbolE=EvalueE Add a define to the preprocessing line. Option may be repeated. =item -stddef / -nostddef Include standard preprocessor definitions on command-line. -nostddef disables these. Default is -stddef, but no standard symbols are currently defined. =item -IEdirE Add a directory to the include path used by cpp and m4. Path should be absolute or relative to the directory where midas was invoked. Option may be repeated. =item -stdinc / -nostdinc With -stdinc, the standard include paths are used during preprocessing (both cpp and m4). -nostdinc disables these. Default is -stdinc. The standard include directories are the directory where midas was invoked, the build directory and Ediag_rootE/verif/diag/assembly/include (keep in mind that Ediag_rootE defaults to $DV_ROOT). =item -include_build / -noinclude_build This option is only meaningful with -nostdinc. If standard includes are switched off, -include_build will add the build directory back to the include path. Default is -noinclude_build. =item -include_start / -noinclude_start This option is only meaningful with -nostdinc. If standard includes are switched off, -include_start will add the start directory (the directory where midas was invoked) back to the include path. Default is -noinclude_start. =item -LEdirE Add a directory to the search path when looking for object files in a MIDAS_OBJ directive. Option may be repeated. =item -CEdirE Add a directory to the search path when looking for C source files in a MIDAS_CC directive. Option may be repeated. =item -pal_diag_args EargsE If the diag is run through pal, give these arguments to the pal diag. Option may be repeated. Note that these arguements are given to the diag, not pal itself. For instance, "midas -pal_args -abc mydiag.pal -pal_diag_args def -pal_diag_args ghi" will run the pal command-line "pal -abc mydiag.pal def ghi". =item -build_threads Enum_threadsE When doing work that can be done in parallel (such as assembling a bunch of files), use Enum_threadsE to do it. Default is project-specific: 3 for Niagara-1. =item -print_errors / -noprint_errors If -noprint_errors is defined, then generation of error messages is turned off. When used with -verbose 0, midas is completly silent. This is probalby only useful for the test harness (which is why the switch is there). =item -copy_products / -nocopy_products If this is set, then copy files from the build directory to the starting directory. With -nocopy_products, the files are hard linked instead. If it tries to create a hard link and fails, it will fall back to a copy. Default is -nocopy_products. =item -compress_image / -nocompress_image If -compress_image is enabled (as it is by default), then allow compressed mem.images to be generated. By default, all MMU-generated blocks are compressed when written to mem.image, meaning that instead of initializing unused sections to zero, they are simply uninitialized. The -nocompress_image is equivalent to explicitly putting a 'compressimage=0' in all attr_text/attr_data blocks. =item -env_zero / -noenv_zero When compressing blocks, if -env_zero is enabled the blocks will contain '// zero_image' directives to the environment. These directives are supported only by Niagara, and they are used to backdoor initialize large tracts of memory to zero. If -noenv_zero is used, then compression will simply leave the data uninitialized. =item -default_radix Edecimal|hexE Radix to assume for all parameters that do not explicitly start with '0x'. Default is 'decimal'. =item -gen_all_tsbs / -nogen_all_tsbs If -gen_all_tsbs is given, then all TSBs that are defined are written to the memory image. If -nogen_all_tsbs, then generate only the TSBs that are used. Default is project-specific: -nogen_all_tsbs for Niagara-1. =item -allow_tsb_conflicts / -noallow_tsb_conflicts If -allow_tsb_conflicts is enabled, then it is legal to have mutiple virtual address map to the same entry in a TSB. A linked-list will be created to hold all entries. With -noallow_tsb_conflicts (which is the default for N1), collisions in the TSB can only happen with the save VA but different contexts. Default is project-specific. =item -allow_empty_sections / -noallow_empty_sections If TEXT_VA is specified, then at least one attr_text block for the section has to be specified, and the same is true for DATA_VA and attr_data blocks. If -allow_empty_sections is specified, then midas will allow you to specify a TEXT_VA(DATA_VA) for the section, even if the section has no attr_text(attr_data) blocks. Of course, any text(data) in such a section will be ignored. Default is project-specific: -noallow_empty_sections for Niagara-1. =item -allow_duplicate_tags / -noallow_duplicate_tags When adding to a TSB link list, it is an error to add the same tag twice. -allow_duplicate_tags suspends the error check. Default is project-specific: -noallow_duplicate_tags for Niagara-1. =item -allow_illegal_page_sizes / -noallow_illegal_page_sizes If -allow_illegal_page_sizes, then tte_size attributes are not checked for valid values, though they are still checked against the width of the field. For instance, in the Niagara MMU, there are 3 page bits, so values can be specified 0-7. However, the only legal values for Niagara are 0, 1, 3, and 5, and unless -allow_illegal_page_sizes is in effect, setting page bits of 2, 4, 6, or 7 will cause an error. The default is project-specific: -noallow_illegal_page_sizes for Niagara-1. =item -allow_misalgined_tsb_base / -noallow_misaligned_tsb_base If -allow_misaligned_tsb_base is set, then a TSB base address need not be aligned with the TSB size. Real software will never do this, but I want it to be possible in diags. If an unalgined address is specified as the base and -allow_misaligned_tsb_base is specified, then midas will forcibly align the address. Default should be -noallow_misaligned_tsb_base for all projects. =item -errcode Eerror_codeE Prints a one-line description for the midas error code. Then exits with status 0. =back =head2 Configuring Commands midas runs several commands in the course of its operation. Several of these can be configured. The configurable commands are: pal, cpp, m4, gcc, as, and ld. Each configurable command has 3 associated options: =over 4 =item -std_EcommandE_args / -nostd_EcommandE_args When -std_EcommandE_args is enabled, the standard set of arguments for EcommandE are used. Default is -std_EcommandE_args =item -EcommandE_args EargsE Add EargsE to the argument list for the specified EcommandE. =item -EcommandE_cmd Ecustom_commandE Use Ecustom_commandE to run the specifed EcommandE instead of the standard version. =back =head3 Example For instance, to add -foo to the link line, use my_cpp to preprocess, and not use any standard assembler options, use: midas -ld_args -foo -cpp_cmd my_cpp -nostd_as_args mydiag.s =head2 Configuring Filenames There are several generated files, and they all have default names. You can configure the names of many of the files with the following option. =over 4 =item -file EtagE=EnameE Cause midas to name the file whose tag is EtagE to be named EnameE instead of the default. EnameE is treated as the name of a file in the build directory. =back The list of valid tags for the -file option are: =over 4 =item src Local version of the original source code for the diag. Default is 'diag.src'. =item s Assembly portion of diag before any preprocessing. Default is 'diag.s'. =item pl Perl portion of the diag. Deafult is 'diag.pl'. =item cpp Output of the C preprocessor. Deafult is 'diag.cpp'. =item m4 Output of the m4 preprocessor. Default is 'diag.m4'. =item ldscr Linker script. Default is 'diag.ls_scr'. =item exe Linked executable. Default is 'diag*.exe' where * is application name. =item image Verilog memory image. Default is 'mem.image'. =item events Events file. Default is 'diag.ev'. =item symtab Symbol table. Default is 'symbol.tbl'. =item goldfinger Specification to goldfinger on how to create memory image. Default is 'diag.goldfinger'. =item directives File to contain midas directives after section splitting. Default is 'diag.midas'. =item cmdfile File to stash the midas command-line. Default is '.midas_args'. =item oldcmdfile File to move old command-line options. Default is '.midas_args.old'. =item oldm4 File to stash m4 output of previous run. Default is '.midas.diag.m4.old'. =back =head2 Running Specific Phases The build process is broken into phases: setup, preprocess, sectioning, assemble, link, postprocess, copydest, cleanup. The default behavior is to run all phases. You can, however, restrict operation to a selected set of phases. =over 4 =item -start_phase Ephase_nameE Start with the named phase and run all subsequent phase. =item -phase Ephase_nameE Run the specified phase. If any -phase or -start_phase option exists, then by default all phases are off (except for the ones that -phase and -start_phase switch on). You can have multiple -phase options. =item -E This option (mentioned above, which runs the preprocessor only) is just a shortcut for "-phase setup -phase preprocess"). =back Keep in mind that running selected phases is caveat emptor. There are cases where phases expect data or files from previous phases. You may get lucky, but don't blame me if it doesn't work. =head2 Errors When midas is unable to run correctly it will exit with one of the folllowing error codes. =over 4 =item M_NOERROR (#0): No error. =item M_MISC (#1): Miscellaneous error =item M_CODE (#2): Error in midas code. =item M_DIR (#3): Directory error. =item M_FILE (#4): File error. =item M_CMDFAIL (#5): Command failed. =item M_SECSYNTAX (#6): Error in section syntax. =item M_ATTRSYNTAX (#7): Error in attr syntax. =item M_MISSINGPARAM (#8): Missing parameter. =item M_ILLEGALPARAM (#9): Illegal parameter. =item M_OUTOFRANGE (#10): Out of range. =item M_NOTNUM (#11): Not a number. =item M_VACOLLIDE (#12): VA collision. =item M_PACOLLIDE (#13): PA collision. =item M_DIRECTIVESYNTAX (#14): Directive syntax error. =item M_GENFAIL (#15): File generation failed. =item M_ASMFAIL (#16): Assembler failed. =item M_CCFAIL (#17): C compiler failed. =item M_LINKFAIL (#18): Linker failed. =item M_CPPFAIL (#19): CPP failed. =item M_M4FAIL (#20): M4 preprocessor failed. =item M_BADCONFIG (#21): Bad configuration. =item M_EVENTERR (#22): Event parsing error. =item M_ARGERR (#23): Argument error. =item M_NOSEC (#24): Undefined section. =item M_BADTSB (#25): Bad TSB. =item M_BADALIGN (#26): Bad Alignment. =item M_EMPTYSECTION (#27): Empty section. =item M_TSBSYNTAX (#28): Error in tsb syntax. =item M_APPSYNTAX (#29): Error in app syntax.' =item M_MEMORY (#30): Memory error. =item M_GOLDFINGERPARSE (#31): Goldfinger parse error. =item M_GOLDFINGERARG (#32): Goldfinger arg error. =item M_ELF (#33): ELF error. =item M_BADLABEL (#34): Bad label. =item M_GOLDFINGERMISC (#35): Uncategorized goldfinger error. =item M_GOLDFINGERVERSION (#36): Bad version of goldfinger =item M_DUPLICATETAG (#37): Duplicate tags in TSB =item M_BLOCKSYNTAX (#38): Error defining goldfinger BLOCK =back =head1 AUTHOR Jeff Gibson Ejeff.gibson@sun.comE =head1 SEE ALSO Midas(3), goldfinger(1).