mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-16 03:25:25 +02:00
quackboot (same idea as klompboot), from audit6
this is based directly on the audit6 final revision. same idea as klompboot. remove u-boot and arm support, remove pico-serprog, remove support for making release archives, and basically see how small the build system can possible get. quackboot *beats* the very first klompboot, at 790 lines, because klompboot 1 was just over 800 lines. klompboot 2 was 701 lines. vendor file logic is about 200 sloc so the next klompboot will be about 600 lines. this is the very first quackboot. Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+25
-200
@@ -7,21 +7,19 @@ e6400_unpack="$PWD/src/bios_extract/dell_inspiron_1100_unpacker.py"
|
||||
me7updateparser="$PWD/util/me7_update_parser/me7_update_parser.py"
|
||||
pfs_extract="$PWD/src/biosutilities/Dell_PFS_Extract.py"
|
||||
uefiextract="$PWD/elf/uefitool/uefiextract"
|
||||
vendir="vendorfiles"
|
||||
appdir="$vendir/app"
|
||||
appdir="vendorfiles/app"
|
||||
cbcfgsdir="config/coreboot"
|
||||
|
||||
eval `setvars "" EC_url_bkup EC_hash DL_hash DL_url_bkup MRC_refcode_gbe vcfg \
|
||||
E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \
|
||||
E6400_VGA_romname 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 boarddir rom \
|
||||
mecleaner kbc1126_ec_dump MRC_refcode_cbtree _dl SCH5545EC_DL_url _7ztest \
|
||||
CONFIG_BOARD_DELL_E6400 CONFIG_HAVE_ME_BIN EC_url CONFIG_REFCODE_BLOB_FILE \
|
||||
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_KBC1126_FW1_OFFSET CONFIG_KBC1126_FW2 CONFIG_KBC1126_FW2_OFFSET rom \
|
||||
CONFIG_VGA_BIOS_FILE CONFIG_VGA_BIOS_ID CONFIG_KBC1126_FW1 cbdir DL_url \
|
||||
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 vrelease verify _7ztest`
|
||||
CONFIG_INCLUDE_SMSC_SCH5545_EC_FW CONFIG_SMSC_SCH5545_EC_FW_FILE boarddir \
|
||||
CONFIG_IFD_BIN_PATH CONFIG_MRC_FILE CONFIG_HAVE_REFCODE_BLOB cbfstoolref`
|
||||
|
||||
vendor_download()
|
||||
{
|
||||
@@ -31,6 +29,20 @@ vendor_download()
|
||||
board="$1" && readcfg && readkconfig && bootstrap && getfiles; return 0
|
||||
}
|
||||
|
||||
readcfg()
|
||||
{
|
||||
boarddir="$cbcfgsdir/$board"
|
||||
eval `setcfg "$boarddir/target.cfg"`; chkvars vcfg tree
|
||||
|
||||
cbdir="src/coreboot/$tree"
|
||||
cbfstool="elf/cbfstool/$tree/cbfstool"
|
||||
mecleaner="$PWD/$cbdir/util/me_cleaner/me_cleaner.py"
|
||||
kbc1126_ec_dump="$PWD/$cbdir/util/kbc1126/kbc1126_ec_dump"
|
||||
cbfstool="elf/cbfstool/$tree/cbfstool"
|
||||
|
||||
x_ ./update trees -d coreboot $tree
|
||||
}
|
||||
|
||||
readkconfig()
|
||||
{
|
||||
check_defconfig "$boarddir" 1>"$TMPDIR/vendorcfg.list" && return 1
|
||||
@@ -91,9 +103,7 @@ fetch()
|
||||
extract_archive "$_dl" "$appdir" || [ "$dl_type" = "e6400vga" ] || \
|
||||
$err "mkdirs $_dest $dl_type: !extract"
|
||||
|
||||
eval "extract_$dl_type"
|
||||
set -u -e
|
||||
|
||||
eval "extract_$dl_type"; set -u -e
|
||||
e "$_dest" f missing && $err "!extract_$dl_type"; return 0
|
||||
}
|
||||
|
||||
@@ -107,8 +117,7 @@ extract_intel_me()
|
||||
|
||||
e "$_me" f && return 0
|
||||
|
||||
sdir="$(mktemp -d)"
|
||||
[ -z "$sdir" ] && return 0
|
||||
sdir="$(mktemp -d)"; [ -z "$sdir" ] && return 0
|
||||
mkdir -p "$sdir" || $err "extract_intel_me: !mkdir -p \"$sdir\""
|
||||
|
||||
set +u +e
|
||||
@@ -149,8 +158,7 @@ extract_kbc1126ec()
|
||||
{
|
||||
e "$kbc1126_ec_dump" f missing && $err "$cbdir: kbc1126 util missing"
|
||||
(
|
||||
x_ cd "$appdir/"
|
||||
mv Rompaq/68*.BIN ec.bin || :
|
||||
x_ cd "$appdir/"; mv Rompaq/68*.BIN ec.bin || :
|
||||
if [ ! -f "ec.bin" ]; then
|
||||
unar -D ROM.CAB Rom.bin || unar -D Rom.CAB Rom.bin || \
|
||||
unar -D 68*.CAB Rom.bin || $err "can't extract Rom.bin"
|
||||
@@ -168,16 +176,14 @@ extract_kbc1126ec()
|
||||
|
||||
extract_e6400vga()
|
||||
{
|
||||
set +u +e
|
||||
chkvars E6400_VGA_offset E6400_VGA_romname
|
||||
set +u +e; chkvars E6400_VGA_offset E6400_VGA_romname
|
||||
tail -c +$E6400_VGA_offset "$_dl" | gunzip > "$appdir/bios.bin" || :
|
||||
(
|
||||
x_ cd "$appdir"
|
||||
[ -f "bios.bin" ] || $err "extract_e6400vga: can't extract bios.bin"
|
||||
"$e6400_unpack" bios.bin || printf "TODO: fix dell extract util\n"
|
||||
) || $err "can't extract e6400 vga rom"
|
||||
cp "$appdir/$E6400_VGA_romname" "$_dest" || \
|
||||
$err "extract_e6400vga $board: can't copy vga rom to $_dest"
|
||||
cp "$appdir/$E6400_VGA_romname" "$_dest" || $err "64 !cp $board $_dest"
|
||||
}
|
||||
|
||||
extract_sch5545ec()
|
||||
@@ -192,184 +198,3 @@ extract_sch5545ec()
|
||||
"$uefiextract" "$_bios" || $err "sch5545 !extract"
|
||||
cp "$_sch5545ec_fw" "$_dest" || $err "$_dest: !sch5545 copy"
|
||||
}
|
||||
|
||||
vendor_inject()
|
||||
{
|
||||
set +u +e
|
||||
|
||||
[ $# -lt 1 ] && $err "No options specified."
|
||||
[ "$1" = "listboards" ] && eval "ls -1 config/coreboot || :; exit 0"
|
||||
|
||||
archive="$1"
|
||||
|
||||
while getopts n:r:b:m: option; do
|
||||
case "$option" in
|
||||
n) nukemode="$OPTARG" ;;
|
||||
r) rom="$OPTARG" ;;
|
||||
b) board="$OPTARG" ;;
|
||||
m) new_mac="$OPTARG"; chkvars new_mac ;;
|
||||
*) : ;;
|
||||
esac
|
||||
done
|
||||
|
||||
check_board || return 0
|
||||
[ "$nukemode" = "nuke" ] || x_ ./vendor download $board
|
||||
[ "$vrelease" != "y" ] && patch_rom "$rom"
|
||||
[ "$vrelease" = "y" ] && patch_release_roms
|
||||
|
||||
[ "$nukemode" = "nuke" ] && return 0
|
||||
printf "Friendly reminder (this is *not* an error message):\n"
|
||||
printf "Make sure the files were inserted. ALSO:\n%s\n" "$kbnotice"
|
||||
}
|
||||
|
||||
check_board()
|
||||
{
|
||||
failcheck="y" && check_release "$archive" && failcheck="n"
|
||||
if [ "$failcheck" = "y" ]; then
|
||||
[ -f "$rom" ] || $err "check_board \"$rom\": invalid path"
|
||||
[ -z "${rom+x}" ] && $err "check_board: no rom specified"
|
||||
[ -n "${board+x}" ] || board="$(detect_board "$rom")"
|
||||
else
|
||||
vrelease="y"; board="$(detect_board "$archive")"
|
||||
fi
|
||||
readcfg || return 1; return 0
|
||||
}
|
||||
|
||||
check_release()
|
||||
{
|
||||
[ -f "$archive" ] || return 1
|
||||
[ "${archive##*.}" = "xz" ] || return 1
|
||||
printf "%s\n" "Release archive $archive detected"
|
||||
}
|
||||
|
||||
# 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()
|
||||
{
|
||||
path="$1"
|
||||
filename="$(basename "$path")"
|
||||
case "$filename" in
|
||||
grub_*|seagrub_*|custom_*)
|
||||
board="$(echo "$filename" | cut -d '_' -f2-3)" ;;
|
||||
seabios_withgrub_*)
|
||||
board="$(echo "$filename" | cut -d '_' -f3-4)" ;;
|
||||
*.tar.xz)
|
||||
_stripped_prefix="${filename#*_}"
|
||||
board="${_stripped_prefix%.tar.xz}" ;;
|
||||
*) $err "detect_board $filename: could not detect board type"
|
||||
esac; printf "%s\n" "$board"
|
||||
}
|
||||
|
||||
readcfg()
|
||||
{
|
||||
if [ "$board" = "serprog_rp2040" ] || \
|
||||
[ "$board" = "serprog_stm32" ]; then
|
||||
return 1
|
||||
fi
|
||||
boarddir="$cbcfgsdir/$board"
|
||||
eval `setcfg "$boarddir/target.cfg"`
|
||||
chkvars vcfg tree
|
||||
|
||||
cbdir="src/coreboot/$tree"
|
||||
cbfstool="elf/cbfstool/$tree/cbfstool"
|
||||
mecleaner="$PWD/$cbdir/util/me_cleaner/me_cleaner.py"
|
||||
kbc1126_ec_dump="$PWD/$cbdir/util/kbc1126/kbc1126_ec_dump"
|
||||
cbfstool="elf/cbfstool/$tree/cbfstool"
|
||||
ifdtool="elf/ifdtool/$tree/ifdtool"
|
||||
|
||||
x_ ./update trees -d coreboot $tree
|
||||
}
|
||||
|
||||
patch_release_roms()
|
||||
{
|
||||
remkdir "tmp/romdir"
|
||||
tar -xf "$archive" -C "tmp/romdir" || \
|
||||
$err "patch_release_roms: !tar -xf \"$archive\" -C \"tmp/romdir\""
|
||||
|
||||
for x in "tmp/romdir/bin/"*/*.rom ; do
|
||||
patch_rom "$x"
|
||||
done
|
||||
|
||||
(
|
||||
cd "tmp/romdir/bin/"* || $err "patch roms: !cd tmp/romdir/bin/*"
|
||||
|
||||
# NOTE: For compatibility with older rom releases, defer to sha1
|
||||
[ "$verify" != "y" ] || [ "$nukemode" = "nuke" ] || \
|
||||
sha512sum --status -c vendorhashes || \
|
||||
sha1sum --status -c vendorhashes || sha512sum --status -c \
|
||||
blobhashes || sha1sum --status -c blobhashes || \
|
||||
$err "patch_release_roms: ROMs did not match expected hashes"
|
||||
) || $err "can't verify vendor hashes"
|
||||
|
||||
[ -n "$new_mac" ] && for x in "tmp/romdir/bin/"*/*.rom ; do
|
||||
[ -f "$x" ] && modify_gbe "$x"
|
||||
done
|
||||
|
||||
x_ mkdir -p bin/release
|
||||
mv tmp/romdir/bin/* bin/release/ || $err "$board: !mv release roms"
|
||||
}
|
||||
|
||||
patch_rom()
|
||||
{
|
||||
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" && inject \
|
||||
ecfw2.bin "$CONFIG_KBC1126_FW2" raw "$CONFIG_KBC1126_FW2_OFFSET"
|
||||
[ -n "$CONFIG_VGA_BIOS_FILE" ] && [ -n "$CONFIG_VGA_BIOS_ID" ] && \
|
||||
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" ] && \
|
||||
inject sch5545_ecfw.bin "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw
|
||||
[ -n "$new_mac" ] && [ "$vrelease" != "y" ] && modify_gbe "$rom"
|
||||
|
||||
printf "ROM image successfully patched: %s\n" "$rom"
|
||||
}
|
||||
|
||||
inject()
|
||||
{
|
||||
[ $# -lt 3 ] && $err "$@, $rom: usage: inject name path type (offset)"
|
||||
[ "$2" = "/dev/null" ] && return 0; verify="y"
|
||||
|
||||
eval `setvars "" cbfsname _dest _t _offset`
|
||||
cbfsname="$1"; _dest="${2##*../}"; _t="$3"
|
||||
|
||||
[ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \
|
||||
$err "inject $@, $rom: offset passed, but empty (not defined)"
|
||||
|
||||
e "$_dest" f n && [ "$nukemode" != "nuke" ] && $err "!inject $dl_type"
|
||||
|
||||
if [ "$cbfsname" = "IFD" ]; then
|
||||
[ "$nukemode" = "nuke" ] || "$ifdtool" -i $_t:$_dest "$rom" \
|
||||
-O "$rom" || $err "failed: inject '$_t' '$_dest' on '$rom'"
|
||||
[ "$nukemode" != "nuke" ] || "$ifdtool" --nuke $_t "$rom" \
|
||||
-O "$rom" || $err "$rom: can't nuke $_t in IFD"; return 0
|
||||
elif [ "$nukemode" = "nuke" ]; then
|
||||
"$cbfstool" "$rom" remove -n "$cbfsname" || \
|
||||
$err "inject $rom: can't remove $cbfsname"; return 0
|
||||
fi
|
||||
[ "$_t" != "stage" ] || "$cbfstool" "$rom" add-stage -f \
|
||||
"$_dest" -n "$cbfsname" -t stage -c lzma || $err "$rom: !add ref"
|
||||
[ "$_t" = "stage" ] || "$cbfstool" "$rom" add -f "$_dest" \
|
||||
-n "$cbfsname" -t $_t $_offset || $err "$rom !add $_t ($_dest)"
|
||||
}
|
||||
|
||||
modify_gbe()
|
||||
{
|
||||
chkvars CONFIG_GBE_BIN_PATH
|
||||
|
||||
e "${CONFIG_GBE_BIN_PATH##*../}" f n && $err "missing gbe file"
|
||||
x_ make -C util/nvmutil
|
||||
|
||||
x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$TMPDIR/gbe"
|
||||
x_ "util/nvmutil/nvm" "$TMPDIR/gbe" setmac $new_mac
|
||||
x_ "$ifdtool" -i GbE:"$TMPDIR/gbe" "$1" -O "$1"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user