]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/boot/full-test.sh
zfs: merge openzfs/zfs@86e115e21
[FreeBSD/FreeBSD.git] / tools / boot / full-test.sh
1 #!/bin/sh
2
3 # STAND_ROOT is the root of a tree:
4 # cache - Cached binaries that we have downloaded
5 # trees - binary trees that we use to make image
6 #      trees/${ARCH}/$thing
7 # images - bootable images that we use to test
8 #       images/${ARCH}/$thing
9 # bios - cached bios images (as well as 'vars' files when we start testing
10 #       different booting scenarios in the precense / absence of variables).
11 # scripts - generated scripts that uses images to run the tests.
12 #
13 # Strategy:
14 #       Download FreeBSD release isos, Linux kernels (for the kboot tests) and
15 #       other misc things. We use these to generate dozens of test images that we
16 #       use qemu-system-XXXX to boot. They all boot the same thing at the moment:
17 #       an /etc/rc script that prints the boot method, echos success and then
18 #       halts.
19
20 # What version of FreeBSD to we snag the ISOs from to extract the binaries
21 # we are testing
22 FREEBSD_VERSION=13.1
23 # eg https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/13.1/FreeBSD-13.1-RELEASE-amd64-bootonly.iso.xz
24 URLBASE="https://download.freebsd.org/releases"
25 : ${STAND_ROOT:="${HOME}/stand-test-root"}
26 CACHE=${STAND_ROOT}/cache
27 TREES=${STAND_ROOT}/trees
28 IMAGES=${STAND_ROOT}/images
29 BIOS=${STAND_ROOT}/bios
30 SCRIPTS=${STAND_ROOT}/scripts
31 OVERRIDE=${STAND_ROOT}/override
32
33 # hack -- I have extra junk in my qemu, but it's not needed to recreate things
34 if [ $(whoami) = imp ]; then
35     qemu_bin=/home/imp/git/qemu/00-build
36 else
37     qemu_bin=/usr/local/bin
38 fi
39
40 # All the architectures under test
41 # Note: we can't yet do armv7 because we don't have a good iso for it and would
42 # need root to extract the files.
43 ARCHES="amd64:amd64 i386:i386 powerpc:powerpc powerpc:powerpc64 powerpc:powerpc64le powerpc:powerpcspe arm64:aarch64 riscv:riscv64"
44
45 # The smallest FAT32 filesystem is 33292 KB
46 espsize=33292
47
48 SRCTOP=$(make -v SRCTOP)
49
50 mkdir -p ${CACHE} ${TREES} ${IMAGES} ${BIOS}
51
52 die()
53 {
54     echo Fatal Error: $*
55     exit 1
56 }
57
58 ma_combo()
59 {
60     local m=$1
61     local ma=$2
62     local ma_combo="${m}"
63
64     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
65     echo ${ma_combo}
66 }
67
68 fetch_one()
69 {
70     local m=$1
71     local ma=$2
72     local v=$3
73     local flavor=$4
74     local ma_combo=$(ma_combo $m $ma)
75     local file="FreeBSD-${v}-RELEASE-${ma_combo}-${flavor}"
76     local url="${URLBASE}/${m}/${ma}/ISO-IMAGES/${v}/${file}.xz"
77
78     mkdir -p ${CACHE}
79     [ -r ${CACHE}/${file} ] && echo "Using cached ${file}" && return
80     cd ${CACHE}
81     echo "Fetching ${url}"
82     fetch ${url} || die "Can't fetch ${file} from ${url}"
83     xz -d ${file}.xz || die "Can't uncompress ${file}.xz"
84     cd ..
85 }
86
87 update_freebsd_img_cache()
88 {
89     local a m ma
90
91     for a in $ARCHES; do
92         m=${a%%:*}
93         ma=${a##*:}
94         fetch_one $m $ma ${FREEBSD_VERSION} bootonly.iso
95     done
96
97     fetch_one arm armv7 ${FREEBSD_VERSION} GENERICSD.img
98 }
99
100 make_minimal_freebsd_tree()
101 {
102     local m=$1
103     local ma=$2
104     local v=$3
105     local flavor=$4
106     local file d
107     local ma_combo="${m}"
108     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
109
110     file="FreeBSD-${v}-RELEASE-${ma_combo}-${flavor}"
111     dir=${TREES}/${ma_combo}/freebsd
112     rm -rf ${dir}
113
114     # Make a super simple userland. It has just enough to print a santiy value,
115     # then say test succeeded, and then halt the system. We assume that /bin/sh
116     # has all the library prereqs for the rest...
117     mkdir -p ${dir}
118     # Make required dirs
119     for d in boot/kernel boot/defaults boot/lua boot/loader.conf.d \
120                          sbin bin lib libexec etc dev; do
121         mkdir -p ${dir}/${d}
122     done
123     # Pretend we don't have a separate /usr
124     ln -s . ${dir}/usr
125     # snag the binaries for my simple /etc/rc file
126     tar -C ${dir} -xf ${CACHE}/$file sbin/reboot sbin/halt sbin/init bin/sh sbin/sysctl \
127         lib/libncursesw.so.9 lib/libc.so.7 lib/libedit.so.8 libexec/ld-elf.so.1
128
129     # My simple etc/rc
130     cat > ${dir}/etc/rc <<EOF
131 #!/bin/sh
132
133 sysctl machdep.bootmethod
134 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
135 halt -p
136 EOF
137     chmod +x ${dir}/etc/rc
138
139     # Check to see if we have overrides here... So we can insert our own kernel
140     # instead of the one from the release.
141     echo "CHECKING ${OVERRIDE}/${ma_combo}/boot"
142     if [ -d ${OVERRIDE}/${ma_combo}/boot ]; then
143         o=${OVERRIDE}/${ma_combo}
144         for i in \
145             boot/device.hints \
146             boot/kernel/kernel \
147             boot/kernel/acl_nfs4.ko \
148             boot/kernel/cryptodev.ko \
149             boot/kernel/zfs.ko \
150             boot/kernel/geom_eli.ko; do
151             [ -r $o/$i ] && echo Copying override $i && cp $o/$i ${dir}/$i
152         done
153     else
154         # Copy the kernel (but not the boot loader, we'll add the one to test later)
155         # This will take care of both UFS and ZFS boots as well as geli
156         # Note: It's OK for device.hints to be missing. It's mostly for legacy platforms.
157         tar -C ${dir} -xf ${CACHE}/$file \
158             boot/device.hints \
159             boot/kernel/kernel \
160             boot/kernel/acl_nfs4.ko \
161             boot/kernel/cryptodev.ko \
162             boot/kernel/zfs.ko \
163             boot/kernel/geom_eli.ko || true
164         # XXX WHAT TO DO ABOUT LINKER HINTS -- PUNT FOR NOW
165         # XXX also, ZFS not supported on 32-bit powerpc platforms
166     fi
167
168     # Setup some common settings for serial console, etc
169     echo -h -D -S115200 > ${dir}/boot.config
170     cat > ${dir}/boot/loader.conf <<EOF
171 comconsole_speed=115200
172 autoboot_delay=2
173 zfs_load="YES"
174 boot_verbose=yes
175 kern.cfg.order="acpi,fdt"
176 EOF
177 }
178
179 make_freebsd_minimal_trees()
180 {
181     for a in $ARCHES; do
182         m=${a%%:*}
183         ma=${a##*:}
184         make_minimal_freebsd_tree $m $ma ${FREEBSD_VERSION} bootonly.iso
185     done
186     # Note: armv7 isn't done yet as its the odd-man out -- we need to extract things
187     # in a special way, so punt for the moment
188 }
189
190 make_freebsd_test_trees()
191 {
192     for a in $ARCHES; do
193         m=${a%%:*}
194         ma=${a##*:}
195         ma_combo="${m}"
196         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
197         dir=${TREES}/${ma_combo}/test-stand
198         mkdir -p ${dir}
199         mtree -deUW -f ${SRCTOP}/etc/mtree/BSD.root.dist -p ${dir}
200         echo "Creating tree for ${m}:${ma}"
201         cd ${SRCTOP}/stand
202         # Indirection needed because our build system is too complex
203 #       SHELL="make clean" make buildenv TARGET=${m} TARGET_ARCH=${ma}
204         SHELL="make -j 100 all" make buildenv TARGET=${m} TARGET_ARCH=${ma}
205         SHELL="make install DESTDIR=${dir} MK_MAN=no MK_INSTALL_AS_USER=yes WITHOUT_DEBUG_FILES=yes" \
206              make buildenv TARGET=${m} TARGET_ARCH=${ma}
207         rm -rf ${dir}/bin ${dir}/[ac-z]*        # Don't care about anything here
208     done
209 }
210
211 make_linux_initrds()
212 {
213     # At the moment, we have just two
214     for a in amd64:amd64 arm64:aarch64; do
215         m=${a%%:*}
216         ma=${a##*:}
217         ma_combo="${m}"
218         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
219         dir=${TREES}/${ma_combo}/linuxboot
220         dir2=${TREES}/${ma_combo}/test-stand
221         dir3=${TREES}/${ma_combo}/freebsd
222         initrd=${TREES}/${ma_combo}/initrd.img
223         rm -rf ${dir}
224         mkdir -p ${dir}
225         cp ${dir2}/boot/loader.kboot ${dir}/init
226         # Copy the boot loader
227         tar -c -f - -C ${dir2} boot | tar -xf - -C ${dir}
228         # Copy the boot kernel
229         tar -c -f - -C ${dir3} boot | tar -xf - -C ${dir}
230         (cd ${dir} ; find . | LC_ALL=C sort | cpio -o -H newc | gzip > ${initrd})
231     done
232 }
233
234 make_linux_esps()
235 {
236     # At the moment, we have just two
237     for a in amd64:amd64 arm64:aarch64; do
238         m=${a%%:*}
239         ma=${a##*:}
240         ma_combo="${m}"
241         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
242         dir=${TREES}/${ma_combo}/linuxboot-esp
243         initrd=${TREES}/${ma_combo}/initrd.img
244         mkdir -p ${dir}
245         case ${ma} in
246             amd64) bin=x64 cons="console=ttyS0,115200" ;;
247             aarch64) bin=aa64 ;;
248         esac
249         mkdir -p ${dir}/efi/boot
250         cp ${CACHE}/linux/linux${bin}.efi ${dir}
251         cp ${CACHE}/linux/shell${bin}.efi ${dir}/efi/boot/boot${bin}.efi
252         cat > ${dir}/startup.nsh <<EOF
253 # Run linux
254 # Tell it to run with out special initrd that then boot FreeBSD
255
256 \linux${bin} ${cons} initrd=\initrd.img
257 EOF
258         cp $initrd ${dir}
259     done
260 }
261
262 make_linuxboot_images()
263 {
264     # ESP variant: In this variant, amd64 and arm64 are both created more or
265     # less the same way. Both are EFI + ACPI implementations
266     for a in amd64:amd64 arm64:aarch64; do
267         m=${a%%:*}
268         ma=${a##*:}
269         ma_combo="${m}"
270         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
271         src=${TREES}/${ma_combo}/linuxboot-esp
272         dir=${TREES}/${ma_combo}/freebsd
273         dir2=${TREES}/${ma_combo}/test-stand
274         esp=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}.esp
275         ufs=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}.ufs
276         zfs=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}.zfs
277         img=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}.img
278         img2=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}-zfs.img
279         pool="linuxboot"
280         mkdir -p ${IMAGES}/${ma_combo}
281         makefs -t msdos -o fat_type=32 -o sectors_per_cluster=1 \
282                -o volume_label=EFISYS -s80m ${esp} ${src}
283         makefs -t ffs -B little -s 200m -o label=root ${ufs} ${dir} ${dir2}
284         mkimg -s gpt -p efi:=${esp} -p freebsd-ufs:=${ufs} -o ${img}
285         makefs -t zfs -s 200m \
286                -o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
287                 ${zfs} ${dir} ${dir2}
288         mkimg -s gpt \
289               -p efi:=${esp} \
290               -p freebsd-zfs:=${zfs} -o ${img2}
291         rm -f ${esp}    # Don't need to keep this around
292     done
293
294     # The raw variant, currently used only on arm64. It boots with the raw interface of qemu
295     # for testing purposes.  This means it makes a good test for the DTB variation, but not ACPI
296     # since qemu doesn't currently provide that...
297     for a in arm64:aarch64; do
298         m=${a%%:*}
299         ma=${a##*:}
300         ma_combo="${m}"
301         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
302         linux="${CACHE}/linux/vmlinux-${m}*"
303         initrd=${TREES}/${ma_combo}/initrd.img
304         img=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}-raw
305         cp ${linux} ${img}.kernel
306         cp ${initrd} ${img}.initrd
307     done
308 }
309
310 make_linuxboot_scripts()
311 {
312     # At the moment, we have just two -- and the images we've built so far are just
313     # the hostfs boot. The boot off anything more complex isn't here.
314     for a in amd64:amd64 arm64:aarch64; do
315         m=${a%%:*}
316         ma=${a##*:}
317         ma_combo="${m}"
318         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
319
320         # First off, update the edk firmware
321         bios_code=${BIOS}/edk2-${ma_combo}-code.fd
322         bios_vars=${BIOS}/edk2-${ma_combo}-vars.fd
323         case ${ma} in
324             amd64)
325                 if [ ${bios_code} -ot /usr/local/share/qemu/edk2-x86_64-code.fd ]; then
326                     cp /usr/local/share/qemu/edk2-x86_64-code.fd ${bios_code}
327                     # vars file works on both 32 and 64 bit x86
328                     cp /usr/local/share/qemu/edk2-i386-vars.fd ${bios_vars}
329                 fi
330                 ;;
331             aarch64)
332                 if [ ${bios_code} -ot /usr/local/share/qemu/edk2-aarch64-code.fd ]; then
333                     # aarch64 vars starts as an empty file
334                     dd if=/dev/zero of=${bios_code} bs=1M count=64
335                     dd if=/dev/zero of=${bios_vars} bs=1M count=64
336                     dd if=/usr/local/share/qemu/edk2-aarch64-code.fd of=${bios_code} conv=notrunc
337                 fi
338                 ;;
339         esac
340
341         # Now make me a script
342         img=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}.img
343         img2=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}-raw
344         img3=${IMAGES}/${ma_combo}/linuxboot-${ma_combo}-zfs.img
345         out=${SCRIPTS}/${ma_combo}/linuxboot-test.sh
346         out2=${SCRIPTS}/${ma_combo}/linuxboot-test-raw.sh
347         out3=${SCRIPTS}/${ma_combo}/linuxboot-test-zfs.sh
348         cd=${CACHE}/FreeBSD-13.1-RELEASE-arm64-aarch64-bootonly.iso
349         mkdir -p ${SCRIPTS}/${ma_combo}
350         case ${ma} in
351             amd64)
352                 cat > ${out} <<EOF
353 ${qemu_bin}/qemu-system-x86_64 -nographic -m 512M \\
354         -drive file=${img},if=none,id=drive0,cache=writeback,format=raw \\
355         -device virtio-blk,drive=drive0,bootindex=0 \\
356         -drive file=${bios_code},format=raw,if=pflash \\
357         -drive file=${bios_vars},format=raw,if=pflash \\
358         -monitor telnet::4444,server,nowait \\
359         -serial stdio \$*
360 EOF
361                 ;;
362             aarch64)
363                 # ESP version
364                 raw=${IMAGES}/${ma_combo}/freebsd-arm64-aarch64.img
365                 cat > ${out} <<EOF
366 ${qemu_bin}/qemu-system-aarch64 -nographic -machine virt,gic-version=3 -m 512M -smp 4 \\
367         -cpu cortex-a57 \\
368         -drive file=${img},if=none,id=drive0,cache=writeback \\
369         -device virtio-blk,drive=drive0,bootindex=0 \\
370         -drive file=${raw},if=none,id=drive1,cache=writeback \\
371         -device nvme,serial=fboot,drive=drive1,bootindex=1 \\
372         -drive file=${bios_code},format=raw,if=pflash \\
373         -drive file=${bios_vars},format=raw,if=pflash \\
374         -monitor telnet::4444,server,nowait \\
375         -serial stdio \$*
376 EOF
377                 # RAW version
378                 # Note: We have to use cortex-a57 for raw mode because the
379                 # kernel we use has issues with max.
380                 cat > ${out2} <<EOF
381 ${qemu_bin}/qemu-system-aarch64 -m 1024 -cpu cortex-a57 -M virt \\
382         -kernel ${img2}.kernel -initrd ${img2}.initrd \\
383         -append "console=ttyAMA0" \\
384         -drive file=${cd},if=none,id=drive0,cache=writeback,format=raw \\
385         -device virtio-blk,drive=drive0,bootindex=0 \\
386         -nographic -monitor telnet::4444,server,nowait \\
387         -serial stdio \$*
388 EOF
389                 # ZFS version
390                 # Note: We have to use cortex-a57 for raw mode because the
391                 # kernel we use has issues with max.
392                 cat > ${out3} <<EOF
393 ${qemu_bin}/qemu-system-aarch64 -nographic -machine virt,gic-version=3 -m 512M -smp 4 \\
394         -cpu cortex-a57 \\
395         -drive file=${img3},if=none,id=drive0,cache=writeback \\
396         -device virtio-blk,drive=drive0,bootindex=0 \\
397         -drive file=${bios_code},format=raw,if=pflash \\
398         -drive file=${bios_vars},format=raw,if=pflash \\
399         -monitor telnet::4444,server,nowait \\
400         -serial stdio \$*
401 EOF
402                 ;;
403         esac
404     done
405 }
406
407 make_freebsd_esps()
408 {
409     # At the moment, we have just three (armv7 could also be here too, but we're not doing that)
410     for a in amd64:amd64 arm64:aarch64 riscv:riscv64; do
411         m=${a%%:*}
412         ma=${a##*:}
413         ma_combo="${m}"
414         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
415         dir=${TREES}/${ma_combo}/freebsd-esp
416         dir2=${TREES}/${ma_combo}/test-stand
417         rm -rf ${dir}
418         mkdir -p ${dir}
419         case ${ma} in
420             amd64) bin=x64 ;;
421             aarch64) bin=aa64 ;;
422         esac
423         mkdir -p ${dir}/efi/boot
424         cp ${dir2}/boot/loader.efi ${dir}/efi/boot/boot${bin}.efi
425     done
426 }
427
428 make_freebsd_images()
429 {
430     # ESP variant: In this variant, riscv, amd64 and arm64 are created more or
431     # less the same way. UEFI + ACPI implementations
432     for a in amd64:amd64 arm64:aarch64 riscv:riscv64; do
433         m=${a%%:*}
434         ma=${a##*:}
435         ma_combo="${m}"
436         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
437         src=${TREES}/${ma_combo}/freebsd-esp
438         dir=${TREES}/${ma_combo}/freebsd
439         dir2=${TREES}/${ma_combo}/test-stand
440         esp=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.esp
441         ufs=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.ufs
442         img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
443         mkdir -p ${IMAGES}/${ma_combo}
444         mkdir -p ${dir2}/etc
445         cat > ${dir2}/etc/fstab <<EOF
446 /dev/ufs/root   /               ufs     rw      1       1
447 EOF
448         makefs -t msdos -o fat_type=32 -o sectors_per_cluster=1 \
449                -o volume_label=EFISYS -s100m ${esp} ${src}
450         makefs -t ffs -B little -s 200m -o label=root ${ufs} ${dir} ${dir2}
451         mkimg -s gpt -p efi:=${esp} -p freebsd-ufs:=${ufs} -o ${img}
452         # rm -f ${esp} ${ufs}   # Don't need to keep this around
453     done
454
455     set -x
456
457     # BIOS i386
458     a=i386:i386
459     m=${a%%:*}
460     ma=${a##*:}
461     ma_combo="${m}"
462     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
463     dir=${TREES}/${ma_combo}/freebsd
464     dir2=${TREES}/${ma_combo}/test-stand
465     ufs=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.ufs
466     img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
467     mkdir -p ${IMAGES}/${ma_combo}
468     mkdir -p ${dir2}/etc
469     cat > ${dir2}/etc/fstab <<EOF
470 /dev/ufs/root   /               ufs     rw      1       1
471 EOF
472     makefs -t ffs -B little -s 200m \
473            -o label=root,version=2,bsize=32768,fsize=4096,density=16384 \
474            ${ufs} ${dir} ${dir2}
475     mkimg -s gpt -b ${dir2}/boot/pmbr \
476           -p freebsd-boot:=${dir2}/boot/gptboot \
477           -p freebsd-ufs:=${ufs} \
478           -o ${img}
479     rm -f ${src}/etc/fstab
480
481     # PowerPC for 32-bit mac
482     a=powerpc:powerpc
483     m=${a%%:*}
484     ma=${a##*:}
485     ma_combo="${m}"
486     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
487     dir=${TREES}/${ma_combo}/freebsd
488     dir2=${TREES}/${ma_combo}/test-stand
489     ufs=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.ufs
490     img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
491     mkdir -p ${IMAGES}/${ma_combo}
492     mkdir -p ${dir2}/etc
493     cat > ${dir2}/etc/fstab <<EOF
494 /dev/ufs/root   /               ufs     rw      1       1
495 EOF
496     makefs -t ffs -B big -s 200m \
497            -o label=root,version=2,bsize=32768,fsize=4096,density=16384 \
498            ${ufs} ${dir} ${dir2}
499     mkimg -a 1 -s apm \
500         -p freebsd-boot:=${dir2}/boot/boot1.hfs \
501         -p freebsd-ufs:=${ufs} \
502         -o ${img}
503
504     set +x
505 }
506
507 make_freebsd_scripts()
508 {
509     # At the moment, we have just two
510     for a in amd64:amd64 arm64:aarch64; do
511         m=${a%%:*}
512         ma=${a##*:}
513         ma_combo="${m}"
514         [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
515
516         # First off, update the edk firmware
517         bios_code=${BIOS}/edk2-${ma_combo}-code.fd
518         bios_vars=${BIOS}/edk2-${ma_combo}-vars.fd
519         case ${ma} in
520             amd64)
521                 if [ ${bios_code} -ot /usr/local/share/qemu/edk2-x86_64-code.fd ]; then
522                     cp /usr/local/share/qemu/edk2-x86_64-code.fd ${bios_code}
523                     # vars file works on both 32 and 64 bit x86
524                     cp /usr/local/share/qemu/edk2-i386-vars.fd ${bios_vars}
525                 fi
526                 ;;
527             aarch64)
528                 if [ ${bios_code} -ot /usr/local/share/qemu/edk2-aarch64-code.fd ]; then
529                     # aarch64 vars starts as an empty file
530                     dd if=/dev/zero of=${bios_code} bs=1M count=64
531                     dd if=/dev/zero of=${bios_vars} bs=1M count=64
532                     dd if=/usr/local/share/qemu/edk2-aarch64-code.fd of=${bios_code} conv=notrunc
533                 fi
534                 ;;
535         esac
536
537         # Now make me a script
538         img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
539         out=${SCRIPTS}/${ma_combo}/freebsd-test.sh
540         mkdir -p ${SCRIPTS}/${ma_combo}
541         case ${ma} in
542             amd64)
543                 cat > ${out} <<EOF
544 ${qemu_bin}/qemu-system-x86_64 -nographic -m 512M \\
545         -drive file=${img},if=none,id=drive0,cache=writeback,format=raw \\
546         -device virtio-blk,drive=drive0,bootindex=0 \\
547         -drive file=${bios_code},format=raw,if=pflash \\
548         -drive file=${bios_vars},format=raw,if=pflash \\
549         -monitor telnet::4444,server,nowait \\
550         -serial stdio \$*
551 EOF
552                 ;;
553             aarch64)
554                 # ESP version
555                 raw=${IMAGES}/${ma_combo}/nvme-test-empty.raw
556                 cat > ${out} <<EOF
557 ${qemu_bin}/qemu-system-aarch64 -nographic -machine virt,gic-version=3 -m 512M \\
558         -cpu cortex-a57 -drive file=${img},if=none,id=drive0,cache=writeback -smp 4 \\
559         -device virtio-blk,drive=drive0,bootindex=0 \\
560         -drive file=${bios_code},format=raw,if=pflash \\
561         -drive file=${bios_vars},format=raw,if=pflash \\
562         -drive file=${raw},if=none,id=drive1,cache=writeback,format=raw \\
563         -device nvme,serial=deadbeef,drive=drive1 \\
564         -monitor telnet::4444,server,nowait \\
565         -serial stdio \$*
566 EOF
567                 ;;
568         esac
569     done
570
571     set -x
572     a=powerpc:powerpc
573     m=${a%%:*}
574     ma=${a##*:}
575     ma_combo="${m}"
576     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
577     img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
578     out=${SCRIPTS}/${ma_combo}/freebsd-test.sh
579     mkdir -p ${SCRIPTS}/${ma_combo}
580     cat > ${out} <<EOF
581 ${qemu_bin}/qemu-system-ppc -m 1g -M mac99,via=pmu \\
582         -vga none -nographic \\
583         -drive file=${img},if=virtio \\
584         -prom-env "boot-device=/pci@f2000000/scsi/disk@0:,\\\\\\:tbxi" \\
585         -monitor telnet::4444,server,nowait \\
586         -serial stdio \$*
587 EOF
588
589     set -x
590     a=i386:i386
591     m=${a%%:*}
592     ma=${a##*:}
593     ma_combo="${m}"
594     [ "${m}" != "${ma}" ] && ma_combo="${m}-${ma}"
595     img=${IMAGES}/${ma_combo}/freebsd-${ma_combo}.img
596     out=${SCRIPTS}/${ma_combo}/freebsd-test.sh
597     mkdir -p ${SCRIPTS}/${ma_combo}
598     cat > ${out} <<EOF
599 ${qemu_bin}/qemu-system-i386 -m 1g \\
600         -vga none -nographic \\
601         -drive file=${img},format=raw \\
602         -nographic \\
603         -monitor telnet::4444,server,nowait \\
604         -serial stdio \$*
605 EOF
606 }
607
608 # The smallest FAT32 filesystem is 33292 KB
609 espsize=33292
610
611 set -e
612 echo "src/stand test in ${STAND_ROOT}"
613 update_freebsd_img_cache
614 make_freebsd_minimal_trees
615 make_freebsd_test_trees
616 make_linux_initrds
617 make_linux_esps
618 make_freebsd_esps
619 make_freebsd_images
620 make_freebsd_scripts
621 make_linuxboot_images
622 make_linuxboot_scripts