From 140b930ad3ba337ec4d80b400ca5aa16846909df Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Mon, 14 Sep 2020 18:21:27 +1000 Subject: [PATCH] tests: Add tests for lq/stq, plq/pstq and lqarx/stqcx. Lq and stq are tested in both BE and LE modes (though only 64-bit mode) by the 'modes' test. Lqarx and stqcx. are tested by the 'reservation' test in LE mode (64-bit). Plq and pstq are tested in 64-bit LE mode by the 'prefix' test. Signed-off-by: Paul Mackerras --- tests/modes/head.S | 60 ++++++++++ tests/modes/modes.c | 172 +++++++++++++++++++++++++++++ tests/prefix/head.S | 20 ++++ tests/prefix/prefix.c | 36 ++++++ tests/reservation/head.S | 28 +++++ tests/reservation/reservation.c | 62 +++++++++++ tests/test_modes.bin | Bin 20520 -> 20520 bytes tests/test_modes.console_out | 2 + tests/test_prefix.bin | Bin 12320 -> 12320 bytes tests/test_prefix.console_out | 1 + tests/test_reservation.bin | Bin 10888 -> 11588 bytes tests/test_reservation.console_out | 1 + 12 files changed, 382 insertions(+) diff --git a/tests/modes/head.S b/tests/modes/head.S index d9e69dc..8b00bdd 100644 --- a/tests/modes/head.S +++ b/tests/modes/head.S @@ -230,3 +230,63 @@ restore: ld %r0,16(%r1) mtlr %r0 blr + + .global do_lq +do_lq: + lq %r6,0(%r3) + std %r6,0(%r4) + std %r7,8(%r4) + li %r3,0 + blr + + .global do_lq_np /* "non-preferred" form of lq */ +do_lq_np: + mr %r7,%r3 + lq %r6,0(%r7) + std %r6,0(%r4) + std %r7,8(%r4) + li %r3,0 + blr + + .global do_lq_bad /* illegal form of lq */ +do_lq_bad: + mr %r6,%r3 + .long 0xe0c60000 /* lq %r6,0(%r6) */ + std %r6,0(%r4) + std %r7,8(%r4) + li %r3,0 + blr + + .global do_stq +do_stq: + ld %r8,0(%r4) + ld %r9,8(%r4) + stq %r8,0(%r3) + li %r3,0 + blr + + /* big-endian versions of the above */ + .global do_lq_be +do_lq_be: + .long 0x0000c3e0 + .long 0x0000c4f8 + .long 0x0800e4f8 + .long 0x00006038 + .long 0x2000804e + + .global do_lq_np_be /* "non-preferred" form of lq */ +do_lq_np_be: + .long 0x781b677c + .long 0x0000c7e0 + .long 0x0000c4f8 + .long 0x0800e4f8 + .long 0x00006038 + .long 0x2000804e + + .global do_stq_be +do_stq_be: + .long 0x000004e9 + .long 0x080024e9 + .long 0x020003f9 + .long 0x00006038 + .long 0x2000804e diff --git a/tests/modes/modes.c b/tests/modes/modes.c index fa4872c..f37e70b 100644 --- a/tests/modes/modes.c +++ b/tests/modes/modes.c @@ -12,6 +12,14 @@ extern unsigned long callit(unsigned long arg1, unsigned long arg2, unsigned long fn, unsigned long msr); +extern void do_lq(void *src, unsigned long *regs); +extern void do_lq_np(void *src, unsigned long *regs); +extern void do_lq_bad(void *src, unsigned long *regs); +extern void do_stq(void *dst, unsigned long *regs); +extern void do_lq_be(void *src, unsigned long *regs); +extern void do_lq_np_be(void *src, unsigned long *regs); +extern void do_stq_be(void *dst, unsigned long *regs); + static inline void do_tlbie(unsigned long rb, unsigned long rs) { __asm__ volatile("tlbie %0,%1" : : "r" (rb), "r" (rs) : "memory"); @@ -25,6 +33,8 @@ static inline void do_tlbie(unsigned long rb, unsigned long rs) #define SPRG0 272 #define SPRG1 273 #define SPRG3 275 +#define HSRR0 314 +#define HSRR1 315 #define PTCR 464 static inline unsigned long mfspr(int sprnum) @@ -294,6 +304,166 @@ int mode_test_6(void) return 0; } +int mode_test_7(void) +{ + unsigned long quad[4] __attribute__((__aligned__(16))); + unsigned long regs[2]; + unsigned long ret, msr; + + /* + * Test lq/stq in LE mode + */ + msr = MSR_SF | MSR_LE; + quad[0] = 0x123456789abcdef0ul; + quad[1] = 0xfafa5959bcbc3434ul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_lq, msr); + if (ret) + return ret | 1; + if (regs[0] != quad[1] || regs[1] != quad[0]) + return 2; + /* unaligned may give alignment interrupt */ + quad[2] = 0x0011223344556677ul; + ret = callit((unsigned long)&quad[1], (unsigned long)regs, + (unsigned long)&do_lq, msr); + if (ret == 0) { + if (regs[0] != quad[2] || regs[1] != quad[1]) + return 3; + } else if (ret == 0x600) { + if (mfspr(SPRG0) != (unsigned long) &do_lq || + mfspr(DAR) != (unsigned long) &quad[1]) + return ret | 4; + } else + return ret | 5; + + /* try stq */ + regs[0] = 0x5238523852385238ul; + regs[1] = 0x5239523952395239ul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_stq, msr); + if (ret) + return ret | 5; + if (quad[0] != regs[1] || quad[1] != regs[0]) + return 6; + regs[0] = 0x0172686966746564ul; + regs[1] = 0xfe8d0badd00dabcdul; + ret = callit((unsigned long)quad + 1, (unsigned long)regs, + (unsigned long)&do_stq, msr); + if (ret) + return ret | 7; + if (((quad[0] >> 8) | (quad[1] << 56)) != regs[1] || + ((quad[1] >> 8) | (quad[2] << 56)) != regs[0]) + return 8; + + /* try lq non-preferred form */ + quad[0] = 0x56789abcdef01234ul; + quad[1] = 0x5959bcbc3434fafaul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_lq_np, msr); + if (ret) + return ret | 9; + if (regs[0] != quad[1] || regs[1] != quad[0]) + return 10; + /* unaligned should give alignment interrupt in uW implementation */ + quad[2] = 0x6677001122334455ul; + ret = callit((unsigned long)&quad[1], (unsigned long)regs, + (unsigned long)&do_lq_np, msr); + if (ret == 0x600) { + if (mfspr(SPRG0) != (unsigned long) &do_lq_np + 4 || + mfspr(DAR) != (unsigned long) &quad[1]) + return ret | 11; + } else + return 12; + + /* make sure lq with rt = ra causes a HEAI interrupt */ + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_lq_bad, msr); + if (ret != 0xe40) + return 13; + if (mfspr(HSRR0) != (unsigned long)&do_lq_bad + 4) + return 14; + return 0; +} + +int mode_test_8(void) +{ + unsigned long quad[4] __attribute__((__aligned__(16))); + unsigned long regs[2]; + unsigned long ret, msr; + + /* + * Test lq/stq in BE mode + */ + msr = MSR_SF; + quad[0] = 0x123456789abcdef0ul; + quad[1] = 0xfafa5959bcbc3434ul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_lq_be, msr); + if (ret) + return ret | 1; + if (regs[0] != quad[0] || regs[1] != quad[1]) { + print_hex(regs[0], 16); + print_string(" "); + print_hex(regs[1], 16); + print_string(" "); + return 2; + } + /* don't expect alignment interrupt */ + quad[2] = 0x0011223344556677ul; + ret = callit((unsigned long)&quad[1], (unsigned long)regs, + (unsigned long)&do_lq_be, msr); + if (ret == 0) { + if (regs[0] != quad[1] || regs[1] != quad[2]) + return 3; + } else + return ret | 5; + + /* try stq */ + regs[0] = 0x5238523852385238ul; + regs[1] = 0x5239523952395239ul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_stq_be, msr); + if (ret) + return ret | 5; + if (quad[0] != regs[0] || quad[1] != regs[1]) + return 6; + regs[0] = 0x0172686966746564ul; + regs[1] = 0xfe8d0badd00dabcdul; + ret = callit((unsigned long)quad + 1, (unsigned long)regs, + (unsigned long)&do_stq_be, msr); + if (ret) + return ret | 7; + if (((quad[0] >> 8) | (quad[1] << 56)) != regs[0] || + ((quad[1] >> 8) | (quad[2] << 56)) != regs[1]) { + print_hex(quad[0], 16); + print_string(" "); + print_hex(quad[1], 16); + print_string(" "); + print_hex(quad[2], 16); + print_string(" "); + return 8; + } + + /* try lq non-preferred form */ + quad[0] = 0x56789abcdef01234ul; + quad[1] = 0x5959bcbc3434fafaul; + ret = callit((unsigned long)quad, (unsigned long)regs, + (unsigned long)&do_lq_np_be, msr); + if (ret) + return ret | 9; + if (regs[0] != quad[0] || regs[1] != quad[1]) + return 10; + /* unaligned should not give alignment interrupt in uW implementation */ + quad[2] = 0x6677001122334455ul; + ret = callit((unsigned long)&quad[1], (unsigned long)regs, + (unsigned long)&do_lq_np_be, msr); + if (ret) + return ret | 11; + if (regs[0] != quad[1] || regs[1] != quad[2]) + return 12; + return 0; +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -338,6 +508,8 @@ int main(void) do_test(4, mode_test_4); do_test(5, mode_test_5); do_test(6, mode_test_6); + do_test(7, mode_test_7); + do_test(8, mode_test_8); return fail; } diff --git a/tests/prefix/head.S b/tests/prefix/head.S index 961c2a9..9a46e4b 100644 --- a/tests/prefix/head.S +++ b/tests/prefix/head.S @@ -245,3 +245,23 @@ test_pstw: pstw %r3,wvar(0) li %r3,0 blr + + .globl test_plq +test_plq: + nop + nop + plq %r4,qvar(0) + std %r4,0(%r3) + std %r5,8(%r3) + li %r3,0 + blr + + .globl test_pstq +test_pstq: + nop + nop + ld %r4,0(%r3) + ld %r5,8(%r3) + pstq %r4,qvar(0) + li %r3,0 + blr diff --git a/tests/prefix/prefix.c b/tests/prefix/prefix.c index d594037..8cc117d 100644 --- a/tests/prefix/prefix.c +++ b/tests/prefix/prefix.c @@ -33,6 +33,8 @@ extern long test_pstd(long arg); extern long test_psth(long arg); extern long test_pstw(long arg); extern long test_plfd(long arg); +extern long test_plq(long arg); +extern long test_pstq(long arg); static inline unsigned long mfspr(int sprnum) { @@ -183,6 +185,39 @@ long int prefix_test_3(void) return 0; } +unsigned long qvar[2] __attribute__((__aligned__(16))); +#define V1 0x678912345a5a2b2bull +#define V2 0xa0549922bbccddeeull + +/* test plq and pstq */ +long int prefix_test_4(void) +{ + long int ret; + unsigned long x[2]; + + qvar[0] = V1; + qvar[1] = V2; + ret = trapit((long)&x, test_plq); + if (ret) + return ret | 1; + if (x[0] != V1 || x[1] != V2) { + print_hex(x[0], 16, " "); + print_hex(x[1], 16, " "); + return 2; + } + x[0] = ~V2; + x[1] = ~V1; + ret = trapit((long)&x, test_pstq); + if (ret) + return ret | 3; + if (qvar[0] != ~V2 || qvar[1] != ~V1) { + print_hex(qvar[0], 16, " "); + print_hex(qvar[1], 16, " "); + return 4; + } + return 0; +} + int fail = 0; void do_test(int num, long int (*test)(void)) @@ -210,6 +245,7 @@ int main(void) do_test(1, prefix_test_1); do_test(2, prefix_test_2); do_test(3, prefix_test_3); + do_test(4, prefix_test_4); return fail; } diff --git a/tests/reservation/head.S b/tests/reservation/head.S index ce258b5..4ff85ce 100644 --- a/tests/reservation/head.S +++ b/tests/reservation/head.S @@ -155,3 +155,31 @@ call_ret: ld %r31,248(%r1) addi %r1,%r1,256 blr + + .global do_lqarx +do_lqarx: + /* r3 = src, r4 = regs */ + lqarx %r10,0,%r3 + std %r10,0(%r4) + std %r11,8(%r4) + li %r3,0 + blr + + .global do_lqarx_bad +do_lqarx_bad: + /* r3 = src, r4 = regs */ + .long 0x7d405228 /* lqarx %r10,0,%r10 */ + std %r10,0(%r4) + std %r11,8(%r4) + li %r3,0 + blr + + .global do_stqcx +do_stqcx: + /* r3 = dest, r4 = regs, return CR */ + ld %r10,0(%r4) + ld %r11,8(%r4) + stqcx. %r10,0,%r3 + mfcr %r3 + oris %r3,%r3,1 /* to distinguish from trap number */ + blr diff --git a/tests/reservation/reservation.c b/tests/reservation/reservation.c index 79bbc1f..502b285 100644 --- a/tests/reservation/reservation.c +++ b/tests/reservation/reservation.c @@ -7,6 +7,10 @@ extern unsigned long callit(unsigned long arg1, unsigned long arg2, unsigned long (*fn)(unsigned long, unsigned long)); +extern unsigned long do_lqarx(unsigned long src, unsigned long regs); +extern unsigned long do_lqarx_bad(unsigned long src, unsigned long regs); +extern unsigned long do_stqcx(unsigned long dst, unsigned long regs); + #define DSISR 18 #define DAR 19 #define SRR0 26 @@ -180,6 +184,63 @@ int resv_test_2(void) return 0; } +/* test lqarx/stqcx */ +int resv_test_3(void) +{ + unsigned long x[4] __attribute__((__aligned__(16))); + unsigned long y[2], regs[2]; + unsigned long ret, offset; + int count; + + x[0] = 0x7766554433221100ul; + x[1] = 0xffeeddccbbaa9988ul; + y[0] = 0x0badcafef00dd00dul; + y[1] = 0xdeadbeef07070707ul; + for (count = 0; count < 1000; ++count) { + ret = callit((unsigned long)x, (unsigned long)regs, do_lqarx); + if (ret) + return ret | 1; + ret = callit((unsigned long)x, (unsigned long)y, do_stqcx); + if (ret < 0x10000) + return ret | 2; + if (ret & 0x20000000) + break; + } + if (count == 1000) + return 3; + if (x[0] != y[1] || x[1] != y[0]) + return 4; + if (regs[1] != 0x7766554433221100ul || regs[0] != 0xffeeddccbbaa9988ul) + return 5; + ret = callit((unsigned long)x, (unsigned long)regs, do_stqcx); + if (ret < 0x10000 || (ret & 0x20000000)) + return ret | 12; + /* test alignment interrupts */ + for (offset = 0; offset < 16; ++offset) { + ret = callit((unsigned long)x + offset, (unsigned long)regs, do_lqarx); + if (ret == 0 && (offset & 15) != 0) + return 6; + if (ret == 0x600) { + if ((offset & 15) == 0) + return ret + 7; + } else if (ret) + return ret; + ret = callit((unsigned long)x + offset, (unsigned long)y, do_stqcx); + if (ret >= 0x10000 && (offset & 15) != 0) + return 8; + if (ret == 0x600) { + if ((offset & 15) == 0) + return ret + 9; + } else if (ret < 0x10000) + return ret; + } + /* test illegal interrupt for bad lqarx case */ + ret = callit((unsigned long)x, (unsigned long)regs, do_lqarx_bad); + if (ret != 0xe40) + return ret + 10; + return 0; +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -204,6 +265,7 @@ int main(void) do_test(1, resv_test_1); do_test(2, resv_test_2); + do_test(3, resv_test_3); return fail; } diff --git a/tests/test_modes.bin b/tests/test_modes.bin index 24e39813fa353af0d03f534c01389d4c3f97d9f5..d0c24d70a6026017cb9837afa378b6144a1da476 100755 GIT binary patch literal 20520 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 diff --git a/tests/test_modes.console_out b/tests/test_modes.console_out index a49bb9b..25e791c 100644 --- a/tests/test_modes.console_out +++ b/tests/test_modes.console_out @@ -4,3 +4,5 @@ test 03:PASS test 04:PASS test 05:PASS test 06:PASS +test 07:PASS +test 08:PASS diff --git a/tests/test_prefix.bin b/tests/test_prefix.bin index 8690be78d4cf9fe71c2d425ac617fee2fa92e122..e84e70e7870bf5e2cd13d9368b89c732dd83c46f 100755 GIT binary patch delta 2097 zcmZ9Me@s(X6vxjiwX_bKR$*cW+oP}0K3ZcPx;(U9TLN0_A|{x{7>utr`w?R@*vtY_ z)+clcBxXUcf8ZaE>Y_pBA2a&TGXGHjS~B+sjx1)AUyda-iwh=ft1EbSPWymnFS+#I z?>(P$zVF=oNULde_?)5Bb?b|atx*Ml)nOd=X|n(WSu=cmkt|@Nu z_9^=z>jlx96d1v!WjxSYmSToVTjZxo}kWozkg6oDUXb*(mKndg@lsVfZSc& zUu8;=d1REmV>**YMueDBQN-Ag8Ppk@)-)tSO)_KGi*@SYT?EHbo0?fKwi&@gYoKFj z3+|7D#p~CZMZMUKB1S}}N@t8((-kb1snKg0b#78k7F>1}fer-cq3~uB0tnwAm^$(h zb?Qi23{6U^(pbbfk-MpLM$K`hmP|?(?}*NXkfDxjC}Mm`gt~PIw5GFEXs7N{)j_8Y z{y4qfkvEYG>0ATG8?>g(s!6xbbrekc+m_<$`69Lw`op`B_d$)q6tPSMxe|R@0p5#2reA4U3`~84jt|?I!8wlA6UX!iXa|$2^S|m9(KOpyvpA5zz zDF#~vNO)Ngl=}rxwT3JspqefLew(nd+%VR59CJGB=xXa zr-tM6ie@^i@b?-iQZ&-VfJDe5+ zj!SaP3c>t7y~l|5H23+h>nBYgXfry;y#-j55;mN>={ja*>SCDlr^%oVG$qu__jc!g zPtLvMQ8xzDob(A?(-%#zU2cL%L-W1h*T=;GnH)irQ}4?$yJI>|Ca+za4SqTz1|}zY z{D)_9j0}lzKSu`LFqeDw%et{LEM9`<#`wDhaTxz~z@nTe&-WSB5xkR-txpW%RYI4+ z?x@s9Cdm|;YeZwzl@aa4n%P>^jA-^S9fn$4$(EhvHId%<+NHa+!lOUuUM78zR5k*C z<4$QjQO$PNZrNrr6i#Rl;wwU7P8VvC9jk3m9xCKmz+?L3dWku)w9KP;aU011=O_F} za9`6L=ciET{HmW!s=e3H=x<3o*1T>wlUUV1M12M0t{Zw2RDtwP)QG|3U90gJV=zBG zY^&4GLUrbr3f(1jUqGko$0=nSzAUZjl+2%`6pOy5>kgeM#J+9 zjA@P`%&ex_w{aaxHZvc$P+z{!5A&mR8FFtE`IO{Q@86_l!Q z_;IBE=6no)p*0^fDjc&yc*YbKQR=`^_7CT?_zTUJFpLWOtRc*FvJm4$S;O%?#?Z&F z$FQI3D=d_A0rhk2dA+pTjjP8LkmbBnz{x($_N8G|i01PhLu28YX;a=AWi?{VAglIB zCNIvOykPr0_2nHnJ^e4|8U{d%RYW80Eah>^_fQ-r5g!{4YKlL{`5+1SQ1uXwZ`g## kvwa?SNTG+KH5^&gLgWh{(k|j~u5f65BxZ^wg3PC delta 1629 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