From d31c17d91484d987af904d1ad41502aeb026fbe4 Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Sat, 16 Nov 2019 00:01:52 +0100 Subject: [PATCH] More idiomatic register-rs use --- 06_drivers_gpio_uart/README.md | 18 ++-- 06_drivers_gpio_uart/kernel | Bin 83568 -> 83240 bytes 06_drivers_gpio_uart/kernel8.img | Bin 8064 -> 7928 bytes .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 16 +--- 07_uart_chainloader/README.md | 22 ++--- 07_uart_chainloader/kernel | Bin 85408 -> 85000 bytes 07_uart_chainloader/kernel8.img | Bin 8968 -> 8752 bytes .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 34 +++----- 08_timestamps/README.md | 12 +-- 08_timestamps/kernel | Bin 90144 -> 89840 bytes 08_timestamps/kernel8.img | Bin 13080 -> 12968 bytes 08_timestamps/src/arch/aarch64/time.rs | 8 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 34 +++----- 09_hw_debug_JTAG/kernel | Bin 90144 -> 89840 bytes 09_hw_debug_JTAG/kernel8.img | Bin 13080 -> 12968 bytes 09_hw_debug_JTAG/src/arch/aarch64/time.rs | 8 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 34 +++----- 10_privilege_level/kernel | Bin 93888 -> 93768 bytes 10_privilege_level/kernel8.img | Bin 15672 -> 15544 bytes 10_privilege_level/src/arch/aarch64/time.rs | 8 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 34 +++----- 11_virtual_memory/kernel | Bin 147048 -> 147048 bytes 11_virtual_memory/kernel8.img | Bin 65560 -> 65560 bytes 11_virtual_memory/src/arch/aarch64/time.rs | 8 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 34 +++----- X1_JTAG_boot/jtag_boot_rpi3.img | Bin 8936 -> 8064 bytes X1_JTAG_boot/jtag_boot_rpi4.img | Bin 8936 -> 8048 bytes X1_JTAG_boot/src/arch/aarch64/sync.rs | 8 ++ X1_JTAG_boot/src/arch/aarch64/time.rs | 16 ++-- X1_JTAG_boot/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 79 ++++++++---------- X1_JTAG_boot/src/bsp/rpi.rs | 13 +++ X1_JTAG_boot/src/main.rs | 6 +- X1_JTAG_boot/src/panic_wait.rs | 24 +++++- X1_JTAG_boot/src/print.rs | 22 +++-- 35 files changed, 191 insertions(+), 249 deletions(-) diff --git a/06_drivers_gpio_uart/README.md b/06_drivers_gpio_uart/README.md index 6ffbab76..404efd05 100644 --- a/06_drivers_gpio_uart/README.md +++ b/06_drivers_gpio_uart/README.md @@ -275,7 +275,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_gpio.rs 06_drivers_gpio_uar diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -0,0 +1,315 @@ +@@ -0,0 +1,307 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2018-2019 Andre Richter @@ -460,12 +460,8 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + + /// Send a character. + fn write_char(&mut self, c: char) { -+ // Wait until we can send. -+ loop { -+ if !self.FR.is_set(FR::TXFF) { -+ break; -+ } -+ ++ // Spin while TX FIFO full is set, waiting for an empty slot. ++ while self.FR.matches_all(FR::TXFF::SET) { + arch::nop(); + } + @@ -563,12 +559,8 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + fn read_char(&self) -> char { + let mut r = &self.inner; + r.lock(|inner| { -+ // Wait until buffer is filled. -+ loop { -+ if !inner.FR.is_set(FR::RXFE) { -+ break; -+ } -+ ++ // Spin while RX FIFO empty is set. ++ while inner.FR.matches_all(FR::RXFE::SET) { + arch::nop(); + } + diff --git a/06_drivers_gpio_uart/kernel b/06_drivers_gpio_uart/kernel index 6731a81ed9ef320cf0e99027b0d225283f05dade..283b4321079faf9759227b19c46749f4a1e2007d 100755 GIT binary patch delta 5460 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 diff --git a/06_drivers_gpio_uart/kernel8.img b/06_drivers_gpio_uart/kernel8.img index 92f3154c8dd3743136467635597a1267c39b3ed1..5ebcde96109da459ad574d793731c7cc678289f9 100755 GIT binary patch delta 1974 zcmah}ZD>MviSZre(TwJZ!* ziOO)UR(f`nec-UwKi*bHrTU``wpRB;VIK;c`?ImM;z;cjHik58n!V@Vnr z&Wzcl5Ty7sl{9l4=xmiyk#H|{RnmM)RI;^#l3hz^w$`BhY}8!eqQ5kD9$ufbl*cEO zd`-kc;uCTO*ketQtS)bVdrdx{;Gu7kbf-L3OPv6N*LQnq31WvXL@AFqTLns11j>1S zUk#OqtJpyzyN3jf@d7k)Jc#+pN2^sna#&s{XWx+Gt%IDi2%31FfKx^uq@z?CSeKhE zfgF(7y}gJn#kiRhg5p9Bk9n`MlIF0+`HMie-LIzEyg}K3Jnp+zs95?I`W>=Bg!|o& zct$K4k%rk0!7CsmCHTENkdZM#WUncn}a#ci}UHvpGXtFAie&BsN85wX+t{TNG>d1UEYU6hq zH7_T-021r)46m*j;<*9L`U+;_*MD-7`#zXbHO6YM=Uu&3S? zlN$v{@PODHi8@Do)fKdT>vV-vQ)2R>ZbL~EwP-tlHlE~T(Hoi;rICUU2?L$Bxx#be z;t)^J|93ut4e5BK^E7`cF?r!>J~3c(AaRjOoX)A;?3hF1Da+!mm+M^Neo~~`2-*a_ zx+1Ku2dle`)$POT7WPjX)H_?)qkRnTNHWB85)t|(1LP*fo%i^i`AsM}WNO%`sjYfC zN@bieROSY%$oom%zX$UiyNQ3<9%eI_mK+AP1=?I66FmcnjZuA+ z{Jt>z!dm~_;Yjgg>+vvshlT06t@3!oq8mbJauuz@e~v$jyf*N)Q15elyuUHH6Q*su zn#bKs+KF&A%wD&BDh%^w`FPN7GYV5-7A^fvNVl-6vR=EtlFs1|GmB3mms}=McCqZm zCBrSK>6c2zOq2|oDSJ>BtxT8UYk~t?QXPl-x*Oi;+Sgm(cSzk|Dr0Ts_4YeDZHZ3H zl(A#wfmW$pJB^a7!>5jVU!#tjbi7&LV=d~y<1^&}`(7Q!J}rlsFsfM$Yu7)t2`ybY(J$=1!J z7A3f>z|;5a_OcUX3+t%(o_Lwx^HIlGg~m9dr}c^fAc)`p#djlaLwsFd-@!gyzt%O; Zk1c4`!z|vI{e6$-)u)>;dDu2@;9oZL0geCw delta 2110 zcmah~Z){Ul6hH61{&_7^wsr0L+R;CGY)yUp0s!?Nwv!m!?#!^Y2RGuB|eC> z#*GGrLy8wlNc=q@Gt2dgh-$K_>^AMitOvDETT>}fj0LiwJHw8~Q}i4|aAtlLX0Xghqp zp0M+0mV=TIfH0mnC=)qWLOVFwd6kF3_)_pQdpX7{50_^6$f1Ao61~FZw0*@mFMyxL z4LD@v!B9OBCpV>LERX^&aAyzNYxA~I}n^oV| zjl8?a0}euqeK4$D!?HJIXIdE}a;G*lma_U=5 zY6p&lV2zrr6E*9xESkCGIwvOD&j(X>4CESbn~j?xw3xG(Pgc(hVl+?zy&ys;(6q6) z3m~*j6)1e0ZDuMsFuVHzgB^lae`uF9r+xpVLk(;LXPfQhA@rpoxPHtG#B7E9atqdH zSmKKhdB(6e&T zl9e!71(OZDz9`#5%r>hABMdVF;-2|*rVdhg&;3}RB4;_(Z-CU}V;hzEwkEu)MkUqL zpez_SB`1WAJFIiOcvS#CT487`<~9%+M}QM&ucPv;d^79!A<1kvu-P|JVkop6!2>6B za1j{;X2bDT`D-uz&QQvFWZF>6cdevuqm`?seq%Yabr?6SomxQ>Wr8BI$_VR~dpCe! zB@71tPOoKQWGb?=Laj*83c~OY>7=pH^gw_DfM6;~=ZppN*yfZ^9~^(fT2STF!}!ho zNUIrb9UsHEtcN+)1u+cMJVq-;ryCLX85qyz+J`*~ovR32$MFJar|9Qi8~sGw%JBzR z(P>kuZ_Y!OU^qEASQ|WS0DX0ah>@XO4km%a7WX%iU~FMgKGo$BrvHE)aYT8|mFJcn=B*4firyAB`h-hJrMQO~P; zJylx)-V#-Z*FC6#o#^=Lzj|1@d#<>Sm8-UG1hn Hx=Q~AE1@>w diff --git a/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 812eb73c..ef442cee 100644 --- a/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -285,12 +281,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index a291976b..b0b32903 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -162,26 +162,24 @@ diff -uNr 06_drivers_gpio_uart/src/arch/aarch64.rs 07_uart_chainloader/src/arch/ diff -uNr 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -279,6 +279,18 @@ +@@ -275,6 +275,16 @@ let mut r = &self.inner; r.lock(|inner| fmt::Write::write_fmt(inner, args)) } + + fn flush(&self) { + let mut r = &self.inner; -+ // Spin until the TX FIFO empty flag is set. -+ r.lock(|inner| loop { -+ if inner.FR.is_set(FR::TXFE) { -+ break; ++ // Spin until TX FIFO empty is set. ++ r.lock(|inner| { ++ while !inner.FR.matches_all(FR::TXFE::SET) { ++ arch::nop(); + } -+ -+ arch::nop(); + }); + } } impl interface::console::Read for PL011Uart { -@@ -295,14 +307,19 @@ +@@ -287,14 +297,17 @@ } // Read one character. @@ -195,12 +193,10 @@ diff -uNr 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 07_uart_ - ret = '\n' + fn clear(&self) { + let mut r = &self.inner; -+ r.lock(|inner| loop { -+ // Read from the RX FIFO until the empty bit is '1'. -+ if !inner.FR.is_set(FR::RXFE) { ++ r.lock(|inner| { ++ // Read from the RX FIFO until it is indicating empty. ++ while !inner.FR.matches_all(FR::RXFE::SET) { + inner.DR.get(); -+ } else { -+ break; } - - ret diff --git a/07_uart_chainloader/kernel b/07_uart_chainloader/kernel index 185f5303977c35679bd4a2769cabc44143d4c4e6..7f9b425105318440bdcb2425a4779cc565771180 100755 GIT binary patch delta 7033 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 ADgXcg delta 7323 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 xU51Yo(Ej4my`2`#7Jc^X>ou delta 2856 zcmai0TWl298UD}A&U$uiF7|rY_S$>1!FX+mf{ZZ+3-4mWtss!SiE@#OE&4!$L`o7= zA-7#GEv;4e!AE0SwW?H;yf7OcESW+!L176m?M zq@@B+Jc$nhp9xS;y|h1l`Y}GKG?}Xvy>}3tT%&Dc_69=?XL>klF|`kQ%UF2+2t&Ti z5^?Ua;gef2Oh*ZjHOe(?VF!b^I$}rt!(<04OE%5O=C(Mam ziK5;V&-#K@!>wr1RfUd?5+%bC^=7eDYIua#x`qQ1KL=ds!z`W^9Kn6W^J&AYB`;Ab z*}Rj8&&Mb$IjO84q$-eZ!P&@D&MJsmA9xR#6V%hZS7Fri*l5;=0KfhpTpt1zN&3NA zU@6D(xO6O{Drf4K#0C&=!B`0aejl$v@*2Ur2_7o`9o|tTUK9-!or$I0_E2LGd4A0x z@!Oc_MqvaKP^hNj0;buX>XggMpfWRN)YX>qGEc@-Xw#A!&iL8PkO=j%o4CluMO0r| zcoE9GGL&-RONw_lEuQygwwGCU7WX zbn?$3=x|JI;4`tj0A^JIzSqr1weg`NaotX(U|QN8e^R4qk!}7CiIwBGRpMI|^KEx~ z>i(+c<)vZOx~Ed6Fy^ufs*))lVb(XVDAws3y11mW%x3aVUPeSO;+|K18ILcwr7uWz zd)e~lW@I~of;OV#R~7$a-k@Y9=T&97cS+SV16_22bV?2k?mQvJ_<&QT)J^fSC|dv{ z)rvA5M#tU!jEqKdi{M zK`c!L;g%o(k1UlQZ@nAUV&2IKHx&zGJFTVRL9}XzRXmcg?pHmxoKp{fCT1auR?#oJ z%^&D}se7wJ%Y`w9)>1|%r`q*6Ro;jFKVy&5a^H@^x7fGBSi-tjwZpb0?CF>su`l|` zL@{OdlfBV{#*BX-vBG;qKgP=%5a|^ zijA%}8$9g_J|6>~t&M39PHoi^$MM3T^ToP-o%lwRdpZQ?1JCwN2@juNr&?m~=Tn*` z@H&iR{M*u|N6Yo2P0n)Vuw1}@ZEi3cc7Lf7J}dF!*XXe*SGi=9E}VmjM6pwgXJ7Nx zcXw)({kU#?$bjzfS<1#V`j422YbYCZ=A;o=1t|On$_f*CjGTGF*q{V=&;7&L$CN8Q z=DM2p&O{flMuTf`W2I;BBA;WmUHrGvK7IiC&9Bq!uWxjGoB5NPXDZ(=toWC4XB!_Y zY~z2r-ZQtjGN-Jcr3m9~IM>QeqjAQ=kL4*$?i4-S&v)du&wXBtFlzhFtKPNd9`8wo z_0L`PZq}4&zxhq$KV7rYJTq@K9k1ih@I@76#yH4g{Y`)5V{V@yGvKeX~y z%n}oEcJ5r@C|hx8|Fau6K0o@#Te}bKJ!mFcy5zn37gY{9vLgxE zJRSU%ax`Qbp-+_Fu=)4U?*cc%4(XI+y?_(B1HW&C&EJGWfqdXe8>pgvO;np7g}0|> zA`Tpp>YSA8q&(B?;5a|*>ynhw6#MGK-xav8NqxJcrmvooSF|{G%6PXUr>LxWNfOHO zy)0#EkDkV7B;Ftim!*sj+E-S}q7>pvYEA&yD*JMtDFAKBhfDfdBYCT(xiY_B U^7hN;e5+%x{3Me0+nncr0dF=O{Qv*} diff --git a/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 27e6deca..baae8c24 100644 --- a/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -282,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -297,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -313,12 +303,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/08_timestamps/README.md b/08_timestamps/README.md index 27b84193..b0bb3986 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -100,7 +100,7 @@ diff -uNr 07_uart_chainloader/Makefile 08_timestamps/Makefile diff -uNr 07_uart_chainloader/src/arch/aarch64/time.rs 08_timestamps/src/arch/aarch64/time.rs --- 07_uart_chainloader/src/arch/aarch64/time.rs +++ 08_timestamps/src/arch/aarch64/time.rs -@@ -0,0 +1,85 @@ +@@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2018-2019 Andre Richter @@ -175,12 +175,8 @@ diff -uNr 07_uart_chainloader/src/arch/aarch64/time.rs 08_timestamps/src/arch/aa + // Kick off the counting. // Disable timer interrupt. + CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); + -+ loop { -+ // ISTATUS will be '1' when cval ticks have passed. Busy-check it. -+ if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { -+ break; -+ } -+ } ++ // ISTATUS will be '1' when cval ticks have passed. Busy-check it. ++ while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} + + // Disable counting again. + CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); @@ -239,7 +235,7 @@ diff -uNr 07_uart_chainloader/src/arch/aarch64.rs 08_timestamps/src/arch/aarch64 diff -uNr 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -307,7 +307,14 @@ +@@ -297,7 +297,14 @@ } // Read one character. diff --git a/08_timestamps/kernel b/08_timestamps/kernel index e310920d7a73a3c25c0d2640e688e01dc2740142..4dde0f89e0cf13e59b63c2756080a7326fbb2e5d 100755 GIT binary patch delta 7395 zcmb7JeNa@_*+0*{yKr|wWDyi33X31?E(*&6yL_0ipsAoqCnA~BBqI>>W#G+-H6J!% zc5Rb14VrTO=rNK`MAOFA7|CdcV46lkGoy7H@m2Gh+IO6 zZS#kBW;uI)&vTyd^PF>+T}RDhADO!y(%3_)%j@a(5bY5oA)w9K-vs=0d-Qp?N8x<$ zZFx18-6fH2xg_^YY_W98LdckvkYQ(yRb4hxx!nh|6I$`>#;WZP!uJ-fC{tY|*bq)k z2%)H9`>u2~{8OSv=a@q%a#*patFeF_iWEqp$YM|<1*XtSMVJ1}_Wy;4q~1ze1u%d5 z7K?gy52(u~mY+^X!|HmcXK!mLqt7Bu`b4I0;>h$Wtr_$Lz)b7z>1t#SQSE*oy$Uc( z`r1TOBnU{Vh5kZoMtkSZ7mk!!(tj9k#qKuU6u5r89bgj4)r=3 zwG$0^9zQqGfNixt_5IzIEK5BRS#dGvl9+=m9T?)}3E+}2oX;jeZ8C=Q(p3nJVi=Fn zPZMClgT$rUZ#Rx*In*R?rFny)UANI3QE*XNMQMW^&=}QYBh|-e_=IIm5FtyuV7_G z58^I6NCrl+>RQm@T?#3?xzayQ*D8=1*sYL8wu_@Ea@mMW9eo?CDO`2di657RlsY?= zo>AHALX*a@j{6Rvo154cvixD^THG5fG54X{SJ3n;SbasfSK2T%U!hAVxBJQ=DYOiG zLFCs;b`-<%71n$ky3~fQpv!^bDV=>i(L-|RGMa5cKM$ZgO6UHbcRN#it`?E;%ll1i z0}Y=*d>q0e(p@zpve;hR_)TM}O)F7@wb`X>u`TO+X6BNMy-_C{3UXO zVMDQ4V>|7%!o`dMGug(fB>WexyQvpsqW+3*NP_%8Z4x=`AW~NdFpK!PEW^Id8Ar?a z&mw6H;f8lQA?Z&78K@@8rLcuG-b%j$H+&;<^1gtRbOaMgW1wb9M=M%#H?GOamCq&< z|M=!C|GpJ{BQj|$Kw2Bpn2}#$ct&JppOB%TqStIQOD@SNE@q(pAF;-1 z$ajVF>GA?{$L@((<7QhrGEUJLN5*3;mg$#}ag!xwy*dRCF+7N7q(Eh+y%JAHIpko)yI4Od zFANd&8@eV19E@vg3fvXwtxzNRa!5gyk$^eGIL-mt=Ktp{Wj(iCZ*$>t+!{o^7wPQO zX4Z(>>oNr!EcG?xF0+5&$&B<8mzfM4PYX6!5o_K~2ApPcjrl)_^~bOzvZH~~Gnc;} zPgIbYgBV>q6>6lsMg51S!ab1OHy4zyyFoco+fq%FY|v!tQ=&`zAGd)Yi6*di%>%1O zJd_4=b>jK7e~Uwgh$4#%lFm3|1uHtX(1OVW7{Z!-DS= zc0B{WvM!d?=T}PV8$+r6m!`ufk}H^~&f(V@wpmFyQO&t!u5J2mNv+K__y128ECZ=S zq913&JX)6xPfM**KTf=6X`@8H$%Vg3euaK%ho{o82VRmfi+HcWjQ2SQEwnigJgKb; z=I?i*a3X}lNI%)%n+N?8ZJ7s|(%4-3<9RR}GU@B{ps2<_54!|DcywvcVm`+pXwMQp z=Tjo)cm!!rL%+=lQ-NmYgS+;2h3%cME6?M?KATTp&4>BLw=2g%NAlsz6}P+0@6grj ze+jAMb4eig&b79-LBKoi!UIs#=Za68Obkifn@Jnc+D?Dgw3ti)ZoSD10+hUQ3`k7R^ z+XHvm%K1wO*Fl=-H4ikSqbo{aMqsaD7tGPbNJJE{km}_4XS}clUc~Wp2Am!Fgh<4Z zFMQVkQpIt`n3f7AYAZz>MfK_u2wBO=V{_wWH*x$vUhRT^703Gw_#;A& zGhWV<99Q(ZrEiy_jfx>qPjjYBdJ1jKau~<~PWDqML$YW-8j62@&dEz?F_NKy)|X*z zUdLW1NkHZj-Jsud_8i)aTy`H`BSDggFhx|?297)E7iCaXFSei1g|9RCNR!)6;3Cyu z=xz#_h*T?dg%?e4Du|Dc$ZQkch~%2!f_QR`CPyMi4ftA)*BP`uO*dlv=$IE2XV5?s zLEL4)U!;SmI!^@gV*~j$uIf`4eZU9vSNs^yKNePhqHgLKZ-ejSnaJYV!q;c=5PZ#X zp;q8Q>;{ZKNKg5oDC-Y~l0T#^2jZr-N|;eBdI1+o-o(|+3ehV>_6nzR>u75^EX}I3 z#>caRlk4apk|9XnL)Qa+3*))Aa@{W&R=cqqNZ8{9ZsOK_$V(>3KJbS#`WQb9rQo*0q53Zj4>l4g>iO zPEMsAjGW8cs960Q?q!hnGP3CSV*8X}zF83P)IxHrI2c4)zvN`0^f^r#A=NzH!c8|< zHw`n#5-FOwNaO*I=hFHrXs&NG7`a1R4&(^~{#c?ePVnRPS9@Nu>G%`$S``$5h1wUP zZ{_@8;!H%eA#CT2{DgrlcF=QlBO||TAd4OJ3bkWu{_SiOCaY_&K#MG>{6=@zc1 zwmabm)*{?yY`x(&FVjgZf#_g?zD9hVYAKm(k#(nq6>KA4c^drVr_K#E(ZW-muxQNFP?{!=u^| z*kES%OT;KP!11sl&M$GCxZ~~a;`nn0T-9(O=cdK;Q^c{`(u;nu{jwITzT2=+T#$Ac zaB?upMA<&1~(omb|aw1`D z(=%LjIe|a(9r$^Ui!OeQC%(#}%Mn{+2mi(6VI2=lwij_kZRZO_s@!^T$R`}ndm zah&k?q`92`U5<-pP|6}P4?jOdO-zv3^^15ly~6P`_I_&}95m4__d;5K^d4BPOsgoZ zD6c3jEpfZO9Dl} delta 7673 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 diff --git a/08_timestamps/kernel8.img b/08_timestamps/kernel8.img index 058dc35cb0537b6eeae889d2d0496cd7ab803354..5a64a7b80d0482a04fdad2c87cf6505d3e887b8b 100755 GIT binary patch delta 3134 zcmb7GeQZI(0sXfy4<(`~gXDN|Gj&IH4a9s5FfKKw=U}(TdU_M36St zG0SFMD~*JX+na3#cPa_0#!FyCG6;pKDNg3nqXGN2`goPd2fJ<%UlD zI@rv%zqEGC8s>zcH)1rX1Z`}`EiCdTuvocXl~I;$7M2J|YScy5=z7AUE}gnnPWk>B z``3@@Kof5!l?CrAZ2kmc?TedkSOAV}7$~szd)M&&q>^5e_y?p?gp@n;`BhSE8Z2PZ za$q)31D_|$=r=l^O#_rE{I|5sG$t{JzrZS#f1%6i>b3k1EjDyoS$n66e@mB;vpio~ z;bsc!zVI8bUAcTLCQ-I2b8ufWe@_F8j1y*3ZXJuAm(?tQkr*a+dQ9TolCyv;V~)kw zZn*pzq1p4GW+F9x=yzDEEF#NUbUTbj%PE^aL)2I|exIRgfXAdp>M`+hU45YI<#^PU z>F6LWw~*11=uU);nZ({CY$?k5$k_W_VdvUxEIJITuxUp?QBGLIXjGS>US#>vco~Zg zV~lZRbQqaEK?EBtf=FUFbgHOW^q!<%#>zO5xGBu(zb9ms-_}{kIzFdsq_3KImAV8J!OLI}~UDOlVRn8G_?Y{42fNU2bRhFrQ->`vBe#Fm``i z13Nd^BnlIXO0rYn$`IH@6_D9Y1}8-p_Z!+Wk;R#LqD~`wm-#1#mD|C|Y*NtM7Id;9 zL#lB^LI7c_Lb9BFBF!G~KMIdnQ6&lRxO4#~#|V^W?r+e`cr~=kZ!u z-%RRQAC8Nn9{R{6I+#VU&8Kz(lNa~hn8Rj@ox!Da21ci`(K-d}t zPzIk^r!jQcKIvrBf5HxmG~aaK?Ns1dhhGj&OC~2Kw1AB}avDMQiRGgF?bu#i3!)-F zLeO)V_#Adz4X%xDB<3yxLcd4m!c=X?^&b6Dw#JZ@yV&L32&fx@AmG46mVYD^3rp%O zX00H~(}+g)4~PEj&kfDjKzw#sCsxeFRU99}B)iTj);`mUa}|pr6H%9}#$1ZJRG`0~c=o$q$a$<8PEf`;Q%W6+-=pDvVvU&bWOq2( zfAsvHN_}TEQCM%EYQ8DIQIcn$vfdQbV#BbD(vDkV+CfYP?AD|lkxHCm91~p-Eh7(@ zm;>(?BF|g`@Fm+w$Zx>|F*cq^_;z!@>8t!vJ@ktPiF}#d!`PGr?2r77jH*Ce2As76 z?Ntd@5bs%u3?0tD*f_il@>Y=t^#uTy*9nZafIJgX!1uU*jy!0Xlro0`4(JIQ!53(K zp{En`coFB6lu9=do7^E_vhfxVLtdArS! z7w}6x8!7liz~lH{W$`qgM%~}@i|YboQqKuZ2NL*PsOv_ZNb)X{GbzbKX&*8MddFN` zHzQ>`MS`|(6TWBAZcejH`3p!rgNq5@VY3Advyz6B@q}Q~GJ}SFO7_-MtBUJ-Nk&pf zP=|#~qRT*ZyAjEGBitWcZcWF|dZuXH`->ZVI!Tifm1I^hv5+ zbnW`oF*r32>^|?xwhJ4cy)H2D9E(;-s*KU10lg~pw+Zxn{`XinuV_r|Y>`G>5x`zS zy*Q3VCh4Z@)djuE#@4t~?-_kP-%{t)!|0W~px1O>G((uRDdObZz`Tf#=Q;*EQuMwVHpA_8!sf(#X-cxg}Os+|dHN2o@34)3?XLPi DAWD(3 delta 3265 zcmb7GdrVZ>89(RTdE9$vkmn4KQHKF}%nXWv@(^4G*llHSQx_(UiA@DbcjHcK#r|Qp zl+2*rmM&O5IoMU$q_U=o7uGHY2}_M#ls0i|x;xZInl{@4Hth_k&{8U6i_`DS!$On& z!%6Pk`Of#9@BDth?>pzrrEi>j{me$wDS~=4QRdxH9hs64T9gs;S+Slv2dZebB)D1x^NLw=W4^96ok&~88Di9e^<(m<6Lq`&3=k=`I4d~mEFb}@}V^9 z&qmaOD%b+vL=x0&1M!d|9Xn03F;R&_XgC1CF1M(eTd)~#Y^K)L z*YDUnbo~#nFF+ zz!0nfNc}^gEFc8JbQ+ih?x+-AG5?aF+=9wjLAY7Kw0u!i*zZ*-ct3ljDkoWbmZ#oT zI{L+c_=3+Rfy8S7v3J$GlQ*kSZ?lBT5CEDH%!8=8iv3MpT>QXFmjF*6tlbXJ3as5r zD(L8;Dqfg=zaZK;FCFK`s{qP2Xlw*jJg%wLgNpMDSeXO$X4$Vb1qUYV)FOBrYaIpj zSDHxU@D&Ak&_o$+QF|L(z2$WF0ipH6|NJEEkIl8y(dgXJB$*N&=Np&WWrgk4mSc&% ztu62XkOe4$D1Fk$#p9ywg_hU=AQ!)l>8DVHg)xm15KvHBt-oXKxZMu~eC``1bn%*2 zu|nUT0hy>#qhhrZtp z^VoJ#U3p^%?SXOLZtq-|c?Uy55uL3=R9roF=TRY10)?=Z4x;h7CN%zCVCxmp&ZTyz z!j6h*o)aQ+@qHSAgwBBiI+q6>G+lYm3Xd$I9o7!9e@>8X0B8{!cla`p?BUx*`c2T1LhM?LOa&?fiBtzt%QES&Ptiq>+2 zmZIeDG3;&J5076k3`&NH@`_C;sUEMCnh;9qB934hM&ln7B*$W_B9VB>r< zL9R<0N5!a&sBAz<`N=4$+9R~p!#D?U0p5zyQEmlay&&S|TuTt_a6+?9 zlr}WwZ_Ox4$B`VJDpHJ;E>E*-1o$Oxlpo zV@fu> z#+$_EkZ5-F?-4%?&;^N_*Vy6nWuJ=HPHRTKmF~o(NX4#Y^brex<&1pKl&B^(Dt0>a zuLQ~LxaCL^oU!u)ln#zZDDtqiQ^%fIiW4j{RPC3_v=%G;9{BA@Mb;RBIz&EfaZ4I$ z&S7%SX57WBIfXUDIT0sZjp5Ho)CT(D&()|MHBrolOD_DmIWmwRkJ+W%?X@qODlIRv zbXGLgOL;6KFSqDL)0|^%d4GQGMQ07?M;4Ds^HJ1>LOkd71}=Wlw9PiQ%a)5jVlB36 z_#UvmQM=Q=Ug7en9aFd>YDX7FF*_kTP;Vb`+DmcKi{`n-t`vmu_t}-LsnT6b1Va~_ z+M1f!rHfcSa^$^_1-DkG`{E*23`Y##UH00xRD6pa-eykpZ;Qmls{b!`ew(>oA0HWw z&5ymyqxttl-wDyU7_(U1(df!vh6_K-`c7eFd{<@!$)4@8xR}lUQTPLVl)bh6Gg4i| roJBvuJ~mU73g5vZbB36;K0d~yDv=czzm#~XIO2|GN4HpKao&Fcg%h>= diff --git a/08_timestamps/src/arch/aarch64/time.rs b/08_timestamps/src/arch/aarch64/time.rs index bbddd5e0..a6638976 100644 --- a/08_timestamps/src/arch/aarch64/time.rs +++ b/08_timestamps/src/arch/aarch64/time.rs @@ -72,12 +72,8 @@ impl interface::time::Timer for Timer { // Kick off the counting. // Disable timer interrupt. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); - loop { - // ISTATUS will be '1' when cval ticks have passed. Busy-check it. - if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { - break; - } - } + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} // Disable counting again. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); diff --git a/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 35417674..987a55cc 100644 --- a/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -282,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -297,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -320,12 +310,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/09_hw_debug_JTAG/kernel b/09_hw_debug_JTAG/kernel index e310920d7a73a3c25c0d2640e688e01dc2740142..4dde0f89e0cf13e59b63c2756080a7326fbb2e5d 100755 GIT binary patch delta 7395 zcmb7JeNa@_*+0*{yKr|wWDyi33X31?E(*&6yL_0ipsAoqCnA~BBqI>>W#G+-H6J!% zc5Rb14VrTO=rNK`MAOFA7|CdcV46lkGoy7H@m2Gh+IO6 zZS#kBW;uI)&vTyd^PF>+T}RDhADO!y(%3_)%j@a(5bY5oA)w9K-vs=0d-Qp?N8x<$ zZFx18-6fH2xg_^YY_W98LdckvkYQ(yRb4hxx!nh|6I$`>#;WZP!uJ-fC{tY|*bq)k z2%)H9`>u2~{8OSv=a@q%a#*patFeF_iWEqp$YM|<1*XtSMVJ1}_Wy;4q~1ze1u%d5 z7K?gy52(u~mY+^X!|HmcXK!mLqt7Bu`b4I0;>h$Wtr_$Lz)b7z>1t#SQSE*oy$Uc( z`r1TOBnU{Vh5kZoMtkSZ7mk!!(tj9k#qKuU6u5r89bgj4)r=3 zwG$0^9zQqGfNixt_5IzIEK5BRS#dGvl9+=m9T?)}3E+}2oX;jeZ8C=Q(p3nJVi=Fn zPZMClgT$rUZ#Rx*In*R?rFny)UANI3QE*XNMQMW^&=}QYBh|-e_=IIm5FtyuV7_G z58^I6NCrl+>RQm@T?#3?xzayQ*D8=1*sYL8wu_@Ea@mMW9eo?CDO`2di657RlsY?= zo>AHALX*a@j{6Rvo154cvixD^THG5fG54X{SJ3n;SbasfSK2T%U!hAVxBJQ=DYOiG zLFCs;b`-<%71n$ky3~fQpv!^bDV=>i(L-|RGMa5cKM$ZgO6UHbcRN#it`?E;%ll1i z0}Y=*d>q0e(p@zpve;hR_)TM}O)F7@wb`X>u`TO+X6BNMy-_C{3UXO zVMDQ4V>|7%!o`dMGug(fB>WexyQvpsqW+3*NP_%8Z4x=`AW~NdFpK!PEW^Id8Ar?a z&mw6H;f8lQA?Z&78K@@8rLcuG-b%j$H+&;<^1gtRbOaMgW1wb9M=M%#H?GOamCq&< z|M=!C|GpJ{BQj|$Kw2Bpn2}#$ct&JppOB%TqStIQOD@SNE@q(pAF;-1 z$ajVF>GA?{$L@((<7QhrGEUJLN5*3;mg$#}ag!xwy*dRCF+7N7q(Eh+y%JAHIpko)yI4Od zFANd&8@eV19E@vg3fvXwtxzNRa!5gyk$^eGIL-mt=Ktp{Wj(iCZ*$>t+!{o^7wPQO zX4Z(>>oNr!EcG?xF0+5&$&B<8mzfM4PYX6!5o_K~2ApPcjrl)_^~bOzvZH~~Gnc;} zPgIbYgBV>q6>6lsMg51S!ab1OHy4zyyFoco+fq%FY|v!tQ=&`zAGd)Yi6*di%>%1O zJd_4=b>jK7e~Uwgh$4#%lFm3|1uHtX(1OVW7{Z!-DS= zc0B{WvM!d?=T}PV8$+r6m!`ufk}H^~&f(V@wpmFyQO&t!u5J2mNv+K__y128ECZ=S zq913&JX)6xPfM**KTf=6X`@8H$%Vg3euaK%ho{o82VRmfi+HcWjQ2SQEwnigJgKb; z=I?i*a3X}lNI%)%n+N?8ZJ7s|(%4-3<9RR}GU@B{ps2<_54!|DcywvcVm`+pXwMQp z=Tjo)cm!!rL%+=lQ-NmYgS+;2h3%cME6?M?KATTp&4>BLw=2g%NAlsz6}P+0@6grj ze+jAMb4eig&b79-LBKoi!UIs#=Za68Obkifn@Jnc+D?Dgw3ti)ZoSD10+hUQ3`k7R^ z+XHvm%K1wO*Fl=-H4ikSqbo{aMqsaD7tGPbNJJE{km}_4XS}clUc~Wp2Am!Fgh<4Z zFMQVkQpIt`n3f7AYAZz>MfK_u2wBO=V{_wWH*x$vUhRT^703Gw_#;A& zGhWV<99Q(ZrEiy_jfx>qPjjYBdJ1jKau~<~PWDqML$YW-8j62@&dEz?F_NKy)|X*z zUdLW1NkHZj-Jsud_8i)aTy`H`BSDggFhx|?297)E7iCaXFSei1g|9RCNR!)6;3Cyu z=xz#_h*T?dg%?e4Du|Dc$ZQkch~%2!f_QR`CPyMi4ftA)*BP`uO*dlv=$IE2XV5?s zLEL4)U!;SmI!^@gV*~j$uIf`4eZU9vSNs^yKNePhqHgLKZ-ejSnaJYV!q;c=5PZ#X zp;q8Q>;{ZKNKg5oDC-Y~l0T#^2jZr-N|;eBdI1+o-o(|+3ehV>_6nzR>u75^EX}I3 z#>caRlk4apk|9XnL)Qa+3*))Aa@{W&R=cqqNZ8{9ZsOK_$V(>3KJbS#`WQb9rQo*0q53Zj4>l4g>iO zPEMsAjGW8cs960Q?q!hnGP3CSV*8X}zF83P)IxHrI2c4)zvN`0^f^r#A=NzH!c8|< zHw`n#5-FOwNaO*I=hFHrXs&NG7`a1R4&(^~{#c?ePVnRPS9@Nu>G%`$S``$5h1wUP zZ{_@8;!H%eA#CT2{DgrlcF=QlBO||TAd4OJ3bkWu{_SiOCaY_&K#MG>{6=@zc1 zwmabm)*{?yY`x(&FVjgZf#_g?zD9hVYAKm(k#(nq6>KA4c^drVr_K#E(ZW-muxQNFP?{!=u^| z*kES%OT;KP!11sl&M$GCxZ~~a;`nn0T-9(O=cdK;Q^c{`(u;nu{jwITzT2=+T#$Ac zaB?upMA<&1~(omb|aw1`D z(=%LjIe|a(9r$^Ui!OeQC%(#}%Mn{+2mi(6VI2=lwij_kZRZO_s@!^T$R`}ndm zah&k?q`92`U5<-pP|6}P4?jOdO-zv3^^15ly~6P`_I_&}95m4__d;5K^d4BPOsgoZ zD6c3jEpfZO9Dl} delta 7673 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 diff --git a/09_hw_debug_JTAG/kernel8.img b/09_hw_debug_JTAG/kernel8.img index 058dc35cb0537b6eeae889d2d0496cd7ab803354..5a64a7b80d0482a04fdad2c87cf6505d3e887b8b 100755 GIT binary patch delta 3134 zcmb7GeQZI(0sXfy4<(`~gXDN|Gj&IH4a9s5FfKKw=U}(TdU_M36St zG0SFMD~*JX+na3#cPa_0#!FyCG6;pKDNg3nqXGN2`goPd2fJ<%UlD zI@rv%zqEGC8s>zcH)1rX1Z`}`EiCdTuvocXl~I;$7M2J|YScy5=z7AUE}gnnPWk>B z``3@@Kof5!l?CrAZ2kmc?TedkSOAV}7$~szd)M&&q>^5e_y?p?gp@n;`BhSE8Z2PZ za$q)31D_|$=r=l^O#_rE{I|5sG$t{JzrZS#f1%6i>b3k1EjDyoS$n66e@mB;vpio~ z;bsc!zVI8bUAcTLCQ-I2b8ufWe@_F8j1y*3ZXJuAm(?tQkr*a+dQ9TolCyv;V~)kw zZn*pzq1p4GW+F9x=yzDEEF#NUbUTbj%PE^aL)2I|exIRgfXAdp>M`+hU45YI<#^PU z>F6LWw~*11=uU);nZ({CY$?k5$k_W_VdvUxEIJITuxUp?QBGLIXjGS>US#>vco~Zg zV~lZRbQqaEK?EBtf=FUFbgHOW^q!<%#>zO5xGBu(zb9ms-_}{kIzFdsq_3KImAV8J!OLI}~UDOlVRn8G_?Y{42fNU2bRhFrQ->`vBe#Fm``i z13Nd^BnlIXO0rYn$`IH@6_D9Y1}8-p_Z!+Wk;R#LqD~`wm-#1#mD|C|Y*NtM7Id;9 zL#lB^LI7c_Lb9BFBF!G~KMIdnQ6&lRxO4#~#|V^W?r+e`cr~=kZ!u z-%RRQAC8Nn9{R{6I+#VU&8Kz(lNa~hn8Rj@ox!Da21ci`(K-d}t zPzIk^r!jQcKIvrBf5HxmG~aaK?Ns1dhhGj&OC~2Kw1AB}avDMQiRGgF?bu#i3!)-F zLeO)V_#Adz4X%xDB<3yxLcd4m!c=X?^&b6Dw#JZ@yV&L32&fx@AmG46mVYD^3rp%O zX00H~(}+g)4~PEj&kfDjKzw#sCsxeFRU99}B)iTj);`mUa}|pr6H%9}#$1ZJRG`0~c=o$q$a$<8PEf`;Q%W6+-=pDvVvU&bWOq2( zfAsvHN_}TEQCM%EYQ8DIQIcn$vfdQbV#BbD(vDkV+CfYP?AD|lkxHCm91~p-Eh7(@ zm;>(?BF|g`@Fm+w$Zx>|F*cq^_;z!@>8t!vJ@ktPiF}#d!`PGr?2r77jH*Ce2As76 z?Ntd@5bs%u3?0tD*f_il@>Y=t^#uTy*9nZafIJgX!1uU*jy!0Xlro0`4(JIQ!53(K zp{En`coFB6lu9=do7^E_vhfxVLtdArS! z7w}6x8!7liz~lH{W$`qgM%~}@i|YboQqKuZ2NL*PsOv_ZNb)X{GbzbKX&*8MddFN` zHzQ>`MS`|(6TWBAZcejH`3p!rgNq5@VY3Advyz6B@q}Q~GJ}SFO7_-MtBUJ-Nk&pf zP=|#~qRT*ZyAjEGBitWcZcWF|dZuXH`->ZVI!Tifm1I^hv5+ zbnW`oF*r32>^|?xwhJ4cy)H2D9E(;-s*KU10lg~pw+Zxn{`XinuV_r|Y>`G>5x`zS zy*Q3VCh4Z@)djuE#@4t~?-_kP-%{t)!|0W~px1O>G((uRDdObZz`Tf#=Q;*EQuMwVHpA_8!sf(#X-cxg}Os+|dHN2o@34)3?XLPi DAWD(3 delta 3265 zcmb7GdrVZ>89(RTdE9$vkmn4KQHKF}%nXWv@(^4G*llHSQx_(UiA@DbcjHcK#r|Qp zl+2*rmM&O5IoMU$q_U=o7uGHY2}_M#ls0i|x;xZInl{@4Hth_k&{8U6i_`DS!$On& z!%6Pk`Of#9@BDth?>pzrrEi>j{me$wDS~=4QRdxH9hs64T9gs;S+Slv2dZebB)D1x^NLw=W4^96ok&~88Di9e^<(m<6Lq`&3=k=`I4d~mEFb}@}V^9 z&qmaOD%b+vL=x0&1M!d|9Xn03F;R&_XgC1CF1M(eTd)~#Y^K)L z*YDUnbo~#nFF+ zz!0nfNc}^gEFc8JbQ+ih?x+-AG5?aF+=9wjLAY7Kw0u!i*zZ*-ct3ljDkoWbmZ#oT zI{L+c_=3+Rfy8S7v3J$GlQ*kSZ?lBT5CEDH%!8=8iv3MpT>QXFmjF*6tlbXJ3as5r zD(L8;Dqfg=zaZK;FCFK`s{qP2Xlw*jJg%wLgNpMDSeXO$X4$Vb1qUYV)FOBrYaIpj zSDHxU@D&Ak&_o$+QF|L(z2$WF0ipH6|NJEEkIl8y(dgXJB$*N&=Np&WWrgk4mSc&% ztu62XkOe4$D1Fk$#p9ywg_hU=AQ!)l>8DVHg)xm15KvHBt-oXKxZMu~eC``1bn%*2 zu|nUT0hy>#qhhrZtp z^VoJ#U3p^%?SXOLZtq-|c?Uy55uL3=R9roF=TRY10)?=Z4x;h7CN%zCVCxmp&ZTyz z!j6h*o)aQ+@qHSAgwBBiI+q6>G+lYm3Xd$I9o7!9e@>8X0B8{!cla`p?BUx*`c2T1LhM?LOa&?fiBtzt%QES&Ptiq>+2 zmZIeDG3;&J5076k3`&NH@`_C;sUEMCnh;9qB934hM&ln7B*$W_B9VB>r< zL9R<0N5!a&sBAz<`N=4$+9R~p!#D?U0p5zyQEmlay&&S|TuTt_a6+?9 zlr}WwZ_Ox4$B`VJDpHJ;E>E*-1o$Oxlpo zV@fu> z#+$_EkZ5-F?-4%?&;^N_*Vy6nWuJ=HPHRTKmF~o(NX4#Y^brex<&1pKl&B^(Dt0>a zuLQ~LxaCL^oU!u)ln#zZDDtqiQ^%fIiW4j{RPC3_v=%G;9{BA@Mb;RBIz&EfaZ4I$ z&S7%SX57WBIfXUDIT0sZjp5Ho)CT(D&()|MHBrolOD_DmIWmwRkJ+W%?X@qODlIRv zbXGLgOL;6KFSqDL)0|^%d4GQGMQ07?M;4Ds^HJ1>LOkd71}=Wlw9PiQ%a)5jVlB36 z_#UvmQM=Q=Ug7en9aFd>YDX7FF*_kTP;Vb`+DmcKi{`n-t`vmu_t}-LsnT6b1Va~_ z+M1f!rHfcSa^$^_1-DkG`{E*23`Y##UH00xRD6pa-eykpZ;Qmls{b!`ew(>oA0HWw z&5ymyqxttl-wDyU7_(U1(df!vh6_K-`c7eFd{<@!$)4@8xR}lUQTPLVl)bh6Gg4i| roJBvuJ~mU73g5vZbB36;K0d~yDv=czzm#~XIO2|GN4HpKao&Fcg%h>= diff --git a/09_hw_debug_JTAG/src/arch/aarch64/time.rs b/09_hw_debug_JTAG/src/arch/aarch64/time.rs index bbddd5e0..a6638976 100644 --- a/09_hw_debug_JTAG/src/arch/aarch64/time.rs +++ b/09_hw_debug_JTAG/src/arch/aarch64/time.rs @@ -72,12 +72,8 @@ impl interface::time::Timer for Timer { // Kick off the counting. // Disable timer interrupt. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); - loop { - // ISTATUS will be '1' when cval ticks have passed. Busy-check it. - if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { - break; - } - } + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} // Disable counting again. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); diff --git a/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 35417674..987a55cc 100644 --- a/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -282,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -297,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -320,12 +310,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/10_privilege_level/kernel b/10_privilege_level/kernel index 8a6625d84c3abde78179feddc2dc2fee7d4670ed..d465758c5d2e9c58c695ffc504c61f2f3598b7cc 100755 GIT binary patch delta 8437 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 delta 8503 zcmbtZ3s6*7nm+$+9^EY}-E;#DMw+0|4M^J!4ULcR@CB$zcx-%SgM@Jgqb7-q)|OsOcFiOyhRI~bF|)%YQxh!5tQDONn(Ww(MzM?)NX6~_&%NhF z`p!&ES$nIvx6k+g=Rg1ZoO>C(5_^Od0>%qNk`pqe4K(ahcefCMkaJ@h3?GNs_^OfKmcV22%c1KAxx?R>JV;CjObNxqgP$)RAp=I5q)^h^vqV!atl4h?5MSpTGx-im>I`(yG5 zuAP87Fm-Qn9Xzp6TX+tq3`~14Wp6qua<|*MLIz{*bHCVEmw>LQNjTPu2{Gz24IU*O zMf9y$@TKjm91rCsxYt72$02n7G(t{?Ujq53g)?X*7N)Hj#f%sYUB<}ca^dSSN?UW8 zs{MPP5jk|%pbToBlZ7>RU%*f;CF3ky_fMFV&ln9r$Orgc`=#03(>WpkJPU$ccKQlHH)gx=OOWOwMsFN^jGMt8sEk9X2ZgiCQ+buEml?HO? zj6^n6L?R6gH$iznqq!d;)-pfYa#-4zmTZr$4J-^XjU#%KmcbK2#m*p9m9VY__oGfA$Gc|ebzn=GH9r6xEI zx9A^D;Fwh=zq30@c3JiwRjh}OIxyCyg)`)2d}1BSX)N}~W3kXcUTv_@EHh*|isaB` zP*`fXcbR3DcWvh;skz^1hMBOF?lD6%oT6bfl%f}JPl7b*>{MDd2^_G5u9^gEVEY7O zI#^ViWQ(EM39uR#(On4-W>#3WnOEtZ1n}lP@WHQGabdsti#|99@)EjyGNiiY#pAiL z<^9juZH2k9r2n_pjyf}9jfY9UJC@vGVK|FnGt2bAWJpg&QpOR|KVWG57zGdQV!7hN zB1Bqok?g)&B$t8l#;*uzV68+Q?;&FhJBLzU{U$=0PLXrcd1LvJy1Q*=g(gmc0GMd? z6v+RscZPf$Q`%_y?NN1pPm#O~Yj6tsd2}ntzi*l@-|mZ3!Ui&Kx?g?4-TqcN5}^0fs-Hr{W&@P$WG!X9kljii61p7hsa{&g6M|8852g6hl61MYTX7c--3 z>xouo;%*~pFta65g__J%c_fD@X5MbiCe~hzT_Xl_E>k5Th&H`}_U%WT+@=qXZpNO2 zww!(v?fn9E{-POV5B8l6=#yJ$3kp8{MWLkB;NBDZS7Uk@{c+0!%7&q?x(&@ITbZqs z+fR3e3k}LmG{l7a3EMA>?Wel_tv#{pb{-kOiTe=twV@9Y|9iG$tbfOpzCY8UTC95D zC6KS7M{b^qQ&{GPawfUe4Xr6n4x?v6r{b0HDWj5z-Wd2QQp9oq3v4K=z?vm_4_%cA znK{uesQD_w8q5$@+|a~o{S)m;gc4_xNvii?zX@Uo=)h!gU7LH+xFf^rx|V*Cd7a)& zgwO5&f&B(e9UA^j-P^EB5&0PX9}DCJzn+>tcCX%`d}$!PciUo=y9TLuycv|Q)=0|k z1oHMh1N0V?q*wZ|O|8Vgkip(-vJV7Gu?qrAOX)iw*fqDqqt$ zj#Ysfxkl5Jde^M9LI-Fvc8x_EFnVf(7sfi!*xhJs*)tQYO+jlXGW>usAl-Q{qIUN2 zNF-%%9C{0qUfCN*#_zT*RPNO;z))2xIqr8SK_nC{K7`zWF2-h!xkK8tkw!U^JxC3gJ&8q!M z<@76beE`aQPjep#b%dJ2=%wpgpI^7pxw+~2_05@hxTz|op9EmKwWU-OCpylyQfe-R zk00&i_#CGuv1N`>K#Zw02Yv_#>ApGek<>VsuAU1&fl+#AE~MbYG!HTyRovrxrFPPa zc~E8QrsaOc`hfr z3ZlhT&^ySUxrCFa@ZO>h@rK6{yd;uJ-z-PVyXjTrcC_fYp5a^_)bbdTMZ;22ygkRs zL$m_P)t7X$w{db{cC>0cIlkQ+jpG3UFNt*19=6)Bj(mWV$LM)R{<*FTAK~Odiq()p zjq@SVbev|-j5w>LQXOWK5FNy?``D1*mpD{yOc}H=e?gUsQ`=Ph)(FwI8!&>QUNK? zt~5nk_!~SvF+U63h98sIWk&}xe+rx8HJGg6xUfm|xFZ~|^wE(DD4=^6LgISiU8g^K zQB83Je$9)w80;n}R~-nTgUMS2#=L9s<}3yBLGorGU7 z#594wg((Ko11&@BXc3wI**7(xttTmxH&E^=m5u^ ze!6=B6f~K2wfv&mnSqEsjZY&xI4<@$fsdo+EVhDQ81jx)!>>@wLTL0>{l(}=WV;R* z-u|5SEQA!F*eiwG_DS0i72rxE-T(%M$d0IA;j;=Bld#`G)o&IVjFnf-JNb#}9#j zo4)*5BJd?#oH(`!d>O~{txh2@>CsnYmrrZ{-_b=7?_$5_`uR%5z zRl#rL>s;dn(_o`VtDzt`u8We$RTn>p@o7YCJ5@SdB=1TcF18(U&J%J@sy`&MP2?qG!FeiQy9KhXZSgEG;_S*7jgUrdVo1Z@CVd@(EqFfpQ&AK!V>AE_-gLK zlem{XUZ+jkNL~slO>1=r(Xc8Q$lLblfLy?JSmPG_g1XeM;ravZ0giW4(=x1@ohf31 z=9idQ_5^Z})-HpTnob=#k&_b~(bI-dDzjFI6XAaZKcqA5TISH7ErVNLy*3wBc@o*I zv-UE_57P6?v3QMhqnEqR)##w`ICz3i9a)@VT{>KxPG{?IVE?VdC>H7Pc#b#f@W~v% zq~Z9Q!LN_#`N#1nIrKOf9h>>7U(kd}d+8nI33ltq4pk61Edo>mo*$RO=`5??ezI`S_$ zndr`L6}($7)9H=>^}q|$n?fy~CI)q6v03Qf0|&XeRW4dn3(q)0x_L{#Jx!dg1y4;3 z`zSu)+M%9ffh6eg3SMl2U(7neos!_DbLwC*_LW_AXuPOl;X5OK-m{`HqJ{;&;jiFB z9Dkc$MR5+1h@Jd2y#mvpiNjaEddzF#It8RdTNp$u)Sk?FaM)!|x#V z`R~9f>z_~U+p`Y7iK9dFAcpSW2-7f0l#Spqb@P{Fe6QaKC1&w@;G9n%-2}yxgx3S} rK|X8OrtjPYGo-+LdTbLs2AAm7P57xJ;qSC_$J>~S>P64zLCXID>vX3I diff --git a/10_privilege_level/kernel8.img b/10_privilege_level/kernel8.img index 4ba3e68a3b12a949efc12f6b8e382775f98d776f..ce05bebadb1de6b9ec9490050c341ccbac133328 100755 GIT binary patch delta 3977 zcmb_edr(x@89(RVUG^^TU3TTE%R&PC02UXQw*fI)9(Ed$YKOEVlv*FC5pa@84YR0y zsHoF3hqTI?@xf&9`iQg}n~-UySehv|O@cMrrujp_biB(`YbLtW;PyMa_ad6?-k^7Imef)KB%)h#lBUSK(}|qir~2QF;t9 zws+K4&(>UzL+EbhX+v_`87IAj7wK!$h|n&2e1n)=oc;0joBLAe-*LJ%hfGsUCYvxB zFF^it;K`mQ2l2g#`VYeU{d7T;(h)HuGfn5r`rTouYs7_I!br&tE8J(7(e>PV{06Qej>s8&_O9mt^TRk_$qf1z5E zbk9IUFf_t*WGtN{l3NqXYhy9}gKDwRT`{MfK$qSLA@V<{O2qmf{oc{wc`cc|Cq zy$J#+<*~p}5?W?$H+Upoux)$qU~MGCUmba-6~SuJ4t1jrC-thGNmUho$sTEKz-2cj z$aV@seZKveoLHAe1L~9w!%+OY(&tcQu;sg>68AJM4?6z-?dOPepBINh*&<3H_g{k2 z)F3}A&up(&lzPL(9n3f5Jm2DIYuI;|{NPE`%OW)1czu+%P83n5l83QQcA7G!jR~ZgZpr zoMUtKO<@D+rE9f4-@3`6u9F;UHo#;WL4yDxT!rYnxaH*XJ{_^>4s?t9uI@yrZqd3l zvItg~G?K)s-J^zC!lXVuhL(huZ9?_S%rgvLfv~EsVAR zR5nIux!0zVnI238?bYs}w$o0s1_m}7YIN7jk&pMLkeLFF=+hv-cDCxewf#d+1Xyjx zi^<&*L9_z69s#c{r^A!Sp?YkLe1M%3?_eAsK;59&18Gm~Fj2b%_&wmjL!Jq5g3I;}WRJ zDFL}2ttps5)$F%1!bp1vtBCsxC^NP1I9_CXe=FJZA6B4`HBS%gvTeIB2e7bn3< zEkwn>Awv6k&s*)Wo*4)7Po7ta4EjEVefAaE`u)q=F(dIXL@&n{7^FaazGbZBhVZIMZy8Iz5zJ$x?hE5tz%ht#c;t5QD+d^c$YHA1XSypQ z(AyTob&4?K)o@Sp_}mfWK;e0Sqip;zA7mtBcr>p}%3e+tJ{z>TS1`fIFvQ*_oW&x3-Mx@`a z0}O2ETdFuz#|)l=HQP{LcoBFX8I$tdSNN75nTL2(X9r$0@R*a+Fjk|ya8A)7fT5$h zq`V0}+Qu9-|0hrfe+z~w`CLe!n{PQY8>l;?Gr+;9;K5OUfX$y_0uCP5Mz6b&os`#! zBZ52(JV<>ox(JAFy9~}-A-XyGD@PE#=V*w&55QVbmHP$EbqXrvS8%}`1}R4aW~wo? zaxF1*k0BFqu*Xn>)9Eck8N8c}W$?byn65R4Q2bOH?KE!2&v@?}H(;DeYvSvkI4;z7>pAnDMvGO9wq<`UC9I@puLHd4`$?Tt?b2W&K8ewH3E zzl?3(fVn^o8wHtna4t1jcIsg&C!h;`@TUja?z3ViJ!#3qx!&uR4>)?to`6$nzukl@ z>1TFF#V$Kc6I?JS!K+QCA*A57Tc%|aDKx-c@Y-khR%hkl1?%}oR>*GhoF4jKcFxj; zx>HFLa{>!Cz9lDQJWV!!G>6tZGMo!FF6GeQIx=b(Dpu(TSr0uCdO@b4%)tv%YRi2Y zFW8-jx%6*KGZvh}25NP_vf_iKA$OEM7?NqF53b6z>?6`TL+4}VjYRLLGX}dCszy;e zr$$z*m|dX0AEM7>KmSh(k^gCZ^xCpaYhBcnB~(iJw!Hr*dHo(WyW(Si8W-Ys$t(32 zI*QR>J zrBv;hOe?yM%d}#{_f#~;UEV|a`FQC<^?>z)Ppn_YhOCF42r28Ay3pH0ng4t0D=c$< zAxE$HqWGx9TeGQk=cetcyBc?HZ8F0@#ZV!wFIu9P3PZ{i!1=0>9xA$-mQWPhE=~>U zlVn=aE)~&z#XrZfR9o^1cdMBGv*cHJ7i}qxhv&gkQ{u3kW#zo$jf!3=Ez?z&hP2Dd K(H5#(p7~$nZzf9s delta 3997 zcmbtW4^Wfm8GqmJOW^w=A_++#i8V>1kPsjS!av~_#A*TOZ33qiw<*opV(I*YyRMdU zpq`snxAyHzJ0;ys^mh7T-Pkd&Wu8;Z?MB;OOV8@=YIg#5GXVuW>S?^P?0J*#Q{=Ym zar^G_eed%=@ALn8esA92{r)R&RN*dCZBzS5^>8ZLZe@!-dO}x~VJ*o*?KMM*2@*zV z(7xG2hV~&6cBmx*Xkj>)MB8{NlQGqa2dc_65#sa#ITZhll zGo0Nn5^z{Ag55?CbxjLICDS2B4-0gH^Joi5=q4|nf}Pjk#}s>blWr|2ZqI$BxH5;< z^GmhGL?eFQ8NMz^;S)IKMUZ#nBKlW8$B+RcHWw;bk5Px>&j1xwtGUWdx=yteJLu0< zi_D)Hi3Em*c#e!XI1*}0jOVqXj9ySZp}VC<9Ygj z8T+q>AlnNO>Iv_|>eiDj58M+2V23z5qDyb#lk2!w+1|p#;UK)sJiztCi zZHLmVMiEw?>64-qI;oKkG2aX`eACnBgzqi-_2Z_Q*`dTl)^3w5|JM^%>gqxA*aB3f zB(gD?7A9sJ68={jGQ1$ru0aJXOgp%SHfN9#-kSCLjB1<`=y;+NC(<;*3e_kQs@izw zp$ZkS?ySS@H5_z^)y7|Ge0xwW>$_$7PM=0xc0w;Bop7(UjvSXZNNOr}jXnr0eK3L4`~5 z7ZW3VVcLk9Rs4h+<_VK}UP~Pshsj4m*RaI;!L>(2SgW=4&x`f>Ce0H3D&4OM;L|j$ zDS`A&%rkSB7Eu2@6MmX*n70wX{E%V6TDH&WRWu{19rvEqk>7L`)DG@pUEzc&n{O%f5!bMf_^~kd0YY^QB4YG@bf4|@gN`@9iT;W? z6z%6e6UvX)Otokvnvz_MMOu}d{hW6(nSizx#1A`T(p^6CT^O=t$m!%ROg?E?L?+%# zkitBQh|^Vg178np1IYdTQARzz_uS6sq-wZGLcbL(VMxcg2TM(Z z!J4MPsb&`H{MMdeIG>kpK_DXB59|UET2BXm*P0TXaHGgAxKseQ20w=VAF?}O>sirq z*lvnN9LvByOhzChw@xQWtV=_g^IWmpsliObkeSfwL@9h)kWwHU7w<)Vto|@bgO5#8 zfFt|qh7^0|;~A*F7iB0i2$MB9b1MHuyHbj5sUlbF0ZeIwL2rjXagLN;5q4X3&JoKM zmUDV5m8A+RU~G3oQ5V*7DNVJnEimQAtxg*BuF9>E1?8 z+M9&_c$dfBg(&sVdw@mHz%Rrbx<$jq;u64`Dty1t0{C=*E03fDeq7*;V?!ELH}lL^ z?tal-Ug-9_(M|+q_OEzqX9KkOnmDetU17ouyvzVf=Mn1I#K(b+?VDt!d#0mx%b5T+ zj&0^p-Km7~lCv5_GzO$|rUK}-@jI(vpE+<0zLK%L*af^QgE`;d&+j}T^AL~fx`9^> zJU|`&DBotyy2~586(z#IVOX{1{0KA~^SJ9lv<{G19|quN=M;sH2NFu@0FZ8d zDPBUK*ZX0865dPbO}#^O#G(AyVw!4r9%uBn7}jI#qL+>JoOflfCv7#OTGBHZwcQ+} zCQKPw!#2XEj!gyYtWjw4rau5QTyl{$u>k-ehv~E1vZ>#kJ45)KWkSp*Ei{|F6L9zT zF6`%AUgF>$!Y#~19GdR*8?GoAT3uXm&KFPs2#6nm)6osN&u61No(&<$=+#iTpVgQ1K) zQ!)*)#h$NaS|*V~1Hi@}F1z<5cP^f@o@a96c43ZWJ#<-4u6M5P4A7%FQTw+_QM)Hi z^Q3Gl*+aj`&B*&!p;?hPdT5>}qh_vR1D<%GN(lyK8mcP?-rMbY3D4P`m%X&cn=$8v z4N=Ma)8#Ak9#S%@ zg}s`>LhPNZ9v%PthE-&+I2g>5wWaTJCNm=H902_EA4*&oF diff --git a/10_privilege_level/src/arch/aarch64/time.rs b/10_privilege_level/src/arch/aarch64/time.rs index bbddd5e0..a6638976 100644 --- a/10_privilege_level/src/arch/aarch64/time.rs +++ b/10_privilege_level/src/arch/aarch64/time.rs @@ -72,12 +72,8 @@ impl interface::time::Timer for Timer { // Kick off the counting. // Disable timer interrupt. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); - loop { - // ISTATUS will be '1' when cval ticks have passed. Busy-check it. - if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { - break; - } - } + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} // Disable counting again. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); diff --git a/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 35417674..987a55cc 100644 --- a/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -282,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -297,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -320,12 +310,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index 6335375dca80bec35deaec186a2eb72c1a8607ad..fd5124e00db501983c2a17609de0e6b76d909d2a 100755 GIT binary patch delta 11257 zcmbta3wTsTmabEs(6{sMkdSm9kPsm0MDl($;n4|?5CRfnzTu%e5CbC^lq9Sp%4Ry~ z>?bdk%fJ*8XAH(!xdD`jY>cl>hH(dU)bIfg>*yNL+38Mr%Bo}#v#0K@3dtSkbJ@M$ z*XgeRRGm8KuT!T^UGRRZc)wM4tgtByiT)_;{>A4s}9?}4PwE*`$d@JIXP8LB~6vR)=?S|a%IqC(Gq)ORbP_7reIsCj#a&B zRP)XR{Pxp&A1CT_L1b3~NjQDOLUxTN#%~)ThrN%3>NM#~Y>893PH!?1`r-_I7NYC( z=L)y6dVn-=vR?sAhA{RXz$DM9scK|nQ{}vy<)?mume1W65xagoQKJay8H1l#G%gYG z;Kl>Z-`pFlDvesR?-;0uZvN!dM?04lT(As_Hs1F*>HJC|yWE8&F9FFSUBT)!N_Gv|na>`y zz@7BZquARPNJzA+NKJ$jd#*-R&bREUpJ;n|d!L;RT3`%!%Zn^{xw*&$uKkrhWX8EK zS@j~_`?2p<{BY(tYuA#INo0z%*@tZPA#+F2Dw27NvE%6^*V!1+?6oMV{rZwnHCRxV zVmrQf&Ffn#%YvS7=tnxI9IAGzeaK-Da>*yUgk0*&ga&c$HY1l8({QPf%RuCj^T&C- zP|iN^gQP^XsSoMl>}*9ldQ(YW492o#WwVpBGRL2{74{GQkcFZ7v_FjX;O^0IJ{b;P zkJSk3#5A=ZHwU-HhmOk7k@7Ry z#m4;U4oH0rlCMV71q3)%bq%;v#!-&-ifh`Cf|` z3*^Nh@ZuWyYW=m1N$EOAZ?$Hq-t~UkaS;fTvuo=x815niJQ!}ih(YmUpmxbhb_K79 zx@A}jYqUa@XYxpsxH;SuzU}3%9AOfgpvN1Zf}4aU`p|?EXo43_<8kSG7Rr0;&9c*pj95{;$jIc)?JnZ#wgr>^BE+hlKb)XG;aF1f{{U_8* zQ16hB)>}TZ3L8XMTuZZQwdV@dZwdl5o|J63u`Xc{@LBl6^<#qJjHlqn`no7kdyq4U zNizU9mk(#>n~Pg8uQ90kYh;$aW`hLJU3^|YlD8SPl%ZV#{_cTthr9CtNys0UU^z3? z9!xGM2Y2Uul-0(Qa8DkoPlIhS2T96MKQ22sn1TIBrySRRGr8c)!NDk=*~a6CxZ~AC zOH*Y@SG<}NK$hu;6c;9OA(C0`-&9$%B1k=-WKn-P$~d_Gc5s|JA;6FkB-?@?(&aG5 zHpS>;pI|2fU{z$H8i?7EA0~WNl#7L`b0C$?41^4Sm%4qRkUbm-$?^Ep=2B<)llm=f zZr3*0ws$_VcgW#VKbYuZZv;a6*!F3v7jq

