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