2023-09-30 00:31:40 +00:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
2024-05-26 00:54:36 +00:00
|
|
|
# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
|
|
|
|
# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
2025-01-02 18:33:55 +00:00
|
|
|
# Copyright (c) 2020-2025 Leah Rowe <leah@libreboot.org>
|
2023-08-27 13:14:49 +00:00
|
|
|
|
2024-05-06 21:54:55 +00:00
|
|
|
export LC_COLLATE=C
|
|
|
|
export LC_ALL=C
|
|
|
|
|
2024-06-08 00:55:15 +00:00
|
|
|
_ua="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0"
|
|
|
|
|
2024-06-06 20:45:53 +00:00
|
|
|
ifdtool="elf/ifdtool/default/ifdtool"
|
|
|
|
cbfstool="elf/cbfstool/default/cbfstool"
|
2024-12-31 14:44:31 +00:00
|
|
|
rmodtool="elf/cbfstool/default/rmodtool"
|
2024-05-26 00:54:36 +00:00
|
|
|
tmpgit="$PWD/tmp/gitclone"
|
make GRUB multi-tree and re-add xhci patches
Re-add xHCI only on haswell and broadwell machines, where
they are needed. Otherwise, keep the same GRUB code.
The xHCI patches were removed because they caused issues
on Sandybridge-based Dell Latitude laptops. See:
https://codeberg.org/libreboot/lbmk/issues/216
The issue was not reported elsewhere, including on the
Haswell/Broadwell hardware where they are needed, but the
build system could only build one version of GRUB.
The older machines do not need xHCI patches, because they
either do not have xHCI patches, or work (in GRUB) because
they're in EHCI mode when running the payload.
So, the problem is that we need the xHCI patches for GRUB
on Haswell/Broadwell hardware, but the patches break
Sandybridge hardware, and we only had the one build of GRUB.
To mitigate this problem, the build system now supports
building multiple revisions of GRUB, with different patches,
and each given coreboot target can say which GRUB tree to use
by setting this in target.cfg:
grubtree="xhci"
In the above example, the "xhci" tree would be used. Some
generic GRUB config has been moved to config/data/grub/
and config/grub/ now looks like config/coreboot/ - also,
the grub.cfg file (named "payload" in each tree) is copied
to the GRUB source tree as ".config", then added to GRUB's
memdisk in the same way, as grub.cfg.
Several other design changes had to be made because of this:
* grub.cfg in memdisk no longer automatically jumps to one
in CBFS, but now shows a menuentry for it if available
* Certain commands in script/trees are disabled for GRUB,
such as *config make commands.
* gnulib is now defined in config/submodule/grub/, instead
of config/git/grub - and this mitigates an existing bug
where downloading gnulib first would make grub no longer
possible to download in lbmk.
The coreboot option CONFIG_FINALIZE_USB_ROUTE_XHCI has been
re-enabled on: Dell OptiPlex 9020 MT, Dell OptiPlex 9020 SFF,
Lenovo ThinkPad T440p and Lenovo ThinkPad W541 - now USB should
work again in GRUB.
The GRUB payload has been re-enabled on HP EliteBook 820 G2.
This change will enable per-board GRUB optimisation in the
future. For example, we hardcode what partitions and LVMs
GRUB scans because * is slow on ICH7-based machines, due
to GRUB's design. On other machines, * is reasonably fast,
for automatically enumerating the list of devices for boot.
Use of * (and other wildcards) could enable our GRUB payload
to automatically boot more distros, with minimal fuss. This
can be done at a later date, in subsequent revisions.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-06-01 22:01:30 +00:00
|
|
|
grubdata="config/data/grub"
|
2024-05-06 21:54:55 +00:00
|
|
|
err="err_"
|
|
|
|
|
|
|
|
err_()
|
|
|
|
{
|
2024-06-28 12:41:22 +00:00
|
|
|
printf "ERROR %s: %s\n" "$0" "$1" 1>&2; exit 1
|
2024-05-06 21:54:55 +00:00
|
|
|
}
|
2023-10-15 10:22:43 +00:00
|
|
|
|
2024-05-06 21:54:55 +00:00
|
|
|
setvars()
|
|
|
|
{
|
2024-06-24 23:22:42 +00:00
|
|
|
_setvars="" && [ $# -lt 2 ] && $err "setvars: too few arguments"
|
2025-01-02 23:52:45 +00:00
|
|
|
val="$1" && shift 1 && for var in "$@"; do
|
2024-05-26 00:54:36 +00:00
|
|
|
_setvars="$var=\"$val\"; $_setvars"
|
2024-06-24 23:22:42 +00:00
|
|
|
done; printf "%s\n" "${_setvars% }"
|
2024-05-06 21:54:55 +00:00
|
|
|
}
|
2024-06-14 12:36:31 +00:00
|
|
|
chkvars()
|
|
|
|
{
|
2025-01-02 23:52:45 +00:00
|
|
|
for var in "$@"; do
|
2025-01-03 16:00:11 +00:00
|
|
|
eval "[ -n \"\${$var+x}\" ] || \$err \"$var unset\""
|
2025-01-03 14:34:42 +00:00
|
|
|
eval "[ -n \"\$$var\" ] || \$err \"$var unset\""
|
2024-06-28 12:40:50 +00:00
|
|
|
done; return 0
|
2024-06-14 12:36:31 +00:00
|
|
|
}
|
2024-06-05 10:07:53 +00:00
|
|
|
|
2025-01-02 23:52:45 +00:00
|
|
|
eval "`setvars "" _nogit board reinstall versiondate projectsite projectname \
|
|
|
|
aur_notice configdir datadir version relname xbmk_parent`"
|
2024-06-05 10:07:53 +00:00
|
|
|
|
2024-06-24 23:18:12 +00:00
|
|
|
for fv in projectname projectsite version versiondate; do
|
2025-01-02 23:52:45 +00:00
|
|
|
eval "[ ! -f \"$fv\" ] || read -r $fv < \"$fv\" || :"
|
2024-06-28 12:42:19 +00:00
|
|
|
done; chkvars projectname projectsite
|
2024-06-05 10:07:53 +00:00
|
|
|
|
2024-06-23 11:34:26 +00:00
|
|
|
setcfg()
|
|
|
|
{
|
2024-06-27 01:52:46 +00:00
|
|
|
[ $# -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"
|
2024-06-23 11:34:26 +00:00
|
|
|
printf ". \"%s\" || %s \"Could not read config\";\n" "$1" "$err"
|
|
|
|
}
|
|
|
|
|
|
|
|
e()
|
|
|
|
{
|
2024-06-27 02:41:30 +00:00
|
|
|
es_t="e" && [ $# -gt 1 ] && es_t="$2"
|
2024-06-23 11:34:26 +00:00
|
|
|
es2="already exists"
|
|
|
|
estr="[ -$es_t \"\$1\" ] || return 1"
|
|
|
|
[ $# -gt 2 ] && estr="[ -$es_t \"\$1\" ] && return 1" && es2="missing"
|
|
|
|
|
2024-07-26 14:24:00 +00:00
|
|
|
eval "$estr"; printf "%s %s\n" "$1" "$es2" 1>&2
|
2024-06-23 11:34:26 +00:00
|
|
|
}
|
|
|
|
|
2024-06-05 10:07:53 +00:00
|
|
|
install_packages()
|
|
|
|
{
|
2024-06-22 02:55:04 +00:00
|
|
|
[ $# -lt 2 ] && $err "fewer than two arguments"
|
lib.sh dependencies: support --reinstall argument
./mk dependencies debian --reinstall
Add --reinstall and it'll do:
apt-get install --reinstall
This can be useful when updating from a stable release
to a testing release. The variable, "reinstall" can be
configured for other distros, but it's currently only
configured for Debian-based distros.
Also, it can be anything. For example, you could add -y;
however, a 4th argument will not be accepted. For example,
you cannot do:
./mk dependencies debian --reinstall -y
If you do this, it'll only see --reinstall; similarly, if
you did this command:
./mk dependencies debian -y --reinstall
then -y would be passed, but not --reinstall. This is an
intentional design decision, in case you accidentally pasted
or subshelled something that outputted something undesirable,
to prevent possible abuse.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-12-30 21:53:55 +00:00
|
|
|
[ $# -gt 2 ] && reinstall="$3"
|
|
|
|
|
2025-01-02 23:52:45 +00:00
|
|
|
eval "`setcfg "config/dependencies/$2"`"
|
2024-06-05 10:07:53 +00:00
|
|
|
|
2025-01-02 23:52:45 +00:00
|
|
|
chkvars pkg_add pkglist
|
2024-06-05 10:07:53 +00:00
|
|
|
$pkg_add $pkglist || $err "Cannot install packages"
|
|
|
|
|
|
|
|
[ -n "$aur_notice" ] && \
|
2025-01-02 23:52:45 +00:00
|
|
|
printf "You need AUR packages: %s\n" "$aur_notice" 1>&2; :
|
2024-06-05 10:07:53 +00:00
|
|
|
}
|
2024-12-24 12:37:33 +00:00
|
|
|
if [ $# -gt 0 ] && [ "$1" = "dependencies" ]; then
|
2024-12-30 00:50:53 +00:00
|
|
|
install_packages "$@" || exit 1
|
2024-12-24 12:37:33 +00:00
|
|
|
exit 0
|
|
|
|
fi
|
2024-06-04 12:53:08 +00:00
|
|
|
|
2025-01-03 20:53:05 +00:00
|
|
|
pyver="2"
|
|
|
|
python="python3"
|
|
|
|
command -v python3 1>/dev/null || python="python"
|
|
|
|
command -v $python 1>/dev/null || pyver=""
|
2025-01-06 03:54:38 +00:00
|
|
|
[ -z "$pyver" ] || \
|
|
|
|
python -c 'import sys; print(sys.version_info[:])' 1>/dev/null \
|
|
|
|
2>/dev/null || $err "Cannot determine which Python version."
|
|
|
|
[ -n "$pyver" ] && \
|
|
|
|
pyver="`python -c 'import sys; print(sys.version_info[:])' | \
|
|
|
|
awk '{print $1}'`" && \
|
|
|
|
pyver="${pyver#(}" && pyver="${pyver%,}"
|
2025-01-03 20:53:05 +00:00
|
|
|
if [ "${pyver%%.*}" != "3" ]; then
|
|
|
|
printf "Wrong python version, or python missing. Must be v 3.x.\n" 1>&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2024-06-05 10:26:08 +00:00
|
|
|
id -u 1>/dev/null 2>/dev/null || $err "suid check failed (id -u)"
|
2024-06-05 10:11:01 +00:00
|
|
|
[ "$(id -u)" != "0" ] || $err "this command as root is not permitted"
|
|
|
|
|
2024-12-30 21:25:55 +00:00
|
|
|
# XBMK_CACHE is a directory, for caching downloads and git repositories
|
|
|
|
[ -z "${XBMK_CACHE+x}" ] && export XBMK_CACHE="$PWD/cache"
|
|
|
|
[ -z "$XBMK_CACHE" ] && export XBMK_CACHE="$PWD/cache"
|
|
|
|
[ -L "$XBMK_CACHE" ] && [ "$XBMK_CACHE" = "$PWD/cache" ] && \
|
|
|
|
$err "cachedir is default, $PWD/cache, but it exists and is a symlink"
|
|
|
|
[ -L "$XBMK_CACHE" ] && export XBMK_CACHE="$PWD/cache"
|
|
|
|
[ -f "$XBMK_CACHE" ] && $err "cachedir '$XBMK_CACHE' exists but it's a file"
|
|
|
|
|
|
|
|
# unify all temporary files/directories in a single TMPDIR
|
2024-06-27 02:18:23 +00:00
|
|
|
[ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || unset TMPDIR
|
|
|
|
[ -n "${TMPDIR+x}" ] && export TMPDIR="$TMPDIR"
|
|
|
|
if [ -z "${TMPDIR+x}" ]; then
|
2024-06-24 23:20:06 +00:00
|
|
|
[ -f "lock" ] && $err "$PWD/lock exists. Is a build running?"
|
2024-05-06 21:54:55 +00:00
|
|
|
export TMPDIR="/tmp"
|
2024-06-27 02:18:23 +00:00
|
|
|
export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)"
|
2024-06-09 14:37:13 +00:00
|
|
|
touch lock || $err "cannot create 'lock' file"
|
set up python in PATH, ensuring that it is python3
we already check the python version, and set a variable
for it, so that we can reliably use python3, even if
python in PATH doesn't correspond to python3. for
example if a system has python as python2 and python3
as python3
well, we use that when running deguard for example, but
various upstream projects that we use may need python,
and all of them use python3, not 2
so, re-use the python variable set up by lbmk, and
set it up in PATH accordingly. this now makes the note
about python3 obsolete, on docs/build.md in lbwww.git
Signed-off-by: Leah Rowe <leah@libreboot.org>
2025-01-05 21:48:45 +00:00
|
|
|
rm -Rf "$XBMK_CACHE/xbmkpath" "$XBMK_CACHE/gnupath" || \
|
|
|
|
$err "cannot remove xbmkpath"
|
|
|
|
mkdir -p "$XBMK_CACHE/gnupath" "$XBMK_CACHE/xbmkpath" || \
|
|
|
|
$err "cannot create gnupath"
|
|
|
|
export PATH="$XBMK_CACHE/xbmkpath:$XBMK_CACHE/gnupath:$PATH" || \
|
|
|
|
$err "Can't create gnupath/xbmkpath"
|
|
|
|
(
|
|
|
|
# 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"
|
|
|
|
ln -s "`command -v "$python"`" python || \
|
|
|
|
$err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"
|
|
|
|
) || $err "Can't set up python symlink in $XBMK_CACHE/xbmkpath"
|
2024-06-27 02:18:23 +00:00
|
|
|
xbmk_parent="y"
|
2024-05-06 21:54:55 +00:00
|
|
|
fi
|
2023-10-15 10:22:43 +00:00
|
|
|
|
2024-06-09 14:37:13 +00:00
|
|
|
# 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)
|
2024-06-24 23:12:18 +00:00
|
|
|
[ -z "${XBMK_RELEASE+x}" ] && export XBMK_RELEASE="n"
|
|
|
|
[ "$XBMK_RELEASE" = "y" ] || export XBMK_RELEASE="n"
|
2024-06-09 14:37:13 +00:00
|
|
|
|
2024-06-24 23:12:18 +00:00
|
|
|
[ -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 # user gave a non-integer
|
2024-04-28 16:31:16 +00:00
|
|
|
|
2024-05-15 02:01:25 +00:00
|
|
|
x_() {
|
2024-12-30 00:50:53 +00:00
|
|
|
[ $# -lt 1 ] || "$@" || \
|
2024-08-11 20:19:04 +00:00
|
|
|
$err "Unhandled non-zero exit: $(echo "$@")"; return 0
|
2024-05-15 02:01:25 +00:00
|
|
|
}
|
|
|
|
|
2024-05-25 13:37:40 +00:00
|
|
|
[ -e ".git" ] || [ -f "version" ] || printf "unknown\n" > version || \
|
2024-05-24 13:53:45 +00:00
|
|
|
$err "Cannot generate unknown version file"
|
2024-06-28 12:44:13 +00:00
|
|
|
[ -e ".git" ] || [ -f "versiondate" ] || printf "1716415872\n" > versiondate \
|
|
|
|
|| $err "Cannot generate unknown versiondate file"
|
2024-05-24 13:53:45 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
version_="$version"
|
2024-05-15 02:01:25 +00:00
|
|
|
[ ! -e ".git" ] || version="$(git describe --tags HEAD 2>&1)" || \
|
2024-05-26 00:54:36 +00:00
|
|
|
version="git-$(git rev-parse HEAD 2>&1)" || version="$version_"
|
|
|
|
versiondate_="$versiondate"
|
2024-05-15 02:01:25 +00:00
|
|
|
[ ! -e ".git" ] || versiondate="$(git show --no-patch --no-notes \
|
2024-05-26 00:54:36 +00:00
|
|
|
--pretty='%ct' HEAD)" || versiondate="$versiondate_"
|
2024-06-02 22:34:10 +00:00
|
|
|
for p in projectname version versiondate projectsite; do
|
2024-07-26 14:24:00 +00:00
|
|
|
chkvars "$p"; eval "x_ printf \"%s\\n\" \"\$$p\" > $p"
|
2024-05-15 02:01:25 +00:00
|
|
|
done
|
2024-05-26 00:54:36 +00:00
|
|
|
relname="$projectname-$version"
|
|
|
|
export LOCALVERSION="-$projectname-${version%%-*}"
|
2024-05-15 02:01:25 +00:00
|
|
|
|
2023-10-15 10:22:43 +00:00
|
|
|
check_defconfig()
|
|
|
|
{
|
2024-05-18 18:51:40 +00:00
|
|
|
[ -d "$1" ] || $err "Target '$1' not defined."
|
2024-05-26 00:54:36 +00:00
|
|
|
for x in "$1"/config/*; do
|
|
|
|
[ -f "$x" ] && printf "%s\n" "$x" && return 1
|
2024-06-27 13:06:08 +00:00
|
|
|
done; return 0
|
2023-10-15 10:22:43 +00:00
|
|
|
}
|
|
|
|
|
2023-12-22 09:46:43 +00:00
|
|
|
remkdir()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
rm -Rf "$1" || $err "remkdir: !rm -Rf \"$1\""
|
|
|
|
mkdir -p "$1" || $err "remkdir: !mkdir -p \"$1\""
|
2023-12-22 09:46:43 +00:00
|
|
|
}
|
2024-05-06 21:54:55 +00:00
|
|
|
|
2024-05-19 05:45:38 +00:00
|
|
|
mkrom_tarball()
|
2024-05-14 22:17:22 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "%s\n" "$version" > "$1/version" || $err "$1 !version"
|
|
|
|
printf "%s\n" "$versiondate" > "$1/versiondate" || $err "$1 !vdate"
|
|
|
|
printf "%s\n" "$projectname" > "$1/projectname" || $err "$1 !pname"
|
2024-05-14 23:45:01 +00:00
|
|
|
|
2024-07-26 14:24:00 +00:00
|
|
|
mktarball "$1" "${1%/*}/${relname}_${1##*/}.tar.xz"; x_ rm -Rf "$1"; :
|
2024-05-14 22:17:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mktarball()
|
|
|
|
{
|
2025-01-02 23:58:37 +00:00
|
|
|
if [ "${2%/*}" != "$2" ]; then
|
2024-05-14 22:17:22 +00:00
|
|
|
mkdir -p "${2%/*}" || $err "mk, !mkdir -p \"${2%/*}\""
|
2025-01-02 23:58:37 +00:00
|
|
|
fi
|
2024-06-24 23:12:18 +00:00
|
|
|
tar -c "$1" | xz -T$XBMK_THREADS -9e > "$2" || $err "mktarball 2, $1"
|
2024-05-14 23:37:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mksha512sum()
|
|
|
|
{
|
2024-05-14 22:17:22 +00:00
|
|
|
(
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "${1%/*}" != "$1" ] && x_ cd "${1%/*}"
|
2024-06-20 00:15:06 +00:00
|
|
|
sha512sum ./"${1##*/}" >> "$2" || $err "!sha512sum \"$1\" > \"$2\""
|
2024-05-14 22:17:22 +00:00
|
|
|
) || $err "failed to create tarball checksum"
|
|
|
|
}
|
git.sh: Remove .git if XBMK_RELEASE=y
The build system already deletes .git in all source
directories for each given release, but does so at
the very end; it still does, but now it is deleted
one by one per project, to save space during very
large builds (release sizes vary wildly, depending
on how many trees exist for coreboot basically).
If you're building entirely in tmpfs (as I do), this
could be a problem if you have lots of .git/ directories.
This change reduces disk usage, or in the above example,
memory usage when running the build system from tmpfs.
This complements another recent change, where ROM images
are compressed per target during release builds, rather
than all at the very end of the process. It is part of a
series of optimisations, to reduce the memory and disk
usage of the build system, and to reduce I/O wastage
in general.
This change will not be the last of such changes!
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-18 03:53:31 +00:00
|
|
|
|
|
|
|
rmgit()
|
|
|
|
{
|
|
|
|
(
|
|
|
|
cd "$1" || $err "!cd gitrepo $1"
|
|
|
|
find . -name ".git" -exec rm -Rf {} + || $err "!rm .git $1"
|
|
|
|
find . -name ".gitmodules" -exec rm -Rf {} + || $err "!rm .gitmod $1"
|
|
|
|
) || $err "Cannot remove .git/.gitmodules in $1"
|
|
|
|
}
|
2024-05-26 00:54:36 +00:00
|
|
|
|
2024-06-06 00:01:22 +00:00
|
|
|
# return 0 if project is single-tree, otherwise 1
|
|
|
|
# e.g. coreboot is multi-tree, so 1
|
|
|
|
singletree()
|
|
|
|
{
|
2024-06-07 11:50:16 +00:00
|
|
|
for targetfile in "config/${1}/"*/target.cfg; do
|
2024-07-26 14:24:00 +00:00
|
|
|
[ -e "$targetfile" ] && [ -f "$targetfile" ] && return 1; :
|
2024-06-27 13:06:41 +00:00
|
|
|
done; return 0
|
2024-06-06 00:01:22 +00:00
|
|
|
}
|
2024-06-08 00:55:15 +00:00
|
|
|
|
vendor.sh: Handle FSP insertion post-release
The Libreboot 20241206 release provided FSP pre-assembled
and inserted into the ROM images; the only file inserted
by vendor.sh was the Intel ME.
Direct distribution of an unmodified FSP image is permitted
by Intel, provided that the license notice is given among
other requirements. Due to how coreboot works, it must split
up the FSP into subcomponents, and adjust certain pointers
within the -M component (for raminit).
Such build-time modifications are perfectly fine in a coreboot
context, where it is expected that you are building from source.
The end result is simply what you use.
In a distribution such as Libreboot, where we provide pre-built
images, this becomes problematic. It's a technicality of the
license, and it seems that Intel themselves probably intended
for Libreboot to use the FSP this way anyway, since it is they
who seem to be the author of SplitFspBin.py, which is the
utility that coreboot uses for splitting up the FSP image.
Due to the technicality of the licensing, the FSP shall now
be scrubbed from releases, and re-inserted.
Coreboot was inserting the -S component with LZ4 compression,
which is bad news for ./mk inject beacuse the act of compression
is currently not reproducible. Therefore, coreboot has been
modified not to compress this section, and the inject command
doesn't compress it either. This means that the S file is using
about 180KB in flash, instead of about 140KB. This is totally OK.
The _fsp targets are retained, but set to release=n, because these
targets *still* don't scrub fsp.bin; if released, they would
include fsp files, so they've been set to release=n. These can
be used on older Libreboot release archives, for compatibility.
The new ROM images released for the affected machines are:
t480_vfsp_16mb
t480s_vfsp_16mb
dell3050micro_vfsp_16mb
Note the use of _vfsp instead of _fsp. These images are released,
unlike _fsp, and they lack fspm/fsps in the image. FSP S/M must
be inserted using ./mk inject.
This has been tested and confirmed to boot just fine.
The 20241206 images will be re-compiled and re-uploaded with this
and other recent changes, to make Libreboot 20241206 rev8.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-12-26 17:11:10 +00:00
|
|
|
# can grab from the internet, or copy locally.
|
|
|
|
# if copying locally, it can only copy a file.
|
2024-06-08 00:55:15 +00:00
|
|
|
download()
|
|
|
|
{
|
vendor.sh: Handle FSP insertion post-release
The Libreboot 20241206 release provided FSP pre-assembled
and inserted into the ROM images; the only file inserted
by vendor.sh was the Intel ME.
Direct distribution of an unmodified FSP image is permitted
by Intel, provided that the license notice is given among
other requirements. Due to how coreboot works, it must split
up the FSP into subcomponents, and adjust certain pointers
within the -M component (for raminit).
Such build-time modifications are perfectly fine in a coreboot
context, where it is expected that you are building from source.
The end result is simply what you use.
In a distribution such as Libreboot, where we provide pre-built
images, this becomes problematic. It's a technicality of the
license, and it seems that Intel themselves probably intended
for Libreboot to use the FSP this way anyway, since it is they
who seem to be the author of SplitFspBin.py, which is the
utility that coreboot uses for splitting up the FSP image.
Due to the technicality of the licensing, the FSP shall now
be scrubbed from releases, and re-inserted.
Coreboot was inserting the -S component with LZ4 compression,
which is bad news for ./mk inject beacuse the act of compression
is currently not reproducible. Therefore, coreboot has been
modified not to compress this section, and the inject command
doesn't compress it either. This means that the S file is using
about 180KB in flash, instead of about 140KB. This is totally OK.
The _fsp targets are retained, but set to release=n, because these
targets *still* don't scrub fsp.bin; if released, they would
include fsp files, so they've been set to release=n. These can
be used on older Libreboot release archives, for compatibility.
The new ROM images released for the affected machines are:
t480_vfsp_16mb
t480s_vfsp_16mb
dell3050micro_vfsp_16mb
Note the use of _vfsp instead of _fsp. These images are released,
unlike _fsp, and they lack fspm/fsps in the image. FSP S/M must
be inserted using ./mk inject.
This has been tested and confirmed to boot just fine.
The 20241206 images will be re-compiled and re-uploaded with this
and other recent changes, to make Libreboot 20241206 rev8.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-12-26 17:11:10 +00:00
|
|
|
_dlop="curl" && [ $# -gt 4 ] && _dlop="$5"
|
2024-07-18 23:31:57 +00:00
|
|
|
cached="$XBMK_CACHE/file/$4"
|
2024-07-17 17:15:52 +00:00
|
|
|
dl_fail="n" # 1 url, 2 url backup, 3 destination, 4 checksum
|
|
|
|
vendor_checksum "$4" "$cached" 2>/dev/null && dl_fail="y"
|
2024-06-08 00:55:15 +00:00
|
|
|
[ "$dl_fail" = "n" ] && e "$3" f && return 0
|
2024-07-18 23:31:57 +00:00
|
|
|
mkdir -p "${3%/*}" "$XBMK_CACHE/file" || \
|
|
|
|
$err "!mkdir '$3' '$XBMK_CACHE/file'"
|
|
|
|
for url in "$1" "$2"; do
|
2024-06-08 00:55:15 +00:00
|
|
|
[ "$dl_fail" = "n" ] && break
|
2024-06-09 09:58:19 +00:00
|
|
|
[ -z "$url" ] && continue
|
2024-07-18 23:31:57 +00:00
|
|
|
rm -f "$cached" || $err "!rm -f '$cached'"
|
vendor.sh: Handle FSP insertion post-release
The Libreboot 20241206 release provided FSP pre-assembled
and inserted into the ROM images; the only file inserted
by vendor.sh was the Intel ME.
Direct distribution of an unmodified FSP image is permitted
by Intel, provided that the license notice is given among
other requirements. Due to how coreboot works, it must split
up the FSP into subcomponents, and adjust certain pointers
within the -M component (for raminit).
Such build-time modifications are perfectly fine in a coreboot
context, where it is expected that you are building from source.
The end result is simply what you use.
In a distribution such as Libreboot, where we provide pre-built
images, this becomes problematic. It's a technicality of the
license, and it seems that Intel themselves probably intended
for Libreboot to use the FSP this way anyway, since it is they
who seem to be the author of SplitFspBin.py, which is the
utility that coreboot uses for splitting up the FSP image.
Due to the technicality of the licensing, the FSP shall now
be scrubbed from releases, and re-inserted.
Coreboot was inserting the -S component with LZ4 compression,
which is bad news for ./mk inject beacuse the act of compression
is currently not reproducible. Therefore, coreboot has been
modified not to compress this section, and the inject command
doesn't compress it either. This means that the S file is using
about 180KB in flash, instead of about 140KB. This is totally OK.
The _fsp targets are retained, but set to release=n, because these
targets *still* don't scrub fsp.bin; if released, they would
include fsp files, so they've been set to release=n. These can
be used on older Libreboot release archives, for compatibility.
The new ROM images released for the affected machines are:
t480_vfsp_16mb
t480s_vfsp_16mb
dell3050micro_vfsp_16mb
Note the use of _vfsp instead of _fsp. These images are released,
unlike _fsp, and they lack fspm/fsps in the image. FSP S/M must
be inserted using ./mk inject.
This has been tested and confirmed to boot just fine.
The 20241206 images will be re-compiled and re-uploaded with this
and other recent changes, to make Libreboot 20241206 rev8.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-12-26 17:11:10 +00:00
|
|
|
if [ "$_dlop" = "curl" ]; then
|
|
|
|
curl --location --retry 3 -A "$_ua" "$url" \
|
|
|
|
-o "$cached" || wget --tries 3 -U "$_ua" "$url" \
|
|
|
|
-O "$cached" || continue
|
|
|
|
elif [ "$_dlop" = "copy" ]; then
|
|
|
|
[ -L "$url" ] && \
|
|
|
|
printf "dl %s %s %s %s: '%s' is a symlink\n" \
|
|
|
|
"$1" "$2" "$3" "$4" "$url" 1>&2 && continue
|
|
|
|
[ ! -f "$url" ] && \
|
|
|
|
printf "dl %s %s %s %s: '%s' not a file\n" \
|
|
|
|
"$1" "$2" "$3" "$4" "$url" 1>&2 && continue
|
|
|
|
cp "$url" "$cached" || continue
|
|
|
|
else
|
|
|
|
$err "$1 $2 $3 $4: Unsupported dlop type: '$_dlop'"
|
|
|
|
fi
|
2024-07-17 17:15:52 +00:00
|
|
|
vendor_checksum "$4" "$cached" || dl_fail="n"
|
|
|
|
done; [ "$dl_fail" = "y" ] && $err "$1 $2 $3 $4: not downloaded"
|
|
|
|
[ "$cached" = "$3" ] || cp "$cached" "$3" || $err "!d cp $cached $3"; :
|
2024-06-08 00:55:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vendor_checksum()
|
|
|
|
{
|
|
|
|
[ "$(sha512sum "$2" | awk '{print $1}')" != "$1" ] || return 1
|
2024-07-26 14:24:00 +00:00
|
|
|
printf "Bad checksum for file: %s\n" "$2" 1>&2; rm -f "$2" || :; :
|
2024-06-08 00:55:15 +00:00
|
|
|
}
|
2024-06-15 19:22:19 +00:00
|
|
|
|
|
|
|
cbfs()
|
|
|
|
{
|
2024-11-03 02:41:41 +00:00
|
|
|
fRom="$1" # image to operate on
|
|
|
|
fAdd="$2" # file to add
|
|
|
|
fName="$3" # filename when added in CBFS
|
|
|
|
|
2024-11-18 22:33:26 +00:00
|
|
|
ccmd="add-payload" && [ $# -gt 3 ] && [ $# -lt 5 ] && ccmd="add"
|
2024-11-03 02:41:41 +00:00
|
|
|
lzma="-c lzma" && [ $# -gt 3 ] && [ $# -lt 5 ] && lzma="-t $4"
|
|
|
|
|
|
|
|
# hack. TODO: do it better. this whole function is cursed
|
|
|
|
if [ $# -gt 4 ]; then
|
|
|
|
# add flat binary for U-Boot (u-boot.bin) on x86
|
|
|
|
if [ "$5" = "0x1110000" ]; then
|
|
|
|
ccmd="add-flat-binary"
|
|
|
|
lzma="-c lzma -l 0x1110000 -e 0x1110000"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
"$cbfstool" "$fRom" $ccmd -f "$fAdd" -n "$fName" $lzma || \
|
|
|
|
$err "CBFS fail: $fRom $ccmd -f '$fAdd' -n '$fName' $lzma"; :
|
2024-06-15 19:22:19 +00:00
|
|
|
}
|
lib.sh: new function mk() to handle trees in bulk
single-tree projects cannot be handled in bulk, e.g.
./mk -f project1 project2 project3
that is still the case, from the shell, but internally
it is now possible:
mk -f project1 project2 project3
mk() is a function that simply handles the given flag,
and all projects specified.
it does not handle cases without argument, for example
you cannot do:
mk -f
arguments must be provided. it can be used internally,
to simplify cases where multiple single-tree projects
must be handled, but *also* allows multi-tree projects
to be specified, without being able to actually handle
trees within that multi-tree project; so for example,
you can only specify coreboot, and then it would run
on every coreboot tree.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-07-28 12:30:25 +00:00
|
|
|
|
|
|
|
mk()
|
|
|
|
{
|
|
|
|
mk_flag="$1" || $err "No argument given"
|
2025-01-02 23:52:45 +00:00
|
|
|
shift 1 && for mk_arg in "$@"; do
|
lib.sh: new function mk() to handle trees in bulk
single-tree projects cannot be handled in bulk, e.g.
./mk -f project1 project2 project3
that is still the case, from the shell, but internally
it is now possible:
mk -f project1 project2 project3
mk() is a function that simply handles the given flag,
and all projects specified.
it does not handle cases without argument, for example
you cannot do:
mk -f
arguments must be provided. it can be used internally,
to simplify cases where multiple single-tree projects
must be handled, but *also* allows multi-tree projects
to be specified, without being able to actually handle
trees within that multi-tree project; so for example,
you can only specify coreboot, and then it would run
on every coreboot tree.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-07-28 12:30:25 +00:00
|
|
|
./mk $mk_flag $mk_arg || $err "./mk $mk_flag $mk_arg"; :
|
|
|
|
done; :
|
|
|
|
}
|