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