mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-03-27 22:59:01 +02:00
the error messages that it shows are benign, but users see them and worry that something went wrong this patch reduces the number of people asking pointless questions on irc Signed-off-by: Leah Rowe <leah@libreboot.org>
123 lines
3.1 KiB
Bash
Executable File
123 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
# 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
|
|
|
|
. "include/err.sh"
|
|
|
|
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}
|
|
[ $# -lt 2 ] && err "Missing arguments (fewer than two)."
|
|
|
|
board="${1}"
|
|
vendor_rom="${2}"
|
|
boarddir="${cbcfgsdir}/${board}"
|
|
|
|
check_board
|
|
build_dependencies
|
|
extract_blobs
|
|
}
|
|
|
|
check_board()
|
|
{
|
|
if [ ! -f "${vendor_rom}" ]; then
|
|
err "check_board: ${board}: file does not exist: ${vendor_rom}"
|
|
elif [ ! -d "${boarddir}" ]; then
|
|
err "check_board: ${board}: target not defined"
|
|
elif [ ! -f "${boarddir}/target.cfg" ]; then
|
|
err "check_board: ${board}: missing target.cfg"
|
|
fi
|
|
}
|
|
|
|
build_dependencies()
|
|
{
|
|
if [ ! -d me_cleaner ]; then
|
|
./fetch me_cleaner || \
|
|
err "build_dependencies: can't fetch me_cleaner"
|
|
elif [ ! -d "${cbdir}" ]; then
|
|
./fetch_trees coreboot default || \
|
|
err "build_dependencies: can't fetch coreboot"
|
|
elif [ ! -f "${ifdtool}" ]; then
|
|
make -C "${ifdtool%/ifdtool}" || \
|
|
err "build_dependencies: can't build ifdtool"
|
|
fi
|
|
}
|
|
|
|
extract_blobs()
|
|
{
|
|
printf "extracting blobs for %s from %s\n" ${board} ${vendor_rom}
|
|
|
|
set -- "${boarddir}/config/"*
|
|
. "${1}" 2>/dev/null
|
|
. "${boarddir}/target.cfg"
|
|
|
|
[ "$CONFIG_HAVE_MRC" != "y" ] || \
|
|
./update blobs mrc || err "extract_blobs: can't fetch mrc"
|
|
|
|
_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 || err "extract_blobs: !rm -f flashregion*.bin"
|
|
|
|
[ -f "${_ifd_destination}" ] || err "extract_blobs: Cannot extract IFD"
|
|
printf "gbe, ifd, and me extracted to %s\n" "${_me_destination%/*}"
|
|
}
|
|
|
|
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}" || \
|
|
err "extract_blob_intel_me: cannot extract from vendor rom"
|
|
}
|
|
|
|
extract_blob_intel_gbe_nvm()
|
|
{
|
|
printf "extracting gigabit ethernet firmware"
|
|
./"${ifdtool}" -x "${vendor_rom}" || \
|
|
err "extract_blob_intel_gbe_nvm: cannot extract gbe.bin from rom"
|
|
mv flashregion*gbe.bin "${_gbe_destination}" || \
|
|
err "extract_blob_intel_gbe_nvm: cannot move gbe.bin"
|
|
}
|
|
|
|
print_help()
|
|
{
|
|
printf "Usage: ./update blobs extract {boardname} {path/to/vendor_rom}\n"
|
|
printf "Example: ./update blobs extract x230 12mb_flash.bin\n"
|
|
printf "\nYou need to specify exactly 2 arguments\n"
|
|
}
|
|
|
|
main $@
|