From 6db8b2bc728aa9552e56116c0f01824e4205a6d6 Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Sun, 7 Mar 2021 21:01:44 +0100 Subject: [PATCH] Update toolchain --- .rustfmt.toml | 2 +- 06_drivers_gpio_uart/README.md | 7 ++++--- 06_drivers_gpio_uart/src/main.rs | 1 + 07_uart_chainloader/README.md | 7 ++++--- 07_uart_chainloader/demo_payload_rpi3.img | Bin 6808 -> 6800 bytes 07_uart_chainloader/demo_payload_rpi4.img | Bin 6680 -> 6656 bytes 07_uart_chainloader/src/main.rs | 1 + 08_timestamps/README.md | 7 ++++--- 08_timestamps/src/main.rs | 1 + 09_hw_debug_JTAG/src/main.rs | 1 + 10_privilege_level/README.md | 6 +++--- 10_privilege_level/src/main.rs | 1 + .../README.md | 10 +++++----- .../src/main.rs | 1 + 12_exceptions_part1_groundwork/README.md | 6 +++--- 12_exceptions_part1_groundwork/src/main.rs | 1 + 13_integrated_testing/README.md | 12 +++++++----- 13_integrated_testing/src/lib.rs | 1 + 14_exceptions_part2_peripheral_IRQs/README.md | 6 +++--- .../src/lib.rs | 1 + 15_virtual_mem_part2_mmio_remap/Makefile | 2 +- 15_virtual_mem_part2_mmio_remap/README.md | 6 +++--- 15_virtual_mem_part2_mmio_remap/src/lib.rs | 1 + X1_JTAG_boot/jtag_boot_rpi3.img | Bin 8144 -> 8128 bytes X1_JTAG_boot/jtag_boot_rpi4.img | Bin 6864 -> 6832 bytes X1_JTAG_boot/src/main.rs | 1 + rust-toolchain | 2 +- 27 files changed, 50 insertions(+), 34 deletions(-) diff --git a/.rustfmt.toml b/.rustfmt.toml index 25a74537..5e98361e 100644 --- a/.rustfmt.toml +++ b/.rustfmt.toml @@ -1,6 +1,6 @@ newline_style = "Unix" edition = "2018" -merge_imports = true +imports_granularity = "Crate" format_code_in_doc_comments = true normalize_comments = true wrap_comments = true diff --git a/06_drivers_gpio_uart/README.md b/06_drivers_gpio_uart/README.md index 9bb29be5..a4176ca5 100644 --- a/06_drivers_gpio_uart/README.md +++ b/06_drivers_gpio_uart/README.md @@ -1302,15 +1302,16 @@ diff -uNr 05_safe_globals/src/driver.rs 06_drivers_gpio_uart/src/driver.rs diff -uNr 05_safe_globals/src/main.rs 06_drivers_gpio_uart/src/main.rs --- 05_safe_globals/src/main.rs +++ 06_drivers_gpio_uart/src/main.rs -@@ -107,6 +107,7 @@ +@@ -107,6 +107,8 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html ++#![allow(clippy::clippy::upper_case_acronyms)] +#![feature(const_fn_fn_ptr_basics)] #![feature(format_args_nl)] #![feature(panic_info_message)] #![feature(trait_alias)] -@@ -116,6 +117,7 @@ +@@ -116,6 +118,7 @@ mod bsp; mod console; mod cpu; @@ -1318,7 +1319,7 @@ diff -uNr 05_safe_globals/src/main.rs 06_drivers_gpio_uart/src/main.rs mod memory; mod panic_wait; mod print; -@@ -127,16 +129,49 @@ +@@ -127,16 +130,49 @@ /// # Safety /// /// - Only a single core must be active and running this function. diff --git a/06_drivers_gpio_uart/src/main.rs b/06_drivers_gpio_uart/src/main.rs index 46a89031..627b5b59 100644 --- a/06_drivers_gpio_uart/src/main.rs +++ b/06_drivers_gpio_uart/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![feature(const_fn_fn_ptr_basics)] #![feature(format_args_nl)] #![feature(panic_info_message)] diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index 4cf6d918..91242143 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -406,7 +406,7 @@ diff -uNr 06_drivers_gpio_uart/src/cpu.rs 07_uart_chainloader/src/cpu.rs diff -uNr 06_drivers_gpio_uart/src/main.rs 07_uart_chainloader/src/main.rs --- 06_drivers_gpio_uart/src/main.rs +++ 07_uart_chainloader/src/main.rs -@@ -102,12 +102,16 @@ +@@ -102,13 +102,17 @@ //! //! 1. The kernel's entry point is the function [`cpu::boot::arch_boot::_start()`]. //! - It is implemented in `src/_arch/__arch_name__/cpu/boot.rs`. @@ -418,13 +418,14 @@ diff -uNr 06_drivers_gpio_uart/src/main.rs 07_uart_chainloader/src/main.rs +//! [`relocate::relocate_self()`]: relocate/fn.relocate_self.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html + #![allow(clippy::clippy::upper_case_acronyms)] +#![feature(asm)] #![feature(const_fn_fn_ptr_basics)] +#![feature(core_intrinsics)] #![feature(format_args_nl)] #![feature(panic_info_message)] #![feature(trait_alias)] -@@ -121,6 +125,7 @@ +@@ -122,6 +126,7 @@ mod memory; mod panic_wait; mod print; @@ -432,7 +433,7 @@ diff -uNr 06_drivers_gpio_uart/src/main.rs 07_uart_chainloader/src/main.rs mod runtime_init; mod synchronization; -@@ -149,29 +154,49 @@ +@@ -150,29 +155,49 @@ fn kernel_main() -> ! { use bsp::console::console; use console::interface::All; diff --git a/07_uart_chainloader/demo_payload_rpi3.img b/07_uart_chainloader/demo_payload_rpi3.img index 83fe7bffab6b25be79d8cd89f4803003add22f0b..13cf8aa1ed21d4896c05b5c25caf8d17c69289fa 100755 GIT binary patch delta 2749 zcmZ`)TWl298UD}AUS<~G?Y$aUJBu;v1SmCTair9ou=F zC6oSB-XMiop*Z|y4*GRY{m-=P&wO6tHarsntIoRxi%?kTM`SW3N$ z`)ok5)4@?Y#e#O~oy1;{gQ?FE)nw%A)THcfnvy-K*LcC+^X$t+gQE|fk7)N<+UKy( zLwg;x3vzAh0sd|H?{<>@T{AlFe;6G37UiPo$baw7&j$fUPE3k{L8qf$p?icW{X zwVna~tn5z(nLmH8@oa$Otf0&)J_Yp%M}2y>@jWBsWQHi@UnLr>qq;wh%3T!`TIE}R z)N;SLGkV~6cSfI_;}4uaYyTP|XhY$SS5R!AOe>_M>VX^p_Bd!{Ms}ylz}MZ{<_#XI zx~-P&xazKHF82hQZ?VdzkE2iblFI+0coOe3SH4c6*iE@K^@e+N^X&z5(^=36F}`cp zT7RjM{*fCdR#26RZoTo)j5%QX7Gk?8yHZQ^5a>d0lqi;j+X}cf$K>9n~B)0#TZ9IZUVP3GAvUpFPEea0MG$;FQPIUX=Bwz<6@U2ilz4FHg_?$ z;T-^-hF&S0B%u2afDTtt>~(4@TXr2>_`Co9?)mtXBv4Dx$0u&GxS@!sII0+m=;uHo)Vd|AG49~QDDzFv9GmHdvVR*){i}rT{_q?p6viKM6ui8mh z(1j6v9{zAykSTmcNv#cu-NfT1HM@A{Vw;iI-2HOYSm?TZ0i88*6Um=J6-9DR8Ms{+T;(^waRGTj6Dq= z?=N{SF|W`_H@fcdPR$51cm7we_76=gqmh1>W`s+$!XzT96Z2L=kwXCJBT5eK!7zu) z^#ZPlY?GGGMkt;AKx@t3pw{d^mHmgZ}lSj*|Lm6kKc%JS3g3 z=V!_rzM658p)@3nFhFIjnuseWdxGiV7d-m30O52jYSIcl16SEboAC^CGu>zxa4v?A zFV{`HB_dZjnd!NZY|LP->-aZ<@>^oLXmFF zt$-IETd51ttq>JRDpv>Ig^1>$h+qqrKogDzg@uL6K+`#}hi%k?i#w@4)lm?8lV3|u zQ(dHuX=ztSM*%agyE=G#)p|EhJ-CfdgOX^W-Y>C%KuHJxVO6A+8uY#KkiOgA*ZG4? zs2G;ZTr8@vIbiGSR9ia=O?EB4ANO{Xozm+4zD}i;->urxyrH8IZt1{GD0vkvNzlNc zCyCbRyP?@WyhaZq6{1CoaYB~AT)jLn3;6wrNcrULgMCgKaX~4E{A@kP&sU$VLXOw? z;Rw`cMBL|A^Bpzy%*9`+!E5(#W-%#atN41irvxuoHeolWE|ZQLxNEkH$VM9$Bhyyv zf)R(?V!OgHV||^JY1GB#lfk%6;uHVMD$PJ~F(3+PYHB|^nn)`|`6YLV5Bq#S_N?)L z;zV*jvrwVp%JQh^YNh7?Pwp{Z@AYojD_&VF^k;D$v(89Zaec))W7djmfba9JPrT?` z)T*$k*Dc#i9-|f?9a~)MtTU#exc*z-XYrR%R9I)cq{Zd2&K4?(u5-Wd8~$$x7Gd;T z?4#ECB7e&lRFAqXE+6xKQH_^dka?v)BIW#itAFQ)CE}kg{FRnJv1|B#Z_&#w`gMNI U|1GBRXdqIWw44=p{z@S9PvL!Hn*aa+ delta 2883 zcmaJ@ZERE58Gg^bcI<1M?>Mmo#CA+boYHn9Bu=K$+=Pz}SjU!nSy9L0u%RYItPQYg z-9~NbCV@|A8H<^|HEM59Pxr3@gp-VUF=r5`}jZskwua5`T#)Q$ftnSlpq(NwvcP zN*jl3w6yF^b{5lc&~>slXjPBALsa&S!NK++#TlQI7bhdkdt(lmG`?Gis#0=gazd_Y zo|LPT`-zT5h}wAC`orkUn2bHL{YQBJ{}(=M3ZFHFH$wQJjkE!y>w5d6uInBvX&pA2 zNfCu3_1$`Zn>uPQS98QVZ>WZ?ZQL+wUdNhAs5sAPJxGkq*+TrTwd%RltSz+Xo87t# zQrjukbH0dXMl2K_s8Dk$xe8`@nhVm5ReyrC1??edueS1MY<27mf8Mq@>bnm?z1{k3 zQ9%&iGd>1iJ{DAM3bM8R7J}ff=HHm_*V}0Hr<2ri9CJH-uHdmFUcpmtE#3Hmp0Y7r z1UfCzQ6KsKIVShrNOkjTzUPwnA{YK~kNQ)5*7kPvHMpk}arIYGI9{UWl2TI$we`kotfKj5*V^HTlfrMY;_)HK(U}sz zB|DSCA$_cPDz=Ei({ge0uxqUS_Po({k~yZXETsy9o$p)KXvez>X)`!*2MTWPlZP)q zGQw6Uy#r%sWJgl01+dmBIi^I+1et_M=H^9tc+KYp{M`jS)_(U{0pInh5x$4@>u}OE zjOk;}DY8*`3i@_}(BCZE=h~uR^p45suvP7N3xqy~ff&xyCdCwFAp`xyK3 z5Wce@DdRj(DQMt-K*dp^K~_25#O(1bgho-J8983N2-zd5bZB3V_AV-Q zCo1)jQXHR^?a3G_RTNVe-xhFlAdT%Pq8hw=`HvTQqr&1CO6k`qn+aGjiCVT7nCbV>(2mX-Vx!e?lGUOPIINXy)`A`UVj>1%(d&gBA8Typ`)@ z?kPX!_FF&Setlraz?_|_xgZS51W3=E-m8B^biM@65%F7CTM(o^A?PB)4?+JWM|yk~ zom$#D$IliItUeCLyX#4t1>?x+s6K%z7wsk@QD~uqqypVKi$`_$8eqFgTZl%Cf2U+~ zAY~iX(JvBdoDBL`YKVTqi44dBJ;c7M9qL-bD@%imTjq^pKJ*Uqsk(%Cs^q;vb~T6C z@b^oWcAsW+R9riSR#}zoHH>5TH?P&_7ppmA4bwyn)A?9YGKC9g5;5pP%zQqugFgQl z-%%Qnq4{sg?rUbfZQ8Ivk#D zvyV(eTt-QYO10l#xp#c=F&>8f5HKB7O@IqJl^6$R~ zh+0G;vHh6NDR2I&7kzya*8NMSTqa=Aji^=4VExE)P2iq4trs}PVm+ib<+D45!k)k*GTlR@=C&fe?aNdh;X%sV zv8f~n_3zI-musGy@|0->{!j`m`Kad=_973~hWM+szJCLXxuvoI diff --git a/07_uart_chainloader/demo_payload_rpi4.img b/07_uart_chainloader/demo_payload_rpi4.img index f2dec5cba4e85d94d9b3a61918b90cca5c7be02b..a0b618f8d63c28f5a04c2702fecaa5f14a043cac 100755 GIT binary patch delta 3803 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 AnE(I) diff --git a/07_uart_chainloader/src/main.rs b/07_uart_chainloader/src/main.rs index 82a6ec58..4fc6449a 100644 --- a/07_uart_chainloader/src/main.rs +++ b/07_uart_chainloader/src/main.rs @@ -109,6 +109,7 @@ //! [`relocate::relocate_self()`]: relocate/fn.relocate_self.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![feature(asm)] #![feature(const_fn_fn_ptr_basics)] #![feature(core_intrinsics)] diff --git a/08_timestamps/README.md b/08_timestamps/README.md index af4b8055..43c16538 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -499,7 +499,7 @@ diff -uNr 07_uart_chainloader/src/cpu.rs 08_timestamps/src/cpu.rs diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs --- 07_uart_chainloader/src/main.rs +++ 08_timestamps/src/main.rs -@@ -102,16 +102,12 @@ +@@ -102,17 +102,13 @@ //! //! 1. The kernel's entry point is the function [`cpu::boot::arch_boot::_start()`]. //! - It is implemented in `src/_arch/__arch_name__/cpu/boot.rs`. @@ -511,13 +511,14 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs -//! [`relocate::relocate_self()`]: relocate/fn.relocate_self.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html + #![allow(clippy::clippy::upper_case_acronyms)] -#![feature(asm)] #![feature(const_fn_fn_ptr_basics)] -#![feature(core_intrinsics)] #![feature(format_args_nl)] #![feature(panic_info_message)] #![feature(trait_alias)] -@@ -125,9 +121,9 @@ +@@ -126,9 +122,9 @@ mod memory; mod panic_wait; mod print; @@ -528,7 +529,7 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs /// Early init code. /// -@@ -152,51 +148,31 @@ +@@ -153,51 +149,31 @@ /// The main function running after the early init. fn kernel_main() -> ! { diff --git a/08_timestamps/src/main.rs b/08_timestamps/src/main.rs index efcd9880..14e1d0ab 100644 --- a/08_timestamps/src/main.rs +++ b/08_timestamps/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![feature(const_fn_fn_ptr_basics)] #![feature(format_args_nl)] #![feature(panic_info_message)] diff --git a/09_hw_debug_JTAG/src/main.rs b/09_hw_debug_JTAG/src/main.rs index efcd9880..14e1d0ab 100644 --- a/09_hw_debug_JTAG/src/main.rs +++ b/09_hw_debug_JTAG/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![feature(const_fn_fn_ptr_basics)] #![feature(format_args_nl)] #![feature(panic_info_message)] diff --git a/10_privilege_level/README.md b/10_privilege_level/README.md index 2e88c083..0d58e281 100644 --- a/10_privilege_level/README.md +++ b/10_privilege_level/README.md @@ -484,7 +484,7 @@ diff -uNr 09_hw_debug_JTAG/src/exception.rs 10_privilege_level/src/exception.rs diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs --- 09_hw_debug_JTAG/src/main.rs +++ 10_privilege_level/src/main.rs -@@ -118,6 +118,7 @@ +@@ -119,6 +119,7 @@ mod console; mod cpu; mod driver; @@ -492,7 +492,7 @@ diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs mod memory; mod panic_wait; mod print; -@@ -148,12 +149,20 @@ +@@ -149,12 +150,20 @@ /// The main function running after the early init. fn kernel_main() -> ! { @@ -513,7 +513,7 @@ diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs info!( "Architectural timer resolution: {} ns", time::time_manager().resolution().as_nanos() -@@ -168,11 +177,15 @@ +@@ -169,11 +178,15 @@ info!(" {}. {}", i + 1, driver.compatible()); } diff --git a/10_privilege_level/src/main.rs b/10_privilege_level/src/main.rs index 193ff7a6..181a9aa5 100644 --- a/10_privilege_level/src/main.rs +++ b/10_privilege_level/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![feature(const_fn_fn_ptr_basics)] #![feature(format_args_nl)] #![feature(panic_info_message)] diff --git a/11_virtual_mem_part1_identity_mapping/README.md b/11_virtual_mem_part1_identity_mapping/README.md index 726012e1..7b822f68 100644 --- a/11_virtual_mem_part1_identity_mapping/README.md +++ b/11_virtual_mem_part1_identity_mapping/README.md @@ -1006,10 +1006,10 @@ diff -uNr 10_privilege_level/src/bsp.rs 11_virtual_mem_part1_identity_mapping/sr diff -uNr 10_privilege_level/src/main.rs 11_virtual_mem_part1_identity_mapping/src/main.rs --- 10_privilege_level/src/main.rs +++ 11_virtual_mem_part1_identity_mapping/src/main.rs -@@ -107,7 +107,10 @@ - //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html +@@ -108,7 +108,10 @@ //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html + #![allow(clippy::clippy::upper_case_acronyms)] +#![allow(incomplete_features)] #![feature(const_fn_fn_ptr_basics)] +#![feature(const_generics)] @@ -1017,7 +1017,7 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_mem_part1_identity_mapping/s #![feature(format_args_nl)] #![feature(panic_info_message)] #![feature(trait_alias)] -@@ -131,9 +134,18 @@ +@@ -132,9 +135,18 @@ /// # Safety /// /// - Only a single core must be active and running this function. @@ -1037,7 +1037,7 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_mem_part1_identity_mapping/s for i in bsp::driver::driver_manager().all_device_drivers().iter() { if let Err(x) = i.init() { -@@ -157,6 +169,9 @@ +@@ -158,6 +170,9 @@ info!("Booting on: {}", bsp::board_name()); @@ -1047,7 +1047,7 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_mem_part1_identity_mapping/s let (_, privilege_level) = exception::current_privilege_level(); info!("Current privilege level: {}", privilege_level); -@@ -180,6 +195,13 @@ +@@ -181,6 +196,13 @@ info!("Timer test, spinning for 1 second"); time::time_manager().spin_for(Duration::from_secs(1)); diff --git a/11_virtual_mem_part1_identity_mapping/src/main.rs b/11_virtual_mem_part1_identity_mapping/src/main.rs index bfc7d5e4..9f755c9b 100644 --- a/11_virtual_mem_part1_identity_mapping/src/main.rs +++ b/11_virtual_mem_part1_identity_mapping/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(const_fn_fn_ptr_basics)] #![feature(const_generics)] diff --git a/12_exceptions_part1_groundwork/README.md b/12_exceptions_part1_groundwork/README.md index c5d0f9f1..53c953df 100644 --- a/12_exceptions_part1_groundwork/README.md +++ b/12_exceptions_part1_groundwork/README.md @@ -967,7 +967,7 @@ diff -uNr 11_virtual_mem_part1_identity_mapping/src/exception.rs 12_exceptions_p diff -uNr 11_virtual_mem_part1_identity_mapping/src/main.rs 12_exceptions_part1_groundwork/src/main.rs --- 11_virtual_mem_part1_identity_mapping/src/main.rs +++ 12_exceptions_part1_groundwork/src/main.rs -@@ -112,6 +112,7 @@ +@@ -113,6 +113,7 @@ #![feature(const_generics)] #![feature(const_panic)] #![feature(format_args_nl)] @@ -975,7 +975,7 @@ diff -uNr 11_virtual_mem_part1_identity_mapping/src/main.rs 12_exceptions_part1_ #![feature(panic_info_message)] #![feature(trait_alias)] #![no_main] -@@ -143,6 +144,8 @@ +@@ -144,6 +145,8 @@ use driver::interface::DriverManager; use memory::mmu::interface::MMU; @@ -984,7 +984,7 @@ diff -uNr 11_virtual_mem_part1_identity_mapping/src/main.rs 12_exceptions_part1_ if let Err(string) = memory::mmu::mmu().init() { panic!("MMU: {}", string); } -@@ -195,13 +198,28 @@ +@@ -196,13 +199,28 @@ info!("Timer test, spinning for 1 second"); time::time_manager().spin_for(Duration::from_secs(1)); diff --git a/12_exceptions_part1_groundwork/src/main.rs b/12_exceptions_part1_groundwork/src/main.rs index 4aa47c6e..9dee3a44 100644 --- a/12_exceptions_part1_groundwork/src/main.rs +++ b/12_exceptions_part1_groundwork/src/main.rs @@ -107,6 +107,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(const_fn_fn_ptr_basics)] #![feature(const_generics)] diff --git a/13_integrated_testing/README.md b/13_integrated_testing/README.md index cd03c27e..383b0a0d 100644 --- a/13_integrated_testing/README.md +++ b/13_integrated_testing/README.md @@ -1157,7 +1157,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/exception.rs 13_integrated_testing/ diff -uNr 12_exceptions_part1_groundwork/src/lib.rs 13_integrated_testing/src/lib.rs --- 12_exceptions_part1_groundwork/src/lib.rs +++ 13_integrated_testing/src/lib.rs -@@ -0,0 +1,169 @@ +@@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2021 Andre Richter @@ -1269,6 +1269,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/lib.rs 13_integrated_testing/src/li +//! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html +//! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html + ++#![allow(clippy::clippy::upper_case_acronyms)] +#![allow(incomplete_features)] +#![feature(const_fn_fn_ptr_basics)] +#![feature(const_generics)] @@ -1331,7 +1332,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/lib.rs 13_integrated_testing/src/li diff -uNr 12_exceptions_part1_groundwork/src/main.rs 13_integrated_testing/src/main.rs --- 12_exceptions_part1_groundwork/src/main.rs +++ 13_integrated_testing/src/main.rs -@@ -6,129 +6,12 @@ +@@ -6,130 +6,12 @@ #![doc(html_logo_url = "https://git.io/JeGIp")] //! The `kernel` binary. @@ -1436,6 +1437,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/main.rs 13_integrated_testing/src/m -//! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html -//! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html - +-#![allow(clippy::clippy::upper_case_acronyms)] -#![allow(incomplete_features)] -#![feature(const_fn_fn_ptr_basics)] -#![feature(const_generics)] @@ -1463,7 +1465,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/main.rs 13_integrated_testing/src/m /// Early init code. /// -@@ -140,6 +23,7 @@ +@@ -141,6 +23,7 @@ /// - Without it, any atomic operations, e.g. the yet-to-be-introduced spinlocks in the device /// drivers (which currently employ NullLocks instead of spinlocks), will fail to work on /// the RPi SoCs. @@ -1471,7 +1473,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/main.rs 13_integrated_testing/src/m unsafe fn kernel_init() -> ! { use driver::interface::DriverManager; use memory::mmu::interface::MMU; -@@ -166,9 +50,7 @@ +@@ -167,9 +50,7 @@ fn kernel_main() -> ! { use bsp::console::console; use console::interface::All; @@ -1481,7 +1483,7 @@ diff -uNr 12_exceptions_part1_groundwork/src/main.rs 13_integrated_testing/src/m info!("Booting on: {}", bsp::board_name()); -@@ -195,31 +77,6 @@ +@@ -196,31 +77,6 @@ info!(" {}. {}", i + 1, driver.compatible()); } diff --git a/13_integrated_testing/src/lib.rs b/13_integrated_testing/src/lib.rs index d427375c..3e0a9eea 100644 --- a/13_integrated_testing/src/lib.rs +++ b/13_integrated_testing/src/lib.rs @@ -109,6 +109,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(const_fn_fn_ptr_basics)] #![feature(const_generics)] diff --git a/14_exceptions_part2_peripheral_IRQs/README.md b/14_exceptions_part2_peripheral_IRQs/README.md index 060a58e2..c04cc9ae 100644 --- a/14_exceptions_part2_peripheral_IRQs/README.md +++ b/14_exceptions_part2_peripheral_IRQs/README.md @@ -2296,9 +2296,9 @@ diff -uNr 13_integrated_testing/src/exception/asynchronous.rs 14_exceptions_part diff -uNr 13_integrated_testing/src/lib.rs 14_exceptions_part2_peripheral_IRQs/src/lib.rs --- 13_integrated_testing/src/lib.rs +++ 14_exceptions_part2_peripheral_IRQs/src/lib.rs -@@ -110,9 +110,11 @@ - //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +@@ -111,9 +111,11 @@ + #![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] +#![feature(asm)] #![feature(const_fn_fn_ptr_basics)] @@ -2308,7 +2308,7 @@ diff -uNr 13_integrated_testing/src/lib.rs 14_exceptions_part2_peripheral_IRQs/s #![feature(format_args_nl)] #![feature(global_asm)] #![feature(linkage)] -@@ -136,6 +138,7 @@ +@@ -137,6 +139,7 @@ pub mod exception; pub mod memory; pub mod print; diff --git a/14_exceptions_part2_peripheral_IRQs/src/lib.rs b/14_exceptions_part2_peripheral_IRQs/src/lib.rs index 2d12290f..fd4bdde5 100644 --- a/14_exceptions_part2_peripheral_IRQs/src/lib.rs +++ b/14_exceptions_part2_peripheral_IRQs/src/lib.rs @@ -109,6 +109,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(asm)] #![feature(const_fn_fn_ptr_basics)] diff --git a/15_virtual_mem_part2_mmio_remap/Makefile b/15_virtual_mem_part2_mmio_remap/Makefile index 4f7561db..206b3d97 100644 --- a/15_virtual_mem_part2_mmio_remap/Makefile +++ b/15_virtual_mem_part2_mmio_remap/Makefile @@ -170,7 +170,7 @@ objdump: $(KERNEL_ELF) @$(DOCKER_ELFTOOLS) $(OBJDUMP_BINARY) --disassemble --demangle $(KERNEL_ELF) | rustfilt nm: $(KERNEL_ELF) - @$(DOCKER_ELFTOOLS) $(NM_BINARY) --demangle --print-size $(KERNEL_ELF) | sort | rustfilt + $(DOCKER_ELFTOOLS) $(NM_BINARY) --demangle --print-size $(KERNEL_ELF) | sort | rustfilt # For rust-analyzer check: diff --git a/15_virtual_mem_part2_mmio_remap/README.md b/15_virtual_mem_part2_mmio_remap/README.md index 9adbe9c2..65127bd6 100644 --- a/15_virtual_mem_part2_mmio_remap/README.md +++ b/15_virtual_mem_part2_mmio_remap/README.md @@ -1939,15 +1939,15 @@ diff -uNr 14_exceptions_part2_peripheral_IRQs/src/driver.rs 15_virtual_mem_part2 diff -uNr 14_exceptions_part2_peripheral_IRQs/src/lib.rs 15_virtual_mem_part2_mmio_remap/src/lib.rs --- 14_exceptions_part2_peripheral_IRQs/src/lib.rs +++ 15_virtual_mem_part2_mmio_remap/src/lib.rs -@@ -111,6 +111,7 @@ - +@@ -112,6 +112,7 @@ + #![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(asm)] +#![feature(const_fn)] #![feature(const_fn_fn_ptr_basics)] #![feature(const_generics)] #![feature(const_panic)] -@@ -132,6 +133,7 @@ +@@ -133,6 +134,7 @@ mod synchronization; pub mod bsp; diff --git a/15_virtual_mem_part2_mmio_remap/src/lib.rs b/15_virtual_mem_part2_mmio_remap/src/lib.rs index a509d86f..608d4b07 100644 --- a/15_virtual_mem_part2_mmio_remap/src/lib.rs +++ b/15_virtual_mem_part2_mmio_remap/src/lib.rs @@ -109,6 +109,7 @@ //! [`cpu::boot::arch_boot::_start()`]: cpu/boot/arch_boot/fn._start.html //! [`runtime_init::runtime_init()`]: runtime_init/fn.runtime_init.html +#![allow(clippy::clippy::upper_case_acronyms)] #![allow(incomplete_features)] #![feature(asm)] #![feature(const_fn)] diff --git a/X1_JTAG_boot/jtag_boot_rpi3.img b/X1_JTAG_boot/jtag_boot_rpi3.img index 4cd4401535b2b3cb1f5cbf807c72b1f69637cedd..d4148b720f230a78479ea44cdc8791b9c28bc753 100755 GIT binary patch delta 2920 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 delta 3619 zcmai0du&tJ8ULc}vytS+Wn_Ds=6x8;)4U~N;iRk=`rqQj%!q+Pn~ajbLyVBz>!9+c zrBr?ofbR|R{rj*P)dzo=NFjsWUZGBAPC_t}S?cNMu>R~{Wu53tL^61ffs=YDJ?1{8)?03N++c#jp z*2Q0Vtx6jIP`lR`<7nJ$l(M~u+H9mObAAHH*UCx$0uz}zt@)IuIg@YzM=ekA;fos2 zo!@V$ibN~qIw=1Cqk(1FDoWC73RAj<_BV_D%QLoCB{iRT;>EwA21_B zaOXa_6M@N2xYt-D`RfFd`@qR2E0u@AXFJvdBxa%*o9t4{5cZCO&oDxN32PCyIe{M@ zY<6I?K-3h-EGQ8cwNM|3OoJn4)CQw7h=pMa%1(jD=fERQJBMLBrh(}Nk1_Dr!zda>j5J0V5gjARsf77gxGCkI{5k_y zsk~YChH|3lu_8Ck{!y_SpZ>_hreCSdMi(QX!}K+C-p~`rVGV zs@+Cu|Jy`MH+Ofp^oo|)JYSROGLZR2V(laQ_Srv`x3YriLILwu1qGk%s@TG~@QBPMF zwdS`tQ|2t{is0?9j8epZR3v#80@q;R(r&*0G;-Srqu1c_EN@D%wR)@t45myHwa%Q0 z>&{$4VQsjT$6qhtv3B_1d3@^^TIdGWClUG#f(dh$43$tQ1ABdN=))q*d~*aIy`A$& zxhhsTPr=4A*k?6&1@};_X^e6GEoFXo>6{hdWNAipn4sO$K3cNX3TwtilKJgob5~lC&bVT5)stSG#{%rqn=p( z^mbLqM^Qt4sG%XTG&aWzi70A_WqTUGi{P6H87LqFofx+%hs?E{RXJ&{X^=SbDZw`N zGo%~K=1v^m-dw7&nk%H5wnj;s?I^@r&!=14)XyJpRTsmjkFZvt9J6e8IB|DvM~c0$ zO;T$)N9NrQTZ()je~kJWa@xrpk5Ki%a*3~^=yTxF&XbK%Oa$?ZMc=LPgXcC}B}lR7;*sD40n zdGt(MgU36TlRO8HJ4Ykx6nY^m zR9qFlLUAVR+f*(VQ7bn9+eUJsn4`+>C0py0CF81y_*0N{pMOBcxy3CwyEM?fzkX02 zs;f}~Wp4Za1?^22o-yQ-R0G<9M70-{@0YF2cj$DXJ8vr62;dzzobvZ2cWrQUbb#G{ z`Nm~W+*;J${B-L^HHX`fzX?;g{osBg$s5pfgv7rVG^fi2*WpmzNR6T`t!l&l5T}Vc znTwMA5*pu4$V3d3AymCxLTD=_)oo?%PDr>w1A>A+dm^={jipLRjV@OnwmPk|c3d7s zDhnBHKi+Xt*=enfNXz6Tg1&YuALusd2j}^>8*ezjxQ?=y0{jJca@_?1e|t-4%q0Ch z*sAx?FfiG}var#p3WM(q z3k%Oqii4%YZj23w%r!IhC2mGTsBFj0z@GTTLs^ee8jlr4 zgFWc$9%F>Y1uTk`2#WupaRw}ah1NznA626qKz9;RE;)l6-Fat{Zn+DJs&!{>V}C;P z43B#=^t6_DKs(KyU-VLT8V(8ko}loD_Xb?JbVM}&c;k6xzb(?VdzH*y+NssNszs0| z^(c+p-1sF&hrtm}a+$K;{&M6HUL?8z3r@fbB_|lULjX#cz;%?z$QRn0uMjq}GEbOm zRSv@l>(vP(JPtoz)SNhwgis{mwIi@}&L76aYMJArK}B-h$7&<@xoH*oXblw;&H|ss z2AA;V|9?4dHsn`U=sR|Ua?r8(L`zixn3JM*XMT=D&wURK3_L%8UtWE^LSO$nu0h{N zKgoTsDzg>$-rrK0*OqsUXq`Ssk>|dzTYpe_#CfgbSan`1uA@)r^Aq~~zlP|@%RQ-& z7Mt>F<*MZcxNegQ#&0dn!z-(lk1AK;&6uqWwEsWwIh`-u(YcR}68