diff options
Diffstat (limited to 'resources/scripts/blobs/extract')
-rwxr-xr-x | resources/scripts/blobs/extract | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/resources/scripts/blobs/extract b/resources/scripts/blobs/extract new file mode 100755 index 00000000..cdb55cfe --- /dev/null +++ b/resources/scripts/blobs/extract @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# script to automate extracting blobs from an existing vendor bios + +# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com> +# SPDX-License-Identifier: GPL-3.0-only + +board="${1}" +vendor_rom="${2}" + +Print_help(){ + printf "Usage: ./blobutil extract {boardname} {path/to/vendor_rom}\n" + printf "Example: ./blobutil extract x230 12mb_flash.bin\n" + printf "\nYou need to specify exactly 2 arguments\n" +} + +Build_deps(){ + if [ ! -d me_cleaner ]; then + printf "downloading me_cleaner\n" + ./download me_cleaner + else + printf "me_cleaner already downloaded. Skipping.\n" + printf "run ./download me_cleaner to manually overwrite\n" + fi + + if [ ! -d coreboot/default ]; then + printf "downloading coreboot\n" + ./download coreboot default + else + printf "coreboot already downloaded. Skipping.\n" + printf "run ./download coreboot to manually overwrite\n" + fi + + printf "building ifdtool from coreboot\n" + ( cd coreboot/default/util/ifdtool && make ) +} + +Error_out(){ + printf "failed to extract ${1}\nmake sure that your rom dump is valid\n" + exit 1 +} + + +Extract_blobs(){ + # TODO: find a better way to know which coreboot config to source + set -- "resources/coreboot/${board}/config/*" + . ${1} 2>/dev/null + . "resources/coreboot/${board}/board.cfg" + + if [ "$CONFIG_HAVE_MRC" = "y" ]; then + printf 'haswell board detected, downloading mrc\n' + ./download mrc + fi + + _me_destination=${CONFIG_ME_BIN_PATH#../../} + _gbe_destination=${CONFIG_GBE_BIN_PATH#../../} + _ifd_destination=${CONFIG_IFD_BIN_PATH#../../} + + printf "extracting clean ime and modified ifd\n" + ./me_cleaner/me_cleaner.py -D ${_ifd_destination} -M ${_me_destination} ${vendor_rom} -t -r -S || Error_out me + + printf "extracting gigabit ethernet firmware" + ./coreboot/default/util/ifdtool/ifdtool -x ${vendor_rom} + mv flashregion*gbe.bin ${_gbe_destination} || Error_out gbe + + # Cleans up other files extracted with ifdtool + rm flashregion*.bin 2> /dev/null + printf "gbe, ifd, and me extracted to ${_me_destination%/*}\n" +} + +if [ ! -f "${vendor_rom}" ] ; then + Print_help + exit 1 +fi + +if [ ! -d "resources/coreboot/${board}" ]; then + Print_help + printf "build/roms: Target %s does not exist in the %s build system. Skipping build.\n" "${projectname}" "${board}" + exit 1 +fi + +if [ ! -f "resources/coreboot/${board}/board.cfg" ]; then + Print_help + printf "build/roms: Target %s does not have a board.cfg. Skipping build.\n" "${board}" + exit 1 +fi + +printf "extracting blobs for ${board} from ${vendor_rom}\n" +Build_deps +Extract_blobs |