inject.sh 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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="$PWD/tmp/DO_NOT_FLASH"
  10. cv="CONFIG_GBE_BIN_PATH CONFIG_IFD_BIN_PATH"
  11. eval "`setvars "" tree new_mac archive boarddir rom cbdir xchanged \
  12. tmpromdir IFD_platform ifdprefix xromsize $cv`"
  13. fail_inject()
  14. {
  15. [ -L "$tmpromdel" ] || [ ! -d "$tmpromdel" ] || \
  16. rm -Rf "$tmpromdel" || :
  17. printf "\n\n%s\n\n" "$dontflash" 1>&2
  18. printf "WARNING: File '%s' was NOT modified.\n\n" "$archive" 1>&2
  19. fail "$1"
  20. }
  21. xbmk_inject()
  22. {
  23. _olderr="$err"
  24. err="fail_inject"
  25. remkdir "$tmpromdel"
  26. set +u +e; [ $# -lt 1 ] && $err "No options specified. - $dontflash"
  27. eval "`setvars "" new_mac xchanged`"
  28. # randomise the MAC address by default
  29. # TODO: support setting CBFS MAC address for GA-G41M-ES2L
  30. new_mac="??:??:??:??:??:??"
  31. archive="$1";
  32. [ $# -gt 1 ] && case "$2" in
  33. setmac)
  34. [ $# -gt 2 ] && new_mac="$3" && \
  35. [ -z "$new_mac" ] && $err \
  36. "You set an empty MAC address string" ;;
  37. *) $err "Unrecognised inject mode: '$2'"
  38. esac
  39. check_release "$archive" || \
  40. $err "You must run this script on a release archive. - $dontflash"
  41. [ "$new_mac" = "restore" ] && \
  42. printf "Restoring default GbE for '$archive', board '$board'\n"
  43. if readcfg && readkconfig; then
  44. patch_release_roms
  45. fi
  46. [ "$xchanged" != "y" ] && \
  47. printf "\nRelease archive '%s' was *NOT* modified.\n" \
  48. "$archive" 1>&2
  49. [ "$xchanged" = "y" ] && \
  50. printf "\nRelease archive '%s' successfully patched.\n" \
  51. "$archive" && \
  52. printf "You may now extract '%s' and flash images from it.\n" \
  53. "$archive"
  54. err="$_olderr"
  55. return 0
  56. }
  57. check_release()
  58. {
  59. [ -L "$archive" ] && \
  60. $err "'$archive' is a symlink, not a file - $dontflash"
  61. [ -f "$archive" ] || return 1
  62. archivename="`basename "$archive"`"
  63. [ -z "$archivename" ] && \
  64. $err "Cannot determine archive file name - $dontflash"
  65. case "$archivename" in
  66. *_src.tar.xz)
  67. $err "'$archive' is a src archive, silly!" ;;
  68. grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*)
  69. return 1 ;;
  70. *.tar.xz) _stripped_prefix="${archivename#*_}"
  71. board="${_stripped_prefix%.tar.xz}" ;;
  72. *) $err "'$archive': could not detect board type - $dontflash"
  73. esac; :
  74. }
  75. readcfg()
  76. {
  77. if [ "$board" = "serprog_rp2040" ] || \
  78. [ "$board" = "serprog_stm32" ] || \
  79. [ "$board" = "serprog_pico" ]; then
  80. printf "'%s' is a serprog firmware archive.\n" "$archive" 1>&2
  81. return 1
  82. fi
  83. boarddir="$cbcfgsdir/$board"
  84. eval "`setcfg "$boarddir/target.cfg"`"
  85. chkvars tree
  86. x_ ./mk -d coreboot "$tree"
  87. cbdir="src/coreboot/$tree"
  88. cbfstool="elf/cbfstool/$tree/cbfstool"
  89. rmodtool="elf/cbfstool/$tree/rmodtool"
  90. cbfstool="elf/cbfstool/$tree/cbfstool"
  91. ifdtool="elf/ifdtool/$tree/ifdtool"
  92. [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; :
  93. }
  94. readkconfig()
  95. {
  96. check_defconfig "$boarddir" 1>"$TMPDIR/vendorcfg.list" && return 1
  97. rm -f "$TMPDIR/tmpcbcfg" || $err "!rm $TMPDIR/tmpcbcfg - $dontflash"
  98. while read -r cbcfgfile; do
  99. for cbc in $cv; do
  100. rm -f "$TMPDIR/tmpcbcfg2" || \
  101. $err "!rm $TMPDIR/tmpcbcfg2 - $dontflash"
  102. grep "$cbc" "$cbcfgfile" 1>"$TMPDIR/tmpcbcfg2" \
  103. 2>/dev/null || :
  104. [ -f "$TMPDIR/tmpcbcfg2" ] || continue
  105. cat "$TMPDIR/tmpcbcfg2" >> "$TMPDIR/tmpcbcfg" || \
  106. $err "!cat $TMPDIR/tmpcbcfg2 - $dontflash"
  107. done
  108. done < "$TMPDIR/vendorcfg.list"
  109. eval "`setcfg "$TMPDIR/tmpcbcfg"`"; :
  110. }
  111. patch_release_roms()
  112. {
  113. tmpromdir="tmp/DO_NOT_FLASH/bin/$board"
  114. remkdir "${tmpromdir%"/bin/$board"}"
  115. tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" || \
  116. $err "Can't extract '$archive'"
  117. for _hashes in $hashfiles; do
  118. [ -L "$tmpromdir/$_hashes" ] && \
  119. $err "'$archive' -> the hashfile is a symlink. $dontflash"
  120. [ -f "$tmpromdir/$_hashes" ] && $err \
  121. "'$archive': vendorfile insertion unsupported; $dontflash"
  122. done
  123. if [ -n "$new_mac" ]; then
  124. if ! modify_mac_addresses; then
  125. printf "\nNo GbE region defined for '%s'\n" "$board" \
  126. 1>&2
  127. printf "Therefore, changing the MAC is impossible.\n" \
  128. 1>&2
  129. printf "This board probably lacks Intel ethernet.\n" \
  130. 1>&2
  131. printf "(or it's pre-IFD Intel with Intel GbE NIC)\n" \
  132. 1>&2
  133. fi
  134. fi
  135. [ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || :
  136. [ "$xchanged" = "y" ] || return 0
  137. (
  138. cd "${tmpromdir%"/bin/$board"}" || \
  139. $err "Can't cd '${tmpromdir%"/bin/$board"}'; $dontflash"
  140. # ../../ is the root of lbmk
  141. mkrom_tarball "bin/$board"
  142. ) || $err "Cannot re-generate '$archive' - $dontflash"
  143. mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \
  144. "$archive" || \
  145. $err "'$archive' -> Cannot overwrite - $dontflash"; :
  146. }
  147. modify_mac_addresses()
  148. {
  149. [ "$nukemode" = "nuke" ] && \
  150. $err "Cannot modify MAC addresses while nuking vendor files"
  151. # chkvars CONFIG_GBE_BIN_PATH
  152. [ -n "$CONFIG_GBE_BIN_PATH" ] || return 1
  153. e "${CONFIG_GBE_BIN_PATH##*../}" f n && $err "missing gbe file"
  154. [ "$new_mac" != "restore" ] && \
  155. x_ make -C util/nvmutil
  156. x_ mkdir -p tmp
  157. [ -L "tmp/gbe" ] && $err "tmp/gbe exists but is a symlink"
  158. [ -d "tmp/gbe" ] && $err "tmp/gbe exists but is a directory"
  159. if [ -e "tmp/gbe" ]; then
  160. [ -f "tmp/gbe" ] || $err "tmp/gbe exists and is not a file"
  161. fi
  162. x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "tmp/gbe"
  163. [ "$new_mac" != "restore" ] && \
  164. x_ "util/nvmutil/nvm" "tmp/gbe" setmac "$new_mac"
  165. find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" > "tmp/rom.list" \
  166. || $err "'$archive' -> Can't make tmp/rom.list - $dontflash"
  167. while read -r _xrom; do
  168. [ -L "$_xrom" ] && continue
  169. [ -f "$_xrom" ] || continue
  170. "$ifdtool" $ifdprefix -i GbE:"tmp/gbe" "$_xrom" -O \
  171. "$_xrom" || $err "'$_xrom': Can't insert new GbE file"
  172. xchanged="y"
  173. done < "tmp/rom.list"
  174. printf "\nThe following GbE NVM words were written in '%s':\n" \
  175. "$archive"
  176. x_ util/nvmutil/nvm tmp/gbe dump
  177. [ "$new_mac" = "restore" ] && \
  178. printf "\nNOTE: User specified setmac 'restore' argument.\n" && \
  179. printf "Default GbE file '%s' written without running nvmutil.\n" \
  180. "${CONFIG_GBE_BIN_PATH##*../}"; :
  181. }