test/boot/run 2.1 KiB raw
1
#!/bin/sh
2
# Boot the kernel through its production initialization on each supported hart count.
3
set -eu
4
emulator=${RAD_EMULATOR:-emulator}
5
work=$(mktemp -d)
6
trap 'rm -rf "$work"' EXIT HUP INT TERM
7
cat test/boot/machine.ras kernel/kernel/*.ras > "$work/boot.ras"
8
"$emulator" -memory-size=385024 -data-size=348160 -stack-size=1024 -run bin/kernel.build.rv64 -- bin/std.ril bin/kernel.ril "$work/boot.ras" "$work/boot.rv64"
9
for harts in 1 2 8; do
10
    # The deterministic emulator shares its tick budget across all harts.
11
    steps=$((10000000 * harts))
12
    if ! "$emulator" -machine -max-steps="$steps" -harts="$harts" -run "$work/boot.rv64" > "$work/log" 2>&1; then
13
        cat "$work/log" >&2
14
        exit 1
15
    fi
16
    if ! grep -q '^kernel: platform ready$' "$work/log"; then
17
        cat "$work/log" >&2
18
        exit 1
19
    fi
20
    if ! grep -q '^kernel: boot catalog ready$' "$work/log"; then
21
        cat "$work/log" >&2
22
        exit 1
23
    fi
24
    printf 'kernel boot: %s harts passed\n' "$harts"
25
done
26
cat kernel/kernel/*.ras > "$work/idle.ras"
27
"$emulator" -memory-size=385024 -data-size=348160 -stack-size=1024 -run bin/kernel.build.rv64 -- bin/std.ril bin/kernel.ril "$work/idle.ras" "$work/idle.rv64"
28
status=0
29
"$emulator" -machine -harts=8 -max-steps=80000000 -run "$work/idle.rv64" > "$work/log" 2>&1 || status=$?
30
if [ "$status" -ne 2 ] || [ "$(grep -c 'wfi=1 mcause=0x0' "$work/log")" -ne 8 ]; then
31
    cat "$work/log" >&2
32
    exit 1
33
fi
34
printf 'kernel startup: all eight harts reached machine idle without traps\n'
35
cat test/boot/trap.ras kernel/kernel/*.ras > "$work/trap.ras"
36
"$emulator" -memory-size=385024 -data-size=348160 -stack-size=1024 -run bin/kernel.build.rv64 -- bin/std.ril bin/kernel.ril "$work/trap.ras" "$work/trap.rv64"
37
status=0
38
"$emulator" -machine -harts=2 -max-steps=20000000 -run "$work/trap.rv64" > "$work/log" 2>&1 || status=$?
39
if [ "$status" -ne 2 ] || [ "$(grep -c '^kernel: unexpected trap$' "$work/log")" -ne 1 ] \
40
    || [ "$(grep -c 'wfi=1' "$work/log")" -ne 2 ]; then
41
    cat "$work/log" >&2
42
    exit 1
43
fi
44
printf 'kernel trap: shared kernel state restored from the hart anchor\n'