From dc097e32d8094c54ed2cd71a2ed6b7739b5897ca Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Thu, 2 Feb 2023 23:06:32 +0800 Subject: [PATCH] kernel: fix atomic operations Atomic operations were previously broken. RISC-V breaks atomic operations into multiple instructions, and there is some state kept between those instructions. This state is not visible, and is internal to the processor. We were ignoring this state, which resulted in inconsistencies throughout the system. The following sequence was possible: 1. A thread loads a value, and obtains the `reservation set` 2. A context switch happens on the following instruction 3. A different thread loads the value, modifies it, and continues 4. A third thread (or a different process) loads a value and obtains the `reservation set` 5. The original thread runs, sees the `reservation set` is held, and updates the value, clobbering what the second thread did in #3 A workaround for this is to perform a dummy `sc` as part of the context switch. This invalidates any atomic operations that may be pending. Signed-off-by: Sean Cross --- kernel/bin/riscv32i-unknown-none-elf.a | Bin 9062 -> 10102 bytes kernel/bin/riscv32imac-unknown-none-elf.a | Bin 8870 -> 9982 bytes kernel/bin/riscv32imac-unknown-xous-elf.a | Bin 8870 -> 9982 bytes kernel/bin/riscv32imc-unknown-none-elf.a | Bin 8870 -> 9982 bytes kernel/bin/riscv64gc-unknown-none-elf.a | Bin 14238 -> 16086 bytes kernel/bin/riscv64imac-unknown-none-elf.a | Bin 14238 -> 16086 bytes kernel/src/asm.S | 20 ++++++++++++++++++++ 7 files changed, 20 insertions(+) diff --git a/kernel/bin/riscv32i-unknown-none-elf.a b/kernel/bin/riscv32i-unknown-none-elf.a index bc88a1f90b914febb384ac02b03e013226dc04e9..7342c6ca3d20a3401a64e9e6a3ba792455e67f94 100644 GIT binary patch delta 1968 zcmbtUOG{Nz6h7ONx8ozd4>Nm^$8&360|!?$A0VL(vPmjbPy`i}5EPLR)WEtyh1yGP zTV_^T*~1=?U5iFd8U+1;Xb{w-K{RL-1r1u?UVD3Qr(qk;KHvAPZ?ARs+IQbCn|^eS ztnixGH>^)LG`EZf*J~{H{j`t4bA3A9)YRnrtu4)?AJ-**296$$daiYrIhEPvqNt!F zLBjt$)7hjuDa2y+*_~9M+_*YaxJJa(XyLnJr?3Fk+=&A9-QA_OM>dE$H6BT+XAw`m zj`ZN2EnD30sjuZ_8P5^=+w8=Ak);lEFT_hjJR0H^Azl^Yt1Qo$0=^XtUlZcBAzl~a z=@93JL*xy#gyL<6yJS#9!rYt8RNGio-nQee!v*_P&{OeJ1Axu>patp_1fEv zu{L>!ChQ+1Wdb_UT@q*@QF2B@jZ;SVNfP&1$9+!T&*7BOJ$SCOt~W5rSbxL~#;ChO z++?B)-(swHFr^x+yB75x-oGz$cr!Om%)8$s1!3+I0A=zz_@u!>TW)W`fmtSE(3|C%R}S zEPS7I@jzk%Z>0LMns9L~ z9sorL*`1L1PLIEX1aau^b;-}{^9}rHjbYm|%su7krWO3PN^1D!Zo*WA+;VXXs|Ba_ zN{*_uncKoX^J`(Aiup$P6Z1CSEQ|*43OS|LgU^HCv#q-losI*P?+B-8Q%{AtfAvh* zV16!KVD1PPnV$$BVn*Rm=YepT`%sv3okzmw*zux3DD+qYEabFz*^AD3fNDd|!{+V@ zhXw8nhs|wb!C4M2IZLX~Faa)8D34#=#a5F%&dk%|7I~cPFVW(Ut8Fd@FiT_6relkA zz&Z0#V1x8nfc3aLt#_VS=MciRBtQwE#T=Rro+WRO;9-ChbjE`Gr)j~9#5#u%wn)%o zh)l`Hxj#TV8bgH NS4iedbd@*V%744}U~vEd diff --git a/kernel/bin/riscv32imac-unknown-none-elf.a b/kernel/bin/riscv32imac-unknown-none-elf.a index c2cb641f57415acc6d5c951146a4308358e55f5e..8e65db07f4a9479c2e3df404d6a87d04a3e9927e 100644 GIT binary patch delta 2247 zcmaJ?U1(fI7@gUBce71*H+z$q>{iL%-IYm&LN=yJsx1;9#1hd4>`U;$f(?i*)N9k)p#0MYxP=eo?Z)Wduh0bz!&N<(i z@7tNVGkf8w^=D6PN{wd;dd$n{HF}o) zLR+?}KcfHf7u!WLfr{SQgbuwI^wH$@gxI2gN%rg8$+Z4EIf1_ML~4)USZ-gFaz!7= zl=S&bKKKsfOiP)c{=NP&GoaTqWAax$kS&$hTv%}Yw;2DUQO^!Yxvm#-rNIOyZyKBZ z7*EG|MwdE@^|UGMMhd~)Ovs4L{icC=D#p_>-X7zb7|%Igw*~V~u)H(IyJNg3#tSjN zDaId)@jlCk+>Ez14Zc~CTx_+%W<0I$LhwYFF6LhkZrJg8da0%fr}aYq zT=AM!siQS94VzxLs&@y~!RxGSq0Wu30e{Onj+}d$UojqiDd^ymQ1G;Ri6Ql4%6 z-uY8|eT1aSyF3b5y~B71^!FmHtY-}R9P7Z!dY*^=KI_10hVdlyqY+lt^CI+PqHZD} z%9^GS_<#oht7DA!LH{tq%6bk$Kh8R^vYt1fpI{wWS$a3Hm(i zz{+}X2gu8;<9y32jPcgVWyamWUoplJt;?^O;5^DD#wO8cjLqQB8DntuiwO5y9f{l2)k_BN5+MCHfLlwRGXY^{@Cjq{BhE86Ggx433V+JjOkhzT z>U++gdUfwhjUW0Z)$Cj>rmagKI9fiv;8zvw^!*cQs2pj>5P#T;VCgZVj~hc!?5BKG+qQjC@NJS>jnibTIUn`zPXsS%YvFsL5O0!(!noqx zL~sC*&*fOr3+3KUydH8g-_nQ@T)5*{!rq eH)+-nkl4`AR31$H8|arSs<29VZdornSNcDqWyWp* delta 1273 zcmZ9K&ubG=5XawZk|jyI?rzeCM6_L#bW=(pn>LB5Am$>~Qfm$#deM3i#2-iz#fy*% z^=H*KPFumo>PeK|Tu<7A6c4$mARa1+di2zTe}Fpk-fkK)Fgu@lGw=I;?E8D{#o@)> z!Qs*2{e@h~t|gx&JvL3-B$MBqZ5NA0(<~M9cJ0SNw9?BMXN=|185>|R)&mK?4h=pI zv5s+GaBg(0av1Wxh4212#zA-)=mI;i47O6>X*jE7U`44o+sbJ_zv3L~{K<{iLX19& z5Pt(%wGU3II^Te4HOn`lsvh6>sjcfvTmBXPseOFQ(RO7yOlmq@Lf;OB4ZjdoXxqXR z_@)=Q0t;G#hl#5#HPP#JGNy?<+#Ha3swHnCf{%5zrkDrYa=lI8PjxsL?1bNjZfI@Y z5jYyT+PoeeuV+^De~#1>^_|`k7fCGs80Mm>+*3I;guz&oY!g3|Oux@~F8Mt18f-;- zosMpm^IMMIvl*`DeT*e<%NAnmrep;JUy@9x<;#+F;uXo=#5Kur;zyGA5QAi)b6>KU z`#>_yO+94OBBLbZ7KG4(Y$Bo5;tprrak_4PM~;il-IXjBxF=a`ZXW8%N#{>;f`=+t zyojYJjHOffEH0!|)eRh@`B8M*DBUdO6X?x%gnSv3QM??_yxJHJ(44YcXwU{wfb?jO zp594hZw?|`$3hYxM4{g}Fy;1@sesnNLm$CN8uTDNjdRGY8Xx^I+aHTuZyWyQ2h)mG zuemeJ7|Ha#jGe$psw%ptI*&}MHab}_z*ttI_)?90)s12hKPBuly#ynjmW*BoYL7Ip z{iL%-IYm&LN=yJsx1;9#1hd4>`U;$f(?i*)N9k)p#0MYxP=eo?Z)Wduh0bz!&N<(i z@7tNVGkf8w^=D6PN{wd;dd$n{HF}o) zLR+?}KcfHf7u!WLfr{SQgbuwI^wH$@gxI2gN%rg8$+Z4EIf1_ML~4)USZ-gFaz!7= zl=S&bKKKsfOiP)c{=NP&GoaTqWAax$kS&$hTv%}Yw;2DUQO^!Yxvm#-rNIOyZyKBZ z7*EG|MwdE@^|UGMMhd~)Ovs4L{icC=D#p_>-X7zb7|%Igw*~V~u)H(IyJNg3#tSjN zDaId)@jlCk+>Ez14Zc~CTx_+%W<0I$LhwYFF6LhkZrJg8da0%fr}aYq zT=AM!siQS94VzxLs&@y~!RxGSq0Wu30e{Onj+}d$UojqiDd^ymQ1G;Ri6Ql4%6 z-uY8|eT1aSyF3b5y~B71^!FmHtY-}R9P7Z!dY*^=KI_10hVdlyqY+lt^CI+PqHZD} z%9^GS_<#oht7DA!LH{tq%6bk$Kh8R^vYt1fpI{wWS$a3Hm(i zz{+}X2gu8;<9y32jPcgVWyamWUoplJt;?^O;5^DD#wO8cjLqQB8DntuiwO5y9f{l2)k_BN5+MCHfLlwRGXY^{@Cjq{BhE86Ggx433V+JjOkhzT z>U++gdUfwhjUW0Z)$Cj>rmagKI9fiv;8zvw^!*cQs2pj>5P#T;VCgZVj~hc!?5BKG+qQjC@NJS>jnibTIUn`zPXsS%YvFsL5O0!(!noqx zL~sC*&*fOr3+3KUydH8g-_nQ@T)5*{!rq eH)+-nkl4`AR31$H8|arSs<29VZdornSNcDqWyWp* delta 1273 zcmZ9K&ubG=5XawZk|jyI?rzeCM6_L#bW=(pn>LB5Am$>~Qfm$#deM3i#2-iz#fy*% z^=H*KPFumo>PeK|Tu<7A6c4$mARa1+di2zTe}Fpk-fkK)Fgu@lGw=I;?E8D{#o@)> z!Qs*2{e@h~t|gx&JvL3-B$MBqZ5NA0(<~M9cJ0SNw9?BMXN=|185>|R)&mK?4h=pI zv5s+GaBg(0av1Wxh4212#zA-)=mI;i47O6>X*jE7U`44o+sbJ_zv3L~{K<{iLX19& z5Pt(%wGU3II^Te4HOn`lsvh6>sjcfvTmBXPseOFQ(RO7yOlmq@Lf;OB4ZjdoXxqXR z_@)=Q0t;G#hl#5#HPP#JGNy?<+#Ha3swHnCf{%5zrkDrYa=lI8PjxsL?1bNjZfI@Y z5jYyT+PoeeuV+^De~#1>^_|`k7fCGs80Mm>+*3I;guz&oY!g3|Oux@~F8Mt18f-;- zosMpm^IMMIvl*`DeT*e<%NAnmrep;JUy@9x<;#+F;uXo=#5Kur;zyGA5QAi)b6>KU z`#>_yO+94OBBLbZ7KG4(Y$Bo5;tprrak_4PM~;il-IXjBxF=a`ZXW8%N#{>;f`=+t zyojYJjHOffEH0!|)eRh@`B8M*DBUdO6X?x%gnSv3QM??_yxJHJ(44YcXwU{wfb?jO zp594hZw?|`$3hYxM4{g}Fy;1@sesnNLm$CN8uTDNjdRGY8Xx^I+aHTuZyWyQ2h)mG zuemeJ7|Ha#jGe$psw%ptI*&}MHab}_z*ttI_)?90)s12hKPBuly#ynjmW*BoYL7Ip z{iL%-IYm&LN=yJsx1;9#1hd4>`U;$f(?i*)N9k)p#0MYxP=eo?Z)Wduh0bz!&N<(i z@7tNVGkf8w^=D6PN{wd;dd$n{HF}o) zLR+?}KcfHf7u!WLfr{SQgbuwI^wH$@gxI2gN%rg8$+Z4EIf1_ML~4)USZ-gFaz!7= zl=S&bKKKsfOiP)c{=NP&GoaTqWAax$kS&$hTv%}Yw;2DUQO^!Yxvm#-rNIOyZyKBZ z7*EG|MwdE@^|UGMMhd~)Ovs4L{icC=D#p_>-X7zb7|%Igw*~V~u)H(IyJNg3#tSjN zDaId)@jlCk+>Ez14Zc~CTx_+%W<0I$LhwYFF6LhkZrJg8da0%fr}aYq zT=AM!siQS94VzxLs&@y~!RxGSq0Wu30e{Onj+}d$UojqiDd^ymQ1G;Ri6Ql4%6 z-uY8|eT1aSyF3b5y~B71^!FmHtY-}R9P7Z!dY*^=KI_10hVdlyqY+lt^CI+PqHZD} z%9^GS_<#oht7DA!LH{tq%6bk$Kh8R^vYt1fpI{wWS$a3Hm(i zz{+}X2gu8;<9y32jPcgVWyamWUoplJt;?^O;5^DD#wO8cjLqQB8DntuiwO5y9f{l2)k_BN5+MCHfLlwRGXY^{@Cjq{BhE86Ggx433V+JjOkhzT z>U++gdUfwhjUW0Z)$Cj>rmagKI9fiv;8zvw^!*cQs2pj>5P#T;VCgZVj~hc!?5BKG+qQjC@NJS>jnibTIUn`zPXsS%YvFsL5O0!(!noqx zL~sC*&*fOr3+3KUydH8g-_nQ@T)5*{!rq eH)+-nkl4`AR31$H8|arSs<29VZdornSNcDqWyWp* delta 1273 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 diff --git a/kernel/bin/riscv64imac-unknown-none-elf.a b/kernel/bin/riscv64imac-unknown-none-elf.a index 3e38f01244b5d726bf2538c7506fead82643a4bb..9c01444003458eb0f40e59d28ad8821b035fc545 100644 GIT binary patch delta 2643 zcmaKtU1%It6vywK*-U1ekIrUicP243)3mOwsJqE_KR{g;6f31BdGJ9HO-c<2Vzv07 zKGYQ}EveQf9;>$1Bu%QVtu@MO8c{G(5b;6#q7)z67at0~D2Rw4c+Z`4lS2$nm_28H z=YRh9%*-V-{nSqfCVSjUsaPr$E7hs~lUqz4MTH2D_;;XCD3{AoG*GIR%2U_#L7^)2 zA=PhPXLS*XEZi)ANaUkb2!F_3aZ!7yO*qDmygs zT0RHYZnsWYP`4k3%PsY`-D*usuj|6*!Mh=HT)5A9T1Bt9=)CAOhdP!l`7O-20XSYL zzsF2o(bq#>2rqaA_{JNPzi5(6h4O~ZYHIX-sjxYn`dC_73A1h%hSH(zf#LM+2}eW{ zmXm>$aK+ETqpgl~;epn`c7+AQtr-;)6dj5##SIkODRxryD0WfwDP}2#6x9IQzn9`B zSV-rsoP?29Uo9KKMt_tpS7wSJ<)m#}v_Xfz=f6c|2y>Y(ybaqE@qnJ#f=zI1rbi}K zmQn2~_{Y!7PP~G@eP2D}graG9B=fa;u6@}+Mo`IKke}+#KeN4Z0n)+FJ)i0K6aUb5 z5h-=K$oO59BfrFWo$)2cUt)X_z6kE@7_no7yJ4dFYjBGtPc+j#2Q%F@s`RVMA?m|W zgN1z1xR+HAv#Q}a#dz2KOn;K;4M#oq8D;t-Oi#QauwjA~##zHF>u}U_qbHdDRi-x_ z_1tGa(;pR$)ecj@25$5$Yj|x{E(}NgQN|B2{jqg8>Q{Vl{e!Gwk~J8P4cusg>8F_9 zaMW|3V@&@#(<9gSj}6@DIBNjbU^wcz(J7{XgXs-NJ@+}is&9znticqpfg7D&Z4hrV zz2T_mJ{Ot(Ev7dd^|24V|0ZjAn>84Y4czDw)1P8`!%@$D9Ma%-;zOoyH~S9@7g@oh z9Qj9#`;33Uc*yv9#(NpRz_=NxfeXyBf>{{>ao#F~0Ayz0J9SAEigLTqT(ghl>^bVl5ADf@{U@ zZQXIfjEuVh-=s@=!*{~yV30hI?^YcVd^Ol7AB4Ug!G`aMeQBeo9EQ;yp>cigrdW@z zNp-Gu9Y=@cp_W+HuU*Grv>0rEs1&owI0$rTQ|DTT{o3IiIdo}w#A|hxDUOn_wJXznHowaMpgE!wd-+S}kFf+SfE-y^X zCVc6hboZfD)|%V>sNLbFX_;j9n6j))CS#hZgO-(@TkF!ZDTy1yvB+6bic2xr!&c!p z8-io<5bLYFmY*>=r!0e}8i@O0T@6A(ZG|Pp10(3;%1P8(;DRUT!zy`n8OoXtMQ;ae zdPpZP2qvDh~_9GQd<5d;39{tLDuU2KD* zmCnXj3^t<%B(*pM^@QBYU_Cy47M%14f)i+hlRhUnfnoEqM1i~ZgpbXFlMXK3y`dSG?lhKB zyXDeF1E~YG+corkJiojhF$JYUceZ7T63M90ENAxM=!EWk_lB;!@|_J){Tq%>i%l`1 zz)iskoCc&%Lx1*EWg+{Cg=2QgR~w`#lylwUl|nVw9*)}qr(G1ba=LmPMMjS<@RSY~ z?TA9}8mc{kfkB+sp%>BJwk}FJmlegJPdMc{EryZv;_}Zr*yv3ToJOH$!A@GXeT-Bv zfKElpoPy_(^MXu;iTqymk~8<4D&^r;;Z45n%p|f}eM((CNqTOBM1AVfclMb^jgG@Y zciX56R$o$`M~!d8Kl@)>df&C$8lujqs6}n*HSBEr0yX^XN+Rtad{kkhuK*`}-jFnk cKO8dpe&(USaDc_2R4DkTM2{8v3(@WU1!nWIcmMzZ diff --git a/kernel/src/asm.S b/kernel/src/asm.S index 813d2cfef..755a2f9d5 100644 --- a/kernel/src/asm.S +++ b/kernel/src/asm.S @@ -154,6 +154,11 @@ _xous_resume_context: move sp, a0 LOAD x1, 0*REGBYTES(sp) + // Clear any reservations, invalidating any atomic operations +#ifndef SKIP_MULTICORE + sc.w zero, x1, 0*REGBYTES(sp) +#endif + // Skip SP for now LOAD x3, 2*REGBYTES(sp) LOAD x4, 3*REGBYTES(sp) @@ -206,6 +211,21 @@ _xous_syscall_return_result: csrw sepc, t0 LOAD x1, 0*REGBYTES(sp) + // An atomic operation is broken up into multiple instructions. + // A program first issues a `lr` instruction, which basically + // raises a flag saying that an atomic operation is now live. It + // then issues an `sc` instruction, and if the flag is still held + // it succeeds and clears the flag. + // + // This flag is a bit of state within the processor, and the + // RISC-V spec doesn't say how to access it. However, it is only + // one bit, and we can clear the bit by performing a dummy `sc` + // here. This will cause a failure in any atomic operation in the + // program we're switching to. +#ifndef SKIP_MULTICORE + sc.w zero, x1, 0*REGBYTES(sp) +#endif + // Skip SP for now LOAD x3, 2*REGBYTES(sp) LOAD x4, 3*REGBYTES(sp)