1
0
mirror of https://github.com/antonblanchard/microwatt.git synced 2026-03-31 03:11:41 +00:00

tests/spr_read: Test that mfspr/mtspr to SPRs 0,4,5,6 generate HEAI

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
Paul Mackerras
2025-09-24 22:10:48 +10:00
parent 5548a5ba26
commit 0255283159
4 changed files with 123 additions and 4 deletions

View File

@@ -44,3 +44,91 @@ boot_entry:
bctrl
attn // terminate on exit
b .
.globl read_sprn
read_sprn:
nop
nop
mr %r0,%r3
mr %r3,%r4
cmpdi %r0,0
beq 0f
cmpdi %r0,1
beq 1f
cmpdi %r0,4
beq 4f
cmpdi %r0,5
beq 5f
cmpdi %r0,6
beq 6f
mfspr %r3,179
blr
0: mfspr %r3,0
blr
1: mfspr %r3,1
blr
4: mfspr %r3,4
blr
5: mfspr %r3,5
blr
6: mfspr %r3,6
blr
.globl write_sprn
write_sprn:
nop
nop
mr %r0,%r3
li %r3,0
cmpdi %r0,0
beq 0f
cmpdi %r0,1
beq 1f
cmpdi %r0,4
beq 4f
cmpdi %r0,5
beq 5f
cmpdi %r0,6
beq 6f
mtspr 179,%r3
blr
0: mtspr 0,%r3
blr
1: mtspr 1,%r3
blr
4: mtspr 4,%r3
blr
5: mtspr 5,%r3
blr
6: mtspr 6,%r3
blr
#define EXCEPTION(nr) \
.= nr ;\
li %r3,nr ;\
blr
EXCEPTION(0x300)
EXCEPTION(0x380)
EXCEPTION(0x400)
EXCEPTION(0x480)
EXCEPTION(0x500)
EXCEPTION(0x600)
EXCEPTION(0x700)
EXCEPTION(0x800)
EXCEPTION(0x900)
EXCEPTION(0x980)
EXCEPTION(0xa00)
EXCEPTION(0xb00)
EXCEPTION(0xc00)
EXCEPTION(0xd00)
EXCEPTION(0xe00)
EXCEPTION(0xe20)
EXCEPTION(0xe40)
EXCEPTION(0xe60)
EXCEPTION(0xe80)
EXCEPTION(0xf00)
EXCEPTION(0xf20)
EXCEPTION(0xf40)
EXCEPTION(0xf60)
EXCEPTION(0xf80)

View File

@@ -8,6 +8,9 @@
#define PASS "PASS\n"
#define FAIL "FAIL\n"
extern long read_sprn(long, long);
extern long write_sprn(long);
// i < 100
void print_test(char *str)
{
@@ -44,9 +47,23 @@ void print_test(char *str)
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
void print_hex(unsigned long val, int ndigits, const char *str)
{
int i, x;
for (i = (ndigits - 1) * 4; i >= 0; i -= 4) {
x = (val >> i) & 0xf;
if (x >= 10)
putchar(x + 'a' - 10);
else
putchar(x + '0');
}
puts(str);
}
int main(void)
{
unsigned long tmp;
unsigned long tmp, r;
int fail = 0;
console_init();
@@ -102,9 +119,22 @@ int main(void)
}
print_test("undefined SPR");
__asm__ __volatile__("mtspr 179,%0" : : "r" (7738));
__asm__ __volatile__("li %0,%1; mfspr %0,179" : "=r" (tmp) : "i" (2498));
if (tmp == 2498) {
r = write_sprn(179);
tmp = read_sprn(179, 2498);
if (r == 0 && tmp == 2498) {
puts(PASS);
} else {
puts(FAIL);
fail = 1;
}
print_test("read SPR 0/4/5/6");
if (read_sprn(0, 1234) == 0xe40 && read_sprn(2, 1234) == 1234 &&
read_sprn(4, 1234) == 0xe40 && read_sprn(5, 1234) == 0xe40 &&
read_sprn(6, 1234) == 0xe40 &&
write_sprn(0) == 0xe40 && write_sprn(2) == 0 &&
write_sprn(4) == 0xe40 && write_sprn(5) == 0xe40 &&
write_sprn(6) == 0xe40) {
puts(PASS);
} else {
puts(FAIL);

Binary file not shown.

View File

@@ -24,4 +24,5 @@ Test SPR_PTCR:PASS
Test SPR_PVR:PASS
Test reserved no-op:PASS
Test undefined SPR:PASS
Test read SPR 0/4/5/6:PASS
PASS