From 0255283159ed8b696589f63e64273130eb9bc13f Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Wed, 24 Sep 2025 22:10:48 +1000 Subject: [PATCH] tests/spr_read: Test that mfspr/mtspr to SPRs 0,4,5,6 generate HEAI Signed-off-by: Paul Mackerras --- tests/spr_read/head.S | 88 ++++++++++++++++++++++++++++++++ tests/spr_read/spr_read.c | 38 ++++++++++++-- tests/test_spr_read.bin | Bin 6540 -> 7072 bytes tests/test_spr_read.console_out | 1 + 4 files changed, 123 insertions(+), 4 deletions(-) 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 8c7a7d6a2d5a89f14fd7fcb083f10ee50c663c1a..96a95bcfc46d9ed32aea7d9eae7735f15df470f8 100755 GIT binary patch literal 7072 zcmeI0YiJZ#6vxl(uAAK$V+0E+5uKO{iLSWu#l}RP-6ZNpYtzm8C}=w|S*g%!>!WOR zSH~9^5L!wL6&fGZhE__cl!AT`qPEi77OGINP^+yJ5@W%FmS}9J|8wVV_8M%rUt~X| z1LK+d|DAgtcka%Z@enN`((8!I%?kzPN!WIpRBjSk^N9|&UMM)&0h=ftcd)hF-I*@; zSj)*pd|)1#d?w4xRI*}k3ULAf+7s5K^+-EPTCcR-Q@5mavX*zdOle!CZI?D7?RsI= zJV+P%&v~ZFJZ_oCE%Uf#9=FWn9?FAM{~sf21>9zc_hPt~&>nemtzYZ@7KbTks`cKK2qBU!d9W!vlOt|!|<9Pg4{KG5lPz7-?~Z|q9T>v{M) zzHgMH2dO;tfo(69y=s<5q{g-FeWB;T&mvZ`Y-cJt?M!N3$&onGq(CWIMza6CT~lOS z1F;PF&VBIJt_1~EEBxdSOrYJyDypi{siI?>%=y5!YkS}qgl>8(I(pUo?uYYV{maQ6 zl{vV-Ui3ExbGlvSY1{r~;q9bd%l&o9`0PU+ZJ|EQ?RHhBneA4X5A0jPssu|YtOV>N zvx_qXiz=)X>}@e`reM<*RteT2*et=uDJ%%KmRTeq*jJ_d#zym74{<7CBf;Tvy!JL@Y z3VR1E%`6fWF`rP_2Vkv&RSR~{o$dV;SfgOhdR|r7mta+bIqP{=VOPM$2v#9tzOS%e zu-_kW4^Aze3L60XUNEPYmlfvQ-WEE|tk9YFtinpbx|nTt*c^rFV7r+`7K&P)R9Gcg z0_^Zay{7x?Y3b+vuou}@RlcI_F?e4R_0<0A%C3olIn|i+DSo5-Z;9WfdCqTzl4a=> zYksK_%?~sn#yNjQpiai>QsOitPT!!t^s>joH#;+Qso#lZ6jubEfEesiRD^dFvEc$S(zYjP)BvLZEv=iqF7n@AEzZw(_AinCH?#g&TgTr=Z6Tg>6LY@F)&iV;hO+PQT7r+LMSrN4$$g@h zXPj@h!|U)lzQzLY2D}GEkHY`vDn0Gg%@sI@`Yz#j6u<9m`$lc%{iM;g*ZJO+;NJ1O z2;oBG@7YTWp%p4UP4}w!~t=OlbDUxLO_8FG2u$Fkhlf$c!@+#Qf&i z;!MEIcsQS_#DmY`S;NOG9Kng74LCHG0eRdUZ4iAl$Lk-evw3BVHYc_uHoul=*EepO zzUdXBMd9c&UdL@4+Y{?IYy?0Aj5jA*#ibscF?+_G8FM*%3IBsb+a4oNGOU#qVP|4o zinHggZLfx<27j22XpP0eap9fOVhUgLh69l6aNdEB1uJ~QUGBrKBO1KI#YVJ{J%76D z4UYz9|CiY958FQF!9_h{KIHE%)-WR?XFRGd*0`=y_ig(iEFY|K>>!>R2Ux&SiPOM& z9GVGBjiUa;u6ofygOkRoi|2D)SK!O@_+ZV#c?;Tj4Hr0Adkg0+{O5EH3poA;&K?zA delta 1224 zcmajePe>GT6bJC%%x;E;vI|OKCA*}un=7qZHmTr_DebNp9X({MsZh{Cy0}r}tbtJA z!PqW=|AJWP5C}_q0~AH>p`+s`}KWqM*Q9S!P^<$=e;+--!MCWWwLoH zRC(VwIgs-_vx45t4WSEK@w{IvX!(G)^`DlC~REa%3HY^92&U^{`P;4HSU~6aV zR%`**NMFRND3yeo5I!1zn}4nA5r|qJDEM zQ6bEY60;WRcEoGcOnY#1opn~9)AZG{3emaoy~I2rvc>ANVQ*2&NtDp?AtH#!$UUV5 oRtOP86td>&hD){kQc{K%Rc80Iw|C3;+NC 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