inject.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. tmpromdel="$XBMK_CACHE/DO_NOT_FLASH"
  7. nvm="util/nvmutil/nvm"
  8. ifdtool="elf/coreboot/default/ifdtool"
  9. cv="CONFIG_GBE_BIN_PATH"
  10. [ -n "$cvxbmk" ] && cv="$cv $cvxbmk"
  11. [ -n "$cvchk" ] && cv="$cv $cvchk"
  12. eval "`setvars "" archive boarddir IFD_platform ifdprefix tree new_mac \
  13. tmpromdir board xchanged $cv`"
  14. inject()
  15. {
  16. remkdir "$tmpromdel"
  17. set +u +e
  18. [ $# -lt 1 ] && err "No options specified"
  19. eval "`setvars "" nuke new_mac xchanged`"
  20. archive="$1";
  21. new_mac="xx:xx:xx:xx:xx:xx"
  22. [ $# -gt 1 ] && case "$2" in
  23. nuke)
  24. new_mac=""
  25. nuke="nuke" ;;
  26. setmac)
  27. [ $# -gt 2 ] && new_mac="$3" && \
  28. [ -z "$new_mac" ] && err "Empty MAC address specified" ;;
  29. *)
  30. err "Unrecognised inject mode: '$2'"
  31. esac
  32. [ "$new_mac" = "keep" ] && new_mac=""
  33. x_ e "$archive" f && check_release
  34. check_target && patch_release
  35. [ "$xchanged" = "y" ] && remktar
  36. xnot=" NOT" && [ "$xchanged" = "y" ] && xnot=""
  37. printf "\n'%s' was%s modified\n" "$archive" "$xnot" 1>&2
  38. x_ rm -Rf "$tmpromdel"
  39. }
  40. check_release()
  41. {
  42. [ -L "$archive" ] && err "'$archive' is a symlink"
  43. archivename="`basename "$archive"`" || err "Can't get '$archive' name"
  44. case "$archivename" in
  45. *_src.tar.xz) err "'$archive' is a src archive, silly!" ;;
  46. *.tar.xz) _stripped_prefix="${archivename#*_}"
  47. board="${_stripped_prefix%.tar.xz}" ;;
  48. *) err "'$archive': could not detect board type" ;;
  49. esac; :
  50. }
  51. check_target()
  52. {
  53. [ "$board" = "${board#serprog_}" ] || return 1
  54. boarddir="$cbcfgsdir/$board"
  55. eval "`setcfg "$boarddir/target.cfg"`"
  56. chkvars tree && x_ ./mk -d coreboot "$tree"
  57. ifdtool="elf/coreboot/$tree/ifdtool"
  58. [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; :
  59. }
  60. patch_release()
  61. {
  62. has_hashes="n"
  63. tmpromdir="$tmpromdel/bin/$board"
  64. remkdir "${tmpromdir%"/bin/$board"}"
  65. x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}"
  66. for _hashes in "vendorhashes" "blobhashes"; do
  67. e "$tmpromdir/$_hashes" f && err \
  68. "'$archive': vendorfile insertion unsupported"; :
  69. done
  70. readkconfig || exit 0
  71. [ -n "$new_mac" ] && [ -n "$CONFIG_GBE_BIN_PATH" ] && modify_mac; :
  72. }
  73. readkconfig()
  74. {
  75. x_ rm -f "$xbtmp/cbcfg"
  76. fx_ scankconfig x_ find "$boarddir/config" -type f
  77. eval "`setcfg "$xbtmp/cbcfg" 1`"
  78. }
  79. scankconfig()
  80. {
  81. for cbc in $cv; do
  82. grep "$cbc" "$1" 1>>"$xbtmp/cbcfg" 2>/dev/null || :
  83. done
  84. }
  85. modify_mac()
  86. {
  87. x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbloc/gbe"
  88. [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \
  89. x_ make -C util/nvmutil clean && x_ make -C util/nvmutil && \
  90. x_ "$nvm" "$xbloc/gbe" setmac "$new_mac"
  91. fx_ newmac x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom"
  92. printf "\nThe following GbE NVM data will be written:\n"
  93. x_ "$nvm" "$xbloc/gbe" dump | grep -v "bytes read from file" || :
  94. }
  95. newmac()
  96. {
  97. e "$1" f && xchanged="y" && x_ \
  98. "$ifdtool" $ifdprefix -i GbE:"$xbloc/gbe" "$1" -O "$1"; :
  99. }
  100. remktar()
  101. {
  102. (
  103. x_ cd "${tmpromdir%"/bin/$board"}"
  104. printf "Re-building tar archive (please wait)\n"
  105. mkrom_tarball "bin/$board" 1>/dev/null
  106. ) || err "Cannot re-generate '$archive'"
  107. mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \
  108. "$archive" || err "'$archive' -> Can't overwrite"; :
  109. }