diff options
Diffstat (limited to 'resources/scripts')
-rwxr-xr-x | resources/scripts/blobs/inject | 463 |
1 files changed, 284 insertions, 179 deletions
diff --git a/resources/scripts/blobs/inject b/resources/scripts/blobs/inject index 2e4e7a7c..3142355b 100755 --- a/resources/scripts/blobs/inject +++ b/resources/scripts/blobs/inject @@ -5,54 +5,107 @@ # SPDX-FileCopyrightText: 2023 Leah Rowe <info@minifree.org> # SPDX-License-Identifier: GPL-3.0-only -Fail(){ - if [ ! -z ${@+x} ]; then - printf "\nERROR: ${@}\n" +archive="" +_filetype="" +rom="" +board="" +modifygbe="" +new_mac="" +release="" +releasearchive="" + +cbdir="coreboot/default" +cbcfgsdir="resources/coreboot" +ifdtool="${cbdir}/util/ifdtool/ifdtool" +cbfstool="${cbdir}/util/cbfstool/cbfstool" +nvmutil="util/nvmutil/nvm" +boarddir="" +pciromsdir="pciroms" + +CONFIG_HAVE_MRC="" +CONFIG_HAVE_ME_BIN="" +CONFIG_ME_BIN_PATH="" +CONFIG_KBC1126_FIRMWARE="" +CONFIG_KBC1126_FW1="" +CONFIG_KBC1126_FW1_OFFSET="" +CONFIG_KBC1126_FW2="" +CONFIG_KBC1126_FW2_OFFSET="" +CONFIG_VGA_BIOS_FILE="" +CONFIG_VGA_BIOS_ID="" +CONFIG_GBE_BIN_PATH="" + +main() +{ + if [ $# -lt 1 ]; then + fail "No options specified." + elif [ "${1}" = "listboards" ]; then + listboards + exit 0 fi - cat <<- EOF - USAGE: ./blobutil inject -r [/path/to/rom] -b [boardname] -m [macaddress] - Example: ./blobutil inject -r x230_12mb.rom -b x230_12mb - - Adding a macadress to the gbe is optional. - If the [-m] parameter is left blank, the gbe will not be touched. - - Type './blobutil inject listboards' to get a list of valid boards - EOF + archive="${1}" + echo "TEST: $archive" + + while getopts r:b:m: option + do + case "${option}" + in + r)rom=${OPTARG};; + b)board=${OPTARG};; + m) + modifygbe=true + new_mac=${OPTARG} + ;; + esac + done - exit 1 + check_board + build_dependencies + inject_blobs } -Modify_gbe(){ - rom=${1} - printf "changing mac address in gbe to ${new_mac}\n" - _gbe_location=${CONFIG_GBE_BIN_PATH#../../} - - if [ ! -f util/nvmutil/nvm ]; then - make -C util/nvmutil || Fail 'failed to build nvmutil' +check_board() +{ + if ! check_release ${archive} ; then + if [ ! -f "${rom}" ]; then + fail "${rom} is not a valid path" + elif [ -z ${rom+x} ]; then + fail 'no rom specified' + elif [ -z ${board+x} ]; then + board=$(detect_board ${rom}) \ + || fail 'no board specified' + fi + else + release=true + releasearchive="${archive}" + board=$(detect_board ${archive}) \ + || fail 'Could not detect board type' fi - _gbe_tmp=$(mktemp -t gbeXXXX.bin) - cp ${_gbe_location} ${_gbe_tmp} - ./util/nvmutil/nvm ${_gbe_tmp} setmac ${new_mac} || Fail 'failed to modify mac address\nmake sure the mac address in the correct format' - - ./coreboot/default/util/ifdtool/ifdtool -i GbE:${_gbe_tmp} ${rom} -O ${rom} || exit 1 - - rm ${_gbe_tmp} + boarddir="${cbcfgsdir}/${board}" + if [ ! -d "${boarddir}" ]; then + fail "board ${board} not found" + fi } -listboards() { - for boarddir in resources/coreboot/*; do - if [ ! -d "${boarddir}" ]; then continue; fi - board="${boarddir##resources/coreboot/}" - board="${board%/}" - printf '%s\n' "${board##*/}" - done +check_release() +{ + if [ ! -f "${archive}" ]; then + return 1 + fi + + if [ "${archive##*.}" = "xz" ]; then + printf "%s\n" "Release archive ${archive} detected" + return 0 + else + return 1 + fi } # This function tries to determine the board from the filename of the rom. # It will only succeed if the filename is not changed from the build/download -Detect_board(){ +detect_board() +{ path=${1} filename=$(basename ${path}) case ${filename} in @@ -70,102 +123,69 @@ Detect_board(){ return 1 esac - if [ -d "resources/coreboot/${board}/" ]; then + if [ -d "${boarddir}/" ]; then printf '%s\n' "${board}" + return 0 else return 1 fi } -Patch(){ -rom="${1}" -set -- "resources/coreboot/${board}/config/*" -. ${1} 2>/dev/null -. "resources/coreboot/${board}/board.cfg" - - if [ "$CONFIG_HAVE_MRC" = "y" ]; then - printf 'adding mrc\n' - ./coreboot/default/util/cbfstool/cbfstool ${rom} add -f mrc/haswell/mrc.bin -n mrc.bin -t mrc -b 0x78fe00 || exit 1 +build_dependencies() +{ + if [ ! -d ${cbdir} ]; then + printf "downloading coreboot\n" + ./download coreboot default fi - if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then - _me_location=${CONFIG_ME_BIN_PATH#../../} - printf 'adding intel management engine\n' - ./coreboot/default/util/ifdtool/ifdtool -i me:${_me_location} ${rom} -O ${rom} || exit 1 + if [ ! -f "${ifdtool}" ]; then + printf "building ifdtool from coreboot\n" + ./build module cbutils default \ + || fail 'could not build ifdtool' fi - if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then - _ec1_location="${CONFIG_KBC1126_FW1#../../}" - _ec1_offset="${CONFIG_KBC1126_FW1_OFFSET}" - _ec2_location="${CONFIG_KBC1126_FW2#../../}" - _ec2_offset="${CONFIG_KBC1126_FW2_OFFSET}" - printf "adding hp kbc1126 ec firmware\n" - if [ "${_ec1_offset}" = "" ] || [ "${_ec1_offset}" = "" ]; - then - printf "EC offsets not declared for board: %s\n" \ - "${board}" - exit 1 - fi - if [ "${_ec1_location}" = "" ] || [ "${_ec2_location}" = "" ]; - then - printf "EC firmware path not declared for board: %s\n" \ - "${board}" - fi - if [ ! -f "${_ec1_location}" ] || [ ! -f "${_ec2_location}" ]; - then - printf "EC firmware not downloaded for board: %s\n" \ - "${board}" - exit 1 - fi - ./coreboot/default/util/cbfstool/cbfstool "${rom}" add -f ${_ec1_location} -n ecfw1.bin -b ${_ec1_offset} -t raw || exit 1 - ./coreboot/default/util/cbfstool/cbfstool "${rom}" add -f ${_ec2_location} -n ecfw2.bin -b ${_ec2_offset} -t raw || exit 1 + if [ ! -f "${cbfstool}" ]; then + printf "building cbfstool from coreboot\n" + ./build module cbutils default \ + || fail 'could not build cbfstool' fi - if [ "${CONFIG_VGA_BIOS_FILE}" != "" ] \ - && [ "${CONFIG_VGA_BIOS_ID}" != "" ]; then - _vga_location="${CONFIG_VGA_BIOS_FILE#../../}" - _vga_dir="${_vga_location%/*}" - _vga_filename="${_vga_location##*/}" - printf "adding pci option rom\n" - if [ "${_vga_dir}" != "pciroms" ]; then - printf "Invalid PCI ROM directory: %s\n" ${_vga_dir} - exit 1 - fi - if [ ! -f "${_vga_location}" ]; then - printf "No such file exists: %s\n" ${_vga_location} - exit 1 - fi - ./coreboot/default/util/cbfstool/cbfstool ${rom} \ - add -f "${_vga_location}" \ - -n "pci${CONFIG_VGA_BIOS_ID}.rom" \ - -t optionrom || exit 1 - fi + ./blobutil download ${board} || \ + fail "Could not download blobs for ${board}" +} - if [ "${modifygbe}" = "true" ] && ! [ "${release}" = "true" ]; then - Modify_gbe ${rom} +inject_blobs() +{ + if [ "${release}" = "true" ]; then + echo 'patching release file' + patch_release_roms + else + patch_rom ${rom} fi } -Patch_release(){ +patch_release_roms() +{ _tmpdir=$(mktemp -d "/tmp/${board}_tmpXXXX") tar xf "${releasearchive}" -C "${_tmpdir}" || \ - Fail 'could not extract release archive' - - for rom in ${_tmpdir}/bin/*/*.rom ; do - echo "patching rom $rom" - Patch ${rom} || \ - Fail "could not patch ${rom}" + fail 'could not extract release archive' + + for x in ${_tmpdir}/bin/*/*.rom ; do + echo "TEST" + echo "patching rom $x" + patch_rom ${x} || fail "could not patch ${x}" + echo "FOO" done - ( cd ${_tmpdir}/bin/* + ( + cd ${_tmpdir}/bin/* sha1sum --status -c blobhashes || \ - Fail 'ROMs did not match expected hashes' + fail 'ROMs did not match expected hashes' ) - if [ "${modifygbe}" = "true" ]; then - for rom in ${_tmpdir}/bin/*/*.rom ; do - Modify_gbe ${rom} + for x in ${_tmpdir}/bin/*/*.rom ; do + modify_gbe ${x} done fi @@ -179,83 +199,168 @@ Patch_release(){ rm -r "${_tmpdir}" } -Check_release(){ -if ! [ -f ${1} ]; then - return 1 -fi +patch_rom() +{ + rom="${1}" + + set -- "${boarddir}/config/"* + . ${1} 2>/dev/null + . "${boarddir}/board.cfg" + + if [ "$CONFIG_HAVE_MRC" = "y" ]; then + inject_blob_intel_mrc "${rom}" + fi + + if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then + inject_blob_intel_me "${rom}" + fi + + if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then + inject_blob_hp_kbc1126_ec "${rom}" + fi + + if [ "${CONFIG_VGA_BIOS_FILE}" != "" ] \ + && [ "${CONFIG_VGA_BIOS_ID}" != "" ]; then + inject_blob_dell_e6400_vgarom_nvidia + fi + + if [ "${modifygbe}" = "true" ] && ! [ "${release}" = "true" ]; then + modify_gbe ${rom} + fi +} + +inject_blob_intel_mrc() +{ + rom="${1}" -_filetype=$(file -b "${1}") + printf 'adding mrc\n' -if [ "${_filetype%%,*}" = "XZ compressed data" ]; then - printf "%s\n" "Release archive ${1} detected" -else - return 1 -fi + # TODO: use offset defined in coreboot configs (don't hardcode) + ${cbfstool} ${rom} add -f mrc/haswell/mrc.bin -n mrc.bin -t mrc \ + -b 0x78fe00 || exit 1 } -if [ "${1}" = "listboards" ]; then - listboards - exit 0 -fi - -# Implementing parameter parsing now so more options can be added later -while getopts r:b:m: option -do - case "${option}" - in - r)rom=${OPTARG};; - b)board=${OPTARG};; - m) - modifygbe=true - new_mac=${OPTARG} - ;; - esac -done +inject_blob_intel_me() +{ + rom="${1}" + + # TODO: check if CONFIG_ME_BIN_PATH is empty + _me_location=${CONFIG_ME_BIN_PATH#../../} + printf 'adding intel management engine\n' + ${ifdtool} -i me:${_me_location} ${rom} -O ${rom} || exit 1 +} + +inject_blob_hp_kbc1126_ec() +{ + rom="${1}" + + _ec1_location="${CONFIG_KBC1126_FW1#../../}" + _ec1_offset="${CONFIG_KBC1126_FW1_OFFSET}" + _ec2_location="${CONFIG_KBC1126_FW2#../../}" + _ec2_offset="${CONFIG_KBC1126_FW2_OFFSET}" + + printf "adding hp kbc1126 ec firmware\n" + + if [ "${_ec1_offset}" = "" ] || [ "${_ec1_offset}" = "" ]; then + printf "EC offsets not declared for board: %s\n" \ + "${board}" + exit 1 + fi + if [ "${_ec1_location}" = "" ] || [ "${_ec2_location}" = "" ]; then + printf "EC firmware path not declared for board: %s\n" \ + "${board}" + fi + if [ ! -f "${_ec1_location}" ] || [ ! -f "${_ec2_location}" ]; then + printf "EC firmware not downloaded for board: %s\n" \ + "${board}" + exit 1 + fi + + ${cbfstool} "${rom}" add -f ${_ec1_location} -n ecfw1.bin \ + -b ${_ec1_offset} -t raw || exit 1 + ${cbfstool} "${rom}" add -f ${_ec2_location} -n ecfw2.bin \ + -b ${_ec2_offset} -t raw || exit 1 +} + +inject_blob_dell_e6400_vgarom_nvidia() +{ + rom="${1}" + + _vga_location="${CONFIG_VGA_BIOS_FILE#../../}" + _vga_dir="${_vga_location%/*}" + _vga_filename="${_vga_location##*/}" + + printf "adding pci option rom\n" + + if [ "${_vga_dir}" != "${pciromsdir}" ]; then + printf "Invalid PCI ROM directory: %s\n" ${_vga_dir} + exit 1 + fi + if [ ! -f "${_vga_location}" ]; then + printf "No such file exists: %s\n" ${_vga_location} + exit 1 + fi + + ${cbfstool} ${rom} add -f "${_vga_location}" \ + -n "pci${CONFIG_VGA_BIOS_ID}.rom" \ + -t optionrom || exit 1 +} + +modify_gbe() +{ + printf "changing mac address in gbe to ${new_mac}\n" + + rom=${1} + # TODO: check if CONFIG_GBE_BIN_PATH is empty + # TODO: check that the gbe file actually exists + _gbe_location=${CONFIG_GBE_BIN_PATH#../../} + + if [ ! -f ${nvmutil} ]; then + make -C util/nvmutil || fail 'failed to build nvmutil' + fi + _gbe_tmp=$(mktemp -t gbeXXXX.bin) + cp ${_gbe_location} ${_gbe_tmp} + ${nvmutil} "${_gbe_tmp}" setmac ${new_mac} \ + || fail 'failed to modify mac address' + ${ifdtool} -i GbE:${_gbe_tmp} "${rom}" \ + -O "${rom}" || exit 1 + + rm -f ${_gbe_tmp} +} -if ! Check_release ${1} ; then - if [ ! -f "${rom}" ]; then - Fail "${rom} is not a valid path" - elif [ -z ${rom+x} ]; then - Fail 'no rom specified' - elif [ -z ${board+x} ]; then - board=$(Detect_board ${rom}) || \ - Fail 'no board specified' +listboards() +{ + for boarddir in ${cbcfgsdir}/*; do + if [ ! -d "${boarddir}" ]; then continue; fi + board="${boarddir##${cbcfgsdir}/}" + board="${board%/}" + printf '%s\n' "${board##*/}" + done +} + +fail() +{ + if [ ! -z ${@+x} ]; then + printf "\nERROR: ${@}\n" fi -else - release=true - releasearchive="${1}" - board=$(Detect_board ${1}) || \ - Fail 'Could not detect board type' -fi - - -if [ ! -d "resources/coreboot/${board}/" ]; then - Fail "board ${board} not found" -fi - -if [ ! -d coreboot/default ]; then - printf "downloading coreboot\n" - ./download coreboot default -fi - -if [ ! -f "coreboot/default/util/ifdtool/ifdtool" ]; then -printf "building ifdtool from coreboot\n" - ./build module cbutils default || Fail 'could not build ifdtool' -fi - -if [ ! -f "coreboot/default/util/cbfstool/cbfstool" ]; then -printf "building cbfstool from coreboot\n" -./build module cbutils default || Fail 'could not build cbfstool' -fi - -./blobutil download ${board} || \ -Fail "Could not download blobs for ${board}, check network connection" - -if [ "${release}" = "true" ]; then - echo 'patching release file' - Patch_release -else - Patch ${rom} -fi + + usage + exit 1 +} + +usage() +{ + cat <<- EOF + USAGE: ./blobutil inject -r [rom path] -b [boardname] -m [macaddress] + Example: ./blobutil inject -r x230_12mb.rom -b x230_12mb + + Adding a macadress to the gbe is optional. + If the [-m] parameter is left blank, the gbe will not be touched. + + Type './blobutil inject listboards' to get a list of valid boards + EOF +} + +main $@ |