2023-09-25 01:19:30 +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>
|
|
|
|
# Copyright (c) 2023-2024 Leah Rowe <leah@libreboot.org>
|
2022-11-14 00:51:12 +00:00
|
|
|
|
2023-10-15 10:22:43 +00:00
|
|
|
_ua="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0"
|
|
|
|
_7ztest="a"
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
e6400_unpack="$PWD/src/bios_extract/dell_inspiron_1100_unpacker.py"
|
|
|
|
me7updateparser="$PWD/util/me7_update_parser/me7_update_parser.py"
|
|
|
|
pfs_extract="$PWD/src/biosutilities/Dell_PFS_Extract.py"
|
|
|
|
uefiextract="$PWD/src/uefitool/uefiextract"
|
2024-05-11 04:33:43 +00:00
|
|
|
nvmutil="util/nvmutil/nvm"
|
2024-05-16 02:56:52 +00:00
|
|
|
vendir="vendorfiles"
|
2024-05-26 00:54:36 +00:00
|
|
|
appdir="$vendir/app"
|
2023-10-15 10:22:43 +00:00
|
|
|
|
2024-05-16 02:56:52 +00:00
|
|
|
eval "$(setvars "" _b EC_url_bkup EC_hash DL_hash DL_url_bkup MRC_refcode_gbe \
|
2023-10-15 10:22:43 +00:00
|
|
|
E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \
|
2024-05-26 00:54:36 +00:00
|
|
|
E6400_VGA_romname CONFIG_HAVE_MRC SCH5545EC_DL_url_bkup SCH5545EC_DL_hash \
|
|
|
|
mecleaner kbc1126_ec_dump MRC_refcode_cbtree new_mac _dl SCH5545EC_DL_url \
|
|
|
|
CONFIG_BOARD_DELL_E6400 CONFIG_HAVE_ME_BIN archive EC_url modifygbe rom \
|
|
|
|
CONFIG_ME_BIN_PATH CONFIG_KBC1126_FIRMWARE _dest tree CONFIG_GBE_BIN_PATH \
|
|
|
|
CONFIG_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2 CONFIG_KBC1126_FW2_OFFSET \
|
|
|
|
CONFIG_VGA_BIOS_FILE CONFIG_VGA_BIOS_ID CONFIG_KBC1126_FW1 release DL_url \
|
2024-05-16 02:56:52 +00:00
|
|
|
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW CONFIG_SMSC_SCH5545_EC_FW_FILE nukemode \
|
|
|
|
CONFIG_IFD_BIN_PATH CONFIG_MRC_FILE CONFIG_HAVE_REFCODE_BLOB cbfstoolref \
|
|
|
|
CONFIG_REFCODE_BLOB_FILE)"
|
2023-10-15 10:22:43 +00:00
|
|
|
|
2024-05-11 04:33:43 +00:00
|
|
|
vendor_download()
|
2023-05-14 19:06:03 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
export PATH="$PATH:/sbin"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ $# -gt 0 ] || $err "No argument given"
|
2024-05-26 00:54:36 +00:00
|
|
|
board="$1"
|
|
|
|
boarddir="$cbcfgsdir/$board"
|
2023-12-24 09:04:36 +00:00
|
|
|
_b="${board%%_*mb}" # shorthand (no duplication per rom size)
|
2023-05-14 19:06:03 +00:00
|
|
|
|
2023-09-27 14:01:49 +00:00
|
|
|
detect_firmware && exit 0
|
2024-05-26 00:54:36 +00:00
|
|
|
scan_config "$_b" "config/vendor"
|
2023-05-14 19:06:03 +00:00
|
|
|
|
2024-05-11 04:33:43 +00:00
|
|
|
build_dependencies_download
|
2023-10-06 23:57:55 +00:00
|
|
|
download_vendorfiles
|
2023-05-14 19:06:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
detect_firmware()
|
|
|
|
{
|
2024-05-18 18:28:15 +00:00
|
|
|
[ -d "$boarddir" ] || $err "Target '$board' not defined."
|
2024-05-28 23:48:18 +00:00
|
|
|
check_defconfig "$boarddir" 1>"$tmpdir/vendorcfg.list" && return 0
|
|
|
|
while read -r cbcfgfile; do
|
./vendor download: more fine-tuned error control
By default, the build system does set -u -e
Some errors are unavoidable and have to be handled, so
we have to set +u +e (turn off error handling in sh),
when downloading vendor files, but only certain parts of
vendor.sh trigger errors (which cause an exit).
Replace the current bazooka approach with a more fine
grained approach, turning error handling back on again
when it is safe to do so.
In the parts of the code where it is disabled, the code
is written very, very carefully, with errors still handled
manually, but more careful auditing is required.
This change has been tested and makes the command much
safer to run. In security (or any bug auditing), it is
the principle of least privilege that holds true.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-29 00:49:07 +00:00
|
|
|
set +u +e
|
2024-05-28 23:48:18 +00:00
|
|
|
. "$cbcfgfile" 2>/dev/null
|
./vendor download: more fine-tuned error control
By default, the build system does set -u -e
Some errors are unavoidable and have to be handled, so
we have to set +u +e (turn off error handling in sh),
when downloading vendor files, but only certain parts of
vendor.sh trigger errors (which cause an exit).
Replace the current bazooka approach with a more fine
grained approach, turning error handling back on again
when it is safe to do so.
In the parts of the code where it is disabled, the code
is written very, very carefully, with errors still handled
manually, but more careful auditing is required.
This change has been tested and makes the command much
safer to run. In security (or any bug auditing), it is
the principle of least privilege that holds true.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-29 00:49:07 +00:00
|
|
|
set -u -e
|
2024-05-28 23:48:18 +00:00
|
|
|
done < "$tmpdir/vendorcfg.list"
|
2024-05-26 00:54:36 +00:00
|
|
|
. "$boarddir/target.cfg" 2>/dev/null
|
2024-05-11 04:33:43 +00:00
|
|
|
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ -z "$tree" ] && $err "detect_firmware $boarddir: tree undefined"
|
NEW MAINBOARD: HP EliteBook 820 G2
This is of Broadwell platform, one generation above Haswell.
Of note: this uses HP Sure Start. Although the flash is 16MB,
our CBFS section (and IFD configuration) assumes 12MB flash,
so the final 4MB will be left unflashed on installation,
after blanking the private flash. The coreboot documents have
more information about this.
Some minor design changes in lbmk were made, to accomodate
this port:
Support for extracting refcode binaries added (pulled from
Google recovery images). The refcode file is an ELF that
initialises the MRC and the PCH. It is also responsible for
enabling or disabling the Intel GbE device, where Google
does not enable it, but lbmk modifies it per the instructions
on the coreboot documentation, so as to enable Intel GbE.
Google's recovery image stores the refcode as a stage file,
but coreboot changed the format (for CBFS files) after 4.13
so coreboot 4.13's cbfstool is used to extract refcode. This
realisation made me also change the script logic to use a
cbfstool and ifdtool version matching the coreboot tree, for
all parts of lbmk, whereas lbmk previously used only the
default tree for cbfstool/ifdtool, on insertion and deletion
of vendor files - it was 81dc20e744 that broke extraction of
refcode on google's recovery images, where google used an older
version of cbfstool to insert the files in their coreboot ROMs.
A further backported patch has been added, copying coreboot
revision f22f408956 which is a build fix from Nico Huber.
Iru Cai submitted an ACPI bugfix after the revision lbmk
currently uses, for coreboot/default, and this fix is
needed for rebooting to work on Linux 6.1 or higher. This
patch has been backported to lbmk, while it still uses the
same October 2023 revision of coreboot.
Broadwell MRC is inserted at the same offset as Haswell,
so I didn't need to tweak that.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-01-07 13:25:33 +00:00
|
|
|
cbdir="src/coreboot/$tree"
|
|
|
|
cbfstool="cbutils/$tree/cbfstool"
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
mecleaner="$PWD/$cbdir/util/me_cleaner/me_cleaner.py"
|
|
|
|
kbc1126_ec_dump="$PWD/$cbdir/util/kbc1126/kbc1126_ec_dump"
|
2023-05-14 19:06:03 +00:00
|
|
|
|
2023-09-27 14:01:49 +00:00
|
|
|
for c in CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \
|
|
|
|
CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW; do
|
2024-05-29 02:23:30 +00:00
|
|
|
eval "[ \"\${$c}\" = \"/dev/null\" ] && continue"
|
2024-05-26 00:54:36 +00:00
|
|
|
eval "[ -z \"\${$c}\" ] || return 1"
|
2023-09-27 14:01:49 +00:00
|
|
|
done
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "Vendor files not needed for: %s\n" "$board" 1>&2
|
2023-05-14 19:06:03 +00:00
|
|
|
}
|
|
|
|
|
2024-05-11 04:33:43 +00:00
|
|
|
build_dependencies_download()
|
2023-05-14 19:06:03 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -d "$cbdir" ] || x_ ./update trees -f coreboot ${cbdir##*/}
|
2023-10-12 21:21:02 +00:00
|
|
|
for d in uefitool biosutilities bios_extract; do
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -d "src/$d" ] && continue
|
|
|
|
x_ ./update trees -f "$d"
|
2023-08-21 18:41:49 +00:00
|
|
|
done
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$uefiextract" ] || x_ ./update trees -b uefitool
|
|
|
|
[ ! -d "${kbc1126_ec_dump%/*}" ] || [ -f "$kbc1126_ec_dump" ] || x_ \
|
|
|
|
make -C "$cbdir/util/kbc1126"
|
NEW MAINBOARD: HP EliteBook 820 G2
This is of Broadwell platform, one generation above Haswell.
Of note: this uses HP Sure Start. Although the flash is 16MB,
our CBFS section (and IFD configuration) assumes 12MB flash,
so the final 4MB will be left unflashed on installation,
after blanking the private flash. The coreboot documents have
more information about this.
Some minor design changes in lbmk were made, to accomodate
this port:
Support for extracting refcode binaries added (pulled from
Google recovery images). The refcode file is an ELF that
initialises the MRC and the PCH. It is also responsible for
enabling or disabling the Intel GbE device, where Google
does not enable it, but lbmk modifies it per the instructions
on the coreboot documentation, so as to enable Intel GbE.
Google's recovery image stores the refcode as a stage file,
but coreboot changed the format (for CBFS files) after 4.13
so coreboot 4.13's cbfstool is used to extract refcode. This
realisation made me also change the script logic to use a
cbfstool and ifdtool version matching the coreboot tree, for
all parts of lbmk, whereas lbmk previously used only the
default tree for cbfstool/ifdtool, on insertion and deletion
of vendor files - it was 81dc20e744 that broke extraction of
refcode on google's recovery images, where google used an older
version of cbfstool to insert the files in their coreboot ROMs.
A further backported patch has been added, copying coreboot
revision f22f408956 which is a build fix from Nico Huber.
Iru Cai submitted an ACPI bugfix after the revision lbmk
currently uses, for coreboot/default, and this fix is
needed for rebooting to work on Linux 6.1 or higher. This
patch has been backported to lbmk, while it still uses the
same October 2023 revision of coreboot.
Broadwell MRC is inserted at the same offset as Haswell,
so I didn't need to tweak that.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-01-07 13:25:33 +00:00
|
|
|
[ -n "$MRC_refcode_cbtree" ] && \
|
|
|
|
cbfstoolref="cbutils/$MRC_refcode_cbtree/cbfstool"
|
|
|
|
[ -z "$cbfstoolref" ] || [ -f "$cbfstoolref" ] || \
|
|
|
|
x_ ./update trees -b coreboot utils $MRC_refcode_cbtree
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$cbfstool" ] && [ -f "$ifdtool" ] && return 0
|
NEW MAINBOARD: HP EliteBook 820 G2
This is of Broadwell platform, one generation above Haswell.
Of note: this uses HP Sure Start. Although the flash is 16MB,
our CBFS section (and IFD configuration) assumes 12MB flash,
so the final 4MB will be left unflashed on installation,
after blanking the private flash. The coreboot documents have
more information about this.
Some minor design changes in lbmk were made, to accomodate
this port:
Support for extracting refcode binaries added (pulled from
Google recovery images). The refcode file is an ELF that
initialises the MRC and the PCH. It is also responsible for
enabling or disabling the Intel GbE device, where Google
does not enable it, but lbmk modifies it per the instructions
on the coreboot documentation, so as to enable Intel GbE.
Google's recovery image stores the refcode as a stage file,
but coreboot changed the format (for CBFS files) after 4.13
so coreboot 4.13's cbfstool is used to extract refcode. This
realisation made me also change the script logic to use a
cbfstool and ifdtool version matching the coreboot tree, for
all parts of lbmk, whereas lbmk previously used only the
default tree for cbfstool/ifdtool, on insertion and deletion
of vendor files - it was 81dc20e744 that broke extraction of
refcode on google's recovery images, where google used an older
version of cbfstool to insert the files in their coreboot ROMs.
A further backported patch has been added, copying coreboot
revision f22f408956 which is a build fix from Nico Huber.
Iru Cai submitted an ACPI bugfix after the revision lbmk
currently uses, for coreboot/default, and this fix is
needed for rebooting to work on Linux 6.1 or higher. This
patch has been backported to lbmk, while it still uses the
same October 2023 revision of coreboot.
Broadwell MRC is inserted at the same offset as Haswell,
so I didn't need to tweak that.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-01-07 13:25:33 +00:00
|
|
|
x_ ./update trees -b coreboot utils $tree
|
2023-04-01 10:13:04 +00:00
|
|
|
}
|
|
|
|
|
2023-10-06 23:57:55 +00:00
|
|
|
download_vendorfiles()
|
2023-05-14 19:06:03 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -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"; return 0
|
2022-11-14 00:51:12 +00:00
|
|
|
}
|
|
|
|
|
2023-10-15 09:00:23 +00:00
|
|
|
fetch()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
dl_type="$1"
|
|
|
|
dl="$2"
|
|
|
|
dl_bkup="$3"
|
|
|
|
dlsum="$4"
|
|
|
|
[ "$5" = "/dev/null" ] && return 0
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ "${5# }" = "$5" ] || $err "fetch: space not allowed in _dest: '$5'"
|
|
|
|
[ "${5#/}" = "$5" ] || $err "fetch: absolute path not allowed: '$5'"
|
2023-10-15 09:00:23 +00:00
|
|
|
_dest="${5##*../}"
|
2024-05-26 00:54:36 +00:00
|
|
|
_dl="$vendir/cache/$dlsum"
|
2023-10-15 09:00:23 +00:00
|
|
|
|
|
|
|
x_ mkdir -p "${_dl%/*}"
|
|
|
|
|
2024-01-12 16:08:56 +00:00
|
|
|
dl_fail="y"
|
2024-05-26 00:54:36 +00:00
|
|
|
vendor_checksum "$dlsum" "$_dl" || dl_fail="n"
|
|
|
|
for url in "$dl" "$dl_bkup"; do
|
|
|
|
[ "$dl_fail" = "n" ] && break
|
|
|
|
[ -z "$url" ] && continue
|
|
|
|
x_ rm -f "$_dl"
|
2023-12-22 13:05:32 +00:00
|
|
|
curl --location --retry 3 -A "$_ua" "$url" -o "$_dl" || \
|
|
|
|
wget --tries 3 -U "$_ua" "$url" -O "$_dl" || continue
|
2024-05-26 00:54:36 +00:00
|
|
|
vendor_checksum "$dlsum" "$_dl" || dl_fail="n"
|
2023-10-15 09:00:23 +00:00
|
|
|
done
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$dl_fail" = "y" ] && \
|
|
|
|
$err "fetch $dlsum: matched file unavailable"
|
2023-10-15 09:00:23 +00:00
|
|
|
|
|
|
|
x_ rm -Rf "${_dl}_extracted"
|
2024-05-26 00:54:36 +00:00
|
|
|
mkdirs "$_dest" "extract_$dl_type" || return 0
|
|
|
|
eval "extract_$dl_type"
|
./vendor download: more fine-tuned error control
By default, the build system does set -u -e
Some errors are unavoidable and have to be handled, so
we have to set +u +e (turn off error handling in sh),
when downloading vendor files, but only certain parts of
vendor.sh trigger errors (which cause an exit).
Replace the current bazooka approach with a more fine
grained approach, turning error handling back on again
when it is safe to do so.
In the parts of the code where it is disabled, the code
is written very, very carefully, with errors still handled
manually, but more careful auditing is required.
This change has been tested and makes the command much
safer to run. In security (or any bug auditing), it is
the principle of least privilege that holds true.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-29 00:49:07 +00:00
|
|
|
set -u -e
|
2023-10-15 09:00:23 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$_dest" ] && return 0
|
|
|
|
$err "extract_$dl_type (fetch): missing file: '$_dest'"
|
2023-10-15 09:00:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vendor_checksum()
|
|
|
|
{
|
2023-12-22 13:05:32 +00:00
|
|
|
[ "$(sha512sum "$2" | awk '{print $1}')" != "$1" ] || return 1
|
|
|
|
printf "Bad checksum for file: %s\n" "$2" 1>&2
|
|
|
|
rm -f "$2" || :
|
2023-10-15 09:00:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mkdirs()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
e "$1" f && return 1
|
|
|
|
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
mkdir -p "${1%/*}" || $err "mkdirs: !mkdir -p ${1%/*}"
|
2024-05-26 00:54:36 +00:00
|
|
|
remkdir "$appdir"
|
|
|
|
extract_archive "$_dl" "$appdir" || \
|
|
|
|
[ "$2" = "extract_e6400vga" ] || \
|
|
|
|
$err "mkdirs $1 $2: !extract"
|
2023-10-15 09:00:23 +00:00
|
|
|
}
|
|
|
|
|
2023-09-28 00:21:58 +00:00
|
|
|
extract_intel_me()
|
2023-05-14 19:06:03 +00:00
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
e "$mecleaner" f not && $err "$cbdir: me_cleaner missing"
|
|
|
|
|
|
|
|
_me="$PWD/$_dest" # must always be an absolute path
|
|
|
|
cdir="$PWD/$appdir" # must always be an absolute path
|
|
|
|
[ $# -gt 0 ] && _me="${1}" && cdir="$2"
|
NEW MAINBOARD: HP EliteBook 820 G2
This is of Broadwell platform, one generation above Haswell.
Of note: this uses HP Sure Start. Although the flash is 16MB,
our CBFS section (and IFD configuration) assumes 12MB flash,
so the final 4MB will be left unflashed on installation,
after blanking the private flash. The coreboot documents have
more information about this.
Some minor design changes in lbmk were made, to accomodate
this port:
Support for extracting refcode binaries added (pulled from
Google recovery images). The refcode file is an ELF that
initialises the MRC and the PCH. It is also responsible for
enabling or disabling the Intel GbE device, where Google
does not enable it, but lbmk modifies it per the instructions
on the coreboot documentation, so as to enable Intel GbE.
Google's recovery image stores the refcode as a stage file,
but coreboot changed the format (for CBFS files) after 4.13
so coreboot 4.13's cbfstool is used to extract refcode. This
realisation made me also change the script logic to use a
cbfstool and ifdtool version matching the coreboot tree, for
all parts of lbmk, whereas lbmk previously used only the
default tree for cbfstool/ifdtool, on insertion and deletion
of vendor files - it was 81dc20e744 that broke extraction of
refcode on google's recovery images, where google used an older
version of cbfstool to insert the files in their coreboot ROMs.
A further backported patch has been added, copying coreboot
revision f22f408956 which is a build fix from Nico Huber.
Iru Cai submitted an ACPI bugfix after the revision lbmk
currently uses, for coreboot/default, and this fix is
needed for rebooting to work on Linux 6.1 or higher. This
patch has been backported to lbmk, while it still uses the
same October 2023 revision of coreboot.
Broadwell MRC is inserted at the same offset as Haswell,
so I didn't need to tweak that.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-01-07 13:25:33 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
e "$_me" f && return 0
|
2023-04-01 12:47:01 +00:00
|
|
|
|
2023-04-14 00:36:54 +00:00
|
|
|
sdir="$(mktemp -d)"
|
2024-05-11 04:33:43 +00:00
|
|
|
[ -z "$sdir" ] && return 0
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
mkdir -p "$sdir" || $err "extract_intel_me: !mkdir -p \"$sdir\""
|
./vendor download: more fine-tuned error control
By default, the build system does set -u -e
Some errors are unavoidable and have to be handled, so
we have to set +u +e (turn off error handling in sh),
when downloading vendor files, but only certain parts of
vendor.sh trigger errors (which cause an exit).
Replace the current bazooka approach with a more fine
grained approach, turning error handling back on again
when it is safe to do so.
In the parts of the code where it is disabled, the code
is written very, very carefully, with errors still handled
manually, but more careful auditing is required.
This change has been tested and makes the command much
safer to run. In security (or any bug auditing), it is
the principle of least privilege that holds true.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-29 00:49:07 +00:00
|
|
|
|
|
|
|
set +u +e
|
2023-04-01 16:59:09 +00:00
|
|
|
(
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}"
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
cd "$cdir" || $err "extract_intel_me: !cd \"$cdir\""
|
2023-04-01 16:59:09 +00:00
|
|
|
for i in *; do
|
2023-12-24 09:04:36 +00:00
|
|
|
[ -f "$_me" ] && break
|
|
|
|
[ -L "$i" ] && continue
|
|
|
|
if [ -f "$i" ]; then
|
2024-05-26 00:54:36 +00:00
|
|
|
"$mecleaner" -r -t -O "$sdir/vendorfile" \
|
2023-12-24 09:04:36 +00:00
|
|
|
-M "$_me" "$i" && break
|
|
|
|
"$mecleaner" -r -t -O "$_me" "$i" && break
|
|
|
|
"$me7updateparser" -O "$_me" "$i" && break
|
2023-04-01 16:59:09 +00:00
|
|
|
_7ztest="${_7ztest}a"
|
2023-12-24 09:04:36 +00:00
|
|
|
extract_archive "$i" "$_7ztest" || continue
|
2024-05-26 00:54:36 +00:00
|
|
|
extract_intel_me "$_me" "$cdir/$_7ztest"
|
2023-04-01 16:59:09 +00:00
|
|
|
elif [ -d "$i" ]; then
|
2024-05-26 00:54:36 +00:00
|
|
|
extract_intel_me "$_me" "$cdir/$i"
|
2023-04-01 16:59:09 +00:00
|
|
|
else
|
2023-07-29 06:28:36 +00:00
|
|
|
continue
|
2023-04-01 16:59:09 +00:00
|
|
|
fi
|
2024-05-26 00:54:36 +00:00
|
|
|
cdir="$1"
|
2023-12-24 09:04:36 +00:00
|
|
|
[ "${cdir#/a}" != "$cdir" ] && cdir="${cdir#/}"
|
2024-05-26 00:54:36 +00:00
|
|
|
cd "$cdir" || :
|
2023-04-01 16:59:09 +00:00
|
|
|
done
|
|
|
|
)
|
2024-05-26 00:54:36 +00:00
|
|
|
rm -Rf "$sdir" || $err "extract_intel_me: !rm -Rf $sdir"
|
2022-11-14 00:51:12 +00:00
|
|
|
}
|
|
|
|
|
2023-10-15 09:00:23 +00:00
|
|
|
extract_archive()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
innoextract "$1" -d "$2" || python "$pfs_extract" "$1" -e || 7z x \
|
|
|
|
"$1" -o"$2" || unar "$1" -o "$2" || unzip "$1" -d "$2" || return 1
|
2023-10-15 09:00:23 +00:00
|
|
|
}
|
|
|
|
|
2023-09-28 00:21:58 +00:00
|
|
|
extract_kbc1126ec()
|
2023-05-14 19:06:03 +00:00
|
|
|
{
|
NEW MAINBOARD: HP EliteBook 820 G2
This is of Broadwell platform, one generation above Haswell.
Of note: this uses HP Sure Start. Although the flash is 16MB,
our CBFS section (and IFD configuration) assumes 12MB flash,
so the final 4MB will be left unflashed on installation,
after blanking the private flash. The coreboot documents have
more information about this.
Some minor design changes in lbmk were made, to accomodate
this port:
Support for extracting refcode binaries added (pulled from
Google recovery images). The refcode file is an ELF that
initialises the MRC and the PCH. It is also responsible for
enabling or disabling the Intel GbE device, where Google
does not enable it, but lbmk modifies it per the instructions
on the coreboot documentation, so as to enable Intel GbE.
Google's recovery image stores the refcode as a stage file,
but coreboot changed the format (for CBFS files) after 4.13
so coreboot 4.13's cbfstool is used to extract refcode. This
realisation made me also change the script logic to use a
cbfstool and ifdtool version matching the coreboot tree, for
all parts of lbmk, whereas lbmk previously used only the
default tree for cbfstool/ifdtool, on insertion and deletion
of vendor files - it was 81dc20e744 that broke extraction of
refcode on google's recovery images, where google used an older
version of cbfstool to insert the files in their coreboot ROMs.
A further backported patch has been added, copying coreboot
revision f22f408956 which is a build fix from Nico Huber.
Iru Cai submitted an ACPI bugfix after the revision lbmk
currently uses, for coreboot/default, and this fix is
needed for rebooting to work on Linux 6.1 or higher. This
patch has been backported to lbmk, while it still uses the
same October 2023 revision of coreboot.
Broadwell MRC is inserted at the same offset as Haswell,
so I didn't need to tweak that.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-01-07 13:25:33 +00:00
|
|
|
[ ! -f "$kbc1126_ec_dump" ] && \
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
$err "extract_kbc1126ec $cbdir: kbc1126_ec_dump missing"
|
2023-04-02 00:33:33 +00:00
|
|
|
(
|
2024-05-26 00:54:36 +00:00
|
|
|
x_ cd "$appdir/"
|
much, much stricter, more verbose error handling
lbmk is much more likely to crash now, in error conditions,
which is a boon for further auditing.
also: in "fetch", remove the downloaded program
if fail() was called.
this would also be done for gnulib, when downloading
grub, but done in such a way that gnulib goes first.
where calls to err write "ERROR" in the string, they
no longer say "ERROR" because the "err" function itself
now does that automatically.
also: listmodes/listoptions (in "lbmk") now reports an
error if no scripts and/or directories are found.
also: where a warning is given, but not an error, i've
gone through in some places and redirected the output
to stderr, not stdout
as part of error checks: running anything as root, except
for the "./build dependencies *" commands, is no longer
permitted and lbmk will throw an error
mrc downloads: debugfs output no longer redirected to /dev/null,
and stderr no longer redirected to stdout. everything is verbose.
certain non-error states are also more verbose. for example,
patch_rom in blobs/inject will now state when injection succeeds
certain actual errors(bugs) were fixed:
for example, build/release/roms now correctly prepares the blobs
hash files for a given target, containing only the files and
checksums in the list. Previously, a printf message was included.
Now, with this new code: blobutil/inject rightly verifies hashes.
doing all of this in one giant patch is cleaner
than 100 patches changing each file. even this is yet part
of a much larger audit going on in the Libreboot project.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-24 19:19:41 +00:00
|
|
|
mv Rompaq/68*.BIN ec.bin || :
|
2023-04-22 01:04:37 +00:00
|
|
|
if [ ! -f ec.bin ]; then
|
2023-09-28 02:21:42 +00:00
|
|
|
unar -D ROM.CAB Rom.bin || unar -D Rom.CAB Rom.bin || \
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
unar -D 68*.CAB Rom.bin || $err "can't extract Rom.bin"
|
2023-10-01 05:33:43 +00:00
|
|
|
x_ mv Rom.bin ec.bin
|
2023-04-22 01:04:37 +00:00
|
|
|
fi
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f ec.bin ] || $err "extract_kbc1126_ec $board: can't extract"
|
|
|
|
"$kbc1126_ec_dump" ec.bin || $err "!1126ec $board extract ecfw"
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
) || $err "can't extract kbc1126 ec firmware"
|
2024-05-26 00:54:36 +00:00
|
|
|
|
|
|
|
e "$appdir/ec.bin.fw1" f not && $err "$board: kbc1126ec fetch failed"
|
|
|
|
e "$appdir/ec.bin.fw2" f not && $err "$board: kbc1126ec fetch failed"
|
|
|
|
|
|
|
|
cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || $err "!cp 1126ec $_dest"
|
2023-05-06 20:21:42 +00:00
|
|
|
}
|
|
|
|
|
2023-05-14 19:06:03 +00:00
|
|
|
extract_e6400vga()
|
|
|
|
{
|
./vendor download: more fine-tuned error control
By default, the build system does set -u -e
Some errors are unavoidable and have to be handled, so
we have to set +u +e (turn off error handling in sh),
when downloading vendor files, but only certain parts of
vendor.sh trigger errors (which cause an exit).
Replace the current bazooka approach with a more fine
grained approach, turning error handling back on again
when it is safe to do so.
In the parts of the code where it is disabled, the code
is written very, very carefully, with errors still handled
manually, but more careful auditing is required.
This change has been tested and makes the command much
safer to run. In security (or any bug auditing), it is
the principle of least privilege that holds true.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-05-29 00:49:07 +00:00
|
|
|
set +u +e
|
2023-12-22 13:05:32 +00:00
|
|
|
for v in E6400_VGA_offset E6400_VGA_romname; do
|
2024-05-26 00:54:36 +00:00
|
|
|
eval "[ -z \"\$$v\" ] && $err \"e6400vga: $v undefined\""
|
2023-12-22 13:05:32 +00:00
|
|
|
done
|
|
|
|
tail -c +$E6400_VGA_offset "$_dl" | gunzip > "$appdir/bios.bin" || :
|
2023-05-06 20:21:42 +00:00
|
|
|
(
|
2024-05-26 00:54:36 +00:00
|
|
|
x_ cd "$appdir"
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
[ -f "bios.bin" ] || $err "extract_e6400vga: can't extract bios.bin"
|
2024-05-26 00:54:36 +00:00
|
|
|
"$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n"
|
|
|
|
[ -f "$E6400_VGA_romname" ] || \
|
safer, simpler error handling in lbmk
in shell scripts, a function named the same as a program included in
the $PATH will override that program. for example, you could make a
function called ls() and this would override the standand "ls".
in lbmk, a part of it was first trying to run the "fail" command,
deferring to "err", because some scripts call fail() which does
some minor cleanup before calling err.
in most cases, fail() is not defined, and it's possible that the user
could have a program called "fail" in their $PATH, the behaviour of
which we could not determine, and it could have disastrous effects.
lbmk error handling has been re-engineered in such a way that the
err function is defined in a variable, which defaults to err_ which
calls err_, so defined under include/err.sh.
in functions that require cleanup prior to error handling, a fail()
function is still defined, and err is overridden, thus:
err="fail"
this change has made xx_() obsolete, so now only x_ is used. the x_
function is a wrapper that can be used to run a command and exit with
non-zero status (from lbmk) if the command fails. the xx_ command
did the same thing, but called fail() which would have called err();
now everything is $err
example:
rm -f "$filename" || err "could not delete file"
this would now be:
rm -f "$filename" || $err "could not delete file"
overriding of err= must be done *after* including err.sh. for
example:
err="fail"
. "include/err.sh"
^ this is wrong. instead, one must do:
. "include/err.sh"
err="fail"
this is because err is set as a global variable under err.sh
the new error handling is much cleaner, and safer. it also reduces
the chance of mistakes such as: calling err when you meant to
call fail. this is because the standard way is now to call $err,
so you set err="fail" at the top of the script and all is well.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2024-03-27 01:19:39 +00:00
|
|
|
$err "extract_e6400vga: can't extract vga rom from bios.bin"
|
|
|
|
) || $err "can't extract e6400 vga rom"
|
2024-05-26 00:54:36 +00:00
|
|
|
cp "$appdir/$E6400_VGA_romname" "$_dest" || \
|
|
|
|
$err "extract_e6400vga $board: can't copy vga rom to $_dest"
|
2023-05-06 20:21:42 +00:00
|
|
|
}
|
|
|
|
|
NEW BOARD: Dell Precision T1650
Very nice ivybridge board that supports ECC RAM.
NOTE: I couldn't get onboard graphics working yet, but
this was confirmed working with a graphics card (in my
case nvidia quadra k420) booted in text mode on the SeaBIOS
payload. The GRUB payload also works, when loaded from SeaBIOS.
Therefore, this is a SeaBIOS-only board (as far as first payload
is concerned), but you can pick GRUB from the menu.
You could make it "GRUB-only" in practise by setting SeaBIOS
boot order to only load GRUB, and disable the SeaBIOS menu.
We refer to this as "SeaGRUB".
I've made lbmk use biosutilities and uefiextract, to
get at the SMSC SCH5545 Environmental Control (EC) firmware.
This firmware is needed for fan control. This is automatically
downloaded and extracted, from Dell UEFI firmware updates.
As with other blobs such as Intel ME, this firmware is then
scrubbed by the release build scripts. The blobutil "inject"
script can be used to re-insert it.
Of note: there is no fixed offset, but no other blobs to
be inserted in CBFS either, so the offset when re-inserting
on release ROMs should still be the same, and thus the ROM
checksums should match, when running blobutil inject.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-11 13:50:17 +00:00
|
|
|
extract_sch5545ec()
|
|
|
|
{
|
|
|
|
# full system ROM (UEFI), to extract with UEFIExtract:
|
2024-05-26 00:54:36 +00:00
|
|
|
_bios="${_dl}_extracted/Firmware/1 $dlsum -- 1 System BIOS vA.28.bin"
|
NEW BOARD: Dell Precision T1650
Very nice ivybridge board that supports ECC RAM.
NOTE: I couldn't get onboard graphics working yet, but
this was confirmed working with a graphics card (in my
case nvidia quadra k420) booted in text mode on the SeaBIOS
payload. The GRUB payload also works, when loaded from SeaBIOS.
Therefore, this is a SeaBIOS-only board (as far as first payload
is concerned), but you can pick GRUB from the menu.
You could make it "GRUB-only" in practise by setting SeaBIOS
boot order to only load GRUB, and disable the SeaBIOS menu.
We refer to this as "SeaGRUB".
I've made lbmk use biosutilities and uefiextract, to
get at the SMSC SCH5545 Environmental Control (EC) firmware.
This firmware is needed for fan control. This is automatically
downloaded and extracted, from Dell UEFI firmware updates.
As with other blobs such as Intel ME, this firmware is then
scrubbed by the release build scripts. The blobutil "inject"
script can be used to re-insert it.
Of note: there is no fixed offset, but no other blobs to
be inserted in CBFS either, so the offset when re-inserting
on release ROMs should still be the same, and thus the ROM
checksums should match, when running blobutil inject.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-11 13:50:17 +00:00
|
|
|
# this is the SCH5545 firmware, inside of the extracted UEFI ROM:
|
2024-05-26 00:54:36 +00:00
|
|
|
_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!
|
|
|
|
|
|
|
|
"$uefiextract" "$_bios" || $err "sch5545 !extract"
|
|
|
|
cp "$_sch5545ec_fw" "$_dest" || $err "$_dest: !sch5545 copy"
|
NEW BOARD: Dell Precision T1650
Very nice ivybridge board that supports ECC RAM.
NOTE: I couldn't get onboard graphics working yet, but
this was confirmed working with a graphics card (in my
case nvidia quadra k420) booted in text mode on the SeaBIOS
payload. The GRUB payload also works, when loaded from SeaBIOS.
Therefore, this is a SeaBIOS-only board (as far as first payload
is concerned), but you can pick GRUB from the menu.
You could make it "GRUB-only" in practise by setting SeaBIOS
boot order to only load GRUB, and disable the SeaBIOS menu.
We refer to this as "SeaGRUB".
I've made lbmk use biosutilities and uefiextract, to
get at the SMSC SCH5545 Environmental Control (EC) firmware.
This firmware is needed for fan control. This is automatically
downloaded and extracted, from Dell UEFI firmware updates.
As with other blobs such as Intel ME, this firmware is then
scrubbed by the release build scripts. The blobutil "inject"
script can be used to re-insert it.
Of note: there is no fixed offset, but no other blobs to
be inserted in CBFS either, so the offset when re-inserting
on release ROMs should still be the same, and thus the ROM
checksums should match, when running blobutil inject.
Signed-off-by: Leah Rowe <leah@libreboot.org>
2023-08-11 13:50:17 +00:00
|
|
|
}
|
|
|
|
|
2024-05-11 04:33:43 +00:00
|
|
|
vendor_inject()
|
|
|
|
{
|
|
|
|
set +u +e
|
|
|
|
|
|
|
|
[ $# -lt 1 ] && $err "No options specified."
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$1" = "listboards" ] && eval "items config/coreboot || :; exit 0"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
archive="$1"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
|
|
|
while getopts n:r:b:m: option; do
|
2024-05-26 00:54:36 +00:00
|
|
|
case "$option" in
|
|
|
|
n) nukemode="$OPTARG" ;;
|
|
|
|
r) rom="$OPTARG" ;;
|
|
|
|
b) board="$OPTARG" ;;
|
|
|
|
m) modifygbe="true"
|
|
|
|
new_mac="$OPTARG" ;;
|
2024-05-11 04:33:43 +00:00
|
|
|
*) : ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
check_board
|
|
|
|
build_dependencies_inject
|
|
|
|
inject_vendorfiles
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$nukemode" = "nuke" ] && return 0
|
2024-05-11 04:33:43 +00:00
|
|
|
printf "Friendly reminder (this is *not* an error message):\n"
|
|
|
|
printf "Please ensure that the files were inserted correctly.\n"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_board()
|
|
|
|
{
|
|
|
|
failcheck="n"
|
2024-05-26 00:54:36 +00:00
|
|
|
check_release "$archive" || failcheck="y"
|
|
|
|
if [ "$failcheck" = "y" ]; then
|
2024-05-11 04:33:43 +00:00
|
|
|
[ -f "$rom" ] || $err "check_board \"$rom\": invalid path"
|
|
|
|
[ -z "${rom+x}" ] && $err "check_board: no rom specified"
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -n "${board+x}" ] || board="$(detect_board "$rom")"
|
2024-05-11 04:33:43 +00:00
|
|
|
else
|
|
|
|
release="y"
|
2024-05-26 00:54:36 +00:00
|
|
|
board="$(detect_board "$archive")"
|
2024-05-11 04:33:43 +00:00
|
|
|
fi
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
boarddir="$cbcfgsdir/$board"
|
2024-05-11 04:33:43 +00:00
|
|
|
[ -d "$boarddir" ] || $err "check_board: board $board missing"
|
|
|
|
[ -f "$boarddir/target.cfg" ] || \
|
|
|
|
$err "check_board $board: target.cfg missing"
|
|
|
|
. "$boarddir/target.cfg" 2>/dev/null
|
|
|
|
[ -z "$tree" ] && $err "check_board $board: tree undefined"; return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
check_release()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -f "$archive" ] || return 1
|
2024-05-11 04:33:43 +00:00
|
|
|
[ "${archive##*.}" = "xz" ] || return 1
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "%s\n" "Release archive $archive detected"
|
2024-05-11 04:33:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# This function tries to determine the board from the filename of the rom.
|
|
|
|
# It will only succeed if the filename is not changed from the build/download
|
|
|
|
detect_board()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
path="$1"
|
|
|
|
filename="$(basename "$path")"
|
|
|
|
case "$filename" in
|
2024-05-11 04:33:43 +00:00
|
|
|
grub_*)
|
2024-05-26 00:54:36 +00:00
|
|
|
board="$(echo "$filename" | cut -d '_' -f2-3)" ;;
|
2024-05-11 04:33:43 +00:00
|
|
|
seabios_withgrub_*)
|
2024-05-26 00:54:36 +00:00
|
|
|
board="$(echo "$filename" | cut -d '_' -f3-4)" ;;
|
2024-05-11 04:33:43 +00:00
|
|
|
*.tar.xz)
|
2024-05-26 00:54:36 +00:00
|
|
|
_stripped_prefix="${filename#*_}"
|
2024-05-11 04:33:43 +00:00
|
|
|
board="${_stripped_prefix%.tar.xz}" ;;
|
|
|
|
*)
|
|
|
|
$err "detect_board $filename: could not detect board type"
|
|
|
|
esac
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "%s\n" "$board"
|
2024-05-11 04:33:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
build_dependencies_inject()
|
|
|
|
{
|
|
|
|
cbdir="src/coreboot/$tree"
|
|
|
|
cbfstool="cbutils/$tree/cbfstool"
|
|
|
|
ifdtool="cbutils/$tree/ifdtool"
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -d "$cbdir" ] || x_ ./update trees -f coreboot $tree
|
|
|
|
if [ ! -f "$cbfstool" ] || [ ! -f "$ifdtool" ]; then
|
2024-05-11 04:33:43 +00:00
|
|
|
x_ ./update trees -b coreboot utils $tree
|
|
|
|
fi
|
|
|
|
[ -z "$new_mac" ] || [ -f "$nvmutil" ] || x_ make -C util/nvmutil
|
|
|
|
[ "$nukemode" = "nuke" ] || x_ ./vendor download $board; return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
inject_vendorfiles()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$release" != "y" ] && eval "patch_rom \"$rom\"; return 0"
|
2024-05-11 04:33:43 +00:00
|
|
|
patch_release_roms
|
|
|
|
}
|
|
|
|
|
|
|
|
patch_release_roms()
|
|
|
|
{
|
|
|
|
_tmpdir="tmp/romdir"
|
2024-05-26 00:54:36 +00:00
|
|
|
remkdir "$_tmpdir"
|
|
|
|
tar -xf "$archive" -C "$_tmpdir" || \
|
2024-05-11 04:33:43 +00:00
|
|
|
$err "patch_release_roms: !tar -xf \"$archive\" -C \"$_tmpdir\""
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
for x in "$_tmpdir"/bin/*/*.rom ; do
|
2024-05-11 04:33:43 +00:00
|
|
|
printf "patching rom: %s\n" "$x"
|
2024-05-26 00:54:36 +00:00
|
|
|
patch_rom "$x"
|
2024-05-11 04:33:43 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
(
|
2024-05-26 00:54:36 +00:00
|
|
|
cd "$_tmpdir/bin/"* || \
|
|
|
|
$err "patch_release_roms: !cd $_tmpdir/bin/*"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
|
|
|
# NOTE: For compatibility with older rom releases, defer to sha1
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$nukemode" = "nuke" ] || sha512sum --status -c vendorhashes || \
|
2024-05-11 04:33:43 +00:00
|
|
|
sha1sum --status -c vendorhashes || sha512sum --status -c \
|
|
|
|
blobhashes || sha1sum --status -c blobhashes || \
|
|
|
|
$err "patch_release_roms: ROMs did not match expected hashes"
|
|
|
|
) || $err "can't verify vendor hashes"
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$modifygbe" = "true" ] && \
|
|
|
|
for x in "$_tmpdir"/bin/*/*.rom ; do
|
|
|
|
modify_gbe "$x"
|
2024-05-11 04:33:43 +00:00
|
|
|
done
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -d "bin/release" ] || x_ mkdir -p bin/release
|
|
|
|
x_ mv "$_tmpdir"/bin/* bin/release/
|
|
|
|
x_ rm -Rf "$_tmpdir"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
|
|
|
printf "Success! Your ROMs are in bin/release\n"
|
|
|
|
}
|
|
|
|
|
|
|
|
patch_rom()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
rom="$1"
|
|
|
|
|
|
|
|
. "$(check_defconfig "$boarddir")" 2>/dev/null || exit 0
|
|
|
|
|
|
|
|
[ "$CONFIG_HAVE_MRC" = "y" ] && inject "mrc.bin" "$CONFIG_MRC_FILE" \
|
|
|
|
"mrc" "0xfffa0000"
|
|
|
|
[ -n "$CONFIG_HAVE_REFCODE_BLOB" ] && inject "fallback/refcode" \
|
|
|
|
"$CONFIG_REFCODE_BLOB_FILE" "stage"
|
|
|
|
[ "$CONFIG_HAVE_ME_BIN" = "y" ] && inject "IFD" "$CONFIG_ME_BIN_PATH" \
|
|
|
|
"me"
|
|
|
|
[ "$CONFIG_KBC1126_FIRMWARE" = "y" ] && inject "ecfw1.bin" \
|
|
|
|
"$CONFIG_KBC1126_FW1" "raw" "$CONFIG_KBC1126_FW1_OFFSET" && \
|
2024-05-11 04:33:43 +00:00
|
|
|
inject "ecfw2.bin" "$CONFIG_KBC1126_FW2" "raw" \
|
2024-05-26 00:54:36 +00:00
|
|
|
"$CONFIG_KBC1126_FW2_OFFSET"
|
2024-05-11 04:33:43 +00:00
|
|
|
[ -n "$CONFIG_VGA_BIOS_FILE" ] && [ -n "$CONFIG_VGA_BIOS_ID" ] && \
|
2024-05-26 00:54:36 +00:00
|
|
|
inject "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" ] && \
|
2024-05-11 04:33:43 +00:00
|
|
|
inject "sch5545_ecfw.bin" "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw
|
2024-05-26 00:54:36 +00:00
|
|
|
[ "$modifygbe" = "true" ] && ! [ "$release" = "y" ] && \
|
|
|
|
inject "IFD" "$CONFIG_GBE_BIN_PATH" "GbE"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "ROM image successfully patched: %s\n" "$rom"
|
2024-05-11 04:33:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inject()
|
|
|
|
{
|
2024-05-26 00:54:36 +00:00
|
|
|
[ $# -lt 3 ] && $err "$@, $rom: usage: inject name path type (offset)"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
|
|
|
eval "$(setvars "" cbfsname _dest _t _offset)"
|
2024-05-26 00:54:36 +00:00
|
|
|
cbfsname="$1"
|
2024-05-11 04:33:43 +00:00
|
|
|
_dest="${2##*../}"
|
2024-05-26 00:54:36 +00:00
|
|
|
_t="$3"
|
|
|
|
[ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \
|
2024-05-11 04:33:43 +00:00
|
|
|
$err "inject $@, $rom: offset passed, but empty (not defined)"
|
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
[ -z "$_dest" ] && $err "inject $@, $rom: empty destination path"
|
|
|
|
[ ! -f "$_dest" ] && [ "$nukemode" != "nuke" ] && \
|
|
|
|
$err "inject_$dl_type: file missing, $_dest"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
|
|
|
[ "$nukemode" = "nuke" ] || \
|
2024-05-26 00:54:36 +00:00
|
|
|
printf "Inserting %s/%s into: %s\n" "$cbfsname" "$_t" "$rom"
|
2024-05-11 04:33:43 +00:00
|
|
|
|
2024-05-26 00:54:36 +00:00
|
|
|
if [ "$_t" = "GbE" ]; then
|
2024-05-11 04:33:43 +00:00
|
|
|
x_ mkdir -p tmp
|
2024-05-26 00:54:36 +00:00
|
|
|
cp "$_dest" "tmp/gbe.bin" || \
|
|
|
|
$err "inject: !cp \"$_dest\" \"tmp/gbe.bin\""
|
2024-05-11 04:33:43 +00:00
|
|
|
_dest="tmp/gbe.bin"
|
2024-05-26 00:54:36 +00:00
|
|
|
"$nvmutil" "$_dest" setmac "$new_mac" || \
|
|
|
|
$err "inject $_dest: can't change mac address"
|
2024-05-11 04:33:43 +00:00
|
|
|
fi
|
2024-05-26 00:54:36 +00:00
|
|
|
if [ "$cbfsname" = "IFD" ]; then
|
|
|
|
if [ "$nukemode" != "nuke" ]; then
|
|
|
|
"$ifdtool" -i $_t:$_dest "$rom" -O "$rom" || \
|
2024-05-11 04:33:43 +00:00
|
|
|
$err "inject: can't insert $_t ($dest) into $rom"
|
|
|
|
else
|
|
|
|
"$ifdtool" --nuke $_t "$rom" -O "$rom" || \
|
|
|
|
$err "inject $rom: can't nuke $_t in IFD"
|
|
|
|
fi
|
|
|
|
else
|
2024-05-26 00:54:36 +00:00
|
|
|
if [ "$nukemode" != "nuke" ]; then
|
2024-05-11 04:33:43 +00:00
|
|
|
if [ "$_t" = "stage" ]; then # broadwell refcode
|
|
|
|
"$cbfstool" "$rom" add-stage -f "$_dest" \
|
|
|
|
-n "$cbfsname" -t stage -c lzma
|
|
|
|
else
|
|
|
|
"$cbfstool" "$rom" add -f "$_dest" \
|
|
|
|
-n "$cbfsname" -t $_t $_offset || \
|
|
|
|
$err "$rom: can't insert $_t file $_dest"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
"$cbfstool" "$rom" remove -n "$cbfsname" || \
|
|
|
|
$err "inject $rom: can't remove $cbfsname"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|