From 50ce1ac9b225d717cc26727f4f2330795e84f05a Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Thu, 8 May 2025 23:28:06 +0100 Subject: mk: move release functions to idnclude/release.sh The idea with mk is that it's meant to basically be a stub for running everything else, while mainly having the trees logic within it (what was once script/trees). Signed-off-by: Leah Rowe --- include/release.sh | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 include/release.sh (limited to 'include') diff --git a/include/release.sh b/include/release.sh new file mode 100644 index 00000000..2f9f2b86 --- /dev/null +++ b/include/release.sh @@ -0,0 +1,65 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (c) 2023-2025 Leah Rowe + +eval "`setvars "" vdir src_dirname relsrcdir relmode`" + +release() +{ + export XBMK_RELEASE="y" + + vdir="release" + while getopts d:m: option; do + [ -z "$OPTARG" ] && err "empty argument not allowed" + case "$option" in + d) vdir="$OPTARG" ;; + m) relmode="$OPTARG" ;; + *) err "invalid option '-$option'" ;; + esac + done + + vdir="$vdir/$version" + src_dirname="${relname}_src" + relsrcdir="$vdir/$src_dirname" + + [ -e "$vdir" ] && err "already exists: \"$vdir\"" + mkdir -p "$vdir" || err "mkvdir: !mkdir -p \"$vdir\"" + git clone . "$relsrcdir" || err "mkdir: !gitclone \"$relsrcdir\"" + touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + + build_release + + printf "\n\nDONE! Check release files under %s\n" "$vdir" +} + +build_release() +{ + ( + cd "$relsrcdir" || err "$vdir: !cd \"$relsrcdir\"" + + x_ ./mk -f + rmgit . + x_ mv src/docs docs + ) || err "can't create release files" + + git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \ + --abbrev-commit > "$relsrcdir/CHANGELOG" || err "!log $relsrcdir" + rm -f "$relsrcdir/lock" || err "can't remove lock file in $relsrcdir" + + ( + cd "${relsrcdir%/*}" || err "$vdir: mktarball \"$relsrcdir\"" + x_ mktarball "${relsrcdir##*/}" "${relsrcdir##*/}.tar.xz" + ) || err "can't create src tarball" + [ "$relmode" = "src" ] && return 0 + + touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + ( + cd "$relsrcdir" || err "$vdir: 2 !cd \"$relsrcdir\"" + x_ ./mk -d coreboot + mk -b coreboot pico-serprog stm32-vserprog pcsx-redux + + fx_ mkrom_tarball x_ find bin -maxdepth 1 -type d -name "serprog_*" + x_ mv bin ../roms + ) || err "can't build rom images" + + rm -Rf "$relsrcdir" || err "!rm -Rf $relsrcdir" +} -- cgit v1.2.1 From 7012c00ed1102160dd612b79fd9c5c913119b6c4 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Thu, 8 May 2025 23:33:49 +0100 Subject: mk: re-split tree logic to include/tree.sh I really think mk should just be a small stub. Better to keep everything separate. Signed-off-by: Leah Rowe --- include/tree.sh | 344 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 include/tree.sh (limited to 'include') diff --git a/include/tree.sh b/include/tree.sh new file mode 100644 index 00000000..4d0c533d --- /dev/null +++ b/include/tree.sh @@ -0,0 +1,344 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# Copyright (c) 2022-2023 Alper Nebi Yasak +# Copyright (c) 2022 Ferass El Hafidi +# Copyright (c) 2023-2025 Leah Rowe + +eval "`setvars "" xarch srcdir premake gnatdir xlang mode makeargs elfdir cmd \ + project target target_dir targets xtree _f release bootstrapargs mkhelper \ + autoconfargs listfile autogenargs btype rev build_depend gccdir cmakedir \ + defconfig postmake mkhelpercfg dry dest_dir mdir cleanargs gccver gccfull \ + gnatver gnatfull do_make badhash tree`" + +trees() +{ + flags="f:b:m:u:c:x:s:l:n:d:" + + while getopts $flags option; do + [ -n "$_f" ] && err "only one flag is permitted" + _f="$1" + + case "$_f" in + -d) dry=":" ;; + -b) : ;; + -u) mode="oldconfig" ;; + -m) mode="menuconfig" ;; + -c) mode="distclean" ;; + -x) mode="crossgcc-clean" ;; + -f) + do_make="n" + dry=":" ;; + -s) mode="savedefconfig" ;; + -l) mode="olddefconfig" ;; + -n) mode="nconfig" ;; + *) err "invalid option '-$option'" ;; + esac + + if [ -z "${OPTARG+x}" ]; then + shift 1 + break + fi + + project="${OPTARG#src/}" + shift 2 + done + [ -z "$_f" ] && err "missing flag ($flags)" + if [ -z "$project" ]; then + mk $_f $(ls -1 config/git) + return 1 + fi + + [ -f "config/git/$project/pkg.cfg" ] || \ + err "config/git/$project/pkg.cfg missing" + + for d in "elf" "config/data" "config" "src"; do + eval "${d#*/}dir=\"$d/$project\"" + done + dest_dir="$elfdir" + + listfile="$datadir/build.list" + [ -f "$listfile" ] || listfile="" # optional on all projects + + mkhelpercfg="$datadir/mkhelper.cfg" + if e "$mkhelpercfg" f missing; then + mkhelpercfg="$xbmktmp/mkhelper.cfg" + x_ touch "$mkhelpercfg" + fi + + targets="$*" + cmd="build_targets $targets" + singletree "$project" && cmd="build_project" + + remkdir "${tmpgit%/*}" +} + +build_project() +{ + configure_project "$configdir" || return 0 + [ ! -f "$listfile" ] || $dry elfcheck || return 0 + + [ "$mode" = "distclean" ] && mode="clean" + run_make_command || return 0 + + [ -n "$mode" ] || $dry copy_elf; : +} + +build_targets() +{ + [ -d "$configdir" ] || err "directory, $configdir, does not exist" + [ $# -gt 0 ] || targets="$(ls -1 "$configdir")" || err "!o $configdir" + + for x in $targets; do + unset CROSS_COMPILE + export PATH="$xbmkpath" + [ "$x" = "list" ] && x_ ls -1 "config/$project" && \ + listfile="" && break + + target="$x" + printf "'make %s', '%s', '%s'\n" "$mode" "$project" "$target" + x_ handle_defconfig + + [ -n "$mode" ] || x_ $postmake + done; : +} + +handle_defconfig() +{ + target_dir="$configdir/$target" + + [ -f "CHANGELOG" ] || fetch_project "$project" + configure_project "$target_dir" || return 0 + x_ mkdir -p "$elfdir/$target" + + chkvars tree + srcdir="src/$project/$tree" + + if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then + [ -d "$srcdir" ] || return 0 + fi + [ -z "$mode" ] && for _xarch in $xarch; do + $dry check_cross_compiler "$_xarch" + done; : + + for y in "$target_dir/config"/*; do + [ "$_f" = "-d" ] || [ -f "$y" ] || continue + [ "$_f" = "-d" ] || defconfig="$y" + + [ -n "$mode" ] || check_defconfig || continue + handle_makefile + [ -n "$mode" ] || $dry copy_elf + done; : +} + +configure_project() +{ + eval "`setvars "" cleanargs build_depend autoconfargs xtree postmake \ + makeargs btype mkhelper bootstrapargs premake release xlang xarch \ + badhash`" + _tcfg="$1/target.cfg" + [ -f "$_tcfg" ] || btype="auto" + e "$datadir/mkhelper.cfg" f && eval "`setcfg "$datadir/mkhelper.cfg"`" + + while e "$_tcfg" f || [ "$cmd" != "build_project" ]; do + eval "`setvars "" rev tree`" + eval "`setcfg "$_tcfg"`" + printf "Loading %s config: %s\n" "$project" "$_tcfg" + + [ "$_f" = "-d" ] && build_depend="" # dry run + [ "$cmd" = "build_project" ] && break + [ "$do_make" != "n" ] && break + + [ "${_tcfg%/*/target.cfg}" = "${_tcfg%"/$tree/target.cfg"}" ] \ + && break + _tcfg="${_tcfg%/*/target.cfg}/$tree/target.cfg" + done + [ "$XBMK_RELEASE" = "y" ] && [ "$release" = "n" ] && return 1 + [ -z "$btype" ] || [ "${mode%config}" = "$mode" ] || return 1 + [ -z "$mode" ] && $dry build_dependencies + + mdir="$xbmkpwd/config/submodule/$project" + [ -n "$tree" ] && mdir="$mdir/$tree" + [ -f "CHANGELOG" ] || check_project_hashes + + if [ "$do_make" = "n" ]; then + [ -f "CHANGELOG" ] || fetch_${cmd#build_} + return 1 + fi + x_ ./mk -f "$project" "$target" +} + +build_dependencies() +{ + for bd in $build_depend; do + bd_p="${bd%%/*}" + bd_t="${bd##*/}" + [ -z "$bd_p" ] && $dry err "$project/$tree: !bd '$bd'" + [ "${bd##*/}" = "$bd" ] && bd_t="" + [ -z "$bd_p" ] || $dry x_ ./mk -b $bd_p $bd_t; : + done; : +} + +check_project_hashes() +{ + old_pjhash="" && x_ mkdir -p "$XBMK_CACHE/hash" + [ ! -f "$XBMK_CACHE/hash/$project$tree" ] || \ + read -r old_pjhash < "$XBMK_CACHE/hash/$project$tree" + + fx_ "x_ sha512sum" find "$datadir" "$configdir/$tree" "$mdir" \ + -type f -not -path "*/.git*/*" | awk '{print $1}' > \ + "$xbmktmp/project.hash" || err "!h $project $tree" + + pjhash="$(sha512sum "$xbmktmp/project.hash" | awk '{print $1}')" || : + [ "$pjhash" != "$old_pjhash" ] && badhash="y" + [ -f "$XBMK_CACHE/hash/$project$tree" ] || badhash="y" + + printf "%s\n" "$pjhash" > "$XBMK_CACHE/hash/$project$tree" || \ + err "!mk $XBMK_CACHE/hash/$project$tree" + + [ "$badhash" != "y" ] || x_ rm -Rf "src/$project/$tree" \ + "elf/$project/$tree" "elf/$project/$target"; : +} + +check_cross_compiler() +{ + cbdir="src/coreboot/$tree" + [ "$project" != "coreboot" ] && cbdir="src/coreboot/default" + [ -n "$xtree" ] && cbdir="src/coreboot/$xtree" + + x_ ./mk -f coreboot "${cbdir#src/coreboot/}" + + export PATH="$xbmkpwd/$cbdir/util/crossgcc/xgcc/bin:$PATH" + export CROSS_COMPILE="${xarch% *}-" + [ -n "$xlang" ] && export BUILD_LANGUAGES="$xlang" + + # match gnat-X to gcc + check_gnu_path gcc gnat || x_ check_gnu_path gnat gcc + + xfix="${1%-*}" && [ "$xfix" = "x86_64" ] && xfix="x64" + xgccargs="crossgcc-$xfix UPDATED_SUBMODULES=1 CPUS=$XBMK_THREADS" + make -C "$cbdir" $xgccargs || x_ make -C "$cbdir" $xgccargs + + # we only want to mess with hostcc to build xgcc + remkdir "$XBMK_CACHE/gnupath" +} + +# fix mismatching gcc/gnat versions on debian trixie/sid. as of december 2024, +# trixie/sid had gnat-13 as gnat and gcc-14 as gcc, but has gnat-14 in apt. in +# some cases, gcc 13+14 and gnat-13 are present; or gnat-14 and gcc-14, but +# gnat in PATH never resolves to gnat-14, because gnat-14 was "experimental" +check_gnu_path() +{ + command -v "$1" 1>/dev/null || err "Host '$1' unavailable" + + eval "`setvars "" gccver gccfull gnatver gnatfull gccdir gnatdir`" + x_ gnu_setver "$1" "$1" || err "Command '$1' unavailable." + gnu_setver "$2" "$2" || : + + eval "[ -z \"\$$1ver\" ] && err \"Cannot detect host '$1' version\"" + [ "$gnatfull" = "$gccfull" ] && return 0 + + eval "$1dir=\"$(dirname "$(command -v "$1")")\"" + eval "_gnudir=\"\$$1dir\"; _gnuver=\"\$$1ver\"" + for _bin in "$_gnudir/$2-"*; do + [ "${_bin#"$_gnudir/$2-"}" = "$_gnuver" ] && [ -x "$_bin" ] \ + && _gnuver="${_bin#"$_gnudir/$2-"}" && break; : + done + gnu_setver "$2" "$_gnudir/$2-$_gnuver" || return 1 + [ "$gnatfull" = "$gccfull" ] || return 1 + + ( + remkdir "$XBMK_CACHE/gnupath" && x_ cd "$XBMK_CACHE/gnupath" + for _gnubin in "$_gnudir/$2"*"-$_gnuver"; do + _gnuutil="${_gnubin##*/}" && [ -e "$_gnubin" ] && \ + x_ ln -s "$_gnubin" "${_gnuutil%"-$_gnuver"}" + done + ) || err "Cannot create $2-$_gnuver link in $_gnudir"; : +} + +gnu_setver() +{ + eval "$2 --version 1>/dev/null 2>/dev/null || return 1" + eval "$1ver=\"`"$2" --version 2>/dev/null | head -n1`\"" + eval "$1ver=\"\${$1ver##* }\"" + eval "$1full=\"\$$1ver\"" + eval "$1ver=\"\${$1ver%%.*}\""; : +} + +check_defconfig() +{ + [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" + dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" + + $dry elfcheck || return 1 # skip build if a previous one exists + $dry x_ mkdir -p "$dest_dir" +} + +elfcheck() +{ + # TODO: *STILL* very hacky check. do it properly (based on build.list) + ( fx_ "exit 1" find "$dest_dir" -type f ) || return 1; : +} + +handle_makefile() +{ + $dry check_makefile "$srcdir" && x_ make -C "$srcdir" $cleanargs clean + + [ -f "$defconfig" ] && x_ cp "$defconfig" "$srcdir/.config" + [ -n "$mode" ] || [ -n "$btype" ] || $dry make -C \ + "$srcdir" silentoldconfig || make -C "$srcdir" oldconfig || : + + run_make_command || err "handle_makefile $srcdir: no makefile!" + + _copy=".config" && [ "$mode" = "savedefconfig" ] && _copy="defconfig" + [ "${mode%config}" = "$mode" ] || \ + $dry x_ cp "$srcdir/$_copy" "$defconfig" + + [ -e "$srcdir/.git" ] && [ "$project" = "u-boot" ] && \ + [ "$mode" = "distclean" ] && \ + $dry x_ git -C "$srcdir" $cleanargs clean -fdx; : +} + +run_make_command() +{ + [ -n "$mode" ] || x_ $premake + + $dry check_cmake "$srcdir" && [ -z "$mode" ] && \ + $dry check_autoconf "$srcdir" + $dry check_makefile "$srcdir" || return 1 + + $dry x_ make -C "$srcdir" $mode -j$XBMK_THREADS $makeargs + [ -n "$mode" ] || x_ $mkhelper + + [ "$mode" != "clean" ] || \ + $dry make -C "$srcdir" $cleanargs distclean || :; : +} + +check_cmake() +{ + [ -z "$cmakedir" ] || $dry check_makefile "$1" || cmake -B "$1" \ + "$1/$cmakedir" || $dry x_ check_makefile "$1" + [ -z "$cmakedir" ] || $dry x_ check_makefile "$1"; : +} + +check_autoconf() +{ + ( + cd "$1" || err "!cd $1" + [ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs + [ -f "autogen.sh" ] && x_ ./autogen.sh $autogenargs + [ -f "configure" ] && x_ ./configure $autoconfargs; : + ) || err "can't bootstrap project: $1"; : +} + +check_makefile() +{ + [ -f "$1/Makefile" ] || [ -f "$1/makefile" ] || \ + [ -f "$1/GNUmakefile" ] || return 1; : +} + +copy_elf() +{ + [ -f "$listfile" ] && x_ mkdir -p "$dest_dir" && while read -r f; do + [ -f "$srcdir/$f" ] && x_ cp "$srcdir/$f" "$dest_dir" + done < "$listfile" + x_ make clean -C "$srcdir" $cleanargs +} -- cgit v1.2.1 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') 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') 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 6e521c2e1ea975133894ce7fc27702feed080547 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 9 May 2025 20:21:58 +0100 Subject: mrc.sh: fix outdated info in the comment Signed-off-by: Leah Rowe --- include/mrc.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/mrc.sh b/include/mrc.sh index a1dcb140..00fb8626 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -23,9 +23,9 @@ extract_refcode() [ $# -lt 1 ] && extract_shellball - # cbfstool changed the attributes scheme for stage files, - # incompatible with older versions before coreboot 4.14, - # so we need coreboot 4.13 cbfstool for certain refcode files + # cbfstool after coreboot 4.13 changed the stage file attribute scheme, + # and refcode is extracted from an image using the old scheme. we use + # cbfstool from coreboot 4.11_branch, the tree used by ASUS KGPE-D16 chkvars cbfstoolref mkdir -p "${_refdest%/*}" || err "ref: !mkdir -p ${_refdest%/*}" -- cgit v1.2.1 From 14d46abceda7a7ad6081b6ab321fb0efb4bc3325 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 9 May 2025 20:31:00 +0100 Subject: mrc.sh: operate on refcode in tmp area first that way, the Intel GbE device can be enabled there, and only then would the refcode file be copied. otherwise, the current behaviour would leave buggy refcode in place, if the dd command failed. Signed-off-by: Leah Rowe --- include/mrc.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/mrc.sh b/include/mrc.sh index 00fb8626..edd35414 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -30,11 +30,13 @@ extract_refcode() mkdir -p "${_refdest%/*}" || err "ref: !mkdir -p ${_refdest%/*}" x_ "$cbfstoolref" "$appdir/bios.bin" extract \ - -m x86 -n fallback/refcode -f "$_refdest" -r RO_SECTION + -m x86 -n fallback/refcode -f "$appdir/ref" -r RO_SECTION # enable the Intel GbE device, if told by offset MRC_refcode_gbe [ -z "$MRC_refcode_gbe" ] || x_ dd if="config/ifd/hp820g2/1.bin" \ - of="$_refdest" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; : + of="$appdir/ref" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; : + + x_ mv "$appdir/ref" "$_refdest" } extract_shellball() -- 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/git.sh | 6 +++--- include/init.sh | 4 ++-- include/inject.sh | 27 +++++++++++++-------------- include/lib.sh | 2 +- include/mrc.sh | 10 +++++----- include/release.sh | 18 +++++++++--------- include/tree.sh | 2 +- 7 files changed, 34 insertions(+), 35 deletions(-) (limited to 'include') diff --git a/include/git.sh b/include/git.sh index 9440b1af..bbc5140e 100644 --- a/include/git.sh +++ b/include/git.sh @@ -61,7 +61,7 @@ git_prep() [ "$XBMK_RELEASE" = "y" ] && rmgit "$tmpgit" [ "$_loc" = "${_loc%/*}" ] || x_ mkdir -p "${_loc%/*}" - mv "$tmpgit" "$_loc" || err "git_prep: !mv $tmpgit $_loc" + x_ mv "$tmpgit" "$_loc" } fetch_submodule() @@ -82,7 +82,7 @@ fetch_submodule() [ "$st" = "file" ] && xbmkget "$subfile" "$subfile_bkup" \ "$tmpgit/$1" "$subhash" && return 0 - rm -Rf "$tmpgit/$1" || err "!rm '$mdir' '$1'" + x_ rm -Rf "$tmpgit/$1" tmpclone "$subrepo" "$subrepo_bkup" "$tmpgit/$1" "$subhash" \ "$mdir/${1##*/}/patches" } @@ -101,6 +101,6 @@ 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%/}" + e "$rmf" e missing || x_ rm -Rf "$rmf" done < "config/${1%/}/nuke.list"; : } diff --git a/include/init.sh b/include/init.sh index b9cb81b1..2eea04c0 100644 --- a/include/init.sh +++ b/include/init.sh @@ -45,7 +45,7 @@ xbmkpkg() eval "`setcfg "config/dependencies/$2"`" chkvars pkg_add pkglist - $pkg_add $pkglist || err "Cannot install packages" + x_ $pkg_add $pkglist [ -n "$aur_notice" ] && \ printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; : @@ -200,7 +200,7 @@ xbmk_create_pathdirs() ( # 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_ cd "$XBMK_CACHE/xbmkpath" x_ ln -s "`pybin "$python"`" python ) || err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; : } 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"; : } diff --git a/include/lib.sh b/include/lib.sh index 99e59a1a..2f87e8b1 100644 --- a/include/lib.sh +++ b/include/lib.sh @@ -58,7 +58,7 @@ xbmkget() for url in "$1" "$2"; do [ "$dl_fail" = "n" ] && break [ -z "$url" ] && continue - rm -f "$cached" || err "!rm -f '$cached'" + x_ rm -f "$cached" if [ "$_dlop" = "curl" ]; then curl --location --retry 3 -A "$_ua" "$url" \ -o "$cached" || wget --tries 3 -U "$_ua" "$url" \ diff --git a/include/mrc.sh b/include/mrc.sh index edd35414..3b3089fc 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -10,8 +10,8 @@ extract_mrc() { extract_shellball - "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ - -f "$_dest" -r RO_SECTION || err "extract_mrc: !$cbfstool $_dest" + x_ "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ + -f "$_dest" -r RO_SECTION [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode extra; : } @@ -27,7 +27,7 @@ extract_refcode() # and refcode is extracted from an image using the old scheme. we use # cbfstool from coreboot 4.11_branch, the tree used by ASUS KGPE-D16 chkvars cbfstoolref - mkdir -p "${_refdest%/*}" || err "ref: !mkdir -p ${_refdest%/*}" + x_ mkdir -p "${_refdest%/*}" x_ "$cbfstoolref" "$appdir/bios.bin" extract \ -m x86 -n fallback/refcode -f "$appdir/ref" -r RO_SECTION @@ -60,8 +60,8 @@ extract_partition() START=$(( $( echo $ROOTP | cut -f2 -d\ | tr -d "B" ) )) SIZE=$(( $( echo $ROOTP | cut -f4 -d\ | tr -d "B" ) )) - dd if="${1%.zip}" of="root-a.ext2" bs=1024 skip=$(( $START / 1024 )) \ - count=$(( $SIZE / 1024 )) || err "ex dd ${1%.zip}, root-a.ext2" + x_ dd if="${1%.zip}" of="root-a.ext2" bs=1024 skip=$(( $START / 1024 )) \ + count=$(( $SIZE / 1024 )) printf "cd /usr/sbin\ndump chromeos-firmwareupdate %s\nquit" \ "$SHELLBALL" | debugfs "root-a.ext2" || err "!extract shellball" diff --git a/include/release.sh b/include/release.sh index 2f9f2b86..4741b44a 100644 --- a/include/release.sh +++ b/include/release.sh @@ -22,9 +22,9 @@ release() relsrcdir="$vdir/$src_dirname" [ -e "$vdir" ] && err "already exists: \"$vdir\"" - mkdir -p "$vdir" || err "mkvdir: !mkdir -p \"$vdir\"" - git clone . "$relsrcdir" || err "mkdir: !gitclone \"$relsrcdir\"" - touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + x_ mkdir -p "$vdir" + x_ git clone . "$relsrcdir" + x_ touch "$relsrcdir/lock" build_release @@ -34,7 +34,7 @@ release() build_release() { ( - cd "$relsrcdir" || err "$vdir: !cd \"$relsrcdir\"" + x_ cd "$relsrcdir" x_ ./mk -f rmgit . @@ -43,17 +43,17 @@ build_release() git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \ --abbrev-commit > "$relsrcdir/CHANGELOG" || err "!log $relsrcdir" - rm -f "$relsrcdir/lock" || err "can't remove lock file in $relsrcdir" + x_ rm -f "$relsrcdir/lock" ( - cd "${relsrcdir%/*}" || err "$vdir: mktarball \"$relsrcdir\"" + x_ cd "${relsrcdir%/*}" x_ mktarball "${relsrcdir##*/}" "${relsrcdir##*/}.tar.xz" ) || err "can't create src tarball" [ "$relmode" = "src" ] && return 0 - touch "$relsrcdir/lock" || err "can't make lock file in $relsrcdir/" + x_ touch "$relsrcdir/lock" ( - cd "$relsrcdir" || err "$vdir: 2 !cd \"$relsrcdir\"" + x_ cd "$relsrcdir" x_ ./mk -d coreboot mk -b coreboot pico-serprog stm32-vserprog pcsx-redux @@ -61,5 +61,5 @@ build_release() x_ mv bin ../roms ) || err "can't build rom images" - rm -Rf "$relsrcdir" || err "!rm -Rf $relsrcdir" + x_ rm -Rf "$relsrcdir" } diff --git a/include/tree.sh b/include/tree.sh index 4d0c533d..47f65d10 100644 --- a/include/tree.sh +++ b/include/tree.sh @@ -322,7 +322,7 @@ check_cmake() check_autoconf() { ( - cd "$1" || err "!cd $1" + x_ cd "$1" [ -f "bootstrap" ] && x_ ./bootstrap $bootstrapargs [ -f "autogen.sh" ] && x_ ./autogen.sh $autogenargs [ -f "configure" ] && x_ ./configure $autoconfargs; : -- 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') 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/init.sh | 2 +- include/inject.sh | 347 ++-------------------------------------------------- include/vendor.sh | 354 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 365 insertions(+), 338 deletions(-) create mode 100644 include/vendor.sh (limited to 'include') diff --git a/include/init.sh b/include/init.sh index 2eea04c0..2dd9e88f 100644 --- a/include/init.sh +++ b/include/init.sh @@ -16,7 +16,7 @@ xbmkpath="$PATH" eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver xbmklocal \ - xbmklock`" + xbmklock cvxbmk cvchk`" xbmk_init() { 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" diff --git a/include/vendor.sh b/include/vendor.sh new file mode 100644 index 00000000..bc329398 --- /dev/null +++ b/include/vendor.sh @@ -0,0 +1,354 @@ +# 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 + +# These are variables and functions, extending the functionality of +# inject.sh, to be used with lbmk; they are kept separate here, so that +# the main inject.sh can be as similar as possible between lbmk and cbmk, +# so that cherry-picking lbmk patches into cbmk yields fewer merge conflicts. + +# When reading this file, you should imagine that it is part of inject.sh, +# with inject.sh concatenated onto vendor.sh; they are inexorably intertwined. +# The main "mk" script sources vendor.sh first, and then inject.sh, in lbmk. + +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" + +# lbmk-specific extension to the "cv" variable (not suitable for cbmk) +cvchk="CONFIG_INCLUDE_SMSC_SCH5545_EC_FW CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN \ + CONFIG_KBC1126_FIRMWARE CONFIG_LENOVO_TBFW_BIN CONFIG_VGA_BIOS_FILE \ + CONFIG_FSP_M_FILE CONFIG_FSP_S_FILE" + +# lbmk-specific extensions to the "cv" variable (not suitable for cbmk) +cvxbmk="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_FSP_FD_PATH \ + CONFIG_IFD_BIN_PATH CONFIG_MRC_FILE CONFIG_FSP_M_CBFS" + +# lbmk-specific extensions; mostly used for downloading vendor files +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 \ + mecleaner kbc1126_ec_dump MRC_refcode_cbtree _dl SCH5545EC_DL_url \ + EC_url rom DL_url nukemode cbfstoolref FSPFD_hash \ + _7ztest ME11bootguard ME11delta ME11version ME11sku ME11pch \ + _me _metmp mfs TBFW_url_bkup TBFW_url TBFW_hash \ + TBFW_size hashfile xromsize xchanged EC_url_bkup vfile \ + CONFIG_FSP_USE_REPO CONFIG_FSP_FULL_FD`" + +download() +{ + [ $# -gt 0 ] || err "No argument given" + export PATH="$PATH:/sbin" + board="$1" && check_target && 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="" + + "$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" +} + +check_vcfg() +{ + vfile="config/vendor/$vcfg/pkg.cfg" + [ -L "$vfile" ] && err "'$archive', '$board': $vfile is a symlink"; : + [ -f "$vfile" ] || err "'$archive', '$board': $vfile missing"; : +} + +setvfile() +{ + [ -n "$vfile" ] && for c in $cvchk; do + eval "[ \"\${$c}\" = \"/dev/null\" ] && continue" + eval "[ -z \"\${$c}\" ] && continue" + eval "`setcfg "$vfile"`" + return 1 + done && return 0; return 1 +} + +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" +} -- cgit v1.2.1 From a8e374020c0bea6cc849ffdf424b382fe535fee9 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Sat, 10 May 2025 17:19:00 +0100 Subject: tree.sh: simplified srcdir check on make-clean this is the check that ksips a given target if the tree directory does not exist, on the clean command. Signed-off-by: Leah Rowe --- include/tree.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/tree.sh b/include/tree.sh index 47f65d10..1d5dd071 100644 --- a/include/tree.sh +++ b/include/tree.sh @@ -112,9 +112,8 @@ handle_defconfig() chkvars tree srcdir="src/$project/$tree" - if [ "$mode" = "distclean" ] || [ "$mode" = "crossgcc-clean" ]; then - [ -d "$srcdir" ] || return 0 - fi + [ "$mode" = "${mode%clean}" ] && [ ! -d "$srcdir" ] && return 0 + [ -z "$mode" ] && for _xarch in $xarch; do $dry check_cross_compiler "$_xarch" done; : -- cgit v1.2.1 From 0aa99f4bf8b52ea6060f0cd72263b9d4b4e99699 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Sat, 10 May 2025 17:58:22 +0100 Subject: tree.sh: only create elfdir in copy_elf() otherwise, we create empty directories where build.list doesn't exist, like on coreboot. we already create a directory when needed, when actually copying elf files, so let's just leave it at that. Signed-off-by: Leah Rowe --- include/tree.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'include') diff --git a/include/tree.sh b/include/tree.sh index 1d5dd071..d4585b92 100644 --- a/include/tree.sh +++ b/include/tree.sh @@ -107,7 +107,6 @@ handle_defconfig() [ -f "CHANGELOG" ] || fetch_project "$project" configure_project "$target_dir" || return 0 - x_ mkdir -p "$elfdir/$target" chkvars tree srcdir="src/$project/$tree" @@ -267,8 +266,7 @@ check_defconfig() [ -f "$defconfig" ] || $dry err "$project/$target: missing defconfig" dest_dir="$elfdir/$target/${defconfig#"$target_dir/config/"}" - $dry elfcheck || return 1 # skip build if a previous one exists - $dry x_ mkdir -p "$dest_dir" + $dry elfcheck || return 1; : # skip build if a previous one exists } elfcheck() -- cgit v1.2.1