# SPDX-License-Identifier: GPL-3.0-only # Copyright (c) 2022 Caleb La Grange # Copyright (c) 2022 Ferass El Hafidi # Copyright (c) 2023-2025 Leah Rowe cbcfgsdir="config/coreboot" hashfiles="vendorhashes blobhashes" # used to detect and error out # if running on an archive that needs vendor files dontflash="!!! AN ERROR OCCURED! Do NOT flash these images !!!" tmpromdel="$xbmklocal/DO_NOT_FLASH" nvm="util/nvmutil/nvm" ifdtool="elf/ifdtool/default/ifdtool" inject() { remkdir "$tmpromdel" set +u +e [ $# -lt 1 ] && err "No options specified. - $dontflash" eval "`setvars "" new_mac xchanged`" archive="$1"; new_mac="xx:xx:xx:xx:xx:xx" [ $# -gt 1 ] && case "$2" in setmac) [ $# -gt 2 ] && new_mac="$3" && \ [ -z "$new_mac" ] && err "Empty MAC address specified" ;; *) err "Unrecognised inject mode: '$2'" esac [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ x_ make -C util/nvmutil clean && x_ make -C util/nvmutil check_release "$archive" || err "'$archive' is not a release archive" if readcfg && readkconfig; then patch_release_roms fi [ "$xchanged" != "y" ] && printf "\n'%s' *NOT* modified.\n" "$archive" [ "$xchanged" = "y" ] && printf "\n'%s' %s.\n" "$archive" "$xtype"; : } check_release() { [ -L "$archive" ] && err "'$archive' is a symlink. $dontflash" e "$archive" f missing && return 1 archivename="`basename "$archive"`" [ -z "$archivename" ] && err "Can't determine archive name. $dontflash" case "$archivename" in *_src.tar.xz) err "'$archive' is a src archive, silly!" ;; grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*) return 1 ;; *.tar.xz) _stripped_prefix="${archivename#*_}" board="${_stripped_prefix%.tar.xz}" ;; *) err "'$archive': could not detect board type - $dontflash" esac; : } readcfg() { if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \ || [ "$board" = "serprog_pico" ]; then printf "'%s' is a serprog firmware archive.\n" "$archive" 1>&2 return 1 fi boarddir="$cbcfgsdir/$board" eval "`setcfg "$boarddir/target.cfg"`" chkvars tree && x_ ./mk -d coreboot "$tree" cbdir="src/coreboot/$tree" cbfstool="elf/cbfstool/$tree/cbfstool" rmodtool="elf/cbfstool/$tree/rmodtool" cbfstool="elf/cbfstool/$tree/cbfstool" ifdtool="elf/ifdtool/$tree/ifdtool" [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; : } readkconfig() { x_ rm -f "$xbmktmp/cbcfg" fx_ scankconfig x_ find "$boarddir/config" -type f eval "`setcfg "$xbmktmp/cbcfg" 1`" } scankconfig() { for cbc in $cv; do grep "$cbc" "$1" 1>>"$xbmktmp/cbcfg" 2>/dev/null || : done } patch_release_roms() { tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board" remkdir "${tmpromdir%"/bin/$board"}" x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" for _hashes in $hashfiles; do e "$tmpromdir/$_hashes" f && err \ "'$archive': vendorfile insertion unsupported; $dontflash" done [ -z "$new_mac" ] || [ -z "$CONFIG_GBE_BIN_PATH" ] || modify_mac [ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || : [ "$xchanged" = "y" ] || return 0 ( x_ cd "${tmpromdir%"/bin/$board"}" mkrom_tarball "bin/$board" ) || err "Cannot re-generate '$archive' - $dontflash" mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \ "$archive" || err "'$archive' -> Can't overwrite - $dontflash"; : } modify_mac() { x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ x_ "$nvm" "$xbmklocal/gbe" setmac "$new_mac" fx_ newmac x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" } newmac() { e "$1" f && xchanged="y" && x_ \ "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; : }