From f3c6119cf63d21671bbad9bdfb983316b0336dd8 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 7 May 2020 20:12:46 +1000 Subject: [PATCH] tests/mmu: Add a test of PTE refetching on permission error Signed-off-by: Paul Mackerras --- tests/mmu/mmu.c | 28 +++++++++++++++++++++++++--- tests/test_mmu.bin | Bin 20496 -> 20496 bytes tests/test_mmu.console_out | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tests/mmu/mmu.c b/tests/mmu/mmu.c index 994ffe3..8281b04 100644 --- a/tests/mmu/mmu.c +++ b/tests/mmu/mmu.c @@ -145,8 +145,6 @@ void map(void *ea, void *pa, unsigned long perm_attr) free_ptr += 512 * sizeof(unsigned long); } ptep = read_pgd(i); - if (ptep[j]) - do_tlbie(((unsigned long)ea & ~0xfff), 0); store_pte(&ptep[j], 0xc000000000000000 | ((unsigned long)pa & 0x00fffffffffff000) | perm_attr); eas_mapped[neas_mapped++] = ea; } @@ -569,6 +567,7 @@ int mmu_test_17(void) if (mfspr(SRR0) != (long) ptr || mfspr(SRR1) != 0x00040020) return 2; /* create a PTE without ref or execute permission */ + unmap((void *)ptr); map((void *)ptr, (void *)mem, 0); /* this should fail */ if (test_exec(2, ptr, MSR_IR)) @@ -599,6 +598,28 @@ int mmu_test_18(void) return 0; } +int mmu_test_19(void) +{ + long *mem = (long *) 0x8000; + long *ptr = (long *) 0x124000; + + *mem = 0x123456789abcdef0; + /* create PTE with read but not write permission */ + map(ptr, mem, REF | PERM_RD); + /* this should fail and create a TLB entry */ + if (test_write(ptr, 0xdeadbeef0dd1)) + return 1; + /* DAR and DSISR should be set correctly */ + if (mfspr(DAR) != (long)ptr || mfspr(DSISR) != 0x0a000000) + return 2; + /* Update the PTE to have write permission */ + map(ptr, mem, REF | CHG | PERM_RD | PERM_WR); + /* this should succeed */ + if (!test_write(ptr, 0xdeadbeef0dd1)) + return 3; + return 0; +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -616,7 +637,7 @@ void do_test(int num, int (*test)(void)) fail = 1; print_string("FAIL "); putchar(ret + '0'); - if (num <= 10) { + if (num <= 10 || num == 19) { print_string(" DAR="); print_hex(mfspr(DAR)); print_string(" DSISR="); @@ -654,6 +675,7 @@ int main(void) do_test(16, mmu_test_16); do_test(17, mmu_test_17); do_test(18, mmu_test_18); + do_test(19, mmu_test_19); return fail; } diff --git a/tests/test_mmu.bin b/tests/test_mmu.bin index 416ae706ac754e79daab704110bf8e4c8379c8f6..a1861b22dbbdfc857e7d512d9a924efe9a997bbb 100755 GIT binary patch delta 2333 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 PQa_gtGK#=rMA!cST}J$J diff --git a/tests/test_mmu.console_out b/tests/test_mmu.console_out index a5c08ea..cb4ad85 100644 --- a/tests/test_mmu.console_out +++ b/tests/test_mmu.console_out @@ -16,3 +16,4 @@ test 15:PASS test 16:PASS test 17:PASS test 18:PASS +test 19:PASS