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 |