mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 14:02:52 +02:00
f7e28964ac
nowadays, we don't insert GRUB keymaps automatically, for sake of efficiency; without one, the default is US QWERTY. a user will only want one keymap in particular, so this is more efficient. in practise, they're either building from source anyway, or using the inject scripts which compile cbfstool anyway, so the user will already have cbfstool. also output this message from the inject script. Signed-off-by: Leah Rowe <leah@libreboot.org>
311 lines
9.7 KiB
Bash
Executable File
311 lines
9.7 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
# Copyright (c) 2014-2016,2020-2021,2023-2024 Leah Rowe <leah@libreboot.org>
|
|
# Copyright (c) 2021-2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
|
|
# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
|
|
# Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
|
|
# Copyright (c) 2023 Riku Viitanen <riku.viitanen@protonmail.com>
|
|
|
|
set -u -e
|
|
|
|
. "include/lib.sh"
|
|
|
|
seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin"
|
|
cfgsdir="config/coreboot"
|
|
picosrc="src/pico-serprog"
|
|
picosdk="src/pico-sdk"
|
|
stm32src="src/stm32-vserprog"
|
|
tmpcfg="$tmpdir/tmpcfg"
|
|
|
|
# Disable all payloads by default.
|
|
# target.cfg files have to specifically enable [a] payload(s)
|
|
pv="payload_uboot payload_grub_withseabios payload_seabios payload_memtest t"
|
|
pv="$pv payload_seabios_withgrub payload_seabios_grubonly payload_grub mt86bin"
|
|
v="romdir cbrom initmode displaymode cbcfg targetdir tree release ubootelf"
|
|
v="$v grub_timeout board grub_scan_disk uboot_config grubtree grubelf tmpmv"
|
|
eval "$(setvars "n" $pv)"
|
|
eval "$(setvars "" $v boards targets serprog_boards_dir)"
|
|
|
|
main()
|
|
{
|
|
while [ $# -gt 0 ]; do
|
|
[ "$1" = "list" ] && eval "x_ ls -1 config/coreboot; return 0"
|
|
[ "$1" = "serprog" ] && shift && eval "mkserprog $@; return 0"
|
|
[ "$1" = "all" ] && shift && continue
|
|
boards="$1 $boards"; shift 1
|
|
done
|
|
|
|
[ -n "$boards" ] || boards="$(ls -1 config/coreboot)" || \
|
|
$err "Cannot generate list of boards for building"
|
|
for x in $boards; do
|
|
[ -d "config/coreboot/$x/config" ] && configure_target "$x" \
|
|
&& build_payloads && build_board && [ -d "bin/$board" ] \
|
|
&& targets="$targets, $x"; continue
|
|
done
|
|
|
|
# [ -z "$targets" ] && $err "No ROM images were compiled"
|
|
printf "Check these ROM directories in bin/: %s\n" "${targets#, }"
|
|
printf "DO NOT flash images from elf/ - use bin/ instead. ALSO:\n"
|
|
printf "%s\n" "$kbnotice"
|
|
}
|
|
|
|
mkserprog()
|
|
{
|
|
[ -z "${1+x}" ] && badcmd
|
|
[ "$1" != "rp2040" ] && [ "$1" != "stm32" ] && $err "bad command"
|
|
if [ "$1" = "rp2040" ]; then
|
|
serprog_boards_dir="$picosdk/src/boards/include/boards"
|
|
[ -d "$picosrc" ] || x_ ./update trees -f "pico-serprog"
|
|
elif [ "$1" = "stm32" ]; then
|
|
serprog_boards_dir="$stm32src/boards"
|
|
[ -d "$stm32src" ] || x_ ./update trees -f "stm32-vserprog"
|
|
fi
|
|
x_ mkdir -p "bin/serprog_$1"
|
|
|
|
if [ $# -gt 1 ]; then
|
|
[ "$2" = "list" ] && serlist "$serprog_boards_dir" && return 0
|
|
[ "$2" = "list" ] || build_${1}_rom "$2"
|
|
else
|
|
serlist "$serprog_boards_dir" | \
|
|
while read -r board; do
|
|
build_${1}_rom "$board"
|
|
done
|
|
fi
|
|
|
|
[ "$xbmk_release" = "y" ] && mkrom_tarball "bin/serprog_$1"; return 0
|
|
}
|
|
|
|
build_rp2040_rom()
|
|
{
|
|
x_ cmake -DPICO_BOARD="$1" -DPICO_SDK_PATH="$picosdk" \
|
|
-B "$picosrc/build" "$picosrc"
|
|
x_ cmake --build "$picosrc/build"
|
|
x_ mv "$picosrc/build/pico_serprog.uf2" \
|
|
"bin/serprog_rp2040/serprog_$1.uf2"
|
|
printf "output to bin/serprog_rp2040/serprog_%s.uf2\n" "$1"
|
|
}
|
|
|
|
build_stm32_rom()
|
|
{
|
|
x_ make -C "$stm32src" libopencm3-just-make BOARD=$1
|
|
x_ make -C "$stm32src" BOARD=$1
|
|
x_ mv "$stm32src/stm32-vserprog.hex" \
|
|
"bin/serprog_stm32/serprog_$1.hex"
|
|
printf "output to bin/serprog_stm32/serprog_%s.hex\n" "$1"
|
|
}
|
|
|
|
serlist()
|
|
{
|
|
basename -a -s .h "$1/"*.h || $err "$1: can't list boards"
|
|
}
|
|
|
|
configure_target()
|
|
{
|
|
eval "$(setvars "n" $pv) $(setvars "" $v)"
|
|
board="$1"
|
|
|
|
targetdir="$cfgsdir/$board"
|
|
[ -f "$targetdir/target.cfg" ] || $err "$board: target.cfg missing"
|
|
|
|
# Override the above defaults using target.cfg
|
|
. "$targetdir/target.cfg"
|
|
|
|
[ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata"
|
|
|
|
[ -n "$grubtree" ] || grubtree="default"
|
|
grubelf="elf/grub/$grubtree/payload/grub.elf"
|
|
|
|
[ -z "$tree" ] && $err "$board: tree not defined"
|
|
|
|
[ "$payload_memtest" != "y" ] && payload_memtest="n"
|
|
[ "$(uname -m)" = "x86_64" ] || payload_memtest="n"
|
|
|
|
[ "$payload_grub_withseabios" = "y" ] && eval "$(setvars "y" \
|
|
payload_grub payload_seabios payload_seabios_withgrub)"
|
|
[ "$payload_seabios_withgrub" = "y" ] && payload_seabios="y"
|
|
[ "$payload_seabios_grubonly" = "y" ] && \
|
|
eval "$(setvars "y" payload_seabios payload_seabios_withgrub)"
|
|
|
|
# The reverse logic must not be applied. If SeaBIOS-with-GRUB works,
|
|
# that doesn't mean GRUB-with-SeaBIOS will, e.g. VGA ROM execution
|
|
[ "$payload_grub" != "y" ] && [ "$payload_seabios" != "y" ] && \
|
|
[ "$payload_uboot" != "y" ] && $err "'$board' defines no payload"
|
|
|
|
[ "$payload_uboot" != "n" ] && [ "$payload_uboot" != "y" ] && \
|
|
payload_uboot="n"
|
|
[ -n "$uboot_config" ] || uboot_config="default"
|
|
|
|
[ "$xbmk_release" = "y" ] && [ "$release" = "n" ] && return 1
|
|
[ "$board" = "$tree" ] && return 1; return 0
|
|
}
|
|
|
|
build_payloads()
|
|
{
|
|
romdir="bin/$board"
|
|
cbdir="src/coreboot/$board"
|
|
[ "$board" = "$tree" ] || cbdir="src/coreboot/$tree"
|
|
cbfstool="elf/cbfstool/$tree/cbfstool"
|
|
cbrom="$cbdir/build/coreboot.rom"
|
|
|
|
[ -f "$cbfstool" ] || x_ ./update trees -b coreboot utils $tree
|
|
|
|
mt86bin="elf/memtest86plus/memtest.bin"
|
|
[ "$payload_memtest" != "y" ] || [ -f "$mt86bin" ] || \
|
|
x_ ./update trees -b memtest86plus
|
|
|
|
[ "$payload_seabios" = "y" ] && x_ ./update trees -b seabios
|
|
if [ "$payload_grub" = "y" ] || [ "$payload_seabios_withgrub" = "y" ] \
|
|
|| [ "$payload_seabios_grubonly" = "y" ]; then
|
|
[ -f "$grubelf" ] || x_ ./update trees -b grub $grubtree
|
|
fi
|
|
[ "$payload_uboot" = "y" ] && build_uboot_payload; return 0
|
|
}
|
|
|
|
build_uboot_payload()
|
|
{
|
|
x_ ./update trees -b u-boot $board
|
|
ubdir="elf/u-boot/$board/$uboot_config"
|
|
ubootelf="$ubdir/u-boot.elf" && [ ! -f "$ubootelf" ] && \
|
|
ubootelf="$ubdir/u-boot"
|
|
[ -f "$ubootelf" ] || $err "$board: Can't find u-boot"; return 0
|
|
}
|
|
|
|
build_board()
|
|
{
|
|
x_ rm -Rf "$romdir"
|
|
|
|
for it in "normal" "vgarom" "libgfxinit"; do
|
|
initmode="$it"
|
|
hmode="vesafb"
|
|
[ "$initmode" = "vgarom" ] || hmode="corebootfb"
|
|
modes="$hmode txtmode"
|
|
for y in $modes; do
|
|
displaymode="$y"
|
|
[ "$initmode" = "normal" ] && \
|
|
[ "$displaymode" != "txtmode" ] && continue
|
|
cbcfg="$targetdir/config/${initmode}_$displaymode"
|
|
[ "$initmode" = "normal" ] && cbcfg="${cbcfg%_*}"
|
|
e "$cbcfg" f not || build_roms; x_ rm -f "$cbrom"
|
|
done
|
|
done
|
|
}
|
|
|
|
build_roms()
|
|
{
|
|
x_ ./update trees -b coreboot $board
|
|
|
|
_cbrom="$cbelfdir/$board/${initmode}_$displaymode"
|
|
[ "$initmode" = "normal" ] && _cbrom="${_cbrom%"_$displaymode"}"
|
|
_cbrom="$_cbrom/coreboot.rom"
|
|
cbrom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
|
|
x_ cp "$_cbrom" "$cbrom"
|
|
|
|
[ "$payload_memtest" != "y" ] || cbfs "$cbrom" "$mt86bin" img/memtest
|
|
[ "$payload_seabios" = "y" ] && build_seabios_roms
|
|
[ "$payload_grub" != "y" ] || build_grub_roms "$cbrom" "grub"
|
|
[ "$payload_uboot" = "y" ] || return 0
|
|
x_ cp "$_cbrom" "$cbrom"
|
|
build_uboot_roms
|
|
}
|
|
|
|
build_seabios_roms()
|
|
{
|
|
if [ "$payload_seabios_withgrub" = "y" ]; then
|
|
t="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
|
|
x_ cp "$cbrom" "$t"
|
|
build_grub_roms "$t" "seabios_withgrub"
|
|
else
|
|
t="$(mkSeabiosRom "$cbrom" "fallback/payload")" || \
|
|
$err "build_seabios_roms: cannot build tmprom"
|
|
newrom="$romdir/seabios_${board}_${initmode}_$displaymode"
|
|
[ "$initmode" = "normal" ] && newrom="$romdir/seabios" \
|
|
&& newrom="${newrom}_${board}_$initmode"
|
|
cprom cp "$t" "$newrom.rom"
|
|
fi
|
|
x_ rm -f "$t"
|
|
}
|
|
|
|
# Make separate ROM images with GRUB payload
|
|
build_grub_roms()
|
|
{
|
|
tmprom="$1"
|
|
payload1="$2" # allow values: grub, seabios, seabios_withgrub
|
|
|
|
grub_cbfs="fallback/payload"
|
|
if [ "$payload1" = "grub" ] && [ "$payload_grub_withseabios" = "y" ]
|
|
then
|
|
tmpmv="$(mkSeabiosRom "$tmprom" "seabios.elf")" || \
|
|
$err "build_grub_roms 1 $board: can't build tmprom"
|
|
elif [ "$payload1" != "grub" ] && [ "$payload_seabios_withgrub" = "y" ]
|
|
then
|
|
grub_cbfs="img/grub2"
|
|
tmpmv="$(mkSeabiosRom "$tmprom" fallback/payload)" || \
|
|
$err "build_grub_roms 2 $board: can't build tmprom"
|
|
fi
|
|
[ -n "$tmpmv" ] && [ -f "$tmpmv" ] && x_ mv "$tmpmv" "$tmprom"
|
|
|
|
# we only need insert grub.elf once, for each coreboot config:
|
|
cbfs "$tmprom" "$grubelf" "$grub_cbfs"
|
|
|
|
printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" > "$tmpcfg" || \
|
|
$err "set grub_scan_disk, $grub_scan_disk, $tmpcfg"
|
|
cbfs "$tmprom" "$tmpcfg" scan.cfg raw
|
|
|
|
printf "set timeout=%s\n" "$grub_timeout" > "$tmpcfg" || $err "!time"
|
|
[ -z "$grub_timeout" ] || cbfs "$tmprom" "$tmpcfg" timeout.cfg raw
|
|
|
|
newrom="$romdir/${payload1}_${board}_${initmode}_$displaymode.rom"
|
|
[ "$initmode" = "normal" ] && newrom="$romdir/${payload1}_" \
|
|
&& newrom="$newrom${board}_$initmode.rom"
|
|
cprom cp "$tmprom" "$newrom"
|
|
if [ "$payload_seabios_withgrub" = "y" ] && \
|
|
[ "$payload1" != "grub" ]; then
|
|
cbfs "$tmprom" "$grubdata/bootorder" bootorder raw
|
|
cprom cp "$tmprom" "${newrom%.rom}_grubfirst.rom"
|
|
if [ "$payload_seabios_grubonly" = "y" ]; then
|
|
x_ "$cbfstool" "$tmprom" add-int -i 0 \
|
|
-n etc/show-boot-menu
|
|
cprom cp "$tmprom" "${newrom%.rom}_grubonly.rom"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# make a rom in /tmp/ and then print the path of that ROM
|
|
mkSeabiosRom() {
|
|
tmprom="$(mktemp -t coreboot_rom.XXXXXXXXXX)" # 1=cbrom, 2=cbfs path
|
|
_seabioself="elf/seabios/default/$initmode/bios.bin.elf"
|
|
|
|
x_ cp "$1" "$tmprom"
|
|
cbfs "$tmprom" "$_seabioself" "$2"
|
|
x_ "$cbfstool" "$tmprom" add-int -i 3000 -n etc/ps2-keyboard-spinup
|
|
|
|
z="2"; [ "$initmode" = "vgarom" ] && z="0"
|
|
x_ "$cbfstool" "$tmprom" add-int -i $z -n etc/pci-optionrom-exec
|
|
x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/optionroms-checksum
|
|
[ "$initmode" != "libgfxinit" ] || cbfs "$tmprom" "$seavgabiosrom" \
|
|
vgaroms/seavgabios.bin raw
|
|
|
|
printf "%s\n" "$tmprom"
|
|
}
|
|
|
|
build_uboot_roms()
|
|
{
|
|
tmprom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
|
|
newrom="$romdir/uboot_payload_${board}_${initmode}_$displaymode.rom"
|
|
x_ cp "$cbrom" "$tmprom"
|
|
cbfs "$tmprom" "$ubootelf" "fallback/payload"
|
|
cprom mv "$tmprom" "$newrom"
|
|
}
|
|
|
|
cprom()
|
|
{
|
|
printf "Creating target image: %s\n" "$3"
|
|
|
|
x_ mkdir -p "${3%/*}"
|
|
x_ $1 "$2" "$3"
|
|
[ "$xbmk_release" = "y" ] && mksha512sum "$3" "vendorhashes" && \
|
|
x_ ./vendor inject -r "$3" -b "$board" -n nuke; return 0
|
|
}
|
|
|
|
main $@
|