mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 22:12:40 +02:00
137b5434d7
the --nuke option in ifdtool will be used instead, to nuke the ME regions in specific rom sets (and cbfstool will be used to delete mrc.bin files from rom sets) the new method being implemented is heavier on disk io, but simplifies lbmk, and disk io could still be optimised in the following ways: * when copying roms from boards with ME in them, use ifdtool --nuke to get filename.rom.new, and *move* (not copy) filename.rom.new to the new destination (for use with tar) * possibly modify ifdtool to make efficient use of mmap for disk i/o; it currently loads entire roms into an allocated buffer in memory
146 lines
3.3 KiB
Bash
Executable File
146 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# SPDX-FileCopyrightText: 2022 Caleb La Grange <thonkpeasant@protonmail.com>
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
board="${1}"
|
|
# A shorthand for each board so as not to duplicate blobs for boards of different sizes
|
|
board_short=${board%%_*mb}
|
|
|
|
Fail(){
|
|
printf "\nERROR: $@\n"
|
|
exit 1
|
|
}
|
|
|
|
Download_needed(){
|
|
for need in ${needs}; do
|
|
case ${need} in
|
|
*ME*)
|
|
Extract_me || _failed+=" me"
|
|
;;
|
|
*MRC*)
|
|
./download mrc || _failed+=" mrc"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ ! -z ${_failed+x} ]; then
|
|
Fail "failed to obtain ${_failed}\nYou may try manually extracting blobs with './blobutil extract'"
|
|
fi
|
|
}
|
|
|
|
Extract_me(){
|
|
_me_destination=${CONFIG_ME_BIN_PATH#../../}
|
|
|
|
if [ -f "${_me_destination}" ]; then
|
|
printf 'me already downloaded\n'
|
|
return 0
|
|
fi
|
|
|
|
if [ -z "${me_dl+x}" ]; then
|
|
printf 'no me download available for this board\n'
|
|
return 1
|
|
fi
|
|
|
|
if [ ! -d "${_me_destination%/*}" ]; then
|
|
mkdir -p ${_me_destination%/*}
|
|
fi
|
|
|
|
printf "Extracting neutered me for ${board}\n"
|
|
|
|
# Delete old me downloads in case user is building for multiple boards
|
|
if [ -f "blobs/me.exe" ]; then
|
|
rm blobs/me.exe
|
|
fi
|
|
|
|
if [ -d "blobs/app" ]; then
|
|
rm -r blobs/app
|
|
fi
|
|
|
|
curl ${me_dl} > blobs/me.exe || curl ${me_dl_bkup} > blobs/me.exe
|
|
|
|
if [ "$(sha1sum blobs/me.exe | awk '{print $1}')" != "${me_hash}" ]; then
|
|
printf 'checksum of downloaded me did not mactch\ncorrupted me downloaded or wrong me for board\n'
|
|
rm blobs/me.exe
|
|
return 1
|
|
fi
|
|
|
|
printf 'extracting and stripping intel management engine\n'
|
|
innoextract blobs/me.exe -d blobs || Fail 'could not extract me executable with innoextract'
|
|
./me_cleaner/me_cleaner.py -r -t -O ${_me_destination} blobs/app/*ME*.bin \
|
|
|| ./resources/blobs/me7_update_parser.py -O ${_me_destination} blobs/app/ME7*.bin \
|
|
|| return 1
|
|
printf "Truncated and cleaned me output to ${_me_destination}\n"
|
|
}
|
|
|
|
Build_deps(){
|
|
if [ ! -d me_cleaner ]; then
|
|
printf "downloading me_cleaner\n"
|
|
./download me_cleaner || Fail 'could not download me_cleaner'
|
|
fi
|
|
|
|
if [ ! -d coreboot/default ]; then
|
|
printf "downloading coreboot\n"
|
|
./download coreboot default || Fail 'could not download coreboot'
|
|
fi
|
|
|
|
if [ ! -f "coreboot/default/util/ifdtool/ifdtool" ]; then
|
|
printf "building ifdtool from coreboot\n"
|
|
make -C coreboot/default/util/ifdtool || Fail 'could not build ifdtool'
|
|
fi
|
|
}
|
|
|
|
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'
|
|
needs+=" MRC"
|
|
|
|
fi
|
|
|
|
if [ "${CONFIG_HAVE_IFD_BIN}" = "y" ]; then
|
|
printf 'board needs intel firmware descriptor\n'
|
|
needs+=" IFD"
|
|
fi
|
|
|
|
if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
|
|
printf 'board needs intel management engine\n'
|
|
needs+=" ME"
|
|
fi
|
|
|
|
if [ "${CONFIG_HAVE_GBE_BIN}" = "y" ]; then
|
|
printf 'board needs gigabit ethernet firmware\n'
|
|
needs+=" GBE"
|
|
fi
|
|
|
|
# Quickly exit without wasting more time if there are no blobs needed (GM45)
|
|
if [ -z ${needs+x} ]; then
|
|
printf 'No binary blobs needed for this board\n'
|
|
exit 0
|
|
fi
|
|
|
|
Build_deps
|
|
|
|
while read -r line ; do
|
|
case ${line} in
|
|
ME_hash*)
|
|
set ${line}
|
|
me_hash=${2}
|
|
;;
|
|
ME_dl*)
|
|
set ${line}
|
|
me_dl=${2}
|
|
;;
|
|
ME_bkup_dl*)
|
|
set ${line}
|
|
me_dl_bkup=${2}
|
|
;;
|
|
esac
|
|
done <<< $(eval "awk ' /\{.*${board_short}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }' resources/blobs/sources")
|
|
|
|
Download_needed
|
|
|
|
|