Files
lbmk/resources/scripts/blobs/download
T
Leah Rowe 137b5434d7 remove logic for avoiding nonredistributable blobs
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
2022-12-05 00:10:07 +00:00

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