Add a test to read from all SPRs
authorAnton Blanchard <anton@linux.ibm.com>
Mon, 4 Jan 2021 03:16:06 +0000 (14:16 +1100)
committerMichael Neuling <mikey@neuling.org>
Mon, 8 Feb 2021 09:29:04 +0000 (20:29 +1100)
Make sure the SPRs are initialized and we can't read X state.

(Mikey: rebased and added console/bin file for testing)

Signed-off-by: Anton Blanchard <anton@linux.ibm.com>
Signed-off-by: Michael Neuling <mikey@neuling.org>
tests/spr_read/Makefile [new file with mode: 0644]
tests/spr_read/head.S [new file with mode: 0644]
tests/spr_read/powerpc.lds [new file with mode: 0644]
tests/spr_read/spr_read.c [new file with mode: 0644]
tests/test_spr_read.bin [new file with mode: 0755]
tests/test_spr_read.console_out [new file with mode: 0644]
tests/update_console_tests

diff --git a/tests/spr_read/Makefile b/tests/spr_read/Makefile
new file mode 100644 (file)
index 0000000..70a87c0
--- /dev/null
@@ -0,0 +1,3 @@
+TEST=spr_read
+
+include ../Makefile.test
diff --git a/tests/spr_read/head.S b/tests/spr_read/head.S
new file mode 100644 (file)
index 0000000..92d69bb
--- /dev/null
@@ -0,0 +1,46 @@
+/* Copyright 2013-2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define STACK_TOP 0x2000
+
+/* Load an immediate 64-bit value into a register */
+#define LOAD_IMM64(r, e)                       \
+       lis     r,(e)@highest;                  \
+       ori     r,r,(e)@higher;                 \
+       rldicr  r,r, 32, 31;                    \
+       oris    r,r, (e)@h;                     \
+       ori     r,r, (e)@l;
+
+       .section ".head","ax"
+
+       /*
+        * Microwatt currently enters in LE mode at 0x0, so we don't need to
+        * do any endian fix ups
+        */
+       . = 0
+.global _start
+_start:
+       b       boot_entry
+
+.global boot_entry
+boot_entry:
+       /* setup stack */
+       LOAD_IMM64(%r1, STACK_TOP - 0x100)
+       LOAD_IMM64(%r12, main)
+       mtctr   %r12
+       bctrl
+       attn // terminate on exit
+       b .
diff --git a/tests/spr_read/powerpc.lds b/tests/spr_read/powerpc.lds
new file mode 100644 (file)
index 0000000..0b65470
--- /dev/null
@@ -0,0 +1,13 @@
+SECTIONS
+{
+       _start = .;
+       . = 0;
+       .head : {
+               KEEP(*(.head))
+       }
+       . = 0x1000;
+       .text : { *(.text) }
+       . = 0x2000;
+       .data : { *(.data) }
+       .bss : { *(.bss) }
+}
diff --git a/tests/spr_read/spr_read.c b/tests/spr_read/spr_read.c
new file mode 100644 (file)
index 0000000..fa41154
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "console.h"
+
+#define TEST "Test "
+#define PASS "PASS\n"
+#define FAIL "FAIL\n"
+
+// i < 100
+void print_test(char *str)
+{
+       puts(TEST);
+       puts(str);
+       putchar(':');
+}
+
+#define SPR_XER                1
+#define SPR_LR         8
+#define SPR_CTR                9
+#define SPR_TAR                815
+#define SPR_DSISR      18
+#define SPR_DAR                19
+#define SPR_TB         268
+#define SPR_TBU                269
+#define SPR_DEC                22
+#define SPR_SRR0       26
+#define SPR_SRR1       27
+#define SPR_CFAR       28
+#define SPR_HSRR0      314
+#define SPR_HSRR1      315
+#define SPR_SPRG0      272
+#define SPR_SPRG1      273
+#define SPR_SPRG2      274
+#define SPR_SPRG3      275
+#define SPR_SPRG3U     259
+#define SPR_HSPRG0     304
+#define SPR_HSPRG1     305
+#define SPR_PID                48
+#define SPR_PRTBL      720
+#define SPR_PVR                287
+
+#define __stringify_1(x...)    #x
+#define __stringify(x...)      __stringify_1(x)
+
+int main(void)
+{
+       unsigned long tmp;
+
+       console_init();
+
+       /*
+        * Read all SPRs. Rely on the register file raising an assertion if we
+        * write X state to a GPR.
+        */
+
+#define DO_ONE(SPR) { \
+               print_test(#SPR); \
+               __asm__ __volatile__("mfspr %0," __stringify(SPR) : "=r" (tmp)); \
+               puts(PASS); \
+       }
+
+       DO_ONE(SPR_XER);
+       DO_ONE(SPR_LR);
+       DO_ONE(SPR_CTR);
+       DO_ONE(SPR_TAR);
+       DO_ONE(SPR_DSISR);
+       DO_ONE(SPR_DAR);
+       DO_ONE(SPR_TB);
+       DO_ONE(SPR_TBU);
+       DO_ONE(SPR_DEC);
+       DO_ONE(SPR_SRR0);
+       DO_ONE(SPR_SRR1);
+       DO_ONE(SPR_CFAR);
+       DO_ONE(SPR_HSRR0);
+       DO_ONE(SPR_HSRR1);
+       DO_ONE(SPR_SPRG0);
+       DO_ONE(SPR_SPRG1);
+       DO_ONE(SPR_SPRG2);
+       DO_ONE(SPR_SPRG3);
+       DO_ONE(SPR_SPRG3U);
+       DO_ONE(SPR_HSPRG0);
+       DO_ONE(SPR_HSPRG1);
+       DO_ONE(SPR_PID);
+       DO_ONE(SPR_PRTBL);
+       DO_ONE(SPR_PVR);
+
+       puts(PASS);
+
+       return 0;
+}
diff --git a/tests/test_spr_read.bin b/tests/test_spr_read.bin
new file mode 100755 (executable)
index 0000000..66a546a
Binary files /dev/null and b/tests/test_spr_read.bin differ
diff --git a/tests/test_spr_read.console_out b/tests/test_spr_read.console_out
new file mode 100644 (file)
index 0000000..1ccac56
--- /dev/null
@@ -0,0 +1,25 @@
+Test SPR_XER:PASS\r
+Test SPR_LR:PASS\r
+Test SPR_CTR:PASS\r
+Test SPR_TAR:PASS\r
+Test SPR_DSISR:PASS\r
+Test SPR_DAR:PASS\r
+Test SPR_TB:PASS\r
+Test SPR_TBU:PASS\r
+Test SPR_DEC:PASS\r
+Test SPR_SRR0:PASS\r
+Test SPR_SRR1:PASS\r
+Test SPR_CFAR:PASS\r
+Test SPR_HSRR0:PASS\r
+Test SPR_HSRR1:PASS\r
+Test SPR_SPRG0:PASS\r
+Test SPR_SPRG1:PASS\r
+Test SPR_SPRG2:PASS\r
+Test SPR_SPRG3:PASS\r
+Test SPR_SPRG3U:PASS\r
+Test SPR_HSPRG0:PASS\r
+Test SPR_HSPRG1:PASS\r
+Test SPR_PID:PASS\r
+Test SPR_PRTBL:PASS\r
+Test SPR_PVR:PASS\r
+PASS\r
index a5e6ffca0d77193069685f013bc12ae866d7a9dc..4e013aaa990b67f0856e1504954e1ebc583c0448 100755 (executable)
@@ -3,7 +3,7 @@
 # Script to update console related tests from source
 #
 
-for i in sc illegal decrementer xics privileged mmu misc modes reservation trace fpu ; do
+for i in sc illegal decrementer xics privileged mmu misc modes reservation trace fpu spr_read ; do
     cd $i
     make
     cd -