diff options
Diffstat (limited to 'src/usr/errl/parser')
| -rwxr-xr-x | src/usr/errl/parser/genErrlParsers.pl | 898 | ||||
| -rw-r--r-- | src/usr/errl/parser/makefile | 56 | ||||
| -rwxr-xr-x | src/usr/errl/parser/scanforsrcs.pl | 781 | 
3 files changed, 926 insertions, 809 deletions
| diff --git a/src/usr/errl/parser/genErrlParsers.pl b/src/usr/errl/parser/genErrlParsers.pl new file mode 100755 index 000000000..33ddabbdc --- /dev/null +++ b/src/usr/errl/parser/genErrlParsers.pl @@ -0,0 +1,898 @@ +#!/usr/bin/perl +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/usr/errl/parser/genErrlParsers.pl $ +# +# IBM CONFIDENTIAL +# +# COPYRIGHT International Business Machines Corp. 2013 +# +# p1 +# +# Object Code Only (OCO) source materials +# Licensed Internal Code Source Materials +# IBM HostBoot Licensed Internal Code +# +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office. +# +# Origin: 30 +# +# IBM_PROLOG_END_TAG + +# Purpose: Generates files needed to parse SRC and User Detail Data from +#   Hostboot error logs. The files are delivered to the FSP and built there +# +# It scans the hostboot source code for the doxygen like error log tags and +# generates a C file for each component containing a function called by the FSP +# errl tool to parse the error log SRC, for example: +# - hbfwSrcParse1.C (For parsing errlogs generated by comp-id 0x01) +# - hbfwSrcParse2.C +# - hbfwSrcParse3.C +# It generates a file that contains IDs needed by the Hostboot User Detail Data +# parsers +# - hbfwUdIds.H  +# It generates a makefile that builds the Hostboot SRC/UserDetailData parsers +# - makefile + +use strict; +use Time::localtime; + +#------------------------------------------------------------------------------ +# Process Arguments +#------------------------------------------------------------------------------ +my $DEBUG = 0; +my $base = "."; +my $outputDir = "."; + +while( $ARGV = shift ) +{ +    if( $ARGV =~ m/-b/ ) +    { +        $base = shift; +    } +    elsif( $ARGV =~ m/-o/i ) +    { +        $outputDir = shift; +    } +    elsif( $ARGV =~ m/-d/i ) +    { +        $DEBUG = 1; +    } +    else +    { +        usage(); +    } +} + +#------------------------------------------------------------------------------ +# Global variables +#------------------------------------------------------------------------------ +my $compIdFile = $base."/src/include/usr/hbotcompid.H"; +my $compPath = $base."/src/usr"; +my $compIncPath = $base."/src/include/usr"; +my $genFilesPath = $base."/obj/genfiles"; + +#------------------------------------------------------------------------------ +# Call subroutines to populate the following arrays: +# - @reasonCodeFiles   (The list of files to parse through for reason codes) +# - @filesToParse      (The list of files to parse through for SRC tags) +# - @pluginDirsToParse (the list of plugin directories containing User Detail +#                       Data parsers) +#------------------------------------------------------------------------------ +my @reasonCodeFiles; +my @filesToParse; +my @pluginDirsToParse; +getReasonCodeFiles($compIncPath); +getFilesToParse($compPath); +getFilesToParse($compIncPath); +getFilesToParse($genFilesPath); +getPluginDirsToParse($compPath); + +if ($DEBUG) +{ +    print("---> ReasonCode files to process\n"); +    foreach my $file(@reasonCodeFiles) +    { +        print("RC File: $file\n"); +    } +} + +if ($DEBUG) +{ +    print("---> Files to parse for error log tags\n"); +    foreach my $file(@filesToParse) +    { +        print("File to Parse: $file\n"); +    } +} + +if ($DEBUG) +{ +    print("---> Directories to parse for user detail data\n"); +    foreach my $dir(@pluginDirsToParse) +    { +        print("Plugin Directory to Parse: $dir\n"); +    } +} + +#------------------------------------------------------------------------------ +# Process the compIdFile, recording all of the component ID values +#------------------------------------------------------------------------------ +my %compIdToValueHash; + +open(COMP_ID_FILE, $compIdFile) or die("Cannot open: $compIdFile: $!"); + +while (my $line = <COMP_ID_FILE>) +{ +    # An example of the component ID line is: +    # const compId_t DEVFW_COMP_ID = 0x0200; +    if ($line =~ /^const compId_t (\w+) = 0x([\dA-Fa-f]+)00/) +    { +        my $compId = $1; +        my $compValue = $2; + +        # Strip off any leading zeroes from the component value +        $compValue =~ s/^0//g; + +        $compIdToValueHash{$compId} = $compValue; +    } +} + +close(COMP_ID_FILE); + +if ($DEBUG) +{ +    print("---> Component ID values\n"); +    foreach my $key (keys %compIdToValueHash) +    { +        print ("CompId: $key = $compIdToValueHash{$key},\n"); +    } +} + +#------------------------------------------------------------------------------ +# Process the reasonCodeFiles, recording all of the module ids, reason codes +# and user detail data sections in hashes: The module ids and reason codes +# can be duplicated across components and so the namespace is also stored. +# Example hashes: +# +# %modIdToValueHash = ( +#     'PNOR'   => { 'MOD_PNORDD_ERASEFLASH'     => '1A', +#                   'MOD_PNORDD_READFLASH'      => '12'}, +#     'IBSCOM' => { 'IBSCOM_GET_TARG_VIRT_ADDR' => '03', +#                   'IBSCOM_SANITY_CHECK'       => '02'} +# ); +# +# %rcToValueHash = ( +#     'PNOR'   => { 'RC_UNSUPPORTED_OPERATION'  => '0607', +#                   'RC_STARTUP_FAIL'           => '0605'}, +#     'IBSCOM' => { 'IBSCOM_INVALID_CONFIG'     => '1C03', +#                   'IBSCOM_INVALID_OP_TYPE'    => '1C02'} +# ); +# +# %udIdToValueHash = ( +#     'HWPF_UDT_HWP_RCVALUE' => '0x01', +#     'ERRL_UDT_CALLOUT'     => '0x07' +# ); +#------------------------------------------------------------------------------ +my %modIdToValueHash; +my %rcToValueHash; +my %udIdToValueHash; + +foreach my $file (@reasonCodeFiles) +{ +    open(RC_FILE, $file) or die("Cannot open: $file: $!"); +    my $namespace = "NO_NS"; +    my $processing = 0; +    my $processingModIds = 1; +    my $processingRcs = 2; +    my $processingUds = 3; +    my $compId = ""; + +    while (my $line = <RC_FILE>) +    { +        if ($line =~ /^\s*namespace\s+(\w+)/) +        { +            if ($namespace ne "NO_NS") +            { +                print ("$0: Multiple namespaces in '$file'\n"); +                exit(1); +            } +            $namespace = $1; + +            # Check for common code files where the reason codes do not contain +            # component IDs. Expand this hash as needed to add more components +            my %namespaceToCompHash = ( +                "HWAS" => "HWAS_COMP_ID"); + +            if (exists $namespaceToCompHash{$namespace}) +            { +                # Reason codes do not contain component IDs +                $compId = $namespaceToCompHash{$namespace}; +            } +            else +            { +                # Reason codes contain component IDs +                $compId = ""; +            } + +            next; +        } +        elsif ($line =~ /enum.+ModuleId/i) +        { +            $processing = $processingModIds; +            next; +        } +        elsif ($line =~ /enum.+ReasonCode/i) +        { +            $processing = $processingRcs; +            next; +        } +        elsif ($line =~ /enum.+UserDetail/i) +        { +            $processing = $processingUds; +            next; +        } +        elsif ($line =~ /}/) +        { +            $processing = 0; +            next; +        } + +        if ($processing == $processingModIds) +        { +            # Example: "MOD_PNORRP_WAITFORMESSAGE       = 0x01" +            if ($line =~ /(\w+)\s+=\s+0x([\dA-Fa-f]+)/) +            { +                $modIdToValueHash{$namespace}->{$1} = $2; +            } +        } +        elsif ($processing == $processingRcs) +        { +            if ($compId ne "") +            { +                # Reason code line does not contain Component ID +                # Example: "RC_TARGET_NOT_DECONFIGURABLE        = 0x01," +                if ($line =~ /(\w+)\s+=\s+0x([\dA-Fa-f]+)/) +                { +                    if (! exists $compIdToValueHash{$compId}) +                    { +                        print ("$0: Could not find CompID '$compId'\n"); +                        exit(1); +                    } +                    $rcToValueHash{$namespace}->{$1} = +                        $compIdToValueHash{$compId} . $2; +                } +            } +            else +            { +                # Reason code line contains Component ID +                # Example: "RC_INVALID_MESSAGE_TYPE      = PNOR_COMP_ID | 0x01" +                if ($line =~ /(\w+)\s+=\s+(\w+)\s+\|\s+0x([\dA-Fa-f]+)/) +                { +                    if (! exists $compIdToValueHash{$2}) +                    { +                        print ("$0: Could not find CompID '$2'\n"); +                        exit(1); +                    } +                    $rcToValueHash{$namespace}->{$1} = +                        $compIdToValueHash{$2} . $3; +                } +            } +        } +        elsif ($processing == $processingUds) +        { +            # Example: "HWPF_UDT_HWP_RCVALUE       = 0x01," +            if ($line =~ /(\w+)\s+=\s+(0x[\dA-Fa-f]+)/) +            { +               my $udId = $1; +               my $udValue = $2; + +               if (exists($udIdToValueHash{$udId})) +               { +                   print ("$0: duplicate user data section in '$file'\n"); +                   print ("$0: section is '$udId'\n"); +                   exit(1); +               } + +               $udIdToValueHash{$udId} = $udValue; +            } +        } +    } + +    close(RC_FILE); +} + +if ($DEBUG) +{ +    print("---> ModuleId values\n"); +    foreach my $namespaceKey (keys %modIdToValueHash) +    { +        foreach my $modIdKey (keys %{$modIdToValueHash{$namespaceKey}}) +        { +            print ("$namespaceKey:$modIdKey:$modIdToValueHash{$namespaceKey}->{$modIdKey}\n"); +        } +    } + +    print("---> ReasonCode values\n"); +    foreach my $namespaceKey (keys %rcToValueHash) +    { +        foreach my $rcKey (keys %{$rcToValueHash{$namespaceKey}}) +        { +            print ("$namespaceKey:$rcKey:$rcToValueHash{$namespaceKey}->{$rcKey}\n"); +        } +    } + +    print("---> User Detail Data Section values\n"); +    foreach my $udKey (keys %udIdToValueHash) +    { +        print ("$udKey:$udIdToValueHash{$udKey}\n"); +    } +} + +#------------------------------------------------------------------------------ +# Generate the FSP hbfwUdIds.H file that contains the set of Hostboot component +# IDs and user detail data IDs. This is used by the user data parsers +#------------------------------------------------------------------------------ +my $outputFileName = $outputDir . "/hbfwUdIds.H"; +open(OFILE, ">", $outputFileName) or die("Cannot open: $outputFileName: $!"); + +print OFILE "// Automatically generated by Hostboot's $0\n"; +print OFILE "// Do not modify this file in the FSP tree, it is provided by\n"; +print OFILE "// Hostboot and will be overwritten\n"; +print OFILE "//\n\n"; +print OFILE "\#ifndef HBFWUDIDS_H\n"; +print OFILE "\#define HBFWUDIDS_H\n\n"; +print OFILE "// Hostboot component IDs\n"; +print OFILE "namespace hbfw\n"; +print OFILE "{\n"; +print OFILE "    enum\n"; +print OFILE "    {\n"; +foreach my $key (keys %compIdToValueHash) +{ +    print OFILE "        $key = 0x$compIdToValueHash{$key}00,\n"; +} +print OFILE "    };\n"; +print OFILE "}\n\n"; +print OFILE "// Hostboot User Detail Data IDs\n"; +print OFILE "enum\n"; +print OFILE "{\n"; +foreach my $udKey (keys %udIdToValueHash) +{ +    print OFILE "    $udKey = $udIdToValueHash{$udKey},\n"; +} +print OFILE "};\n\n"; +print OFILE "#endif\n"; + +close(OFILE); + +#------------------------------------------------------------------------------ +# Process the code files, looking for error log tags, save the parsing for each +# in a hash indexed by the component value +#------------------------------------------------------------------------------ +my %compValueToParseHash; +my %rcModValuesUsed; + +foreach my $file (@filesToParse) +{ +    open(PARSE_FILE, $file) or die("Cannot open: $file: $!"); +    my @namespaces; +    push(@namespaces, "NO_NS"); + +    #------------------------------------------------------------------------- +    # Example Tag: +    #   /*@ +    #     * @errortype +    #     * @reasoncode     I2C_INVALID_OP_TYPE +    #     * @severity       ERRL_SEV_UNRECOVERABLE +    #     * @moduleid       I2C_PERFORM_OP +    #     * @userdata1      i_opType +    #     * @userdata2      addr +    #     * @devdesc        Invalid Operation type. +    #     */ +    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +    while (my $line = <PARSE_FILE>) +    { +        if ($line =~ /namespace\s+(\w+)/) +        { +            # Found a namespace, record it to be used when searching for +            # moduleid and reasoncode values +            push(@namespaces, $1); +            next; +        } + +        if ($line =~ /\/\*\@/) +        { +            # Found the start of an error log tag +            my $modId = ""; +            my $modIdValue = ""; +            my $rc = ""; +            my $rcValue = ""; +            my @userData; +            my $desc = ""; + +            # Read the entire error log tag into an array +            my @tag; + +            while ($line = <PARSE_FILE>) +            { +                if ($line =~ /\*\//) +                { +                    # Found the end of an error log tag +                    last; +                } +                push(@tag, $line); +            } + +            # Process the error log tag +            my $numLines = scalar (@tag); + +            for (my $lineNum = 0; $lineNum < $numLines; $lineNum++) +            { +                $line = $tag[$lineNum]; +             +                if ($line =~ /\@moduleid\s+(\S+)/i) +                { +                    # Found a moduleid, find out the value +                    $modId = $1; + +                    if ($modId =~ /(\w+)::(\w+)/) +                    { +                        # The namespace was provided +                        if ((exists $modIdToValueHash{$1}) && +                            (exists ${modIdToValueHash{$1}->{$2}})) +                        { +                            $modIdValue = ${modIdToValueHash{$1}->{$2}}; +                        } +                    } +                    else +                    { +                        # The namespace was not provided, look through all +                        # namespaces mentioned in the file +                        foreach my $namespace(@namespaces) +                        { +                            if ((exists $modIdToValueHash{$namespace}) && +                                (exists ${modIdToValueHash{$namespace}->{$modId}})) +                            { +                                $modIdValue = ${modIdToValueHash{$namespace}->{$modId}}; +                                last; +                            } +                        } +                    } + +                    if ($modIdValue eq "") +                    { +                        print ("$0: Error finding moduleid value for '$file:$line'\n"); +                        exit(1); +                    } +                } +                elsif ($line =~ /\@reasoncode\s+(\S+)/i) +                { +                    # Found a reasoncode, figure out the value +                    $rc = $1; + +                    if ($rc =~ /(\w+)::(\w+)/) +                    { +                        # The namespace was provided +                        if ((exists $rcToValueHash{$1}) && +                            (exists ${rcToValueHash{$1}->{$2}})) +                        { +                            $rcValue = ${rcToValueHash{$1}->{$2}}; +                        } +                    } +                    else +                    { +                        # The namespace was not provided, look through all +                        # namespaces mentioned in the file +                        foreach my $namespace(@namespaces) +                        { +                            if ((exists $rcToValueHash{$namespace}) && +                                (exists ${rcToValueHash{$namespace}->{$rc}})) +                            { +                                $rcValue = ${rcToValueHash{$namespace}->{$rc}}; +                                last; +                            } +                        } +                    } + +                    if ($rcValue eq "") +                    { +                        print ("$0: Error finding reasoncode value for '$file:$line'\n"); +                        exit(1); +                    } +                } +                elsif ($line =~ /\@(userdata\S+)\s+(\S+.*)/i) +                { +                    # Found user data, strip out any double-quotes and trailing +                    # whitespace +                    my $udDesc = $1; +                    my $udText = $2; +                    $udText =~ s/\"//g; +                    $udText =~ s/\s+$//; + +                    # Look for follow-on lines +                    for ($lineNum++; $lineNum < $numLines; $lineNum++) +                    { +                        $line = $tag[$lineNum]; + +                        if ($line =~ /\@/) +                        { +                            # Found the next element, rewind +                            $lineNum--; +                            last; +                        } + +                        # Continuation of user data, strip out any double-quotes +                        # and leading / trailing whitespace +                        $line =~ s/^.+\*\s+//; +                        $line =~ s/\"//g; +                        $line =~ s/\s+$//; + +                        if ($line ne "") +                        { +                            $udText = $udText . " " . $line; +                        } +                    } + +                    my $udString = "\"$udDesc\", \"$udText\""; +                    push(@userData, $udString); +                } +                elsif ($line =~ /\@devdesc\s+(\S+.*)/i) +                { +                    # Found a description, strip out any double-quotes and +                    # trailing whitespace +                    $desc = $1; +                    $desc =~ s/\"//g; +                    $desc =~ s/\s+$//; + +                    # Look for follow-on lines +                    for ($lineNum++; $lineNum < $numLines; $lineNum++) +                    { +                        $line = $tag[$lineNum]; + +                        if ($line =~ /\@/) +                        { +                            # Found the next element, rewind +                            $lineNum--; +                            last; +                        } + +                        # Continuation of description, strip out any double- +                        # quotes and leading / trailing whitespace +                        $line =~ s/^.+\*\s+//; +                        $line =~ s/\"//g; +                        $line =~ s/\s+$//; + +                        if ($line ne "") +                        { +                            $desc = $desc . " " . $line; +                        } +                    } +                } +            } + +            # Check that the required fields were found +            if ($modId eq "") +            { +                print ("$0: moduleid missing from error log tag in '$file'\n"); +                print ("$0: reasoncode is '$rc'\n"); +                exit(1); +            } + +            if ($rc eq "") +            { +                print ("$0: reasoncode missing from error log tag in '$file'\n"); +                print ("$0: moduleid is '$modId'\n"); +                exit(1); +            } + +            if ($desc eq "") +            { +                print ("$0: description missing from error log tag in '$file'\n"); +                print ("$0: moduleid is '$modId', reasoncode is '$rc'\n"); +                exit(1); +            } + +            # Create the combined returncode/moduleid value that the parser looks for and +            # ensure that it is not a duplicate of one already found +            my $rcModValue = $rcValue . $modIdValue; + +            if (exists($rcModValuesUsed{$rcModValue})) +            { +                print ("$0: duplicate moduleid/reasoncode error log tag in '$file'\n"); +                print ("$0: moduleid is '$modId', reasoncode is '$rc'\n"); +                exit(1); +            } + +            $rcModValuesUsed{$rcModValue} = 1; + +            # Create the parser code for this error +            my $parserCode = "    case 0x$rcModValue:\n" +                           . "        i_parser.PrintString(\"devdesc\", \"$desc\");\n" +                           . "        i_parser.PrintString(\"moduleid\", \"$modId\");\n" +                           . "        i_parser.PrintString(\"reasoncode\", \"$rc\");\n"; +            foreach my $udString(@userData) +            { +                $parserCode .= "        i_parser.PrintString($udString);\n"; +            } +            $parserCode .= "        break;\n\n"; + +            # The component value is the first two characters of the 4 character rc +            my $compValue = $rcValue; +            $compValue =~ s/..$//; + +            # Add the parser code to compValueToParseHash +            $compValueToParseHash{$compValue} .= $parserCode; +        } +    } + +    close(PARSE_FILE); +} + +#------------------------------------------------------------------------------ +# For each component value, print a file containing the parse code +#------------------------------------------------------------------------------ +my $timestamp = ctime(); +my $imageId = getImageId(); + +foreach my $compValue (keys %compValueToParseHash) +{ +    my $outputFileName = $outputDir . "/hbfwSrcParse$compValue.C"; +    open(OFILE, ">", $outputFileName) or die("Cannot open: $outputFileName: $!"); + +    print OFILE "/*\n"; +    print OFILE " * Automatically generated by Hostboot's $0\n"; +    print OFILE " * Do not modify this file in the FSP tree, it is provided by\n"; +    print OFILE " * Hostboot and will be overwritten\n"; +    print OFILE " *\n"; +    print OFILE " * TimeStamp:   $timestamp\n"; +    print OFILE " * Image Id:    $imageId\n"; +    print OFILE " *\n"; +    print OFILE " */\n\n"; +    print OFILE "#include <errlplugins.H>\n"; +    print OFILE "#include <errlusrparser.H>\n"; +    print OFILE "#include <srcisrc.H>\n\n"; +    print OFILE "static bool SrcDataParse(ErrlUsrParser & i_parser,\n"; +    print OFILE "                         const SrciSrc & i_src)\n"; +    print OFILE "{\n"; +    print OFILE "    uint32_t l_error = (i_src.reasonCode() << 8) + i_src.moduleId();\n"; +    print OFILE "    bool l_success = true;\n\n"; +    print OFILE "    switch(l_error)\n"; +    print OFILE "    {\n"; +    print OFILE $compValueToParseHash{$compValue}; +    print OFILE "    default:\n"; +    print OFILE "        l_success = false;\n"; +    print OFILE "        break;\n"; +    print OFILE "    };\n"; +    print OFILE "    return l_success;\n"; +    print OFILE "}\n\n"; +    print OFILE "static errl::SrcPlugin g_SrcPlugin(0x$compValue"; +    print OFILE "00, SrcDataParse);\n"; + +    close(OFILE); +} + +#------------------------------------------------------------------------------ +# Figure out the user detail data files to compile for each component +#------------------------------------------------------------------------------ +my %compValToUdFilesHash; + +foreach my $dir(@pluginDirsToParse) +{ +    my $ofiles = ""; +    my $compId = ""; +    my $compVal = 0; + +    # Open the directory and read all entries (files) skipping any beginning +    # with "." +    my @dirEntries; +    opendir(DH, $dir) or die("Cannot open $dir directory"); +    @dirEntries = grep { !/^\./ } readdir(DH); +    closedir(DH); + +    # The plugin directory must contain a <COMP_ID>_Parse.C file which contains +    # the user detail data parser for that component +    foreach my $file(@dirEntries) +    { +        if ($file =~ /^(.+).C$/) +        { +            # Found a C file add it to the files to compile list +            $ofiles .= "$1\.o "; + +            if ($file =~ /^(.+COMP_ID)_Parse.C$/) +            { +                # Found the main Parse.C file for a component +                $compId = $1; +            } +        } +    } + +    if ($compId eq "") +    { +        print ("$0: Could not find CompID Parser file in $dir\n"); +        exit(1); +    } + +    # Find the component ID value +    if (! exists $compIdToValueHash{"$compId"}) +    { +        print ("$0: Could not find CompID $compId while processing $dir\n"); +        exit(1); +    } +    $compVal = $compIdToValueHash{$compId}; + +    $compValToUdFilesHash{$compVal} = $ofiles; +} + +#------------------------------------------------------------------------------ +# Generate the FSP makefile that builds the Hostboot error log parsers +#------------------------------------------------------------------------------ +$outputFileName = $outputDir . "/makefile"; +open(OFILE, ">", $outputFileName) or die("Cannot open: $outputFileName: $!"); + +print OFILE "\# Automatically generated by Hostboot's $0\n"; +print OFILE "\# Do not modify this file in the FSP tree, it is provided by\n"; +print OFILE "\# Hostboot and will be overwritten\n"; +print OFILE "\#\n"; +print OFILE "CFLAGS += -DPARSER\n\n"; + +print OFILE "\#-------------------------------------------------------------\n"; +print OFILE "\# SRC Parsers\n"; +print OFILE "\#-------------------------------------------------------------\n"; +foreach my $compValue (keys %compValueToParseHash) +{ +    print OFILE "libB-$compValue" . "00.so_OFILES = hbfwSrcParse$compValue.o\n"; +    print OFILE "libB-$compValue" . "00.so_EXTRA_LIBS = libbase.so\n\n"; +} + +print OFILE "\#-------------------------------------------------------------\n"; +print OFILE "\# User Detail Data Parsers\n"; +print OFILE "\#-------------------------------------------------------------\n"; +foreach my $compValue (keys %compValToUdFilesHash) +{ +    print OFILE "libB-$compValue" . "00.so_OFILES += $compValToUdFilesHash{$compValue}\n\n"; +} + +print OFILE "\#-------------------------------------------------------------\n"; +print OFILE "\# Shared library for each component\n"; +print OFILE "\#-------------------------------------------------------------\n"; +print OFILE "SHARED_LIBRARIES = "; + +foreach my $compValue (keys %compValueToParseHash) +{ +    print OFILE "libB-$compValue" . "00.so "; +} + +print OFILE "\n\n.include<\${RULES_MK}>\n"; + +close(OFILE); + +#------------------------------------------------------------------------------ +# Subroutine that prints the usage +#------------------------------------------------------------------------------ +sub usage +{ +    print "Usage: $0 <-b base> <-d> <-o output dir>\"\n"; +    print "\n"; +    print "-b:     Base directory containing Hostboot src directory (default is pwd)\n"; +    print "-o:     Output directory where files are created (default is pwd)\n"; +    print "-d      Enable Debug messages.\n"; +    print "\n\n"; +    exit 1; +} + +#------------------------------------------------------------------------------ +# Subroutine that updates @reasonCodeFiles +#------------------------------------------------------------------------------ +sub getReasonCodeFiles +{ +    # Open the input directory and read all entries (files/directories) +    # Skipping any beginning with "." +    my $inputDir = @_[0]; +    my @dirEntries; +    opendir(DH, $inputDir) or die("Cannot open $inputDir directory"); +    @dirEntries = grep { !/^\./ } readdir(DH); +    closedir(DH); + +    foreach my $dirEntry (@dirEntries) +    { +        my $dirEntryPath = "$inputDir/$dirEntry"; + +        if (-d $dirEntryPath) +        { +            # Recursively call this function +            getReasonCodeFiles($dirEntryPath); +        } +        elsif(($dirEntry =~ /reasoncodes/i) || +              ($dirEntry =~ /service_codes/i) || +              ($dirEntry =~ /examplerc/i)) +        { +            # Found reason-codes file +            push(@reasonCodeFiles, $dirEntryPath); +        } +    } +} + +#------------------------------------------------------------------------------ +# Subroutine that updates @filesToParse +#------------------------------------------------------------------------------ +sub getFilesToParse +{ +    # Open the input directory and read all entries (files/directories) +    # Skipping any beginning with "." +    my $inputDir = @_[0]; +    my @dirEntries; +    opendir(DH, $inputDir) or die("Cannot open $inputDir directory"); +    @dirEntries = grep { !/^\./ } readdir(DH); +    closedir(DH); + +    foreach my $dirEntry (@dirEntries) +    { +        my $dirEntryPath = "$inputDir/$dirEntry"; + +        if (-d $dirEntryPath) +        { +            # Recursively call this function +            getFilesToParse($dirEntryPath); +        } +        elsif($dirEntry =~ /\.[H|C]$/) +        { +            # Found file to parse +            push(@filesToParse, $dirEntryPath); +        } +    } +} + +#------------------------------------------------------------------------------ +# Subroutine that updates @pluginDirsToParse +#------------------------------------------------------------------------------ +sub getPluginDirsToParse +{ +    # Open the input directory and read all entries (files/directories) +    # Skipping any beginning with "." +    my $inputDir = @_[0]; +    my @dirEntries; +    opendir(DH, $inputDir) or die("Cannot open $inputDir directory"); +    @dirEntries = grep { !/^\./ } readdir(DH); +    closedir(DH); + +    foreach my $dirEntry (@dirEntries) +    { +        my $dirEntryPath = "$inputDir/$dirEntry"; + +        if (-d $dirEntryPath) +        { +            if ($dirEntryPath =~ /plugins/) +            { +                # Found plugins directory +                push(@pluginDirsToParse, $dirEntryPath); +            } +            else +            { +                # Recursively call this function +                getPluginDirsToParse($dirEntryPath); +            } +        } +    } +} + +#------------------------------------------------------------------------------ +# Subroutine that gets the Image ID +#------------------------------------------------------------------------------ +sub getImageId +{ +    my $imageId = `git describe --dirty || echo Unknown-Image \`git rev-parse --short HEAD\``; +    chomp $imageId; + +    if (($imageId =~ m/Unknown-Image/) ||   # Couldn't find git describe tag. +        ($imageId =~ m/dirty/) ||       # Find 'dirty' commit. +        ($imageId =~ m/^.{15}-[1-9]+/)) # Found commits after a tag. +    { +        $imageId = $imageId."/".$ENV{"USER"}; +    } + +    return $imageId; +} + diff --git a/src/usr/errl/parser/makefile b/src/usr/errl/parser/makefile index e0307c629..69451597a 100644 --- a/src/usr/errl/parser/makefile +++ b/src/usr/errl/parser/makefile @@ -1,25 +1,25 @@ -#  IBM_PROLOG_BEGIN_TAG -#  This is an automatically generated prolog. +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog.  # -#  $Source: src/usr/errl/parser/makefile $ +# $Source: src/usr/errl/parser/makefile $  # -#  IBM CONFIDENTIAL +# IBM CONFIDENTIAL  # -#  COPYRIGHT International Business Machines Corp. 2011 +# COPYRIGHT International Business Machines Corp. 2011,2013  # -#  p1 +# p1  # -#  Object Code Only (OCO) source materials -#  Licensed Internal Code Source Materials -#  IBM HostBoot Licensed Internal Code +# Object Code Only (OCO) source materials +# Licensed Internal Code Source Materials +# IBM HostBoot Licensed Internal Code  # -#  The source code for this program is not published or other- -#  wise divested of its trade secrets, irrespective of what has -#  been deposited with the U.S. Copyright Office. +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office.  # -#  Origin: 30 +# Origin: 30  # -#  IBM_PROLOG_END +# IBM_PROLOG_END_TAG  # makefile for errlparser a 32-bit x86 linux binary  # to extract the PEL of an error log and  @@ -28,10 +28,9 @@  # "Pretty printing" of those error logs is the  # function of FipS 'errl' and its plugins, not this program.  # -# This makefile runs 'scanforsrc.pl' which generates  -# hostBootSrcParse.H, a file that hostboot plugins will include. - - +# This makefile runs 'genErrlParsers' which generates  +# the Hostboot SRC parsers and the makefile to build the +# Hostboot SRC and User Detail Data parsers  ROOTPATH=../../../.. @@ -40,18 +39,18 @@ IMGDIR = ${ROOTPATH}/img  OBJDIR = ${ROOTPATH}/obj/modules/errl/parser -SRCPARSE_HEADER_TARGET = \ -	${GENDIR}/hostBootSrcParse.H - +ERRLPARSE_TARGETS = \ +	${GENDIR}/plugins/hbfwUdIds.H \ +    ${GENDIR}/plugins/makefile  CC=i686-mcp6-g++ -m32  CFLAGS:=-g -O0   -I $(ROOTPATH)/src/include/usr -I ${GENDIR}  all: gen_pass code_pass -gen_pass:  mkdirs  ${GENDIR}/comps.C +gen_pass:  mkdirs  ${GENDIR}/comps.C ${ERRLPARSE_TARGETS} -code_pass: ${SRCPARSE_HEADER_TARGET} ${IMGDIR}/errlparser +code_pass: ${IMGDIR}/errlparser  # errlparserbase and errlusrparser are plugins stuff, not errlparser.   # OBJFILES = ${OBJDIR}/errlparserbase.o	${OBJDIR}/errlusrparser.o @@ -62,9 +61,9 @@ mkdirs:  	mkdir -p ${OBJDIR}  	mkdir -p ${GENDIR} -# Parse for error log tags in the Hostboot code, and generate hostBootSrcParse.H -${SRCPARSE_HEADER_TARGET} :: -	./scanforsrcs.pl -b ${ROOTPATH} -o ${GENDIR} +# Generate error log parser code +${ERRLPARSE_TARGETS} :: +	./genErrlParsers.pl -b ${ROOTPATH} -o ${GENDIR}/plugins  ${GENDIR}/comps.C: ${ROOTPATH}/src/include/usr/hbotcompid.H  	grep "const compId_t [A-Z0-9]*_COMP_ID" $^ | \ @@ -72,7 +71,7 @@ ${GENDIR}/comps.C: ${ROOTPATH}/src/include/usr/hbotcompid.H  	sed 's/const compId_t \([A-Z0-9]*\)_COMP_ID[ =\t]*\(0[xX][0-9a-fA-F]*\).*/{ "\1", \2 },/' \  	> $@ -${OBJDIR}/errlparser.o: errlparser.C ${ROOTPATH}/src/include/usr/errl/hberrltypes.H ${GENDIR}/comps.C ${SRCPARSE_HEADER_TARGET} +${OBJDIR}/errlparser.o: errlparser.C ${ROOTPATH}/src/include/usr/errl/hberrltypes.H ${GENDIR}/comps.C  	$(CC) -c  $(CFLAGS)  -o $@  $< @@ -80,7 +79,8 @@ ${IMGDIR}/errlparser: ${OBJDIR}/errlparser.o  	$(CC) -o  $@ $<  clean: -	rm -f ${SRCPARSE_HEADER_TARGET} +	rm -f ${ERRLPARSE_TARGETS} +	rm -f ${GENDIR}/plugins/hbfwSrcParse*.C  	rm -f ${GENDIR}/comps.C  	rm -f ${IMGDIR}/errlparser  	rm -fr ${OBJDIR} diff --git a/src/usr/errl/parser/scanforsrcs.pl b/src/usr/errl/parser/scanforsrcs.pl deleted file mode 100755 index ebed31b65..000000000 --- a/src/usr/errl/parser/scanforsrcs.pl +++ /dev/null @@ -1,781 +0,0 @@ -#!/usr/bin/perl -#  IBM_PROLOG_BEGIN_TAG -#  This is an automatically generated prolog. -# -#  $Source: src/usr/errl/parser/scanforsrcs.pl $ -# -#  IBM CONFIDENTIAL -# -#  COPYRIGHT International Business Machines Corp. 2011 -# -#  p1 -# -#  Object Code Only (OCO) source materials -#  Licensed Internal Code Source Materials -#  IBM HostBoot Licensed Internal Code -# -#  The source code for this program is not published or other- -#  wise divested of its trade secrets, irrespective of what has -#  been deposited with the U.S. Copyright Office. -# -#  Origin: 30 -# -#  IBM_PROLOG_END -# -# Purpose: Scan the hostboot source code to extract the doxygen like tags -#          and generate a header file for the error log parser to include. -# - -use strict; -use File::Find (); -use Time::localtime; -use File::Path; - -# Vairables -my $DEBUG = 0; -my $component = "VOID"; -my $sandBase = $ENV{HOSTBOOTROOT}; - -my $arg; -my %Comps; -my $wordn = "userdata1"; -my $wordnd = 1; -my $NA = 1; -my $fh; - -my $argOutput = ""; -my $output = ""; - -# Arrays -my @compHeaders; -my %namespaceList; -my @reasonCodeFiles; - -while( $ARGV = shift ) -{ -    if( $ARGV =~ m/-b/ ) -    { -        $sandBase = shift; -    } -    elsif( $ARGV =~ m/-o/i ) -    { -        $argOutput = shift; -    } -    elsif( $ARGV =~ m/-h/i ) -    { -        usage(); -    } -    elsif( $ARGV =~ m/-d/i ) -    { -        $DEBUG = 1; -    } -    else -    { -        usage(); -    } -} - -# Variables depending on input parameters -if( $argOutput eq "" ) -{ -    $output = "$sandBase/obj/genfiles"; -} -else -{ -    $output = $argOutput;  -} -my $comp_id = "$sandBase/src/include/usr/hbotcompid.H"; - -# Setup all the different paths that need to be searched -my $sourcebasePath = $sandBase."/src/usr"; -my $includePath = $sandBase."/src/include/usr"; -my $genfilesPath = $sandBase."/obj/genfiles"; - -# Get the listing of components -opendir my( $dir ), $sourcebasePath or die "Couldn't open directory $sourcebasePath, $!"; -my @components = readdir $dir; -closedir $dir; - -my %sourcebase; -my %sourcebaseInc; -my %sourcebaseGenfiles; - -my @fileList; - -################################################################ -# Debug Printing -################################################################ -debugMsg( "Comp id file: $comp_id" ); -debugMsg( "Source Base Path: $sourcebasePath" ); -debugMsg( "Sandbox Base Dir: $sandBase" ); -debugMsg( "Output Dir: $output" ); -################################################################ - -foreach( @components ) -{ -    # Both src/usr directories as well as src/include/usr directories -    # are done here to make sure they line up with the same "component" -    # generated files will be done after this loop under the "genfiles" -    # component name. -    $component = $_; -    debugMsg( "Component: $component" ); - -    # Print components for debug. -    my $compDir = "$sourcebasePath/$component"; -    debugMsg( "Component Dir: $compDir" ); - -    # Skip files and dirs . and .. -    if( -d "$compDir" ) -    { -        if( ($component eq ".") || -            ($component eq ".." ) || -            ($component eq "example" ) ) -        { -            debugMsg( "exiting..." ); -            next; -        } -    } -    else -    { -        debugMsg( "exiting-->" ); -        next; -    } - -    # Check to be sure the main src directory is available -    if( -e "$compDir" ) -    { -        # Get a list of files to be scanned -        %sourcebase = getFiles( $compDir ); -    } -    else -    { -        # Exit since the path of the user code wasn't found. -        die( "\nERROR!  Path ($compDir) does not exist.  Cannot run!\n" ); -    } - -    # Get the associated component include files -    my $incCompDir = "$includePath/$component"; -    debugMsg( "Include Path: $incCompDir" ); - -    # Skip files and dirs . and .. -    if( -d "$incCompDir" ) -    { -        # Do nothing, we want the directories -    } -    else -    { -        debugMsg( "exiting-->" ); -        next; -    } - -    # if include dir exists, get the files -    if( -e "$incCompDir" ) -    { -        # Add the include files -        %sourcebaseInc = getFiles( $incCompDir ); -    } -    else -    { -        # Exit since the path of the user code wasn't found. -        die( "\nERROR!  Path ($incCompDir) does not exist. Cannot run!\n" ); -    } - -    # Put each file on list to be scanned -    foreach( values %sourcebase ) -    { -        push( @fileList, $_ ); -        debugMsg( "File: $_" ); - -        # Delete hash entry -        delete $sourcebase{$_}; -    } - -    # Put each file on list to be scanned -    foreach( values %sourcebaseInc ) -    { -        push( @fileList, $_ ); -        debugMsg( "File (include): $_" ); - -        # Delete hash entry -        delete $sourcebaseInc{$_}; -    } - -    foreach( @fileList ) -    { -        debugMsg( "Calling extractTags for file: $_" ); -        extractTags( $_, $component ); -    } - -    # Clear the file list so we don't reuse them -    @fileList = (); -} - -# Scan the generated files and add to file list -if( -e $genfilesPath ) -{ -    %sourcebaseGenfiles = getFiles( $genfilesPath ); -    foreach( values %sourcebaseGenfiles ) -    { -        push( @fileList, $_ ); -        debugMsg( "File (genfiles): $_" ); -        delete $sourcebaseGenfiles{$_}; -    } - -    foreach( @fileList ) -    { -        debugMsg( "Calling extractTags for file: $_" ); -        extractTags( $_, "genfiles" ); -    } -} -else -{ -    die( "\nERROR! Path($genfilesPath) does not exist.  Cannot continue!\n" ); -} - -# Get the file open -$fh = openHeaderFile(); - -# Start writing the main header file that will be included by errlparser.C -startMainHeaderFile( $fh ); - -my $found_dup = 0; - -# Write each case statement for printing -foreach my $key (sort(keys(%Comps))) -{ -    writePrintStatement( $fh, $key, \@{$Comps{$key}} ); -} -if($found_dup > 0) -{ -    die( "ERROR! Duplicate hash found!\n" ); -} - -# Finish writing the header -finishMainHeaderFile( $fh ); - -exit 0; - -#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -#  End of Main program -#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -################################################################################ -# -# Print the Usage message -# -################################################################################ - -sub usage -{ -    print "Usage: $0 < -b base > <-d> < -o output dir >\"\n"; -    print "\n"; -    print "-b:     base directory ( default is pwd )\n"; -    print "-o:     Used as the output directory where header file is dropped\n"; -    print "-d      Enable Debug messages.\n"; -    print "-h      Display usage message.\n"; -    print "\n\n"; -    exit 1; -} - - -################################################################################ -# -# Print debug messages if $DEBUG is enabled. -# -################################################################################ - -sub debugMsg -{ -    my ($msg) = @_; -    if( $DEBUG ) -    { -        print "DEBUG: $msg\n"; -    } -} - - -################################################################################ -# -# Extracts each tag and description from each entry for the given file. -# -################################################################################ - -sub extractTags -{ -    my $data; -    my ($file, $comp) = @_; -    debugMsg( "extractTags: Component: $comp" ); -    local *FH; - -    debugMsg( "Processing: $file" ); - -    open(FH, "$file") or die("Cannot open: $file: $!"); -    read(FH, $data, -s FH) or die("Error reading $file: $!"); -    close FH; - -    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -    # Capture everything from opening '/*@' to end of tags '*/' -    # -    # Example: -    #   /*@ -    #     * @errortype -    #     * @reasoncode     I2C_INVALID_OP_TYPE -    #     * @severity       ERRL_SEV_UNRECOVERABLE -    #     * @moduleid       I2C_PERFORM_OP -    #     * @userdata1      i_opType -    #     * @userdata2      addr -    #     * @devdesc        Invalid Operation type. -    #     */ -    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -    while ($data =~ /\/\*\@((.|\n)+?)\*\//mgo ) -    { -        debugMsg( "Found New Error Tag!" ); - -        my $text = $1; -        debugMsg( "Text1: $text" ); -        my %hash = $text =~ /\@(\S+)(?:\s+|\.+)\b(.+?)$/gm; -        my $tmp; -        my $tmpKey; - -        foreach my $key (sort keys %hash) -        { -            $tmpKey = AddSlashes( $key ); -            debugMsg( "Key: $tmpKey" ); -            # Extract multi-line string -            $text =~ /\@$tmpKey(?:\s+|\.+)(.+?)(?:\@|$).*/s; -            debugMsg( "Text3: $text" ); -            $tmp = $1; -            debugMsg( "Tmp: $tmp" ); -            $tmp =~ s/\s*\*\s*/ \n/gm; -            debugMsg( "Tmp again: $tmp" ); -            $tmp = stripWhitespace( $tmp ); -            debugMsg( "Tmp trimmed: $tmp" ); -            $hash{$key} = $tmp; -	    debugMsg( "Assigning '$key' = '$tmp'" ); -        } - -        push @{$Comps{$comp}}, \%hash; -    } -} - - -################################################################################ -# -# getFiles - find *.H or *.C files -# This recursively searches the input directory passed in for all C/H files. -# -################################################################################ - -sub getFiles -{ -    my ($l_input_dir) = @_; -    my @dir_entry; -    my %l_input_files; -    local *DH; - -    debugMsg( "Getting Files for dir: $l_input_dir" ); - -    # Open the directory and read all entry names. -    opendir(DH, $l_input_dir) or die("Cannot open $l_input_dir: $!"); -    # skip the dots -    @dir_entry = grep { !/^\./ } readdir(DH); -    closedir(DH); -    while (@dir_entry) -    { -        my $l_entry = shift(@dir_entry); -        my $full_path = "$l_input_dir/$l_entry"; - -        debugMsg( "getFiles: Full Path: $full_path" ); - -        if ($l_entry =~ /\.[H|C]$/) -        { -            $l_input_files{$l_entry} = $full_path; -            debugMsg( "getFiles: Adding file: $full_path" ); -        } -        elsif (-d $full_path) -        { -            # recursive here -            my %local_hash = getFiles($full_path); -            my @keys = keys(%local_hash); - -            foreach(@keys) -            { -                $l_input_files{$_} = $local_hash{$_}; -            } -        } -    } -    return(%l_input_files); -} - - -################################################################################ -# -# Add escape characters to strings -# -################################################################################ - -sub AddSlashes  -{ -    my ($text) = @_; -    ## Make sure to do the backslash first! -    $text =~ s/\\/\\\\/g; -    $text =~ s/'/\\'/g; -    $text =~ s/"/\\"/g; -    $text =~ s/\\0/\\\\0/g; - -    $text =~ s/\[/\\[/g; -    $text =~ s/\]/\\]/g; -    return $text; -} - - -################################################################################ -# -# Strip whitespace from beginning/end of string -# -################################################################################ - -sub stripWhitespace -{ -    my ($text) = @_; - -    $text =~ s/^\s+//;  # strip leading spaces -    $text =~ s/\s+$//;  # strip trailing spaces - -    return $text; -} - -################################################################################ -# -# Look for the components reasoncode file and include it -# -################################################################################ - -sub includeReasonCodes -{ -    my ( $fh,$incPath,$level ) = @_; - -    debugMsg( "includeReasonCodes incpath: $incPath" ); -    debugMsg( "includeReasonCodes level: $level" ); - -    my @incDirs = glob( $incPath ); -    my $incFileName = ""; - -    foreach my $file( @incDirs ) -    { -        debugMsg( "includeReasonCodes file: $file" ); -        my @allDirs = split( '/', $file ); - -        if( $file =~ m/reasoncodes/i ) -        { -            for( my $count = 0; $count < $level; $count++ ) -            { -                my $tmpTxt = pop @allDirs; - -                if( $incFileName ne "" ) -                { -                    $incFileName = $tmpTxt . "/$incFileName"; -                } -                else -                { -                    $incFileName = $tmpTxt; -                } -            } -            debugMsg( "ReasonCode file: $file" ); -            debugMsg( "Include string: $incFileName" ); - -            print $fh "#include <$incFileName>\n"; - -            # Find the namespace of the reason codes -            findNameSpace( $file ); - -            # Clear out incFileName, in case there are 2 reason code files -            # in the same directory -            $incFileName = ""; -        } -        elsif( -d $file ) -        { -            debugMsg( "includeReasonCodes recursion" ); -            # Recursion is done here. -            includeReasonCodes( $fh, $file."/*", ($level+1) ); -        } -    } -} - - -################################################################################ -# -# Build the main header file that errlparser.C will use to include all of -# the generated header files. -# -################################################################################ - -sub startMainHeaderFile -{ -    my ($fh) = @_; -    my $timestamp = ctime(); -    my $imageId = getImageId(); - -    print $fh <<EOF; -/* - * Automatically generated by src/usr/errl/parser/scanforsrcs.pl - * - * TimeStamp:   $timestamp - * Image Id:    $imageId - * -*/ - - -/*****************************************************************************/ -// I n c l u d e s -/*****************************************************************************/ -EOF - -    # Add the includes - start in src/include/usr -    my $startDir = $sandBase."/src/include/usr/*"; -    includeReasonCodes( $fh, $startDir, 1 ); - -    # Also include reason codes from generated files -    $startDir = $sandBase."/obj/genfiles"; -    includeReasonCodes( $fh, $startDir, 0 ); - -    print $fh <<EOF; - - -/*****************************************************************************/ -// N a m e s p a c e s -/*****************************************************************************/ -EOF - -    foreach( values %namespaceList ) -    { -        my $namespace = $_; -        print $fh "using namespace $namespace;\n" -    } - -    print $fh <<EOF; - - -static void printErrorTags (  ErrlUsrParser & i_parser, -                              uint64_t i_src, -                              uint64_t i_modId ) -{ -    uint64_t error = (i_src << 8) | i_modId; - -    switch( error ) -    { -EOF -} - - -################################################################################ -# -# Finish writing main header file -# -################################################################################ - -sub finishMainHeaderFile -{ -    my ($fh) = @_; - -    print $fh <<EOF; - -        default: -            uint32_t src = i_src & 0xFFFFFFFF; -            uint32_t modId = i_modId & 0xFFFFFFFF; -            printf( "\\nThere was not a valid Errorlog tag found for the given error combination!\\n" ); -            printf( "   Reason: 0x%04x, Module Id: 0x%02x\\n\\n", src, modId ); -            break; - -    }; -} -EOF -} - - -################################################################################ -# -# Open generated header file -# -################################################################################ - -sub openHeaderFile -{ -    my $filename = "$output/hostBootSrcParse.H"; -    my $fh; - -    if (! -e $output) -    { -        debugMsg( "Creating directory $output" ); -        eval { mkpath($output) }; - -        if ($@) -        { -            die("Couldn't create $output: $@"); -        } -    } - -    if (-e $filename) -    { -        chmod(0777, $filename); -    } - -    open($fh, ">$filename") or die("Cannot open $filename: $!"); -    return $fh; -} - - -################################################################################ -# -# Write the print statements to the header -# -################################################################################ - -sub writePrintStatement -{ -    my ($fh, $compName, $aref) = @_; -    my $wordstart = "userdata1"; -    my $modId; -    my $reasonCode; -    my $caseValue; -    my $line; - -    my %caseHash = (); - -    foreach my $href ( @$aref ) -    { -        # Get the ModId and Reasoncode tags -        foreach my $tag ( sort keys %$href ) -        { -            $href->{$tag} =~ s/\"/\\\"/g; -            my @lines = split /^/, $href->{$tag}; - -            if( scalar( @lines ) > 1 ) -            { -                foreach $line( @lines ) -                { -                    $line =~ s/\n//g; -                } -            } -            else -            { -                $line = $href->{$tag}; -                $line =~ s/\n//g; -            } - -            $line = stripWhitespace( $line ); -            if( "moduleid" eq $tag ) -            { -                $modId = $line; -            } -            elsif( "reasoncode" eq $tag ) -            { -                $reasonCode = $line; -            } -        } -        debugMsg( "Comp Name: $compName" ); -        debugMsg( "Module Id: $modId" ); -        debugMsg( "Reason Code: $reasonCode" ); - -        # If we've got a duplicate Module Id/Reason code go, on to the -        # next one.  We can't have duplicates, so if we do we set found_dup -        # so that we can die after this loop -        if( exists $caseHash{ $modId.$reasonCode } ) -        { -            debugMsg( "Hash exists, skip subsequent." ); - -            # Print a error message -            print "\n#################################################################\n"; -            print "  ERROR - Duplicate hash found for:\n"; -            print "      component     $compName\n"; -            print "      module id     $modId\n"; -            print "      reason code   $reasonCode\n"; -            print "#################################################################\n"; -            $found_dup = 1; -            next; -        } -        else -        { -            $caseHash{ $modId.$reasonCode } = 1; -        } - - -        # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -        # -        # This check will be used to exclude module Ids which aren't set -        # in stone...  I think they should be, but ... -        # So, as more oddities show up, this will need to be modified -        # to accomodate. -        # -        # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -        if( ($modId =~ /see/i) && -            ($modId =~ /task/i) ) -        { -            # Move to the next loop if this tag is invalid. -            debugMsg( "Invalid Mod Id: $modId" ); -            next; -        } -        # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -        print $fh "         case \(\($reasonCode \<\< 8\) \| $modId\) \:\n"; - -        foreach my $tag ( sort keys %$href ) -        { -            $href->{$tag} =~ s/\"/\\\"/g; -            my $line = $href->{$tag}; -            $line =~ s/\n//g; -            print $fh "             i_parser.PrintString( \"$tag\" \, \"$line\"  )\;\n"; -        } -        print $fh "             break;\n\n"; -    } -} - - -################################################################################ -# -# find the namespace of the file. -# -################################################################################ - -sub findNameSpace -{ -    my ( $file ) = @_; -    my $data; -    open(FH, "$file") or die("Cannot open: $file: $!"); -    read(FH, $data, -s FH) or die("Error reading $file: $!"); -    close FH; - -    # get the namespace -    my $namespace = "VOID"; -    while( $data =~ /^namespace(.+?\n)/gm ) -    { -        $namespace = $1; -        $namespace =~ s/\;+$//;     # strip trailing semicolon -        $namespace =~ s/\{+$//;     # strip opening bracket -        $namespace = stripWhitespace( $namespace ); -        $namespaceList{$namespace} = $namespace; -    } -    debugMsg( "Namespace: $namespace" ); -    debugMsg( "   from File: $file" ); -} - - -################################################################################ -# -# Get the Image id -# -################################################################################ -sub getImageId -{ -    my $imageId = `git describe --dirty || echo Unknown-Image \`git rev-parse --short HEAD\``; -    chomp $imageId; - -    if (($imageId =~ m/Unknown-Image/) ||  	# Couldn't find git describe tag. -        ($imageId =~ m/dirty/) ||	 	# Find 'dirty' commit. -        ($imageId =~ m/^.{15}-[1-9]+/))	# Found commits after a tag. -    { -        $imageId = $imageId."/".$ENV{"USER"}; -    } - -    return $imageId; -} | 

