From 9326fc7f1828fae460486d4ace67879d7a5fb265 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 25 Sep 2025 11:43:24 +1000 Subject: [PATCH] tests/modes: Test that mfspr/mtspr to unimplemented SPR in user mode causes HEAI Signed-off-by: Paul Mackerras --- tests/modes/modes.c | 38 +++++++++++++++++++++++++++++++++++ tests/test_modes.bin | Bin 20520 -> 20520 bytes tests/test_modes.console_out | 1 + 3 files changed, 39 insertions(+) diff --git a/tests/modes/modes.c b/tests/modes/modes.c index f37e70b..b083671 100644 --- a/tests/modes/modes.c +++ b/tests/modes/modes.c @@ -7,6 +7,8 @@ #define MSR_LE 0x1 #define MSR_DR 0x10 #define MSR_IR 0x20 +#define MSR_PR 0x4000 +#define MSR_EE 0x8000 #define MSR_SF 0x8000000000000000ul extern unsigned long callit(unsigned long arg1, unsigned long arg2, @@ -27,6 +29,7 @@ static inline void do_tlbie(unsigned long rb, unsigned long rs) #define DSISR 18 #define DAR 19 +#define DEC 22 #define SRR0 26 #define SRR1 27 #define PID 48 @@ -35,6 +38,7 @@ static inline void do_tlbie(unsigned long rb, unsigned long rs) #define SPRG3 275 #define HSRR0 314 #define HSRR1 315 +#define HEIR 339 #define PTCR 464 static inline unsigned long mfspr(int sprnum) @@ -464,6 +468,39 @@ int mode_test_8(void) return 0; } +int test_9_mf(void) +{ + mfspr(2); + return 0; +} + +int test_9_mt(unsigned long arg) +{ + mtspr(2, arg); + return 0; +} + +int mode_test_9(void) +{ + unsigned long ret, msr; + + /* + * Test that mfspr/mtspr to unimplemented SPRs in user mode + * causes an HEAI and sets HEIR. + */ + msr = MSR_SF | MSR_LE | MSR_PR | MSR_EE | MSR_IR | MSR_DR; + mtspr(DEC, 0x7fffffff); + ret = callit(0, 0, (unsigned long) test_9_mf, msr); + if (ret != 0xe40 || + (mfspr(HEIR) & 0xfc1fffff) != ((31ul << 26) | (2 << 16) | (339 << 1))) + return 1; + ret = callit(0, 0, (unsigned long) test_9_mt, msr); + if (ret != 0xe40 || + (mfspr(HEIR) & 0xfc1fffff) != ((31ul << 26) | (2 << 16) | (467 << 1))) + return 2; + return 0; +} + int fail = 0; void do_test(int num, int (*test)(void)) @@ -510,6 +547,7 @@ int main(void) do_test(6, mode_test_6); do_test(7, mode_test_7); do_test(8, mode_test_8); + do_test(9, mode_test_9); return fail; } diff --git a/tests/test_modes.bin b/tests/test_modes.bin index d0c24d70a6026017cb9837afa378b6144a1da476..0649686c181fa23af18db9d3e1b734e07d3c1833 100755 GIT binary patch delta 2257 zcmZuxeN0nV6hH43N>Oa8lC1)B4~iRQI13^?Xe+OLuc*Nf+;Cgcf;u$DsllY3uWM!9 z23yQ@*CnuJT8uWjWQmNK%w&InTg*(hM30Mud|Q;h;|(QU>1pXqglh^8x@KS%T0SNLo={n@TtvTA9N#Z23YzE4Ho2lfj8B z4}`kpVi=MIq?ka6UE;a10_cxPus^osK5x=E8ZU1gu`$$*f!V6&v%reygLq>ssxzqM zw69M>i%LabpViya0!||o`deBIUI3{gbKMEm2TO`1I;VkRjDpY|MQcj(v{c19a0 z8x|sYpd=ioEeWf{L3s>9c@+h#q<}IzOc}|;#Clhh7{Y31;Wz5!I6LCZGWY(^ScGvb z*bbXH$hlNO-S>diKRd-yU0I+#G$eC=%u)E{ybnAlWPlKEkGy+4o}!RQaTm^7blv*E z2p_SFDmbN+d|y;Fc;%Qo07{|SjQV6-<|JE7#<^4bOvKrGC5(xxu0}g|=1^XsP(ky=bDjJzmX=XWPQmTT&Q|2mb5+>MzvTWfCcB<@C@yu;jR$eI@ z_OdjYMb1v!*BQ(QyrY-Mp)kI$FAUB%b~6R(4+fEx=8 z)tk$#ewJdtC>&>(?G|C_;A8tjK~UH{=V#*T>)5D`Z*tz{03|HLlt=zph{zJO`(}GW zgKz~Wh6aFi)Qbx!!&F3jg(NuPqaM+B|LsV;M-&o`28PVODt>`=tPBfV*yKt}(7d;u zzC%rm-M>pO(bPlURl>vCh<(T4e>q=->ub0$Z05#q3ln{29n zK`1~hLK_KT9UdCfU2s%5BD#&9grVwdSM{#Bs3K#(;*Q2Z-G6|r9s)6%KcN>igH)f7+q8Wx7ia$JN(&>7?W3EiwWDpfI?aZ1`Og9Oj>xe zk7eqHB#L(=XfijHEMSO%3`j_(fyEg~G+~J*U|?=Yps+2Bh*BJQJ?E_ujEOI~yXTzy zo$r44o^!jyUBclm;iIs4$aj3_dkfj9Z#wh3<_QBVx;i3{dRC#E=? zTGPSL?Cv?~-)L5_M2Iq@x>F;{F;?rIB^+h$Md{)J&ej)Yv;FRDp^Y7PS5EK!)KTV1 zQ_98%^Fqv4kXf`W4gC9Xa}v0!eo!Vs4w!qdx7ShTfMMC=$qOm4Te8BkNO=IOL(+eirepwqdTZ844m{>)5d8iRhp_jkc*P*MbioZKbV3o9;tT2&Oy| zOoSwM#>ix$W?(@St8@N5%B^18lnjHi6=TF_!x*4#eqdm+rXc7^_y-g(oUf3&MY9%v znGa9kLaoH~-ZcCAl?@Cgp#+}AK5Cz(`iPjO-D4YsB@F#FOB@GrW5E?Pb%?*$83=G$Sn@)G2gIKUa% z&CV8oApRI*%cW9rXgk{@JtzFYPD=|#cZ}VX-V(pQ&eoUg6xHkOmy+d#$S>U^Zo0-! zm2MD)Yb;BCO^j`4@5yr(beOl9}9q?V-%f{Q&>{-L<(3OiN)A{(kmc5{9O zA0n4wJSe>{bV&|qz`9<2^ay{(dQqHWs7mT*WxiQyXNM;XKq5$>-Ne39vskN77q&2q z;+#3Yy@C2&!ivS>e0Zcg$*kRBs*=7gjw`yJv+v@cJU|U(16}Gn$akgQu36s@izQ*( z28%L!zEu|s!rmTBB^Qzjz|2dIMeS&1;@CXGc^GG?u{u)KcLG+ZG^yz3;*fBh!SxF` z!xD=MpNXA9wbg~V>Zw+!_;t{vPQxYQ+K6N8DCa?(q1xc8v_h4^H6KGQIF91Fj;|JK zEX!3;JCcYG$y94&{UqPzNy2%EIf3K;EzXBaA zhuA>XtO^H0GDU#8yNOF$Z0PVCI%??#OsWkrSY$Yam`1eeBkDSgL7YA9pRs0H87JEQqZnpNBqw& l(Es9`YDORN=s4Ojrr=@dqgXqRGZUO|?Frce=8x-g{{hgsiD3W$ diff --git a/tests/test_modes.console_out b/tests/test_modes.console_out index 25e791c..2fe36d2 100644 --- a/tests/test_modes.console_out +++ b/tests/test_modes.console_out @@ -6,3 +6,4 @@ test 05:PASS test 06:PASS test 07:PASS test 08:PASS +test 09:PASS