diff --git a/tests/spr_read/head.S b/tests/spr_read/head.S index 92d69bb..1c84b4f 100644 --- a/tests/spr_read/head.S +++ b/tests/spr_read/head.S @@ -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) diff --git a/tests/spr_read/spr_read.c b/tests/spr_read/spr_read.c index a2a8a84..2bf183a 100644 --- a/tests/spr_read/spr_read.c +++ b/tests/spr_read/spr_read.c @@ -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); diff --git a/tests/test_spr_read.bin b/tests/test_spr_read.bin index 8c7a7d6..96a95bc 100755 Binary files a/tests/test_spr_read.bin and b/tests/test_spr_read.bin differ diff --git a/tests/test_spr_read.console_out b/tests/test_spr_read.console_out index a677b29..9722dfb 100644 --- a/tests/test_spr_read.console_out +++ b/tests/test_spr_read.console_out @@ -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