tests: Add tests for the PVR
authorJordan Niethe <jniethe5@gmail.com>
Wed, 8 Jul 2020 04:34:42 +0000 (14:34 +1000)
committerJordan Niethe <jniethe5@gmail.com>
Wed, 8 Jul 2020 10:57:21 +0000 (20:57 +1000)
The PVR is a privileged read-only SPR. Test reading and writing in both
supervisor and problem state. In supervisor state reading returns
microwatt's assigned PVR number and writing is a noop. In problem state
both reading and writing cause privileged instruction interrupts.

Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
tests/misc/head.S
tests/misc/misc.c
tests/privileged/privileged.c
tests/test_misc.bin
tests/test_misc.console_out
tests/test_privileged.bin
tests/test_privileged.console_out

index 9eb752cacbae2e8db9674dd0102f18e001ccf17f..b0acb7f4013d267cfb8cd444b70ff926fd77b832 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define STACK_TOP 0x2000
+#define PVR    287
 
 /* Load an immediate 64-bit value into a register */
 #define LOAD_IMM64(r, e)                       \
@@ -100,3 +101,39 @@ test_addpcis_2:
 
     blr
 
+/* Test reading the PVR */
+.global test_mfpvr
+test_mfpvr:
+    mflr %r0
+    std %r0, 16(%r1)
+    stdu %r1, -32(%r1)
+
+    /*
+     * If r3 happened to already contain PVR_MICROWATT the test
+     * would succeed even if the PVR is not implemented.
+     */
+    LOAD_IMM64(%r3, 0xdeadbeef)
+    mfpvr %r3
+
+    addi %r1, %r1, 32
+    ld %r0, 16(%r1)
+    mtlr %r0
+
+    blr
+
+/* Test writing the PVR does nothing */
+.global test_mtpvr
+test_mtpvr:
+    mflr %r0
+    std %r0, 16(%r1)
+    stdu %r1, -32(%r1)
+
+    LOAD_IMM64(%r3, 0xdeadbeef)
+    mtspr PVR, %r3
+    mfpvr %r3
+
+    addi %r1, %r1, 32
+    ld %r0, 16(%r1)
+    mtlr %r0
+
+    blr
index f96203e034e8bbecd42b69f5b244bfec3510b468..283ca7fc131ccdd6f5f3cb87b18372fb7497386b 100644 (file)
@@ -8,8 +8,12 @@
 #define PASS "PASS\n"
 #define FAIL "FAIL\n"
 
+#define PVR_MICROWATT 0x00630000
+
 extern long test_addpcis_1(void);
 extern long test_addpcis_2(void);
+extern long test_mfpvr(void);
+extern long test_mtpvr(void);
 
 // i < 100
 void print_test_number(int i)
@@ -40,5 +44,19 @@ int main(void)
        } else
                puts(PASS);
 
+       print_test_number(3);
+       if (test_mfpvr() != PVR_MICROWATT) {
+               fail = 1;
+               puts(FAIL);
+       } else
+               puts(PASS);
+
+       print_test_number(4);
+       if (test_mtpvr() != PVR_MICROWATT) {
+               fail = 1;
+               puts(FAIL);
+       } else
+               puts(PASS);
+
        return fail;
 }
index 154e9b4dc87498a595b1c616a42556587e0799a2..68e30bcd4eadb70cd98c96f042b0e989b9054cb9 100644 (file)
@@ -15,6 +15,7 @@ extern int call_with_msr(unsigned long arg, int (*fn)(unsigned long), unsigned l
 #define SRR1   27
 #define PID    48
 #define PRTBL  720
+#define PVR    287
 
 static inline unsigned long mfspr(int sprnum)
 {
@@ -186,6 +187,20 @@ int priv_fn_6(unsigned long x)
        return 0;
 }
 
+int priv_fn_7(unsigned long x)
+{
+       mfspr(PVR);
+       __asm__ volatile("sc");
+       return 0;
+}
+
+int priv_fn_8(unsigned long x)
+{
+       mtspr(PVR, x);
+       __asm__ volatile("sc");
+       return 0;
+}
+
 int priv_test(int (*fn)(unsigned long))
 {
        unsigned long msr;
@@ -239,6 +254,8 @@ int main(void)
        do_test(4, priv_fn_4);
        do_test(5, priv_fn_5);
        do_test(6, priv_fn_6);
+       do_test(7, priv_fn_7);
+       do_test(8, priv_fn_8);
 
        return fail;
 }
index f080480ecd9086a9638636dee8f5753ca4511f4f..7e68e1cca7d67ba1d7e134d6bb8dd93a9c3640fe 100755 (executable)
Binary files a/tests/test_misc.bin and b/tests/test_misc.bin differ
index 9b718c5bbc882d56c3e31b066043f1f6b3adb232..2ff5a99ff8f81db744530aa5d1908f3151ad7a8f 100644 (file)
@@ -1,2 +1,4 @@
 Test 01:PASS\r
 Test 02:PASS\r
+Test 03:PASS\r
+Test 04:PASS\r
index e030f08fbc94835d8e2935f37769d61a94a408ef..d89b34d424e2c74ef0392d5f4e76085a134daec0 100755 (executable)
Binary files a/tests/test_privileged.bin and b/tests/test_privileged.bin differ
index a49bb9b00543d7ccbc2c1af7af293d3fc84464ef..25e791c7845c3022d90eeeb6f4e465b8c29742f6 100644 (file)
@@ -4,3 +4,5 @@ test 03:PASS
 test 04:PASS\r
 test 05:PASS\r
 test 06:PASS\r
+test 07:PASS\r
+test 08:PASS\r