#!/bin/bash # 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/>. # # This script assumes that the working directory is the # root of osboot_src or osboot git. # This file is forked from util/chromeos/crosfirmware.sh in coreboot cfc26ce278 # Changes to it in osboot are copyright 2021 Leah Rowe [ "x${DEBUG+set}" = 'xset' ] && set -v set -u -e # On some systems, `parted` and `debugfs` are located in /sbin. export PATH="${PATH}:/sbin" 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}" } check_existing() { _mrc_complete_hash="d18de1e3d52c0815b82ea406ca07897c56c65696" if [ -f mrc/haswell/mrc.bin ]; then printf 'found existing mrc.bin, checking its hash\n' if [ "$(sha1sum mrc/haswell/mrc.bin | awk '{print $1}')" = "${_mrc_complete_hash}" ]; then printf 'checksums matched, skipping redownloading image\n' return 0 else printf 'hashes did not match, starting over\n' return 1 fi else return 1 fi } # Skips redownloading every time the script runs check_existing && exit 0 if [ ! -d "coreboot/default/" ]; then ./download coreboot default fi if [ ! -f "coreboot/default/util/cbfstool/cbfstool" ]; then ./build module cbutils default fi # Remove the old version that may still exist # ------------------------------------------------------------------------------ printf "Downloading Intel MRC blobs\n" #rm -Rf "mrc/" mkdir -p mrc/haswell/ ( cd mrc/haswell/ # https://web.archive.org/web/20210211071412/https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf # peppy image used as defined here, mrc.bin extracted from that. # when wanting to use an updated version later on, just change the url and # sha1sums and such, in this script, based on a newer version on archive.org. # For haswell mrc.bin, used on ThinkPad T440p and W541 _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" download_image ${_url} ${_file} ${_sha1sum} if [ ! -f ${_file} ]; then download_image ${_url2} ${_file} ${_sha1sum} fi if [ ! -f $_file ]; then echo "${_file} was not downloaded, or verification failed. Exiting" exit 1 fi extract_partition ROOT-A ${_file} root-a.ext2 extract_shellball root-a.ext2 chromeos-firmwareupdate-${_board} extract_coreboot chromeos-firmwareupdate-${_board} ../../coreboot/default/util/cbfstool/cbfstool coreboot-*.bin extract -f mrc.bin -n mrc.bin -r RO_SECTION rm -f "chromeos-firmwareupdate-${_board}" coreboot-*.bin "${_file}" "root-a.ext2" printf "\n\nHaswell mrc.bin file (for T440p and W541) downloaded to mrc/haswell/mrc.bin\n\n" ) exit 0