From 8d9aeef3de28bcb908e33b804517bdeacce7be38 Mon Sep 17 00:00:00 2001 From: Leah Rowe Date: Fri, 20 Oct 2023 00:17:30 +0100 Subject: lbmk: use 2-level directory structure in script/ as opposed to the current 3-level structure. recent build system simplifications have enabled this change, thus: ./build fw coreboot -> ./build roms ./build fw grub -> ./build grub ./build fw serprog -> ./build serprog ./update project release -> ./update release ./update project trees -> ./update trees ./update vendor download -> ./vendor download ./update vendor inject -> ./vendor inject alper criticised that the commands were too long, so i made them shorter! Signed-off-by: Leah Rowe --- script/build/fw/coreboot | 416 ------------------------------------------ script/build/fw/grub | 82 --------- script/build/fw/serprog | 81 -------- script/build/grub | 82 +++++++++ script/build/roms | 416 ++++++++++++++++++++++++++++++++++++++++++ script/build/serprog | 81 ++++++++ script/update/project/release | 247 ------------------------- script/update/project/trees | 297 ------------------------------ script/update/release | 247 +++++++++++++++++++++++++ script/update/trees | 297 ++++++++++++++++++++++++++++++ script/update/vendor/download | 244 ------------------------- script/update/vendor/inject | 248 ------------------------- script/vendor/download | 244 +++++++++++++++++++++++++ script/vendor/inject | 248 +++++++++++++++++++++++++ 14 files changed, 1615 insertions(+), 1615 deletions(-) delete mode 100755 script/build/fw/coreboot delete mode 100755 script/build/fw/grub delete mode 100755 script/build/fw/serprog create mode 100755 script/build/grub create mode 100755 script/build/roms create mode 100755 script/build/serprog delete mode 100755 script/update/project/release delete mode 100755 script/update/project/trees create mode 100755 script/update/release create mode 100755 script/update/trees delete mode 100755 script/update/vendor/download delete mode 100755 script/update/vendor/inject create mode 100755 script/vendor/download create mode 100755 script/vendor/inject (limited to 'script') diff --git a/script/build/fw/coreboot b/script/build/fw/coreboot deleted file mode 100755 index 8853f749..00000000 --- a/script/build/fw/coreboot +++ /dev/null @@ -1,416 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2014-2016,2020,2021,2023 Leah Rowe -# SPDX-FileCopyrightText: 2021,2022 Ferass El Hafidi -# SPDX-FileCopyrightText: 2022 Caleb La Grange -# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak -# SPDX-FileCopyrightText: 2023 Riku Viitanen - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" -. "include/option.sh" - -seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin" -grub_background="background1280x800.png" -grubelf="elf/grub/grub.elf" -cfgsdir="config/coreboot" -kmapdir="config/grub/keymap" - -# Disable all payloads by default. -# target.cfg files have to specifically enable [a] payload(s) -pv="payload_grub payload_grub_withseabios payload_seabios payload_memtest" -pv="${pv} payload_seabios_withgrub payload_uboot memtest_bin" -v="romdir cbrom initmode displaymode cbcfg targetdir tree arch" -v="${v} grub_timeout ubdir vendorfiles board grub_scan_disk uboot_config" -eval "$(setvars "n" ${pv})" -eval "$(setvars "" ${v} boards _displaymode _payload _keyboard all targets)" - -main() -{ - while [ $# -gt 0 ]; do - case ${1} in - help) usage && exit 0 ;; - list) items config/coreboot && exit 0 ;; - -d) _displaymode="${2}" ;; - -p) _payload="${2}" ;; - -k) _keyboard="${2}" ;; - *) - [ "${1}" = "all" ] && all="y" - boards="${1} ${boards}" - shift && continue ;; - esac - shift 2 - done - - [ "${all}" != "y" ] || boards=$(items config/coreboot) || \ - err "Cannot generate list of boards for building" - - for x in ${boards}; do - eval "$(setvars "n" ${pv})" - eval "$(setvars "" ${v})" - grub_background="background1280x800.png" - board="${x}" - check_target - prepare_target - [ -d "bin/${board}" ] || continue - targets="* bin/${board}\n${targets}" - done - - [ -z "${targets}" ] && err "No ROM images were compiled" - printf "\nROM images available in these directories:\n" - printf "${targets}^^ ROM images available in these directories.\n\n" - - printf "DO NOT flash ROM images from elf/ - please use bin/ instead.\n" -} - -check_target() -{ - targetdir="${cfgsdir}/${board}" - [ -f "${targetdir}/target.cfg" ] || \ - err "Missing target.cfg for target: ${board}" - - # Override the above defaults using target.cfg - . "${targetdir}/target.cfg" - - [ -z "${grub_scan_disk}" ] && \ - grub_scan_disk="both" - [ "${grub_scan_disk}" != "both" ] && [ "${grub_scan_disk}" != "ata" ] \ - && [ "${grub_scan_disk}" != "ahci" ] && \ - grub_scan_disk="both" - - [ -z "${tree}" ] && \ - err "Target '${board}' defines no tree. Skipping build." - [ -z "${arch}" ] && \ - err "Target '${board}' defines no arch. Skipping build." - - [ "${payload_memtest}" != "y" ] && \ - payload_memtest="n" - [ "${payload_grub_withseabios}" = "y" ] && \ - payload_grub="y" - [ "${payload_grub_withseabios}" = "y" ] && \ - eval "$(setvars "y" payload_seabios payload_seabios_withgrub)" - [ "${payload_seabios_withgrub}" = "y" ] && \ - payload_seabios="y" - - # The reverse logic must not be applied. If SeaBIOS-with-GRUB works, - # that doesn't mean GRUB-withSeaBIOS will. For example, the board - # might have a graphics card whose vga rom coreboot doesn't execute - [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] && \ - [ "${payload_uboot}" != "y" ] && \ - for configfile in "${targetdir}/config/"*; do - [ -e "${configfile}" ] || continue - err "target '${board}' defines no payload" - done - - [ "${payload_uboot}" != "n" ] && [ "${payload_uboot}" != "y" ] && \ - payload_uboot="n" - [ "${payload_uboot}" = "y" ] && [ -z "${uboot_config}" ] && \ - uboot_config="default" - [ "${vendorfiles}" != "n" ] && [ "${vendorfiles}" != "y" ] && \ - vendorfiles="y" - - # Override all payload directives with cmdline args - [ -z "${_payload}" ] && return 0 - printf "setting payload to: %s\n" "${_payload}" - eval "$(setvars "n" payload_grub payload_memtest payload_seabios \ - payload_seabios_withgrub payload_uboot payload_grub_withseabios)" - eval "payload_${_payload}=y" -} - -prepare_target() -{ - romdir="bin/${board}" - cbdir="src/coreboot/${board}" - [ "${board}" = "${tree}" ] || cbdir="src/coreboot/${tree}" - cbfstool="cbutils/${tree}/cbfstool" - cbrom="${cbdir}/build/coreboot.rom" - - [ -f "${cbfstool}" ] || \ - x_ ./update project trees -b coreboot utils ${tree} - - build_dependency_seabios - - memtest_bin="memtest86plus/build64/memtest.bin" - [ "${payload_memtest}" != "y" ] || [ -f "src/${memtest_bin}" ] || \ - x_ ./update project trees -b memtest86plus - - x_ rm -f "${romdir}/"* - - build_dependency_grub - build_dependency_uboot - build_target -} - -build_dependency_seabios() -{ - [ "${payload_seabios}" = "y" ] || return 0 - [ -f "${seavgabiosrom}" ] && \ - [ -f elf/seabios/default/libgfxinit/bios.bin.elf ] && \ - [ -f elf/seabios/default/vgarom/bios.bin.elf ] && \ - [ -f elf/seabios/default/normal/bios.bin.elf ] && return 0 - - x_ ./update project trees -b seabios -} - -build_dependency_grub() -{ - [ "${payload_grub}" != "y" ] && \ - [ "${payload_seabios_withgrub}" != "y" ] && return 0 - - rebuild_grub="n" - [ -f "${grubelf}" ] || rebuild_grub="y" - for keymapfile in "${kmapdir}"/*.gkb; do - [ "${rebuild_grub}" = "y" ] || break - [ -f "${keymapfile}" ] || continue - - keymap="${keymapfile##*/}" - keymap="${keymap%.gkb}" - [ ! -f "elf/grub/keymap_${keymap}.cfg" ] && \ - rebuild_grub="y" && break - done - [ "${rebuild_grub}" = "y" ] || return 0 - x_ ./build fw grub -} - -build_dependency_uboot() -{ - [ "${payload_uboot}" = "y" ] || return 0 - - x_ ./update project trees -b u-boot ${board} - ubdir="elf/u-boot/${board}/${uboot_config}" - ubootelf="${ubdir}/u-boot.elf" - [ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot" ] && \ - ubootelf="${ubdir}/u-boot" - [ -f "${ubootelf}" ] && return 0 - err "Could not find u-boot build for board, ${board}" -} - -build_target() -{ - for x in "normal" "vgarom" "libgfxinit"; do - initmode="${x}" - hmode="vesafb" - [ "${initmode}" = "vgarom" ] || hmode="corebootfb" - modes="${hmode} txtmode" - [ -z "${_displaymode}" ] || modes="${_displaymode}" - for y in ${modes}; do - displaymode="${y}" - [ "${initmode}" = "normal" ] && \ - [ "$displaymode" != "txtmode" ] && continue - cbcfg="${targetdir}/config/${initmode}_${displaymode}" - [ "${initmode}" = "normal" ] && cbcfg="${cbcfg%_*}" - build_roms "${cbcfg}" - done - done -} - -# Main ROM building function. This calls all other functions below -build_roms() -{ - cbcfg="${1}" - [ ! -f "${cbcfg}" ] && \ - printf "'%s' does not exist. Skipping build for %s %s %s\n" \ - "${cbcfg}" "${board}" "${displaymode}" "${initmode}" \ - 1>&2 && return 0 - - x_ ./update project trees -b coreboot ${board} - - _cbrom="elf/coreboot_nopayload_DO_NOT_FLASH/${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" ] || \ - x_ "${cbfstool}" "${cbrom}" add-payload \ - -f "src/${memtest_bin}" -n img/memtest -c lzma - [ "${payload_seabios}" = "y" ] && \ - build_seabios_roms - [ "${payload_grub}" != "y" ] || \ - x_ build_grub_roms "${cbrom}" "grub" - [ "${payload_uboot}" = "y" ] || return 0 - build_uboot_roms -} - -build_seabios_roms() -{ - if [ "${payload_seabios_withgrub}" = "y" ]; then - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - x_ cp "${cbrom}" "${tmprom}" - x_ build_grub_roms "${tmprom}" "seabios_withgrub" - x_ rm -f "${tmprom}" - 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}" - x_ moverom "${t}" "${newrom}.rom" - x_ rm -f "${t}" - fi -} - -# Make separate ROM images with GRUB payload, for each supported keymap -build_grub_roms() -{ - tmprom="${1}" - payload1="${2}" # allow values: grub, seabios, seabios_withgrub - - grub_cbfs="fallback/payload" - [ "${payload1}" = "grub" ] && [ "${payload_grub_withseabios}" = "y" ] \ - && x_ mv "$(mkSeabiosRom "${tmprom}" "seabios.elf")" "${tmprom}" - [ "${payload1}" != "grub" ] && [ "${payload_seabios_withgrub}" = "y" ] \ - && grub_cbfs="img/grub2" && \ - x_ mv "$(mkSeabiosRom "${tmprom}" fallback/payload)" "${tmprom}" - - # we only need insert grub.elf once, for each coreboot config: - x_ "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \ - -n ${grub_cbfs} -c lzma - - # we only need insert background.png once, for each coreboot config: - if [ "${displaymode}" = "vesafb" ] || \ - [ "${displaymode}" = "corebootfb" ]; then - backgroundfile="config/grub/background/${grub_background}" - x_ "${cbfstool}" "${tmprom}" add -f ${backgroundfile} \ - -n background.png -t raw - fi - - tmpcfg=$(mktemp -t coreboot_rom.XXXXXXXXXX) - x_ printf "set grub_scan_disk=\"%s\"\n" "${grub_scan_disk}" >"${tmpcfg}" - [ "${grub_scan_disk}" = "both" ] || \ - x_ "${cbfstool}" "${tmprom}" add -f "${tmpcfg}" -n scan.cfg -t raw - x_ printf "set timeout=%s\n" "${grub_timeout}" > "${tmpcfg}" - [ -z "${grub_timeout}" ] || x_ "${cbfstool}" "${tmprom}" add \ - -f "${tmpcfg}" -n timeout.cfg -t raw - x_ rm -f "${tmpcfg}" - - keymaps="" - for kmapfile in "${kmapdir}"/*; do - keymaps="${keymaps} ${kmapfile}" - done - [ -z "${_keyboard}" ] || keymaps="${kmapdir}/${_keyboard}.gkb" - - for keymapfile in ${keymaps}; do - [ -f "${keymapfile}" ] || continue - keymap="${keymapfile##*/}" - keymap="${keymap%.gkb}" - tmpgrubrom="$(mkGrubRom "${keymap}" "${tmprom}")" - - newrom="${romdir}/${payload1}_${board}_${initmode}_" - newrom="${newrom}${displaymode}_${keymap}.rom" - [ "${initmode}" = "normal" ] && \ - newrom="${romdir}/${payload1}_${board}_" && \ - newrom="${newrom}${initmode}_${keymap}.rom" - x_ moverom "${tmpgrubrom}" "${newrom}" - x_ rm -f "${tmpgrubrom}" - done -} - -# make a rom in /tmp/ and then print the path of that ROM -mkGrubRom() { - _keymap="${1}" - _cbrom="${2}" - - keymapcfg="elf/grub/keymap_${_keymap}.cfg" - - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - x_ cp "${_cbrom}" "${tmprom}" - x_ "${cbfstool}" "${tmprom}" add -f "${keymapcfg}" -n keymap.cfg -t raw - - printf "%s\n" "${tmprom}" -} - -# make a rom in /tmp/ and then print the path of that ROM -mkSeabiosRom() { - _cbrom="${1}" # rom to insert seabios in. will not be touched - # (a tmpfile will be made instead) - _seabios_cbfs_path="${2}" # e.g. fallback/payload - _seabioself="elf/seabios/default/${initmode}/bios.bin.elf" - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - - x_ cp "${_cbrom}" "${tmprom}" - x_ "${cbfstool}" "${tmprom}" add-payload -f "${_seabioself}" \ - -n ${_seabios_cbfs_path} -c lzma - 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" ] || \ - x_ "${cbfstool}" "${tmprom}" add -f "${seavgabiosrom}" \ - -n vgaroms/seavgabios.bin -t raw - - printf "%s\n" "${tmprom}" -} - -build_uboot_roms() -{ - tmprom="$(mkUbootRom "${cbrom}" "fallback/payload")" - newrom="${romdir}/uboot_payload_${board}_${initmode}_${displaymode}.rom" - [ "${initmode}" = "normal" ] && \ - newrom="${romdir}/uboot_payload_${board}_${initmode}.rom" - x_ moverom "${tmprom}" "${newrom}" - x_ rm -f "${tmprom}" -} - -# make a rom in /tmp/ and then print the path of that ROM -mkUbootRom() { - _cbrom="${1}" - _uboot_cbfs_path="${2}" - - _ubdir="elf/u-boot/${board}/${uboot_config}" - _ubootelf="${_ubdir}/u-boot.elf" - [ -f "${_ubootelf}" ] || _ubootelf="${_ubdir}/u-boot" - [ -f "${_ubootelf}" ] || err "mkUbootRom: ${board}: cant find u-boot" - - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - - x_ cp "${_cbrom}" "${tmprom}" - x_ "${cbfstool}" "${tmprom}" add-payload -f "${_ubootelf}" \ - -n ${_uboot_cbfs_path} -c lzma - - printf "%s\n" "${tmprom}" -} - -# it is assumed that no other work will be done on the ROM -# after calling this function. therefore this function is "final" -moverom() { - rompath="${1}" - newrom="${2}" - - printf "Creating target image: %s\n" "${newrom}" - - [ -d "${newrom%/*}" ] || x_ mkdir -p "${newrom%/*}/" - [ "${vendorfiles}" = "n" ] && newrom="${newrom%.rom}_noblobs.rom" - x_ cp "${rompath}" "${newrom}" -} - -usage() -{ - cat <<- EOF - USAGE: ./build fw coreboot targetname - To build *all* boards, do this: ./build fw coreboot all - To list *all* boards, do this: ./build fw coreboot list - - Optional Flags: - -d: displaymode - -p: payload - -k: keyboard layout - - Example commands: - - ./build fw coreboot x60 - ./build fw coreboot x200_8mb x60 - ./build fw coreboot x60 -p grub -d corebootfb -k usqwerty - - possible values for 'target': - $(items "config/coreboot") - - Refer to the ${projectname} documentation for more information. - EOF -} - -main $@ diff --git a/script/build/fw/grub b/script/build/fw/grub deleted file mode 100755 index 66286732..00000000 --- a/script/build/fw/grub +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2014,2015,2020,2021,2023 Leah Rowe - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" - -elfdir="elf/grub" -grubcfgsdir="config/grub" -layoutdir="/boot/grub/layouts" - -. "${grubcfgsdir}/modules.list" - -main() -{ - handle_dependencies - build_keymap_configs - build_grub_payload - printf "GRUB files now available under directory: %s\n" "${elfdir}" -} - -handle_dependencies() -{ - [ -d "src/grub" ] || x_ ./update project trees -f grub - [ -f "src/grub/grub-mkstandalone" ] || build_grub_utils - x_ mkdir -p "${elfdir}" - x_ rm -f "${elfdir}/"* -} - -build_grub_utils() -{ - ( - x_ cd "src/grub" - [ ! -d Makefile ] || x_ make distclean - x_ ./bootstrap --gnulib-srcdir=gnulib/ --no-git - x_ ./autogen.sh - x_ ./configure --with-platform=coreboot - x_ make -j$(nproc) FS_PAYLOAD_MODULES="" - ) -} - -build_keymap_configs() -{ - for keylayoutfile in "${grubcfgsdir}/keymap/"*.gkb; do - [ -f "${keylayoutfile}" ] || continue - keymap="${keylayoutfile##${grubcfgsdir}/keymap/}" - keymap="${keymap%.gkb}" - x_ printf "keymap %s\n" "${keymap}" > \ - "${elfdir}/keymap_${keymap}.cfg" - done -} - -build_grub_payload() -{ - ./src/grub/grub-mkstandalone \ - --grub-mkimage="src/grub/grub-mkimage" \ - -O i386-coreboot \ - -o "${elfdir}/grub.elf" \ - -d "src/grub/grub-core/" \ - --fonts= --themes= --locales= \ - --modules="${grub_modules}" \ - --install-modules="${grub_install_modules}" \ - "${layoutdir}/colemak.gkb=${grubcfgsdir}/keymap/colemak.gkb" \ - "${layoutdir}/deqwertz.gkb=${grubcfgsdir}/keymap/deqwertz.gkb" \ - "${layoutdir}/esqwerty.gkb=${grubcfgsdir}/keymap/esqwerty.gkb" \ - "${layoutdir}/frazerty.gkb=${grubcfgsdir}/keymap/frazerty.gkb" \ - "${layoutdir}/frdvbepo.gkb=${grubcfgsdir}/keymap/frdvbepo.gkb" \ - "${layoutdir}/itqwerty.gkb=${grubcfgsdir}/keymap/itqwerty.gkb" \ - "${layoutdir}/svenska.gkb=${grubcfgsdir}/keymap/svenska.gkb" \ - "${layoutdir}/trqwerty.gkb=${grubcfgsdir}/keymap/trqwerty.gkb" \ - "${layoutdir}/ukdvorak.gkb=${grubcfgsdir}/keymap/ukdvorak.gkb" \ - "${layoutdir}/ukqwerty.gkb=${grubcfgsdir}/keymap/ukqwerty.gkb" \ - "${layoutdir}/usdvorak.gkb=${grubcfgsdir}/keymap/usdvorak.gkb" \ - "${layoutdir}/usqwerty.gkb=${grubcfgsdir}/keymap/usqwerty.gkb" \ - "/boot/grub/grub.cfg=${grubcfgsdir}/config/grub_memdisk.cfg" \ - "/boot/grub/grub_default.cfg=${grubcfgsdir}/config/grub.cfg" || \ - err "build_grub_elf: cannot build grub payload (grub-mkstandalone)" -} - -main $@ diff --git a/script/build/fw/serprog b/script/build/fw/serprog deleted file mode 100755 index eb0e5ede..00000000 --- a/script/build/fw/serprog +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2023 Riku Viitanen - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" - -eval "$(setvars "" platform pico_sdk_dir pico_src_dir stm32_src_dir boards_dir)" - -pico_src_dir=src/pico-serprog -pico_sdk_dir=src/pico-sdk -stm32_src_dir=src/stm32-vserprog - -usage="usage: ./build firmware serprog [board]" - -main() -{ - [ -z "${1+x}" ] && err "${usage}" - if [ "${1}" = "rp2040" ]; then - platform="rp2040" - boards_dir=${pico_sdk_dir}/src/boards/include/boards - [ -d "${pico_src_dir}/" ] || \ - x_ ./update project trees -f "rpi-pico-serprog" - elif [ "${1}" = "stm32" ]; then - platform="stm32" - boards_dir=${stm32_src_dir}/boards - [ -d "${stm32_src_dir}/" ] || \ - x_ ./update project trees -f "stm32-vserprog" - else - err "${usage}" - fi - x_ mkdir -p "bin/serprog_${platform}" - - if [ $# -gt 1 ] ; then - [ "${2}" = "list" ] && print_boards ${boards_dir} && return 0 - build_${platform}_rom "${2}" - else - printf "Building all serprog targets\n" - list_boards "${boards_dir}" | while read board; do - build_${platform}_rom "${board}" - done - fi -} - -build_rp2040_rom() -{ - board=${1} - printf "Building pico-serprog for ${board}\n" - x_ cmake -DPICO_BOARD="${board}" -DPICO_SDK_PATH="${pico_sdk_dir}" \ - -B "${pico_src_dir}/build" "${pico_src_dir}" - x_ cmake --build "${pico_src_dir}/build" - x_ mv ${pico_src_dir}/build/pico_serprog.uf2 \ - bin/serprog_rp2040/serprog_${board}.uf2 - printf "output to bin/serprog_rp2040/serprog_${board}.uf2\n" -} - -build_stm32_rom() -{ - board=${1} - printf "Building stm32-vserprog for ${board}\n" - x_ make -C ${stm32_src_dir} libopencm3-just-make BOARD=${board} - x_ make -C ${stm32_src_dir} BOARD=${board} - x_ mv ${stm32_src_dir}/stm32-vserprog.hex \ - bin/serprog_stm32/serprog_${board}.hex - printf "output to bin/serprog_stm32/serprog_${board}.hex\n" -} - -print_boards() -{ - printf "Available boards:\n" - list_boards "${1}" -} - -list_boards() -{ - basename -a -s .h ${1}/*.h -} - -main $@ diff --git a/script/build/grub b/script/build/grub new file mode 100755 index 00000000..ba0845d3 --- /dev/null +++ b/script/build/grub @@ -0,0 +1,82 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2014,2015,2020,2021,2023 Leah Rowe + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +. "include/err.sh" + +elfdir="elf/grub" +grubcfgsdir="config/grub" +layoutdir="/boot/grub/layouts" + +. "${grubcfgsdir}/modules.list" + +main() +{ + handle_dependencies + build_keymap_configs + build_grub_payload + printf "GRUB files now available under directory: %s\n" "${elfdir}" +} + +handle_dependencies() +{ + [ -d "src/grub" ] || x_ ./update trees -f grub + [ -f "src/grub/grub-mkstandalone" ] || build_grub_utils + x_ mkdir -p "${elfdir}" + x_ rm -f "${elfdir}/"* +} + +build_grub_utils() +{ + ( + x_ cd "src/grub" + [ ! -d Makefile ] || x_ make distclean + x_ ./bootstrap --gnulib-srcdir=gnulib/ --no-git + x_ ./autogen.sh + x_ ./configure --with-platform=coreboot + x_ make -j$(nproc) FS_PAYLOAD_MODULES="" + ) +} + +build_keymap_configs() +{ + for keylayoutfile in "${grubcfgsdir}/keymap/"*.gkb; do + [ -f "${keylayoutfile}" ] || continue + keymap="${keylayoutfile##${grubcfgsdir}/keymap/}" + keymap="${keymap%.gkb}" + x_ printf "keymap %s\n" "${keymap}" > \ + "${elfdir}/keymap_${keymap}.cfg" + done +} + +build_grub_payload() +{ + ./src/grub/grub-mkstandalone \ + --grub-mkimage="src/grub/grub-mkimage" \ + -O i386-coreboot \ + -o "${elfdir}/grub.elf" \ + -d "src/grub/grub-core/" \ + --fonts= --themes= --locales= \ + --modules="${grub_modules}" \ + --install-modules="${grub_install_modules}" \ + "${layoutdir}/colemak.gkb=${grubcfgsdir}/keymap/colemak.gkb" \ + "${layoutdir}/deqwertz.gkb=${grubcfgsdir}/keymap/deqwertz.gkb" \ + "${layoutdir}/esqwerty.gkb=${grubcfgsdir}/keymap/esqwerty.gkb" \ + "${layoutdir}/frazerty.gkb=${grubcfgsdir}/keymap/frazerty.gkb" \ + "${layoutdir}/frdvbepo.gkb=${grubcfgsdir}/keymap/frdvbepo.gkb" \ + "${layoutdir}/itqwerty.gkb=${grubcfgsdir}/keymap/itqwerty.gkb" \ + "${layoutdir}/svenska.gkb=${grubcfgsdir}/keymap/svenska.gkb" \ + "${layoutdir}/trqwerty.gkb=${grubcfgsdir}/keymap/trqwerty.gkb" \ + "${layoutdir}/ukdvorak.gkb=${grubcfgsdir}/keymap/ukdvorak.gkb" \ + "${layoutdir}/ukqwerty.gkb=${grubcfgsdir}/keymap/ukqwerty.gkb" \ + "${layoutdir}/usdvorak.gkb=${grubcfgsdir}/keymap/usdvorak.gkb" \ + "${layoutdir}/usqwerty.gkb=${grubcfgsdir}/keymap/usqwerty.gkb" \ + "/boot/grub/grub.cfg=${grubcfgsdir}/config/grub_memdisk.cfg" \ + "/boot/grub/grub_default.cfg=${grubcfgsdir}/config/grub.cfg" || \ + err "build_grub_elf: cannot build grub payload (grub-mkstandalone)" +} + +main $@ diff --git a/script/build/roms b/script/build/roms new file mode 100755 index 00000000..2f7b93da --- /dev/null +++ b/script/build/roms @@ -0,0 +1,416 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2014-2016,2020,2021,2023 Leah Rowe +# SPDX-FileCopyrightText: 2021,2022 Ferass El Hafidi +# SPDX-FileCopyrightText: 2022 Caleb La Grange +# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak +# SPDX-FileCopyrightText: 2023 Riku Viitanen + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +. "include/err.sh" +. "include/option.sh" + +seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin" +grub_background="background1280x800.png" +grubelf="elf/grub/grub.elf" +cfgsdir="config/coreboot" +kmapdir="config/grub/keymap" + +# Disable all payloads by default. +# target.cfg files have to specifically enable [a] payload(s) +pv="payload_grub payload_grub_withseabios payload_seabios payload_memtest" +pv="${pv} payload_seabios_withgrub payload_uboot memtest_bin" +v="romdir cbrom initmode displaymode cbcfg targetdir tree arch" +v="${v} grub_timeout ubdir vendorfiles board grub_scan_disk uboot_config" +eval "$(setvars "n" ${pv})" +eval "$(setvars "" ${v} boards _displaymode _payload _keyboard all targets)" + +main() +{ + while [ $# -gt 0 ]; do + case ${1} in + help) usage && exit 0 ;; + list) items config/coreboot && exit 0 ;; + -d) _displaymode="${2}" ;; + -p) _payload="${2}" ;; + -k) _keyboard="${2}" ;; + *) + [ "${1}" = "all" ] && all="y" + boards="${1} ${boards}" + shift && continue ;; + esac + shift 2 + done + + [ "${all}" != "y" ] || boards=$(items config/coreboot) || \ + err "Cannot generate list of boards for building" + + for x in ${boards}; do + eval "$(setvars "n" ${pv})" + eval "$(setvars "" ${v})" + grub_background="background1280x800.png" + board="${x}" + check_target + prepare_target + [ -d "bin/${board}" ] || continue + targets="* bin/${board}\n${targets}" + done + + [ -z "${targets}" ] && err "No ROM images were compiled" + printf "\nROM images available in these directories:\n" + printf "${targets}^^ ROM images available in these directories.\n\n" + + printf "DO NOT flash ROM images from elf/ - please use bin/ instead.\n" +} + +check_target() +{ + targetdir="${cfgsdir}/${board}" + [ -f "${targetdir}/target.cfg" ] || \ + err "Missing target.cfg for target: ${board}" + + # Override the above defaults using target.cfg + . "${targetdir}/target.cfg" + + [ -z "${grub_scan_disk}" ] && \ + grub_scan_disk="both" + [ "${grub_scan_disk}" != "both" ] && [ "${grub_scan_disk}" != "ata" ] \ + && [ "${grub_scan_disk}" != "ahci" ] && \ + grub_scan_disk="both" + + [ -z "${tree}" ] && \ + err "Target '${board}' defines no tree. Skipping build." + [ -z "${arch}" ] && \ + err "Target '${board}' defines no arch. Skipping build." + + [ "${payload_memtest}" != "y" ] && \ + payload_memtest="n" + [ "${payload_grub_withseabios}" = "y" ] && \ + payload_grub="y" + [ "${payload_grub_withseabios}" = "y" ] && \ + eval "$(setvars "y" payload_seabios payload_seabios_withgrub)" + [ "${payload_seabios_withgrub}" = "y" ] && \ + payload_seabios="y" + + # The reverse logic must not be applied. If SeaBIOS-with-GRUB works, + # that doesn't mean GRUB-withSeaBIOS will. For example, the board + # might have a graphics card whose vga rom coreboot doesn't execute + [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] && \ + [ "${payload_uboot}" != "y" ] && \ + for configfile in "${targetdir}/config/"*; do + [ -e "${configfile}" ] || continue + err "target '${board}' defines no payload" + done + + [ "${payload_uboot}" != "n" ] && [ "${payload_uboot}" != "y" ] && \ + payload_uboot="n" + [ "${payload_uboot}" = "y" ] && [ -z "${uboot_config}" ] && \ + uboot_config="default" + [ "${vendorfiles}" != "n" ] && [ "${vendorfiles}" != "y" ] && \ + vendorfiles="y" + + # Override all payload directives with cmdline args + [ -z "${_payload}" ] && return 0 + printf "setting payload to: %s\n" "${_payload}" + eval "$(setvars "n" payload_grub payload_memtest payload_seabios \ + payload_seabios_withgrub payload_uboot payload_grub_withseabios)" + eval "payload_${_payload}=y" +} + +prepare_target() +{ + romdir="bin/${board}" + cbdir="src/coreboot/${board}" + [ "${board}" = "${tree}" ] || cbdir="src/coreboot/${tree}" + cbfstool="cbutils/${tree}/cbfstool" + cbrom="${cbdir}/build/coreboot.rom" + + [ -f "${cbfstool}" ] || \ + x_ ./update trees -b coreboot utils ${tree} + + build_dependency_seabios + + memtest_bin="memtest86plus/build64/memtest.bin" + [ "${payload_memtest}" != "y" ] || [ -f "src/${memtest_bin}" ] || \ + x_ ./update trees -b memtest86plus + + x_ rm -f "${romdir}/"* + + build_dependency_grub + build_dependency_uboot + build_target +} + +build_dependency_seabios() +{ + [ "${payload_seabios}" = "y" ] || return 0 + [ -f "${seavgabiosrom}" ] && \ + [ -f elf/seabios/default/libgfxinit/bios.bin.elf ] && \ + [ -f elf/seabios/default/vgarom/bios.bin.elf ] && \ + [ -f elf/seabios/default/normal/bios.bin.elf ] && return 0 + + x_ ./update trees -b seabios +} + +build_dependency_grub() +{ + [ "${payload_grub}" != "y" ] && \ + [ "${payload_seabios_withgrub}" != "y" ] && return 0 + + rebuild_grub="n" + [ -f "${grubelf}" ] || rebuild_grub="y" + for keymapfile in "${kmapdir}"/*.gkb; do + [ "${rebuild_grub}" = "y" ] || break + [ -f "${keymapfile}" ] || continue + + keymap="${keymapfile##*/}" + keymap="${keymap%.gkb}" + [ ! -f "elf/grub/keymap_${keymap}.cfg" ] && \ + rebuild_grub="y" && break + done + [ "${rebuild_grub}" = "y" ] || return 0 + x_ ./build grub +} + +build_dependency_uboot() +{ + [ "${payload_uboot}" = "y" ] || return 0 + + x_ ./update trees -b u-boot ${board} + ubdir="elf/u-boot/${board}/${uboot_config}" + ubootelf="${ubdir}/u-boot.elf" + [ ! -f "${ubootelf}" ] && [ -f "${ubdir}/u-boot" ] && \ + ubootelf="${ubdir}/u-boot" + [ -f "${ubootelf}" ] && return 0 + err "Could not find u-boot build for board, ${board}" +} + +build_target() +{ + for x in "normal" "vgarom" "libgfxinit"; do + initmode="${x}" + hmode="vesafb" + [ "${initmode}" = "vgarom" ] || hmode="corebootfb" + modes="${hmode} txtmode" + [ -z "${_displaymode}" ] || modes="${_displaymode}" + for y in ${modes}; do + displaymode="${y}" + [ "${initmode}" = "normal" ] && \ + [ "$displaymode" != "txtmode" ] && continue + cbcfg="${targetdir}/config/${initmode}_${displaymode}" + [ "${initmode}" = "normal" ] && cbcfg="${cbcfg%_*}" + build_roms "${cbcfg}" + done + done +} + +# Main ROM building function. This calls all other functions below +build_roms() +{ + cbcfg="${1}" + [ ! -f "${cbcfg}" ] && \ + printf "'%s' does not exist. Skipping build for %s %s %s\n" \ + "${cbcfg}" "${board}" "${displaymode}" "${initmode}" \ + 1>&2 && return 0 + + x_ ./update trees -b coreboot ${board} + + _cbrom="elf/coreboot_nopayload_DO_NOT_FLASH/${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" ] || \ + x_ "${cbfstool}" "${cbrom}" add-payload \ + -f "src/${memtest_bin}" -n img/memtest -c lzma + [ "${payload_seabios}" = "y" ] && \ + build_seabios_roms + [ "${payload_grub}" != "y" ] || \ + x_ build_grub_roms "${cbrom}" "grub" + [ "${payload_uboot}" = "y" ] || return 0 + build_uboot_roms +} + +build_seabios_roms() +{ + if [ "${payload_seabios_withgrub}" = "y" ]; then + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + x_ cp "${cbrom}" "${tmprom}" + x_ build_grub_roms "${tmprom}" "seabios_withgrub" + x_ rm -f "${tmprom}" + 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}" + x_ moverom "${t}" "${newrom}.rom" + x_ rm -f "${t}" + fi +} + +# Make separate ROM images with GRUB payload, for each supported keymap +build_grub_roms() +{ + tmprom="${1}" + payload1="${2}" # allow values: grub, seabios, seabios_withgrub + + grub_cbfs="fallback/payload" + [ "${payload1}" = "grub" ] && [ "${payload_grub_withseabios}" = "y" ] \ + && x_ mv "$(mkSeabiosRom "${tmprom}" "seabios.elf")" "${tmprom}" + [ "${payload1}" != "grub" ] && [ "${payload_seabios_withgrub}" = "y" ] \ + && grub_cbfs="img/grub2" && \ + x_ mv "$(mkSeabiosRom "${tmprom}" fallback/payload)" "${tmprom}" + + # we only need insert grub.elf once, for each coreboot config: + x_ "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \ + -n ${grub_cbfs} -c lzma + + # we only need insert background.png once, for each coreboot config: + if [ "${displaymode}" = "vesafb" ] || \ + [ "${displaymode}" = "corebootfb" ]; then + backgroundfile="config/grub/background/${grub_background}" + x_ "${cbfstool}" "${tmprom}" add -f ${backgroundfile} \ + -n background.png -t raw + fi + + tmpcfg=$(mktemp -t coreboot_rom.XXXXXXXXXX) + x_ printf "set grub_scan_disk=\"%s\"\n" "${grub_scan_disk}" >"${tmpcfg}" + [ "${grub_scan_disk}" = "both" ] || \ + x_ "${cbfstool}" "${tmprom}" add -f "${tmpcfg}" -n scan.cfg -t raw + x_ printf "set timeout=%s\n" "${grub_timeout}" > "${tmpcfg}" + [ -z "${grub_timeout}" ] || x_ "${cbfstool}" "${tmprom}" add \ + -f "${tmpcfg}" -n timeout.cfg -t raw + x_ rm -f "${tmpcfg}" + + keymaps="" + for kmapfile in "${kmapdir}"/*; do + keymaps="${keymaps} ${kmapfile}" + done + [ -z "${_keyboard}" ] || keymaps="${kmapdir}/${_keyboard}.gkb" + + for keymapfile in ${keymaps}; do + [ -f "${keymapfile}" ] || continue + keymap="${keymapfile##*/}" + keymap="${keymap%.gkb}" + tmpgrubrom="$(mkGrubRom "${keymap}" "${tmprom}")" + + newrom="${romdir}/${payload1}_${board}_${initmode}_" + newrom="${newrom}${displaymode}_${keymap}.rom" + [ "${initmode}" = "normal" ] && \ + newrom="${romdir}/${payload1}_${board}_" && \ + newrom="${newrom}${initmode}_${keymap}.rom" + x_ moverom "${tmpgrubrom}" "${newrom}" + x_ rm -f "${tmpgrubrom}" + done +} + +# make a rom in /tmp/ and then print the path of that ROM +mkGrubRom() { + _keymap="${1}" + _cbrom="${2}" + + keymapcfg="elf/grub/keymap_${_keymap}.cfg" + + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + x_ cp "${_cbrom}" "${tmprom}" + x_ "${cbfstool}" "${tmprom}" add -f "${keymapcfg}" -n keymap.cfg -t raw + + printf "%s\n" "${tmprom}" +} + +# make a rom in /tmp/ and then print the path of that ROM +mkSeabiosRom() { + _cbrom="${1}" # rom to insert seabios in. will not be touched + # (a tmpfile will be made instead) + _seabios_cbfs_path="${2}" # e.g. fallback/payload + _seabioself="elf/seabios/default/${initmode}/bios.bin.elf" + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + + x_ cp "${_cbrom}" "${tmprom}" + x_ "${cbfstool}" "${tmprom}" add-payload -f "${_seabioself}" \ + -n ${_seabios_cbfs_path} -c lzma + 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" ] || \ + x_ "${cbfstool}" "${tmprom}" add -f "${seavgabiosrom}" \ + -n vgaroms/seavgabios.bin -t raw + + printf "%s\n" "${tmprom}" +} + +build_uboot_roms() +{ + tmprom="$(mkUbootRom "${cbrom}" "fallback/payload")" + newrom="${romdir}/uboot_payload_${board}_${initmode}_${displaymode}.rom" + [ "${initmode}" = "normal" ] && \ + newrom="${romdir}/uboot_payload_${board}_${initmode}.rom" + x_ moverom "${tmprom}" "${newrom}" + x_ rm -f "${tmprom}" +} + +# make a rom in /tmp/ and then print the path of that ROM +mkUbootRom() { + _cbrom="${1}" + _uboot_cbfs_path="${2}" + + _ubdir="elf/u-boot/${board}/${uboot_config}" + _ubootelf="${_ubdir}/u-boot.elf" + [ -f "${_ubootelf}" ] || _ubootelf="${_ubdir}/u-boot" + [ -f "${_ubootelf}" ] || err "mkUbootRom: ${board}: cant find u-boot" + + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + + x_ cp "${_cbrom}" "${tmprom}" + x_ "${cbfstool}" "${tmprom}" add-payload -f "${_ubootelf}" \ + -n ${_uboot_cbfs_path} -c lzma + + printf "%s\n" "${tmprom}" +} + +# it is assumed that no other work will be done on the ROM +# after calling this function. therefore this function is "final" +moverom() { + rompath="${1}" + newrom="${2}" + + printf "Creating target image: %s\n" "${newrom}" + + [ -d "${newrom%/*}" ] || x_ mkdir -p "${newrom%/*}/" + [ "${vendorfiles}" = "n" ] && newrom="${newrom%.rom}_noblobs.rom" + x_ cp "${rompath}" "${newrom}" +} + +usage() +{ + cat <<- EOF + USAGE: ./build roms targetname + To build *all* boards, do this: ./build roms all + To list *all* boards, do this: ./build roms list + + Optional Flags: + -d: displaymode + -p: payload + -k: keyboard layout + + Example commands: + + ./build roms x60 + ./build roms x200_8mb x60 + ./build roms x60 -p grub -d corebootfb -k usqwerty + + possible values for 'target': + $(items "config/coreboot") + + Refer to the ${projectname} documentation for more information. + EOF +} + +main $@ diff --git a/script/build/serprog b/script/build/serprog new file mode 100755 index 00000000..43251acd --- /dev/null +++ b/script/build/serprog @@ -0,0 +1,81 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2023 Riku Viitanen + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +. "include/err.sh" + +eval "$(setvars "" platform pico_sdk_dir pico_src_dir stm32_src_dir boards_dir)" + +pico_src_dir=src/pico-serprog +pico_sdk_dir=src/pico-sdk +stm32_src_dir=src/stm32-vserprog + +usage="usage: ./build firmware serprog [board]" + +main() +{ + [ -z "${1+x}" ] && err "${usage}" + if [ "${1}" = "rp2040" ]; then + platform="rp2040" + boards_dir=${pico_sdk_dir}/src/boards/include/boards + [ -d "${pico_src_dir}/" ] || \ + x_ ./update trees -f "rpi-pico-serprog" + elif [ "${1}" = "stm32" ]; then + platform="stm32" + boards_dir=${stm32_src_dir}/boards + [ -d "${stm32_src_dir}/" ] || \ + x_ ./update trees -f "stm32-vserprog" + else + err "${usage}" + fi + x_ mkdir -p "bin/serprog_${platform}" + + if [ $# -gt 1 ] ; then + [ "${2}" = "list" ] && print_boards ${boards_dir} && return 0 + build_${platform}_rom "${2}" + else + printf "Building all serprog targets\n" + list_boards "${boards_dir}" | while read board; do + build_${platform}_rom "${board}" + done + fi +} + +build_rp2040_rom() +{ + board=${1} + printf "Building pico-serprog for ${board}\n" + x_ cmake -DPICO_BOARD="${board}" -DPICO_SDK_PATH="${pico_sdk_dir}" \ + -B "${pico_src_dir}/build" "${pico_src_dir}" + x_ cmake --build "${pico_src_dir}/build" + x_ mv ${pico_src_dir}/build/pico_serprog.uf2 \ + bin/serprog_rp2040/serprog_${board}.uf2 + printf "output to bin/serprog_rp2040/serprog_${board}.uf2\n" +} + +build_stm32_rom() +{ + board=${1} + printf "Building stm32-vserprog for ${board}\n" + x_ make -C ${stm32_src_dir} libopencm3-just-make BOARD=${board} + x_ make -C ${stm32_src_dir} BOARD=${board} + x_ mv ${stm32_src_dir}/stm32-vserprog.hex \ + bin/serprog_stm32/serprog_${board}.hex + printf "output to bin/serprog_stm32/serprog_${board}.hex\n" +} + +print_boards() +{ + printf "Available boards:\n" + list_boards "${1}" +} + +list_boards() +{ + basename -a -s .h ${1}/*.h +} + +main $@ diff --git a/script/update/project/release b/script/update/project/release deleted file mode 100755 index e7973537..00000000 --- a/script/update/project/release +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: MIT -# SPDX-FileCopyrightText: 2020-2023 Leah Rowe - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" -. "include/option.sh" - -eval "$(setvars "" vdir relname src_dirname srcdir _nogit _xm target romdir \ - microcode_required mode)" - -_f="coreboot u-boot seabios flashrom grub memtest86plus uefitool" -_f="${_f} bios_extract biosutilities pico-serprog stm32-vserprog" -_f="${_f} rpi-pico-serprog" - -main() -{ - vdir="release" - while getopts d:m: option; do - [ -z "${OPTARG}" ] && err "Empty argument not allowed" - case "${option}" in - d) vdir="${OPTARG}" ;; - m) mode="${OPTARG}" ;; - *) err "Invalid option" ;; - esac - done - - vdir="${vdir}/${version}" - relname="${projectname}-${version}" - src_dirname="${relname}_src" - srcdir="${vdir}/${src_dirname}" - - [ -e "${vdir}" ] && err "already exists: \"${vdir}\"" - - mkvdir - build_release -} - -mkvdir() -{ - mkdir -p "${vdir}" || err "mkvdir: !mkdir -p \"${vdir}\"" - - git_init || err "mkvdir: !git_init \"${vdir}\"" - git clone . "${srcdir}" || err "mkdir: !gitclone \"${srcdir}\"" - [ -z "${_nogit}" ] || x_ rm -Rf ".git" - - rm -Rf "${srcdir}/.git" - insert_version_files "${srcdir}" || err "mkvdir ${srcdir}: versionfile" -} - -# release archives contain .gitignore, but not .git. -# this script can be run from lbmk.git, or an archive. -git_init() -{ - [ -L ".git" ] && err "Reference .git is a symlink" - [ -e ".git" ] && return 0 - eval "$(setvars "$(date -Rd @${versiondate})" cdate _nogit)" - - git init || return 1 - git add -A . || return 1 - git commit -m "${projectname} ${version}" --date "${cdate}" || return 1 - git tag -a "${version}" -m "${projectname} ${version}" || return 1 -} - -build_release() -{ - _xm="build_release ${vdir}" - ( - cd "${srcdir}" || err "${_xm}: !cd \"${srcdir}\"" - fetch_trees - ) - ( - cd "${srcdir%/*}" || err "${_xm}: mktarball \"${srcdir}\"" - mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "${_xm}: mksrc" - ) - if [ "${mode}" != "src" ]; then - ( - cd "${srcdir}" || err "${_xm}: 2 !cd \"${srcdir}\"" - mkrom_images - ) - fi - rm -Rf "${srcdir}" || err "${_xm}: !rm -Rf \"${srcdir}\"" -} - -fetch_trees() -{ - for x in ${_f}; do - ./update project trees -f "${x}" || err "${_xm}: fetch ${x}" - done - for x in config/*/build.list; do - [ -f "${x}" ] || continue - xp="${x#*/}"; xp="${xp%/*}" - [ -L "${xp}" ] || x_ rm -Rf "src/${xp}/${xp}" - done - rm -Rf */.git* */*/.git* */*/*/.git* */*/*/*/.git* */*/*/*/*/.git* \ - */*/*/*/*/*/.git* */*/*/*/*/*/*/.git* */*/*/*/*/*/*/*/.git* \ - .git tmp || err "${_xm}: rm-dotgit" -} - -mkrom_images() -{ - ./build fw coreboot all || err "${_xm}: roms-all" - ./build fw serprog rp2040 || err "${_xm}: rp2040" - ./build fw serprog stm32 || err "${_xm}: stm32" - - for rombuild in bin/*; do - [ -d "${rombuild}" ] || continue - handle_rom_archive "${rombuild}" - done - - mv "release/${version}/roms/" ../roms || err "${_xm}: copy roms/" -} - -handle_rom_archive() -{ - builddir="${1}" - romdir="tmp/romdir" - x_ rm -Rf "${romdir}" - target="${builddir##*/}" - - if [ ! -f "config/coreboot/${target}/target.cfg" ]; then - # No config, just make a tarball - tarball="release/${version}/roms/${relname}_${target}.tar.xz" - insert_copying_files "${builddir}" - mktarball "${builddir}" "${tarball}" - return 0 - fi - - romdir="${romdir}/bin/${target}" - x_ mkdir -p "${romdir}" - x_ cp "${builddir}/"* "${romdir}" - - nukerom - - printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \ - "${version}" "${projectname}" "${version}" "${target##*/}" - insert_version_files "${romdir}" || \ - err "mkrom_tarball ${romdir}: versionfile" - - insert_copying_files "${romdir}" - mkrom_tarball -} - -nukerom() -{ - microcode_required="y" - . "config/coreboot/${target}/target.cfg" - if [ "${microcode_required}" != "y" ] && \ - [ "${microcode_required}" != "n" ]; then microcode_required="y"; fi - if [ "${microcode_required}" = "n" ]; then - for romfile in "${romdir}"/*.rom; do - [ -f "${romfile}" ] || continue - strip_ucode "${romfile}" - done - for romfile in "${romdir}"/*.tmprom; do - [ -f "${romfile}" ] || continue - x_ mv "${romfile}" "${romfile%.tmprom}.rom" - done - fi - - # Hash the images before removing vendor files - # which ./update vendor inject uses for verification - x_ rm -f "${romdir}/vendorhashes" - x_ touch "${romdir}/vendorhashes" - ( - x_ cd "${romdir}" - x_ sha512sum *.rom >> vendorhashes - ) - - for romfile in "${romdir}"/*.rom; do - [ -f "${romfile}" ] || continue - x_ ./update vendor inject -r "${romfile}" -b ${target} -n nuke - done -} - -strip_ucode() -{ - romfile=${1} - _newrom_b="${romfile%.rom}_nomicrocode.tmprom" - x_ cp "${romfile}" "${_newrom_b}" - microcode_present="y" - "${cbfstool}" "${_newrom_b}" remove -n \ - cpu_microcode_blob.bin 2>/dev/null || microcode_present="n" - [ "${microcode_present}" = "n" ] || return 0 - printf "REMARK: '%s' already lacks microcode\n" "${romfile}" 1>&2 - printf "Renaming default ROM file instead.\n" 1>&2 - x_ mv "${romfile}" "${_newrom_b}" -} - -insert_copying_files() -{ - x_ rm -Rf "${1}/licenses" - x_ mkdir -p "${1}/licenses" - l="${1}/licenses" - # copy licenses to rom image archive, for completion - x_ cp "src/grub/COPYING" "${l}/COPYING.grub" - x_ cp "src/coreboot/default/COPYING" "${l}/COPYING.coreboot" - x_ cp -R "src/coreboot/default/LICENSES" "${l}/LICENSES.coreboot" - x_ cp "src/seabios/default/COPYING" "${l}/COPYING.coreboot" - x_ cp "src/seabios/default/COPYING.LESSER" "${l}/COPYING.LESSER.seabios" - x_ cp -R "src/u-boot/default/Licenses" "${l}/COPYING.u-boot" -} - -mkrom_tarball() -{ - archivename="${relname}_${target##*/}" - f="release/${version}/roms/${archivename}" - x_ mkdir -p "${f%/*}" - ( - x_ cd "${romdir%/bin/${target}}" - mktarball "bin/${target}" "${archivename}.tar.xz" - ) - x_ mv "${romdir%/bin/${target}}/${archivename}.tar.xz"* "${f%/*}" - - printf "Created ROM archive: ${f%/*}/${archivename}.tar.xz" -} - -insert_version_files() -{ - printf "%s\n" "${version}" > "${1}/version" || return 1 - printf "%s\n" "${versiondate}" > "${1}/versiondate" || return 1 - printf "%s\n" "${projectname}" > "${1}/projectname" || return 1 -} - -mktarball() -{ - # preserve timestamps for reproducible tarballs - tar_implementation=$(tar --version | head -n1) || : - - [ "${2%/*}" = "${2}" ] || x_ mkdir -p "${2%/*}" - if [ "${tar_implementation% *}" = "tar (GNU tar)" ]; then - tar --sort=name --owner=root:0 --group=root:0 \ - --mtime="UTC 2023-10-14" -c "${1}" | xz -T0 -9e > "${2}" || \ - err "mktarball 1, ${1}" - else - # TODO: reproducible tarballs on non-GNU systems - tar -c "${1}" | xz -T0 -9e > "${2}" || err "mktarball 2, ${1}" - fi - ( - [ "${2%/*}" != "${2}" ] && x_ cd "${2%/*}" - x_ sha512sum "${2##*/}" > "${2##*/}.sha512" - ) -} - -main $@ diff --git a/script/update/project/trees b/script/update/project/trees deleted file mode 100755 index 7ba9a38b..00000000 --- a/script/update/project/trees +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-or-later -# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak -# SPDX-FileCopyrightText: 2022 Ferass El Hafidi -# SPDX-FileCopyrightText: 2023 Leah Rowe - -[ "x${DEBUG+set}" = 'xset' ] && set -v -set -u -e - -. "include/err.sh" -. "include/option.sh" -. "include/git.sh" - -export LOCALVERSION="-${projectname}-${version%%-*}" - -eval "$(setvars "" arch cfgsdir codedir config config_name crossgcc_ada mode \ - elfdir listfile project romtype target target_dir targets tree _f target1)" - -tmpclean="$(mktemp -d -t makeclean.XXXXXXXXXX)" - -main() -{ - while getopts f:b:m:u:c:x:s:l:n: option - do - _f="${1}" - case "${1}" in - -b) : ;; - -u) mode="oldconfig" ;; - -m) mode="menuconfig" ;; - -c) mode="distclean" ;; - -x) mode="crossgcc-clean" ;; - -f) mode="fetch" ;; - -s) mode="savedefconfig" ;; - -l) mode="olddefconfig" ;; - -n) mode="nconfig" ;; - *) err "Invalid option" ;; - esac - shift; project="${OPTARG#src/}"; shift - done - [ -z "${_f}" ] && err "flag not specified (-m, -u, -b, -c, -x, -f, -s, -l or -n)" - [ -z "${project}" ] && err "project name not specified" - - if [ ! -f "config/${project}/build.list" ]; then - build_projects $@ - else - build_targets $@ - fi -} - -build_projects() -{ - [ $# -gt 0 ] && x_ ./update project trees ${_f} ${@} - - if [ "${mode}" = "fetch" ]; then - fetch_project_repo - return 0 - fi - - codedir="src/${project}" - [ -d "${codedir}" ] || x_ ./update project trees -f "${project}" - - if [ "${project}" = "uefitool" ]; then - ( - x_ cd src/uefitool - cmake UEFIExtract/ || [ -f Makefile ] || \ - err "build_projects: !cmake UEFIExtract/" - ) - fi - - [ "${mode}" = "distclean" ] && mode="clean" - run_make_command || return 0 -} - -build_targets() -{ - elfdir="elf/${project}" - [ "${elfdir}" = "elf/coreboot" ] && \ - elfdir="elf/coreboot_nopayload_DO_NOT_FLASH" - - cfgsdir="config/${project}" - [ -d "${cfgsdir}" ] || err "directory, ${cfgsdir}, does not exist" - - listfile="${cfgsdir}/build.list" - [ -f "${listfile}" ] || err "list file, ${listfile}, does not exist" - - # Build for all targets if no argument is given - [ $# -gt 0 ] && target1="${1}" - [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && \ - shift 1 - targets=$(items "${cfgsdir}") || \ - err "Cannot get options for ${cfgsdir}" - [ $# -gt 0 ] && targets=$@ - - [ -z "${mode}" ] && x_ mkdir -p "${elfdir}/" - - handle_targets -} - -handle_targets() -{ - for x in ${targets}; do - target="${x}" - printf "Running 'make %s' for project '%s, target '%s''\n" \ - "${mode}" "${project}" "${target}" - [ "${project}" != "coreboot" ] || [ ! -z ${mode} ] || \ - x_ ./update vendor download ${target} - x_ handle_defconfig - done - - [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0 - [ -z "${mode}" ] || return 0 - printf "Done! The files are stored under %s/\n\n" "${elfdir}" -} - -handle_defconfig() -{ - handle_src_tree "${target}" || return 0 - - if [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ]; then - handle_coreboot_utils "${tree}" - return 0 - fi - - for y in "${target_dir}/config"/*; do - [ -f "${y}" ] || continue - config="${y}" - config_name="${config#${target_dir}/config/}" - - printf "handle/make/config %s %s: handling config %s\n" \ - "${project}" "${target}" "${config_name}" - - [ ! -z ${mode} ] || check_config || continue - handle_makefile - [ ! -z ${mode} ] || copy_elf - done -} - -handle_src_tree() -{ - romtype="normal" - target_dir="${cfgsdir}/${target}" - - if [ "${mode}" = "fetch" ]; then - fetch_project_trees - return 1 - fi - - x_ mkdir -p "${elfdir}/${target}" - eval "$(setvars "" arch tree)" - - . "${target_dir}/target.cfg" || \ - err "handle_src_tree ${target_dir}: cannot load target.cfg" - - [ -z "${tree}" ] && \ - err "handle_src_tree: ${target_dir}: tree undefined" - [ -z "${arch}" ] && \ - err "handle_src_tree: ${target_dir}: undefined cpu type" - - codedir="src/${project}/${tree}" - - if [ ! -d "${codedir}" ]; then - if [ "${mode}" = "distclean" ] || \ - [ "${mode}" = "crossgcc-clean" ]; then - printf "Directory %s doesn't exist; skipping clean\n" \ - "${codedir}" 1>&2 - return 1 - fi - x_ ./update project trees -f "${project}" "${target}" - elif [ "${mode}" = "distclean" ] || \ - [ "${mode}" = "crossgcc-clean" ]; then - [ -f "${tmpclean}/${tree}" ] && return 1 - touch "${tmpclean}/${tree}" - fi - - [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0 - [ "$project" != "coreboot" ] && [ "$project" != "u-boot" ] && return 0 - - # u-boot and coreboot are both compiled with coreboot's crossgcc - [ ! -z ${mode} ] || check_cross_compiler || \ - err "handle_src_tree ${project}/${target}: crossgcc" - cbfstool="cbutils/${tree}/cbfstool" - [ -f "${cbfstool}" ] && return 0 - x_ ./update project trees -b coreboot utils "${tree}" -} - -# set up cross-compiler (coreboot crossgcc) for u-boot and coreboot -# (seabios and grub currently use hostcc, not crossgcc) -check_cross_compiler() -{ - [ "${crossgcc_ada}" = "y" ] || [ "${crossgcc_ada}" = "n" ] || \ - crossgcc_ada="y" - [ "${crossgcc_ada}" != "y" ] && \ - export BUILD_LANGUAGES=c - - cbdir="src/coreboot/${tree}" - [ "${project}" != "coreboot" ] && \ - cbdir="src/coreboot/default" - - # only true if not building coreboot: - ctarget="${cbdir#src/coreboot/}" - [ -d "${cbdir}" ] || \ - x_ ./update project trees -f coreboot ${ctarget} - - if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then - [ -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ] || \ - make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc) || \ - return 1 - case "$(uname -m)" in - x86*|i*86|amd64) : ;; - *) export CROSS_COMPILE=i386-elf- ;; - esac - elif [ "${arch}" = "ARMv7" ]; then - [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \ - make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \ - return 1 - case "$(uname -m)" in - arm|arm32|armv6*|armv7*) : ;; - *) export CROSS_COMPILE=arm-eabi- ;; - esac - elif [ "${arch}" = "AArch64" ]; then - [ -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ] || \ - make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc) || \ - return 1 - # aarch64 also needs armv7 toolchain for arm-trusted-firmware - [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \ - make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \ - return 1 - case "$(uname -m)" in - arm64|aarch64) : ;; - *) export CROSS_COMPILE=aarch64-elf- ;; - esac - fi - - # we *must* ensure that u-boot's build system uses crossgcc first - export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH" -} - -check_config() -{ - [ ! -f "${config}" ] && \ - err "check_config: ${project}/${target}: configs missing" - - dest_dir="${elfdir}/${target}/${config_name}" - # TODO: very hacky check. do it properly (based on build.list) - for elftest in "${dest_dir}"/*; do - [ -f "${elftest}" ] || continue - printf "Build already exists, so skipping build\n" 1>&2 - return 1 - done - x_ mkdir -p "${dest_dir}" -} - -handle_makefile() -{ - x_ make clean -C "${codedir}" - x_ cp "${config}" "${codedir}/.config" - [ ! -z ${mode} ] || make -C "${codedir}" silentoldconfig || \ - make -C "${codedir}" oldconfig || : - - run_make_command || err "handle_makefile ${codedir}: no makefile!" - - if [ -e "${codedir}/.git" ] && [ "${project}" = "u-boot" ] && \ - [ "${mode}" = "distclean" ]; then - x_ git -C "${codedir}" clean -fdx - elif [ "${mode}" = "oldconfig" ] || [ "${mode}" = "olddefconfig" ] || \ - [ "${mode}" = "menuconfig" ] || [ "${mode}" = "nconfig" ]; then - x_ cp "${codedir}/.config" "${config}" - elif [ "${mode}" = "savedefconfig" ]; then - x_ cp "${codedir}/defconfig" "${config}" - fi -} - -run_make_command() -{ - [ -f "${codedir}/Makefile" ] || [ -f "${codedir}/makefile" ] || \ - [ -f "${codedir}/GNUmakefile" ] || return 1 - [ "${project}" = "coreboot" ] && [ -z "${mode}" ] && \ - x_ printf "%s\n" "${version%%-*}" >"${codedir}/.coreboot-version" - - x_ make ${mode} -j$(nproc) -C "${codedir}" - - [ "${mode}" != "clean" ] && return 0 - make -C "${codedir}" distclean 2>/dev/null || : -} - -copy_elf() -{ - [ "${project}" != "coreboot" ] || x_ modify_coreboot_rom - while read f; do - [ ! -f "${codedir}/$f" ] || \ - x_ cp "${codedir}/${f}" "${dest_dir}/" - done < ${listfile} - - x_ make clean -C "${codedir}" -} - -main $@ diff --git a/script/update/release b/script/update/release new file mode 100755 index 00000000..c60f36e5 --- /dev/null +++ b/script/update/release @@ -0,0 +1,247 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: MIT +# SPDX-FileCopyrightText: 2020-2023 Leah Rowe + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +. "include/err.sh" +. "include/option.sh" + +eval "$(setvars "" vdir relname src_dirname srcdir _nogit _xm target romdir \ + microcode_required mode)" + +_f="coreboot u-boot seabios flashrom grub memtest86plus uefitool" +_f="${_f} bios_extract biosutilities pico-serprog stm32-vserprog" +_f="${_f} rpi-pico-serprog" + +main() +{ + vdir="release" + while getopts d:m: option; do + [ -z "${OPTARG}" ] && err "Empty argument not allowed" + case "${option}" in + d) vdir="${OPTARG}" ;; + m) mode="${OPTARG}" ;; + *) err "Invalid option" ;; + esac + done + + vdir="${vdir}/${version}" + relname="${projectname}-${version}" + src_dirname="${relname}_src" + srcdir="${vdir}/${src_dirname}" + + [ -e "${vdir}" ] && err "already exists: \"${vdir}\"" + + mkvdir + build_release +} + +mkvdir() +{ + mkdir -p "${vdir}" || err "mkvdir: !mkdir -p \"${vdir}\"" + + git_init || err "mkvdir: !git_init \"${vdir}\"" + git clone . "${srcdir}" || err "mkdir: !gitclone \"${srcdir}\"" + [ -z "${_nogit}" ] || x_ rm -Rf ".git" + + rm -Rf "${srcdir}/.git" + insert_version_files "${srcdir}" || err "mkvdir ${srcdir}: versionfile" +} + +# release archives contain .gitignore, but not .git. +# this script can be run from lbmk.git, or an archive. +git_init() +{ + [ -L ".git" ] && err "Reference .git is a symlink" + [ -e ".git" ] && return 0 + eval "$(setvars "$(date -Rd @${versiondate})" cdate _nogit)" + + git init || return 1 + git add -A . || return 1 + git commit -m "${projectname} ${version}" --date "${cdate}" || return 1 + git tag -a "${version}" -m "${projectname} ${version}" || return 1 +} + +build_release() +{ + _xm="build_release ${vdir}" + ( + cd "${srcdir}" || err "${_xm}: !cd \"${srcdir}\"" + fetch_trees + ) + ( + cd "${srcdir%/*}" || err "${_xm}: mktarball \"${srcdir}\"" + mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "${_xm}: mksrc" + ) + if [ "${mode}" != "src" ]; then + ( + cd "${srcdir}" || err "${_xm}: 2 !cd \"${srcdir}\"" + mkrom_images + ) + fi + rm -Rf "${srcdir}" || err "${_xm}: !rm -Rf \"${srcdir}\"" +} + +fetch_trees() +{ + for x in ${_f}; do + ./update trees -f "${x}" || err "${_xm}: fetch ${x}" + done + for x in config/*/build.list; do + [ -f "${x}" ] || continue + xp="${x#*/}"; xp="${xp%/*}" + [ -L "${xp}" ] || x_ rm -Rf "src/${xp}/${xp}" + done + rm -Rf */.git* */*/.git* */*/*/.git* */*/*/*/.git* */*/*/*/*/.git* \ + */*/*/*/*/*/.git* */*/*/*/*/*/*/.git* */*/*/*/*/*/*/*/.git* \ + .git tmp || err "${_xm}: rm-dotgit" +} + +mkrom_images() +{ + ./build roms all || err "${_xm}: roms-all" + ./build serprog rp2040 || err "${_xm}: rp2040" + ./build serprog stm32 || err "${_xm}: stm32" + + for rombuild in bin/*; do + [ -d "${rombuild}" ] || continue + handle_rom_archive "${rombuild}" + done + + mv "release/${version}/roms/" ../roms || err "${_xm}: copy roms/" +} + +handle_rom_archive() +{ + builddir="${1}" + romdir="tmp/romdir" + x_ rm -Rf "${romdir}" + target="${builddir##*/}" + + if [ ! -f "config/coreboot/${target}/target.cfg" ]; then + # No config, just make a tarball + tarball="release/${version}/roms/${relname}_${target}.tar.xz" + insert_copying_files "${builddir}" + mktarball "${builddir}" "${tarball}" + return 0 + fi + + romdir="${romdir}/bin/${target}" + x_ mkdir -p "${romdir}" + x_ cp "${builddir}/"* "${romdir}" + + nukerom + + printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \ + "${version}" "${projectname}" "${version}" "${target##*/}" + insert_version_files "${romdir}" || \ + err "mkrom_tarball ${romdir}: versionfile" + + insert_copying_files "${romdir}" + mkrom_tarball +} + +nukerom() +{ + microcode_required="y" + . "config/coreboot/${target}/target.cfg" + if [ "${microcode_required}" != "y" ] && \ + [ "${microcode_required}" != "n" ]; then microcode_required="y"; fi + if [ "${microcode_required}" = "n" ]; then + for romfile in "${romdir}"/*.rom; do + [ -f "${romfile}" ] || continue + strip_ucode "${romfile}" + done + for romfile in "${romdir}"/*.tmprom; do + [ -f "${romfile}" ] || continue + x_ mv "${romfile}" "${romfile%.tmprom}.rom" + done + fi + + # Hash the images before removing vendor files + # which "./vendor inject" uses for verification + x_ rm -f "${romdir}/vendorhashes" + x_ touch "${romdir}/vendorhashes" + ( + x_ cd "${romdir}" + x_ sha512sum *.rom >> vendorhashes + ) + + for romfile in "${romdir}"/*.rom; do + [ -f "${romfile}" ] || continue + x_ ./vendor inject -r "${romfile}" -b ${target} -n nuke + done +} + +strip_ucode() +{ + romfile=${1} + _newrom_b="${romfile%.rom}_nomicrocode.tmprom" + x_ cp "${romfile}" "${_newrom_b}" + microcode_present="y" + "${cbfstool}" "${_newrom_b}" remove -n \ + cpu_microcode_blob.bin 2>/dev/null || microcode_present="n" + [ "${microcode_present}" = "n" ] || return 0 + printf "REMARK: '%s' already lacks microcode\n" "${romfile}" 1>&2 + printf "Renaming default ROM file instead.\n" 1>&2 + x_ mv "${romfile}" "${_newrom_b}" +} + +insert_copying_files() +{ + x_ rm -Rf "${1}/licenses" + x_ mkdir -p "${1}/licenses" + l="${1}/licenses" + # copy licenses to rom image archive, for completion + x_ cp "src/grub/COPYING" "${l}/COPYING.grub" + x_ cp "src/coreboot/default/COPYING" "${l}/COPYING.coreboot" + x_ cp -R "src/coreboot/default/LICENSES" "${l}/LICENSES.coreboot" + x_ cp "src/seabios/default/COPYING" "${l}/COPYING.coreboot" + x_ cp "src/seabios/default/COPYING.LESSER" "${l}/COPYING.LESSER.seabios" + x_ cp -R "src/u-boot/default/Licenses" "${l}/COPYING.u-boot" +} + +mkrom_tarball() +{ + archivename="${relname}_${target##*/}" + f="release/${version}/roms/${archivename}" + x_ mkdir -p "${f%/*}" + ( + x_ cd "${romdir%/bin/${target}}" + mktarball "bin/${target}" "${archivename}.tar.xz" + ) + x_ mv "${romdir%/bin/${target}}/${archivename}.tar.xz"* "${f%/*}" + + printf "Created ROM archive: ${f%/*}/${archivename}.tar.xz" +} + +insert_version_files() +{ + printf "%s\n" "${version}" > "${1}/version" || return 1 + printf "%s\n" "${versiondate}" > "${1}/versiondate" || return 1 + printf "%s\n" "${projectname}" > "${1}/projectname" || return 1 +} + +mktarball() +{ + # preserve timestamps for reproducible tarballs + tar_implementation=$(tar --version | head -n1) || : + + [ "${2%/*}" = "${2}" ] || x_ mkdir -p "${2%/*}" + if [ "${tar_implementation% *}" = "tar (GNU tar)" ]; then + tar --sort=name --owner=root:0 --group=root:0 \ + --mtime="UTC 2023-10-14" -c "${1}" | xz -T0 -9e > "${2}" || \ + err "mktarball 1, ${1}" + else + # TODO: reproducible tarballs on non-GNU systems + tar -c "${1}" | xz -T0 -9e > "${2}" || err "mktarball 2, ${1}" + fi + ( + [ "${2%/*}" != "${2}" ] && x_ cd "${2%/*}" + x_ sha512sum "${2##*/}" > "${2##*/}.sha512" + ) +} + +main $@ diff --git a/script/update/trees b/script/update/trees new file mode 100755 index 00000000..926159cf --- /dev/null +++ b/script/update/trees @@ -0,0 +1,297 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2022-2023 Alper Nebi Yasak +# SPDX-FileCopyrightText: 2022 Ferass El Hafidi +# SPDX-FileCopyrightText: 2023 Leah Rowe + +[ "x${DEBUG+set}" = 'xset' ] && set -v +set -u -e + +. "include/err.sh" +. "include/option.sh" +. "include/git.sh" + +export LOCALVERSION="-${projectname}-${version%%-*}" + +eval "$(setvars "" arch cfgsdir codedir config config_name crossgcc_ada mode \ + elfdir listfile project romtype target target_dir targets tree _f target1)" + +tmpclean="$(mktemp -d -t makeclean.XXXXXXXXXX)" + +main() +{ + while getopts f:b:m:u:c:x:s:l:n: option + do + _f="${1}" + case "${1}" in + -b) : ;; + -u) mode="oldconfig" ;; + -m) mode="menuconfig" ;; + -c) mode="distclean" ;; + -x) mode="crossgcc-clean" ;; + -f) mode="fetch" ;; + -s) mode="savedefconfig" ;; + -l) mode="olddefconfig" ;; + -n) mode="nconfig" ;; + *) err "Invalid option" ;; + esac + shift; project="${OPTARG#src/}"; shift + done + [ -z "${_f}" ] && err "flag not specified (-m, -u, -b, -c, -x, -f, -s, -l or -n)" + [ -z "${project}" ] && err "project name not specified" + + if [ ! -f "config/${project}/build.list" ]; then + build_projects $@ + else + build_targets $@ + fi +} + +build_projects() +{ + [ $# -gt 0 ] && x_ ./update trees ${_f} ${@} + + if [ "${mode}" = "fetch" ]; then + fetch_project_repo + return 0 + fi + + codedir="src/${project}" + [ -d "${codedir}" ] || x_ ./update trees -f "${project}" + + if [ "${project}" = "uefitool" ]; then + ( + x_ cd src/uefitool + cmake UEFIExtract/ || [ -f Makefile ] || \ + err "build_projects: !cmake UEFIExtract/" + ) + fi + + [ "${mode}" = "distclean" ] && mode="clean" + run_make_command || return 0 +} + +build_targets() +{ + elfdir="elf/${project}" + [ "${elfdir}" = "elf/coreboot" ] && \ + elfdir="elf/coreboot_nopayload_DO_NOT_FLASH" + + cfgsdir="config/${project}" + [ -d "${cfgsdir}" ] || err "directory, ${cfgsdir}, does not exist" + + listfile="${cfgsdir}/build.list" + [ -f "${listfile}" ] || err "list file, ${listfile}, does not exist" + + # Build for all targets if no argument is given + [ $# -gt 0 ] && target1="${1}" + [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && \ + shift 1 + targets=$(items "${cfgsdir}") || \ + err "Cannot get options for ${cfgsdir}" + [ $# -gt 0 ] && targets=$@ + + [ -z "${mode}" ] && x_ mkdir -p "${elfdir}/" + + handle_targets +} + +handle_targets() +{ + for x in ${targets}; do + target="${x}" + printf "Running 'make %s' for project '%s, target '%s''\n" \ + "${mode}" "${project}" "${target}" + [ "${project}" != "coreboot" ] || [ ! -z ${mode} ] || \ + x_ ./vendor download ${target} + x_ handle_defconfig + done + + [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0 + [ -z "${mode}" ] || return 0 + printf "Done! The files are stored under %s/\n\n" "${elfdir}" +} + +handle_defconfig() +{ + handle_src_tree "${target}" || return 0 + + if [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ]; then + handle_coreboot_utils "${tree}" + return 0 + fi + + for y in "${target_dir}/config"/*; do + [ -f "${y}" ] || continue + config="${y}" + config_name="${config#${target_dir}/config/}" + + printf "handle/make/config %s %s: handling config %s\n" \ + "${project}" "${target}" "${config_name}" + + [ ! -z ${mode} ] || check_config || continue + handle_makefile + [ ! -z ${mode} ] || copy_elf + done +} + +handle_src_tree() +{ + romtype="normal" + target_dir="${cfgsdir}/${target}" + + if [ "${mode}" = "fetch" ]; then + fetch_project_trees + return 1 + fi + + x_ mkdir -p "${elfdir}/${target}" + eval "$(setvars "" arch tree)" + + . "${target_dir}/target.cfg" || \ + err "handle_src_tree ${target_dir}: cannot load target.cfg" + + [ -z "${tree}" ] && \ + err "handle_src_tree: ${target_dir}: tree undefined" + [ -z "${arch}" ] && \ + err "handle_src_tree: ${target_dir}: undefined cpu type" + + codedir="src/${project}/${tree}" + + if [ ! -d "${codedir}" ]; then + if [ "${mode}" = "distclean" ] || \ + [ "${mode}" = "crossgcc-clean" ]; then + printf "Directory %s doesn't exist; skipping clean\n" \ + "${codedir}" 1>&2 + return 1 + fi + x_ ./update trees -f "${project}" "${target}" + elif [ "${mode}" = "distclean" ] || \ + [ "${mode}" = "crossgcc-clean" ]; then + [ -f "${tmpclean}/${tree}" ] && return 1 + touch "${tmpclean}/${tree}" + fi + + [ "${target1}" = "utils" ] && [ "${project}" = "coreboot" ] && return 0 + [ "$project" != "coreboot" ] && [ "$project" != "u-boot" ] && return 0 + + # u-boot and coreboot are both compiled with coreboot's crossgcc + [ ! -z ${mode} ] || check_cross_compiler || \ + err "handle_src_tree ${project}/${target}: crossgcc" + cbfstool="cbutils/${tree}/cbfstool" + [ -f "${cbfstool}" ] && return 0 + x_ ./update trees -b coreboot utils "${tree}" +} + +# set up cross-compiler (coreboot crossgcc) for u-boot and coreboot +# (seabios and grub currently use hostcc, not crossgcc) +check_cross_compiler() +{ + [ "${crossgcc_ada}" = "y" ] || [ "${crossgcc_ada}" = "n" ] || \ + crossgcc_ada="y" + [ "${crossgcc_ada}" != "y" ] && \ + export BUILD_LANGUAGES=c + + cbdir="src/coreboot/${tree}" + [ "${project}" != "coreboot" ] && \ + cbdir="src/coreboot/default" + + # only true if not building coreboot: + ctarget="${cbdir#src/coreboot/}" + [ -d "${cbdir}" ] || \ + x_ ./update trees -f coreboot ${ctarget} + + if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then + [ -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ] || \ + make -C "${cbdir}" crossgcc-i386 CPUS=$(nproc) || \ + return 1 + case "$(uname -m)" in + x86*|i*86|amd64) : ;; + *) export CROSS_COMPILE=i386-elf- ;; + esac + elif [ "${arch}" = "ARMv7" ]; then + [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \ + make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \ + return 1 + case "$(uname -m)" in + arm|arm32|armv6*|armv7*) : ;; + *) export CROSS_COMPILE=arm-eabi- ;; + esac + elif [ "${arch}" = "AArch64" ]; then + [ -d "${cbdir}/util/crossgcc/xgcc/aarch64-elf/" ] || \ + make -C "${cbdir}" crossgcc-aarch64 CPUS=$(nproc) || \ + return 1 + # aarch64 also needs armv7 toolchain for arm-trusted-firmware + [ -d "${cbdir}/util/crossgcc/xgcc/arm-eabi/" ] || \ + make -C "${cbdir}" crossgcc-arm CPUS=$(nproc) || \ + return 1 + case "$(uname -m)" in + arm64|aarch64) : ;; + *) export CROSS_COMPILE=aarch64-elf- ;; + esac + fi + + # we *must* ensure that u-boot's build system uses crossgcc first + export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH" +} + +check_config() +{ + [ ! -f "${config}" ] && \ + err "check_config: ${project}/${target}: configs missing" + + dest_dir="${elfdir}/${target}/${config_name}" + # TODO: very hacky check. do it properly (based on build.list) + for elftest in "${dest_dir}"/*; do + [ -f "${elftest}" ] || continue + printf "Build already exists, so skipping build\n" 1>&2 + return 1 + done + x_ mkdir -p "${dest_dir}" +} + +handle_makefile() +{ + x_ make clean -C "${codedir}" + x_ cp "${config}" "${codedir}/.config" + [ ! -z ${mode} ] || make -C "${codedir}" silentoldconfig || \ + make -C "${codedir}" oldconfig || : + + run_make_command || err "handle_makefile ${codedir}: no makefile!" + + if [ -e "${codedir}/.git" ] && [ "${project}" = "u-boot" ] && \ + [ "${mode}" = "distclean" ]; then + x_ git -C "${codedir}" clean -fdx + elif [ "${mode}" = "oldconfig" ] || [ "${mode}" = "olddefconfig" ] || \ + [ "${mode}" = "menuconfig" ] || [ "${mode}" = "nconfig" ]; then + x_ cp "${codedir}/.config" "${config}" + elif [ "${mode}" = "savedefconfig" ]; then + x_ cp "${codedir}/defconfig" "${config}" + fi +} + +run_make_command() +{ + [ -f "${codedir}/Makefile" ] || [ -f "${codedir}/makefile" ] || \ + [ -f "${codedir}/GNUmakefile" ] || return 1 + [ "${project}" = "coreboot" ] && [ -z "${mode}" ] && \ + x_ printf "%s\n" "${version%%-*}" >"${codedir}/.coreboot-version" + + x_ make ${mode} -j$(nproc) -C "${codedir}" + + [ "${mode}" != "clean" ] && return 0 + make -C "${codedir}" distclean 2>/dev/null || : +} + +copy_elf() +{ + [ "${project}" != "coreboot" ] || x_ modify_coreboot_rom + while read f; do + [ ! -f "${codedir}/$f" ] || \ + x_ cp "${codedir}/${f}" "${dest_dir}/" + done < ${listfile} + + x_ make clean -C "${codedir}" +} + +main $@ diff --git a/script/update/vendor/download b/script/update/vendor/download deleted file mode 100755 index b5618c3b..00000000 --- a/script/update/vendor/download +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-only -# SPDX-FileCopyrightText: 2022 Caleb La Grange -# SPDX-FileCopyrightText: 2022 Ferass El Hafidi -# SPDX-FileCopyrightText: 2023 Leah Rowe - -. "include/err.sh" -. "include/option.sh" -. "include/mrc.sh" - -export PATH="${PATH}:/sbin" - -_ua="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" -_7ztest="a" - -e6400_unpack="${PWD}/src/bios_extract/dell_inspiron_1100_unpacker.py" -kbc1126_ec_dump="${PWD}/${cbdir}/util/kbc1126/kbc1126_ec_dump" -me7updateparser="${PWD}/util/me7_update_parser/me7_update_parser.py" -mecleaner="${PWD}/${cbdir}/util/me_cleaner/me_cleaner.py" -pfs_extract="${PWD}/src/biosutilities/Dell_PFS_Extract.py" -uefiextract="${PWD}/src/uefitool/uefiextract" - -eval "$(setvars "" _b _dl EC_url EC_url_bkup EC_hash DL_hash DL_url DL_url_bkup \ - E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \ - E6400_VGA_romname SCH5545EC_DL_url SCH5545EC_DL_url_bkup SCH5545EC_DL_hash)" - -main() -{ - [ $# -gt 0 ] || err "No argument given" - board="${1}" - boarddir="${cbcfgsdir}/${board}" - _b="${board%%_*mb}" # shorthand (avoid duplicating config per rom size) - - check_defconfig "${boarddir}" || exit 0 - detect_firmware && exit 0 - scan_config "${_b}" "config/vendor" "err" - - build_dependencies - download_vendorfiles -} - -detect_firmware() -{ - set -- "${boarddir}/config/"* - . "${1}" 2>/dev/null - - for c in CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \ - CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW; do - eval "[ -z \"\${${c}}\" ] || return 1" - done - printf "Vendor files not needed for: %s\n" "${board}" 1>&2 -} - -build_dependencies() -{ - [ -d ${cbdir} ] || \ - x_ ./update project trees -f coreboot ${cbdir##*/} - for d in uefitool biosutilities bios_extract; do - [ -d "src/${d}" ] && continue - x_ ./update project trees -f "${d}" - done - [ -f "${uefiextract}" ] || \ - x_ ./update project trees -b uefitool - [ -f "${kbc1126_ec_dump}" ] || \ - x_ make -C "${cbdir}/util/kbc1126" - [ -f "${cbfstool}" ] && [ -f "${ifdtool}" ] && return 0 - x_ ./update project trees -b coreboot utils default -} - -download_vendorfiles() -{ - [ -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}" ] && return 0 - fetch "mrc" "$MRC_url" "$MRC_url_bkup" "$MRC_hash" "$CONFIG_MRC_FILE" -} - -fetch() -{ - dl_type="${1}" - dl="${2}" - dl_bkup="${3}" - dlsum="${4}" - [ "${5# }" = "${5}" ] || err "fetch: space not allowed in _dest: '${5}'" - [ "${5#/}" = "${5}" ] || err "fetch: absolute path not allowed: '${5}'" - _dest="${5##*../}" - _dl="${vendir}/cache/${dlsum}" - - x_ mkdir -p "${_dl%/*}" - - dl_fail="y" - 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}" - curl --location --retry 3 -A "${_ua}" "${url}" -o "${_dl}" || \ - wget --tries 3 -U "${_ua}" "${url}" -O "${_dl}" || \ - continue - vendor_checksum "${dlsum}" "${_dl}" && dl_fail="n" - done - [ "${dl_fail}" = "y" ] && \ - err "fetch ${dlsum}: matched file unavailable" - - x_ rm -Rf "${_dl}_extracted" - mkdirs "${_dest}" "extract_${dl_type}" || return 0 - eval "extract_${dl_type}" - - [ -f "${_dest}" ] && return 0 - err "extract_${dl_type} (fetch): missing file: '${_dest}'" -} - -vendor_checksum() -{ - [ "$(sha512sum ${2} | awk '{print $1}')" != "${1}" ] || return 0 - printf "Bad checksum for file: %s\n" "${2}" 1>&2 - rm -f "${2}" || : - return 1 -} - -mkdirs() -{ - [ -f "${1}" ] && \ - printf "mkdirs ${1} ${2}: already downloaded\n" 1>&2 && return 1 - x_ mkdir -p "${1%/*}" - x_ rm -Rf "${appdir}" - x_ mkdir -p "${appdir}/" - extract_archive "${_dl}" "${appdir}" || \ - [ "${2}" = "extract_e6400vga" ] || err "mkdirs ${1} ${2}: !extract" -} - -extract_intel_me() -{ - _me="${PWD}/${_dest}" # must always be an absolute path - cdir="${PWD}/${appdir}" # must always be an absolute path - [ $# -gt 0 ] && _me="${1}" - [ $# -gt 0 ] && cdir="${2}" - [ -f "${_me}" ] && return 0 - - sdir="$(mktemp -d)" - mkdir -p "${sdir}" || err "extract_intel_me: !mkdir -p \"${sdir}\"" - ( - cd "${cdir}" || err "extract_intel_me: !cd \"${cdir}\"" - for i in *; do - [ -f "${_me}" ] && break - [ -L "${i}" ] && continue - if [ -f "${i}" ]; then - "${mecleaner}" -r -t -O "${sdir}/vendorfile" \ - -M "${_me}" "${i}" && break - "${mecleaner}" -r -t -O "${_me}" "${i}" && break - "${me7updateparser}" -O "${_me}" "${i}" && break - _7ztest="${_7ztest}a" - extract_archive "${i}" "${_7ztest}" || continue - extract_intel_me "${_me}" "${cdir}/${_7ztest}" - elif [ -d "$i" ]; then - extract_intel_me "${_me}" "${cdir}/${i}" - else - continue - fi - cdir="${1}" - cd "${cdir}" - done - ) - rm -Rf "${sdir}" || err "extract_intel_me: !rm -Rf ${sdir}" -} - -extract_archive() -{ - innoextract "${1}" -d "${2}" || python "${pfs_extract}" "${1}" -e || \ - 7z x "${1}" -o"${2}" || unar "${1}" -o "${2}" || \ - unzip "${1}" -d "${2}" || return 1 -} - -extract_kbc1126ec() -{ - ( - 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 || \ - x_ unar -D 68*.CAB Rom.bin - x_ mv Rom.bin ec.bin - fi - [ -f ec.bin ] || err "extract_kbc1126_ec ${board}: can't extract" - "${kbc1126_ec_dump}" ec.bin || \ - err "extract_kbc1126_ec ${board}: can't extract ecfw1/2.bin" - ) - ec_ex="y" - for i in 1 2; do - [ -f "${appdir}/ec.bin.fw${i}" ] || ec_ex="n" - done - [ "${ec_ex}" = "y" ] || \ - err "extract_kbc1126_ec ${board}: didn't extract ecfw1/2.bin" - x_ cp "${appdir}/"ec.bin.fw* "${_dest%/*}/" -} - -extract_e6400vga() -{ - [ "${E6400_VGA_offset}" = "" ] && \ - err "extract_e6400vga: E6400 VGA offset not defined" - [ "${E6400_VGA_romname}" = "" ] && \ - err "extract_e6400vga: E6400 VGA ROM name not defined" - 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" - [ -f "${E6400_VGA_romname}" ] || \ - err "extract_e6400vga: can't extract vga rom from bios.bin" - ) - x_ cp "${appdir}/${E6400_VGA_romname}" "${_dest}" -} - -extract_sch5545ec() -{ - # full system ROM (UEFI), to extract with UEFIExtract: - _bios="${_dl}_extracted/Firmware" - _bios="${_bios}/1 ${dlsum} -- 1 System BIOS vA.28.bin" - # this is the SCH5545 firmware, inside of the extracted UEFI ROM: - _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! - - # this makes the file defined by _sch5545ec_fw available to copy - "${uefiextract}" "${_bios}" || \ - err "extract_sch5545ec: cannot extract from uefi image" - cp "${_sch5545ec_fw}" "${_dest}" || \ - err "extract_sch5545ec: cannot copy sch5545ec firmware file" -} - -main $@ diff --git a/script/update/vendor/inject b/script/update/vendor/inject deleted file mode 100755 index d156be25..00000000 --- a/script/update/vendor/inject +++ /dev/null @@ -1,248 +0,0 @@ -#!/usr/bin/env sh -# SPDX-License-Identifier: GPL-3.0-only -# SPDX-FileCopyrightText: 2022 Caleb La Grange -# SPDX-FileCopyrightText: 2022 Ferass El Hafidi -# SPDX-FileCopyrightText: 2023 Leah Rowe - -. "include/err.sh" -. "include/option.sh" - -nvmutil="util/nvmutil/nvm" - -eval "$(setvars "" archive rom modifygbe nukemode release new_mac)" - -main() -{ - [ $# -lt 1 ] && err "No options specified." - [ "${1}" = "listboards" ] && \ - items 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) modifygbe=true - new_mac=${OPTARG} ;; - esac - done - - check_board - build_dependencies - inject_vendorfiles - [ "${nukemode}" = "nuke" ] && return 0 - printf "Friendly reminder (this is *not* an error message):\n" - printf "Please always ensure that the files were inserted correctly.\n" -} - -check_board() -{ - if ! check_release "${archive}" ; then - [ -f "${rom}" ] || \ - err "check_board: \"${rom}\" is not a valid path" - [ -z "${rom+x}" ] && \ - err "check_board: no rom specified" - [ ! -z ${board+x} ] || \ - board=$(detect_board "${rom}") - else - release="y" - board=$(detect_board "${archive}") - fi - - boarddir="${cbcfgsdir}/${board}" - [ -d "${boarddir}" ] && return 0 - err "check_board: board ${board} not found" -} - -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_*) - 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: could not detect board type" - esac - [ -d "${boarddir}/" ] || \ - err "detect_board: dir, ${boarddir}, doesn't exist" - printf "%s\n" "${board}" -} - -build_dependencies() -{ - [ -d "${cbdir}" ] || x_ ./update project trees -f coreboot default - if [ ! -f "${cbfstool}" ] || [ ! -f "${ifdtool}" ]; then - x_ ./update project trees -b coreboot utils default - fi - [ -z "${new_mac}" ] || [ -f "${nvmutil}" ] || x_ make -C util/nvmutil - [ "${nukemode}" = "nuke" ] && return 0 - x_ ./update vendor download ${board} -} - -inject_vendorfiles() -{ - [ "${release}" != "y" ] && x_ patch_rom "${rom}" && return 0 - printf "patching release images\n" - patch_release_roms -} - -patch_release_roms() -{ - _tmpdir="tmp/romdir" - x_ rm -Rf "${_tmpdir}" - x_ mkdir -p "${_tmpdir}" - x_ tar -xf "${archive}" -C "${_tmpdir}" - - for x in "${_tmpdir}"/bin/*/*.rom ; do - printf "patching rom: %s\n" "$x" - x_ patch_rom "${x}" - done - for x in "${_tmpdir}"/bin/*/*_nomicrocode.rom ; do - [ -f "${x}" ] || continue - [ -f "${x%_nomicrocode.rom}.rom" ] || continue - - x_ cp "${x%_nomicrocode.rom}.rom" "${x}" - x_ "${cbfstool}" "${x}" remove -n cpu_microcode_blob.bin - done - - ( - x_ cd "${_tmpdir}/bin/"* - - # NOTE: For compatibility with older rom releases, defer to sha1 - [ "${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" - ) - - if [ "${modifygbe}" = "true" ]; then - for x in "${_tmpdir}"/bin/*/*.rom ; do - modify_gbe "${x}" - done - fi - - [ -d bin/release ] || x_ mkdir -p bin/release - x_ mv "${_tmpdir}"/bin/* bin/release/ - - printf "Success! Your ROMs are in bin/release\n" - - x_ rm -Rf "${_tmpdir}" -} - -patch_rom() -{ - rom="${1}" - - # we don't process no-microcode roms; these are - # instead re-created at the end, after re-inserting - # on roms with microcode, by copying and then removing, - # so that the hashes will match (otherwise, cbfstool - # may sometimes insert certain vendor files at the wrong offset) - # (unless nomicrocode is the only config provided) - [ "${rom}" != "${rom%_nomicrocode.rom}.rom" ] && \ - [ -f "${rom%_nomicrocode.rom}.rom" ] && \ - [ "${release}" = "y" ] && return 0 - - x_ check_defconfig "${boarddir}" - - set -- "${boarddir}/config/"* - . "${1}" 2>/dev/null - - [ "$CONFIG_HAVE_MRC" = "y" ] && \ - inject "mrc.bin" "${CONFIG_MRC_FILE}" "mrc" "0xfffa0000" - [ "${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}" - [ ! -z "${CONFIG_VGA_BIOS_FILE}" ] && \ - [ ! -z "${CONFIG_VGA_BIOS_ID}" ] && \ - inject "pci${CONFIG_VGA_BIOS_ID}.rom" \ - "${CONFIG_VGA_BIOS_FILE}" "optionrom" - [ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" = "y" ] && \ - [ ! -z "${CONFIG_SMSC_SCH5545_EC_FW_FILE}" ] && \ - inject "sch5545_ecfw.bin" "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw - [ "${modifygbe}" = "true" ] && ! [ "${release}" = "y" ] && \ - inject "IFD" "${CONFIG_GBE_BIN_PATH}" "GbE" - - printf "ROM image successfully patched: %s\n" "${rom}" -} - -inject() -{ - [ $# -lt 3 ] && \ - err "inject $@, $rom: usage: inject name path type (offset)" - - 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)" - - [ -z "${_dest}" ] && err "inject $@, ${rom}: empty destination path" - [ ! -f "${_dest}" ] && [ "${nukemode}" != "nuke" ] && \ - err "inject_${dl_type}: file missing, ${_dest}" - - [ "$nukemode" = "nuke" ] || \ - printf "Inserting %s/%s into file: %s\n" \ - "${cbfsname}" "${_t}" "$rom" - - if [ "${_t}" = "GbE" ]; then - x_ mkdir -p tmp - x_ cp "${_dest}" "tmp/gbe.bin" - _dest="tmp/gbe.bin" - x_ "${nvmutil}" "${_dest}" setmac "${new_mac}" - fi - if [ "${cbfsname}" = "IFD" ]; then - if [ "${nukemode}" != "nuke" ]; then - x_ "${ifdtool}" -i ${_t}:${_dest} "${rom}" -O "$rom" - else - x_ "${ifdtool}" --nuke ${_t} "${rom}" -O "${rom}" - fi - else - if [ "${nukemode}" != "nuke" ]; then - x_ "${cbfstool}" "${rom}" add -f "${_dest}" \ - -n "${cbfsname}" -t ${_t} ${_offset} - else - x_ "${cbfstool}" "${rom}" remove -n "${cbfsname}" - fi - - fi -} - -usage() -{ - cat <<- EOF - USAGE: ./update vendor inject -r [rom path] -b [boardname] -m [macaddress] - Example: ./update vendor inject -r x230_12mb.rom -b x230_12mb - - Adding a macadress to the gbe is optional. - If the [-m] parameter is left blank, the gbe will not be touched. - - Type './update vendor inject listboards' to get a list of valid boards - EOF -} - -main $@ diff --git a/script/vendor/download b/script/vendor/download new file mode 100755 index 00000000..e8c7e5a4 --- /dev/null +++ b/script/vendor/download @@ -0,0 +1,244 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-only +# SPDX-FileCopyrightText: 2022 Caleb La Grange +# SPDX-FileCopyrightText: 2022 Ferass El Hafidi +# SPDX-FileCopyrightText: 2023 Leah Rowe + +. "include/err.sh" +. "include/option.sh" +. "include/mrc.sh" + +export PATH="${PATH}:/sbin" + +_ua="Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0" +_7ztest="a" + +e6400_unpack="${PWD}/src/bios_extract/dell_inspiron_1100_unpacker.py" +kbc1126_ec_dump="${PWD}/${cbdir}/util/kbc1126/kbc1126_ec_dump" +me7updateparser="${PWD}/util/me7_update_parser/me7_update_parser.py" +mecleaner="${PWD}/${cbdir}/util/me_cleaner/me_cleaner.py" +pfs_extract="${PWD}/src/biosutilities/Dell_PFS_Extract.py" +uefiextract="${PWD}/src/uefitool/uefiextract" + +eval "$(setvars "" _b _dl EC_url EC_url_bkup EC_hash DL_hash DL_url DL_url_bkup \ + E6400_VGA_DL_hash E6400_VGA_DL_url E6400_VGA_DL_url_bkup E6400_VGA_offset \ + E6400_VGA_romname SCH5545EC_DL_url SCH5545EC_DL_url_bkup SCH5545EC_DL_hash)" + +main() +{ + [ $# -gt 0 ] || err "No argument given" + board="${1}" + boarddir="${cbcfgsdir}/${board}" + _b="${board%%_*mb}" # shorthand (avoid duplicating config per rom size) + + check_defconfig "${boarddir}" || exit 0 + detect_firmware && exit 0 + scan_config "${_b}" "config/vendor" "err" + + build_dependencies + download_vendorfiles +} + +detect_firmware() +{ + set -- "${boarddir}/config/"* + . "${1}" 2>/dev/null + + for c in CONFIG_HAVE_MRC CONFIG_HAVE_ME_BIN CONFIG_KBC1126_FIRMWARE \ + CONFIG_VGA_BIOS_FILE CONFIG_INCLUDE_SMSC_SCH5545_EC_FW; do + eval "[ -z \"\${${c}}\" ] || return 1" + done + printf "Vendor files not needed for: %s\n" "${board}" 1>&2 +} + +build_dependencies() +{ + [ -d ${cbdir} ] || \ + x_ ./update trees -f coreboot ${cbdir##*/} + for d in uefitool biosutilities bios_extract; do + [ -d "src/${d}" ] && continue + x_ ./update trees -f "${d}" + done + [ -f "${uefiextract}" ] || \ + x_ ./update trees -b uefitool + [ -f "${kbc1126_ec_dump}" ] || \ + x_ make -C "${cbdir}/util/kbc1126" + [ -f "${cbfstool}" ] && [ -f "${ifdtool}" ] && return 0 + x_ ./update trees -b coreboot utils default +} + +download_vendorfiles() +{ + [ -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}" ] && return 0 + fetch "mrc" "$MRC_url" "$MRC_url_bkup" "$MRC_hash" "$CONFIG_MRC_FILE" +} + +fetch() +{ + dl_type="${1}" + dl="${2}" + dl_bkup="${3}" + dlsum="${4}" + [ "${5# }" = "${5}" ] || err "fetch: space not allowed in _dest: '${5}'" + [ "${5#/}" = "${5}" ] || err "fetch: absolute path not allowed: '${5}'" + _dest="${5##*../}" + _dl="${vendir}/cache/${dlsum}" + + x_ mkdir -p "${_dl%/*}" + + dl_fail="y" + 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}" + curl --location --retry 3 -A "${_ua}" "${url}" -o "${_dl}" || \ + wget --tries 3 -U "${_ua}" "${url}" -O "${_dl}" || \ + continue + vendor_checksum "${dlsum}" "${_dl}" && dl_fail="n" + done + [ "${dl_fail}" = "y" ] && \ + err "fetch ${dlsum}: matched file unavailable" + + x_ rm -Rf "${_dl}_extracted" + mkdirs "${_dest}" "extract_${dl_type}" || return 0 + eval "extract_${dl_type}" + + [ -f "${_dest}" ] && return 0 + err "extract_${dl_type} (fetch): missing file: '${_dest}'" +} + +vendor_checksum() +{ + [ "$(sha512sum ${2} | awk '{print $1}')" != "${1}" ] || return 0 + printf "Bad checksum for file: %s\n" "${2}" 1>&2 + rm -f "${2}" || : + return 1 +} + +mkdirs() +{ + [ -f "${1}" ] && \ + printf "mkdirs ${1} ${2}: already downloaded\n" 1>&2 && return 1 + x_ mkdir -p "${1%/*}" + x_ rm -Rf "${appdir}" + x_ mkdir -p "${appdir}/" + extract_archive "${_dl}" "${appdir}" || \ + [ "${2}" = "extract_e6400vga" ] || err "mkdirs ${1} ${2}: !extract" +} + +extract_intel_me() +{ + _me="${PWD}/${_dest}" # must always be an absolute path + cdir="${PWD}/${appdir}" # must always be an absolute path + [ $# -gt 0 ] && _me="${1}" + [ $# -gt 0 ] && cdir="${2}" + [ -f "${_me}" ] && return 0 + + sdir="$(mktemp -d)" + mkdir -p "${sdir}" || err "extract_intel_me: !mkdir -p \"${sdir}\"" + ( + cd "${cdir}" || err "extract_intel_me: !cd \"${cdir}\"" + for i in *; do + [ -f "${_me}" ] && break + [ -L "${i}" ] && continue + if [ -f "${i}" ]; then + "${mecleaner}" -r -t -O "${sdir}/vendorfile" \ + -M "${_me}" "${i}" && break + "${mecleaner}" -r -t -O "${_me}" "${i}" && break + "${me7updateparser}" -O "${_me}" "${i}" && break + _7ztest="${_7ztest}a" + extract_archive "${i}" "${_7ztest}" || continue + extract_intel_me "${_me}" "${cdir}/${_7ztest}" + elif [ -d "$i" ]; then + extract_intel_me "${_me}" "${cdir}/${i}" + else + continue + fi + cdir="${1}" + cd "${cdir}" + done + ) + rm -Rf "${sdir}" || err "extract_intel_me: !rm -Rf ${sdir}" +} + +extract_archive() +{ + innoextract "${1}" -d "${2}" || python "${pfs_extract}" "${1}" -e || \ + 7z x "${1}" -o"${2}" || unar "${1}" -o "${2}" || \ + unzip "${1}" -d "${2}" || return 1 +} + +extract_kbc1126ec() +{ + ( + 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 || \ + x_ unar -D 68*.CAB Rom.bin + x_ mv Rom.bin ec.bin + fi + [ -f ec.bin ] || err "extract_kbc1126_ec ${board}: can't extract" + "${kbc1126_ec_dump}" ec.bin || \ + err "extract_kbc1126_ec ${board}: can't extract ecfw1/2.bin" + ) + ec_ex="y" + for i in 1 2; do + [ -f "${appdir}/ec.bin.fw${i}" ] || ec_ex="n" + done + [ "${ec_ex}" = "y" ] || \ + err "extract_kbc1126_ec ${board}: didn't extract ecfw1/2.bin" + x_ cp "${appdir}/"ec.bin.fw* "${_dest%/*}/" +} + +extract_e6400vga() +{ + [ "${E6400_VGA_offset}" = "" ] && \ + err "extract_e6400vga: E6400 VGA offset not defined" + [ "${E6400_VGA_romname}" = "" ] && \ + err "extract_e6400vga: E6400 VGA ROM name not defined" + 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" + [ -f "${E6400_VGA_romname}" ] || \ + err "extract_e6400vga: can't extract vga rom from bios.bin" + ) + x_ cp "${appdir}/${E6400_VGA_romname}" "${_dest}" +} + +extract_sch5545ec() +{ + # full system ROM (UEFI), to extract with UEFIExtract: + _bios="${_dl}_extracted/Firmware" + _bios="${_bios}/1 ${dlsum} -- 1 System BIOS vA.28.bin" + # this is the SCH5545 firmware, inside of the extracted UEFI ROM: + _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! + + # this makes the file defined by _sch5545ec_fw available to copy + "${uefiextract}" "${_bios}" || \ + err "extract_sch5545ec: cannot extract from uefi image" + cp "${_sch5545ec_fw}" "${_dest}" || \ + err "extract_sch5545ec: cannot copy sch5545ec firmware file" +} + +main $@ diff --git a/script/vendor/inject b/script/vendor/inject new file mode 100755 index 00000000..1eebca30 --- /dev/null +++ b/script/vendor/inject @@ -0,0 +1,248 @@ +#!/usr/bin/env sh +# SPDX-License-Identifier: GPL-3.0-only +# SPDX-FileCopyrightText: 2022 Caleb La Grange +# SPDX-FileCopyrightText: 2022 Ferass El Hafidi +# SPDX-FileCopyrightText: 2023 Leah Rowe + +. "include/err.sh" +. "include/option.sh" + +nvmutil="util/nvmutil/nvm" + +eval "$(setvars "" archive rom modifygbe nukemode release new_mac)" + +main() +{ + [ $# -lt 1 ] && err "No options specified." + [ "${1}" = "listboards" ] && \ + items 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) modifygbe=true + new_mac=${OPTARG} ;; + esac + done + + check_board + build_dependencies + inject_vendorfiles + [ "${nukemode}" = "nuke" ] && return 0 + printf "Friendly reminder (this is *not* an error message):\n" + printf "Please always ensure that the files were inserted correctly.\n" +} + +check_board() +{ + if ! check_release "${archive}" ; then + [ -f "${rom}" ] || \ + err "check_board: \"${rom}\" is not a valid path" + [ -z "${rom+x}" ] && \ + err "check_board: no rom specified" + [ ! -z ${board+x} ] || \ + board=$(detect_board "${rom}") + else + release="y" + board=$(detect_board "${archive}") + fi + + boarddir="${cbcfgsdir}/${board}" + [ -d "${boarddir}" ] && return 0 + err "check_board: board ${board} not found" +} + +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_*) + 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: could not detect board type" + esac + [ -d "${boarddir}/" ] || \ + err "detect_board: dir, ${boarddir}, doesn't exist" + printf "%s\n" "${board}" +} + +build_dependencies() +{ + [ -d "${cbdir}" ] || x_ ./update trees -f coreboot default + if [ ! -f "${cbfstool}" ] || [ ! -f "${ifdtool}" ]; then + x_ ./update trees -b coreboot utils default + fi + [ -z "${new_mac}" ] || [ -f "${nvmutil}" ] || x_ make -C util/nvmutil + [ "${nukemode}" = "nuke" ] && return 0 + x_ ./vendor download ${board} +} + +inject_vendorfiles() +{ + [ "${release}" != "y" ] && x_ patch_rom "${rom}" && return 0 + printf "patching release images\n" + patch_release_roms +} + +patch_release_roms() +{ + _tmpdir="tmp/romdir" + x_ rm -Rf "${_tmpdir}" + x_ mkdir -p "${_tmpdir}" + x_ tar -xf "${archive}" -C "${_tmpdir}" + + for x in "${_tmpdir}"/bin/*/*.rom ; do + printf "patching rom: %s\n" "$x" + x_ patch_rom "${x}" + done + for x in "${_tmpdir}"/bin/*/*_nomicrocode.rom ; do + [ -f "${x}" ] || continue + [ -f "${x%_nomicrocode.rom}.rom" ] || continue + + x_ cp "${x%_nomicrocode.rom}.rom" "${x}" + x_ "${cbfstool}" "${x}" remove -n cpu_microcode_blob.bin + done + + ( + x_ cd "${_tmpdir}/bin/"* + + # NOTE: For compatibility with older rom releases, defer to sha1 + [ "${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" + ) + + if [ "${modifygbe}" = "true" ]; then + for x in "${_tmpdir}"/bin/*/*.rom ; do + modify_gbe "${x}" + done + fi + + [ -d bin/release ] || x_ mkdir -p bin/release + x_ mv "${_tmpdir}"/bin/* bin/release/ + + printf "Success! Your ROMs are in bin/release\n" + + x_ rm -Rf "${_tmpdir}" +} + +patch_rom() +{ + rom="${1}" + + # we don't process no-microcode roms; these are + # instead re-created at the end, after re-inserting + # on roms with microcode, by copying and then removing, + # so that the hashes will match (otherwise, cbfstool + # may sometimes insert certain vendor files at the wrong offset) + # (unless nomicrocode is the only config provided) + [ "${rom}" != "${rom%_nomicrocode.rom}.rom" ] && \ + [ -f "${rom%_nomicrocode.rom}.rom" ] && \ + [ "${release}" = "y" ] && return 0 + + x_ check_defconfig "${boarddir}" + + set -- "${boarddir}/config/"* + . "${1}" 2>/dev/null + + [ "$CONFIG_HAVE_MRC" = "y" ] && \ + inject "mrc.bin" "${CONFIG_MRC_FILE}" "mrc" "0xfffa0000" + [ "${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}" + [ ! -z "${CONFIG_VGA_BIOS_FILE}" ] && \ + [ ! -z "${CONFIG_VGA_BIOS_ID}" ] && \ + inject "pci${CONFIG_VGA_BIOS_ID}.rom" \ + "${CONFIG_VGA_BIOS_FILE}" "optionrom" + [ "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" = "y" ] && \ + [ ! -z "${CONFIG_SMSC_SCH5545_EC_FW_FILE}" ] && \ + inject "sch5545_ecfw.bin" "$CONFIG_SMSC_SCH5545_EC_FW_FILE" raw + [ "${modifygbe}" = "true" ] && ! [ "${release}" = "y" ] && \ + inject "IFD" "${CONFIG_GBE_BIN_PATH}" "GbE" + + printf "ROM image successfully patched: %s\n" "${rom}" +} + +inject() +{ + [ $# -lt 3 ] && \ + err "inject $@, $rom: usage: inject name path type (offset)" + + 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)" + + [ -z "${_dest}" ] && err "inject $@, ${rom}: empty destination path" + [ ! -f "${_dest}" ] && [ "${nukemode}" != "nuke" ] && \ + err "inject_${dl_type}: file missing, ${_dest}" + + [ "$nukemode" = "nuke" ] || \ + printf "Inserting %s/%s into file: %s\n" \ + "${cbfsname}" "${_t}" "$rom" + + if [ "${_t}" = "GbE" ]; then + x_ mkdir -p tmp + x_ cp "${_dest}" "tmp/gbe.bin" + _dest="tmp/gbe.bin" + x_ "${nvmutil}" "${_dest}" setmac "${new_mac}" + fi + if [ "${cbfsname}" = "IFD" ]; then + if [ "${nukemode}" != "nuke" ]; then + x_ "${ifdtool}" -i ${_t}:${_dest} "${rom}" -O "$rom" + else + x_ "${ifdtool}" --nuke ${_t} "${rom}" -O "${rom}" + fi + else + if [ "${nukemode}" != "nuke" ]; then + x_ "${cbfstool}" "${rom}" add -f "${_dest}" \ + -n "${cbfsname}" -t ${_t} ${_offset} + else + x_ "${cbfstool}" "${rom}" remove -n "${cbfsname}" + fi + + fi +} + +usage() +{ + cat <<- EOF + USAGE: ./vendor inject -r [rom path] -b [boardname] -m [macaddress] + Example: ./vendor inject -r x230_12mb.rom -b x230_12mb + + Adding a macadress to the gbe is optional. + If the [-m] parameter is left blank, the gbe will not be touched. + + Type './vendor inject listboards' to get a list of valid boards + EOF +} + +main $@ -- cgit v1.2.1