diff options
author | Matt DeVillier <matt.devillier@gmail.com> | 2021-11-12 10:23:21 -0600 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2022-01-27 22:06:10 +0000 |
commit | 648a44acbc0d1fb96761918a90f62547765fe8d2 (patch) | |
tree | 0664088edd8c1bbfd3f0d8db6d41c6ee65fc42cf /util/chromeos | |
parent | ef8a1390b2fc01ad179cb798d4a207544efc7f90 (diff) |
util/chromeos: Update extract_blobs script
- Handle older CrOS firmware which lacks a COREBOOT FMAP region
- Add support for all blobs used in CrOS firmware 2013 to current
- Put extracted blobs in their own directory
Change-Id: Idaa39eca3be68a9327cead9b21c35a6c7a3a8166
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/59266
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'util/chromeos')
-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" |