| Chirag Sharma | c237e3d | 2020-09-15 12:01:01 -0500 | [diff] [blame] | 1 | #!/bin/bash | 
|  | 2 | # | 
|  | 3 | #Header for BMC DUMP | 
|  | 4 | #This script will create header file only for IBM systems. | 
|  | 5 | #This script will generate generic IBM dump header format. | 
|  | 6 | # | 
|  | 7 | #Note: The dump header will be imposed on the dump file i.e | 
|  | 8 | #<obmdump file>.tar.xz only on IBM specific systems, user needs to | 
|  | 9 | #separate out the header before extracting the dump. | 
|  | 10 | # | 
|  | 11 |  | 
|  | 12 | #Constants | 
|  | 13 | declare -rx INVENTORY_MANAGER='xyz.openbmc_project.Inventory.Manager' | 
|  | 14 | declare -rx INVENTORY_PATH='/xyz/openbmc_project/inventory/system' | 
|  | 15 | declare -rx INVENTORY_ASSET_INT='xyz.openbmc_project.Inventory.Decorator.Asset' | 
|  | 16 | declare -rx DUMP_HEADER_ENTRY_SIZE='516' | 
|  | 17 |  | 
|  | 18 | #Variables | 
|  | 19 | declare -x FILE="/tmp/dumpheader_$EPOCHTIME" | 
|  | 20 | declare -x dumpSize=$(ls -al $name_dir.tar.xz | awk '{print $5}') | 
|  | 21 | declare -x modelNo=$(busctl get-property $INVENTORY_MANAGER $INVENTORY_PATH \ | 
|  | 22 | $INVENTORY_ASSET_INT Model | cut -d " " -f 2 | sed "s/^\(\"\)\(.*\)\1\$/\2/g") | 
|  | 23 |  | 
|  | 24 | declare -x serialNo=$(busctl get-property $INVENTORY_MANAGER $INVENTORY_PATH \ | 
|  | 25 | $INVENTORY_ASSET_INT SerialNumber | cut -d " " -f 2 | sed "s/^\(\"\)\(.*\)\1\$/\2/g") | 
|  | 26 |  | 
|  | 27 | declare -x dDay=$(date -d @$EPOCHTIME +'%Y%m%d%H%M%S') | 
|  | 28 |  | 
|  | 29 | #Function to add NULL | 
|  | 30 | function add_null () { | 
|  | 31 | local a=$1 | 
|  | 32 | printf '%*s' $a | tr ' ' "\0" >> $FILE | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | #Function to fetch the size of the dump | 
|  | 36 | function dump_size () { | 
|  | 37 | #Adding 516 bytes as the total dump size is dump tar size | 
|  | 38 | #plus the dump header entry in this case | 
|  | 39 | #dump_header and dump_entry | 
|  | 40 | sizeDump=`expr $dumpSize + $DUMP_HEADER_ENTRY_SIZE` | 
|  | 41 | printf -v hex "%x" $sizeDump | 
|  | 42 | x=${#hex} | 
|  | 43 | if [ $(($x % 2)) -eq 1 ]; then | 
|  | 44 | hex=0$hex | 
|  | 45 | x=${#hex} | 
|  | 46 | fi | 
|  | 47 | msize=`expr $x / 2` | 
|  | 48 | msize=`expr 8 - $msize` | 
|  | 49 | add_null $msize | 
|  | 50 | for ((i=0;i<$x;i+=2)); | 
|  | 51 | do | 
|  | 52 | printf \\x${hex:$i:2} >> $FILE | 
|  | 53 | done | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 | #Function to set dump id to 8 bytes format | 
|  | 57 | function get_dump_id () { | 
|  | 58 | x=${#dump_id} | 
|  | 59 | nulltoadd=`expr 8 - $x` | 
|  | 60 | printf '%*s' $nulltoadd | tr ' ' "0" >> $FILE | 
|  | 61 | printf $dump_id >> $FILE | 
|  | 62 | } | 
|  | 63 |  | 
|  | 64 | #Function to add virtual file directory entry, consists of below entries | 
|  | 65 | ####################FORMAT################ | 
|  | 66 | #Name              Size(bytes)  Value | 
|  | 67 | #Entry Header      8            FILE | 
|  | 68 | #Entry Size        2            0x0040 | 
|  | 69 | #Reserved          10           NULL | 
|  | 70 | #Entry Type        2            0x0001 | 
|  | 71 | #File Name Prefix  2            0x000F | 
|  | 72 | #Dump File Type    7            BMCDUMP | 
|  | 73 | #Separator         1            . | 
|  | 74 | #System Serial No  7            System serial number fetched from system | 
|  | 75 | #Dump Identifier   8            Dump Identifier value fetched from dump | 
|  | 76 | #Separator         1            . | 
|  | 77 | #Time stamp        14           Form should be yyyymmddhhmmss | 
|  | 78 | #Null Terminator   1            0x00 | 
|  | 79 | function dump_file_entry () { | 
|  | 80 | printf "FILE    " >> $FILE | 
|  | 81 | add_null 1 | 
|  | 82 | printf '\x40' >> $FILE #Virtual file directory entry size | 
|  | 83 | add_null 11 | 
|  | 84 | printf '\x01' >> $FILE | 
|  | 85 | add_null 1 | 
|  | 86 | printf '\x0F' >> $FILE | 
|  | 87 | printf "BMPDUMP.%s." "$serialNo" >> $FILE | 
|  | 88 | get_dump_id | 
|  | 89 | printf "." >> $FILE | 
|  | 90 | printf $dDay >> $FILE  #UTC time stamp | 
|  | 91 | add_null 1 | 
|  | 92 | } | 
|  | 93 |  | 
|  | 94 | #Function section directory entry, consists of below entries | 
|  | 95 | ####################FORMAT################ | 
|  | 96 | #Name              Size(bytes)  Value | 
|  | 97 | #Entry Header      8            SECTION | 
|  | 98 | #Entry Size        2            0x0030 | 
|  | 99 | #Section Priority  2            0x0000 | 
|  | 100 | #Reserved          4            NULL | 
|  | 101 | #Entry Flags       4            0x00000001 | 
|  | 102 | #Entry Types       2            0x0002 | 
|  | 103 | #Reserved          2            NULL | 
|  | 104 | #Dump Size         8            Dump size in hex + dump header | 
|  | 105 | #Optional Section  16           BMCDUMP | 
|  | 106 | function dump_section_entry () { | 
|  | 107 | printf "SECTION " >> $FILE | 
|  | 108 | add_null 1 | 
|  | 109 | printf '\x30' >> $FILE #Section entry size | 
|  | 110 | add_null 9 | 
|  | 111 | printf '\x01' >> $FILE | 
|  | 112 | add_null 1 | 
|  | 113 | printf '\x02' >> $FILE | 
|  | 114 | add_null 2 | 
|  | 115 | dump_size    #Dump size | 
|  | 116 | printf "BMCDUMP" >> $FILE | 
|  | 117 | add_null 9 | 
|  | 118 | } | 
|  | 119 |  | 
|  | 120 | #Function to add dump header, consists of below entries | 
|  | 121 | ####################FORMAT################ | 
|  | 122 | #Name              Size(bytes)  Value | 
|  | 123 | #Dump type         8            BMC DUMP | 
|  | 124 | #Dump Request time 8            Dump request time stamp (in BCD) | 
|  | 125 | #Dump Identifier   4            Dump identifer fetched from dump | 
|  | 126 | #Dump version      2            0x0210 | 
|  | 127 | #Dump header       2            0x200 | 
|  | 128 | #Total dump size   8            Dump size + dump header | 
|  | 129 | #Panel function    32           System model, feature, type and IPL mode | 
|  | 130 | #System Name       32           System Name (in ASCII) | 
|  | 131 | #Serial number     7            System serial number | 
|  | 132 | #Reserved          1            NULL | 
|  | 133 | #PLID              4            Comes from errorlog | 
|  | 134 | #File Header Size  2            0x70 | 
|  | 135 | #Dump SRC Size     2            Dump SRC Size. Currently NULL | 
|  | 136 | #DUMP SRC          356          DUMP SRC. Currently NULL | 
|  | 137 | #Dump Req Type     4            Dump requester user interface type. | 
|  | 138 | #Dump Req ID       32           Dump requester user interface ID | 
|  | 139 | #Dump Req user ID  8            Dump requester user ID. Currently NULL | 
|  | 140 | # | 
|  | 141 | #TODO: Github issue #3707, to populate the unpopulated elements. | 
|  | 142 | #Note: Unpopulated elements are listed below are set as NULL | 
|  | 143 | #BCD time stamp | 
|  | 144 | #PLID | 
|  | 145 | #SRC size | 
|  | 146 | #SRC dump | 
|  | 147 | #Dump requestor | 
|  | 148 | #Dump requestor user interface ID | 
|  | 149 | #Dump Requester user ID | 
|  | 150 | function dump_header () { | 
|  | 151 | printf "BMC DUMP" >> $FILE | 
|  | 152 | add_null 8 #BCD time stamp | 
|  | 153 | add_null 4 #Dump Identifier | 
|  | 154 | printf '\x02' >> $FILE #Dump version 0x0210 | 
|  | 155 | printf '\x10' >> $FILE | 
|  | 156 | printf '\x02' >> $FILE #Dump header size 0x0200 | 
|  | 157 | add_null 1 | 
|  | 158 | dump_size  #dump size | 
|  | 159 | printf $modelNo >> $FILE | 
|  | 160 | add_null 24 | 
|  | 161 | printf "Server-%s-SN-%s" "$modelNo" "$serialNo" >> $FILE | 
|  | 162 | add_null 7 | 
|  | 163 | printf $serialNo >> $FILE | 
|  | 164 | add_null 1 | 
|  | 165 | add_null 4 #PLID | 
|  | 166 | printf '\x70' >> $FILE #File header size | 
|  | 167 | add_null 2 # SRC size | 
|  | 168 | add_null 356 # SRC dump | 
|  | 169 | add_null 4 # Dump requester | 
|  | 170 | add_null 32 # Dump requester user interface ID | 
|  | 171 | add_null 8 | 
|  | 172 | } | 
|  | 173 |  | 
|  | 174 | #Function to add Dump entry, consists of below entries | 
|  | 175 | ####################FORMAT################ | 
|  | 176 | #Name               Size(bytes)  Value | 
|  | 177 | #Dump Entry Version 1            0x01 | 
|  | 178 | #BMC Dump Valid     1            0x01 | 
|  | 179 | #No of Dump Entry   2            Number of Dump Entry | 
|  | 180 | # | 
|  | 181 | #TODO: Github issue #3707, to populate the unpopulated elements. | 
|  | 182 | #Note: Unpopulated elements are listed below, currently are set as NULL | 
|  | 183 | #Number of Dump Entry | 
|  | 184 | function dump_entry () { | 
|  | 185 | printf '\x01' >> $FILE #Dump entry version | 
|  | 186 | printf '\x01' >> $FILE #Dump valid | 
|  | 187 | add_null 2 | 
|  | 188 | } | 
|  | 189 |  | 
|  | 190 | #main function | 
|  | 191 | function gen_header_package () { | 
|  | 192 | dump_file_entry | 
|  | 193 | dump_section_entry | 
|  | 194 | dump_header | 
|  | 195 | dump_entry | 
|  | 196 | } | 
|  | 197 |  | 
|  | 198 | #Run gen_header_package | 
|  | 199 | gen_header_package |