mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 14:02:52 +02:00
f893a29b22
Some of them weren't even used at all, such as the flashrom build script. the bios_extract build script existed but was never used, because we only called (from blobutil) a python script from in there, without actually compiling anything! resources/script/build/src/for Usage, e.g.: ./build src for memtest86plus It also handles fetch. This script is intended largely for those codebases that are quite simple, requiring trivial or no intervention besides running "make". 37 sloc reduction. Not a lot, but the audit continues! These optimisations add up. I started at 3300 sloc in resources/scripts and me target is 2k (2000) sloc. Signed-off-by: Leah Rowe <leah@libreboot.org>
187 lines
4.7 KiB
Bash
Executable File
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 coreboot utils 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 $@
|