summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/git.sh49
-rw-r--r--include/init.sh147
-rw-r--r--include/inject.sh330
-rw-r--r--include/lib.sh87
-rw-r--r--include/mrc.sh61
-rw-r--r--include/rom.sh71
6 files changed, 328 insertions, 417 deletions
diff --git a/include/git.sh b/include/git.sh
index 9be79527..81c75806 100644
--- a/include/git.sh
+++ b/include/git.sh
@@ -5,7 +5,7 @@
eval "`setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \
depend subfile_bkup repofail`"
-tmpgit="$xbmkpwd/tmp/gitclone"
+tmpgit="$xbmklocal/gitclone"
fetch_targets()
{
@@ -54,25 +54,14 @@ git_prep()
chkvars rev
tmpclone "$1" "$2" "$tmpgit" "$rev" "$_patchdir"
if singletree "$project" || [ $# -gt 4 ]; then
- [ -f "$mdir/module.list" ] && while read -r msrcdir; do
- fetch_submodule "$msrcdir"
- done < "$mdir/module.list"; :
+ dx_ fetch_submodule "$mdir/module.list"
fi
[ "$_loc" != "$XBMK_CACHE/repo/$project" ] && \
[ "$XBMK_RELEASE" = "y" ] && rmgit "$tmpgit"
[ "$_loc" = "${_loc%/*}" ] || x_ mkdir -p "${_loc%/*}"
- mv "$tmpgit" "$_loc" || $err "git_prep: !mv $tmpgit $_loc"
-}
-
-# return 0 if project is single-tree, otherwise 1
-# e.g. coreboot is multi-tree, so 1
-singletree()
-{
- for targetfile in "config/${1}/"*/target.cfg; do
- [ -e "$targetfile" ] && [ -f "$targetfile" ] && return 1; :
- done; :
+ mv "$tmpgit" "$_loc" || err "git_prep: !mv $tmpgit $_loc"
}
fetch_submodule()
@@ -80,20 +69,20 @@ fetch_submodule()
mcfgdir="$mdir/${1##*/}"; eval \
"`setvars "" subhash subrepo subrepo_bkup subfile subfile_bkup st`"
[ ! -f "$mcfgdir/module.cfg" ] || . "$mcfgdir/module.cfg" || \
- $err "! . $mcfgdir/module.cfg"
+ err "! . $mcfgdir/module.cfg"
for xt in repo file; do
_seval="if [ -n \"\$sub$xt\" ] || [ -n \"\$sub${xt}_bkup\" ]"
eval "$_seval; then st=\"\$st \$xt\"; fi"
done
- st="${st# }" && [ "$st" = "repo file" ] && $err "$mdir: repo+file"
+ st="${st# }" && [ "$st" = "repo file" ] && err "$mdir: repo+file"
[ -z "$st" ] && return 0 # subrepo/subfile not defined
chkvars "sub${st}" "sub${st}_bkup" "subhash"
[ "$st" = "file" ] && xbmkget "$subfile" "$subfile_bkup" \
"$tmpgit/$1" "$subhash" && return 0
- rm -Rf "$tmpgit/$1" || $err "!rm '$mdir' '$1'"
+ rm -Rf "$tmpgit/$1" || err "!rm '$mdir' '$1'"
tmpclone "$subrepo" "$subrepo_bkup" "$tmpgit/$1" "$subhash" \
"$mdir/${1##*/}/patches"
}
@@ -105,41 +94,31 @@ tmpclone()
repofail="n"
- [ $# -lt 6 ] || rm -Rf "$3" || $err "git retry: !rm $3 ($1)"
+ [ $# -lt 6 ] || rm -Rf "$3" || err "git retry: !rm $3 ($1)"
repodir="$XBMK_CACHE/repo/${1##*/}" && [ $# -gt 5 ] && repodir="$3"
- mkdir -p "$XBMK_CACHE/repo" || $err "!rmdir $XBMK_CACHE/repo"
+ mkdir -p "$XBMK_CACHE/repo" || err "!rmdir $XBMK_CACHE/repo"
if [ "$livepull" = "y" ] && [ ! -d "$repodir" ]; then
git clone "$1" "$repodir" || git clone $2 "$repodir" || \
- $err "!clone $1 $2 $repodir $4 $5" #
+ err "!clone $1 $2 $repodir $4 $5" #
elif [ -d "$repodir" ] && [ $# -lt 6 ]; then
git -C "$repodir" pull || sleep 3 || git -C "$repodir" pull \
|| sleep 3 || git -C "$repodir" pull || :
fi
(
- [ $# -gt 5 ] || git clone "$repodir" "$3" || $err "!clone $repodir $3"
- git -C "$3" reset --hard "$4" || $err "!reset $1 $2 $3 $4 $5"
- git_am_patches "$3" "$5"
+ [ $# -gt 5 ] || git clone "$repodir" "$3" || err "!clone $repodir $3"
+ git -C "$3" reset --hard "$4" || err "!reset $1 $2 $3 $4 $5"
+ fx_ "eval x_ git -C \"$3\" am" find "$5" -type f
) || repofail="y"
[ "$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
- [ -d "$p" ] && git_am_patches "$1" "$p" && continue
- [ ! -f "$p" ] || git -C "$1" am "$p" || $err "$1 $2: !am $p"
- done; :
+ [ "$repofail" = "y" ] && err "!clone $1 $2 $3 $4 $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%/}"
+ e "$rmf" e missing || rm -Rf "$rmf" || err "!rm $rmf, ${2%/}"
done < "config/${1%/}/nuke.list"; :
}
diff --git a/include/init.sh b/include/init.sh
index b8839921..d2db0236 100644
--- a/include/init.sh
+++ b/include/init.sh
@@ -14,60 +14,43 @@ projectsite="https://libreboot.org/"
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
xbmkpath="$PATH"
-err="err_"
-
eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \
- datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver`"
+ datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver xbmklocal \
+ xbmklock`"
xbmk_init()
{
- xbmkpwd="`pwd`" || $err "Cannot generate PWD"
+ xbmkpwd="`pwd`" || err "Cannot generate PWD"
+ xbmklocal="$xbmkpwd/tmp"
+ xbmklock="$xbmkpwd/lock"
+
export PWD="$xbmkpwd"
- if [ $# -gt 0 ] && [ "$1" = "dependencies" ]; then
- install_packages "$@" || exit 1
- exit 0
- fi
+ [ $# -gt 0 ] && [ "$1" = "dependencies" ] && x_ xbmkpkg "$@" && exit 0
- 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"
+ 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"
- for init_cmd in set_pyver set_env set_version git_init create_tmpdir \
+ for init_cmd in set_pyver set_version set_env git_init create_tmpdir \
lock create_pathdirs child_exec; do
xbmk_$init_cmd "$@" || break
done
}
-install_packages()
+xbmkpkg()
{
- [ $# -lt 2 ] && $err "fewer than two arguments"
+ [ $# -lt 2 ] && err "fewer than two arguments"
[ $# -gt 2 ] && reinstall="$3"
eval "`setcfg "config/dependencies/$2"`"
chkvars pkg_add pkglist
- $pkg_add $pkglist || $err "Cannot install packages"
+ $pkg_add $pkglist || err "Cannot install packages"
[ -n "$aur_notice" ] && \
printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; :
}
-setcfg()
-{
- [ $# -gt 1 ] && printf "e \"%s\" f missing && return %s;\n" "$1" "$2"
- [ $# -gt 1 ] || \
- printf "e \"%s\" f not && %s \"Missing config\";\n" "$1" "$err"
- printf ". \"%s\" || %s \"Could not read config\";\n" "$1" "$err"
-}
-
-chkvars()
-{
- for var in "$@"; do
- eval "[ -n \"\${$var+x}\" ] || \$err \"$var unset\""
- eval "[ -n \"\$$var\" ] || \$err \"$var unset\""
- done; :
-}
-
xbmk_set_pyver()
{
pyv="import sys; print(sys.version_info[:])"
@@ -76,13 +59,11 @@ xbmk_set_pyver()
pyver="2" && [ "$python" = "python3" ] && pyver="3"
pybin "$python" 1>/dev/null || pyver=""
[ -z "$pyver" ] || "`pybin "$python"`" -c "$pyv" 1>/dev/null \
- 2>/dev/null || $err "Cannot detect host Python version."
- if [ -n "$pyver" ]; then
- pyver="$("$(pybin "$python")" -c "$pyv" | awk '{print $1}')"
- pyver="${pyver#(}"
- pyver="${pyver%,}"
- fi
- [ "${pyver%%.*}" = "3" ] || $err "Bad python version (must by 3.x)"; :
+ 2>/dev/null || err "Cannot detect host Python version."
+ [ -n "$pyver" ] && \
+ pyver="$("$(pybin "$python")" -c "$pyv" | awk '{print $1}')" && \
+ pyver="${pyver#(}" && pyver="${pyver%,}"
+ [ "${pyver%%.*}" = "3" ] || err "Bad python version (must by 3.x)"; :
}
# Use direct path, to prevent a hang if Python is using a virtual environment,
@@ -99,8 +80,7 @@ pybin()
# ideally, don't rely on PATH or hardcoded paths if python venv.
# use the *real*, direct executable linked to by the venv symlink
if [ $venv -gt 0 ] && [ -L "`command -v "$1" 2>/dev/null`" ]; then
- # realpath isn't posix, but available mostly universally
- pypath="$(realpath \
+ pypath="$(findpath \
"$(command -v "$1" 2>/dev/null)" 2>/dev/null || :)"
[ -e "$pypath" ] && [ ! -d "$pypath" ] && \
[ -x "$pypath" ] && printf "%s\n" "$pypath" && return 0; :
@@ -111,42 +91,21 @@ pybin()
[ -e "$pypath/$1" ] && [ ! -d "$pypath/$1" ] && \
[ -x "$pypath/$1" ] && printf "%s/%s\n" "$pypath" "$1" && \
return 0
- done
- [ $venv -gt 0 ] && return 1
+ done && return 1
# Defer to normal command -v if not a venv
command -v "$1" 2>/dev/null || return 1
}
-xbmk_set_env()
-{
- # XBMK_CACHE is a directory, for caching downloads and git repon
- [ -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 '$xbmkpwd/cache' is a symlink"
- [ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache"
- [ -f "$XBMK_CACHE" ] && $err "cachedir '$XBMK_CACHE' is 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"
- [ "$XBMK_RELEASE" = "y" ] || export XBMK_RELEASE="n"
-
- [ -z "${XBMK_THREADS+x}" ] && export XBMK_THREADS=1
- expr "X$XBMK_THREADS" : "X-\{0,1\}[0123456789][0123456789]*$" \
- 1>/dev/null 2>/dev/null || export XBMK_THREADS=1; :
-}
-
xbmk_set_version()
{
[ ! -f ".version" ] || read -r version < ".version" || :; :
[ ! -f ".versiondate" ] || read -r versiondate < ".versiondate" || :; :
[ -e ".git" ] || [ -f ".version" ] || printf "unknown\n" > ".version" \
- || $err "Cannot generate unknown .version file"
+ || err "Cannot generate unknown .version file"
[ -e ".git" ] || [ -f ".versiondate" ] || printf "1716415872\n" > \
- ".versiondate" || $err "Can't generate unknown versiondate file"; :
+ ".versiondate" || err "Can't generate unknown versiondate file"; :
version_="$version"
[ ! -e ".git" ] || version="$(git describe --tags HEAD 2>&1)" || \
@@ -156,15 +115,45 @@ xbmk_set_version()
--pretty='%ct' HEAD)" || versiondate="$versiondate_"
chkvars version versiondate
- printf "%s\n" "$version" > ".version" || $err "can't save version"
- printf "%s\n" "$versiondate" > ".versiondate" || $err "can't save date"
+ printf "%s\n" "$version" > ".version" || err "can't save version"
+ printf "%s\n" "$versiondate" > ".versiondate" || err "can't save date"
relname="$projectname-$version"
+}
+
+xbmk_set_env()
+{
export LOCALVERSION="-$projectname-${version%%-*}"
+
+ # XBMK_CACHE is a directory, for caching downloads and git repon
+ [ -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 '$xbmkpwd/cache' is a symlink"
+ [ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$xbmkpwd/cache"
+ xbmkcache="`findpath "$XBMK_CACHE"`" || \
+ err "Can't resolve cachedir: '$XBMK_CACHE'"
+ export XBMK_CACHE="$xbmkcache"
+ [ -d "$XBMK_CACHE" ] || err "cachedir '$XBMK_CACHE' is 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"
+ [ "$XBMK_RELEASE" = "Y" ] && export XBMK_RELEASE="y"
+ [ "$XBMK_RELEASE" = "y" ] || export XBMK_RELEASE="n"
+
+ [ -z "${XBMK_THREADS+x}" ] && export XBMK_THREADS=1
+ expr "X$XBMK_THREADS" : "X-\{0,1\}[0123456789][0123456789]*$" \
+ 1>/dev/null 2>/dev/null || export XBMK_THREADS=1; :
}
xbmk_git_init()
{
+ for gitarg in "--global user.name" "--global user.email"; do
+ gitcmd="git config $gitarg"; $gitcmd 1>/dev/null 2>/dev/null \
+ || err "Run this first: $gitcmd \"your ${gitcmd##*.}\""
+ done
+
[ -L ".git" ] && return 1
[ -e ".git" ] && return 0
eval "`setvars "$(date -Rud @$versiondate)" cdate _nogit`"
@@ -174,16 +163,13 @@ xbmk_git_init()
x_ git commit -m "$projectname $version" --date "$cdate" \
--author="xbmk <xbmk@example.com>" 1>/dev/null 2>/dev/null
x_ git tag -a "$version" -m "$projectname $version" 1>/dev/null \
- 2>/dev/null
-
- for gitarg in "--global user.name" "--global user.email"; do
- gitcmd="git config $gitarg"; $gitcmd || $err \
- "Please run this first: $gitcmd \"your ${gitcmd##*.}\""
- done
+ 2>/dev/null; :
}
xbmk_create_tmpdir()
{
+ x_ mkdir -p "$xbmklocal"
+
# unify all temporary files/directories in a single TMPDIR
[ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || \
unset TMPDIR
@@ -194,33 +180,36 @@ xbmk_create_tmpdir()
export TMPDIR="/tmp"
export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)"
xbmktmp="$TMPDIR"
+
+ # /tmp might be a tmpfs, so for large files we use ./tmp,
+ # not to be confused with xbmktmp (xbmktmp points to /tmp)
+ remkdir "$xbmktmp" "$xbmklocal"
}
xbmk_lock()
{
- [ -f "lock" ] && $err "$xbmkpwd/lock exists. Is a build running?"
- touch lock || $err "cannot create 'lock' file"; :
+ [ -f "$xbmklock" ] && err "'$xbmklock' exists. Is a build running?"
+ touch "$xbmklock" || err "cannot create '$xbmklock'"; :
}
xbmk_create_pathdirs()
{
- x_ rm -Rf "$XBMK_CACHE/xbmkpath" "$XBMK_CACHE/gnupath"
- x_ mkdir -p "$XBMK_CACHE/gnupath" "$XBMK_CACHE/xbmkpath"
+ remkdir "$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"
+ cd "$XBMK_CACHE/xbmkpath" || err "can't cd $XBMK_CACHE/xbmkpath"
x_ ln -s "`pybin "$python"`" python
- ) || $err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; :
+ ) || err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"; :
}
xbmk_child_exec()
{
xbmk_rval=0
( x_ ./mk "$@" ) || xbmk_rval=1
- rm -Rf "$xbmktmp" || xbmk_rval=1
- rm -f lock || xbmk_rval=1
+ ( x_ rm -Rf "$xbmklocal" "$xbmktmp" ) || xbmk_rval=1
+ ( x_ rm -f "$xbmklock" ) || xbmk_rval=1
exit $xbmk_rval
}
diff --git a/include/inject.sh b/include/inject.sh
index 6b316729..c0b4409f 100644
--- a/include/inject.sh
+++ b/include/inject.sh
@@ -13,8 +13,7 @@ cbcfgsdir="config/coreboot"
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"
+tmpromdel="$xbmklocal/DO_NOT_FLASH"
nvm="util/nvmutil/nvm"
ifdtool="elf/ifdtool/default/ifdtool"
@@ -35,13 +34,13 @@ 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 cdir sdir _me _metmp mfs TBFW_url_bkup TBFW_url \
+ 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`"
download()
{
- [ $# -gt 0 ] || $err "No argument given"
+ [ $# -gt 0 ] || err "No argument given"
export PATH="$PATH:/sbin"
board="$1" && readcfg && readkconfig && bootstrap && getfiles; :
}
@@ -49,9 +48,8 @@ download()
readkconfig()
{
x_ rm -f "$xbmktmp/cbcfg"
- cbcfg="`check_defconfig "$boarddir"`" || for cbc in $cv; do
- grep "$cbc" "$cbcfg" 1>>"$xbmktmp/cbcfg" 2>/dev/null || :
- done
+ fx_ scankconfig x_ find "$boarddir/config" -type f
+
eval "`setcfg "$xbmktmp/cbcfg" 1`"
for c in $cvchk; do
@@ -63,6 +61,13 @@ readkconfig()
return 1
}
+scankconfig()
+{
+ for cbc in $cv; do
+ grep "$cbc" "$1" 1>>"$xbmktmp/cbcfg" 2>/dev/null || :
+ done
+}
+
bootstrap()
{
x_ ./mk -f coreboot ${cbdir##*/}
@@ -86,16 +91,13 @@ getfiles()
"$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"
- #
- # 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" \
+ [ -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 "fsps" "$CONFIG_FSP_FD_PATH" \
+ [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \
"$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_S_FILE" copy; :
}
@@ -109,143 +111,87 @@ fetch()
[ "$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
+ # 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"
- rm -Rf "${_dl}_extracted" || $err "!rm ${_ul}_extracted. $dontflash"
+ rm -Rf "${_dl}_extracted" || err "!rm ${_ul}_extracted. $dontflash"
e "$_dest" f && return 0
x_ mkdir -p "${_dest%/*}"
remkdir "$appdir"
- extract_archive "$_dl" "$appdir" "$dl_type" || \
- [ "$dl_type" = "e6400vga" ] || $err "$_dest $dl_type: !extract"
+ [ "$dl_type" = "fsp" ] || extract_archive "$_dl" "$appdir" || \
+ [ "$dl_type" = "e6400vga" ] || err "$_dest $dl_type: !extract"
- eval "extract_$dl_type"
+ x_ extract_$dl_type "$_dl" "$appdir"
set -u -e
- e "$_dest" f missing && $err "!extract_$dl_type. $dontflash"; :
+ e "$_dest" f missing && err "!extract_$dl_type. $dontflash"; :
}
extract_intel_me()
{
- e "$mecleaner" f not && $err "$cbdir: me_cleaner missing. $dontflash"
+ e "$mecleaner" f not && err "$cbdir: me_cleaner missing. $dontflash"
- cdir="$xbmkpwd/$appdir"
+ _7ztest="$xbmklocal/metmp/a"
_me="$xbmkpwd/$_dest"
- _metmp="$xbmkpwd/tmp/me.bin"
+ _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
- x_ mkdir -p tmp
+ set +u +e && fx_ find_me x_ find "$xbmkpwd/$appdir" -type f
+ [ "$ME11bootguard" != "y" ] && x_ mv "$_metmp" "$_me" && return 0
- extract_intel_me_bruteforce
- if [ "$ME11bootguard" = "y" ]; then
- apply_me11_deguard_mod
- else
- mv "$_metmp" "$_me" || $err "!mv $_metmp $_me - $dontflash"
- fi
+ (
+ 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_intel_me_bruteforce()
+find_me()
{
- [ $# -gt 0 ] && cdir="$1"
- e "$_metmp" f && return 0
+ e "$_metmp" f && x_ rm -Rf "$xbmklocal/metmp" && return 1
+ [ -L "$1" ] && return 0
- [ -z "$sdir" ] && sdir="$(mktemp -d)"
- x_ mkdir -p "$sdir"
+ _7ztest="${_7ztest}a" && _r="-r" && [ -n "$mfs" ] && _r=""
- set +u +e
- (
- [ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}"
- cd "$cdir" || $err "extract_intel_me: !cd \"$cdir\" - $dontflash"
- for i in *; do
- e "$_metmp" f && break
- [ -L "$i" ] && continue
- if [ -f "$i" ]; then
- _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_bruteforce "$cdir/$_7ztest"
- elif [ -d "$i" ]; then
- 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 - $dontflash"
-}
+ "$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
-apply_me11_deguard_mod()
-{
- (
- 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"
+ fx_ find_me x_ find "$_7ztest" -type f || return 1; :
}
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"
+ [ ! -d "${_dl}_extracted" ] || x_ cp -R "${_dl}_extracted" "$2"; :
}
extract_kbc1126ec()
{
- x_ e "$kbc1126_ec_dump" f
(
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 "kbc1126 unar failed"
- x_ mv Rom.bin ec.bin
- fi
+ 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"
+ ) || err "$board: can't extract kbc1126 ec firmware - $dontflash"
x_ e "$appdir/ec.bin.fw1" f && x_ e "$appdir/ec.bin.fw2" f
-
- cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || \
- $err "!cp 1126ec $_dest - $dontflash"; :
+ x_ cp "$appdir/"ec.bin.fw* "${_dest%/*}/"
}
extract_e6400vga()
@@ -257,7 +203,7 @@ extract_e6400vga()
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"
+ ) || err "can't extract e6400 vga rom - $dontflosh"
x_ cp "$appdir/$E6400_VGA_romname" "$_dest"
}
@@ -270,7 +216,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"
+ "$uefiextract" "$_bios" || err "sch5545 !extract - $dontflash"
x_ cp "$_sch5545ec_fw" "$_dest"
}
@@ -278,59 +224,32 @@ extract_sch5545ec()
# 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 # 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"
+ chkvars TBFW_size; fx_ copytb x_ find "$appdir" -type f -name "TBT.bin"
}
-extract_fspm()
+copytb()
{
- copy_fsp M; :
+ [ -f "$1" ] && [ ! -L "$1" ] && x_ dd if=/dev/null of="$1" bs=1 \
+ seek=$TBFW_size && x_ mv "$1" "$_dest" && return 1; :
}
-extract_fsps()
+extract_fsp()
{
- copy_fsp S; :
-}
-
-# this copies the fsp s/m; re-base is handled by ./mk inject
-copy_fsp()
-{
- x_ cp "$appdir/Fsp_$1.fd" "$_dest"
-}
-
-fail_inject()
-{
- [ -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"
+ x_ python "$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" split -f "$1" \
+ -o "${_dest%/*}" -n "Fsp.fd"
}
inject()
{
need_files="n"
- err="fail_inject"
remkdir "$tmpromdel"
set +u +e
- [ $# -lt 1 ] && $err "No options specified. - $dontflash"
+ [ $# -lt 1 ] && err "No options specified. - $dontflash"
eval "`setvars "" nukemode new_mac xchanged`"
archive="$1";
- new_mac="??:??:??:??:??:??"
+ new_mac="xx:xx:xx:xx:xx:xx"
[ $# -gt 1 ] && case "$2" in
nuke)
@@ -338,12 +257,15 @@ inject()
nukemode="nuke" ;;
setmac)
[ $# -gt 2 ] && new_mac="$3" && \
- [ -z "$new_mac" ] && $err "Empty MAC address specified" ;;
- *) $err "Unrecognised inject mode: '$2'"
+ [ -z "$new_mac" ] && err "Empty MAC address specified" ;;
+ *) err "Unrecognised inject mode: '$2'"
esac
[ "$new_mac" = "keep" ] && new_mac=""
- check_release "$archive" || $err "'$archive' is not a release archive"
+ [ -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"
readcfg && need_files="y"
if [ "$need_files" = "y" ] || [ -n "$new_mac" ]; then
@@ -359,20 +281,20 @@ inject()
check_release()
{
- [ -L "$archive" ] && $err "'$archive' is a symlink. $dontflash"
+ [ -L "$archive" ] && err "'$archive' is a symlink. $dontflash"
e "$archive" f missing && return 1
archivename="`basename "$archive"`"
- [ -z "$archivename" ] && $err "Can't determine archive name. $dontflash"
+ [ -z "$archivename" ] && err "Can't determine archive name. $dontflash"
case "$archivename" in
*_src.tar.xz)
- $err "'$archive' is a src archive, silly!" ;;
+ err "'$archive' is a src archive, silly!" ;;
grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*)
return 1 ;;
*.tar.xz) _stripped_prefix="${archivename#*_}"
board="${_stripped_prefix%.tar.xz}" ;;
- *) $err "'$archive': could not detect board type - $dontflash"
+ *) err "'$archive': could not detect board type - $dontflash"
esac; :
}
@@ -390,8 +312,8 @@ readcfg()
[ -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"
+ [ -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"
@@ -406,47 +328,30 @@ readcfg()
patch_release_roms()
{
has_hashes="n"
- tmpromdir="tmp/DO_NOT_FLASH/bin/$board"
+ tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board"
remkdir "${tmpromdir%"/bin/$board"}"
x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}"
for _hashes in $hashfiles; do
- [ "$need_files" = "y" ] || break
- e "$tmpromdir/$_hashes" f && has_hashes="y" && \
- hashfile="$_hashes" && break; :
+ [ "$need_files" = "y" ] && e "$tmpromdir/$_hashes" f && \
+ has_hashes="y" && hashfile="$_hashes" && break; :
done
- x_ mkdir -p "tmp" && [ -L "tmp/rom.list" ] && \
- $err "'$archive' -> tmp/rom.list is a symlink - $dontflash"
-
- 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"
- [ "$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
+ readkconfig || exit 0; [ "$need_files" = "n" ] || \
+ fx_ prep x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom"
(
- [ "$need_files" = "y" ] || exit 0
- cd "$tmpromdir" || $err "patch '$archive': can't cd $tmpromdir"
+ cd "$tmpromdir" || err "patch '$archive': can't 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"
+ ) || err "'$archive' -> Can't verify vendor hashes. $dontflash"
- [ -z "$new_mac" ] || modify_mac || printf "\nGbE not defined\n" 1>&2
+ [ -z "$new_mac" ] || [ -z "$CONFIG_GBE_BIN_PATH" ] || modify_mac
[ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || :
[ "$xchanged" = "y" ] || return 0
@@ -454,13 +359,13 @@ patch_release_roms()
(
x_ cd "${tmpromdir%"/bin/$board"}"
mkrom_tarball "bin/$board"
- ) || $err "Cannot re-generate '$archive' - $dontflash"
+ ) || err "Cannot re-generate '$archive' - $dontflash"
mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \
- "$archive" || $err "'$archive' -> Can't overwrite - $dontflash"; :
+ "$archive" || err "'$archive' -> Can't overwrite - $dontflash"; :
}
-process_release_rom()
+prep()
{
_xrom="$1"
_xromname="${1##*/}"
@@ -468,16 +373,16 @@ process_release_rom()
[ "$nukemode" = "nuke" ] && _xromnew="${_xrom%/*}/$vfix${_xrom##*/}"
e "$_xrom" f missing && return 0
- [ -z "${_xromname#"$vfix"}" ] && $err "$_xromname / $vfix: name match"
+ [ -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"
+ 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
- rm -f "$_xrom" || $err "Can't rm $_xrom - $dontflash"
+ rm -f "$_xrom" || err "Can't rm $_xrom - $dontflash"
_xrom="$_xromnew"
fi
@@ -488,7 +393,7 @@ process_release_rom()
[ "$nukemode" != "nuke" ] && return 0
# Rename the file, prefixing a warning saying not to flash
- cat "$_xrom" config/data/coreboot/0 > "$_xromnew" || $err "!pad $_xrom"
+ cat "$_xrom" config/data/coreboot/0 > "$_xromnew" || err "!pad $_xrom"
x_ rm -f "$_xrom"
}
@@ -538,11 +443,10 @@ insert()
_offset=""
- if [ "$_t" = "fsp" ]; then
- [ $# -gt 3 ] && _offset="$4"
- else
- [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \
- $err "insert $*, $rom: offset given but empty (undefined)"
+ 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)"
fi
[ "$nukemode" = "nuke" ] || x_ e "$_dest" f
@@ -550,44 +454,34 @@ insert()
if [ "$cbfsname" = "IFD" ]; then
[ "$nukemode" = "nuke" ] || "$ifdtool" $ifdprefix -i \
$_t:$_dest "$rom" -O "$rom" || \
- $err "failed: insert '$_t' '$_dest' on '$rom'"
+ err "failed: insert '$_t' '$_dest' on '$rom'"
[ "$nukemode" != "nuke" ] || "$ifdtool" $ifdprefix --nuke $_t \
- "$rom" -O "$rom" || $err "$rom: !nuke IFD/$_t"
+ "$rom" -O "$rom" || err "$rom: !nuke IFD/$_t"
elif [ "$nukemode" = "nuke" ]; then
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"
+ 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"
else
"$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \
- -t $_t $_offset || $err "$rom !add $_t ($_dest)"
+ -t $_t $_offset || err "$rom !add $_t ($_dest)"
fi
xchanged="y"; :
}
modify_mac()
{
- [ -n "$CONFIG_GBE_BIN_PATH" ] || return 1
+ x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe"
+ [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \
+ x_ "$nvm" "$xbmklocal/gbe" setmac "$new_mac"
- x_ mkdir -p tmp && x_ cp "${CONFIG_GBE_BIN_PATH##*../}" tmp/gbe
- [ "$new_mac" != "restore" ] && x_ make -C util/nvmutil && \
- x_ "$nvm" tmp/gbe setmac "$new_mac"
-
- 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"
-
- printf "\nGbE NVM written to '%s':\n" "$archive"
- x_ "$nvm" tmp/gbe dump | grep -v "bytes read from file" || :
+ fx_ newmac x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom"
+}
- [ "$new_mac" = "restore" ] && \
- printf "\nDefault GbE file '%s' written, unmodified.\n" \
- "${CONFIG_GBE_BIN_PATH##*../}"; :
+newmac()
+{
+ e "$1" f && xchanged="y" && x_ \
+ "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; :
}
diff --git a/include/lib.sh b/include/lib.sh
index bef2a16f..99e59a1a 100644
--- a/include/lib.sh
+++ b/include/lib.sh
@@ -15,8 +15,8 @@ remkdir()
mkrom_tarball()
{
- printf "%s\n" "$version" > "$1/.version" || $err "$1 !version"
- printf "%s\n" "$versiondate" > "$1/.versiondate" || $err "$1 !vdate"
+ 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"
@@ -26,15 +26,15 @@ mktarball()
{
printf "Creating tar archive '%s' from directory '%s'\n" "$2" "$1"
[ "${2%/*}" = "$2" ] || x_ mkdir -p "${2%/*}"
- x_ tar -c "$1" | xz -T$XBMK_THREADS -9e > "$2" || $err "mktarball2, $1"
+ x_ tar -c "$1" | xz -T$XBMK_THREADS -9e > "$2" || err "mktarball2, $1"
}
mksha512sum()
{
(
[ "${1%/*}" != "$1" ] && x_ cd "${1%/*}"
- sha512sum ./"${1##*/}" >> "$2" || $err "!sha512sum \"$1\" > \"$2\""
- ) || $err "failed to create tarball checksum"
+ sha512sum ./"${1##*/}" >> "$2" || err "!sha512sum \"$1\" > \"$2\""
+ ) || err "failed to create tarball checksum"
}
rmgit()
@@ -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'"
+ rm -f "$cached" || err "!rm -f '$cached'"
if [ "$_dlop" = "curl" ]; then
curl --location --retry 3 -A "$_ua" "$url" \
-o "$cached" || wget --tries 3 -U "$_ua" "$url" \
@@ -72,11 +72,11 @@ xbmkget()
"$1" "$2" "$3" "$4" "$url" 1>&2 && continue
cp "$url" "$cached" || continue
else
- $err "$1 $2 $3 $4: Unsupported dlop type: '$_dlop'"
+ err "$1 $2 $3 $4: Unsupported dlop type: '$_dlop'"
fi
bad_checksum "$4" "$cached" || dl_fail="n"
done
- [ "$dl_fail" = "y" ] && $err "$1 $2 $3 $4: not downloaded"
+ [ "$dl_fail" = "y" ] && err "$1 $2 $3 $4: not downloaded"
[ "$cached" = "$3" ] || x_ cp "$cached" "$3"; :
}
@@ -99,25 +99,17 @@ e()
mk()
{
- mk_flag="$1" || $err "No argument given"
+ mk_flag="$1" || err "No argument given"
shift 1 && for mk_arg in "$@"; do
x_ ./mk $mk_flag $mk_arg
done; :
}
-check_defconfig()
-{
- [ -d "$1" ] || $err "Target '$1' not defined."
- for x in "$1"/config/*; do
- [ -f "$x" ] && printf "%s\n" "$x" && return 1
- done; :
-}
-
setvars()
{
_setvars=""
if [ $# -lt 2 ]; then
- printf "\$err \"setvars: too few args\\n\""
+ printf "err \"setvars: too few args\\n\""
return 0
fi
val="$1"
@@ -128,13 +120,66 @@ setvars()
printf "%s\n" "${_setvars% }"
}
+setcfg()
+{
+ [ $# -gt 1 ] && printf "e \"%s\" f missing && return %s;\n" "$1" "$2"
+ [ $# -gt 1 ] || \
+ printf "e \"%s\" f not && err \"Missing config\";\n" "$1"
+ printf ". \"%s\" || err \"Could not read config\";\n" "$1"
+}
+
+chkvars()
+{
+ for var in "$@"; do
+ eval "[ -n \"\${$var+x}\" ] || err \"$var unset\""
+ eval "[ -n \"\$$var\" ] || err \"$var unset\""
+ done; :
+}
+
+# return 0 if project is single-tree, otherwise 1
+# e.g. coreboot is multi-tree, so 1
+singletree()
+{
+ ( fx_ "exit 1" find "config/$1/"*/ -type f -name "target.cfg" ) || \
+ return 1
+}
+
+findpath()
+{
+ [ $# -gt 0 ] || err "findpath: No arguments provided"
+ while [ $# -gt 0 ]; do
+ found="`readlink -f "$1" 2>/dev/null`" || return 1; :
+ [ -n "$found" ] || found="`realpath "$1" 2>/dev/null`" || \
+ return 1; :
+ printf "%s\n" "$found"
+ shift 1
+ done
+}
+
+fx_()
+{
+ fd="`mktemp`" && x_ rm -f "$fd" && x_ touch "$fd"
+ xx="$1" && shift 1
+ "$@" 2>/dev/null | sort 1>"$fd" 2>/dev/null || err "FATAL: !sort fx_"
+ dx_ "$xx" "$fd" || break
+ x_ rm -f "$fd"
+}
+
+dx_()
+{
+ [ -f "$2" ] && while read -r fx; do
+ $1 "$fx" || return 1
+ done < "$2"; :
+}
+
x_()
{
- [ $# -lt 1 ] || "$@" || $err "Unhandled error for: $(echo "$@")"; :
+ [ $# -lt 1 ] || [ -n "$1" ] || err "Empty first arg: x_ $(echo "$@")"
+ [ $# -lt 1 ] || "$@" || err "Unhandled error for: $(echo "$@")"; :
}
-err_()
+err()
{
- printf "ERROR %s: %s\n" "$0" "$1" 1>&2
+ [ $# -lt 1 ] || printf "ERROR %s: %s\n" "$0" "$1" 1>&2 || :
exit 1
}
diff --git a/include/mrc.sh b/include/mrc.sh
index 6e00292b..a1dcb140 100644
--- a/include/mrc.sh
+++ b/include/mrc.sh
@@ -8,35 +8,12 @@ eval "`setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board SHELLBALL`"
extract_mrc()
{
- chkvars "MRC_board" "CONFIG_MRC_FILE"
- SHELLBALL="chromeos-firmwareupdate-$MRC_board"
-
- (
- x_ cd "$appdir"
- extract_partition "${MRC_url##*/}"
- extract_archive "$SHELLBALL" .
- ) || $err "mrc download/extract failure"
+ extract_shellball
"$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \
- -f "$_dest" -r RO_SECTION || $err "extract_mrc: !$cbfstool $_dest"
+ -f "$_dest" -r RO_SECTION || err "extract_mrc: !$cbfstool $_dest"
- [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode; :
-}
-
-extract_partition()
-{
- printf "Extracting ROOT-A partition\n"
- ROOTP=$( printf "unit\nB\nprint\nquit\n" | \
- parted "${1%.zip}" 2>/dev/null | grep "ROOT-A" )
-
- 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"
-
- printf "cd /usr/sbin\ndump chromeos-firmwareupdate %s\nquit" \
- "$SHELLBALL" | debugfs "root-a.ext2" || $err "!extract shellball"
+ [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode extra; :
}
extract_refcode()
@@ -44,11 +21,13 @@ extract_refcode()
_refdest="${CONFIG_REFCODE_BLOB_FILE##*../}"
e "$_refdest" f && return 0
+ [ $# -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
chkvars cbfstoolref
- mkdir -p "${_refdest%/*}" || $err "ref: !mkdir -p ${_refdest%/*}"
+ mkdir -p "${_refdest%/*}" || err "ref: !mkdir -p ${_refdest%/*}"
x_ "$cbfstoolref" "$appdir/bios.bin" extract \
-m x86 -n fallback/refcode -f "$_refdest" -r RO_SECTION
@@ -57,3 +36,31 @@ extract_refcode()
[ -z "$MRC_refcode_gbe" ] || x_ dd if="config/ifd/hp820g2/1.bin" \
of="$_refdest" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; :
}
+
+extract_shellball()
+{
+ chkvars "MRC_board" "CONFIG_MRC_FILE"
+ SHELLBALL="chromeos-firmwareupdate-$MRC_board"
+
+ (
+ x_ cd "$appdir"
+ extract_partition "${MRC_url##*/}"
+ extract_archive "$SHELLBALL" .
+ ) || err "mrc download/extract failure"; :
+}
+
+extract_partition()
+{
+ printf "Extracting ROOT-A partition\n"
+ ROOTP=$( printf "unit\nB\nprint\nquit\n" | \
+ parted "${1%.zip}" 2>/dev/null | grep "ROOT-A" )
+
+ 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"
+
+ printf "cd /usr/sbin\ndump chromeos-firmwareupdate %s\nquit" \
+ "$SHELLBALL" | debugfs "root-a.ext2" || err "!extract shellball"
+}
diff --git a/include/rom.sh b/include/rom.sh
index f74912af..fdd0787f 100644
--- a/include/rom.sh
+++ b/include/rom.sh
@@ -7,35 +7,25 @@
grubdata="config/data/grub"
-mkserprog()
+buildser()
{
- [ "$_f" = "-d" ] && return 0 # dry run
- basename -as .h "$serdir/"*.h > "$xbmktmp/ser" || \
- $err "!mk $1 $xbmktmp"
-
- while read -r sertarget; do
- [ "$1" = "pico" ] && x_ cmake -DPICO_BOARD="$sertarget" \
- -DPICO_SDK_PATH="$picosdk" -B "$sersrc/build" "$sersrc" \
- && 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"
- x_ mv "$serx" "bin/serprog_$1/serprog_$sertarget.${serx##*.}"
- done < "$xbmktmp/ser"
-
- [ "$XBMK_RELEASE" = "y" ] && mkrom_tarball "bin/serprog_$1"; :
+ [ "$1" = "pico" ] && x_ cmake -DPICO_BOARD="$2" \
+ -DPICO_SDK_PATH="$picosdk" -B "$sersrc/build" "$sersrc" && \
+ x_ cmake --build "$sersrc/build"
+ [ "$1" = "stm32" ] && x_ make -C "$sersrc" libopencm3-just-make \
+ BOARD=$2 && x_ make -C "$sersrc" BOARD=$2
+ x_ mkdir -p "bin/serprog_$1"
+ x_ mv "$serx" "bin/serprog_$1/serprog_$2.${serx##*.}"
}
copyps1bios()
{
- x_ rm -Rf bin/playstation
- x_ mkdir -p bin/playstation
+ remkdir "bin/playstation"
x_ cp src/pcsx-redux/src/mips/openbios/openbios.bin bin/playstation
printf "MIT License\n\nCopyright (c) 2019-2024 PCSX-Redux authors\n\n" \
- > bin/playstation/COPYING.txt || $err "!pcsx-redux copyright"
- cat config/snippet/mit >>bin/playstation/COPYING.txt || $err "!pcsx MIT"
+ > bin/playstation/COPYING.txt || err "!pcsx-redux copyright"
+ cat config/snippet/mit >>bin/playstation/COPYING.txt || err "!pcsx MIT"
}
mkpayload_grub()
@@ -56,7 +46,7 @@ mkvendorfiles()
[ -z "$mode" ] && $dry cook_coreboot_config
check_coreboot_utils "$tree"
printf "%s\n" "${version%%-*}" > "$srcdir/.coreboot-version" || \
- $err "!mk $srcdir .coreboot-version"
+ err "!mk $srcdir .coreboot-version"
[ -z "$mode" ] && [ "$target" != "$tree" ] && \
x_ ./mk download "$target"; :
}
@@ -65,8 +55,8 @@ cook_coreboot_config()
{
[ -f "$srcdir/.config" ] || return 0
printf "CONFIG_CCACHE=y\n" >> "$srcdir/.config" || \
- $err "$srcdir/.config: Could not enable ccache"
- make -C "$srcdir" oldconfig || $err "Could not cook $srcdir/.config"; :
+ err "$srcdir/.config: Could not enable ccache"
+ make -C "$srcdir" oldconfig || err "Could not cook $srcdir/.config"; :
}
check_coreboot_utils()
@@ -106,7 +96,7 @@ mkcorebootbin()
[ "$payload_uboot_i386" = "y" ] && \
[ "$payload_uboot_amd64" = "y" ] && \
- $err "'$target' enables 32- and 64-bit x86 U-Boot"
+ err "'$target' enables 32- and 64-bit x86 U-Boot"
if [ "$payload_uboot_i386" = "y" ] || \
[ "$payload_uboot_amd64" = "y" ]; then
@@ -119,7 +109,7 @@ mkcorebootbin()
[ "$payload_uboot" = "y" ] || payload_seabios="y"
[ "$payload_grub" = "y" ] && payload_seabios="y"
[ "$payload_seabios" = "y" ] && [ "$payload_uboot" = "y" ] && \
- $dry $err "$target: U-Boot(arm64) and SeaBIOS/GRUB both enabled."
+ $dry err "$target: U-Boot(arm64) and SeaBIOS/GRUB both enabled."
[ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata"
@@ -181,7 +171,7 @@ add_grub()
_grubname="fallback/payload"
cbfs "$tmprom" "$grubelf" "$_grubname"
printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \
- > "$xbmktmp/tmpcfg" || $err "$target: !insert scandisk"
+ > "$xbmktmp/tmpcfg" || err "$target: !insert scandisk"
cbfs "$tmprom" "$xbmktmp/tmpcfg" scan.cfg raw
[ "$initmode" != "normal" ] && [ "$displaymode" != "txtmode" ] && \
cbfs "$tmprom" "$grubdata/background/background1280x800.png" \
@@ -193,9 +183,7 @@ mkseagrub()
[ "$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; :
+ fx_ cprom x_ find "$grubdata/keymap" -type f -name "*.gkb"
}
add_uboot()
@@ -244,16 +232,25 @@ add_uboot()
cprom()
{
- newrom="bin/$target/${pname}_${target}_$initmode.rom"
+ cpcmd="cp"
+
+ tmpnew=""; newrom="bin/$target/${pname}_${target}_$initmode.rom"
[ -n "$displaymode" ] && newrom="${newrom%.rom}_$displaymode.rom"
- [ $# -gt 0 ] && [ "$1" != "seauboot" ] && \
- newrom="${newrom%.rom}_${1%.gkb}.rom"
+ [ $# -gt 0 ] && [ "${1%.gkb}" != "$1" ] && tmpnew="${1##*/}" && \
+ newrom="${newrom%.rom}_${tmpnew%.gkb}.rom"
- x_ mkdir -p "bin/$target"
- x_ cp "$tmprom" "$newrom" && [ $# -gt 0 ] && [ "$1" != "seauboot" ] && \
- cbfs "$newrom" "config/data/grub/keymap/$1" keymap.gkb raw
+ irom="$tmprom"
+ [ $# -lt 1 ] || irom="`mktemp`" || err "!mk irom, $(echo "$@")"
+ [ $# -gt 0 ] && x_ cp "$tmprom" "$irom" && cpcmd="mv"
+
+ [ $# -gt 0 ] && [ "${1%.gkb}" != "$1" ] && \
+ cbfs "$irom" "$grubdata/keymap/$tmpnew" keymap.gkb raw
[ $# -gt 0 ] && [ "$1" = "seauboot" ] && \
- cbfs "$newrom" "config/data/grub/bootorder_uboot" bootorder raw; :
+ cbfs "$irom" "$grubdata/bootorder_uboot" bootorder raw; :
+
+ printf "Creating new %s image: '%s'\n" "$projectname" "$newrom"
+ x_ mkdir -p "bin/$target"
+ x_ $cpcmd "$irom" "$newrom"
}
cbfs()