inject.sh 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # SPDX-License-Identifier: GPL-3.0-only
  2. # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
  3. # Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
  4. # Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org>
  5. cbcfgsdir="config/coreboot"
  6. hashfiles="vendorhashes blobhashes" # used to detect and error out
  7. # if running on an archive that needs vendor files
  8. dontflash="!!! AN ERROR OCCURED! Do NOT flash these images !!!"
  9. tmpromdel="$xbmklocal/DO_NOT_FLASH"
  10. nvm="util/nvmutil/nvm"
  11. ifdtool="elf/ifdtool/default/ifdtool"
  12. cv="CONFIG_GBE_BIN_PATH CONFIG_IFD_BIN_PATH"
  13. eval "`setvars "" tree new_mac archive boarddir rom cbdir xchanged \
  14. tmpromdir IFD_platform ifdprefix xromsize $cv`"
  15. fail_inject()
  16. {
  17. [ -L "$tmpromdel" ] || [ ! -d "$tmpromdel" ] || \
  18. rm -Rf "$tmpromdel" || :
  19. printf "\n\n%s\n\n" "$dontflash" 1>&2
  20. printf "WARNING: File '%s' was NOT modified.\n\n" "$archive" 1>&2
  21. err_ "$1"
  22. }
  23. inject()
  24. {
  25. xbmk_err="fail_inject"
  26. remkdir "$tmpromdel"
  27. set +u +e
  28. [ $# -lt 1 ] && err "No options specified. - $dontflash"
  29. eval "`setvars "" new_mac xchanged`"
  30. archive="$1";
  31. new_mac="xx:xx:xx:xx:xx:xx"
  32. [ $# -gt 1 ] && case "$2" in
  33. setmac)
  34. [ $# -gt 2 ] && new_mac="$3" && \
  35. [ -z "$new_mac" ] && err "Empty MAC address specified" ;;
  36. *) err "Unrecognised inject mode: '$2'"
  37. esac
  38. [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \
  39. x_ make -C util/nvmutil clean && x_ make -C util/nvmutil
  40. check_release "$archive" || err "'$archive' is not a release archive"
  41. if readcfg && readkconfig; then
  42. patch_release_roms
  43. fi
  44. [ "$xchanged" != "y" ] && printf "\n'%s' *NOT* modified.\n" "$archive"
  45. [ "$xchanged" = "y" ] && printf "\n'%s' %s.\n" "$archive" "$xtype"; :
  46. }
  47. check_release()
  48. {
  49. [ -L "$archive" ] && err "'$archive' is a symlink. $dontflash"
  50. e "$archive" f missing && return 1
  51. archivename="`basename "$archive"`"
  52. [ -z "$archivename" ] && err "Can't determine archive name. $dontflash"
  53. case "$archivename" in
  54. *_src.tar.xz)
  55. err "'$archive' is a src archive, silly!" ;;
  56. grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*)
  57. return 1 ;;
  58. *.tar.xz) _stripped_prefix="${archivename#*_}"
  59. board="${_stripped_prefix%.tar.xz}" ;;
  60. *) err "'$archive': could not detect board type - $dontflash"
  61. esac; :
  62. }
  63. readcfg()
  64. {
  65. if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \
  66. || [ "$board" = "serprog_pico" ]; then
  67. printf "'%s' is a serprog firmware archive.\n" "$archive" 1>&2
  68. return 1
  69. fi
  70. boarddir="$cbcfgsdir/$board"
  71. eval "`setcfg "$boarddir/target.cfg"`"
  72. chkvars tree && x_ ./mk -d coreboot "$tree"
  73. cbdir="src/coreboot/$tree"
  74. cbfstool="elf/cbfstool/$tree/cbfstool"
  75. rmodtool="elf/cbfstool/$tree/rmodtool"
  76. cbfstool="elf/cbfstool/$tree/cbfstool"
  77. ifdtool="elf/ifdtool/$tree/ifdtool"
  78. [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; :
  79. }
  80. readkconfig()
  81. {
  82. x_ rm -f "$xbmktmp/cbcfg"
  83. cbcfg="`check_defconfig "$boarddir"`" || for cbc in $cv; do
  84. grep "$cbc" "$cbcfg" 1>>"$xbmktmp/cbcfg" 2>/dev/null || :
  85. done
  86. eval "`setcfg "$xbmktmp/cbcfg" 1`"
  87. }
  88. patch_release_roms()
  89. {
  90. tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board"
  91. remkdir "${tmpromdir%"/bin/$board"}"
  92. x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}"
  93. for _hashes in $hashfiles; do
  94. e "$tmpromdir/$_hashes" f && err \
  95. "'$archive': vendorfile insertion unsupported; $dontflash"
  96. done
  97. [ -z "$new_mac" ] || modify_mac || printf "\nGbE not defined\n" 1>&2
  98. [ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || :
  99. [ "$xchanged" = "y" ] || return 0
  100. (
  101. x_ cd "${tmpromdir%"/bin/$board"}"
  102. mkrom_tarball "bin/$board"
  103. ) || err "Cannot re-generate '$archive' - $dontflash"
  104. mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \
  105. "$archive" || err "'$archive' -> Can't overwrite - $dontflash"; :
  106. }
  107. modify_mac()
  108. {
  109. [ -n "$CONFIG_GBE_BIN_PATH" ] || return 1
  110. x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe"
  111. [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \
  112. x_ "$nvm" "$xbmklocal/gbe" setmac "$new_mac"
  113. fe_ newmac "$tmpromdir" -maxdepth 1 -type f -name "*.rom"
  114. printf "\nGbE NVM written to '%s':\n" "$archive"
  115. x_ "$nvm" "$xbmklocal/gbe" dump | grep -v "bytes read from file" || :
  116. }
  117. newmac()
  118. {
  119. e "$1" f && xchanged="y" && x_ \
  120. "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; :
  121. }