roms 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #!/usr/bin/env sh
  2. # SPDX-License-Identifier: GPL-3.0-or-later
  3. # Copyright (c) 2014-2016,2020-2021,2023-2024 Leah Rowe <leah@libreboot.org>
  4. # Copyright (c) 2021-2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
  5. # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
  6. # Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
  7. # Copyright (c) 2023 Riku Viitanen <riku.viitanen@protonmail.com>
  8. set -u -e
  9. . "include/lib.sh"
  10. seavgabiosrom="elf/seabios/default/libgfxinit/vgabios.bin"
  11. cfgsdir="config/coreboot"
  12. rp2040src="src/pico-serprog"
  13. rp2040x="$rp2040src/build/pico_serprog.uf2"
  14. picosdk="src/pico-sdk"
  15. rp2040dir="$picosdk/src/boards/include/boards"
  16. stm32src="src/stm32-vserprog"
  17. stm32x="$stm32src/stm32-vserprog.hex"
  18. stm32dir="$stm32src/boards"
  19. # Disable all payloads by default.
  20. # target.cfg files have to specifically enable [a] payload(s)
  21. pv="payload_uboot payload_grub_withseabios payload_seabios payload_memtest t"
  22. pv="$pv payload_seabios_withgrub payload_seabios_grubonly payload_grub"
  23. v="romdir cbrom initmode displaymode cbcfg targetdir tree release ubootelf"
  24. v="$v grub_timeout board grub_scan_disk uboot_config grubtree grubelf tmpmv"
  25. eval "$(setvars "n" $pv)"
  26. eval "$(setvars "" $v boards targets serdir ser)"
  27. main()
  28. {
  29. while [ $# -gt 0 ]; do
  30. if [ "$1" = "serprog" ]; then
  31. [ $# -lt 2 ] && badcmd "serprog type not set"
  32. [ "$2" != "rp2040" ] && [ "$2" != "stm32" ] && badcmd
  33. eval "x_ ./update trees -f \"\${${2}src##*/}\""
  34. ser="$2" && shift 2 && continue
  35. fi
  36. [ "$1$ser" = "list" ] && x_ ls -1 config/coreboot && return
  37. [ "$1" = "all" ] && shift && continue
  38. boards="$1 $boards"; shift 1
  39. done
  40. [ -n "$boards" ] || [ -n "$ser" ] || boards="$(ls -1 \
  41. config/coreboot)" || $err "can't list coreboot boards"
  42. [ -n "$ser" ] && \
  43. eval "serlist \"\$${ser}dir\" > \"\$tmpdir/ser\" || $err \"!ser\""
  44. [ -n "$ser" ] && [ -z "$boards" ] && boards="$(cat "$tmpdir/ser")"
  45. for x in $boards; do
  46. [ -n "$ser" ] && mkserprogfw "$ser" "$x"
  47. [ -z "$ser" ] && [ -d "config/coreboot/$x/config" ] && \
  48. configure_target "$x" && build_payloads && build_board && \
  49. [ -d "bin/$board" ] && targets="$targets, $x"; continue
  50. done
  51. [ -n "$ser" ] && [ "$xbmk_release" = "y" ] && \
  52. mkrom_tarball "bin/serprog_$ser" && return 0
  53. [ -z "$ser" ] && [ -z "$targets" ] && $err "No images were compiled"
  54. printf "DO NOT flash images from elf/ - use bin/ instead. ALSO:\n"
  55. printf "%s\n" "$kbnotice"
  56. }
  57. mkserprogfw()
  58. {
  59. x_ mkdir -p "bin/serprog_$1"
  60. if [ "$1" = "rp2040" ]; then
  61. x_ cmake -DPICO_BOARD="$2" -DPICO_SDK_PATH="$picosdk" \
  62. -B "$rp2040src/build" "$rp2040src"
  63. x_ cmake --build "$rp2040src/build"
  64. else
  65. x_ make -C "$stm32src" libopencm3-just-make BOARD=$2
  66. x_ make -C "$stm32src" BOARD=$2
  67. fi
  68. eval "x_ mv \"\$${1}x\" \"bin/serprog_$1/serprog_$2.\${${1}x##*.}\""
  69. printf "Look in bin/serprog_%s/ for images\n" "$1"
  70. }
  71. serlist()
  72. {
  73. basename -a -s .h "$1/"*.h || $err "$1: can't list boards"
  74. }
  75. configure_target()
  76. {
  77. eval "$(setvars "n" $pv) $(setvars "" $v)"
  78. board="$1"
  79. targetdir="$cfgsdir/$board"
  80. [ -f "$targetdir/target.cfg" ] || $err "$board: target.cfg missing"
  81. # Override the above defaults using target.cfg
  82. . "$targetdir/target.cfg"
  83. [ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata"
  84. [ -n "$grubtree" ] || grubtree="default"
  85. grubelf="elf/grub/$grubtree/payload/grub.elf"
  86. [ -z "$tree" ] && $err "$board: tree not defined"
  87. [ "$payload_memtest" != "y" ] && payload_memtest="n"
  88. [ "$(uname -m)" = "x86_64" ] || payload_memtest="n"
  89. [ "$payload_grub_withseabios" = "y" ] && eval "$(setvars "y" \
  90. payload_grub payload_seabios payload_seabios_withgrub)"
  91. [ "$payload_seabios_withgrub" = "y" ] && payload_seabios="y"
  92. [ "$payload_seabios_grubonly" = "y" ] && \
  93. eval "$(setvars "y" payload_seabios payload_seabios_withgrub)"
  94. # The reverse logic must not be applied. If SeaBIOS-with-GRUB works,
  95. # that doesn't mean GRUB-with-SeaBIOS will, e.g. VGA ROM execution
  96. [ "$payload_grub" != "y" ] && [ "$payload_seabios" != "y" ] && \
  97. [ "$payload_uboot" != "y" ] && $err "'$board' defines no payload"
  98. [ "$payload_uboot" = "y" ] || payload_uboot="n"
  99. [ -n "$uboot_config" ] || uboot_config="default"
  100. [ "$xbmk_release" = "y" ] && [ "$release" = "n" ] && return 1
  101. [ "$board" = "$tree" ] && return 1; return 0
  102. }
  103. build_payloads()
  104. {
  105. romdir="bin/$board"
  106. cbdir="src/coreboot/$board"
  107. [ "$board" = "$tree" ] || cbdir="src/coreboot/$tree"
  108. cbfstool="elf/cbfstool/$tree/cbfstool"
  109. cbrom="$cbdir/build/coreboot.rom"
  110. [ -f "$cbfstool" ] || x_ ./update trees -b coreboot utils $tree
  111. [ "$payload_memtest" = "y" ] && x_ ./update trees -b memtest86plus
  112. [ "$payload_seabios" = "y" ] && x_ ./update trees -b seabios
  113. if [ "$payload_grub" = "y" ] || [ "$payload_seabios_withgrub" = "y" ] \
  114. || [ "$payload_seabios_grubonly" = "y" ]; then
  115. [ -f "$grubelf" ] || x_ ./update trees -b grub $grubtree
  116. fi
  117. [ "$payload_uboot" = "y" ] || return 0
  118. x_ ./update trees -b u-boot $board
  119. ubdir="elf/u-boot/$board/$uboot_config"
  120. ubootelf="$ubdir/u-boot.elf" && [ ! -f "$ubootelf" ] && \
  121. ubootelf="$ubdir/u-boot"
  122. [ -f "$ubootelf" ] || $err "$board: Can't find u-boot"; return 0
  123. }
  124. build_board()
  125. {
  126. x_ rm -Rf "$romdir"
  127. for it in "normal" "vgarom" "libgfxinit"; do
  128. initmode="$it"
  129. hmode="vesafb"
  130. [ "$initmode" = "vgarom" ] || hmode="corebootfb"
  131. modes="$hmode txtmode"
  132. for y in $modes; do
  133. displaymode="$y"
  134. [ "$initmode" = "normal" ] && \
  135. [ "$displaymode" != "txtmode" ] && continue
  136. cbcfg="$targetdir/config/${initmode}_$displaymode"
  137. [ "$initmode" = "normal" ] && cbcfg="${cbcfg%_*}"
  138. e "$cbcfg" f not || build_roms; x_ rm -f "$cbrom"
  139. done
  140. done
  141. }
  142. build_roms()
  143. {
  144. x_ ./update trees -b coreboot $board
  145. _cbrom="$cbelfdir/$board/${initmode}_$displaymode"
  146. [ "$initmode" = "normal" ] && _cbrom="${_cbrom%"_$displaymode"}"
  147. _cbrom="$_cbrom/coreboot.rom"
  148. cbrom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
  149. x_ cp "$_cbrom" "$cbrom"
  150. [ "$payload_memtest" != "y" ] || cbfs "$cbrom" \
  151. "elf/memtest86plus/memtest.bin" img/memtest
  152. [ "$payload_seabios" = "y" ] && build_seabios_roms
  153. [ "$payload_grub" != "y" ] || build_grub_roms "$cbrom" "grub"
  154. [ "$payload_uboot" = "y" ] && x_ cp "$_cbrom" "$cbrom" && \
  155. build_uboot_roms; return 0
  156. }
  157. build_seabios_roms()
  158. {
  159. if [ "$payload_seabios_withgrub" = "y" ]; then
  160. t="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
  161. x_ cp "$cbrom" "$t"
  162. build_grub_roms "$t" "seabios_withgrub"
  163. else
  164. t="$(mkSeabiosRom "$cbrom" "fallback/payload")" || \
  165. $err "build_seabios_roms: cannot build tmprom"
  166. newrom="$romdir/seabios_${board}_${initmode}_$displaymode"
  167. [ "$initmode" = "normal" ] && newrom="$romdir/seabios" \
  168. && newrom="${newrom}_${board}_$initmode"
  169. cprom cp "$t" "$newrom.rom"
  170. fi
  171. x_ rm -f "$t"
  172. }
  173. # Make separate ROM images with GRUB payload
  174. build_grub_roms()
  175. {
  176. tmprom="$1"
  177. payload1="$2" # allow values: grub, seabios, seabios_withgrub
  178. grub_cbfs="fallback/payload"
  179. if [ "$payload1" = "grub" ] && [ "$payload_grub_withseabios" = "y" ]
  180. then
  181. tmpmv="$(mkSeabiosRom "$tmprom" "seabios.elf")" || \
  182. $err "build_grub_roms 1 $board: can't build tmprom"
  183. elif [ "$payload1" != "grub" ] && [ "$payload_seabios_withgrub" = "y" ]
  184. then
  185. grub_cbfs="img/grub2"
  186. tmpmv="$(mkSeabiosRom "$tmprom" fallback/payload)" || \
  187. $err "build_grub_roms 2 $board: can't build tmprom"
  188. fi
  189. [ -n "$tmpmv" ] && [ -f "$tmpmv" ] && x_ mv "$tmpmv" "$tmprom"
  190. # we only need insert grub.elf once, for each coreboot config:
  191. cbfs "$tmprom" "$grubelf" "$grub_cbfs"
  192. printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \
  193. > "$tmpdir/tmpcfg" || $err "set grub_scan_disk, $grub_scan_disk"
  194. cbfs "$tmprom" "$tmpdir/tmpcfg" scan.cfg raw
  195. newrom="$romdir/${payload1}_${board}_${initmode}_$displaymode.rom"
  196. [ "$initmode" = "normal" ] && newrom="$romdir/${payload1}_" \
  197. && newrom="$newrom${board}_$initmode.rom"
  198. cprom cp "$tmprom" "$newrom"
  199. [ "$payload1" = "grub" ] && return 0
  200. cbfs "$tmprom" "$grubdata/bootorder" bootorder raw
  201. cprom cp "$tmprom" "${newrom%.rom}_grubfirst.rom"
  202. [ "$payload_seabios_grubonly" = "y" ] || return 0
  203. x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/show-boot-menu
  204. cprom cp "$tmprom" "${newrom%.rom}_grubonly.rom"
  205. }
  206. # make a rom in /tmp/ and then print the path of that ROM
  207. mkSeabiosRom() {
  208. tmprom="$(mktemp -t coreboot_rom.XXXXXXXXXX)" # 1=cbrom, 2=cbfs path
  209. _seabioself="elf/seabios/default/$initmode/bios.bin.elf"
  210. x_ cp "$1" "$tmprom"
  211. cbfs "$tmprom" "$_seabioself" "$2"
  212. x_ "$cbfstool" "$tmprom" add-int -i 3000 -n etc/ps2-keyboard-spinup
  213. z="2"; [ "$initmode" = "vgarom" ] && z="0"
  214. x_ "$cbfstool" "$tmprom" add-int -i $z -n etc/pci-optionrom-exec
  215. x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/optionroms-checksum
  216. [ "$initmode" != "libgfxinit" ] || cbfs "$tmprom" "$seavgabiosrom" \
  217. vgaroms/seavgabios.bin raw
  218. printf "%s\n" "$tmprom"
  219. }
  220. build_uboot_roms()
  221. {
  222. tmprom="$(mktemp -t coreboot_rom.XXXXXXXXXX)"
  223. newrom="$romdir/uboot_payload_${board}_${initmode}_$displaymode.rom"
  224. x_ cp "$cbrom" "$tmprom"
  225. cbfs "$tmprom" "$ubootelf" "fallback/payload"
  226. cprom mv "$tmprom" "$newrom"
  227. }
  228. cprom()
  229. {
  230. printf "Creating target image: %s\n" "$3"
  231. x_ mkdir -p "${3%/*}"
  232. x_ $1 "$2" "$3"
  233. [ "$xbmk_release" = "y" ] && mksha512sum "$3" "vendorhashes" && \
  234. x_ ./vendor inject -r "$3" -b "$board" -n nuke; return 0
  235. }
  236. main $@