tests/mmu: Add a test for dcbz with translation on
authorPaul Mackerras <paulus@ozlabs.org>
Sun, 3 May 2020 22:57:05 +0000 (08:57 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Fri, 8 May 2020 02:12:02 +0000 (12:12 +1000)
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
tests/mmu/head.S
tests/mmu/mmu.c
tests/test_mmu.bin
tests/test_mmu.console_out

index 083b1c55758c050236993e8d4175d3c308be7dda..824ad6765de401ee5bec2ab7e7adefa91c847a3f 100644 (file)
@@ -80,6 +80,20 @@ test_write:
        mtmsrd  %r9,0
        blr
 
+       /* Do a dcbz with translation on */
+       .globl  test_dcbz
+test_dcbz:
+       mfmsr   %r9
+       ori     %r8,%r9,0x10    /* set MSR_DR */
+       mtmsrd  %r8,0
+       mr      %r6,%r3
+       li      %r3,0
+       dcbz    0,%r6
+       li      %r3,1
+       /* land here if DSI occurred */
+       mtmsrd  %r9,0
+       blr
+
        .globl  test_exec
 test_exec:
        mtsrr0  %r4
index a44c79de61263eb2c7aed11d6d6b1491e0abb079..994ffe3bde679cf36e5319337b0e8e35635132cc 100644 (file)
@@ -9,6 +9,7 @@
 
 extern int test_read(long *addr, long *ret, long init);
 extern int test_write(long *addr, long val);
+extern int test_dcbz(long *addr);
 extern int test_exec(int testno, unsigned long pc, unsigned long msr);
 
 static inline void do_tlbie(unsigned long rb, unsigned long rs)
@@ -579,6 +580,25 @@ int mmu_test_17(void)
        return 0;
 }
 
+int mmu_test_18(void)
+{
+       long *mem = (long *) 0x8000;
+       long *ptr = (long *) 0x124000;
+       long *ptr2 = (long *) 0x1124000;
+
+       /* create PTE */
+       map(ptr, mem, DFLT_PERM);
+       /* this should succeed and be a cache miss */
+       if (!test_dcbz(&ptr[129]))
+               return 1;
+       /* create a second PTE */
+       map(ptr2, mem, DFLT_PERM);
+       /* this should succeed and be a cache hit */
+       if (!test_dcbz(&ptr2[130]))
+               return 2;
+       return 0;
+}
+
 int fail = 0;
 
 void do_test(int num, int (*test)(void))
@@ -633,6 +653,7 @@ int main(void)
        do_test(15, mmu_test_15);
        do_test(16, mmu_test_16);
        do_test(17, mmu_test_17);
+       do_test(18, mmu_test_18);
 
        return fail;
 }
index afae999223bcb15bede8df58d6abc88bc7ea06dc..416ae706ac754e79daab704110bf8e4c8379c8f6 100755 (executable)
Binary files a/tests/test_mmu.bin and b/tests/test_mmu.bin differ
index a8e2dcb10339117b827d3a27d3eca947a5b2f727..a5c08eadcfbab4cc3dc5837d8e03d4275188d755 100644 (file)
@@ -15,3 +15,4 @@ test 14:PASS
 test 15:PASS\r
 test 16:PASS\r
 test 17:PASS\r
+test 18:PASS\r