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

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
pull/452/head
Paul Mackerras 3 weeks ago
parent 5548a5ba26
commit 0255283159

@ -44,3 +44,91 @@ boot_entry:
bctrl bctrl
attn // terminate on exit attn // terminate on exit
b . 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)

@ -8,6 +8,9 @@
#define PASS "PASS\n" #define PASS "PASS\n"
#define FAIL "FAIL\n" #define FAIL "FAIL\n"


extern long read_sprn(long, long);
extern long write_sprn(long);

// i < 100 // i < 100
void print_test(char *str) void print_test(char *str)
{ {
@ -44,9 +47,23 @@ void print_test(char *str)
#define __stringify_1(x...) #x #define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(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) int main(void)
{ {
unsigned long tmp; unsigned long tmp, r;
int fail = 0; int fail = 0;


console_init(); console_init();
@ -102,9 +119,22 @@ int main(void)
} }


print_test("undefined SPR"); print_test("undefined SPR");
__asm__ __volatile__("mtspr 179,%0" : : "r" (7738)); r = write_sprn(179);
__asm__ __volatile__("li %0,%1; mfspr %0,179" : "=r" (tmp) : "i" (2498)); tmp = read_sprn(179, 2498);
if (tmp == 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); puts(PASS);
} else { } else {
puts(FAIL); puts(FAIL);

Binary file not shown.

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

Loading…
Cancel
Save