From 91220ce1833e4980097cff9674e2481cb2b24e07 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 9 May 2025 00:20:33 +0100 Subject: inject.sh: use subshell to speed up find_me() the current test allows a further extraction after running mecleaner, even if me.bin was found. further, any recursive calls that exit non-ze don't lot the loop acthually stop, unless we subshell that too, otherwise fx_ is returned to return 0 when a given command it runs returns 1, or more specifically: the for loop in x_ breaks. this is by design, and there's not much that can be done, but this patch should pseed up extraction a little bit, when dealing with intel me files. Signed-off-by: Leah Rowe --- include/inject.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'include/inject.sh') diff --git a/include/inject.sh b/include/inject.sh index c0b4409f..135df0c2 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -147,7 +147,9 @@ extract_intel_me() chkvars ME11delta ME11version ME11sku ME11pch [ "$ME11bootguard" = "y" ] && x_ ./mk -f deguard - set +u +e && fx_ find_me x_ find "$xbmkpwd/$appdir" -type f + set +u +e + x_ rm -Rf "$xbmkpwd/metmp" + ( fx_ find_me x_ find "$xbmkpwd/$appdir" -type f ) || : [ "$ME11bootguard" != "y" ] && x_ mv "$_metmp" "$_me" && return 0 ( @@ -160,7 +162,7 @@ extract_intel_me() find_me() { - e "$_metmp" f && x_ rm -Rf "$xbmklocal/metmp" && return 1 + e "$_metmp" f && exit 1 [ -L "$1" ] && return 0 _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r="" @@ -169,7 +171,8 @@ find_me() "$mecleaner" $mfs $_r -t -O "$_metmp" "$1" || "$me7updateparser" \ -O "$_metmp" "$1" || extract_archive "$1" "$_7ztest" || return 0 - fx_ find_me x_ find "$_7ztest" -type f || return 1; : + e "$_metmp" f && exit 1 + ( fx_ find_me x_ find "$_7ztest" -type f ) || exit 1; : } extract_archive() -- cgit v1.2.1 From 23486abef3abafbe36b34ebac880f993804356f3 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 9 May 2025 00:26:33 +0100 Subject: inject.sh: use direct comparison for metmp use of the e function would slow down execution, and it's mostly unnecessary in this case. the e function is only needed if we want to confirm via user message that a file exists. that is not needed here. Signed-off-by: Leah Rowe --- include/inject.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'include/inject.sh') diff --git a/include/inject.sh b/include/inject.sh index 135df0c2..8485d7e8 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -162,7 +162,7 @@ extract_intel_me() find_me() { - e "$_metmp" f && exit 1 + [ -f "$_metmp" ] && exit 1 [ -L "$1" ] && return 0 _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r="" @@ -171,7 +171,7 @@ find_me() "$mecleaner" $mfs $_r -t -O "$_metmp" "$1" || "$me7updateparser" \ -O "$_metmp" "$1" || extract_archive "$1" "$_7ztest" || return 0 - e "$_metmp" f && exit 1 + [ -f "$_metmp" ] && exit 1 ( fx_ find_me x_ find "$_7ztest" -type f ) || exit 1; : } -- cgit v1.2.1 From 81dbde7e09f06c7f227fd0d78498df6e1c269f84 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 9 May 2025 20:54:23 +0100 Subject: lbmk: use x_ instead of err, where appropriate many places in lbmk used err, because older versions of x_ did not handle globbing properly. however, use of x_ is preferable on trivial commands. the only time err() should be called is what it has to be, when x_ can't work, or when a more useful error message is needed, for context. Signed-off-by: Leah Rowe --- include/inject.sh | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'include/inject.sh') diff --git a/include/inject.sh b/include/inject.sh index 8485d7e8..476b7eb0 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -121,7 +121,7 @@ fetch() dlop="curl" && [ $# -gt 5 ] && dlop="$6" xbmkget "$dl" "$dl_bkup" "$_dl" "$dlsum" "$dlop" - rm -Rf "${_dl}_extracted" || err "!rm ${_ul}_extracted. $dontflash" + x_ rm -Rf "${_dl}_extracted" e "$_dest" f && return 0 x_ mkdir -p "${_dest%/*}" @@ -219,7 +219,7 @@ extract_sch5545ec() _sch5545ec_fw="$_sch5545ec_fw/54 D386BEB8-4B54-4E69-94F5-06091F67E0D3" _sch5545ec_fw="$_sch5545ec_fw/0 Raw section/body.bin" # <-- this! - "$uefiextract" "$_bios" || err "sch5545 !extract - $dontflash" + x_ "$uefiextract" "$_bios" x_ cp "$_sch5545ec_fw" "$_dest" } @@ -345,7 +345,7 @@ patch_release_roms() fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" ( - cd "$tmpromdir" || err "patch '$archive': can't cd $tmpromdir" + x_ cd "$tmpromdir" # NOTE: For compatibility with older rom releases, defer to sha1 if [ "$has_hashes" = "y" ] && [ "$nukemode" != "nuke" ]; then sha512sum --status -c "$hashfile" || \ @@ -385,7 +385,7 @@ prep() [ $xromsize -lt 524288 ] && err "too small, $xromsize: $_xrom" x_ dd if="$_xrom" of="$_xromnew" bs=$xromsize count=1 - rm -f "$_xrom" || err "Can't rm $_xrom - $dontflash" + x_ rm -f "$_xrom" _xrom="$_xromnew" fi @@ -455,21 +455,20 @@ insert() [ "$nukemode" = "nuke" ] || x_ e "$_dest" f if [ "$cbfsname" = "IFD" ]; then - [ "$nukemode" = "nuke" ] || "$ifdtool" $ifdprefix -i \ - $_t:$_dest "$rom" -O "$rom" || \ - err "failed: insert '$_t' '$_dest' on '$rom'" - [ "$nukemode" != "nuke" ] || "$ifdtool" $ifdprefix --nuke $_t \ - "$rom" -O "$rom" || err "$rom: !nuke IFD/$_t" + [ "$nukemode" = "nuke" ] || x_ "$ifdtool" $ifdprefix -i \ + $_t:$_dest "$rom" -O "$rom" + [ "$nukemode" != "nuke" ] || x_ "$ifdtool" $ifdprefix --nuke \ + $_t "$rom" -O "$rom" elif [ "$nukemode" = "nuke" ]; then x_ "$cbfstool" "$rom" remove -n "$cbfsname" elif [ "$_t" = "stage" ]; then # the only stage we handle is refcode x_ rm -f "$xbmklocal/refcode" - "$rmodtool" -i "$_dest" -o "$xbmklocal/refcode" || "!reloc ref" - "$cbfstool" "$rom" add-stage -f "$xbmklocal/refcode" \ - -n "$cbfsname" -t stage || err "$rom: !add ref" + x_ "$rmodtool" -i "$_dest" -o "$xbmklocal/refcode" + x_ "$cbfstool" "$rom" add-stage -f "$xbmklocal/refcode" \ + -n "$cbfsname" -t stage else - "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ - -t $_t $_offset || err "$rom !add $_t ($_dest)" + x_ "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ + -t $_t $_offset fi xchanged="y"; : } -- cgit v1.2.1 From 3554b5aad9c0076c3180715b9830eb6069b03b7c Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Sat, 10 May 2025 10:24:16 +0100 Subject: inject.sh: split up the inject functions generally go for a more linear function order, and split up any functions. the objective is to have functions only suitable to libreboot be separate. more splitting will be done, and eventually the vendor-download functions will be split into a new file, as will several other functions. this is being done as part of an effort to bring the libreboot and canoeboot versions of inject.sh in sync, so that from now on, cherry picking between the two projects will produce fewer merge conflicts and require a lesser amount of post-merge maintenance. some other minor cleanup has also been done; for example, the "need_files" variable is redundant and was removed. Signed-off-by: Leah Rowe --- include/inject.sh | 159 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 79 deletions(-) (limited to 'include/inject.sh') diff --git a/include/inject.sh b/include/inject.sh index 476b7eb0..7ec4e42b 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -34,38 +34,14 @@ eval "`setvars "" has_hashes EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \ mecleaner kbc1126_ec_dump MRC_refcode_cbtree new_mac _dl SCH5545EC_DL_url \ archive EC_url boarddir rom cbdir DL_url nukemode cbfstoolref FSPFD_hash \ _7ztest ME11bootguard ME11delta ME11version ME11sku ME11pch tmpromdir \ - IFD_platform ifdprefix _me _metmp mfs TBFW_url_bkup TBFW_url \ - TBFW_hash TBFW_size hashfile xromsize xchanged EC_url_bkup need_files \ - vfile cbcfg $cv`" + IFD_platform ifdprefix _me _metmp mfs TBFW_url_bkup TBFW_url TBFW_hash \ + TBFW_size hashfile xromsize xchanged EC_url_bkup vfile cbcfg $cv`" download() { [ $# -gt 0 ] || err "No argument given" export PATH="$PATH:/sbin" - board="$1" && readcfg && readkconfig && bootstrap && getfiles; : -} - -readkconfig() -{ - x_ rm -f "$xbmktmp/cbcfg" - fx_ scankconfig x_ find "$boarddir/config" -type f - - eval "`setcfg "$xbmktmp/cbcfg" 1`" - - for c in $cvchk; do - eval "[ \"\${$c}\" = \"/dev/null\" ] && continue" - eval "[ -z \"\${$c}\" ] && continue" - eval "`setcfg "$vfile"`" - return 0 - done - return 1 -} - -scankconfig() -{ - for cbc in $cv; do - grep "$cbc" "$1" 1>>"$xbmktmp/cbcfg" 2>/dev/null || : - done + board="$1" && readvcfg && readkconfig && bootstrap && getfiles; : } bootstrap() @@ -244,7 +220,6 @@ extract_fsp() inject() { - need_files="n" remkdir "$tmpromdel" set +u +e @@ -261,47 +236,46 @@ inject() setmac) [ $# -gt 2 ] && new_mac="$3" && \ [ -z "$new_mac" ] && err "Empty MAC address specified" ;; - *) err "Unrecognised inject mode: '$2'" + *) + err "Unrecognised inject mode: '$2'" esac [ "$new_mac" = "keep" ] && new_mac="" [ -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" + check_release + readvcfg && patch_release - readcfg && need_files="y" - if [ "$need_files" = "y" ] || [ -n "$new_mac" ]; then - [ "$nukemode" != "nuke" ] && [ "$need_files" = "y" ] && \ - x_ ./mk download "$board" - patch_release_roms - fi + [ "$xchanged" = "y" ] && remktar + + xnot=" NOT" && [ "$xchanged" = "y" ] && xnot="" + printf "\n'%s' was%s modified\n" "$archive" "$xnot" 1>&2 - xtype="patched" && [ "$nukemode" = "nuke" ] && xtype="nuked" - [ "$xchanged" != "y" ] && printf "\n'%s' *NOT* modified.\n" "$archive" - [ "$xchanged" = "y" ] && printf "\n'%s' %s.\n" "$archive" "$xtype"; : + x_ rm -Rf "$tmpromdel" } check_release() { [ -L "$archive" ] && err "'$archive' is a symlink. $dontflash" - e "$archive" f missing && return 1 + e "$archive" f missing && err "'$archive' missing" - archivename="`basename "$archive"`" + archivename="`basename "$archive"`" || err "Can't get '$archive' name" [ -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 ;; + err "'$archive' is a ROM image (it must be a tarball)" ;; *.tar.xz) _stripped_prefix="${archivename#*_}" board="${_stripped_prefix%.tar.xz}" ;; - *) err "'$archive': could not detect board type - $dontflash" + *) + err "'$archive': could not detect board type - $dontflash" esac; : } -readcfg() +readvcfg() { if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \ || [ "$board" = "serprog_pico" ]; then @@ -328,8 +302,10 @@ readcfg() [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; : } -patch_release_roms() +patch_release() { + [ "$nukemode" = "nuke" ] || x_ ./mk download "$board" + has_hashes="n" tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board" @@ -337,35 +313,41 @@ patch_release_roms() x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" for _hashes in $hashfiles; do - [ "$need_files" = "y" ] && e "$tmpromdir/$_hashes" f && \ + e "$tmpromdir/$_hashes" f && \ has_hashes="y" && hashfile="$_hashes" && break; : done - readkconfig || exit 0; [ "$need_files" = "n" ] || \ - fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" + readkconfig || exit 0 + fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" - ( - x_ cd "$tmpromdir" - # NOTE: For compatibility with older rom releases, defer to sha1 - if [ "$has_hashes" = "y" ] && [ "$nukemode" != "nuke" ]; then - sha512sum --status -c "$hashfile" || \ - x_ sha1sum --status -c "$hashfile" - x_ rm -f "$hashfile" - fi - ) || err "'$archive' -> Can't verify vendor hashes. $dontflash" + ( check_vendor_hashes ) || err "Can't verify hashes for '$archive'"; : - [ -z "$new_mac" ] || [ -z "$CONFIG_GBE_BIN_PATH" ] || modify_mac + [ -n "$new_mac" ] && [ -n "$CONFIG_GBE_BIN_PATH" ] && modify_mac; : +} - [ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || : - [ "$xchanged" = "y" ] || return 0 +readkconfig() +{ + x_ rm -f "$xbmktmp/cbcfg" + fx_ scankconfig x_ find "$boarddir/config" -type f + eval "`setcfg "$xbmktmp/cbcfg" 1`" + setvfile_kconfig && return 1; : +} - ( - x_ cd "${tmpromdir%"/bin/$board"}" - mkrom_tarball "bin/$board" - ) || err "Cannot re-generate '$archive' - $dontflash" +setvfile_kconfig() +{ + for c in $cvchk; do + eval "[ \"\${$c}\" = \"/dev/null\" ] && continue" + eval "[ -z \"\${$c}\" ] && continue" + eval "`setcfg "$vfile"`" + return 1 + done +} - mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \ - "$archive" || err "'$archive' -> Can't overwrite - $dontflash"; : +scankconfig() +{ + for cbc in $cv; do + grep "$cbc" "$1" 1>>"$xbmktmp/cbcfg" 2>/dev/null || : + done } prep() @@ -392,7 +374,7 @@ prep() [ "$nukemode" = "nuke" ] && mksha512sum "$_xrom" "vendorhashes" - patch_rom "$_xrom" || return 1 # if break return, can still change MAC + add_vfiles "$_xrom" || return 1 # if break return, can still change MAC [ "$nukemode" != "nuke" ] && return 0 # Rename the file, prefixing a warning saying not to flash @@ -400,7 +382,7 @@ prep() x_ rm -f "$_xrom" } -patch_rom() +add_vfiles() { rom="$1" @@ -412,31 +394,31 @@ patch_rom() return 1 fi - [ -n "$CONFIG_HAVE_REFCODE_BLOB" ] && insert "fallback/refcode" \ + [ -n "$CONFIG_HAVE_REFCODE_BLOB" ] && vfile "fallback/refcode" \ "$CONFIG_REFCODE_BLOB_FILE" "stage" - [ "$CONFIG_HAVE_MRC" = "y" ] && insert "mrc.bin" "$CONFIG_MRC_FILE" \ + [ "$CONFIG_HAVE_MRC" = "y" ] && vfile "mrc.bin" "$CONFIG_MRC_FILE" \ "mrc" "0xfffa0000" - [ "$CONFIG_HAVE_ME_BIN" = "y" ] && insert IFD "$CONFIG_ME_BIN_PATH" me - [ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && insert ecfw1.bin \ - "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" && insert \ + [ "$CONFIG_HAVE_ME_BIN" = "y" ] && vfile IFD "$CONFIG_ME_BIN_PATH" me + [ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && vfile ecfw1.bin \ + "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" && vfile \ ecfw2.bin "$CONFIG_KBC1126_FW2" raw "$CONFIG_KBC1126_FW2_OFFSET" [ -n "$CONFIG_VGA_BIOS_FILE" ] && [ -n "$CONFIG_VGA_BIOS_ID" ] && \ - insert "pci$CONFIG_VGA_BIOS_ID.rom" "$CONFIG_VGA_BIOS_FILE" optionrom + vfile "pci$CONFIG_VGA_BIOS_ID.rom" "$CONFIG_VGA_BIOS_FILE" optionrom [ "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" = "y" ] && \ [ -n "$CONFIG_SMSC_SCH5545_EC_FW_FILE" ] && \ - insert sch5545_ecfw.bin "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw + vfile sch5545_ecfw.bin "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw [ -z "$CONFIG_FSP_USE_REPO" ] && [ -z "$CONFIG_FSP_FULL_FD" ] && \ [ -n "$CONFIG_FSP_M_FILE" ] && \ - insert "$CONFIG_FSP_M_CBFS" "$CONFIG_FSP_M_FILE" fsp --xip + vfile "$CONFIG_FSP_M_CBFS" "$CONFIG_FSP_M_FILE" fsp --xip [ -z "$CONFIG_FSP_USE_REPO" ] && [ -z "$CONFIG_FSP_FULL_FD" ] && \ [ -n "$CONFIG_FSP_S_FILE" ] && \ - insert "$CONFIG_FSP_S_CBFS" "$CONFIG_FSP_S_FILE" fsp + vfile "$CONFIG_FSP_S_CBFS" "$CONFIG_FSP_S_FILE" fsp printf "ROM image successfully patched: %s\n" "$rom" xchanged="y" } -insert() +vfile() { [ "$2" = "/dev/null" ] && return 0 @@ -449,7 +431,7 @@ insert() if [ "$_t" = "fsp" ] && [ $# -gt 3 ]; then _offset="$4" elif [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ]; then - err "insert $*, $rom: offset given but empty (undefined)" + err "vfile $*, $rom: offset given but empty (undefined)" fi [ "$nukemode" = "nuke" ] || x_ e "$_dest" f @@ -473,6 +455,14 @@ insert() xchanged="y"; : } +check_vendor_hashes() +{ + x_ cd "$tmpromdir" + [ "$has_hashes" = "n" ] || [ "$nukemode" = "nuke" ] || sha512sum \ + --status -c "$hashfile" || x_ sha1sum --status -c "$hashfile" + x_ rm -f "$hashfile" +} + modify_mac() { x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" @@ -487,3 +477,14 @@ newmac() e "$1" f && xchanged="y" && x_ \ "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; : } + +remktar() +{ + ( + 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"; : +} -- cgit v1.2.1 From 0f931b508a8eb34e70b2ed3628ac4fe74f22b8e8 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Sat, 10 May 2025 12:32:05 +0100 Subject: inject.sh: split to vendor.sh the download parts to the extent feasible, keep lbmk-specific parts on inject.sh to a minimum. this will later be used to re-sync cbmk's inject.sh with lbmk's, because cbmk's one doesn't handle vendor files. the way this is designed now, with this patch, will make cherry-picking lbmk to cbmk easier in the future, when keeping this part of cbmk in sync with lbmk. Signed-off-by: Leah Rowe --- include/inject.sh | 347 ++---------------------------------------------------- 1 file changed, 10 insertions(+), 337 deletions(-) (limited to 'include/inject.sh') diff --git a/include/inject.sh b/include/inject.sh index 7ec4e42b..ce61350a 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -3,12 +3,6 @@ # Copyright (c) 2022 Ferass El Hafidi # Copyright (c) 2023-2025 Leah Rowe -e6400_unpack="$xbmkpwd/src/bios_extract/dell_inspiron_1100_unpacker.py" -me7updateparser="$xbmkpwd/util/me7_update_parser/me7_update_parser.py" -pfs_extract="$xbmkpwd/src/biosutilities/Dell_PFS_Extract.py" -uefiextract="$xbmkpwd/elf/uefitool/uefiextract" -vendir="vendorfiles" -appdir="$vendir/app" cbcfgsdir="config/coreboot" hashfiles="vendorhashes blobhashes" # blobhashes for backwards compatibility dontflash="!!! AN ERROR OCCURED! Please DO NOT flash if injection failed. !!!" @@ -17,206 +11,12 @@ tmpromdel="$xbmklocal/DO_NOT_FLASH" nvm="util/nvmutil/nvm" ifdtool="elf/ifdtool/default/ifdtool" -cvchk="CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \ - CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW \ - CONFIG_LENOVO_TBFW_BIN CONFIG_FSP_M_FILE CONFIG_FSP_S_FILE" - -cv="CONFIG_ME_BIN_PATH CONFIG_SMSC_SCH5545_EC_FW_FILE CONFIG_KBC1126_FW1 \ - CONFIG_KBC1126_FW2 CONFIG_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2_OFFSET \ - CONFIG_VGA_BIOS_ID CONFIG_BOARD_DELL_E6400 CONFIG_FSP_S_CBFS \ - CONFIG_HAVE_REFCODE_BLOB CONFIG_REFCODE_BLOB_FILE CONFIG_GBE_BIN_PATH \ - CONFIG_IFD_BIN_PATH CONFIG_FSP_FD_PATH CONFIG_MRC_FILE CONFIG_FSP_M_CBFS \ - CONFIG_FSP_USE_REPO CONFIG_FSP_FULL_FD $cvchk" - -eval "`setvars "" has_hashes EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \ - E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \ - E6400_VGA_romname SCH5545EC_DL_url_bkup SCH5545EC_DL_hash _dest tree \ - mecleaner kbc1126_ec_dump MRC_refcode_cbtree new_mac _dl SCH5545EC_DL_url \ - archive EC_url boarddir rom cbdir DL_url nukemode cbfstoolref FSPFD_hash \ - _7ztest ME11bootguard ME11delta ME11version ME11sku ME11pch tmpromdir \ - IFD_platform ifdprefix _me _metmp mfs TBFW_url_bkup TBFW_url TBFW_hash \ - TBFW_size hashfile xromsize xchanged EC_url_bkup vfile cbcfg $cv`" - -download() -{ - [ $# -gt 0 ] || err "No argument given" - export PATH="$PATH:/sbin" - board="$1" && readvcfg && readkconfig && bootstrap && getfiles; : -} - -bootstrap() -{ - x_ ./mk -f coreboot ${cbdir##*/} - mk -b uefitool biosutilities bios_extract - [ -d "${kbc1126_ec_dump%/*}" ] && x_ make -C "$cbdir/util/kbc1126" - [ -n "$MRC_refcode_cbtree" ] && \ - cbfstoolref="elf/cbfstool/$MRC_refcode_cbtree/cbfstool" && \ - x_ ./mk -d coreboot "$MRC_refcode_cbtree"; : -} - -getfiles() -{ - [ -z "$CONFIG_HAVE_ME_BIN" ] || fetch intel_me "$DL_url" \ - "$DL_url_bkup" "$DL_hash" "$CONFIG_ME_BIN_PATH" - [ -z "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" ] || fetch sch5545ec \ - "$SCH5545EC_DL_url" "$SCH5545EC_DL_url_bkup" "$SCH5545EC_DL_hash" \ - "$CONFIG_SMSC_SCH5545_EC_FW_FILE" - [ -z "$CONFIG_KBC1126_FIRMWARE" ] || fetch kbc1126ec "$EC_url" \ - "$EC_url_bkup" "$EC_hash" "$CONFIG_KBC1126_FW1" - [ -z "$CONFIG_VGA_BIOS_FILE" ] || fetch e6400vga "$E6400_VGA_DL_url" \ - "$E6400_VGA_DL_url_bkup" "$E6400_VGA_DL_hash" "$CONFIG_VGA_BIOS_FILE" - [ -z "$CONFIG_HAVE_MRC" ] || fetch "mrc" "$MRC_url" "$MRC_url_bkup" \ - "$MRC_hash" "$CONFIG_MRC_FILE" - [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && fetch "refcode" "$MRC_url" \ - "$MRC_url_bkup" "$MRC_hash" "$CONFIG_REFCODE_BLOB_FILE" - [ -z "$CONFIG_LENOVO_TBFW_BIN" ] || fetch "tbfw" "$TBFW_url" \ - "$TBFW_url_bkup" "$TBFW_hash" "$CONFIG_LENOVO_TBFW_BIN" - [ -z "$CONFIG_FSP_M_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ - "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_M_FILE" copy - [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ - "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_S_FILE" copy; : -} - -fetch() -{ - dl_type="$1" - dl="$2" - dl_bkup="$3" - dlsum="$4" - _dest="${5##*../}" - - [ "$5" = "/dev/null" ] && return 0 - _dl="$XBMK_CACHE/file/$dlsum" - # HACK: if grabbing fsp from coreboot, fix the path for lbmk - [ "$dl_type" = "fsp" ] && for _cdl in dl dl_bkup; do - eval "$_cdl=\"\${$_cdl##*../}\"; _cdp=\"\$$_cdl\"" - [ -f "$_cdp" ] || _cdp="$cbdir/$_cdp" - [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\"" - done; : - - dlop="curl" && [ $# -gt 5 ] && dlop="$6" - xbmkget "$dl" "$dl_bkup" "$_dl" "$dlsum" "$dlop" - - x_ rm -Rf "${_dl}_extracted" - e "$_dest" f && return 0 - - x_ mkdir -p "${_dest%/*}" - remkdir "$appdir" - [ "$dl_type" = "fsp" ] || extract_archive "$_dl" "$appdir" || \ - [ "$dl_type" = "e6400vga" ] || err "$_dest $dl_type: !extract" - - x_ extract_$dl_type "$_dl" "$appdir" - set -u -e - e "$_dest" f missing && err "!extract_$dl_type. $dontflash"; : -} - -extract_intel_me() -{ - e "$mecleaner" f not && err "$cbdir: me_cleaner missing. $dontflash" - - _7ztest="$xbmklocal/metmp/a" - _me="$xbmkpwd/$_dest" - _metmp="$xbmklocal/me.bin" - x_ rm -f "$_metmp" "$xbmklocal/a" - - mfs="" && [ "$ME11bootguard" = "y" ] && mfs="--whitelist MFS" && \ - chkvars ME11delta ME11version ME11sku ME11pch - [ "$ME11bootguard" = "y" ] && x_ ./mk -f deguard - - set +u +e - x_ rm -Rf "$xbmkpwd/metmp" - ( fx_ find_me x_ find "$xbmkpwd/$appdir" -type f ) || : - [ "$ME11bootguard" != "y" ] && x_ mv "$_metmp" "$_me" && return 0 - - ( - x_ cd src/deguard/ - x_ ./finalimage.py --delta "data/delta/$ME11delta" --version \ - "$ME11version" --pch "$ME11pch" --sku "$ME11sku" \ - --fake-fpfs data/fpfs/zero --input "$_metmp" --output "$_me" - ) || err "Error running deguard for $_me - $dontflash"; : -} - -find_me() -{ - [ -f "$_metmp" ] && exit 1 - [ -L "$1" ] && return 0 - - _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r="" +cv="CONFIG_GBE_BIN_PATH" +[ -n "$cvxbmk" ] && cv="$cv $cvxbmk" +[ -n "$cvchk" ] && cv="$cv $cvchk" - "$mecleaner" $mfs $_r -t -O "$xbmklocal/a" -M "$_metmp" "$1" || \ - "$mecleaner" $mfs $_r -t -O "$_metmp" "$1" || "$me7updateparser" \ - -O "$_metmp" "$1" || extract_archive "$1" "$_7ztest" || return 0 - - [ -f "$_metmp" ] && exit 1 - ( fx_ find_me x_ find "$_7ztest" -type f ) || exit 1; : -} - -extract_archive() -{ - innoextract "$1" -d "$2" || python "$pfs_extract" "$1" -e || 7z x \ - "$1" -o"$2" || unar "$1" -o "$2" || unzip "$1" -d "$2" || return 1 - - [ ! -d "${_dl}_extracted" ] || x_ cp -R "${_dl}_extracted" "$2"; : -} - -extract_kbc1126ec() -{ - ( - x_ cd "$appdir/" - mv Rompaq/68*.BIN ec.bin || unar -D ROM.CAB Rom.bin || unar -D \ - Rom.CAB Rom.bin || unar -D 68*.CAB Rom.bin || err "!kbc1126 unar" - [ -f "ec.bin" ] || x_ mv Rom.bin ec.bin - x_ e ec.bin f && x_ "$kbc1126_ec_dump" ec.bin - ) || err "$board: can't extract kbc1126 ec firmware - $dontflash" - - x_ e "$appdir/ec.bin.fw1" f && x_ e "$appdir/ec.bin.fw2" f - x_ cp "$appdir/"ec.bin.fw* "${_dest%/*}/" -} - -extract_e6400vga() -{ - set +u +e - chkvars E6400_VGA_offset E6400_VGA_romname - tail -c +$E6400_VGA_offset "$_dl" | gunzip > "$appdir/bios.bin" || : - ( - x_ cd "$appdir" - x_ e "bios.bin" f - "$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n" - ) || err "can't extract e6400 vga rom - $dontflosh" - x_ cp "$appdir/$E6400_VGA_romname" "$_dest" -} - -extract_sch5545ec() -{ - # full system ROM (UEFI), to extract with UEFIExtract: - _bios="${_dl}_extracted/Firmware/1 $dlsum -- 1 System BIOS vA.28.bin" - # this is the SCH5545 firmware, inside of the extracted UEFI ROM: - _sch5545ec_fw="$_bios.dump/4 7A9354D9-0468-444A-81CE-0BF617D890DF" - _sch5545ec_fw="$_sch5545ec_fw/54 D386BEB8-4B54-4E69-94F5-06091F67E0D3" - _sch5545ec_fw="$_sch5545ec_fw/0 Raw section/body.bin" # <-- this! - - x_ "$uefiextract" "$_bios" - x_ cp "$_sch5545ec_fw" "$_dest" -} - -# Lenovo ThunderBolt firmware updates: -# https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/thinkpad-t-series-laptops/thinkpad-t480-type-20l5-20l6/20l5/solutions/ht508988 -extract_tbfw() -{ - chkvars TBFW_size; fx_ copytb x_ find "$appdir" -type f -name "TBT.bin" -} - -copytb() -{ - [ -f "$1" ] && [ ! -L "$1" ] && x_ dd if=/dev/null of="$1" bs=1 \ - seek=$TBFW_size && x_ mv "$1" "$_dest" && return 1; : -} - -extract_fsp() -{ - x_ python "$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" split -f "$1" \ - -o "${_dest%/*}" -n "Fsp.fd" -} +eval "`setvars "" archive boarddir cbdir IFD_platform ifdprefix tree new_mac \ + tmpromdir $cv`" inject() { @@ -245,7 +45,7 @@ inject() x_ make -C util/nvmutil clean && x_ make -C util/nvmutil check_release - readvcfg && patch_release + check_target && patch_release [ "$xchanged" = "y" ] && remktar @@ -275,7 +75,7 @@ check_release() esac; : } -readvcfg() +check_target() { if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \ || [ "$board" = "serprog_pico" ]; then @@ -286,11 +86,7 @@ readvcfg() eval "`setcfg "$boarddir/target.cfg"`" chkvars tree && x_ ./mk -d coreboot "$tree" - [ -z "$vcfg" ] && return 1 - - vfile="config/vendor/$vcfg/pkg.cfg" - [ -L "$vfile" ] && err "'$archive', '$board': $vfile is a symlink" - [ -f "$vfile" ] || err "'$archive', '$board': $vfile doesn't exist" + [ -n "$vcfg" ] && check_vcfg cbdir="src/coreboot/$tree" cbfstool="elf/cbfstool/$tree/cbfstool" @@ -318,8 +114,8 @@ patch_release() done readkconfig || exit 0 - fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" + fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" ( check_vendor_hashes ) || err "Can't verify hashes for '$archive'"; : [ -n "$new_mac" ] && [ -n "$CONFIG_GBE_BIN_PATH" ] && modify_mac; : @@ -330,17 +126,7 @@ readkconfig() x_ rm -f "$xbmktmp/cbcfg" fx_ scankconfig x_ find "$boarddir/config" -type f eval "`setcfg "$xbmktmp/cbcfg" 1`" - setvfile_kconfig && return 1; : -} - -setvfile_kconfig() -{ - for c in $cvchk; do - eval "[ \"\${$c}\" = \"/dev/null\" ] && continue" - eval "[ -z \"\${$c}\" ] && continue" - eval "`setcfg "$vfile"`" - return 1 - done + setvfile && return 1; : } scankconfig() @@ -350,119 +136,6 @@ scankconfig() done } -prep() -{ - _xrom="$1" - _xromname="${1##*/}" - _xromnew="${_xrom%/*}/${_xromname#"$vfix"}" - [ "$nukemode" = "nuke" ] && _xromnew="${_xrom%/*}/$vfix${_xrom##*/}" - - e "$_xrom" f missing && return 0 - [ -z "${_xromname#"$vfix"}" ] && err "$_xromname / $vfix: name match" - - # Remove the prefix and 1-byte pad - if [ "$nukemode" != "nuke" ] && \ - [ "${_xromname#"$vfix"}" != "$_xromname" ]; then - xromsize="$(expr $(stat -c '%s' "$_xrom") - 1)" || err "!int" - [ $xromsize -lt 524288 ] && err "too small, $xromsize: $_xrom" - - x_ dd if="$_xrom" of="$_xromnew" bs=$xromsize count=1 - x_ rm -f "$_xrom" - - _xrom="$_xromnew" - fi - - [ "$nukemode" = "nuke" ] && mksha512sum "$_xrom" "vendorhashes" - - add_vfiles "$_xrom" || return 1 # if break return, can still change MAC - [ "$nukemode" != "nuke" ] && return 0 - - # Rename the file, prefixing a warning saying not to flash - cat "$_xrom" config/data/coreboot/0 > "$_xromnew" || err "!pad $_xrom" - x_ rm -f "$_xrom" -} - -add_vfiles() -{ - rom="$1" - - if [ "$has_hashes" != "y" ] && [ "$nukemode" != "nuke" ]; then - printf "'%s' has no hash file. Skipping.\n" "$archive" 1>&2 - return 1 - elif [ "$has_hashes" = "y" ] && [ "$nukemode" = "nuke" ]; then - printf "'%s' has a hash file. Skipping nuke.\n" "$archive" 1>&2 - return 1 - fi - - [ -n "$CONFIG_HAVE_REFCODE_BLOB" ] && vfile "fallback/refcode" \ - "$CONFIG_REFCODE_BLOB_FILE" "stage" - [ "$CONFIG_HAVE_MRC" = "y" ] && vfile "mrc.bin" "$CONFIG_MRC_FILE" \ - "mrc" "0xfffa0000" - [ "$CONFIG_HAVE_ME_BIN" = "y" ] && vfile IFD "$CONFIG_ME_BIN_PATH" me - [ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && vfile ecfw1.bin \ - "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" && vfile \ - ecfw2.bin "$CONFIG_KBC1126_FW2" raw "$CONFIG_KBC1126_FW2_OFFSET" - [ -n "$CONFIG_VGA_BIOS_FILE" ] && [ -n "$CONFIG_VGA_BIOS_ID" ] && \ - vfile "pci$CONFIG_VGA_BIOS_ID.rom" "$CONFIG_VGA_BIOS_FILE" optionrom - [ "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" = "y" ] && \ - [ -n "$CONFIG_SMSC_SCH5545_EC_FW_FILE" ] && \ - vfile sch5545_ecfw.bin "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw - [ -z "$CONFIG_FSP_USE_REPO" ] && [ -z "$CONFIG_FSP_FULL_FD" ] && \ - [ -n "$CONFIG_FSP_M_FILE" ] && \ - vfile "$CONFIG_FSP_M_CBFS" "$CONFIG_FSP_M_FILE" fsp --xip - [ -z "$CONFIG_FSP_USE_REPO" ] && [ -z "$CONFIG_FSP_FULL_FD" ] && \ - [ -n "$CONFIG_FSP_S_FILE" ] && \ - vfile "$CONFIG_FSP_S_CBFS" "$CONFIG_FSP_S_FILE" fsp - - printf "ROM image successfully patched: %s\n" "$rom" - xchanged="y" -} - -vfile() -{ - [ "$2" = "/dev/null" ] && return 0 - - cbfsname="$1" - _dest="${2##*../}" - _t="$3" - - _offset="" - - if [ "$_t" = "fsp" ] && [ $# -gt 3 ]; then - _offset="$4" - elif [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ]; then - err "vfile $*, $rom: offset given but empty (undefined)" - fi - - [ "$nukemode" = "nuke" ] || x_ e "$_dest" f - - if [ "$cbfsname" = "IFD" ]; then - [ "$nukemode" = "nuke" ] || x_ "$ifdtool" $ifdprefix -i \ - $_t:$_dest "$rom" -O "$rom" - [ "$nukemode" != "nuke" ] || x_ "$ifdtool" $ifdprefix --nuke \ - $_t "$rom" -O "$rom" - elif [ "$nukemode" = "nuke" ]; then - x_ "$cbfstool" "$rom" remove -n "$cbfsname" - elif [ "$_t" = "stage" ]; then # the only stage we handle is refcode - x_ rm -f "$xbmklocal/refcode" - x_ "$rmodtool" -i "$_dest" -o "$xbmklocal/refcode" - x_ "$cbfstool" "$rom" add-stage -f "$xbmklocal/refcode" \ - -n "$cbfsname" -t stage - else - x_ "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ - -t $_t $_offset - fi - xchanged="y"; : -} - -check_vendor_hashes() -{ - x_ cd "$tmpromdir" - [ "$has_hashes" = "n" ] || [ "$nukemode" = "nuke" ] || sha512sum \ - --status -c "$hashfile" || x_ sha1sum --status -c "$hashfile" - x_ rm -f "$hashfile" -} - modify_mac() { x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" -- cgit v1.2.1