diff options
Diffstat (limited to 'resources/scripts/update/blobs/extract')
-rwxr-xr-x | resources/scripts/update/blobs/extract | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/resources/scripts/update/blobs/extract b/resources/scripts/update/blobs/extract new file mode 100755 index 00000000..8e9c74ed --- /dev/null +++ b/resources/scripts/update/blobs/extract @@ -0,0 +1,150 @@ +#!/usr/bin/env bash +# script to automate extracting blobs from an existing vendor bios + +# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com> +# SPDX-FileCopyrightText: 2023 Leah Rowe <leah@libreboot.org> +# SPDX-License-Identifier: GPL-3.0-only + +sname="" +board="" +vendor_rom="" + +cbdir="coreboot/default" +cbcfgsdir="resources/coreboot" +ifdtool="${cbdir}/util/ifdtool/ifdtool" +mecleaner="me_cleaner/me_cleaner.py" +me7updateparser="resources/blobs/me7_update_parser.py" + +boarddir="" + +CONFIG_HAVE_MRC="" +CONFIG_ME_BIN_PATH="" +CONFIG_GBE_BIN_PATH="" +CONFIG_IFD_BIN_PATH="" + +_me_destination="" +_gbe_destination="" +_ifd_destination="" + +main() +{ + sname=${0} + if [ $# -lt 2 ]; then + fail "Missing arguments (less than two)." + fi + + board="${1}" + vendor_rom="${2}" + + boarddir="${cbcfgsdir}/${board}" + + check_board + build_dependencies + extract_blobs +} + +check_board() +{ + if [ ! -f "${vendor_rom}" ] ; then + fail "file does not exist: ${vendor_rom}" + elif [ ! -d "${boarddir}" ]; then + fail "build/roms ${board}: target not defined" + elif [ ! -f "${boarddir}/board.cfg" ]; then + fail "build/roms ${board}: missing board.cfg" + fi +} + +build_dependencies() +{ + if [ ! -d me_cleaner ]; then + printf "downloading me_cleaner\n" + ./download me_cleaner || fail 'could not download me_cleaner' + else + printf "me_cleaner already downloaded. Skipping.\n" + printf "run ./download me_cleaner to manually overwrite\n" + fi + + if [ ! -d ${cbdir} ]; then + printf "downloading coreboot\n" + ./download coreboot default \ + || fail "could not download coreboot" + else + printf "coreboot already downloaded. Skipping.\n" + printf "run ./download coreboot to manually overwrite\n" + fi + + if ! [ -f ${ifdtool} ]; then + printf "building ifdtool from coreboot\n" + make -C "${ifdtool%/ifdtool}" \ + || fail "could not build ifdtool" + fi +} + +extract_blobs() +{ + printf "extracting blobs for %s from %s\n" ${board} ${vendor_rom} + + set -- "${boarddir}/config/"* + . ${1} 2>/dev/null + . "${boarddir}/board.cfg" + + if [ "$CONFIG_HAVE_MRC" = "y" ]; then + printf 'haswell board detected, downloading mrc\n' + ./download mrc || fail "could not download mrc" + fi + + _me_destination=${CONFIG_ME_BIN_PATH#../../} + _gbe_destination=${CONFIG_GBE_BIN_PATH#../../} + _ifd_destination=${CONFIG_IFD_BIN_PATH#../../} + + extract_blob_intel_me + extract_blob_intel_gbe_nvm + + # Cleans up other files extracted with ifdtool + rm -f flashregion*.bin 2> /dev/null + + if [ -f ${_ifd_destination} ]; then + printf "gbe, ifd, and me extracted to %s\n" \ + ${_me_destination%/*} + else + printf "WARNING: Intel firmware descriptor could not " + printf "be extracted with modified me\n" + fi +} + +extract_blob_intel_me() +{ + printf "extracting clean ime and modified ifd\n" + + ${mecleaner} -D ${_ifd_destination} \ + -M ${_me_destination} ${vendor_rom} -t -r -S \ + || ${me7updateparser} \ + -O ${_me_destination} ${vendor_rom} \ + || fail \ + "me_cleaner failed to extract blobs from rom" +} + +extract_blob_intel_gbe_nvm() +{ + printf "extracting gigabit ethernet firmware" + ./${ifdtool} -x ${vendor_rom} + mv flashregion*gbe.bin ${_gbe_destination} \ + || fail 'could not extract gbe' +} + +fail() +{ + print_help + + printf "\n%s: ERROR: %s\n" ${sname} $@ + exit 1 +} + +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" +} + +main $@ |