#!/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 . # [ "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="${cbdir}/util/cbfstool/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 ./download coreboot default || return 1 fi if [ ! -f "${cbfstool}" ]; then ./build module cbutils default || return 1 fi 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 $@