We have a bug where an store near a dcbz can cause the dcbz to only zero
8 bytes. Add a test case for this.
Signed-off-by: Anton Blanchard <anton@linux.ibm.com>
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
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)
} else
puts(PASS);
+ print_test_number(8);
+ if (test_dcbz_near_store() != 0) {
+ fail = 1;
+ puts(FAIL);
+ } else
+ puts(PASS);
+
return fail;
}
Test 05:PASS\r
Test 06:PASS\r
Test 07:PASS\r
+Test 08:PASS\r