diff options
Diffstat (limited to 'util')
-rwxr-xr-x | util/chromeos/extract_blobs.sh | 124 |
1 files changed, 100 insertions, 24 deletions
diff --git a/util/chromeos/extract_blobs.sh b/util/chromeos/extract_blobs.sh index 39f2a3b4e9..74b52205ea 100755 --- a/util/chromeos/extract_blobs.sh +++ b/util/chromeos/extract_blobs.sh @@ -2,40 +2,116 @@ # # SPDX-License-Identifier: GPL-2.0-only -set -x +if [ ! -f "$1" ]; then + echo "Error: You must provide a valid filename" + exit 1 +fi IMAGE=$1 +# create new dir '$IMAGE-blobs' (less file extension) +DIR=$(basename $IMAGE) +DIR="${DIR%.*}-blobs" +mkdir -p $DIR -if [ ! -r "$IMAGE" ]; then - echo "Can't find image $IMAGE." - exit 1 +if [ -f ./cbfstool ]; then + CBFSTOOL="./cbfstool" +else + CBFSTOOL=$(command -v cbfstool) +fi +if [[ "$CBFSTOOL" = "" ]]; then + echo "Error: cbfstool must be in your path or exist locally" + exit 1 fi -CBFSTOOL=$(which cbfstool) -if [ $? != 0 ]; then - echo "Can't find cbfstool." - exit 1 +if [ -f ./ifdtool ]; then + IFDTOOL="./ifdtool" +else + IFDTOOL=$(which ifdtool) +fi +if [[ "$IFDTOOL" = "" ]]; then + echo "Error: ifdtool must be in your path or exist locally" + exit 1 fi -IFDTOOL=$(which ifdtool) -if [ $? != 0 ]; then - echo "Can't find ifdtool." - exit 1 +# ensure valid coreboot image / get list of main COREBOOT CBFS contents +REGION="" +if ! $CBFSTOOL $IMAGE print >$DIR/cbfs.txt 2>/dev/null; then + # try using BOOT_STUB region + if ! $CBFSTOOL $IMAGE print -r BOOT_STUB >$DIR/cbfs.txt; then + echo "Error reading CBFS: $IMAGE is not a valid coreboot image" + exit 1 + else + REGION="-r BOOT_STUB" + fi fi -$CBFSTOOL $IMAGE print +echo "" +echo "Extracting blobs..." +echo "" -if [ $? -ne 0 ]; then - echo "Not a coreboot image: $IMAGE" - exit 1 +# extract flash regions +if ! $IFDTOOL -x $IMAGE >/dev/null; then + echo "Error reading flash descriptor/extracting flash regions" + exit 1 fi +# rename to normal convention; drop unused regions +mv flashregion_0_flashdescriptor.bin $DIR/flashdescriptor.bin +[ -f flashregion_2_intel_me.bin ] && mv flashregion_2_intel_me.bin $DIR/me.bin +rm flashregion_*.bin -PCI=$($CBFSTOOL $IMAGE print|grep pci|cut -f1 -d\ ) -MRC=$($CBFSTOOL $IMAGE print|grep mrc.bin|cut -f1 -d\ ) +# extract microcode +$CBFSTOOL $IMAGE extract $REGION -n cpu_microcode_blob.bin -f $DIR/cpu_microcode_blob.bin -$CBFSTOOL $IMAGE extract -n $PCI -f $PCI -$CBFSTOOL $IMAGE extract -n $MRC -f $MRC -$IFDTOOL -x $IMAGE -mv flashregion_0_flashdescriptor.bin flashdescriptor.bin -mv flashregion_2_intel_me.bin me.bin -rm flashregion_*.bin +# extract VGA BIOS +VGA=$(grep pci $DIR/cbfs.txt | cut -f1 -d\ ) +if [ "$VGA" != "" ]; then + $CBFSTOOL $IMAGE extract $REGION -n $VGA -f $DIR/vgabios.bin +fi + +# extract MRC.bin +MRC=$(grep mrc.bin $DIR/cbfs.txt | cut -f1 -d\ ) +if [ "$MRC" != "" ]; then + $CBFSTOOL $IMAGE extract $REGION -n "$MRC" -f "$DIR/$MRC" +fi + +# extract refcode +REF=$(grep refcode $DIR/cbfs.txt | cut -f1 -d\ ) +if [ "$REF" != "" ]; then + $CBFSTOOL $IMAGE extract $REGION -n fallback/refcode -f "$DIR/refcode.elf" -m x86 +fi + +# extract FSP blobs +for FSP in $(grep fsp $DIR/cbfs.txt | cut -f1 -d\ ); do + $CBFSTOOL $IMAGE extract $REGION -n $FSP -f $DIR/$FSP +done + +# extract audio blobs +for AUD in $(grep -e "-2ch-" -e "-4ch-" $DIR/cbfs.txt | cut -f1 -d\ ); do + $CBFSTOOL $IMAGE extract $REGION -n $AUD -f $DIR/$AUD +done + +# extract VBTs +for VBT in $(grep vbt $DIR/cbfs.txt | cut -f1 -d\ ); do + $CBFSTOOL $IMAGE extract $REGION -n $VBT -f $DIR/$VBT +done + +# extract IFWI +IFWI=$(cbfstool $IMAGE layout -w | grep IFWI) +if [ "$IFWI" != "" ]; then + $CBFSTOOL $IMAGE read -r IFWI -f $DIR/ifwi.bin +fi + +# generate hashes +( + cd $DIR + : >hashes.txt + for FILE in $(ls *.{bin,elf} 2>/dev/null); do + sha256sum $FILE >>hashes.txt + done +) + +# a little housekeeping +rm $DIR/cbfs.txt + +echo "" +echo "All done" |