#!/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