diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/git.sh | 56 | ||||
-rw-r--r-- | include/lib.sh | 178 | ||||
-rw-r--r-- | include/mrc.sh | 14 | ||||
-rw-r--r-- | include/rom.sh | 129 | ||||
-rw-r--r-- | include/vendor.sh | 678 |
5 files changed, 722 insertions, 333 deletions
diff --git a/include/git.sh b/include/git.sh index 2c43cd22..42b04010 100644 --- a/include/git.sh +++ b/include/git.sh @@ -1,9 +1,11 @@ # SPDX-License-Identifier: GPL-3.0-or-later -# Copyright (c) 2020-2021,2023-2024 Leah Rowe <leah@libreboot.org> +# Copyright (c) 2020-2021,2023-2025 Leah Rowe <leah@libreboot.org> # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> -eval `setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \ - depend subfile_bkup repofail` +eval "`setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \ + depend subfile_bkup repofail`" + +tmpgit="$xbmkpwd/tmp/gitclone" fetch_targets() { @@ -12,14 +14,15 @@ fetch_targets() e "src/$project/$tree" d && return 0 printf "Creating %s tree %s\n" "$project" "$tree" - git_prep "$loc" "$loc" "$PWD/$configdir/$tree/patches" \ - "src/$project/$tree" u; nuke "$project/$tree" "$project/$tree" + git_prep "$loc" "$loc" "$xbmkpwd/$configdir/$tree/patches" \ + "src/$project/$tree" u + nuke "$project/$tree" "$project/$tree" } fetch_project() { - eval `setvars "" xtree tree_depend` - eval `setcfg "config/git/$project/pkg.cfg"` + eval "`setvars "" xtree tree_depend`" + eval "`setcfg "config/git/$project/pkg.cfg"`" chkvars url @@ -31,8 +34,8 @@ fetch_project() clone_project for x in config/git/*; do - [ -d "$x" ] && nuke "${x##*/}" "src/${x##*/}" 2>/dev/null - done; return 0 + [ -d "$x" ] && nuke "${x##*/}" "src/${x##*/}" 2>/dev/null; : + done; : } clone_project() @@ -42,21 +45,25 @@ clone_project() printf "Downloading project '%s' to '%s'\n" "$project" "$loc" e "$loc" d missing && remkdir "${tmpgit%/*}" && git_prep \ - "$url" "$bkup_url" "$PWD/config/$project/patches" "$loc"; : + "$url" "$bkup_url" "$xbmkpwd/config/$project/patches" "$loc"; : } git_prep() { - _patchdir="$3"; _loc="$4" # $1 and $2 are gitrepo and gitrepo_backup + _patchdir="$3" + _loc="$4" # $1 and $2 are gitrepo and gitrepo_backup - chkvars rev; tmpclone "$1" "$2" "$tmpgit" "$rev" "$_patchdir" + chkvars rev + tmpclone "$1" "$2" "$tmpgit" "$rev" "$_patchdir" if singletree "$project" || [ $# -gt 4 ]; then - prep_submodules "$_loc"; fi + prep_submodules "$_loc" + fi [ "$project" = "coreboot" ] && [ -n "$xtree" ] && [ $# -gt 2 ] && \ [ "$xtree" != "$tree" ] && link_crossgcc "$_loc" [ "$XBMK_RELEASE" = "y" ] && \ - [ "$_loc" != "$XBMK_CACHE/repo/$project" ] && rmgit "$tmpgit" + [ "$_loc" != "$XBMK_CACHE/repo/$project" ] && \ + rmgit "$tmpgit" move_repo "$_loc" } @@ -65,13 +72,14 @@ prep_submodules() { [ -f "$mdir/module.list" ] && while read -r msrcdir; do fetch_submodule "$msrcdir" - done < "$mdir/module.list"; return 0 + done < "$mdir/module.list"; : } fetch_submodule() { mcfgdir="$mdir/${1##*/}" - eval `setvars "" subhash subrepo subrepo_bkup subfile subfile_bkup st` + eval "`setvars "" subhash subrepo subrepo_bkup subfile subfile_bkup \ + st`" [ ! -f "$mcfgdir/module.cfg" ] || . "$mcfgdir/module.cfg" || \ $err "! . $mcfgdir/module.cfg" @@ -91,10 +99,9 @@ fetch_submodule() "$mdir/${1##*/}/patches" } -livepull="n" tmpclone() { - [ "$repofail" = "y" ] && \ + livepull="n" && [ "$repofail" = "y" ] && \ printf "Cached clone failed; trying online.\n" 1>&2 && livepull="y" repofail="n" @@ -104,7 +111,7 @@ tmpclone() mkdir -p "$XBMK_CACHE/repo" || $err "!rmdir $XBMK_CACHE/repo" if [ "$livepull" = "y" ] && [ ! -d "$repodir" ]; then - git clone $1 "$repodir" || git clone $2 "$repodir" || \ + git clone "$1" "$repodir" || git clone $2 "$repodir" || \ $err "!clone $1 $2 $repodir $4 $5" # elif [ -d "$repodir" ] && [ $# -lt 6 ]; then git -C "$repodir" pull || sleep 3 || git -C "$repodir" pull \ @@ -116,17 +123,18 @@ tmpclone() git_am_patches "$3" "$5" ) || repofail="y" - [ "$repofail" = "y" ] && [ $# -lt 6 ] && tmpclone $@ retry + [ "$repofail" = "y" ] && [ $# -lt 6 ] && tmpclone "$@" retry [ "$repofail" = "y" ] && $err "!clone $1 $2 $3 $4 $5"; : } git_am_patches() { for p in "$2/"*; do - [ -L "$p" ] && continue; [ -e "$p" ] || continue + [ -L "$p" ] && continue + [ -e "$p" ] || continue [ -d "$p" ] && git_am_patches "$1" "$p" && continue [ ! -f "$p" ] || git -C "$1" am "$p" || $err "$1 $2: !am $p" - done; return 0 + done; : } link_crossgcc() @@ -134,7 +142,7 @@ link_crossgcc() ( x_ cd "$tmpgit/util" && x_ rm -Rf crossgcc ln -s "../../$xtree/util/crossgcc" crossgcc || $err "$1: !xgcc link" - ) || $err "$1: !xgcc link" + ) || $err "$1: !xgcc link"; : } move_repo() @@ -150,5 +158,5 @@ nuke() e "config/${1%/}/nuke.list" f missing || while read -r nukefile; do rmf="src/${2%/}/$nukefile" && [ -L "$rmf" ] && continue e "$rmf" e missing || rm -Rf "$rmf" || $err "!rm $rmf, ${2%/}" - done < "config/${1%/}/nuke.list"; return 0 + done < "config/${1%/}/nuke.list"; : } diff --git a/include/lib.sh b/include/lib.sh index e439ef8b..cb8e0303 100644 --- a/include/lib.sh +++ b/include/lib.sh @@ -1,45 +1,60 @@ # SPDX-License-Identifier: GPL-3.0-only # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> # Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> -# Copyright (c) 2020-2024 Leah Rowe <leah@libreboot.org> +# Copyright (c) 2020-2025 Leah Rowe <leah@libreboot.org> export LC_COLLATE=C export LC_ALL=C +projectname="libreboot" +projectsite="https://libreboot.org/" + +[ -z "${PATH+x}" ] && \ + export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" +xbmkpath="$PATH" + _ua="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" ifdtool="elf/ifdtool/default/ifdtool" cbfstool="elf/cbfstool/default/cbfstool" -tmpgit="$PWD/tmp/gitclone" +rmodtool="elf/cbfstool/default/rmodtool" grubdata="config/data/grub" err="err_" err_() { - printf "ERROR %s: %s\n" "$0" "$1" 1>&2; exit 1 + printf "ERROR %s: %s\n" "$0" "$1" 1>&2 + exit 1 +} +x_() { + [ $# -lt 1 ] || "$@" || $err "Unhandled error for: $(echo "$@")"; : } +xbmkpwd="`pwd`" || $err "Cannot generate PWD" +export PWD="$xbmkpwd" + setvars() { _setvars="" && [ $# -lt 2 ] && $err "setvars: too few arguments" - val="$1" && shift 1 && for var in $@; do + val="$1" && shift 1 && for var in "$@"; do _setvars="$var=\"$val\"; $_setvars" - done; printf "%s\n" "${_setvars% }" + done + printf "%s\n" "${_setvars% }" } chkvars() { - for var in $@; do - eval "[ -n "\${$var+x}" ] || \$err \"$var unset\"" - eval "[ -n "\$$var" ] || \$err \"$var unset\"" - done; return 0 + for var in "$@"; do + eval "[ -n \"\${$var+x}\" ] || \$err \"$var unset\"" + eval "[ -n \"\$$var\" ] || \$err \"$var unset\"" + done; : } -eval `setvars "" _nogit board xbmk_parent versiondate projectsite projectname \ - aur_notice configdir datadir version relname` +eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ + datadir version relname`" -for fv in projectname projectsite version versiondate; do - eval "[ ! -f "$fv" ] || read -r $fv < \"$fv\" || :" -done; chkvars projectname projectsite +for fv in version versiondate; do + eval "[ ! -f \".$fv\" ] || read -r $fv < \".$fv\" || :" +done setcfg() { @@ -56,43 +71,80 @@ e() estr="[ -$es_t \"\$1\" ] || return 1" [ $# -gt 2 ] && estr="[ -$es_t \"\$1\" ] && return 1" && es2="missing" - eval "$estr"; printf "%s %s\n" "$1" "$es2" 1>&2 + eval "$estr" + printf "%s %s\n" "$1" "$es2" 1>&2 } install_packages() { [ $# -lt 2 ] && $err "fewer than two arguments" - eval `setcfg "config/dependencies/$2"` + [ $# -gt 2 ] && reinstall="$3" + eval "`setcfg "config/dependencies/$2"`" + + chkvars pkg_add pkglist $pkg_add $pkglist || $err "Cannot install packages" [ -n "$aur_notice" ] && \ - printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; return 0 + printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; : } -[ $# -gt 0 ] && [ "$1" = "dependencies" ] && install_packages $@ && exit 0 +if [ $# -gt 0 ] && [ "$1" = "dependencies" ]; then + install_packages "$@" || exit 1 + exit 0 +fi + +pyver="2" +python="python3" +command -v python3 1>/dev/null || python="python" +command -v $python 1>/dev/null || pyver="" +[ -z "$pyver" ] || \ + python -c 'import sys; print(sys.version_info[:])' 1>/dev/null \ + 2>/dev/null || $err "Cannot determine which Python version." +[ -n "$pyver" ] && \ + pyver="`python -c 'import sys; print(sys.version_info[:])' | \ + awk '{print $1}'`" && \ + pyver="${pyver#(}" && pyver="${pyver%,}" +if [ "${pyver%%.*}" != "3" ]; then + printf "Wrong python version, or python missing. Must be v 3.x.\n" 1>&2 + exit 1 +fi id -u 1>/dev/null 2>/dev/null || $err "suid check failed (id -u)" [ "$(id -u)" != "0" ] || $err "this command as root is not permitted" +# XBMK_CACHE is a directory, for caching downloads and git repositories +[ -z "${XBMK_CACHE+x}" ] && export XBMK_CACHE="$xbmkpwd/cache" +[ -z "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache" +[ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$xbmkpwd/cache" ] && \ + $err "cachedir is default, $xbmkpwd/cache, but it exists and is a symlink" +[ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache" +[ -f "$XBMK_CACHE" ] && $err "cachedir '$XBMK_CACHE' exists but it's a file" + +# unify all temporary files/directories in a single TMPDIR [ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || unset TMPDIR [ -n "${TMPDIR+x}" ] && export TMPDIR="$TMPDIR" - if [ -z "${TMPDIR+x}" ]; then - [ -f "lock" ] && $err "$PWD/lock exists. Is a build running?" + [ -f "lock" ] && $err "$xbmkpwd/lock exists. Is a build running?" export TMPDIR="/tmp" export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)" touch lock || $err "cannot create 'lock' file" - xbmk_parent="y" + x_ rm -Rf "$XBMK_CACHE/xbmkpath" "$XBMK_CACHE/gnupath" + x_ mkdir -p "$XBMK_CACHE/gnupath" "$XBMK_CACHE/xbmkpath" + export PATH="$XBMK_CACHE/xbmkpath:$XBMK_CACHE/gnupath:$PATH" + ( + # set up python v3.x in PATH, in case it's not set up correctly. + # see code above that detected the correct python3 command. + cd "$XBMK_CACHE/xbmkpath" || $err "can't cd $XBMK_CACHE/xbmkpath" + x_ ln -s "`command -v "$python"`" python + ) || $err "Can't set up python symlink in $XBMK_CACHE/xbmkpath" + + xbmk_rval=0 + ./mk "$@" || xbmk_rval=1 + rm -Rf "$TMPDIR" || xbmk_rval=1 + rm -f lock || xbmk_rval=1 + exit $xbmk_rval fi -# XBMK_CACHE is a directory, for caching downloads and git repositories -[ -z "${XBMK_CACHE+x}" ] && export XBMK_CACHE="$PWD/cache" -[ -z "$XBMK_CACHE" ] && export XBMK_CACHE="$PWD/cache" -[ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$PWD/cache" ] && \ - $err "cachedir is default, $PWD/cache, but it exists and is a symlink" -[ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$PWD/cache" -[ -f "$XBMK_CACHE" ] && $err "cachedir '$XBMK_CACHE' exists but it's a file" - # if "y": a coreboot target won't be built if target.cfg says release="n" # (this is used to exclude certain build targets from releases) [ -z "${XBMK_RELEASE+x}" ] && export XBMK_RELEASE="n" @@ -102,15 +154,10 @@ fi expr "X$XBMK_THREADS" : "X-\{0,1\}[0123456789][0123456789]*$" \ 1>/dev/null 2>/dev/null || export XBMK_THREADS=1 # user gave a non-integer -x_() { - [ $# -lt 1 ] || $@ || \ - $err "Unhandled non-zero exit: $(echo "$@")"; return 0 -} - -[ -e ".git" ] || [ -f "version" ] || printf "unknown\n" > version || \ - $err "Cannot generate unknown version file" -[ -e ".git" ] || [ -f "versiondate" ] || printf "1716415872\n" > versiondate \ - || $err "Cannot generate unknown versiondate file" +[ -e ".git" ] || [ -f ".version" ] || printf "unknown\n" > .version || \ + $err "Cannot generate unknown .version file" +[ -e ".git" ] || [ -f ".versiondate" ] || printf "1716415872\n" > \ + .versiondate || $err "Cannot generate unknown .versiondate file" version_="$version" [ ! -e ".git" ] || version="$(git describe --tags HEAD 2>&1)" || \ @@ -118,8 +165,9 @@ version_="$version" versiondate_="$versiondate" [ ! -e ".git" ] || versiondate="$(git show --no-patch --no-notes \ --pretty='%ct' HEAD)" || versiondate="$versiondate_" -for p in projectname version versiondate projectsite; do - chkvars "$p"; eval "x_ printf \"%s\\n\" \"\$$p\" > $p" +for p in version versiondate; do + chkvars "$p" + eval "printf \"%s\\n\" \"\$$p\" > .$p || $err \"can't save $p\"" done relname="$projectname-$version" export LOCALVERSION="-$projectname-${version%%-*}" @@ -129,7 +177,7 @@ check_defconfig() [ -d "$1" ] || $err "Target '$1' not defined." for x in "$1"/config/*; do [ -f "$x" ] && printf "%s\n" "$x" && return 1 - done; return 0 + done; : } remkdir() @@ -140,20 +188,19 @@ remkdir() mkrom_tarball() { - printf "%s\n" "$version" > "$1/version" || $err "$1 !version" - printf "%s\n" "$versiondate" > "$1/versiondate" || $err "$1 !vdate" - printf "%s\n" "$projectname" > "$1/projectname" || $err "$1 !pname" + printf "%s\n" "$version" > "$1/.version" || $err "$1 !version" + printf "%s\n" "$versiondate" > "$1/.versiondate" || $err "$1 !vdate" - mktarball "$1" "${1%/*}/${relname}_${1##*/}.tar.xz"; x_ rm -Rf "$1"; : + mktarball "$1" "${1%/*}/${relname}_${1##*/}.tar.xz" + x_ rm -Rf "$1" } mktarball() { - [ "${2%/*}" = "$2" ] || \ + if [ "${2%/*}" != "$2" ]; then mkdir -p "${2%/*}" || $err "mk, !mkdir -p \"${2%/*}\"" - printf "\nCreating archive: %s\n\n" "$2" + fi tar -c "$1" | xz -T$XBMK_THREADS -9e > "$2" || $err "mktarball 2, $1" - mksha512sum "$2" "${2##*/}.sha512" } mksha512sum() @@ -179,26 +226,42 @@ singletree() { for targetfile in "config/${1}/"*/target.cfg; do [ -e "$targetfile" ] && [ -f "$targetfile" ] && return 1; : - done; return 0 + done; : } +# can grab from the internet, or copy locally. +# if copying locally, it can only copy a file. download() { + _dlop="curl" && [ $# -gt 4 ] && _dlop="$5" cached="$XBMK_CACHE/file/$4" dl_fail="n" # 1 url, 2 url backup, 3 destination, 4 checksum vendor_checksum "$4" "$cached" 2>/dev/null && dl_fail="y" [ "$dl_fail" = "n" ] && e "$3" f && return 0 - mkdir -p "${3%/*}" "$XBMK_CACHE/file" || \ - $err "!mkdir '$3' '$XBMK_CACHE/file'" + x_ mkdir -p "${3%/*}" "$XBMK_CACHE/file" for url in "$1" "$2"; do [ "$dl_fail" = "n" ] && break [ -z "$url" ] && continue rm -f "$cached" || $err "!rm -f '$cached'" - curl --location --retry 3 -A "$_ua" "$url" -o "$cached" || \ - wget --tries 3 -U "$_ua" "$url" -O "$cached" || continue + if [ "$_dlop" = "curl" ]; then + curl --location --retry 3 -A "$_ua" "$url" \ + -o "$cached" || wget --tries 3 -U "$_ua" "$url" \ + -O "$cached" || continue + elif [ "$_dlop" = "copy" ]; then + [ -L "$url" ] && \ + printf "dl %s %s %s %s: '%s' is a symlink\n" \ + "$1" "$2" "$3" "$4" "$url" 1>&2 && continue + [ ! -f "$url" ] && \ + printf "dl %s %s %s %s: '%s' not a file\n" \ + "$1" "$2" "$3" "$4" "$url" 1>&2 && continue + cp "$url" "$cached" || continue + else + $err "$1 $2 $3 $4: Unsupported dlop type: '$_dlop'" + fi vendor_checksum "$4" "$cached" || dl_fail="n" - done; [ "$dl_fail" = "y" ] && $err "$1 $2 $3 $4: not downloaded" - [ "$cached" = "$3" ] || cp "$cached" "$3" || $err "!d cp $cached $3"; : + done + [ "$dl_fail" = "y" ] && $err "$1 $2 $3 $4: not downloaded" + [ "$cached" = "$3" ] || x_ cp "$cached" "$3"; : } vendor_checksum() @@ -225,14 +288,13 @@ cbfs() fi fi - "$cbfstool" "$fRom" $ccmd -f "$fAdd" -n "$fName" $lzma || \ - $err "CBFS fail: $fRom $ccmd -f '$fAdd' -n '$fName' $lzma"; : + x_ "$cbfstool" "$fRom" $ccmd -f "$fAdd" -n "$fName" $lzma } mk() { mk_flag="$1" || $err "No argument given" - shift 1 && for mk_arg in $@; do + shift 1 && for mk_arg in "$@"; do ./mk $mk_flag $mk_arg || $err "./mk $mk_flag $mk_arg"; : done; : } diff --git a/include/mrc.sh b/include/mrc.sh index 2e00d9f9..a5f1b37c 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -4,7 +4,7 @@ # Modifications in this version are Copyright 2021, 2023 and 2024 Leah Rowe. # Original copyright detailed in repo: https://review.coreboot.org/coreboot/ -eval `setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board SHELLBALL` +eval "`setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board SHELLBALL`" extract_mrc() { @@ -20,7 +20,7 @@ extract_mrc() "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ -f "$_dest" -r RO_SECTION || $err "extract_mrc: !$cbfstool $_dest" - [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode; return 0 + [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode; : } extract_partition() @@ -50,12 +50,10 @@ extract_refcode() chkvars cbfstoolref mkdir -p "${_refdest%/*}" || $err "ref: !mkdir -p ${_refdest%/*}" - "$cbfstoolref" "$appdir/bios.bin" extract \ - -m x86 -n fallback/refcode -f "$_refdest" -r RO_SECTION \ - || $err "extract_refcode $board: !cbfstoolref $_refdest" + x_ "$cbfstoolref" "$appdir/bios.bin" extract \ + -m x86 -n fallback/refcode -f "$_refdest" -r RO_SECTION # enable the Intel GbE device, if told by offset MRC_refcode_gbe - [ -z "$MRC_refcode_gbe" ] || dd if="config/ifd/hp820g2/1.bin" \ - of="$_refdest" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc || \ - $err "extract_refcode $_refdest: byte $MRC_refcode_gbe"; return 0 + [ -z "$MRC_refcode_gbe" ] || x_ dd if="config/ifd/hp820g2/1.bin" \ + of="$_refdest" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; : } diff --git a/include/rom.sh b/include/rom.sh index db6ce01d..7e2271f1 100644 --- a/include/rom.sh +++ b/include/rom.sh @@ -1,27 +1,50 @@ -#!/usr/bin/env sh # SPDX-License-Identifier: GPL-3.0-or-later -# Copyright (c) 2014-2016,2020-2021,2023-2024 Leah Rowe <leah@libreboot.org> +# Copyright (c) 2014-2016,2020-2021,2023-2025 Leah Rowe <leah@libreboot.org> # Copyright (c) 2021-2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> # Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com> -# Copyright (c) 2023 Riku Viitanen <riku.viitanen@protonmail.com> +# Copyright (c) 2023-2024 Riku Viitanen <riku.viitanen@protonmail.com> mkserprog() { + [ $# -lt 1 ] && $err "mkserprog: no arguments provided" [ "$_f" = "-d" ] && return 0 # dry run + + [ "$1" = "pico" ] && mkpicotool + basename -as .h "$serdir/"*.h > "$TMPDIR/ser" || $err "!mk $1 $TMPDIR" while read -r sertarget; do - [ "$1" = "rp2040" ] && x_ cmake -DPICO_BOARD="$sertarget" \ + [ "$1" = "pico" ] && + x_ rm -rf "$sersrc/build" \ + && (pt=$(x_ grep "pico_cmake_set" \ + "$picosdk/src/boards/include/boards/$sertarget.h" \ + | grep "PICO_PLATFORM" | cut -d= -f2 | tr -d [:blank:]) + mkdir -p "$sersrc/build_$pt" + ln -srf "$sersrc/build_$pt/" "$sersrc/build") \ + && x_ cmake -DPICO_BOARD="$sertarget" \ -DPICO_SDK_PATH="$picosdk" -B "$sersrc/build" "$sersrc" \ + -Dpicotool_DIR="$picotool/picotool" \ && x_ cmake --build "$sersrc/build" [ "$1" = "stm32" ] && x_ make -C "$sersrc" \ libopencm3-just-make BOARD=$sertarget && x_ make -C \ - "$sersrc" BOARD=$sertarget; x_ mkdir -p "bin/serprog_$1" + "$sersrc" BOARD=$sertarget + x_ mkdir -p "bin/serprog_$1" x_ mv "$serx" "bin/serprog_$1/serprog_$sertarget.${serx##*.}" done < "$TMPDIR/ser" - [ "$XBMK_RELEASE" = "y" ] && mkrom_tarball "bin/serprog_$1"; return 0 + [ "$XBMK_RELEASE" = "y" ] && mkrom_tarball "bin/serprog_$1"; : +} + +mkpicotool() +{ + rm -Rf "$picotool" || $err "Can't remove picotool builddir" + ( + x_ cd src/picotool + x_ cmake -DCMAKE_INSTALL_PREFIX=xbmkbin -DPICOTOOL_FLAT_INSTALL=1 \ + -DPICO_SDK_PATH=../pico-sdk + make install || $err "Can't build picotool"; : + ) || $err "Can't build picotool"; : } copyps1bios() @@ -37,17 +60,15 @@ copyps1bios() mkpayload_grub() { - eval `setvars "" grub_modules grub_install_modules` - $dry eval `setcfg "$grubdata/module/$tree"` + eval "`setvars "" grub_modules grub_install_modules`" + $dry eval "`setcfg "$grubdata/module/$tree"`" $dry x_ rm -f "$srcdir/grub.elf"; $dry \ - "$srcdir/grub-mkstandalone" --grub-mkimage="$srcdir/grub-mkimage" \ + x_ "$srcdir/grub-mkstandalone" --grub-mkimage="$srcdir/grub-mkimage" \ -O i386-coreboot -o "$srcdir/grub.elf" -d "${srcdir}/grub-core/" \ --fonts= --themes= --locales= --modules="$grub_modules" \ --install-modules="$grub_install_modules" \ "/boot/grub/grub_default.cfg=${srcdir}/.config" \ - "/boot/grub/grub.cfg=$grubdata/memdisk.cfg" \ - "/background.png=$grubdata/background/background1280x800.png" || \ - $err "$tree: cannot build grub.elf"; return 0 + "/boot/grub/grub.cfg=$grubdata/memdisk.cfg"; : } mkvendorfiles() @@ -57,7 +78,7 @@ mkvendorfiles() printf "%s\n" "${version%%-*}" > "$srcdir/.coreboot-version" || \ $err "!mk $srcdir .coreboot-version" [ -z "$mode" ] && [ "$target" != "$tree" ] && \ - x_ ./vendor download $target; return 0 + x_ ./mk download "$target"; : } cook_coreboot_config() @@ -79,11 +100,15 @@ check_coreboot_utils() utilmode="" && [ -n "$mode" ] && utilmode="clean" x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs - [ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ] && \ - x_ mkdir -p "$utilelfdir" && \ - x_ cp "$utilsrcdir/$util" "elf/$util/$1" - [ -z "$mode" ] || x_ rm -Rf "$utilelfdir"; continue - done; return 0 + if [ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ]; then + x_ mkdir -p "$utilelfdir" + x_ cp "$utilsrcdir/$util" "$utilelfdir" + [ "$util" = "cbfstool" ] || continue + x_ cp "$utilsrcdir/rmodtool" "$utilelfdir" + elif [ -n "$mode" ]; then + x_ rm -Rf "$utilelfdir" + fi; : + done; : } mkcorebootbin() @@ -93,7 +118,8 @@ mkcorebootbin() tmprom="$TMPDIR/coreboot.rom" $dry x_ cp "$srcdir/build/coreboot.rom" "$tmprom" - initmode="${defconfig##*/}"; displaymode="${initmode##*_}" + initmode="${defconfig##*/}" + displaymode="${initmode##*_}" [ "$displaymode" = "$initmode" ] && displaymode="" # "normal" config initmode="${initmode%%_*}" cbfstool="elf/cbfstool/$tree/cbfstool" @@ -104,7 +130,8 @@ mkcorebootbin() if [ "$payload_uboot_i386" = "y" ] || \ [ "$payload_uboot_amd64" = "y" ]; then - printf "'$target' has x86 U-Boot; assuming SeaBIOS=y\n" 1>&2 + printf "'%s' has x86 U-Boot; assuming SeaBIOS=y\n" \ + "$target" 1>&2 payload_seabios="y" fi @@ -122,23 +149,36 @@ mkcorebootbin() [ "$payload_memtest" = "y" ] || payload_memtest="n" [ "$(uname -m)" = "x86_64" ] || payload_memtest="n" + [ "$payload_grubsea" = "y" ] && [ "$initmode" = "normal" ] && \ + payload_grubsea="n" + [ "$payload_grub" = "y" ] || payload_grubsea="n" + if $dry grep "CONFIG_PAYLOAD_NONE=y" "$defconfig"; then [ "$payload_seabios" = "y" ] && pname="seabios" && \ $dry add_seabios [ "$payload_uboot" = "y" ] && pname="uboot" && $dry add_uboot else - pname="custom" && $dry cprom; : + pname="custom" + $dry cprom fi; : } add_seabios() { + if [ "$payload_uboot_i386" = "y" ] || \ + [ "$payload_uboot_amd64" = "y" ]; then + $dry add_uboot + fi + _seabioself="elf/seabios/default/$initmode/bios.bin.elf" - cbfs "$tmprom" "$_seabioself" "fallback/payload" + _seaname="fallback/payload" && [ "$payload_grubsea" = "y" ] && \ + _seaname="seabios.elf" + cbfs "$tmprom" "$_seabioself" "$_seaname" x_ "$cbfstool" "$tmprom" add-int -i 3000 -n etc/ps2-keyboard-spinup - _z="2"; [ "$initmode" = "vgarom" ] && _z="0" + _z="2" + [ "$initmode" = "vgarom" ] && _z="0" x_ "$cbfstool" "$tmprom" add-int -i $_z -n etc/pci-optionrom-exec x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/optionroms-checksum [ "$initmode" = "libgfxinit" ] && \ @@ -147,30 +187,33 @@ add_seabios() [ "$payload_memtest" = "y" ] && cbfs "$tmprom" \ "elf/memtest86plus/memtest.bin" img/memtest - if [ "$payload_uboot_i386" = "y" ] || \ - [ "$payload_uboot_amd64" = "y" ]; then - $dry add_uboot - fi - [ "$payload_grub" = "y" ] && add_grub - cprom + [ "$payload_grubsea" != "y" ] && cprom [ "$payload_uboot_amd64" = "y" ] && [ "$displaymode" != "txtmode" ] && \ - [ "$initmode" != "normal" ] && pname="seauboot" && cprom "seauboot" + [ "$initmode" != "normal" ] && [ "$payload_grubsea" != "y" ] && \ + pname="seauboot" && cprom "seauboot" [ "$payload_grub" = "y" ] && pname="seagrub" && mkseagrub; : } add_grub() { - cbfs "$tmprom" "$grubelf" "img/grub2" + _grubname="img/grub2" && [ "$payload_grubsea" = "y" ] && \ + _grubname="fallback/payload" + cbfs "$tmprom" "$grubelf" "$_grubname" printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \ > "$TMPDIR/tmpcfg" || $err "$target: !insert scandisk" cbfs "$tmprom" "$TMPDIR/tmpcfg" scan.cfg raw + [ "$initmode" != "normal" ] && [ "$displaymode" != "txtmode" ] && \ + cbfs "$tmprom" "$grubdata/background/background1280x800.png" \ + "background.png" raw; : } mkseagrub() { - cbfs "$tmprom" "$grubdata/bootorder" bootorder raw + [ "$payload_grubsea" = "y" ] && pname="grub" + [ "$payload_grubsea" = "y" ] || \ + cbfs "$tmprom" "$grubdata/bootorder" bootorder raw for keymap in config/data/grub/keymap/*.gkb; do [ -f "$keymap" ] && cprom "${keymap##*/}"; : done; : @@ -179,10 +222,12 @@ mkseagrub() add_uboot() { if [ "$displaymode" = "txtmode" ]; then - printf "cb/$target: Cannot use U-Boot in text mode\n" 1>&2 + printf "cb/%s: Cannot use U-Boot in text mode\n" \ + "$target" 1>&2 return 0 elif [ "$initmode" = "normal" ]; then - printf "cb/$target: Cannot use U-Boot in normal initmode\n" 1>&2 + printf "cb/%s: Cannot use U-Boot in normal initmode\n" \ + "$target" 1>&2 return 0 fi @@ -215,7 +260,8 @@ add_uboot() ubootelf="$ubdir/u-boot-x86-with-spl.bin" # EFI-compatible [ -f "$ubootelf" ] || $err "cb/$ubtarget: Can't find u-boot" - cbfs "$tmprom" "$ubootelf" "$ubpath" $ubcbfsargs; cprom + cbfs "$tmprom" "$ubootelf" "$ubpath" $ubcbfsargs + [ "$payload_seabios" = "y" ] || cprom; : } cprom() @@ -229,15 +275,14 @@ cprom() x_ cp "$tmprom" "$newrom" && [ $# -gt 0 ] && [ "$1" != "seauboot" ] && \ cbfs "$newrom" "config/data/grub/keymap/$1" keymap.gkb raw [ $# -gt 0 ] && [ "$1" = "seauboot" ] && \ - cbfs "$newrom" "config/data/grub/bootorder_uboot" "bootorder" raw - - [ "$XBMK_RELEASE" = "y" ] || return 0 - $dry mksha512sum "$newrom" "vendorhashes"; $dry ./vendor inject \ - -r "$newrom" -b "$target" -n nuke || $err "!nuke $newrom" + cbfs "$newrom" "config/data/grub/bootorder_uboot" bootorder raw; : } mkcoreboottar() { - [ "$target" = "$tree" ] && return 0; [ "$XBMK_RELEASE" = "y" ] && \ - [ "$release" != "n" ] && $dry mkrom_tarball "bin/$target"; : + [ "$target" = "$tree" ] && return 0 + [ "$XBMK_RELEASE" = "y" ] || return 0 + [ "$release" != "n" ] || return 0 + $dry mkrom_tarball "bin/$target" + $dry x_ ./mk inject "bin/${relname}_${target}.tar.xz" nuke; : } diff --git a/include/vendor.sh b/include/vendor.sh index 0f97a641..ceea429a 100644 --- a/include/vendor.sh +++ b/include/vendor.sh @@ -1,62 +1,66 @@ # SPDX-License-Identifier: GPL-3.0-only # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com> # Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com> -# Copyright (c) 2023-2024 Leah Rowe <leah@libreboot.org> +# Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org> -e6400_unpack="$PWD/src/bios_extract/dell_inspiron_1100_unpacker.py" -me7updateparser="$PWD/util/me7_update_parser/me7_update_parser.py" -pfs_extract="$PWD/src/biosutilities/Dell_PFS_Extract.py" -uefiextract="$PWD/elf/uefitool/uefiextract" +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" - -cv="CONFIG_HAVE_ME_BIN CONFIG_ME_BIN_PATH CONFIG_INCLUDE_SMSC_SCH5545_EC_FW \ - CONFIG_SMSC_SCH5545_EC_FW_FILE CONFIG_KBC1126_FIRMWARE CONFIG_KBC1126_FW1 \ +hashfiles="vendorhashes blobhashes" # blobhashes for backwards compatibility +dontflash="!!! AN ERROR OCCURED! Please DO NOT flash if injection failed. !!!" +vfix="DO_NOT_FLASH_YET._FIRST,_INJECT_FILES_VIA_INSTRUCTIONS_ON_LIBREBOOT.ORG_" +vguide="https://libreboot.org/docs/install/ivy_has_common.html" +tmpromdel="$xbmkpwd/tmp/DO_NOT_FLASH" +nvm="util/nvmutil/nvm" + +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_FILE CONFIG_VGA_BIOS_ID CONFIG_BOARD_DELL_E6400 \ - CONFIG_HAVE_MRC CONFIG_MRC_FILE CONFIG_HAVE_REFCODE_BLOB \ - CONFIG_REFCODE_BLOB_FILE CONFIG_GBE_BIN_PATH CONFIG_IFD_BIN_PATH" + 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 "" EC_url_bkup EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \ +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 vrelease \ - verify _7ztest ME_bootguard IFD_platform ifdprefix $cv` + archive EC_url boarddir rom cbdir DL_url nukemode cbfstoolref FSPFD_hash \ + _7ztest ME11bootguard ME11delta ME11version ME11sku ME11pch tmpromdir \ + IFD_platform ifdprefix cdir sdir _me _metmp mfs TBFW_url_bkup TBFW_url \ + TBFW_hash TBFW_size hashfile xromsize xchanged EC_url_bkup need_files \ + vfile cbcfg $cv`" vendor_download() { - [ $# -gt 0 ] || $err "No argument given"; export PATH="$PATH:/sbin" - board="$1"; readcfg && readkconfig && bootstrap && getfiles; : + [ $# -gt 0 ] || $err "No argument given" + export PATH="$PATH:/sbin" + board="$1" + readcfg && readkconfig && bootstrap && getfiles; : } readkconfig() { - check_defconfig "$boarddir" 1>"$TMPDIR/vendorcfg.list" && return 1 - - rm -f "$TMPDIR/tmpcbcfg" || $err "!rm -f \"$TMPDIR/tmpcbcfg\"" - while read -r cbcfgfile; do - for cbc in $cv; do - rm -f "$TMPDIR/tmpcbcfg2" || \ - $err "!rm $TMPDIR/tmpcbcfg2" - grep "$cbc" "$cbcfgfile" 1>"$TMPDIR/tmpcbcfg2" \ - 2>/dev/null || : - [ -f "$TMPDIR/tmpcbcfg2" ] || continue - cat "$TMPDIR/tmpcbcfg2" >> "$TMPDIR/tmpcbcfg" || \ - $err "!cat $TMPDIR/tmpcbcfg2" - done - done < "$TMPDIR/vendorcfg.list" - - eval `setcfg "$TMPDIR/tmpcbcfg"` + x_ rm -f "$TMPDIR/cbcfg" + cbcfg="`check_defconfig "$boarddir"`" || for cbc in $cv; do + grep "$cbc" "$cbcfg" 1>>"$TMPDIR/cbcfg" 2>/dev/null || : + done + eval "`setcfg "$TMPDIR/cbcfg" 1`" - for c in CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \ - CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW; do + for c in $cvchk; do eval "[ \"\${$c}\" = \"/dev/null\" ] && continue" eval "[ -z \"\${$c}\" ] && continue" - eval `setcfg "config/vendor/$vcfg/pkg.cfg"`; return 0 + eval "`setcfg "$vfile"`" + return 0 done - printf "Vendor files not needed for: %s\n" "$board" 1>&2; return 1 + return 1 } bootstrap() @@ -66,7 +70,7 @@ bootstrap() [ -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; return 0 + x_ ./mk -d coreboot "$MRC_refcode_cbtree"; : } getfiles() @@ -81,121 +85,177 @@ getfiles() [ -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"; return 0 + "$MRC_hash" "$CONFIG_MRC_FILE" + [ -z "$CONFIG_LENOVO_TBFW_BIN" ] || fetch "tbfw" "$TBFW_url" \ + "$TBFW_url_bkup" "$TBFW_hash" "$CONFIG_LENOVO_TBFW_BIN" + # + # in the future, we might have libre fsp-s and then fsp-m. + # therefore, handle them separately, in case one of them is libre; if + # one of them was, the path wouldn't be set. + # + [ -z "$CONFIG_FSP_M_FILE" ] || fetch "fspm" "$CONFIG_FSP_FD_PATH" \ + "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_M_FILE" copy + [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsps" "$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" + dl_type="$1" + dl="$2" + dl_bkup="$3" + dlsum="$4" + _dest="${5##*../}" + + [ "$5" = "/dev/null" ] && return 0 + _dl="$XBMK_CACHE/file/$dlsum" + if [ "$dl_type" = "fspm" ] || [ "$dl_type" = "fsps" ]; then + # HACK: if grabbing fsp from coreboot, fix the path for lbmk + for _cdl in dl dl_bkup; do + eval "$_cdl=\"\${$_cdl##*../}\"; _cdp=\"\$$_cdl\"" + [ -f "$_cdp" ] || _cdp="$cbdir/$_cdp" + [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\"" + done + fi - download "$dl" "$dl_bkup" "$_dl" "$dlsum" + dlop="curl" && [ $# -gt 5 ] && dlop="$6" + download "$dl" "$dl_bkup" "$_dl" "$dlsum" "$dlop" - rm -Rf "${_dl}_extracted" || $err "!rm -Rf ${_ul}_extracted" + rm -Rf "${_dl}_extracted" || $err "!rm ${_ul}_extracted. $dontflash" e "$_dest" f && return 0 - mkdir -p "${_dest%/*}" || $err "mkdirs: !mkdir -p ${_dest%/*}" - remkdir "$appdir"; extract_archive "$_dl" "$appdir" || \ - [ "$dl_type" = "e6400vga" ] || $err "mkd $_dest $dl_type: !extract" + x_ mkdir -p "${_dest%/*}" + remkdir "$appdir" + extract_archive "$_dl" "$appdir" "$dl_type" || \ + [ "$dl_type" = "e6400vga" ] || \ + $err "mkd $_dest $dl_type: !extract. $dontflash" - eval "extract_$dl_type"; set -u -e - e "$_dest" f missing && $err "!extract_$dl_type"; : + eval "extract_$dl_type" + set -u -e + e "$_dest" f missing && $err "!extract_$dl_type. $dontflash"; : } extract_intel_me() { - e "$mecleaner" f not && $err "$cbdir: me_cleaner missing" + e "$mecleaner" f not && $err "$cbdir: me_cleaner missing. $dontflash" - _me="$PWD/$_dest"; cdir="$PWD/$appdir" - if [ "$ME_bootguard" = "me11disreguard" ]; then - # run mkukri's util to extract me.bin and disable bootguard - # for Dell OptiPlex 3050 Micro, using the deguard util. - extract_deguard_me "$cdir" "$_me" - return 0 + cdir="$xbmkpwd/$appdir" + _me="$xbmkpwd/$_dest" + _metmp="$xbmkpwd/tmp/me.bin" + + mfs="" && [ "$ME11bootguard" = "y" ] && mfs="--whitelist MFS" && \ + chkvars ME11delta ME11version ME11sku ME11pch + [ "$ME11bootguard" = "y" ] && x_ ./mk -f deguard + + x_ mkdir -p tmp + + extract_intel_me_bruteforce + if [ "$ME11bootguard" = "y" ]; then + apply_me11_deguard_mod + else + mv "$_metmp" "$_me" || $err "!mv $_metmp $_me - $dontflash" fi - # All other ME setups are extracted with brute force and me_cleaner: +} - [ $# -gt 0 ] && _me="${1}" && cdir="$2" +extract_intel_me_bruteforce() +{ + [ $# -gt 0 ] && cdir="$1" - e "$_me" f && return 0 + e "$_metmp" f && return 0 - sdir="$(mktemp -d)"; [ -z "$sdir" ] && return 0 - mkdir -p "$sdir" || $err "extract_intel_me: !mkdir -p \"$sdir\"" + [ -z "$sdir" ] && sdir="$(mktemp -d)" + x_ mkdir -p "$sdir" set +u +e ( [ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}" - cd "$cdir" || $err "extract_intel_me: !cd \"$cdir\"" + cd "$cdir" || $err "extract_intel_me: !cd \"$cdir\" - $dontflash" for i in *; do - [ -f "$_me" ] && break + [ -f "$_metmp" ] && break [ -L "$i" ] && continue if [ -f "$i" ]; then - "$mecleaner" -r -t -O "$sdir/vendorfile" \ - -M "$_me" "$i" && break - "$mecleaner" -r -t -O "$_me" "$i" && break - "$me7updateparser" -O "$_me" "$i" && break + _r="-r" && [ -n "$mfs" ] && _r="" + "$mecleaner" $mfs $_r -t -O "$sdir/vendorfile" \ + -M "$_metmp" "$i" && break + "$mecleaner" $mfs $_r -t -O "$_metmp" "$i" && break + "$me7updateparser" -O "$_metmp" "$i" && break _7ztest="${_7ztest}a" extract_archive "$i" "$_7ztest" || continue - extract_intel_me "$_me" "$cdir/$_7ztest" + extract_intel_me_bruteforce "$cdir/$_7ztest" elif [ -d "$i" ]; then - extract_intel_me "$_me" "$cdir/$i" + extract_intel_me_bruteforce "$cdir/$i" else continue fi cdir="$1"; [ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}" cd "$cdir" || : done - ) - rm -Rf "$sdir" || $err "extract_intel_me: !rm -Rf $sdir" + ) || : + rm -Rf "$sdir" || $err "extract_intel_me: !rm -Rf $sdir - $dontflash" } -extract_deguard_me() +apply_me11_deguard_mod() { - x_ ./mk -f deguard - cp -R src/deguard "$1/disreguard" || \ - $err "Cannot make temporary deguard clone in $1/disreguard" - if [ ! -e "$1/disreguard/.git" ]; then - git -C "$1/disreguard" init || $err "!init $1/disreguard" - git -C "$1/disreguard" add -A . || $err "!add $1/disreguard" - git -C "$1/disreguard" commit -m "tmp" || \ - $err "!commit $1/disreguard" - fi - git -C "$1/disreguard" am "$PWD/config/data/deguard/appdir.patch" || \ - $err "Cannot temporarily patch deguard clone in $1/disreguard" ( - cd "$1/disreguard" || $err "Cannot cd to '$1/disreguard'" - x_ ./RUNME.sh - ) || $err "$1/disreguard: RUNME.sh returned error status" - "$mecleaner" --whitelist MFS --truncate "$1/disreguard/me.bin" || \ - $err "extract_intel_me: Can't truncate disreguarded ME" - cp "$cdir/disreguard/me.bin" "$2" || \ - $err "extract_intel_me: Can't move disreguarded me.bin" + 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" } extract_archive() { + if [ $# -gt 2 ]; then + if [ "$3" = "fspm" ] || [ "$3" = "fsps" ]; then + decat_fspfd "$1" "$2" + return 0 + fi + fi + 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" ] || cp -R "${_dl}_extracted" "$2" || \ + $err "!mv '${_dl}_extracted' '$2' - $dontflash"; : +} + +decat_fspfd() +{ + _fspfd="$1" + _fspdir="$2" + _fspsplit="$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" + + x_ $python "$_fspsplit" split -f "$_fspfd" -o "$_fspdir" -n "Fsp.fd" } extract_kbc1126ec() { - e "$kbc1126_ec_dump" f missing && $err "$cbdir: kbc1126 util missing" + e "$kbc1126_ec_dump" f missing && \ + $err "$cbdir: kbc1126 util missing - $dontflash" ( - x_ cd "$appdir/"; mv Rompaq/68*.BIN ec.bin || : + x_ cd "$appdir/" + mv Rompaq/68*.BIN ec.bin || : if [ ! -f "ec.bin" ]; then unar -D ROM.CAB Rom.bin || unar -D Rom.CAB Rom.bin || \ - unar -D 68*.CAB Rom.bin || $err "can't extract Rom.bin" + unar -D 68*.CAB Rom.bin || \ + $err "can't extract Rom.bin - $dontflash" x_ mv Rom.bin ec.bin fi - [ -f ec.bin ] || $err "extract_kbc1126_ec $board: can't extract" - "$kbc1126_ec_dump" ec.bin || $err "!1126ec $board extract ecfw" - ) || $err "can't extract kbc1126 ec firmware" - - e "$appdir/ec.bin.fw1" f not && $err "$board: kbc1126ec fetch failed" - e "$appdir/ec.bin.fw2" f not && $err "$board: kbc1126ec fetch failed" - - cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || $err "!cp 1126ec $_dest" + [ -f ec.bin ] || \ + $err "extract_kbc1126_ec $board: can't extract - $dontflash" + "$kbc1126_ec_dump" ec.bin || \ + $err "!1126ec $board extract ecfw - $dontflash" + ) || $err "can't extract kbc1126 ec firmware - $dontflash" + + e "$appdir/ec.bin.fw1" f not && \ + $err "$board: kbc1126ec fetch failed - $dontflash" + e "$appdir/ec.bin.fw2" f not && \ + $err "$board: kbc1126ec fetch failed - $dontflash" + + cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || \ + $err "!cp 1126ec $_dest - $dontflash"; : } extract_e6400vga() @@ -205,11 +265,11 @@ extract_e6400vga() tail -c +$E6400_VGA_offset "$_dl" | gunzip > "$appdir/bios.bin" || : ( x_ cd "$appdir" - [ -f "bios.bin" ] || $err "extract_e6400vga: can't extract bios.bin" + [ -f "bios.bin" ] || \ + $err "extract_e6400vga: can't extract bios.bin - $dontflash" "$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n" - ) || $err "can't extract e6400 vga rom" - cp "$appdir/$E6400_VGA_romname" "$_dest" || \ - $err "extract_e6400vga $board: can't copy vga rom to $_dest" + ) || $err "can't extract e6400 vga rom - $dontflosh" + x_ cp "$appdir/$E6400_VGA_romname" "$_dest" } extract_sch5545ec() @@ -221,123 +281,305 @@ 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" - cp "$_sch5545ec_fw" "$_dest" || $err "$_dest: !sch5545 copy" + "$uefiextract" "$_bios" || $err "sch5545 !extract - $dontflash" + x_ cp "$_sch5545ec_fw" "$_dest" } -vendor_inject() +# 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() { - set +u +e; [ $# -lt 1 ] && $err "No options specified." - [ "$1" = "listboards" ] && eval "ls -1 config/coreboot || :; exit 0" - - archive="$1"; while getopts n:r:b:m: option; do - case "$option" in - n) nukemode="$OPTARG" ;; - r) rom="$OPTARG" ;; - b) board="$OPTARG" ;; - m) new_mac="$OPTARG"; chkvars new_mac ;; - *) : ;; - esac - done + chkvars TBFW_size # size in bytes, matching TBFW's flash IC + x_ mkdir -p tmp + x_ rm -f tmp/tb.bin + find "$appdir" -type f -name "TBT.bin" > "tmp/tb.txt" || \ + $err "extract_tbfw $_dest: Can't extract TBT.bin - $dontflash" + while read -r f; do + [ -f "$f" ] || continue + [ -L "$f" ] && continue + x_ cp "$f" "tmp/tb.bin" + break + done < "tmp/tb.txt" + x_ dd if=/dev/null of=tmp/tb.bin bs=1 seek=$TBFW_size + x_ cp "tmp/tb.bin" "$_dest" +} - check_board || return 0 - [ "$nukemode" = "nuke" ] || x_ ./vendor download $board - [ "$vrelease" != "y" ] && patch_rom "$rom" - [ "$vrelease" = "y" ] && patch_release_roms; : +extract_fspm() +{ + copy_fsp M; : } -check_board() +extract_fsps() { - failcheck="y" && check_release "$archive" && failcheck="n" - if [ "$failcheck" = "y" ]; then - [ -f "$rom" ] || $err "check_board \"$rom\": invalid path" - [ -z "${rom+x}" ] && $err "check_board: no rom specified" - [ -n "${board+x}" ] || board="$(detect_board "$rom")" - else - vrelease="y"; board="$(detect_board "$archive")" - fi - readcfg || return 1; return 0 + copy_fsp S; : } -check_release() +# this copies the fsp s/m; re-base is handled by ./mk inject +copy_fsp() +{ + x_ cp "$appdir/Fsp_$1.fd" "$_dest" +} + +fail_inject() { - [ -f "$archive" ] || return 1 - [ "${archive##*.}" = "xz" ] || return 1 - printf "%s\n" "Release archive $archive detected" + [ -L "$tmpromdel" ] || [ ! -d "$tmpromdel" ] || \ + rm -Rf "$tmpromdel" || : + printf "\n\n%s\n\n" "$dontflash" 1>&2 + printf "WARNING: File '%s' was NOT modified.\n\n" "$archive" 1>&2 + printf "Please MAKE SURE vendor files are inserted before flashing\n\n" + err_ "$1" } -# 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() +vendor_inject() { - path="$1"; filename="$(basename "$path")" - case "$filename" in - grub_*|seagrub_*|custom_*) - board="$(echo "$filename" | cut -d '_' -f2-3)" ;; - seabios_withgrub_*) - board="$(echo "$filename" | cut -d '_' -f3-4)" ;; - *.tar.xz) _stripped_prefix="${filename#*_}" + need_files="n" + _olderr="$err" + err="fail_inject" + remkdir "$tmpromdel" + + set +u +e + [ $# -lt 1 ] && $err "No options specified. - $dontflash" + eval "`setvars "" nukemode new_mac xchanged`" + + archive="$1"; + new_mac="??:??:??:??:??:??" + + [ $# -gt 1 ] && case "$2" in + nuke) + new_mac="" + nukemode="nuke" ;; + setmac) + [ $# -gt 2 ] && new_mac="$3" && \ + [ -z "$new_mac" ] && $err "Empty MAC address specified" ;; + *) $err "Unrecognised inject mode: '$2'" + esac + + [ "$new_mac" = "keep" ] && new_mac="" + + check_release "$archive" || \ + $err "You must run this script on a release archive. - $dontflash" + + [ "$new_mac" = "restore" ] && \ + printf "Restoring default GbE for '$archive', board '$board'\n" + + readcfg && need_files="y" + if [ "$need_files" = "y" ] || [ -n "$new_mac" ]; then + if [ "$nukemode" != "nuke" ] && [ "$need_files" = "y" ]; then + x_ ./mk download "$board" + fi + patch_release_roms + fi + [ "$need_files" != "y" ] && printf \ + "\nTarball '%s' (board '%s) doesn't need vendorfiles.\n" \ + "$archive" "$board" 1>&2 + + xtype="patched" && [ "$nukemode" = "nuke" ] && xtype="nuked" + [ "$xchanged" != "y" ] && \ + printf "\nRelease archive '%s' was *NOT* modified.\n" \ + "$archive" && [ "$has_hashes" = "y" ] && \ + printf "WARNING: '%s' contains '%s'. DO NOT FLASH!\n" \ + "$archive" "$hashfile" 1>&2 && \ + printf "(vendorfiles may be needed and aren't there)\n" \ + 1>&2 + [ "$xchanged" = "y" ] && \ + printf "\nRelease archive '%s' successfully %s.\n" \ + "$archive" "$xtype" && [ "$nukemode" != "nuke" ] && \ + printf "You may now extract '%s' and flash images from it.\n" \ + "$archive" + [ "$xchanged" = "y" ] && [ "$nukemode" = "nuke" ] && \ + printf "WARNING! Vendorfiles *removed*. DO NOT FLASH.\n" 1>&2 \ + && printf "DO NOT flash images from '%s'\n" \ + "$archive" 1>&2 + + [ "$need_files" = "n" ] && printf \ + "Board '%s' doesn't use vendorfiles, so none were inserted.\n" \ + "$board" + + if [ "$xchanged" != "y" ] && [ "$need_files" = "y" ] && \ + [ "$nukemode" = "nuke" ] && [ "$has_hashes" != "y" ]; then + printf "FAILED NUKE: tarball '$archive', board '$board'\n" 1>&2 + $err "Unhandled vendorfile deletion: DO NOT RELEASE TO RSYNC" + fi + + err="$_olderr"; : +} + +check_release() +{ + [ -L "$archive" ] && \ + $err "'$archive' is a symlink, not a file - $dontflash" + e "$archive" f missing && return 1 + + archivename="`basename "$archive"`" + [ -z "$archivename" ] && \ + $err "Cannot determine archive file 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 "detect_board $filename: could not detect board type" - esac; printf "%s\n" "$board" + *) $err "'$archive': could not detect board type - $dontflash" + esac; : } readcfg() { - if [ "$board" = "serprog_rp2040" ] || \ - [ "$board" = "serprog_stm32" ]; then + if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \ + || [ "$board" = "serprog_pico" ]; then return 1 - fi; boarddir="$cbcfgsdir/$board" - eval `setcfg "$boarddir/target.cfg"`; chkvars vcfg tree + fi + boarddir="$cbcfgsdir/$board" + + eval "`setcfg "$boarddir/target.cfg"`" + chkvars tree + x_ ./mk -d coreboot "$tree" # even if vendorfiles not used, see: setmac + + [ -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" cbdir="src/coreboot/$tree" cbfstool="elf/cbfstool/$tree/cbfstool" - mecleaner="$PWD/$cbdir/util/me_cleaner/me_cleaner.py" - kbc1126_ec_dump="$PWD/$cbdir/util/kbc1126/kbc1126_ec_dump" + rmodtool="elf/cbfstool/$tree/rmodtool" + mecleaner="$xbmkpwd/$cbdir/util/me_cleaner/me_cleaner.py" + kbc1126_ec_dump="$xbmkpwd/$cbdir/util/kbc1126/kbc1126_ec_dump" cbfstool="elf/cbfstool/$tree/cbfstool" ifdtool="elf/ifdtool/$tree/ifdtool" - [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform" - - x_ ./mk -d coreboot $tree + [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; : } patch_release_roms() { - remkdir "tmp/romdir"; tar -xf "$archive" -C "tmp/romdir" || \ - $err "patch_release_roms: !tar -xf \"$archive\" -C \"tmp/romdir\"" + has_hashes="n" + + tmpromdir="tmp/DO_NOT_FLASH/bin/$board" + remkdir "${tmpromdir%"/bin/$board"}" + x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" - for x in "tmp/romdir/bin/"*/*.rom ; do - patch_rom "$x" + for _hashes in $hashfiles; do + [ "$need_files" = "y" ] || break + e "$tmpromdir/$_hashes" f && has_hashes="y" && \ + hashfile="$_hashes" && break; : done - ( - cd "tmp/romdir/bin/"* || $err "patch roms: !cd tmp/romdir/bin/*" + x_ mkdir -p "tmp" + [ -L "tmp/rom.list" ] && \ + $err "'$archive' -> tmp/rom.list is a symlink - $dontflash" + x_ rm -f "tmp/rom.list" "tmp/zero.1b" + x_ dd if=/dev/zero of=tmp/zero.1b bs=1 count=1 + + find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" > "tmp/rom.list" \ + || $err "'$archive' -> Can't make tmp/rom.list - $dontflash" + + if readkconfig; then + while read -r _xrom ; do + process_release_rom "$_xrom" || break + done < "tmp/rom.list" + rm -f "$tmpromdir/README.md" || : + [ "$nukemode" != "nuke" ] || \ + printf "Make sure you inserted vendor files: %s\n" \ + "$vguide" > "$tmpromdir/README.md" || : + else + printf "Skipping vendorfiles on '%s'\n" "$archive" 1>&2 + need_files="n" + fi + ( + [ "$need_files" = "y" ] || exit 0 + cd "$tmpromdir" || $err "patch '$archive': can't cd $tmpromdir" # NOTE: For compatibility with older rom releases, defer to sha1 - [ "$verify" != "y" ] || [ "$nukemode" = "nuke" ] || \ - sha512sum --status -c vendorhashes || \ - sha1sum --status -c vendorhashes || sha512sum --status -c \ - blobhashes || sha1sum --status -c blobhashes || \ - $err "patch_release_roms: ROMs did not match expected hashes" - ) || $err "can't verify vendor hashes" - - [ -n "$new_mac" ] && for x in "tmp/romdir/bin/"*/*.rom ; do - [ -f "$x" ] && modify_gbe "$x" - done + if [ "$has_hashes" = "y" ] && [ "$nukemode" != "nuke" ]; then + sha512sum --status -c "$hashfile" || \ + sha1sum --status -c "$hashfile" || \ + $err "'$archive' -> Can't verify vendor hashes. $dontflash" + x_ rm -f "$hashfile" + fi + ) || $err "'$archive' -> Can't verify vendor hashes. $dontflash" + + [ -z "$new_mac" ] || modify_mac_addresses || printf \ + "\nNo GbE region defined for '%s'\n" "$board" 1>&2 + + [ "$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"; : +} + +process_release_rom() +{ + _xrom="$1" + _xromname="${1##*/}" + + e "$_xrom" f missing && return 0 + + [ -z "${_xromname#"$vfix"}" ] && \ + $err "'$_xromname'->'"${_xromname#"$vfix"}"' empty. $dontflash" + + # Remove the prefix and 1-byte pad + if [ "$nukemode" != "nuke" ] && \ + [ "${_xromname#"$vfix"}" != "$_xromname" ]; then + _xromnew="${_xrom%/*}/${_xromname#"$vfix"}" + + stat -c '%s' "$_xrom" > "tmp/rom.size" || \ + $err "$_xrom: Can't resize '$_xrom' (out: tmp/rom.size)" + read -r xromsize < "tmp/rom.size" || \ + $err "$_xrom: Can't read rom size. $dontflash" + + expr "X$xromsize" : "X-\{0,1\}[0123456789][0123456789]*$" \ + 1>/dev/null 2>/dev/null || $err "$_xrom size non-integer" + [ $xromsize -lt 2 ] && $err \ + "$_xrom: Will not create empty file. $dontflash" - x_ mkdir -p bin/release - mv tmp/romdir/bin/* bin/release/ || $err "$board: !mv release roms" + xromsize="`expr $xromsize - 1`" + [ $xromsize -lt 524288 ] && \ + $err "$_xrom size too small; likely not a rom. $dontflash" + + x_ dd if="$_xrom" of="$_xromnew" bs=$xromsize count=1 + rm -f "$_xrom" || $err "Can't rm $_xrom - $dontflash" + + _xrom="$_xromnew" + fi + + [ "$nukemode" = "nuke" ] && \ + mksha512sum "$_xrom" "vendorhashes" + + patch_rom "$_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" tmp/zero.1b > "${_xrom%/*}/$vfix${_xrom##*/}" || \ + $err "'$archive' -> can't pad/rename '$_xrom'. $dontflash" + x_ rm -f "$_xrom" } patch_rom() { rom="$1" - readkconfig || exit 0 - [ "$CONFIG_HAVE_MRC" = "y" ] && inject "mrc.bin" "$CONFIG_MRC_FILE" \ - "mrc" "0xfffa0000" + if [ "$has_hashes" != "y" ] && [ "$nukemode" != "nuke" ]; then + printf "inject: '%s' has no hash file. Skipping.\n" \ + "$archive" 1>&2 + return 1 + elif [ "$has_hashes" = "y" ] && [ "$nukemode" = "nuke" ]; then + printf "inject nuke: '%s' has a hash file. Skipping nuke.\n" \ + "$archive" 1>&2 + return 1 + fi + [ -n "$CONFIG_HAVE_REFCODE_BLOB" ] && inject "fallback/refcode" \ "$CONFIG_REFCODE_BLOB_FILE" "stage" + [ "$CONFIG_HAVE_MRC" = "y" ] && inject "mrc.bin" "$CONFIG_MRC_FILE" \ + "mrc" "0xfffa0000" [ "$CONFIG_HAVE_ME_BIN" = "y" ] && inject IFD "$CONFIG_ME_BIN_PATH" me [ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && inject ecfw1.bin \ "$CONFIG_KBC1126_FW1" raw "$CONFIG_KBC1126_FW1_OFFSET" && inject \ @@ -347,49 +589,83 @@ patch_rom() [ "$CONFIG_INCLUDE_SMSC_SCH5545_EC_FW" = "y" ] && \ [ -n "$CONFIG_SMSC_SCH5545_EC_FW_FILE" ] && \ inject sch5545_ecfw.bin "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw - [ -n "$new_mac" ] && [ "$vrelease" != "y" ] && modify_gbe "$rom" + [ -z "$CONFIG_FSP_USE_REPO" ] && [ -z "$CONFIG_FSP_FULL_FD" ] && \ + [ -n "$CONFIG_FSP_M_FILE" ] && \ + inject "$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" ] && \ + inject "$CONFIG_FSP_S_CBFS" "$CONFIG_FSP_S_FILE" fsp printf "ROM image successfully patched: %s\n" "$rom" + xchanged="y" } inject() { - [ $# -lt 3 ] && $err "$@, $rom: usage: inject name path type (offset)" - [ "$2" = "/dev/null" ] && return 0; verify="y" + [ $# -lt 3 ] && $err "bad command: $*, $rom" + [ "$2" = "/dev/null" ] && return 0 + + cbfsname="$1" + _dest="${2##*../}" + _t="$3" - eval `setvars "" cbfsname _dest _t _offset` - cbfsname="$1"; _dest="${2##*../}"; _t="$3" + _offset="" - [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \ - $err "inject $@, $rom: offset passed, but empty (not defined)" + if [ "$_t" = "fsp" ]; then + [ $# -gt 3 ] && _offset="$4" + else + [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \ + $err "inject $*, $rom: offset given but empty (undefined)" + fi - e "$_dest" f n && [ "$nukemode" != "nuke" ] && $err "!inject $dl_type" + [ "$nukemode" = "nuke" ] || x_ e "$_dest" f if [ "$cbfsname" = "IFD" ]; then [ "$nukemode" = "nuke" ] || "$ifdtool" $ifdprefix -i \ $_t:$_dest "$rom" -O "$rom" || \ $err "failed: inject '$_t' '$_dest' on '$rom'" [ "$nukemode" != "nuke" ] || "$ifdtool" $ifdprefix --nuke $_t \ - "$rom" -O "$rom" || $err "$rom: !nuke IFD/$_t"; return 0 + "$rom" -O "$rom" || $err "$rom: !nuke IFD/$_t" elif [ "$nukemode" = "nuke" ]; then - "$cbfstool" "$rom" remove -n "$cbfsname" || \ - $err "inject $rom: can't remove $cbfsname"; return 0 + x_ "$cbfstool" "$rom" remove -n "$cbfsname" + elif [ "$_t" = "stage" ]; then # the only stage we handle is refcode + x_ mkdir -p tmp + x_ rm -f "tmp/refcode" + "$rmodtool" -i "$_dest" -o "tmp/refcode" || "!reloc refcode" + "$cbfstool" "$rom" add-stage -f "tmp/refcode" -n "$cbfsname" \ + -t stage || $err "$rom: !add ref" + else + "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ + -t $_t $_offset || $err "$rom !add $_t ($_dest)" fi - [ "$_t" != "stage" ] || "$cbfstool" "$rom" add-stage -f \ - "$_dest" -n "$cbfsname" -t stage -c lzma || $err "$rom: !add ref" - [ "$_t" = "stage" ] || "$cbfstool" "$rom" add -f "$_dest" \ - -n "$cbfsname" -t $_t $_offset || $err "$rom !add $_t ($_dest)"; : + xchanged="y"; : } -modify_gbe() +modify_mac_addresses() { - chkvars CONFIG_GBE_BIN_PATH + [ -n "$CONFIG_GBE_BIN_PATH" ] || return 1 + + x_ mkdir -p tmp + e tmp/gbe && x_ e tmp/gbe f + x_ cp "${CONFIG_GBE_BIN_PATH##*../}" tmp/gbe + + if [ "$new_mac" != "restore" ]; then + x_ make -C util/nvmutil + x_ "$nvm" tmp/gbe setmac "$new_mac" + fi + + find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" > "tmp/rom.list" \ + || $err "'$archive' -> Can't make tmp/rom.list - $dontflash" + + while read -r _xrom; do + e "$_xrom" f && xchanged="y" && x_ \ + "$ifdtool" $ifdprefix -i GbE:tmp/gbe "$_xrom" -O "$_xrom" + done < "tmp/rom.list" - e "${CONFIG_GBE_BIN_PATH##*../}" f n && $err "missing gbe file" - x_ make -C util/nvmutil + printf "\nGbE NVM written to '%s':\n" "$archive" + x_ "$nvm" tmp/gbe dump | grep -v "bytes read from file" || : - x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$TMPDIR/gbe" - x_ "util/nvmutil/nvm" "$TMPDIR/gbe" setmac $new_mac - "$ifdtool" $ifdprefix -i GbE:"$TMPDIR/gbe" "$1" -O "$1" || \ - $err "Cannot insert modified GbE region into target image." + [ "$new_mac" = "restore" ] && \ + printf "\nDefault GbE file '%s' written, unmodified.\n" \ + "${CONFIG_GBE_BIN_PATH##*../}"; : } |