diff --git a/resources/scripts/build/boot/roms_helper b/resources/scripts/build/boot/roms_helper index c0cf6123..92fc2e4a 100755 --- a/resources/scripts/build/boot/roms_helper +++ b/resources/scripts/build/boot/roms_helper @@ -32,6 +32,7 @@ set -u -e projectname="$(cat projectname)" cbcfgdir="resources/coreboot" +boardcfgdir="" kmapdir="resources/grub/keymap" displaymodes="" payloads="" @@ -46,9 +47,9 @@ arch="undefined" # Disable all payloads by default. # board.cfg files have to specifically enable [a] payload(s) payload_grub="n" -payload_grub_wseabios="n" # seabios chainloaded from grub +payload_grub_withseabios="n" # seabios chainloaded from grub payload_seabios="n" -payload_seabios_wgrub="n" # i386-coreboot grub from SeaBIOS boot menu +payload_seabios_withgrub="n" # i386-coreboot grub from SeaBIOS boot menu payload_memtest="n" payload_uboot="n" uboot_config="undefined" @@ -88,17 +89,37 @@ main() printf "build/roms: undefined board. Exiting\n" exit 1 fi - if [ ! -d "${cbcfgdir}/${board}" ]; then + + load_config + build_dependencies + build_rom_images +} + +load_config() +{ + boardcfgdir="${cbcfgdir}/${board}" + + if [ ! -d "${boardcfgdir}" ]; then printf "build/roms: Target not defined: %s\n" ${board} exit 1 fi - if [ ! -f "${cbcfgdir}/${board}/board.cfg" ]; then + if [ ! -f "${boardcfgdir}/board.cfg" ]; then printf "build/roms %s: Missing board.cfg\n" ${board} exit 1 fi - # Override the above defaults using board.cfg - . "${cbcfgdir}/${board}/board.cfg" + . "${boardcfgdir}/board.cfg" + + if [ "${board}" != "${cbtree}" ]; then + cbdir="coreboot/${cbtree}" + else + cbdir="coreboot/${board}" + fi + + romdir="bin/${board}" + cbfstool="${cbdir}/util/cbfstool/cbfstool" + seavgabiosrom="payload/seabios/seavgabios.bin" + corebootrom="${cbdir}/build/coreboot.rom" if [ "${grub_scan_disk}" = "undefined" ]; then printf "build/roms '%s': grub_scan_disk is undefined. " \ @@ -133,30 +154,16 @@ main() [ "${payload_memtest}" != "y" ]; then payload_memtest="n" fi - if [ "${payload_grub_wseabios}" = "y" ]; then + if [ "${payload_grub_withseabios}" = "y" ]; then payload_grub="y" fi - if [ "${payload_grub_wseabios}" = "y" ]; then + if [ "${payload_grub_withseabios}" = "y" ]; then payload_seabios="y" - payload_seabios_wgrub="y" + payload_seabios_withgrub="y" fi - if [ "${payload_seabios_wgrub}" = "y" ]; then + if [ "${payload_seabios_withgrub}" = "y" ]; then payload_seabios="y" fi - # NOTE: reverse logic must NOT be applied. If SeaBIOS-with-GRUB works, - # that doesn't mean GRUB-with-SeaBIOS will. For example, the board - # might have an external GPU, where SeaBIOS should be booted first - if [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] \ - && [ "${payload_uboot}" != "y" ]; then - for configfile in "${cbcfgdir}/${board}/config/"*; do - if [ ! -e "${configfile}" ]; then - continue - fi - printf "build/roms %s: Payload undefined. Exiting.\n" \ - ${board} - exit 1 - done - fi if [ "${payload_uboot}" != "n" ] && \ [ "${payload_uboot}" != "y" ]; then payload_uboot="n" @@ -165,13 +172,20 @@ main() [ "${uboot_config}" = "undefined" ]; then uboot_config="default" fi + + load_config_overrides + die_if_cbconfig_and_nopayload +} + +load_config_overrides() +{ # Override all payload directives with cmdline args if [ ! -z ${payloads} ]; then echo "setting payloads $payloads" payload_grub="n" - payload_grub_wseabios="n" # seabios chainloaded from grub + payload_grub_withseabios="n" # seabios chainloaded from grub payload_seabios="n" - payload_seabios_wgrub="n" # grub from SeaBIOS menu + payload_seabios_withgrub="n" # grub from SeaBIOS menu payload_uboot="n" payload_memtest="n" @@ -179,21 +193,46 @@ main() eval "payload_${payload}=y" done fi +} - romdir="bin/${board}" - cbdir="coreboot/${board}" - if [ "${board}" != "${cbtree}" ]; then - cbdir="coreboot/${cbtree}" +die_if_cbconfig_and_nopayload() +{ + # if a coreboot config exists, and payloads are not + # defined in the lbmk config, exit with error + # if no configs exist, this won't fail. this way, cbtrees + # like "default" can exist which just contain patches + if [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] \ + && [ "${payload_uboot}" != "y" ]; then + for configfile in "${boardcfgdir}/config/"*; do + if [ ! -e "${configfile}" ]; then + continue + fi + printf "build/roms %s: Payload undefined. Exiting.\n" \ + ${board} + exit 1 + done fi - cbfstool="${cbdir}/util/cbfstool/cbfstool" - corebootrom="${cbdir}/build/coreboot.rom" - seavgabiosrom="payload/seabios/seavgabios.bin" +} +build_dependencies() +{ if [ ! -d "${cbdir}" ]; then ./download coreboot ${cbtree} fi + if [ ! -f "${cbfstool}" ]; then + ./build module cbutils ${cbtree} || exit 1 + fi cat version > "${cbdir}/.coreboot-version" + build_dependency_crossgcc + + build_dependency_seabios + build_dependency_grub + build_dependency_uboot +} + +build_dependency_crossgcc() +{ if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then if [ ! -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ]; then # Even for 64-bit machines, coreboot builds 32-bit ROM @@ -227,10 +266,10 @@ main() fi export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH" +} - if [ ! -f "${cbfstool}" ]; then - ./build module cbutils ${cbtree} || exit 1 - fi +build_dependency_seabios() +{ if [ ! -f "${seavgabiosrom}" ] \ || [ ! -f payload/seabios/seabios_libgfxinit.elf ] \ || [ ! -f payload/seabios/seabios_vgarom.elf ] \ @@ -238,7 +277,7 @@ main() if [ "${payload_seabios}" = "y" ]; then ./build payload seabios elif [ "${payload_grub}" = "y" ] \ - && [ "${payload_grub_wseabios}" = "y" ] + && [ "${payload_grub_withseabios}" = "y" ] then ./build payload seabios fi @@ -248,12 +287,13 @@ main() ./build module memtest86plus fi fi +} - [ -d "${romdir}/" ] || mkdir -p "${romdir}/" - rm -f "${romdir}"/* - +build_dependency_grub() +{ if [ "${payload_grub}" = "y" ] \ - || [ "${payload_seabios_wgrub}" = "y" ]; then + || [ "${payload_seabios_withgrub}" = "y" ] + then if [ -f "payload/grub/grub_usqwerty.cfg" ]; then sha1cmd="sha1sum resources/grub/config/grub.cfg" grubrefchecksum="$(${sha1cmd} | awk '{print $1}')" @@ -287,7 +327,10 @@ main() fi done fi +} +build_dependency_uboot() +{ if [ "${payload_uboot}" = "y" ]; then ubdir="" if [ "${uboot_config}" = "default" ]; then @@ -306,32 +349,38 @@ main() ./build payload u-boot "${board}" fi fi +} + +build_rom_images() +{ + [ -d "${romdir}/" ] || mkdir -p "${romdir}/" + rm -f "${romdir}"/* if [ -z ${displaymodes} ]; then initmode="libgfxinit" for displaymode in corebootfb txtmode; do - _cbcfg="${cbcfgdir}/${board}/config/${initmode}" + _cbcfg="${boardcfgdir}/config/${initmode}" _cbcfg="${_cbcfg}_${displaymode}" mkRoms "${_cbcfg}" "${displaymode}" "${initmode}" done initmode="vgarom" for displaymode in vesafb txtmode; do - _cbcfg="${cbcfgdir}/${board}/config/${initmode}" + _cbcfg="${boardcfgdir}/config/${initmode}" _cbcfg="${_cbcfg}_${displaymode}" mkRoms "${_cbcfg}" "${displaymode}" "${initmode}" done initmode="normal" displaymode="txtmode" - _cbcfg="${cbcfgdir}/${board}/config/${initmode}" + _cbcfg="${boardcfgdir}/config/${initmode}" mkRoms "${_cbcfg}" "${displaymode}" "${initmode}" else echo "special displaymode defined as $displaymodes" for initmode in vgarom libgfxinit; do for displaymode in ${displaymodes}; do - _cbcfg="${cbcfgdir}/${board}/config/" + _cbcfg="${boardcfgdir}/config/" _cbcfg="${_cbcfg}${initmode}_${displaymode}" mkRoms "${_cbcfg}" "${displaymode}" \ "${initmode}" @@ -345,6 +394,306 @@ main() ) } +# Main ROM building function. This calls all other functions +mkRoms() +{ + _cbcfg="${1}" + displaymode="${2}" + initmode="${3}" + + if [ ! -f "${_cbcfg}" ]; then + printf "'%s' does not exist. Skipping build for %s %s %s\n" \ + ${_cbcfg} ${board} \ + ${displaymode} ${initmode} + return 0 + fi + + # make coreboot ROM without a payload in it + mkCoreboot "${cbdir}" "${_cbcfg}" + + # now add payloads, per user config: + + if [ "${displaymode}" = "txtmode" ] \ + && [ "${payload_memtest}" = "y" ]; then + "${cbfstool}" "${corebootrom}" add-payload \ + -f memtest86plus/memtest -n img/memtest \ + -c lzma || exit 1 + fi + + if [ "${payload_seabios}" = "y" ]; then + if [ "${payload_seabios_withgrub}" = "n" ]; then + x=${corebootrom} + y=${initmode} + t=$(mkSeabiosRom "$x" "fallback/payload" "$y") + + _newrom="${romdir}/seabios_${board}_${initmode}.rom" + if [ "${initmode}" != "normal" ]; then + _newrom="${_newrom%.rom}_${displaymode}.rom" + fi + + # rom image ready to be flashed: + moverom "${t}" "${_newrom}" "${romtype}" + rm -f "${t}" + else + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + cp "${corebootrom}" "${tmprom}" + mkRomsWithGrub "${tmprom}" "${initmode}" \ + "${displaymode}" "seabios_withgrub" + rm -f "${tmprom}" + fi + fi + + if [ "${payload_grub}" = "y" ]; then + mkRomsWithGrub "${corebootrom}" "${initmode}" \ + "${displaymode}" "grub" + fi + + if [ "${payload_uboot}" = "y" ]; then + x=${corebootrom} + y=${uboot_config} + z=${cbfstool} + tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")" + if [ "${initmode}" = "normal" ]; then + _newrom="${romdir}/uboot_payload_${board}_" + _newrom="${_newrom}${initmode}.rom" + else + _newrom="${romdir}/uboot_payload_${board}_" + _newrom="${_newrom}${initmode}_${displaymode}.rom" + fi + + # rom image ready to be flashed: + moverom "${tmpubootrom}" "${_newrom}" "${romtype}" + rm -f "${tmpubootrom}" + fi +} + +# expected: configs must not specify a payload +mkCoreboot() +{ + cbdir="${1}" # eg. coreboot/default + _cbcfg="${2}" # eg. resources/coreboot/e6400nvidia_4mb/config/normal + + if [ ! -f "${_cbcfg}" ]; then + printf "\nmkCoreboot: coreboot config '%s' does not exist. " \ + ${_cbcfg} + printf "Skipping build.\n" + return 0 + fi + + printf "%s-%s\n" "$(cat projectname)" "$(cat version)" \ + > "${cbdir}/.coreboot-version" + + ( + if [ -f "${cbfstool}" ]; then + mv "${cbfstool}" "${cbdir}/cbfstool" + fi + cd "${cbdir}" + make distclean + cd - + + if [ -f "${cbdir}/cbfstool" ]; then + mv "${cbdir}/cbfstool" "${cbfstool}" + fi + ) + + cp "${_cbcfg}" "${cbdir}"/.config + ./build module cbutils ${cbdir#coreboot/} || exit 1 + + ( + cd "${cbdir}" + make -j$(nproc) + ) +} + +# make a rom in /tmp/ and then print the path of that ROM +mkSeabiosRom() +{ + target_cbrom="${1}" # rom to insert seabios in. will not be touched + # (a tmpfile will be made instead) + target_seabios_cbfs_path="${2}" # e.g. fallback/payload + target_initmode="${3}" # e.g. libgfxinit + + target_seabioself="payload/seabios/seabios_${target_initmode}.elf" + target_seavgabios_rom="payload/seabios/seavgabios.bin" + + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + + cp "${target_cbrom}" "${tmprom}" + + "${cbfstool}" "${tmprom}" add-payload -f "${target_seabioself}" \ + -n ${target_seabios_cbfs_path} -c lzma || exit 1 + "${cbfstool}" "${tmprom}" add-int -i 3000 -n etc/ps2-keyboard-spinup \ + || exit 1 + + if [ "${target_initmode}" = "normal" ] \ + || [ "${target_initmode}" = "libgfxinit" ]; then + "${cbfstool}" "${tmprom}" add-int -i 2 \ + -n etc/pci-optionrom-exec || exit 1 + elif [ "${target_initmode}" = "vgarom" ]; then # coreboot executes it + "${cbfstool}" "${tmprom}" add-int -i 0 \ + -n etc/pci-optionrom-exec || exit 1 + fi # for undefined modes, don't add this integer. use SeaBIOS defaults + + "${cbfstool}" "${tmprom}" add-int -i 0 -n etc/optionroms-checksum \ + || exit 1 + + if [ "${target_initmode}" = "libgfxinit" ]; then + "${cbfstool}" "${tmprom}" add -f "${target_seavgabios_rom}" \ + -n vgaroms/seavgabios.bin -t raw || exit 1 + fi + + printf "%s\n" "${tmprom}" +} + +# Make separate ROM images with GRUB payload, for each supported keymap +mkRomsWithGrub() +{ + tmprompath="${1}" + initmode="${2}" + displaymode="${3}" + firstpayloadname="${4}" # allow values: grub, seabios, seabios_withgrub + + x=${tmprompath} + y=${initmode} + if [ "${payload_grub_withseabios}" = "y" ] \ + && [ "${firstpayloadname}" = "grub" ]; then + mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}")" \ + "${tmprompath}" + elif [ "${payload_seabios_withgrub}" ] \ + && [ "${firstpayloadname}" != "grub" ]; then + mv "$(mkSeabiosRom "${x}" "fallback/payload" "${y}")" \ + "${tmprompath}" + fi + + keymaps="" + if [ -z ${keyboard_layouts} ]; then + for kmapfile in "${kmapdir}"/*; do + keymaps="${keymaps} ${kmapfile}" + done + else + for keymapname in ${keyboard_layouts}; do + keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb" + done + fi + for keymapfile in ${keymaps}; do + if [ ! -f "${keymapfile}" ]; then + continue + fi + + keymap="${keymapfile##*/}" + keymap="${keymap%.gkb}" + + grub_path_in_cbfs="fallback/payload" + if [ "${firstpayloadname}" != "grub" ]; then + grub_path_in_cbfs="img/grub2" + fi + + # evil bofh rfc 2646 compliance hack + x=${keymap} + y=${tmprompath} + z=${grub_path_in_cbfs} + tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")" + + _newrom="${romdir}/${firstpayloadname}_${board}_${initmode}_" + if [ "${initmode}" = "normal" ]; then + _newrom="${_newrom}${keymap}.rom" + else + _newrom="${_newrom}${displaymode}_${keymap}.rom" + fi + + # rom image ready to be flashed: + moverom "${tmpgrubrom}" "${_newrom}" "${romtype}" + rm -f "${tmpgrubrom}" + done +} + +# make a rom in /tmp/ and then print the path of that ROM +mkGrubRom() +{ + target_keymap="${1}" + target_cbrom="${2}" + target_grubelf_cbfs_path="${3}" # e.g. fallback/payload + + grubelf="payload/grub/grub_${target_keymap}.elf" + grubcfg="payload/grub/grub_${target_keymap}.cfg" + grubtestcfg="payload/grub/grub_${target_keymap}_test.cfg" + + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) || exit 1 + + cp "${target_cbrom}" "${tmprom}" || exit 1 + + "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \ + -n ${target_grubelf_cbfs_path} -c lzma || exit 1 + + tmpgrubcfg=$(mktemp -t grub.cfg.XXXXXXXXXX) + tmpgrubtestcfg=$(mktemp -t grubtest.cfg.XXXXXXXXXX) + if [ "${grub_scan_disk}" = "ahci" ]; then + sed \ + 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ahci\"/' \ + "${grubcfg}" > "${tmpgrubcfg}" + sed \ + 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ahci\"/' \ + "${grubtestcfg}" > "${tmpgrubtestcfg}" + elif [ "${grub_scan_disk}" = "ata" ]; then + sed \ + 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ata\"/' \ + "${grubcfg}" > "${tmpgrubcfg}" + sed \ + 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ata\"/' \ + "${grubtestcfg}" > "${tmpgrubtestcfg}" + else + cp "${grubcfg}" "${tmpgrubcfg}" + cp "${grubtestcfg}" "${tmpgrubtestcfg}" + fi + + "${cbfstool}" "${tmprom}" add -f "${tmpgrubcfg}" -n grub.cfg -t raw \ + || exit 1 + "${cbfstool}" "${tmprom}" add -f "${tmpgrubtestcfg}" -n grubtest.cfg \ + -t raw || exit 1 + rm -f "${tmpgrubcfg}" "${tmpgrubtestcfg}" + + backgroundfile="background1280x800.png" + if [ "${board}" = "x60" ] || [ "${board}" = "t60_intelgpu" ]; then + # TODO: don't hardcode this. do it in board.cfg per board + backgroundfile="background1024x768.png" + fi + backgroundfile="resources/grub/background/${backgroundfile}" + "${cbfstool}" "${tmprom}" add -f ${backgroundfile} -n background.png \ + -t raw || exit 1 + + printf "%s\n" "${tmprom}" +} + +# make a rom in /tmp/ and then print the path of that ROM +mkUbootRom() +{ + target_cbrom="${1}" # rom to insert u-boot in. it won't be touched + # (a tmpfile will be made instead) + target_uboot_cbfs_path="${2}" # e.g. fallback/payload + target_uboot_config="${3}" + cbfstool_path="${4}" + + if [ "${target_uboot_config}" = "default" ]; then + target_ubdir="payload/u-boot/${board}" + else + target_ubdir="payload/u-boot/${board}/${target_uboot_config}" + fi + + if [ -f "${target_ubdir}/u-boot.elf" ]; then + target_ubootelf="${target_ubdir}/u-boot.elf" + elif [ -f "${target_ubdir}/u-boot" ]; then + target_ubootelf="${target_ubdir}/u-boot" + fi + + tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) + + cp "${target_cbrom}" "${tmprom}" + "${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \ + -n ${target_uboot_cbfs_path} -c lzma || exit 1 + + 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() @@ -394,291 +743,4 @@ moverom() fi } -# expected: configs must not specify a payload -mkCoreboot() -{ - cbdir="${1}" # eg. coreboot/default - _cbcfg="${2}" # eg. ${cbcfgdir}/e6400nvidia_4mb/config/normal - if [ ! -f "${_cbcfg}" ]; then - printf "\nmkCoreboot: coreboot config '%s' does not exist. " \ - ${_cbcfg} - printf "Skipping build.\n" - return 0 - fi - printf "%s-%s\n" "$(cat projectname)" "$(cat version)" \ - > "${cbdir}/.coreboot-version" - ( - if [ -f "${cbfstool}" ]; then - mv "${cbfstool}" "${cbdir}/cbfstool" - fi - - cd "${cbdir}" - make distclean - cd - - - if [ -f "${cbdir}/cbfstool" ]; then - mv "${cbdir}/cbfstool" "${cbfstool}" - fi - ) - cp "${_cbcfg}" "${cbdir}"/.config - ./build module cbutils ${cbdir#coreboot/} || exit 1 - ( - cd "${cbdir}" - make -j$(nproc) - ) -} - -# make a rom in /tmp/ and then print the path of that ROM -mkSeabiosRom() -{ - target_cbrom="${1}" # rom to insert seabios in. will not be touched - # (a tmpfile will be made instead) - target_seabios_cbfs_path="${2}" # e.g. fallback/payload - target_initmode="${3}" # e.g. libgfxinit - - target_seabioself="payload/seabios/seabios_${target_initmode}.elf" - target_seavgabios_rom="payload/seabios/seavgabios.bin" - - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - - cp "${target_cbrom}" "${tmprom}" - - "${cbfstool}" "${tmprom}" add-payload -f "${target_seabioself}" \ - -n ${target_seabios_cbfs_path} -c lzma || exit 1 - "${cbfstool}" "${tmprom}" add-int -i 3000 -n etc/ps2-keyboard-spinup \ - || exit 1 - - if [ "${target_initmode}" = "normal" ] \ - || [ "${target_initmode}" = "libgfxinit" ]; then - "${cbfstool}" "${tmprom}" add-int -i 2 \ - -n etc/pci-optionrom-exec || exit 1 - elif [ "${target_initmode}" = "vgarom" ]; then # coreboot executes it - "${cbfstool}" "${tmprom}" add-int -i 0 \ - -n etc/pci-optionrom-exec || exit 1 - fi # for undefined modes, don't add this integer. use SeaBIOS defaults - - "${cbfstool}" "${tmprom}" add-int -i 0 -n etc/optionroms-checksum \ - || exit 1 - - if [ "${target_initmode}" = "libgfxinit" ]; then - "${cbfstool}" "${tmprom}" add -f "${target_seavgabios_rom}" \ - -n vgaroms/seavgabios.bin -t raw || exit 1 - fi - - printf "%s\n" "${tmprom}" -} - -# make a rom in /tmp/ and then print the path of that ROM -mkUbootRom() -{ - target_cbrom="${1}" # rom to insert u-boot in. it won't be touched - # (a tmpfile will be made instead) - target_uboot_cbfs_path="${2}" # e.g. fallback/payload - target_uboot_config="${3}" - cbfstool_path="${4}" - - if [ "${target_uboot_config}" = "default" ]; then - target_ubdir="payload/u-boot/${board}" - else - target_ubdir="payload/u-boot/${board}/${target_uboot_config}" - fi - - if [ -f "${target_ubdir}/u-boot.elf" ]; then - target_ubootelf="${target_ubdir}/u-boot.elf" - elif [ -f "${target_ubdir}/u-boot" ]; then - target_ubootelf="${target_ubdir}/u-boot" - fi - - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - - cp "${target_cbrom}" "${tmprom}" - "${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \ - -n ${target_uboot_cbfs_path} -c lzma || exit 1 - - printf "%s\n" "${tmprom}" -} - -# make a rom in /tmp/ and then print the path of that ROM -mkGrubRom() -{ - target_keymap="${1}" - target_cbrom="${2}" - target_grubelf_cbfs_path="${3}" # e.g. fallback/payload - - grubelf="payload/grub/grub_${target_keymap}.elf" - grubcfg="payload/grub/grub_${target_keymap}.cfg" - grubtestcfg="payload/grub/grub_${target_keymap}_test.cfg" - - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) || exit 1 - cp "${target_cbrom}" "${tmprom}" || exit 1 - - "${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \ - -n ${target_grubelf_cbfs_path} -c lzma || exit 1 - - tmpgrubcfg=$(mktemp -t grub.cfg.XXXXXXXXXX) - tmpgrubtestcfg=$(mktemp -t grubtest.cfg.XXXXXXXXXX) - if [ "${grub_scan_disk}" = "ahci" ]; then - sed \ - 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ahci\"/' \ - "${grubcfg}" > "${tmpgrubcfg}" - sed \ - 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ahci\"/' \ - "${grubtestcfg}" > "${tmpgrubtestcfg}" - elif [ "${grub_scan_disk}" = "ata" ]; then - sed \ - 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ata\"/' \ - "${grubcfg}" > "${tmpgrubcfg}" - sed \ - 's/set\ grub_scan_disk=\"both\"/set\ grub_scan_disk=\"ata\"/' \ - "${grubtestcfg}" > "${tmpgrubtestcfg}" - else - cp "${grubcfg}" "${tmpgrubcfg}" - cp "${grubtestcfg}" "${tmpgrubtestcfg}" - fi - - "${cbfstool}" "${tmprom}" add -f "${tmpgrubcfg}" -n grub.cfg -t raw \ - || exit 1 - "${cbfstool}" "${tmprom}" add -f "${tmpgrubtestcfg}" -n grubtest.cfg \ - -t raw || exit 1 - rm -f "${tmpgrubcfg}" "${tmpgrubtestcfg}" - - backgroundfile="background1280x800.png" - if [ "${board}" = "x60" ] || [ "${board}" = "t60_intelgpu" ]; then - # TODO: don't hardcode this. do it in board.cfg per board - backgroundfile="background1024x768.png" - fi - backgroundfile="resources/grub/background/${backgroundfile}" - "${cbfstool}" "${tmprom}" add -f ${backgroundfile} -n background.png \ - -t raw || exit 1 - - printf "%s\n" "${tmprom}" -} - -# Make separate ROM images with GRUB payload, for each supported keymap -mkRomsWithGrub() -{ - tmprompath="${1}" - initmode="${2}" - displaymode="${3}" - firstpayloadname="${4}" # allow values: grub, seabios, seabios_wgrub - - x=${tmprompath} - y=${initmode} - if [ "${payload_grub_wseabios}" = "y" ] \ - && [ "${firstpayloadname}" = "grub" ]; then - mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}")" \ - "${tmprompath}" - elif [ "${payload_seabios_wgrub}" ] \ - && [ "${firstpayloadname}" != "grub" ]; then - mv "$(mkSeabiosRom "${x}" "fallback/payload" "${y}")" \ - "${tmprompath}" - fi - - keymaps="" - if [ -z ${keyboard_layouts} ]; then - for kmapfile in "${kmapdir}"/*; do - keymaps="${keymaps} ${kmapfile}" - done - else - for keymapname in ${keyboard_layouts}; do - keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb" - done - fi - for keymapfile in ${keymaps}; do - if [ ! -f "${keymapfile}" ]; then - continue - fi - - keymap="${keymapfile##*/}" - keymap="${keymap%.gkb}" - - grub_path_in_cbfs="fallback/payload" - if [ "${firstpayloadname}" != "grub" ]; then - grub_path_in_cbfs="img/grub2" - fi - - # evil bofh rfc 2646 compliance hack - x=${keymap} - y=${tmprompath} - z=${grub_path_in_cbfs} - tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")" - - _newrom="${romdir}/${firstpayloadname}_${board}_${initmode}_" - if [ "${initmode}" = "normal" ]; then - _newrom="${_newrom}${keymap}.rom" - else - _newrom="${_newrom}${displaymode}_${keymap}.rom" - fi - moverom "${tmpgrubrom}" "${_newrom}" "${romtype}" - rm -f "${tmpgrubrom}" - done -} - -# Main ROM building function. This calls all other functions -mkRoms() -{ - _cbcfg="${1}" - displaymode="${2}" - initmode="${3}" - - if [ ! -f "${_cbcfg}" ]; then - printf "'%s' does not exist. Skipping build for %s %s %s\n" \ - ${_cbcfg} ${board} \ - ${displaymode} ${initmode} - return 0 - fi - - mkCoreboot "${cbdir}" "${_cbcfg}" - - if [ "${displaymode}" = "txtmode" ] \ - && [ "${payload_memtest}" = "y" ]; then - "${cbfstool}" "${corebootrom}" add-payload \ - -f memtest86plus/memtest -n img/memtest \ - -c lzma || exit 1 - fi - - if [ "${payload_seabios}" = "y" ]; then - if [ "${payload_seabios_wgrub}" = "n" ]; then - x=${corebootrom} - y=${initmode} - t=$(mkSeabiosRom "$x" "fallback/payload" "$y") - - _newrom="${romdir}/seabios_${board}_${initmode}.rom" - if [ "${initmode}" != "normal" ]; then - _newrom="${_newrom%.rom}_${displaymode}.rom" - fi - - moverom "${t}" "${_newrom}" "${romtype}" - rm -f "${t}" - else - tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) - cp "${corebootrom}" "${tmprom}" - mkRomsWithGrub "${tmprom}" "${initmode}" \ - "${displaymode}" "seabios_withgrub" - rm -f "${tmprom}" - fi - fi - - if [ "${payload_grub}" = "y" ]; then - mkRomsWithGrub "${corebootrom}" "${initmode}" \ - "${displaymode}" "grub" - fi - - if [ "${payload_uboot}" = "y" ]; then - x=${corebootrom} - y=${uboot_config} - z=${cbfstool} - tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")" - if [ "${initmode}" = "normal" ]; then - _newrom="${romdir}/uboot_payload_${board}_" - _newrom="${_newrom}${initmode}.rom" - else - _newrom="${romdir}/uboot_payload_${board}_" - _newrom="${_newrom}${initmode}_${displaymode}.rom" - fi - moverom "${tmpubootrom}" "${_newrom}" "${romtype}" - rm -f "${tmpubootrom}" - fi -} - main $@