rom.sh 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. # SPDX-License-Identifier: GPL-3.0-or-later
  2. # Copyright (c) 2014-2016,2020-2021,2023-2025 Leah Rowe <leah@libreboot.org>
  3. # Copyright (c) 2021-2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
  4. # Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
  5. # Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
  6. # Copyright (c) 2023-2024 Riku Viitanen <riku.viitanen@protonmail.com>
  7. grubdata="config/data/grub"
  8. buildser()
  9. {
  10. [ "$1" = "pico" ] && x_ cmake -DPICO_BOARD="$2" \
  11. -DPICO_SDK_PATH="$picosdk" -B "$sersrc/build" "$sersrc" && \
  12. x_ cmake --build "$sersrc/build"
  13. [ "$1" = "stm32" ] && x_ make -C "$sersrc" libopencm3-just-make \
  14. BOARD=$2 && x_ make -C "$sersrc" BOARD=$2
  15. x_ mkdir -p "bin/serprog_$1"
  16. x_ mv "$serx" "bin/serprog_$1/serprog_$2.${serx##*.}"
  17. }
  18. copyps1bios()
  19. {
  20. remkdir "bin/playstation"
  21. x_ cp src/pcsx-redux/src/mips/openbios/openbios.bin bin/playstation
  22. printf "MIT License\n\nCopyright (c) 2019-2024 PCSX-Redux authors\n\n" \
  23. > bin/playstation/COPYING.txt || err "!pcsx-redux copyright"
  24. cat config/snippet/mit >>bin/playstation/COPYING.txt || err "!pcsx MIT"
  25. }
  26. mkpayload_grub()
  27. {
  28. eval "`setvars "" grub_modules grub_install_modules`"
  29. $dry eval "`setcfg "$grubdata/module/$tree"`"
  30. $dry x_ rm -f "$srcdir/grub.elf"; $dry \
  31. x_ "$srcdir/grub-mkstandalone" --grub-mkimage="$srcdir/grub-mkimage" \
  32. -O i386-coreboot -o "$srcdir/grub.elf" -d "${srcdir}/grub-core/" \
  33. --fonts= --themes= --locales= --modules="$grub_modules" \
  34. --install-modules="$grub_install_modules" \
  35. "/boot/grub/grub_default.cfg=${srcdir}/.config" \
  36. "/boot/grub/grub.cfg=$grubdata/memdisk.cfg"; :
  37. }
  38. mkvendorfiles()
  39. {
  40. [ -z "$mode" ] && $dry cook_coreboot_config
  41. check_coreboot_utils "$tree"
  42. printf "%s\n" "${version%%-*}" > "$srcdir/.coreboot-version" || \
  43. err "!mk $srcdir .coreboot-version"
  44. [ -z "$mode" ] && [ "$target" != "$tree" ] && \
  45. x_ ./mk download "$target"; :
  46. }
  47. cook_coreboot_config()
  48. {
  49. [ -f "$srcdir/.config" ] || return 0
  50. printf "CONFIG_CCACHE=y\n" >> "$srcdir/.config" || \
  51. err "$srcdir/.config: Could not enable ccache"
  52. make -C "$srcdir" oldconfig || err "Could not cook $srcdir/.config"; :
  53. }
  54. check_coreboot_utils()
  55. {
  56. for util in cbfstool ifdtool; do
  57. [ "$badhash" = "y" ] && x_ rm -f "elf/$util/$1/$util"
  58. e "elf/$util/$1/$util" f && continue
  59. utilelfdir="elf/$util/$1"
  60. utilsrcdir="src/coreboot/$1/util/$util"
  61. utilmode="" && [ -n "$mode" ] && utilmode="clean"
  62. x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs
  63. if [ -z "$mode" ] && [ ! -f "$utilelfdir/$util" ]; then
  64. x_ mkdir -p "$utilelfdir"
  65. x_ cp "$utilsrcdir/$util" "$utilelfdir"
  66. [ "$util" = "cbfstool" ] || continue
  67. x_ cp "$utilsrcdir/rmodtool" "$utilelfdir"
  68. elif [ -n "$mode" ]; then
  69. x_ rm -Rf "$utilelfdir"
  70. fi; :
  71. done; :
  72. }
  73. mkcorebootbin()
  74. {
  75. [ "$target" = "$tree" ] && return 0
  76. tmprom="$xbmktmp/coreboot.rom"
  77. $dry x_ cp "$srcdir/build/coreboot.rom" "$tmprom"
  78. initmode="${defconfig##*/}"
  79. displaymode="${initmode##*_}"
  80. [ "$displaymode" = "$initmode" ] && displaymode="" # "normal" config
  81. initmode="${initmode%%_*}"
  82. cbfstool="elf/cbfstool/$tree/cbfstool"
  83. [ "$payload_uboot_i386" = "y" ] && \
  84. [ "$payload_uboot_amd64" = "y" ] && \
  85. err "'$target' enables 32- and 64-bit x86 U-Boot"
  86. if [ "$payload_uboot_i386" = "y" ] || \
  87. [ "$payload_uboot_amd64" = "y" ]; then
  88. printf "'%s' has x86 U-Boot; assuming SeaBIOS=y\n" \
  89. "$target" 1>&2
  90. payload_seabios="y"
  91. fi
  92. [ -n "$uboot_config" ] || uboot_config="default"
  93. [ "$payload_uboot" = "y" ] || payload_seabios="y"
  94. [ "$payload_grub" = "y" ] && payload_seabios="y"
  95. [ "$payload_seabios" = "y" ] && [ "$payload_uboot" = "y" ] && \
  96. $dry err "$target: U-Boot(arm64) and SeaBIOS/GRUB both enabled."
  97. [ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata"
  98. [ -n "$grubtree" ] || grubtree="default"
  99. grubelf="elf/grub/$grubtree/payload/grub.elf"
  100. [ "$payload_memtest" = "y" ] || payload_memtest="n"
  101. [ "$(uname -m)" = "x86_64" ] || payload_memtest="n"
  102. [ "$payload_grubsea" = "y" ] && [ "$initmode" = "normal" ] && \
  103. payload_grubsea="n"
  104. [ "$payload_grub" = "y" ] || payload_grubsea="n"
  105. if $dry grep "CONFIG_PAYLOAD_NONE=y" "$defconfig"; then
  106. [ "$payload_seabios" = "y" ] && pname="seabios" && \
  107. $dry add_seabios
  108. [ "$payload_uboot" = "y" ] && pname="uboot" && $dry add_uboot
  109. else
  110. pname="custom"
  111. $dry cprom
  112. fi; :
  113. }
  114. add_seabios()
  115. {
  116. if [ "$payload_uboot_i386" = "y" ] || \
  117. [ "$payload_uboot_amd64" = "y" ]; then
  118. $dry add_uboot
  119. fi
  120. _seabioself="elf/seabios/default/$initmode/bios.bin.elf"
  121. _seaname="fallback/payload" && [ "$payload_grubsea" = "y" ] && \
  122. _seaname="seabios.elf"
  123. cbfs "$tmprom" "$_seabioself" "$_seaname"
  124. x_ "$cbfstool" "$tmprom" add-int -i 3000 -n etc/ps2-keyboard-spinup
  125. _z="2" && [ "$initmode" = "vgarom" ] && _z="0"
  126. x_ "$cbfstool" "$tmprom" add-int -i $_z -n etc/pci-optionrom-exec
  127. x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/optionroms-checksum
  128. [ "$initmode" = "libgfxinit" ] && \
  129. cbfs "$tmprom" "$seavgabiosrom" vgaroms/seavgabios.bin raw
  130. [ "$payload_memtest" = "y" ] && cbfs "$tmprom" \
  131. "elf/memtest86plus/memtest.bin" img/memtest
  132. [ "$payload_grub" = "y" ] && add_grub
  133. [ "$payload_grubsea" != "y" ] && cprom
  134. [ "$payload_uboot_amd64" = "y" ] && [ "$displaymode" != "txtmode" ] && \
  135. [ "$initmode" != "normal" ] && [ "$payload_grubsea" != "y" ] && \
  136. pname="seauboot" && cprom "seauboot"
  137. [ "$payload_grub" = "y" ] && pname="seagrub" && mkseagrub; :
  138. }
  139. add_grub()
  140. {
  141. _grubname="img/grub2" && [ "$payload_grubsea" = "y" ] && \
  142. _grubname="fallback/payload"
  143. cbfs "$tmprom" "$grubelf" "$_grubname"
  144. printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \
  145. > "$xbmktmp/tmpcfg" || err "$target: !insert scandisk"
  146. cbfs "$tmprom" "$xbmktmp/tmpcfg" scan.cfg raw
  147. [ "$initmode" != "normal" ] && [ "$displaymode" != "txtmode" ] && \
  148. cbfs "$tmprom" "$grubdata/background/background1280x800.png" \
  149. "background.png" raw; :
  150. }
  151. mkseagrub()
  152. {
  153. [ "$payload_grubsea" = "y" ] && pname="grub"
  154. [ "$payload_grubsea" = "y" ] || \
  155. cbfs "$tmprom" "$grubdata/bootorder" bootorder raw
  156. fx_ cprom x_ find "$grubdata/keymap" -type f -name "*.gkb"
  157. }
  158. add_uboot()
  159. {
  160. if [ "$displaymode" = "txtmode" ]; then
  161. printf "cb/%s: Cannot use U-Boot in text mode\n" \
  162. "$target" 1>&2
  163. return 0
  164. elif [ "$initmode" = "normal" ]; then
  165. printf "cb/%s: Cannot use U-Boot in normal initmode\n" \
  166. "$target" 1>&2
  167. return 0
  168. fi
  169. # TODO: re-work to allow each coreboot target to say which ub tree
  170. # instead of hardcoding as in the current logic below:
  171. # aarch64 targets:
  172. ubcbfsargs=""
  173. ubpath="fallback/payload"
  174. ubtarget="$target"
  175. # override for x86/x86_64 targets:
  176. if [ "$payload_uboot_i386" = "y" ] || \
  177. [ "$payload_uboot_amd64" = "y" ]; then
  178. ubcbfsargs="-l 0x1110000 -e 0x1110000" # 64-bit and 32-bit
  179. # on 64-bit, 0x1120000 is the SPL, and stub before that
  180. ubpath="img/u-boot" # 64-bit
  181. ubtarget="amd64coreboot"
  182. [ "$payload_uboot_i386" = "y" ] && ubpath="u-boot" # 32-bit
  183. [ "$payload_uboot_i386" = "y" ] && ubtarget="i386coreboot"; :
  184. fi
  185. ubdir="elf/u-boot/$ubtarget/$uboot_config"
  186. # aarch64 targets:
  187. ubootelf="$ubdir/u-boot.elf" && [ ! -f "$ubootelf" ] && \
  188. ubootelf="$ubdir/u-boot"
  189. # override for x86/x86_64 targets:
  190. [ "$payload_uboot_i386" = "y" ] && ubootelf="$ubdir/u-boot-dtb.bin"
  191. [ "$payload_uboot_amd64" = "y" ] && \
  192. ubootelf="$ubdir/u-boot-x86-with-spl.bin" # EFI-compatible
  193. cbfs "$tmprom" "$ubootelf" "$ubpath" $ubcbfsargs
  194. [ "$payload_seabios" = "y" ] || cprom; :
  195. }
  196. cprom()
  197. {
  198. cpcmd="cp"
  199. tmpnew=""; newrom="bin/$target/${pname}_${target}_$initmode.rom"
  200. [ -n "$displaymode" ] && newrom="${newrom%.rom}_$displaymode.rom"
  201. [ $# -gt 0 ] && [ "${1%.gkb}" != "$1" ] && tmpnew="${1##*/}" && \
  202. newrom="${newrom%.rom}_${tmpnew%.gkb}.rom"
  203. irom="$tmprom"
  204. [ $# -lt 1 ] || irom="`mktemp`" || err "!mk irom, $(echo "$@")"
  205. [ $# -gt 0 ] && x_ cp "$tmprom" "$irom" && cpcmd="mv"
  206. [ $# -gt 0 ] && [ "${1%.gkb}" != "$1" ] && \
  207. cbfs "$irom" "$grubdata/keymap/$tmpnew" keymap.gkb raw
  208. [ $# -gt 0 ] && [ "$1" = "seauboot" ] && \
  209. cbfs "$irom" "$grubdata/bootorder_uboot" bootorder raw; :
  210. printf "Creating new %s image: '%s'\n" "$projectname" "$newrom"
  211. x_ mkdir -p "bin/$target"
  212. x_ $cpcmd "$irom" "$newrom"
  213. }
  214. cbfs()
  215. {
  216. ccmd="add-payload" && [ $# -gt 3 ] && [ $# -lt 5 ] && ccmd="add"
  217. lzma="-c lzma" && [ $# -gt 3 ] && [ $# -lt 5 ] && lzma="-t $4"
  218. [ $# -gt 4 ] && [ "$5" = "0x1110000" ] && \
  219. ccmd="add-flat-binary" && \
  220. lzma="-c lzma -l 0x1110000 -e 0x1110000"
  221. x_ "$cbfstool" "$1" $ccmd -f "$2" -n "$3" $lzma
  222. }
  223. mkcoreboottar()
  224. {
  225. [ "$target" = "$tree" ] && return 0
  226. [ "$XBMK_RELEASE" = "y" ] || return 0
  227. [ "$release" != "n" ] || return 0
  228. $dry mkrom_tarball "bin/$target"
  229. $dry x_ ./mk inject "bin/${relname}_${target}.tar.xz" nuke; :
  230. }