gh{Xw7w)iRjCeEQR`tmPnk6ca-v-7 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 aX*gF4k>OsLD=h@+XK{4bTxlv+-2VY4zi#gU diff --git a/11_virtual_memory/kernel8.img b/11_virtual_memory/kernel8.img index 66e9f4fe3fb9e12d69c2590fa6f96d562d9d638b..6fae2c9b0f5c17b741b9451e5636447e30ff75d6 100755 GIT binary patch delta 5693 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 RKHa{5j2~_v_<=;T{ueVIMkN3M delta 5823 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 diff --git a/11_virtual_memory/src/arch/aarch64/time.rs b/11_virtual_memory/src/arch/aarch64/time.rs index bbddd5e0..a6638976 100644 --- a/11_virtual_memory/src/arch/aarch64/time.rs +++ b/11_virtual_memory/src/arch/aarch64/time.rs @@ -72,12 +72,8 @@ impl interface::time::Timer for Timer { // Kick off the counting. // Disable timer interrupt. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); - loop { - // ISTATUS will be '1' when cval ticks have passed. Busy-check it. - if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { - break; - } - } + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} // Disable counting again. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); diff --git a/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 35417674..987a55cc 100644 --- a/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -182,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -282,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -297,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -320,12 +310,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/X1_JTAG_boot/jtag_boot_rpi3.img b/X1_JTAG_boot/jtag_boot_rpi3.img index a66e8d9fd90b53ffc8cbb953319c0959997d2937..d74422a6d6b04b221795741720c89d33f05374bb 100755 GIT binary patch delta 2045 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 delta 2568 zcmb7FeQZ-z6hH6Xc6+azvX8D?yFuSJ80+|Ql&>*m-Nxe9$%my9ktmdbS_Z=vV<5P+ zlV~9053UatGyWJzBCkj&4uZu*0Zq`vkP^h;UzU%Uj!mM0g_Q{P-1otUAAk6g=H7G8 z@0@#n=iGbx`+`)d5zfgCz=lvfZJ z>*S`m8^I_%C;`j~D;wzB@zPMt@70S<7EH;Do7VkeX=)Y3QN01H6QqBAd)&UP= zng51ta`DhzS6s*(l=Y|^Im{`Y$fo_j*kHmMo5L!boSvNiP9*a>BSRn_PGRP$!~ElH zkm1kRrqyGaS%3$^!8%HC?N~jZUPZP6bHuk8?X0b;-BU+-v^SleN6SgXcgn1{yqUjn zyB^ZFwh78D;*1JNPH4=bB4S-v>M0V;Q+t=13*h6%UL_n|iTpg=!*2c?&nErcf7A&5S&h!=S6}75U*(-};o86n z!)F2fSO-mh7si-QmdsXKec9%~xDRgEHNbp;-sfZ+R~5cHu5>Kj!6|oE^2+EkqTJeM z!qW25+XSNTOmz|ZIVBRl#GD1YC+;XRFY5!?vx-1xVlq1@NSu zwGda=7Hw_AS0zru=gO2pd=8>ZGl);(ewwy-t;Rh%CXu}s*ppttffcWFR4{pzB=)t* z1XlIHZ|i9<#$h-E&-PjZkPw57=^C>q-e-#V))!gbHD;V6!N!tw!v_%mz98ab3|(gU z;|%s54f2;+j%@UCehhJWB+G3|2%=}OGTY1X(lhcVVWOt^NYE75#HyMr6WQd8;Y3T| zWl!8_2HJUSBHh&sbP;C89)1cRdwG(V-Il43`yb7@EG6(RC(7`j;pA1ITh;)rL$8;b z3Ej4g(0v^<20zU`%hyB%TKVXxN($8Zh|I?X8H${Li%wQ{DItDDHbkD#BR!2j5Cbn*OrXzAn_YZiDnjpexuhUwT|F#}SAF(jllmIDgfzP?xb} z>SxtuU4)6coTn=c9Ex(E{lxQXP!#@eT;m)g?z~bhFHYWSKli>vkP~)+BXY0ZxkA#9 zHd1a0g*Jtx4VwaMgI%vlYeT`e)`jLHXm^qr{W$*DGNp2c{o*!2(7fkrjH&CvDwrUtyZUU&r r{onO#P@j)_wS%~}>ZQ=#z$nq%f_!(vf`Tm-T3AW9@2!x%&Z@rv(~q|m diff --git a/X1_JTAG_boot/src/arch/aarch64/sync.rs b/X1_JTAG_boot/src/arch/aarch64/sync.rs index dfebc0e1..2f6900b0 100644 --- a/X1_JTAG_boot/src/arch/aarch64/sync.rs +++ b/X1_JTAG_boot/src/arch/aarch64/sync.rs @@ -7,6 +7,10 @@ use crate::interface; use core::cell::UnsafeCell; +//-------------------------------------------------------------------------------------------------- +// Arch-public +//-------------------------------------------------------------------------------------------------- + /// A pseudo-lock for teaching purposes. /// /// Used to introduce [interior mutability]. @@ -33,6 +37,10 @@ impl NullLock { } } +//-------------------------------------------------------------------------------------------------- +// OS interface implementations +//-------------------------------------------------------------------------------------------------- + impl interface::sync::Mutex for &NullLock { type Data = T; diff --git a/X1_JTAG_boot/src/arch/aarch64/time.rs b/X1_JTAG_boot/src/arch/aarch64/time.rs index a6c9d50c..a6638976 100644 --- a/X1_JTAG_boot/src/arch/aarch64/time.rs +++ b/X1_JTAG_boot/src/arch/aarch64/time.rs @@ -10,8 +10,16 @@ use cortex_a::regs::*; const NS_PER_S: u64 = 1_000_000_000; +//-------------------------------------------------------------------------------------------------- +// Arch-public +//-------------------------------------------------------------------------------------------------- + pub struct Timer; +//-------------------------------------------------------------------------------------------------- +// OS interface implementations +//-------------------------------------------------------------------------------------------------- + impl interface::time::Timer for Timer { fn resolution(&self) -> Duration { Duration::from_nanos(NS_PER_S / (CNTFRQ_EL0.get() as u64)) @@ -64,12 +72,8 @@ impl interface::time::Timer for Timer { // Kick off the counting. // Disable timer interrupt. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::SET + CNTP_CTL_EL0::IMASK::SET); - loop { - // ISTATUS will be '1' when cval ticks have passed. Busy-check it. - if CNTP_CTL_EL0.is_set(CNTP_CTL_EL0::ISTATUS) { - break; - } - } + // ISTATUS will be '1' when cval ticks have passed. Busy-check it. + while !CNTP_CTL_EL0.matches_all(CNTP_CTL_EL0::ISTATUS::SET) {} // Disable counting again. CNTP_CTL_EL0.modify(CNTP_CTL_EL0::ENABLE::CLEAR); diff --git a/X1_JTAG_boot/src/bsp/driver/bcm.rs b/X1_JTAG_boot/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/X1_JTAG_boot/src/bsp/driver/bcm.rs +++ b/X1_JTAG_boot/src/bsp/driver/bcm.rs @@ -8,4 +8,4 @@ mod bcm2xxx_gpio; mod bcm2xxx_pl011_uart; pub use bcm2xxx_gpio::GPIO; -pub use bcm2xxx_pl011_uart::PL011Uart; +pub use bcm2xxx_pl011_uart::{PL011Uart, PanicUart}; diff --git a/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 7647492d..987a55cc 100644 --- a/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -127,7 +127,7 @@ register_structs! { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -151,13 +151,30 @@ impl ops::Deref for PL011UartInner { } impl PL011UartInner { - const fn new(base_addr: usize) -> PL011UartInner { + pub const unsafe fn new(base_addr: usize) -> PL011UartInner { PL011UartInner { base_addr, chars_written: 0, } } + /// Set up baud rate and characteristics. + /// + /// Results in 8N1 and 115200 baud (if the clk has been previously set to 4 MHz by the + /// firmware). + pub fn init(&self) { + // Turn it off temporarily. + self.CR.set(0); + + self.ICR.write(ICR::ALL::CLEAR); + self.IBRD.write(IBRD::IBRD.val(26)); // Results in 115200 baud for UART Clk of 48 MHz. + self.FBRD.write(FBRD::FBRD.val(3)); + self.LCRH + .write(LCRH::WLEN::EightBit + LCRH::FEN::FifosEnabled); // 8N1 + Fifo on + self.CR + .write(CR::UARTEN::Enabled + CR::TXE::Enabled + CR::RXE::Enabled); + } + /// Return a pointer to the register block. fn ptr(&self) -> *const RegisterBlock { self.base_addr as *const _ @@ -165,12 +182,8 @@ impl PL011UartInner { /// Send a character. fn write_char(&mut self, c: char) { - // Wait until we can send. - loop { - if !self.FR.is_set(FR::TXFF) { - break; - } - + // Spin while TX FIFO full is set, waiting for an empty slot. + while self.FR.matches_all(FR::TXFF::SET) { arch::nop(); } @@ -205,6 +218,11 @@ impl fmt::Write for PL011UartInner { } } +//-------------------------------------------------------------------------------------------------- +// Export the inner struct so that BSPs can use it for the panic handler +//-------------------------------------------------------------------------------------------------- +pub use PL011UartInner as PanicUart; + //-------------------------------------------------------------------------------------------------- // BSP-public //-------------------------------------------------------------------------------------------------- @@ -235,26 +253,9 @@ impl interface::driver::DeviceDriver for PL011Uart { "PL011Uart" } - /// Set up baud rate and characteristics - /// - /// Results in 8N1 and 115200 baud (if the clk has been previously set to 4 MHz by the - /// firmware). fn init(&self) -> interface::driver::Result { let mut r = &self.inner; - r.lock(|inner| { - // Turn it off temporarily. - inner.CR.set(0); - - inner.ICR.write(ICR::ALL::CLEAR); - inner.IBRD.write(IBRD::IBRD.val(26)); // Results in 115200 baud for UART Clk of 48 MHz. - inner.FBRD.write(FBRD::FBRD.val(3)); - inner - .LCRH - .write(LCRH::WLEN::EightBit + LCRH::FEN::FifosEnabled); // 8N1 + Fifo on - inner - .CR - .write(CR::UARTEN::Enabled + CR::TXE::Enabled + CR::RXE::Enabled); - }); + r.lock(|inner| inner.init()); Ok(()) } @@ -277,13 +278,11 @@ impl interface::console::Write for PL011Uart { fn flush(&self) { let mut r = &self.inner; - // Spin until the TX FIFO empty flag is set. - r.lock(|inner| loop { - if inner.FR.is_set(FR::TXFE) { - break; + // Spin until TX FIFO empty is set. + r.lock(|inner| { + while !inner.FR.matches_all(FR::TXFE::SET) { + arch::nop(); } - - arch::nop(); }); } } @@ -292,12 +291,8 @@ impl interface::console::Read for PL011Uart { fn read_char(&self) -> char { let mut r = &self.inner; r.lock(|inner| { - // Wait until buffer is filled. - loop { - if !inner.FR.is_set(FR::RXFE) { - break; - } - + // Spin while RX FIFO empty is set. + while inner.FR.matches_all(FR::RXFE::SET) { arch::nop(); } @@ -315,12 +310,10 @@ impl interface::console::Read for PL011Uart { fn clear(&self) { let mut r = &self.inner; - r.lock(|inner| loop { - // Read from the RX FIFO until the empty bit is '1'. - if !inner.FR.is_set(FR::RXFE) { + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { inner.DR.get(); - } else { - break; } }) } diff --git a/X1_JTAG_boot/src/bsp/rpi.rs b/X1_JTAG_boot/src/bsp/rpi.rs index d96cf21a..85fc4585 100644 --- a/X1_JTAG_boot/src/bsp/rpi.rs +++ b/X1_JTAG_boot/src/bsp/rpi.rs @@ -8,6 +8,7 @@ mod memory_map; use super::driver; use crate::interface; +use core::fmt; pub const BOOT_CORE_ID: u64 = 0; pub const BOOT_CORE_STACK_START: u64 = 0x80_000; @@ -42,6 +43,18 @@ pub fn console() -> &'static impl interface::console::All { &PL011_UART } +/// In case of a panic, the panic handler uses this function to take a last shot at printing +/// something before the system is halted. +/// +/// # Safety +/// +/// - Use only for printing during a panic. +pub unsafe fn panic_console_out() -> impl fmt::Write { + let uart = driver::PanicUart::new(memory_map::mmio::PL011_UART_BASE); + uart.init(); + uart +} + /// Return an array of references to all `DeviceDriver` compatible `BSP` drivers. /// /// # Safety diff --git a/X1_JTAG_boot/src/main.rs b/X1_JTAG_boot/src/main.rs index b26ef330..42cd5cfe 100644 --- a/X1_JTAG_boot/src/main.rs +++ b/X1_JTAG_boot/src/main.rs @@ -50,13 +50,11 @@ mod print; unsafe fn kernel_init() -> ! { for i in bsp::device_drivers().iter() { if let Err(()) = i.init() { - // This message will only be readable if, at the time of failure, the return value of - // `bsp::console()` is already in functioning state. panic!("Error loading driver: {}", i.compatible()) } } - bsp::post_driver_init(); + // println! is usable from here on. // Transition from unsafe to safe. kernel_main() @@ -64,7 +62,7 @@ unsafe fn kernel_init() -> ! { /// The main function running after the early init. fn kernel_main() -> ! { - println!("Parking CPU core. Please connect over JTAG now."); + info!("Parking CPU core. Please connect over JTAG now."); arch::wait_forever() } diff --git a/X1_JTAG_boot/src/panic_wait.rs b/X1_JTAG_boot/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/X1_JTAG_boot/src/panic_wait.rs +++ b/X1_JTAG_boot/src/panic_wait.rs @@ -4,15 +4,31 @@ //! A panic handler that infinitely waits. -use crate::{arch, println}; -use core::panic::PanicInfo; +use crate::{arch, bsp}; +use core::{fmt, panic::PanicInfo}; + +fn _panic_print(args: fmt::Arguments) { + use fmt::Write; + + unsafe { bsp::panic_console_out().write_fmt(args).unwrap() }; +} + +/// Prints with a newline - only use from the panic handler. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html +#[macro_export] +macro_rules! panic_println { + ($($arg:tt)*) => ({ + _panic_print(format_args_nl!($($arg)*)); + }) +} #[panic_handler] fn panic(info: &PanicInfo) -> ! { if let Some(args) = info.message() { - println!("Kernel panic: {}", args); + panic_println!("Kernel panic: {}", args); } else { - println!("Kernel panic!"); + panic_println!("Kernel panic!"); } arch::wait_forever() diff --git a/X1_JTAG_boot/src/print.rs b/X1_JTAG_boot/src/print.rs index 86ab59b3..6e8a45b5 100644 --- a/X1_JTAG_boot/src/print.rs +++ b/X1_JTAG_boot/src/print.rs @@ -7,6 +7,12 @@ use crate::{bsp, interface}; use core::fmt; +pub fn _print(args: fmt::Arguments) { + use interface::console::Write; + + bsp::console().write_fmt(args).unwrap(); +} + /// Prints without a newline. /// /// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html @@ -16,9 +22,19 @@ macro_rules! print { } /// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html #[macro_export] macro_rules! println { () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints am info, with newline. +#[macro_export] +macro_rules! info { ($string:expr) => ({ #[allow(unused_imports)] use crate::interface::time::Timer; @@ -83,9 +99,3 @@ macro_rules! warn { )); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -}