tests/tcg/nios2: Add test-shadow-1
authorRichard Henderson <richard.henderson@linaro.org>
Thu, 21 Apr 2022 15:17:35 +0000 (08:17 -0700)
committerRichard Henderson <richard.henderson@linaro.org>
Tue, 26 Apr 2022 15:17:10 +0000 (08:17 -0700)
Add a regression test for tcg indirect global lowering.

This appeared with nios2, with cps != 0, so that we use
indirection into the shadow register set.  An indirect
call verifies alignment of rA.  The use of rA was live
across the brcond leading to a tcg_debug_assert failure.

Cc: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <20220421151735.31996-65-richard.henderson@linaro.org>

tests/tcg/nios2/Makefile.softmmu-target
tests/tcg/nios2/test-shadow-1.S [new file with mode: 0644]

index cea27472a65ba21541768974b71d47bab6c8c9aa..c3d0594a39d4916952e6680f51f237c48e034830 100644 (file)
@@ -30,3 +30,4 @@ QEMU_OPTS = -M 10m50-ghrd,vic=on -semihosting >$@.out -kernel
 
 memory: CFLAGS+=-DCHECK_UNALIGNED=0
 TESTS += $(MULTIARCH_TESTS)
+TESTS += test-shadow-1
diff --git a/tests/tcg/nios2/test-shadow-1.S b/tests/tcg/nios2/test-shadow-1.S
new file mode 100644 (file)
index 0000000..79ef69d
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Regression test for TCG indirect global lowering.
+ *
+ * Copyright Linaro Ltd 2022
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "semicall.h"
+
+       .text
+       .set noat
+       .align  2
+       .globl  main
+       .type   main, @function
+
+main:
+       /* Initialize r0 in shadow register set 1. */
+       movhi   at, 1                   /* PRS=1, CRS=0, RSIE=0, PIE=0 */
+       wrctl   status, at
+       wrprs   zero, zero
+
+       /* Change current register set to 1. */
+       movi    at, 1 << 10             /* PRS=0, CRS=1, RSIE=0, PIE=0 */
+       wrctl   estatus, at
+       movia   ea, 1f
+       eret
+
+       /* Load address for callr, then end TB. */
+1:     movia   at, 3f
+       br      2f
+
+       /* Test case! TCG abort on indirect lowering across brcond. */
+2:     callr   at
+
+       /* exit(0) */
+3:     movi    r4, HOSTED_EXIT
+       movi    r5, 0
+       semihosting_call
+
+       .size   main, . - main