Yegor Timoshenko | c2e4941 | 2018-10-07 01:58:27 +0000 | [diff] [blame] | 1 | #!/usr/bin/env bash |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 2 | # |
Patrick Georgi | 7333a11 | 2020-05-08 20:48:04 +0200 | [diff] [blame] | 3 | # SPDX-License-Identifier: GPL-2.0-only |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 4 | |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 5 | if [ ! -f "$1" ]; then |
| 6 | echo "Error: You must provide a valid filename" |
| 7 | exit 1 |
| 8 | fi |
Yegor Timoshenko | c2e4941 | 2018-10-07 01:58:27 +0000 | [diff] [blame] | 9 | |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 10 | IMAGE=$1 |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 11 | # create new dir '$IMAGE-blobs' (less file extension) |
| 12 | DIR=$(basename $IMAGE) |
| 13 | DIR="${DIR%.*}-blobs" |
| 14 | mkdir -p $DIR |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 15 | |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 16 | if [ -f ./cbfstool ]; then |
| 17 | CBFSTOOL="./cbfstool" |
| 18 | else |
| 19 | CBFSTOOL=$(command -v cbfstool) |
| 20 | fi |
| 21 | if [[ "$CBFSTOOL" = "" ]]; then |
| 22 | echo "Error: cbfstool must be in your path or exist locally" |
| 23 | exit 1 |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 24 | fi |
| 25 | |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 26 | if [ -f ./ifdtool ]; then |
| 27 | IFDTOOL="./ifdtool" |
| 28 | else |
| 29 | IFDTOOL=$(which ifdtool) |
| 30 | fi |
| 31 | if [[ "$IFDTOOL" = "" ]]; then |
| 32 | echo "Error: ifdtool must be in your path or exist locally" |
| 33 | exit 1 |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 34 | fi |
| 35 | |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 36 | # ensure valid coreboot image / get list of CBFS contents |
| 37 | # try using RW_MAIN_A region first as it may contain newer |
| 38 | # files / files not present in the COREBOOT region |
| 39 | if $CBFSTOOL $IMAGE print -r FW_MAIN_A >$DIR/cbfs.txt 2>/dev/null; then |
| 40 | REGION="FW_MAIN_A" |
| 41 | elif $CBFSTOOL $IMAGE print -r COREBOOT >$DIR/cbfs.txt; then |
| 42 | # use COREBOOT region |
| 43 | REGION="COREBOOT" |
| 44 | elif $CBFSTOOL $IMAGE print -r BOOT_STUB >$DIR/cbfs.txt; then |
| 45 | # use BOOT_STUB region |
| 46 | REGION="BOOT_STUB" |
| 47 | else |
| 48 | echo "Error reading CBFS: $IMAGE is not a valid coreboot image" |
| 49 | exit 1 |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 50 | fi |
| 51 | |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 52 | echo "" |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 53 | echo "Extracting blobs from region $REGION..." |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 54 | echo "" |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 55 | |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 56 | # extract flash regions |
| 57 | if ! $IFDTOOL -x $IMAGE >/dev/null; then |
| 58 | echo "Error reading flash descriptor/extracting flash regions" |
| 59 | exit 1 |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 60 | fi |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 61 | # rename to normal convention; drop unused regions |
| 62 | mv flashregion_0_flashdescriptor.bin $DIR/flashdescriptor.bin |
| 63 | [ -f flashregion_2_intel_me.bin ] && mv flashregion_2_intel_me.bin $DIR/me.bin |
Joe Pillow | 9a4881a | 2016-02-19 15:18:14 -0800 | [diff] [blame] | 64 | rm flashregion_*.bin |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 65 | |
| 66 | # extract microcode |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 67 | $CBFSTOOL $IMAGE extract -r $REGION -n cpu_microcode_blob.bin -f $DIR/cpu_microcode_blob.bin |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 68 | |
| 69 | # extract VGA BIOS |
| 70 | VGA=$(grep pci $DIR/cbfs.txt | cut -f1 -d\ ) |
| 71 | if [ "$VGA" != "" ]; then |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 72 | $CBFSTOOL $IMAGE extract -r $REGION -n $VGA -f $DIR/vgabios.bin |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 73 | fi |
| 74 | |
| 75 | # extract MRC.bin |
| 76 | MRC=$(grep mrc.bin $DIR/cbfs.txt | cut -f1 -d\ ) |
| 77 | if [ "$MRC" != "" ]; then |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 78 | $CBFSTOOL $IMAGE extract -r $REGION -n "$MRC" -f "$DIR/$MRC" |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 79 | fi |
| 80 | |
| 81 | # extract refcode |
| 82 | REF=$(grep refcode $DIR/cbfs.txt | cut -f1 -d\ ) |
| 83 | if [ "$REF" != "" ]; then |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 84 | $CBFSTOOL $IMAGE extract -r $REGION -n fallback/refcode -f "$DIR/refcode.elf" -m x86 |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 85 | fi |
| 86 | |
| 87 | # extract FSP blobs |
| 88 | for FSP in $(grep fsp $DIR/cbfs.txt | cut -f1 -d\ ); do |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 89 | $CBFSTOOL $IMAGE extract -r $REGION -n $FSP -f $DIR/$FSP |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 90 | done |
| 91 | |
| 92 | # extract audio blobs |
| 93 | for AUD in $(grep -e "-2ch-" -e "-4ch-" $DIR/cbfs.txt | cut -f1 -d\ ); do |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 94 | $CBFSTOOL $IMAGE extract -r $REGION -n $AUD -f $DIR/$AUD |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 95 | done |
| 96 | |
| 97 | # extract VBTs |
| 98 | for VBT in $(grep vbt $DIR/cbfs.txt | cut -f1 -d\ ); do |
Matt DeVillier | 0923c62 | 2022-10-15 12:04:08 -0500 | [diff] [blame] | 99 | $CBFSTOOL $IMAGE extract -r $REGION -n $VBT -f $DIR/$VBT |
Matt DeVillier | 648a44a | 2021-11-12 10:23:21 -0600 | [diff] [blame] | 100 | done |
| 101 | |
| 102 | # extract IFWI |
| 103 | IFWI=$(cbfstool $IMAGE layout -w | grep IFWI) |
| 104 | if [ "$IFWI" != "" ]; then |
| 105 | $CBFSTOOL $IMAGE read -r IFWI -f $DIR/ifwi.bin |
| 106 | fi |
| 107 | |
| 108 | # generate hashes |
| 109 | ( |
| 110 | cd $DIR |
| 111 | : >hashes.txt |
| 112 | for FILE in $(ls *.{bin,elf} 2>/dev/null); do |
| 113 | sha256sum $FILE >>hashes.txt |
| 114 | done |
| 115 | ) |
| 116 | |
| 117 | # a little housekeeping |
| 118 | rm $DIR/cbfs.txt |
| 119 | |
| 120 | echo "" |
| 121 | echo "All done" |