From 80c88e4d6b4624c68f5da0cee5270d65cd3fd95d Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Thu, 29 Apr 2021 23:35:23 +0200 Subject: [PATCH] Bump toolchain version; Fix clippy warnings --- 06_uart_chainloader/demo_payload_rpi3.img | Bin 7024 -> 6920 bytes 06_uart_chainloader/demo_payload_rpi4.img | Bin 6872 -> 6760 bytes .../README.md | 2 +- .../aarch64/memory/mmu/translation_table.rs | 2 +- .../aarch64/memory/mmu/translation_table.rs | 2 +- .../aarch64/memory/mmu/translation_table.rs | 2 +- .../aarch64/memory/mmu/translation_table.rs | 2 +- 14_virtual_mem_part2_mmio_remap/README.md | 17 ++++++----------- .../aarch64/memory/mmu/translation_table.rs | 6 +++--- .../src/memory/mmu.rs | 2 +- .../src/memory/mmu/mapping_record.rs | 9 ++------- .../aarch64/memory/mmu/translation_table.rs | 6 +++--- .../src/memory/mmu.rs | 2 +- .../src/memory/mmu/mapping_record.rs | 9 ++------- .../aarch64/memory/mmu/translation_table.rs | 6 +++--- .../src/memory/mmu.rs | 2 +- .../src/memory/mmu/mapping_record.rs | 9 ++------- X1_JTAG_boot/jtag_boot_rpi3.img | Bin 8160 -> 8032 bytes X1_JTAG_boot/jtag_boot_rpi4.img | Bin 6848 -> 6736 bytes rust-toolchain | 2 +- 20 files changed, 30 insertions(+), 50 deletions(-) diff --git a/06_uart_chainloader/demo_payload_rpi3.img b/06_uart_chainloader/demo_payload_rpi3.img index 9b1cf35bce83d123cb099774e0377f9ac1271a2b..a8d7f680ef624efc1753bb890807835d880967e8 100755 GIT binary patch delta 2758 zcmZ`*eN0=|6+ibqe>~eHVEk=9Y~&Cyz z-OTY^MwN(CXaZ$H;*`Guj0Yk37qy$4T|dbyUp{V7){YpJ)jpH5(rZ?h4+%78aC5{* zdku@yLq?cwo(B7T2;}CWXom&BDHtsy7NZyyh!}my0<#M!J4k#Z2aFKiParziH!JTr2a`4+OF`=y?nz6iwWX;e~v)n zCnm9UimSbEWRe$(L%3lvcq2o3F&f(h$*}9ZKWv02MH3`qMo13e|1~VeZUmR(9atDo zOP+UUo}fn4_RxOJ>sy%LKFqTR^WCegpX^pJfB6dEckP*WF?*6eXbMCVSec1+bL6Q< zx|C+VZbTrp?|aX}tk(>SfDsDSVu_eo>D?J1v1_7gZvR+SJ!>>=b4d5DcYbu@SeNoN z`l~g9d=9O00Et0|SjzEU#N=z)u=*2P#k%(@=QBqPv#-| zIsz&1{!D=Qi>poN{TW;f*eUGtlz<%yr@eBa=?_ZIOcX{Yl`E5n6)yGI*$*M}_Ggfo z{w#Hwtk4?aSm?-QEHuG_b4Vm!5kM?i1hKS)BwXf6CV(BLuL)jXD%;=~I z-n_{>>2={f;-u#-;RC~u&Uf??vg=js`vT^VNzZoI&zEX94-oE~p;; zq5nHlnon}Le-q&^phxDlkHF$MwOboP&Wx9l)*zN94e%zD?Zfrpn)Cwu&Gbj;cdcKS zPI1Br!(?-b9Y>A+YKd^ku<`WEeMBe@sA__Fh~e)U?5bpf#Yse0_TbFap+^XIDRYQ6 zj|^Ns)UEKF#L`M{7Z#*bxpm}^ll>65_NX4Uh*3vPAm8MznKO%h9nUw4)Mndm9OkSe zBlMfL8qS)d58LjOT>V{&d$*YNA*G@^r38&qF6^xPHl^6PywSBc$tWji^kMQc7{(0T zZx7-OVZiPL#X8AorE-p93TbtxZ=}`3chQRV;a^A}hMLveSrOt zruk$SuD_>I%Y)SN6mv+eJg)z}VT(FEO;+r5O`wNvMmj-6f)Ru)WR~friWB7U8#^}r zlSqKjJTmbh*(D>($8sS+mci7VjVQ%#kVn%|S!k%0=Ua`+0nB%y zo5;DJvN6cx803{=n+ZoDrz|uXl-gVBOKcPtw7`(bAxrZJAa+aj1hJVokquJ~6SegD z%6cIcl1U2WHF~LX|K4f0ynrBbW)oAIY7pz>90o6-)BP-HlTl$uC_G&&t2lG#LqwV9 zi98?TmBM;C=nUurVAf+-Nh&TpxK*=Z@*7q4&U8R7s0O7OaV%ZLco8TSsNL?hlAwGozg6?o zW^bswj(++#!yYI4VansLwBm)~%oH3@3ecoI=#E#(Yrh70oNLfLvdmbJi}t#mzh@w< z5cxjtu?hAC8l}I)y=OUAk+DG*{Ucsk)`2hC8v++uKmj6yINDjl;m)82{Gjf)t-A4% zpQ8>=^$3$QKMYuSI;dTWYyjo4ic36{=0gTWm5j=YWKvF}&4i&`5X;j&C03XgpO{^M zU?fJwtTo+JI*7-|nx?<2-s!^CQJf>AxFhX>r?h-ts0HOy6@hkR>|roRsbm zY9+sb9}gkCsm)MQB?A(e&2kuHcR~Tno_`1A%SdFgq~e`h26?-36HW5rV6!}jIuGc8 zm<~a%!j-Ug>27?zuLw;6G=^Sa&=~1nrqH(^uRd*x&NqEj~@t z9#6w@c5&h3*8T#V*4J1+?HQz5PfWV*Eo&L|-4DOAepg=`boo_%jaAd0L;kY;2Bb^6 zyz2kRFX(bSWbBE<8GQp!yY_t5;R#*7k;W7H+NA40rLQ;AIz+E}C0{{@1$t>d)z{5* zz!$KNy2_x>x#+NOpJhvBd3lO{?2C{AYWMfv-upI9`aO10H?Q0PNzeKp=ic&DYfZaF Ns41HZ^gvD1e*xMTcCr8f delta 2894 zcmZ`*eM}t36@RmPAG;T9K8}OCqi}Z+7Y+v#;=q|$3Jdnd4ylutl2A2Lfml_+wo0H; zv`OKq)IRw*rQWvSY`R@HImRKdoCvkTid zdkeK`Gt%j1-n@Cg-+S|$nH_2Rv}tSyxpAS{EqIn~aDo7w*Z&SQ6!g)g2=x7ny~4vp z(0%NvSl$|FfOtO)cSxXQ6JkIML?O=m@)n58Le4ISvA@~s*Fikolk4l~FS8l(;ie-s zRL9T>QP7MSQB&2RrelJ-0B|A*!9NQa|OU3|{T>TM;$xS#E@ zEyUXGFjF%Ph4WQFYx-+<$NlOlo8QXBjb)*+U zF+qNE^hF|P`q7XQy^+48(j3?XgOcZzU$Vo{lpQ()b{I_He-@K|6v^qLTT6(gwMnr= zJIe0Z>jHZ)uct7-DCW6aT^-n^V%~I0?4EnANr}JCqK-i95LRSr#rZ!7!xq9g{(puD z+YliumTC8}Z^M3{6X+?5>+E6dd!4YL19bLOwyC`sT`E+vKw9P$!`XD*FiH=j z?S6*OA}(Z|u?Sy~5ItH_EY_q=)}m!+35fX==mC99)PLiE;7I)L)v zLBn`_!T~d3B=p(;Ay7i2lxFtdGCI+}_O&L6zn+BV4={d8^l1U&%Pd!)@-rMuC5p%-pE|!?)qMr`m7rb))jSxI zlD&;OUlc(@O)T6IiN+Mk>mJ>#WHrG(I*;TJI^fbLqK6%neoZ`VyBu!R4$SZ9CZypU zrj*9|Z^9bJh%0lh9EwgCLFYTD^S5Q7zwrOCDv%al60h6cGl) z_G2e`9=(Rq`TZoj<$5w!V*jrMILMI=`o!HZ!QWq3fO}nvQvgjtypA}bH8Ol-SVvBt zhTzErF_95d75oI2Y?SBMX9NUDiKQrk(u|H0*cj|4%HD_fHbjopBY_ zHkLwhg~uPG4`DwK)tBCd*H>sKJw9Dd_hF8yYP*`+MX3G;zd3DMGM}hMOjOhL4)tb4 zP*V|`8d^0z;5R6s>UbSeCLm}!Dlmz_ZL3CUFxaN@OFpDj&@(X1w&(k$;1)`Tf!<@! z=kML!>ZNJqqB|YjZ!Dx&P#w9Xs%`3Ch&sPz3ULno|IsB_E zk^jiHM1W4Vc`0{xn+t-J2TXMV9t{|iLP7eSm+I&eg5hh!b{2%oRxkm*2pakPHG=QP zLbbVu&&LWXibElqGHhxM^0<9g#GE0UW)}*)uJI6^`(BM1XSN_z{#T6Cvl$wTF%EY= z(N>2~PO+A9LpH<;3xg$R3h3P*0zGl2(u~M6;~;wq%j>Uj5-y0mh&FyJ-or)x|3=$U z!K_FhN1qi{Jkus1D+~ox4k$sS508;qokYka-fqR6E!^^r579?)K!nfpLU3Z?-bx`oME-F!%L`NMQ{rg|Mp}pxcTGmK_!v^xBzvK# z-h-oqctspXORNzFpCP0Eyh(PlXxkwX7vj?}2E#RUzy3wqi!a}sJ=OTe6S{~XTsA!T zD87KQ8qL<)mG}Wq@%CCfzUFsvC(ssn58{EK_@^*lWYc(pUGQNCpL6}-K|6cY?Td{^ zv*C}T=A9zr5d@5lCk^qp(q6=93qC?+EGow}3&wrlf@OXOUBlQnEl$Q&GPAlJvNv!% zf(4WQadv3f371?LYaTbCoqFj*3oWJ;b^MSxhOyK2L}kBmA1lJb*7%S=`tIe$4%M># z#UZlD-YTBBf70BE)*9C0De1yHKZV6lUIlsu<*a0l$2s>0>ZgQr^_vP)?$>T{<$eTJ z3q4!Shn#=$@UJBEN;>Z;wgY}DZDrG*Zoed9vF~fB2eai#?1_@=PY3-EPA~9B2^&_> zY|){ifg$YOuC%+C!!WrMy5xyDpqSHqg^XI7ep7ApT&@Hb)E^DX;j*5Dry Tf@SQCze#@C0)3e!{MG*fK^mEM diff --git a/06_uart_chainloader/demo_payload_rpi4.img b/06_uart_chainloader/demo_payload_rpi4.img index 2357ef5e93fd8fe7d0716198726efb7c85810edc..2d181336afb87cade1e96e18297d2750aef5ff8e 100755 GIT binary patch delta 2839 zcmZ`)eM}t36`$F?J$BF7zO>rszmFk@0x>*Q9>rFh)+x0B3e=;+G*A* z)X?zN9|~S7O#0Xj- z7-o#>sXC%B#032xgp5^^%8$%8VS4qHsDE+Xq2E6u=__4Mefe;nzH~^|6{2SDh}5WG z-9JMI-J^P))lQ_x*-40gT-yyxj~u!WWn_+Yy% zzVzxR5?PGWz|A>IqCa!0nX^LazTwNFobJPd;_x^3CDm}tM$#YhT?~dKGN3w1v_&HQ zJ(%x{6~=CWONbt0PAq9iip9o{*{Zao<^U3X3JE`n#M@DT{rc*uHXQ}gCdIDVlTB*; z6g%jwh(%GV@zuQMpL{Q(*NbJtGA+I7zd)w_d1R3wLdvaXsB^G00ndcC%&KNy)89<9 z3jf7 zZQ?$P5%^0V>fOBN6|th>WD|*>NpYQw!30ZRSIu8Em!k>w8{c{qX`h4*1W#*BOef`MWC_6>@1@KJNW$;XqIoAYZ z34E)-c@Lo|IKst2%+CTR{~szO(GB@(=A7Ueo=1+)ImuhMMKAlK{0Hh~=ao>|xuf%Y zyC~gx1;kiDMZhj^jJncS%7|NK|5QqRf}2Ed1O5W+xsNVN7RQ+4s;coCerU@MHFMcP z-r{>tLhijEdxigV{bBaB>j~+sAP=8oFS#~6fqaJbFws>PoQA4f|rg?ucHzTa5?6qOi>(*Jh_v1}i1h43OyYI^4;XV>bQ!TBvHw=uj9v#` z6%~0Md3@+2?%0&rAA$TGi%caTQ%O1jG9@8@nzMzD$oldh^Nqtp8>gA9f>IQaWn+oG zmj66$ySjDb4N7%3zo{lhKpT$Ke1}f=qOG_H8J!0MJLVqOK=08+4FSE##M}m|r`w1& z(i7I?-vqSzZIXTvSueCvE%9^S9!0cAQBUu3qD2b&LY+e|T{F+~7MZfb6C(k7CIO>m z%`B`XzmAXKp{1rhh02N%JirvL#^COTS!%q%E%PgG3?wFKg)SF=8E zupNb4V-xb!X3Yn^-z8yp*n&EW_JV(^djS7LB&6LbAsM7FDz}zuyxnvEW=ztT5#s>l zv@1?lF2#DzCTn;!`WaV*>gvpYA?Oyv(d_rPSV>!;Vqb#!F95Cp2=53S(BD~W zk=Iup!h+WjDH%(g5%hbe`PscjcC=`-aJrnGDJsu@@aj?R8hf+ILtkX?6>TrX^4(j= z4j*@BFzWUTQ)O(kyFA8CE@js*04Ul&dSI?<?S_CF zUm%suEmV!WcD83aaLrshr3_y`YSuM%pqdg`zm1YO`@OqXfzAkY@^`X-yB~{nZ_xyl zCNf#AiI{(&)_`JETR|jFDXadq?HRn5@pE|f4*I;i@I=HFVstA1B5_V>OQ#Gvun$$W zTb)M1{UMM^cU{&$sn>d7zvGLn-<)o9%P+_ZZ%rSdVXWFgbN6Iz7s-5tHCa5}DZhJt zpb~AA8*ZEOuo=$_)pV=IuSTj)1kb?b8e&&a%JGby@V*?YLf^O5EU0(~EOk)x0efJY zd!Q%4E#t>x7R;|-03ePiP zFZ$})gij5QC8G9X!w#K7+?-#S` zl6|pef7TplZ;i%BCnEu+BJc*BO1L+P{k3;)kPwfDW*{cn*^`OAxe_F#=i z9e!-@=koZIEjw-fSzFHK|3-i{`d=tL5X`#mw&Q)nmd`?Fzx9PU?&6LZp^Jt*hv=IG5M_G8@JaB>~+Kzg2$+z^#_}kUOQqhdox(~KcU%u Aj{pDw delta 2879 zcmZ`)eM}t36@RmPd$)VR=HpoI0Gm5Z0Uy|Luzf5>-hZt35@H54%;BMzKm<5m)LT$3>M6E+oZZ;Ov_1 zo4w`Y(q^R9zIpTJz2AH9H#4bS*LROJlD}w8ACmD40;whP-yLw80K8opFVPa8f|le# zd!4p$RpgNiPjSVBi+JgCeD!V-l#IU(V(i}wkq)UkD@z>8L0jI4^7gD8>_VAN@Y}e` z8u|qWC2O*v^f1Y((G91P0QMNXOO68tr%FM46vd3@-5}Uo{1oKStaiP7?_C zIhD*$Ice|kcZrnlMMaADg?f@olYavYi1OJoQGmg?0AarX1Jn4=@P6a#2rj{UjA`Cm zm*h)~SLmFu-Twe4dOs%IhKcXjSNr$rSO_i7cTPRipv0b~-*o!bBUqyN9oPRvh}aR{ z!2dEvxECX2_;TYm$_|u!T%bK?wp=T{({k-N%03s&Cji1-TUzyQ^ez@E86eG5is@>& zYMS2TsJk2C0gMY7ml|Rlrg_;&^2LU@!QQmu3LQJps^7$5&AgljCxm;7luQC`rg>l8 zMJH&?dB8MxjX7a5h=7*=4>&J^dm6z_Ill^=>S{QT=opBn5#f3uu!uk&Yt>f}h{^fV z3ie|x2c)D9v(5n#T`=h<-t?gxW*F`3o@s#Cvq@+=gZ@)|so^K3>6O~EWfbR(Xh^8H z#e0zn!3nRHs(oKixQL$MLHmNsvX(VUc`x#DSMr@33Hg&7qn8%wdDqbcoqxc-5+pFE zvy&l-jKrL=$b*5Ln7@gHj$$X8QI6pMNh}VNqXiHi-l${@&NDoN`5bn_yK}ru4~c&! zGOd?_n~lDi#!f=+8^)N(Usb{DUG0&msO<+|PV;5}3b8e=Sv3 z$%YTDhmgEu4tSTXwc)(ymU@cG%zm6sOM8SdP8>F9rMvtgX4_1}^ku}TVuOY-YSvaZ zHsRh#ju;+e@!?jTM{+D3Y|&RcuZ(qpf2z;+okrhp(Vx5b2nOdK9;Y9<%ekK=>8yLN zS|WVed*&{>j+od6E6gu*t@q?O7zbzw;HAStuZ3kDp&eOXnw*>tAmky74(#ZatmoyE zlN<&}@m}n`H=V%VuXpwt@??&88)}pvcrk5;FJZMYaQHW}(s)&dB6WfvVD)(vYySC~ zE$XT$$=e~vamRkfCQ(7+5QHEaH)&hmaY8S=pLdxMgGM)2sR>sMZ#o!BA-96jo!UJp z=OOuK_p#e+k9MNFTzd#JP1Oo|Y9G-OFM>ABJB(yL(M^@tXLmUD&qAD@3OV%3Rr3tH zQ2|NEs*$q7f{{Q1CNX^Ls_6{`T6ODsPn2tKLWI`mS8$iN&~N9r77fVAbcfE6xDi1+ z*+kFgZz>w8jBL^p2`I1j3Fy1N09%T~I71>rhc_I0>9iyu#_rrunbs7pS|ioNEox+QN#w z+?z?XIQ>qcha90#6>cj)_03N)JN%flx9A&%J}&B~?-f?4Y|FW<{xt-uI3bh+N&*(p zT-ELZxCZPb?iqDtDw)yWwoIL%#D?+B z?30VXQ77O-k2(pA4(Xo|V+^!<^(fQ9Nbrd^>q?RETmsG^5Y+Gpj1}dQ@T6ui$AyT94i`cV#izxhHC}xp&oCHZ1p}cJA0gLv*l1 zEgBI#QGnO{LFK~N)DU0N(}!`cB*MOMl{#5&wH5P>xuB7If9+CEhJ-^)+17YGLy z#~N*egZ+aj?X&gBTWhShYxL6Jmh4r}`?A}y!`66n-TW8!+`@+zzq038Ol$bdvisLi zzHF}-e8u{Jy1C>f%pEF@jG7q8QnvfBRuczlS< diff --git a/10_virtual_mem_part1_identity_mapping/README.md b/10_virtual_mem_part1_identity_mapping/README.md index e33329fd..75ff9c05 100644 --- a/10_virtual_mem_part1_identity_mapping/README.md +++ b/10_virtual_mem_part1_identity_mapping/README.md @@ -602,7 +602,7 @@ diff -uNr 09_privilege_level/src/_arch/aarch64/memory/mmu/translation_table.rs 1 + + STAGE1_PAGE_DESCRIPTOR::AF::True + + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + + STAGE1_PAGE_DESCRIPTOR::VALID::True -+ + attribute_fields.clone().into(), ++ + (*attribute_fields).into(), + ); + + Self { value: val.get() } diff --git a/10_virtual_mem_part1_identity_mapping/src/_arch/aarch64/memory/mmu/translation_table.rs b/10_virtual_mem_part1_identity_mapping/src/_arch/aarch64/memory/mmu/translation_table.rs index f38d0895..eba8e12b 100644 --- a/10_virtual_mem_part1_identity_mapping/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/10_virtual_mem_part1_identity_mapping/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -235,7 +235,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } diff --git a/11_exceptions_part1_groundwork/src/_arch/aarch64/memory/mmu/translation_table.rs b/11_exceptions_part1_groundwork/src/_arch/aarch64/memory/mmu/translation_table.rs index f38d0895..eba8e12b 100644 --- a/11_exceptions_part1_groundwork/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/11_exceptions_part1_groundwork/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -235,7 +235,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } diff --git a/12_integrated_testing/src/_arch/aarch64/memory/mmu/translation_table.rs b/12_integrated_testing/src/_arch/aarch64/memory/mmu/translation_table.rs index 73a93ff7..665631f4 100644 --- a/12_integrated_testing/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/12_integrated_testing/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -235,7 +235,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } diff --git a/13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/translation_table.rs b/13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/translation_table.rs index 73a93ff7..665631f4 100644 --- a/13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -235,7 +235,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } diff --git a/14_virtual_mem_part2_mmio_remap/README.md b/14_virtual_mem_part2_mmio_remap/README.md index 6d35086f..85aa5138 100644 --- a/14_virtual_mem_part2_mmio_remap/README.md +++ b/14_virtual_mem_part2_mmio_remap/README.md @@ -659,7 +659,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/trans + phys_pages: &PageSliceDescriptor, + attr: &AttributeFields, + ) -> Result<(), &'static str> { -+ assert_eq!(self.initialized, true, "Translation tables not initialized"); ++ assert!(self.initialized, "Translation tables not initialized"); + + let p = phys_pages.as_slice(); + let v = virt_pages.as_slice(); @@ -700,7 +700,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/_arch/aarch64/memory/mmu/trans + &mut self, + num_pages: usize, + ) -> Result, &'static str> { -+ assert_eq!(self.initialized, true, "Translation tables not initialized"); ++ assert!(self.initialized, "Translation tables not initialized"); + + if num_pages == 0 { + return Err("num_pages == 0"); @@ -2213,7 +2213,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/main.rs 14_virtual_mem_part2_m diff -uNr 13_exceptions_part2_peripheral_IRQs/src/memory/mmu/mapping_record.rs 14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs --- 13_exceptions_part2_peripheral_IRQs/src/memory/mmu/mapping_record.rs +++ 14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs -@@ -0,0 +1,221 @@ +@@ -0,0 +1,216 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2020-2021 Andre Richter @@ -2334,12 +2334,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/memory/mmu/mapping_record.rs 1 + ); + info!(" -------------------------------------------------------------------------------------------------------------------------------------------"); + -+ for i in self -+ .inner -+ .iter() -+ .filter(|x| x.is_some()) -+ .map(|x| x.unwrap()) -+ { ++ for i in self.inner.iter().flatten() { + let virt_start = i.virt_start_addr; + let virt_end_inclusive = virt_start + i.phys_pages.size() - 1; + let phys_start = i.phys_pages.start_addr(); @@ -2418,7 +2413,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/memory/mmu/mapping_record.rs 1 + mmio_descriptor: &MMIODescriptor, + new_user: &'static str, +) -> Option> { -+ let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); ++ let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); + + KERNEL_MAPPING_RECORD.write(|mr| { + let dup = mr.find_duplicate(&phys_pages)?; @@ -3068,7 +3063,7 @@ diff -uNr 13_exceptions_part2_peripheral_IRQs/src/memory/mmu.rs 14_virtual_mem_p + name: &'static str, + mmio_descriptor: &MMIODescriptor, +) -> Result, &'static str> { -+ let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); ++ let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); + let offset_into_start_page = + mmio_descriptor.start_addr().into_usize() & bsp::memory::mmu::KernelGranule::MASK; + diff --git a/14_virtual_mem_part2_mmio_remap/src/_arch/aarch64/memory/mmu/translation_table.rs b/14_virtual_mem_part2_mmio_remap/src/_arch/aarch64/memory/mmu/translation_table.rs index 15784a1b..df741361 100644 --- a/14_virtual_mem_part2_mmio_remap/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/14_virtual_mem_part2_mmio_remap/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -237,7 +237,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } @@ -364,7 +364,7 @@ impl memory::mmu::translation_table::interface::Transla phys_pages: &PageSliceDescriptor, attr: &AttributeFields, ) -> Result<(), &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); let p = phys_pages.as_slice(); let v = virt_pages.as_slice(); @@ -399,7 +399,7 @@ impl memory::mmu::translation_table::interface::Transla &mut self, num_pages: usize, ) -> Result, &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); if num_pages == 0 { return Err("num_pages == 0"); diff --git a/14_virtual_mem_part2_mmio_remap/src/memory/mmu.rs b/14_virtual_mem_part2_mmio_remap/src/memory/mmu.rs index 360e149a..9f10ad72 100644 --- a/14_virtual_mem_part2_mmio_remap/src/memory/mmu.rs +++ b/14_virtual_mem_part2_mmio_remap/src/memory/mmu.rs @@ -182,7 +182,7 @@ pub unsafe fn kernel_map_mmio( name: &'static str, mmio_descriptor: &MMIODescriptor, ) -> Result, &'static str> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); let offset_into_start_page = mmio_descriptor.start_addr().into_usize() & bsp::memory::mmu::KernelGranule::MASK; diff --git a/14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs b/14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs index eab62fb3..16c27e38 100644 --- a/14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs +++ b/14_virtual_mem_part2_mmio_remap/src/memory/mmu/mapping_record.rs @@ -118,12 +118,7 @@ impl MappingRecord { ); info!(" -------------------------------------------------------------------------------------------------------------------------------------------"); - for i in self - .inner - .iter() - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) - { + for i in self.inner.iter().flatten() { let virt_start = i.virt_start_addr; let virt_end_inclusive = virt_start + i.phys_pages.size() - 1; let phys_start = i.phys_pages.start_addr(); @@ -202,7 +197,7 @@ pub fn kernel_find_and_insert_mmio_duplicate( mmio_descriptor: &MMIODescriptor, new_user: &'static str, ) -> Option> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); KERNEL_MAPPING_RECORD.write(|mr| { let dup = mr.find_duplicate(&phys_pages)?; diff --git a/15_virtual_mem_part3_precomputed_tables/src/_arch/aarch64/memory/mmu/translation_table.rs b/15_virtual_mem_part3_precomputed_tables/src/_arch/aarch64/memory/mmu/translation_table.rs index 5f781bdd..6b7227b3 100644 --- a/15_virtual_mem_part3_precomputed_tables/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/15_virtual_mem_part3_precomputed_tables/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -236,7 +236,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } @@ -374,7 +374,7 @@ impl memory::mmu::translation_table::interface::Transla phys_pages: &PageSliceDescriptor, attr: &AttributeFields, ) -> Result<(), &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); let p = phys_pages.as_slice(); let v = virt_pages.as_slice(); @@ -409,7 +409,7 @@ impl memory::mmu::translation_table::interface::Transla &mut self, num_pages: usize, ) -> Result, &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); if num_pages == 0 { return Err("num_pages == 0"); diff --git a/15_virtual_mem_part3_precomputed_tables/src/memory/mmu.rs b/15_virtual_mem_part3_precomputed_tables/src/memory/mmu.rs index 969ae6dd..106d3a90 100644 --- a/15_virtual_mem_part3_precomputed_tables/src/memory/mmu.rs +++ b/15_virtual_mem_part3_precomputed_tables/src/memory/mmu.rs @@ -208,7 +208,7 @@ pub unsafe fn kernel_map_mmio( name: &'static str, mmio_descriptor: &MMIODescriptor, ) -> Result, &'static str> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); let offset_into_start_page = mmio_descriptor.start_addr().into_usize() & bsp::memory::mmu::KernelGranule::MASK; diff --git a/15_virtual_mem_part3_precomputed_tables/src/memory/mmu/mapping_record.rs b/15_virtual_mem_part3_precomputed_tables/src/memory/mmu/mapping_record.rs index eab62fb3..16c27e38 100644 --- a/15_virtual_mem_part3_precomputed_tables/src/memory/mmu/mapping_record.rs +++ b/15_virtual_mem_part3_precomputed_tables/src/memory/mmu/mapping_record.rs @@ -118,12 +118,7 @@ impl MappingRecord { ); info!(" -------------------------------------------------------------------------------------------------------------------------------------------"); - for i in self - .inner - .iter() - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) - { + for i in self.inner.iter().flatten() { let virt_start = i.virt_start_addr; let virt_end_inclusive = virt_start + i.phys_pages.size() - 1; let phys_start = i.phys_pages.start_addr(); @@ -202,7 +197,7 @@ pub fn kernel_find_and_insert_mmio_duplicate( mmio_descriptor: &MMIODescriptor, new_user: &'static str, ) -> Option> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); KERNEL_MAPPING_RECORD.write(|mr| { let dup = mr.find_duplicate(&phys_pages)?; diff --git a/16_virtual_mem_part4_higher_half_kernel/src/_arch/aarch64/memory/mmu/translation_table.rs b/16_virtual_mem_part4_higher_half_kernel/src/_arch/aarch64/memory/mmu/translation_table.rs index a58a3bb9..a2758b15 100644 --- a/16_virtual_mem_part4_higher_half_kernel/src/_arch/aarch64/memory/mmu/translation_table.rs +++ b/16_virtual_mem_part4_higher_half_kernel/src/_arch/aarch64/memory/mmu/translation_table.rs @@ -236,7 +236,7 @@ impl PageDescriptor { + STAGE1_PAGE_DESCRIPTOR::AF::True + STAGE1_PAGE_DESCRIPTOR::TYPE::Page + STAGE1_PAGE_DESCRIPTOR::VALID::True - + attribute_fields.clone().into(), + + (*attribute_fields).into(), ); Self { value: val.get() } @@ -401,7 +401,7 @@ impl phys_pages: &PageSliceDescriptor, attr: &AttributeFields, ) -> Result<(), &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); let p = phys_pages.as_slice(); let v = virt_pages.as_slice(); @@ -436,7 +436,7 @@ impl &mut self, num_pages: usize, ) -> Result, &'static str> { - assert_eq!(self.initialized, true, "Translation tables not initialized"); + assert!(self.initialized, "Translation tables not initialized"); if num_pages == 0 { return Err("num_pages == 0"); diff --git a/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu.rs b/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu.rs index d1a5a3e6..f9c40d35 100644 --- a/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu.rs +++ b/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu.rs @@ -213,7 +213,7 @@ pub unsafe fn kernel_map_mmio( name: &'static str, mmio_descriptor: &MMIODescriptor, ) -> Result, &'static str> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); let offset_into_start_page = mmio_descriptor.start_addr().into_usize() & bsp::memory::mmu::KernelGranule::MASK; diff --git a/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu/mapping_record.rs b/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu/mapping_record.rs index eab62fb3..16c27e38 100644 --- a/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu/mapping_record.rs +++ b/16_virtual_mem_part4_higher_half_kernel/src/memory/mmu/mapping_record.rs @@ -118,12 +118,7 @@ impl MappingRecord { ); info!(" -------------------------------------------------------------------------------------------------------------------------------------------"); - for i in self - .inner - .iter() - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) - { + for i in self.inner.iter().flatten() { let virt_start = i.virt_start_addr; let virt_end_inclusive = virt_start + i.phys_pages.size() - 1; let phys_start = i.phys_pages.start_addr(); @@ -202,7 +197,7 @@ pub fn kernel_find_and_insert_mmio_duplicate( mmio_descriptor: &MMIODescriptor, new_user: &'static str, ) -> Option> { - let phys_pages: PageSliceDescriptor = mmio_descriptor.clone().into(); + let phys_pages: PageSliceDescriptor = (*mmio_descriptor).into(); KERNEL_MAPPING_RECORD.write(|mr| { let dup = mr.find_duplicate(&phys_pages)?; diff --git a/X1_JTAG_boot/jtag_boot_rpi3.img b/X1_JTAG_boot/jtag_boot_rpi3.img index 30ce719cf6080dcd104be8b5465aa8aa91e66e95..96d8bfb1817aef0dfb5458871a1ea93582acea84 100755 GIT binary patch delta 2776 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 diff --git a/X1_JTAG_boot/jtag_boot_rpi4.img b/X1_JTAG_boot/jtag_boot_rpi4.img index 5e1e1bf7d6716daa5b88a735299e89c268faf47d..76531e6ff99de9580fcf1d1b05c8eed4404543ef 100755 GIT binary patch delta 2232 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