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/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 ----------------------------------- 6 files changed, 544 insertions(+), 1036 deletions(-) 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 (limited to 'script/update') 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 $@ -- cgit v1.2.1