diff --git a/tests/misc/head.S b/tests/misc/head.S index 025f226..ec48c26 100644 --- a/tests/misc/head.S +++ b/tests/misc/head.S @@ -215,3 +215,45 @@ test_icbi: nop addi %r3,%r3,1 blr + + .global test_dcbz_near_store +test_dcbz_near_store: + li %r0,-1 + addi %r10,%r1,-64 + # cacheline align stack pointer + srdi %r10,%r10,6 + sldi %r10,%r10,6 + + std %r0,0(%r10) + std %r0,8(%r10) + std %r0,16(%r10) + std %r0,24(%r10) + std %r0,32(%r10) + std %r0,40(%r10) + std %r0,48(%r10) + std %r0,56(%r10) + + li %r3,0xa5 + # Store to same cacheline as dcbz, although it doesn't seem + # necessary to hit the issue. + std %r3,0(%r10) + dcbz 0,%r10 + + ld %r0,0(%r10) + ld %r3,8(%r10) + ld %r4,16(%r10) + ld %r5,24(%r10) + ld %r6,32(%r10) + ld %r7,40(%r10) + ld %r8,48(%r10) + ld %r9,56(%r10) + + or %r3,%r3,%r0 + or %r3,%r3,%r4 + or %r3,%r3,%r5 + or %r3,%r3,%r6 + or %r3,%r3,%r7 + or %r3,%r3,%r8 + or %r3,%r3,%r9 + + blr diff --git a/tests/misc/misc.c b/tests/misc/misc.c index d5eb12e..4773f83 100644 --- a/tests/misc/misc.c +++ b/tests/misc/misc.c @@ -17,6 +17,7 @@ extern long test_mtpvr(void); extern long test_bdnzl(void); extern long test_loadhitstore(void); extern long test_icbi(void); +extern long test_dcbz_near_store(void); // i < 100 void print_test_number(int i) @@ -82,5 +83,12 @@ int main(void) } else puts(PASS); + print_test_number(8); + if (test_dcbz_near_store() != 0) { + fail = 1; + puts(FAIL); + } else + puts(PASS); + return fail; } diff --git a/tests/test_misc.bin b/tests/test_misc.bin index 0897d85..5350aa3 100755 Binary files a/tests/test_misc.bin and b/tests/test_misc.bin differ diff --git a/tests/test_misc.console_out b/tests/test_misc.console_out index 041accf..06625da 100644 --- a/tests/test_misc.console_out +++ b/tests/test_misc.console_out @@ -5,3 +5,4 @@ Test 04:PASS Test 05:PASS Test 06:PASS Test 07:PASS +Test 08:PASS