1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#!/bin/sh
set -eu
: "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${TEST_SRCDIR:?}"
base="${TMPDIR:-/tmp}/libmcpu-stage-actions-$$"
trap 'rm -f "$base"*' EXIT HUP INT TERM
# The published LIFE example: one scalar print action, two registers, one line.
"$CPU_AS" -o "$base-life.o" "$TEST_SRCDIR/fixtures/life-print.s" >/dev/null
"$CPU_LD" -o "$base-life" --stack-size=1K "$base-life.o" >/dev/null
out=`"$CPU_RUN" --steps=3 \
--on-step=print-int-regs:r64@0x00000,r64@0x00008 \
-- "$base-life"`
expected='1 10
2 20
3 30'
test "x$out" = "x$expected"
# AFTER_INIT also exists when the executable has no separate .init section.
out=`"$CPU_RUN" --steps=1 \
--before-run=set-int-regs:r64@0x00000=77 \
--after-init=print-int-regs:r64@0x00000 \
--on-step=print-int-regs:r64@0x00000,r64@0x00008 \
-- "$base-life"`
expected='77
1 10'
test "x$out" = "x$expected"
# Explicit -- must make option-looking tokens ordinary guest argv strings.
"$CPU_AS" -o "$base-argv.o" "$TEST_SRCDIR/fixtures/argc-argv.s" >/dev/null
"$CPU_LD" -o "$base-argv" --stack-size=4K "$base-argv.o" >/dev/null
out=`"$CPU_RUN" --on-step=print-int-regs:r64@0x00000,r8@0x00020,r8@0x00021 \
-- "$base-argv" --help -x`
test "x$out" = "x3 104 120"
cat > "$base-model.s" <<'EOS'
.data
.real 64, 0.0
.input
.integer 64, 0
.output
.integer 64, 0
.integer 64, 0
.init
_start:
END
.text
_life:
END
JMP _life
EOS
"$CPU_AS" -o "$base-model.o" "$base-model.s" >/dev/null
"$CPU_LD" -o "$base-model" --stack-size=1K "$base-model.o" >/dev/null
# Multiple set/print objects, stage ordering and mpu_sscanf()-based values.
out=`"$CPU_RUN" --steps=1 --digits=20 \
--before-run=set-int-input:64@0=100 \
--before-run=set-real-data:64@16=1.5 \
--after-init=print-int-input:64@0 \
--after-init=print-real-data:64@16 \
--on-step=set-int-output:64@0=41,64@8=42 \
--on-step=print-int-output:64@0,64@8 \
--after-run=print-int-output:64@0,64@8 \
-- "$base-model"`
case "$out" in
"100
1.500000000000000"*"E+0
41 42
41 42") ;;
*) echo "unexpected stage-action output:" >&2; echo "$out" >&2; exit 1 ;;
esac
# AFTER_RUN follows FINI -> END on graceful EXIT.
cat > "$base-fini.s" <<'EOS'
.text
_start_life:
LDI r32@0x00008, 0
EXIT r32@0x00008
.fini
_fini:
LDI r64@0x00000, 99
END
EOS
"$CPU_AS" -o "$base-fini.o" "$base-fini.s" >/dev/null
"$CPU_LD" -o "$base-fini" --stack-size=1K "$base-fini.o" >/dev/null
out=`"$CPU_RUN" --after-run=print-int-regs:r64@0x00000 -- "$base-fini"`
test "x$out" = "x99"
# A raw stage action is exactly one dump; comma lists are deliberately invalid.
if "$CPU_RUN" --before-run=print-raw-data:1@16,1@17 -- "$base-model" \
>/dev/null 2>&1; then
echo "raw stage action accepted a comma-separated list" >&2
exit 1
fi
# Arbitrary raw writes are intentionally absent.
if "$CPU_RUN" --before-run=set-raw-input:1@0=00 -- "$base-model" \
>/dev/null 2>&1; then
echo "set-raw-input unexpectedly accepted" >&2
exit 1
fi
exit 0
|