mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-05-05 15:54:17 +00:00
tests/misc: Add a store/dcbz test
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>
This commit is contained in:
committed by
Anton Blanchard
parent
00259458c7
commit
2d142a6c01
@@ -215,3 +215,45 @@ test_icbi:
|
|||||||
nop
|
nop
|
||||||
addi %r3,%r3,1
|
addi %r3,%r3,1
|
||||||
blr
|
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
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ extern long test_mtpvr(void);
|
|||||||
extern long test_bdnzl(void);
|
extern long test_bdnzl(void);
|
||||||
extern long test_loadhitstore(void);
|
extern long test_loadhitstore(void);
|
||||||
extern long test_icbi(void);
|
extern long test_icbi(void);
|
||||||
|
extern long test_dcbz_near_store(void);
|
||||||
|
|
||||||
// i < 100
|
// i < 100
|
||||||
void print_test_number(int i)
|
void print_test_number(int i)
|
||||||
@@ -82,5 +83,12 @@ int main(void)
|
|||||||
} else
|
} else
|
||||||
puts(PASS);
|
puts(PASS);
|
||||||
|
|
||||||
|
print_test_number(8);
|
||||||
|
if (test_dcbz_near_store() != 0) {
|
||||||
|
fail = 1;
|
||||||
|
puts(FAIL);
|
||||||
|
} else
|
||||||
|
puts(PASS);
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -5,3 +5,4 @@ Test 04:PASS
|
|||||||
Test 05:PASS
|
Test 05:PASS
|
||||||
Test 06:PASS
|
Test 06:PASS
|
||||||
Test 07:PASS
|
Test 07:PASS
|
||||||
|
Test 08:PASS
|
||||||
|
|||||||
Reference in New Issue
Block a user