Files
lbmk/resources/scripts/update/module/mrc
Leah Rowe 59dba6cfcd merge coreboot/u-boot download logic to one script
they are fundamentally the same, in an lbmk context.

they are downloaded in the same way, and compiled in
the same way!

(Kconfig infrastructure, board-specific code, the way
submodules are used in git, etc)

~200 sloc reduction in resources/scripts

the audit begins

Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-16 22:40:34 +01:00

187 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env sh
# Download Intel MRC images
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e
export PATH="${PATH}:/sbin"
# This file is forked from util/chromeos/crosfirmware.sh in coreboot cfc26ce278
# Changes to it in *this version* are copyright 2021 and 2023 Leah Rowe, under
# the same license as above.
# use updated manifest from wayback machine, when updating mrc.bin,
# and update the other variables below accordingly. current manifest used:
# https://web.archive.org/web/20210211071412/https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf
# the wayback machine is used so that we get the same manifest. google
# does not seem to version the manifest, but archives are available
# variables taken from that manifest:
_board="peppy"
_file="chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin"
_url="https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin.zip"
_url2="https://web.archive.org/web/20200516070928/https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_12239.92.0_peppy_recovery_stable-channel_mp-v3.bin.zip"
_sha1sum="cd5917cbe7f821ad769bf0fd87046898f9e175c8"
_mrc_complete_hash="d18de1e3d52c0815b82ea406ca07897c56c65696"
_mrc_complete="mrc/haswell/mrc.bin"
cbdir="coreboot/default"
cbfstool="cbutils/default/cbfstool"
sname=""
main()
{
sname=${0}
printf "Downloading Intel MRC blobs\n"
check_existing && exit 0
build_dependencies || fail "could not build dependencies"
fetch_mrc || fail "could not fetch mrc.bin"
}
check_existing()
{
if [ ! -f ${_mrc_complete} ]; then
return 1
fi
printf 'found existing mrc.bin, checking its hash\n'
if [ "$(sha1sum ${_mrc_complete} | awk '{print $1}')" \
= "${_mrc_complete_hash}" ]; then
printf 'checksums matched, skipping downloading\n'
return 0
else
printf 'hashes did not match, starting over\n'
return 1
fi
}
build_dependencies()
{
if [ ! -d "${cbdir}/" ]; then
./fetch_trees coreboot default || return 1
fi
./build module cbutils default || return 1
return 0
}
fetch_mrc()
{
mkdir -p mrc/haswell/ || return 1
(
cd mrc/haswell/
download_image ${_url} ${_file} ${_sha1sum}
if [ ! -f ${_file} ]; then
download_image ${_url2} ${_file} ${_sha1sum}
fi
if [ ! -f $_file ]; then
fail "%{_file} not downloaded / verification failed."
fi
extract_partition ROOT-A ${_file} root-a.ext2
extract_shellball root-a.ext2 chromeos-firmwareupdate-${_board}
extract_coreboot chromeos-firmwareupdate-${_board}
../../${cbfstool} coreboot-*.bin extract -f mrc.bin \
-n mrc.bin -r RO_SECTION \
|| fail "Could not fetch mrc.bin"
rm -f "chromeos-firmwareupdate-${_board}" coreboot-*.bin \
"${_file}" "root-a.ext2"
printf "\n\nmrc.bin saved to ${_mrc_complete}\n\n"
)
return 0
}
download_image()
{
url=${1}
_file=${2}
_sha1sum=${3}
echo "Downloading recovery image"
curl "$url" > "$_file.zip"
if [ "$(sha1sum ${_file}.zip | awk '{print $1}')" = "${_sha1sum}" ]
then
unzip -q "${_file}.zip"
rm "${_file}.zip"
echo "Checksum verification passed for recovery image."
return 0
else
rm "${_file}.zip"
echo "Bad checksum. Recovery image deleted."
return 1
fi
}
extract_partition()
{
NAME=${1}
FILE=${2}
ROOTFS=${3}
_bs=1024
echo "Extracting ROOT-A partition"
ROOTP=$( printf "unit\nB\nprint\nquit\n" | \
parted ${FILE} 2>/dev/null | grep ${NAME} )
START=$(( $( echo ${ROOTP} | cut -f2 -d\ | tr -d "B" ) ))
SIZE=$(( $( echo ${ROOTP} | cut -f4 -d\ | tr -d "B" ) ))
dd if=${FILE} of=${ROOTFS} bs=${_bs} skip=$(( ${START} / ${_bs} )) \
count=$(( ${SIZE} / ${_bs} )) > /dev/null
}
extract_shellball()
{
ROOTFS=${1}
SHELLBALL=${2}
echo "Extracting chromeos-firmwareupdate"
printf "cd /usr/sbin\ndump chromeos-firmwareupdate ${SHELLBALL}\nquit" \
| debugfs ${ROOTFS} > /dev/null 2>&1
}
extract_coreboot()
{
_shellball=${1}
_unpacked=$( mktemp -d )
echo "Extracting coreboot image"
sh ${_shellball} --unpack ${_unpacked} > /dev/null
_version=$( cat ${_unpacked}/VERSION | grep BIOS\ version: | \
cut -f2 -d: | tr -d \ )
cp ${_unpacked}/bios.bin coreboot-${_version}.bin
rm -r "${_unpacked}"
}
fail()
{
printf "%s: ERROR: %s\n"
${sname} ${1}
exit 1
}
main $@