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
22FREEBSD_VERSION=13.1
23# eg https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/13.1/FreeBSD-13.1-RELEASE-amd64-bootonly.iso.xz
24URLBASE="https://download.freebsd.org/releases"
25: ${STAND_ROOT:="${HOME}/stand-test-root"}
26CACHE=${STAND_ROOT}/cache
27TREES=${STAND_ROOT}/trees
28IMAGES=${STAND_ROOT}/images
29BIOS=${STAND_ROOT}/bios
30SCRIPTS=${STAND_ROOT}/scripts
31OVERRIDE=${STAND_ROOT}/override
32
33# hack -- I have extra junk in my qemu, but it's not needed to recreate things
34if [ $(whoami) = imp ]; then
35    qemu_bin=/home/imp/git/qemu/00-build
36else
37    qemu_bin=/usr/local/bin
38fi
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.
43ARCHES="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
46espsize=33292
47
48SRCTOP=$(make -v SRCTOP)
49
50mkdir -p ${CACHE} ${TREES} ${IMAGES} ${BIOS}
51
52die()
53{
54    echo Fatal Error: $*
55    exit 1
56}
57
58ma_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
68fetch_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
87update_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
100make_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
133sysctl machdep.bootmethod
134echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
135halt -p
136EOF
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
171comconsole_speed=115200
172autoboot_delay=2
173zfs_load="YES"
174boot_verbose=yes
175kern.cfg.order="acpi,fdt"
176EOF
177}
178
179make_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
190make_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
211make_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
234make_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
257EOF
258	cp $initrd ${dir}
259    done
260}
261
262make_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
310make_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 \$*
360EOF
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 \$*
376EOF
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 \$*
388EOF
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 \$*
401EOF
402		;;
403	esac
404    done
405}
406
407make_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
428make_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
447EOF
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
471EOF
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
495EOF
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
507make_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 \$*
551EOF
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 \$*
566EOF
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 \$*
587EOF
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 \$*
605EOF
606}
607
608# The smallest FAT32 filesystem is 33292 KB
609espsize=33292
610
611set -e
612echo "src/stand test in ${STAND_ROOT}"
613update_freebsd_img_cache
614make_freebsd_minimal_trees
615make_freebsd_test_trees
616make_linux_initrds
617make_linux_esps
618make_freebsd_esps
619make_freebsd_images
620make_freebsd_scripts
621make_linuxboot_images
622make_linuxboot_scripts
623