From 8c2b18e8cec2dc21564920358410e1c609abcff8 Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Wed, 6 Nov 2019 22:45:29 +0100 Subject: [PATCH] More robust, self-contained UART printing in panic! --- 01_wait_forever/kernel | Bin 66080 -> 66080 bytes 02_runtime_init/kernel | Bin 68568 -> 68512 bytes 02_runtime_init/kernel8.img | Bin 368 -> 328 bytes 03_hacky_hello_world/README.md | 12 +- 03_hacky_hello_world/kernel | Bin 79176 -> 79080 bytes 03_hacky_hello_world/kernel8.img | Bin 6661 -> 6624 bytes 03_hacky_hello_world/src/print.rs | 12 +- 04_zero_overhead_abstraction/kernel | Bin 79064 -> 78872 bytes 04_zero_overhead_abstraction/kernel8.img | Bin 6645 -> 6600 bytes 04_zero_overhead_abstraction/src/print.rs | 12 +- 05_safe_globals/kernel | Bin 79632 -> 79440 bytes 05_safe_globals/kernel8.img | Bin 6869 -> 6824 bytes 05_safe_globals/src/print.rs | 12 +- 06_drivers_gpio_uart/README.md | 142 +++++++++++++----- 06_drivers_gpio_uart/kernel | Bin 83408 -> 83472 bytes 06_drivers_gpio_uart/kernel8.img | Bin 7952 -> 8064 bytes 06_drivers_gpio_uart/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 06_drivers_gpio_uart/src/bsp/rpi.rs | 13 ++ 06_drivers_gpio_uart/src/main.rs | 4 +- 06_drivers_gpio_uart/src/panic_wait.rs | 24 ++- 06_drivers_gpio_uart/src/print.rs | 12 +- 07_uart_chainloader/README.md | 8 +- 07_uart_chainloader/kernel | Bin 85248 -> 85296 bytes 07_uart_chainloader/kernel8.img | Bin 8856 -> 8968 bytes 07_uart_chainloader/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 07_uart_chainloader/src/bsp/rpi.rs | 13 ++ 07_uart_chainloader/src/main.rs | 4 +- 07_uart_chainloader/src/panic_wait.rs | 24 ++- 07_uart_chainloader/src/print.rs | 12 +- 08_timestamps/README.md | 9 +- 08_timestamps/kernel | Bin 90976 -> 90032 bytes 08_timestamps/kernel8.img | Bin 13888 -> 13080 bytes 08_timestamps/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 08_timestamps/src/bsp/rpi.rs | 13 ++ 08_timestamps/src/main.rs | 4 +- 08_timestamps/src/panic_wait.rs | 24 ++- 08_timestamps/src/print.rs | 12 +- 09_hw_debug_JTAG/kernel | Bin 90976 -> 90040 bytes 09_hw_debug_JTAG/kernel8.img | Bin 13888 -> 13080 bytes 09_hw_debug_JTAG/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 09_hw_debug_JTAG/src/bsp/rpi.rs | 13 ++ 09_hw_debug_JTAG/src/main.rs | 4 +- 09_hw_debug_JTAG/src/panic_wait.rs | 24 ++- 09_hw_debug_JTAG/src/print.rs | 12 +- 10_privilege_level/README.md | 4 +- 10_privilege_level/kernel | Bin 94720 -> 93784 bytes 10_privilege_level/kernel8.img | Bin 16480 -> 15672 bytes 10_privilege_level/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 10_privilege_level/src/bsp/rpi.rs | 13 ++ 10_privilege_level/src/main.rs | 4 +- 10_privilege_level/src/panic_wait.rs | 24 ++- 10_privilege_level/src/print.rs | 12 +- 11_virtual_memory/README.md | 86 +++++------ 11_virtual_memory/kernel | Bin 146800 -> 146792 bytes 11_virtual_memory/kernel8.img | Bin 65560 -> 65560 bytes 11_virtual_memory/src/arch/aarch64/mmu.rs | 2 +- 11_virtual_memory/src/bsp/driver/bcm.rs | 2 +- .../src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs | 45 +++--- 11_virtual_memory/src/bsp/rpi.rs | 13 ++ 11_virtual_memory/src/main.rs | 25 +-- 11_virtual_memory/src/memory.rs | 2 - 11_virtual_memory/src/panic_wait.rs | 24 ++- 11_virtual_memory/src/print.rs | 12 +- 68 files changed, 584 insertions(+), 338 deletions(-) diff --git a/01_wait_forever/kernel b/01_wait_forever/kernel index 4c3f2383196a5e8bb73906e99b77771469595ada..d30e38322c96baf6d103e6b68ff85ca081d01ab8 100755 GIT binary patch delta 37 lcmZ3`!m^-+rC|!=N)F@vk|fjof}E)v8HM4Tt!EfR7y$xe4L|?@ delta 37 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 CEf@O$ diff --git a/02_runtime_init/kernel8.img b/02_runtime_init/kernel8.img index fe25b86106b7787e640305d82e3ef02ad6afe2c0..7c705efdf67dfbccb30973ed73acf0cddf6db0c5 100755 GIT binary patch delta 235 zcmeysbb@Ju3?utQS?PKX28IcoK+K`YI#Cmd?HM^nHeuWU}s+W;xNNRO@@XbE};Aa zW`>CmnVDAouV-BOLY-mdt9quDKr>9h27)Zp04mg6$TIPT`o5J9*cn%XG+h7xe>&Jg xj_ykgGj@GqcysTQL+Q84%#5m%{}_Ny2Lf&|$-tlpq*;NuV{#y)IL95REC59;Muz|Z delta 292 zcmX@X^nq!D3?uhMS?PKP28Ia?3s@!!FfdF}U{JWi0pxQ6F~>pHiJCxc&&cum5CcO9 zNDRzxW%vOSJN*BD$jATxr-SqyV2;1`znSsko5u_jbr~9h-fU-B$-~$X#G&G_l1s;N z<(vOZD|t*@G#@B4Onj)!IPw2~#+5IYGp~HLp2cV78*^?=CaC2aKn+?tPMW+x%XEMS zt#xFb_{Mzi$_LyGKOZnNOnkANapfz0R?Ul0iys8exuh_E=cfgwS3WV={G0e%)q{f( k=mQ|&1CtC4Vo*Lel&=V+S%J8Q0iq5n%)kg`e1VDs02eJ-9{>OV diff --git a/03_hacky_hello_world/README.md b/03_hacky_hello_world/README.md index c8cfa808..733d9c53 100644 --- a/03_hacky_hello_world/README.md +++ b/03_hacky_hello_world/README.md @@ -213,6 +213,12 @@ diff -uNr 02_runtime_init/src/print.rs 03_hacky_hello_world/src/print.rs +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 @@ -231,11 +237,5 @@ diff -uNr 02_runtime_init/src/print.rs 03_hacky_hello_world/src/print.rs + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} -+ -+pub fn _print(args: fmt::Arguments) { -+ use interface::console::Write; -+ -+ bsp::console().write_fmt(args).unwrap(); -+} ``` diff --git a/03_hacky_hello_world/kernel b/03_hacky_hello_world/kernel index b3e5538be9a25670a3671ce76a3664a475c02516..454141b4fa6500ba100e33a986bfa16166fc8cf6 100755 GIT binary patch delta 5965 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 Jx?Y2}e*-ZAVDA6` delta 5960 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 diff --git a/03_hacky_hello_world/kernel8.img b/03_hacky_hello_world/kernel8.img index 0566c1bac2e6bb3a500d7faaf335f79e0d1385f8..f03410b4cd1e7f8eb4e3e995be5ce496fd361299 100755 GIT binary patch delta 1181 zcmZuwZ)j6j6hHUgq)k$-RNu=>OxyQjE$O33C#kb@W5y~7bAp!Q+$SyKaQKHhC|LZE zNYssOA9}cjDGasWeErgB1eqU3tKS5{%I3$KwqIiEm==*`g+9;Cdw~jGxXC&9-rw(> z^E>BV=`E$lT3aIw##da|FfH*nKnT2*sczz+6^EI|^{D`iGk`*A5iog6!vz6&t$1A| zSi;S-+0|~So&^{O0r$cHW91G&dj{~w_DC{{l^&=n&{Ul7V))o>n9yq^|F&gqiVUl6 zFGVZ}+F-?SD3}{KQHtS09`FW{T44P}ITeVw5W18?oAz!NT6zdDsLpEs75Gn`J#yVa z?qgiRW);qc+(3vK7-6}A66Ni#aL3Iur<{VUQ`rPnA{kc+5U>Cl1N)~9oT1162ru}w zIQCqTl?gmAU{aCrhTOnvhj5xcBFtOj%K_|IO=PNsLxulnfua}iJ3m_p{qhX1Jy?cU zbIX~Lcgr`g#hogj1`PxG**hKa^ z+Nyz-y@02;x8Scct$2{|@Of2OA7d9{wM>v(92ItjI?v!^1oKar~r9nLn z?&q;?O&xug4HlQNU@O%I%k>%M;30r(ZuaY+Ea><%d9#%z|7`JkOub{Fy46P;L2 z{ppk%nWMUYbH)8ljU|oXJ;h~fnZEu2yb0^jH$fxlcO3fskE#Ai)&GaNXMN${_xb*T zlRun0dBz$ZI`{pFWCS=Im3wrv<$~@#Zzko`x+>4>DRx_4*L(Ci|BjkmTWR_Y%C=~l zP0PbkL-cAPxfp$tJR0>lc3IxLE~B1|@5@-^Q-i-OpuvJi<)* zS$w~DbUFU@=0eOP81?Wl7y#%ZyAYF=c%qH0Q`(0iX#Q$zYf%0i{nGj=?p<5{@onGV H==<*htA0RZx6UYY(2(qCFHvT2W9G5^d{A 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 delta 5892 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 Vz)kEm6?e@U71*;4Y?X?a{0BppT*3eV diff --git a/04_zero_overhead_abstraction/kernel8.img b/04_zero_overhead_abstraction/kernel8.img index 1ca9cc49af8a5984831ea6d7234d3df5eea998e6..01fcf5ce89352b0e105a0f1d0269daa6c90d0ad7 100755 GIT binary patch delta 1099 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 a8QMknnz#$!K?^XW^1=2*-<9+n$p0HdKcH>^ delta 6516 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 C19WZx delta 1363 zcmaKrUuaWT9LIm>-Wz+9#%gW;*0v^XV|tsq?oYC~&dtQuv2_kvDPypKtwn}(v@Y6* z;UFnxqZ@nZ;RwDsX7NFfn`nvR6b3~Z?5!xehxO%ZUvAQjb=_cwvEKd8y*ERJ?ZPGb z{rjBX_ji8xLh62Mu7&Je_~ix3zpTJ10&qoN0UBKl(T6h7UyCXEAn7n~lRItplbd)G+9Lh<;e<$M%Sw!V&WOwRPGd8*IAg@-%m6jEKvl)$(l@~0K!`ezkY1>o zd6^q=i3{)_9SWZ!a4I4}>fghrw_7Z6z__b5{{hBF08)n{@_o}ZgMdsKUnm6WsH-qE zmchR9yq^I%5Vg`#nq=kyvsH8AtAMwG?W0pt$N9Bze7!MzMB9-f{6G6uPlJQ^hkJ{_Q6X4~mo$Ts3GZuH|~p6#Ui4A6&L2p2;y z_io}lDrt!uX@!6CKTUccYw}OF*`1KqB-ZD??vZ2kWK)cuDMpKbxo=7FLN|?W)HVt? zRPUy(PuOv)qFr3`W{LD%j4d_9*t-o=QZ!avYIxBlWn-+)cUQ_J*s@P+#ihL}?n3ir zcJEW*H@6>l&*Rcsb71a3nsl;kAn2a;<7(m4#YO|cZ6_q#>H+(AkHo$R>?9*>ArNnz z3)oKlkgew&D+S{DAD{BRc_cS+|pat;Sr}M;v^Ludm9S}m)gH`tUf0^8+wvB8)BZ&tID&xo=>s^ zp#gG*(a>i#^W~PwV<(PIPCS!44#Q!)FyS1N53|GJ*X+!1!v|84W;_0|6CYM^uK53H P{|NdU(Z4^Jo6P+KMQxGE diff --git a/05_safe_globals/src/print.rs b/05_safe_globals/src/print.rs index ce6587b5..a7fa1360 100644 --- a/05_safe_globals/src/print.rs +++ b/05_safe_globals/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 @@ -25,9 +31,3 @@ macro_rules! println { $crate::print::_print(format_args_nl!($($arg)*)); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/06_drivers_gpio_uart/README.md b/06_drivers_gpio_uart/README.md index fc5fa487..e779d737 100644 --- a/06_drivers_gpio_uart/README.md +++ b/06_drivers_gpio_uart/README.md @@ -22,6 +22,12 @@ console and use a real UART now. Like serious embedded hackers do! - `BSP`s now contain a`memory_map.rs`. In the specific case, they contain the RPi's MMIO addresses which are used to instantiate compatible device drivers from `bsp/driver`. +- We also modify the `panic!` handler, so that it does not anymore rely on `println!`, which uses + the globally-shared instance of the `UART` that might be locked when an error is encountered (for + now this can't happen due to the `NullLock`, but with a real lock it becomes an issue). + - Instead, it creates a new UART driver instance, re-initializes the device and uses that one to + print. This increases the chances that the system is able to print a final important message + before it suspends itself. ## Boot it from SD card @@ -40,7 +46,7 @@ init_uart_clock=48000000 3. Copy the following files from the [Raspberry Pi firmware repo](https://github.com/raspberrypi/firmware/tree/master/boot) onto the SD card: - [bootcode.bin](https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin) - [fixup.dat](https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat) - - [start.elf](https://github.com/raspberrypi/firmware/raw/master/boot/start.elf) + - [start.elf](https://github.com/raspberrypi/firmware/raw/master/boot/start.elf) 4. Run `make` and copy the [kernel8.img](kernel8.img) onto the SD card. ### Pi 4 @@ -281,7 +287,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,308 @@ +@@ -0,0 +1,313 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2018-2019 Andre Richter @@ -409,7 +415,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp +} + +/// The driver's mutex protected part. -+struct PL011UartInner { ++pub struct PL011UartInner { + base_addr: usize, + chars_written: usize, +} @@ -433,13 +439,30 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp +} + +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 _ @@ -488,6 +511,11 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp +} + +//-------------------------------------------------------------------------------------------------- ++// Export the inner struct so that BSPs can use it for the panic handler ++//-------------------------------------------------------------------------------------------------- ++pub use PL011UartInner as PanicUart; ++ ++//-------------------------------------------------------------------------------------------------- +// BSP-public +//-------------------------------------------------------------------------------------------------- + @@ -517,26 +545,9 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + "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(()) + } @@ -605,7 +616,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm.rs 06_drivers_gpio_uart/src/bsp/dri +mod bcm2xxx_pl011_uart; + +pub use bcm2xxx_gpio::GPIO; -+pub use bcm2xxx_pl011_uart::PL011Uart; ++pub use bcm2xxx_pl011_uart::{PL011Uart, PanicUart}; diff -uNr 05_safe_globals/src/bsp/driver.rs 06_drivers_gpio_uart/src/bsp/driver.rs --- 05_safe_globals/src/bsp/driver.rs @@ -649,16 +660,16 @@ diff -uNr 05_safe_globals/src/bsp/rpi/memory_map.rs 06_drivers_gpio_uart/src/bsp diff -uNr 05_safe_globals/src/bsp/rpi.rs 06_drivers_gpio_uart/src/bsp/rpi.rs --- 05_safe_globals/src/bsp/rpi.rs +++ 06_drivers_gpio_uart/src/bsp/rpi.rs -@@ -4,114 +4,55 @@ +@@ -4,114 +4,68 @@ //! Board Support Package for the Raspberry Pi. -use crate::{arch::sync::NullLock, interface}; --use core::fmt; +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; @@ -752,9 +763,9 @@ diff -uNr 05_safe_globals/src/bsp/rpi.rs 06_drivers_gpio_uart/src/bsp/rpi.rs + "Raspberry Pi 3" } -} -- --impl interface::console::Read for QEMUOutput {} +-impl interface::console::Read for QEMUOutput {} +- -impl interface::console::Statistics for QEMUOutput { - fn chars_written(&self) -> usize { - use interface::sync::Mutex; @@ -770,19 +781,27 @@ diff -uNr 05_safe_globals/src/bsp/rpi.rs 06_drivers_gpio_uart/src/bsp/rpi.rs -//-------------------------------------------------------------------------------------------------- -// Global instances -//-------------------------------------------------------------------------------------------------- -- ++/// Return a reference to a `console::All` implementation. ++pub fn console() -> &'static impl interface::console::All { ++ &PL011_UART ++} + -static QEMU_OUTPUT: QEMUOutput = QEMUOutput::new(); -- ++/// 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 ++} + -//-------------------------------------------------------------------------------------------------- -// Implementation of the kernel's BSP calls -//-------------------------------------------------------------------------------------------------- -- - /// Return a reference to a `console::All` implementation. - pub fn console() -> &'static impl interface::console::All { -- &QEMU_OUTPUT -+ &PL011_UART -+} -+ +/// Return an array of references to all `DeviceDriver` compatible `BSP` drivers. +/// +/// # Safety @@ -791,7 +810,10 @@ diff -uNr 05_safe_globals/src/bsp/rpi.rs 06_drivers_gpio_uart/src/bsp/rpi.rs +pub fn device_drivers() -> [&'static dyn interface::driver::DeviceDriver; 2] { + [&GPIO, &PL011_UART] +} -+ + +-/// Return a reference to a `console::All` implementation. +-pub fn console() -> &'static impl interface::console::All { +- &QEMU_OUTPUT +/// BSP initialization code that runs after driver init. +pub fn post_driver_init() { + // Configure PL011Uart's output pins. @@ -847,7 +869,7 @@ diff -uNr 05_safe_globals/src/interface.rs 06_drivers_gpio_uart/src/interface.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 -@@ -41,16 +41,50 @@ +@@ -41,16 +41,48 @@ /// Early init code. /// @@ -861,13 +883,11 @@ diff -uNr 05_safe_globals/src/main.rs 06_drivers_gpio_uart/src/main.rs - use interface::console::Statistics; + 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() @@ -904,4 +924,44 @@ diff -uNr 05_safe_globals/src/main.rs 06_drivers_gpio_uart/src/main.rs + } } +diff -uNr 05_safe_globals/src/panic_wait.rs 06_drivers_gpio_uart/src/panic_wait.rs +--- 05_safe_globals/src/panic_wait.rs ++++ 06_drivers_gpio_uart/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/06_drivers_gpio_uart/kernel b/06_drivers_gpio_uart/kernel index 7a0c6dec1497acbf14a9b0c490ddb395ac059546..1dfc7228b62c9cfb0f18d1b7a79d1495e9bb9af0 100755 GIT binary patch delta 8438 zcmb7J3vgW3c|K=Xl2@{cS2ngJ%l7Uf+16UHzVC;P?UilSHjl;@kMd}+?-R*SAq#L? zrYjRdd3EB;#2i{O9ednD)**?ZCAK^nf}qn<%CvTeFodB*1~QQiEsr6Yh)~r3oO_P2 zE+R>R>uoyNi_Nm6rF3UtpdyAnFH<7L?vAv>r7S0*5hcbv!?o4ZOnb_(0^g6<&pEr^r%_bIZ?O7R^KG;4^m@qPf6t-}9>@D(74qs*a^m zM71lFi&1f83E7KrvGv&$`u6B-q*Fo%C{{eOlr4ZsWFm!I$jcbdy5^Fj3JU#6-HU=9`g>bmx59L)R8Q54;jUKWi_)KoXY zJj%T@g%{0#7#MGFKqh5;GZ048bB|?yL2gOmTngq?Qn--23+5c2fy~~z@;LSE6@?C_ z;%3h1Cn>z7btg<3szv6c9k_U*9g9j|g9*>2k$w#x>PaDVaW0?!>3!Up^T3(Az?nb! z+?iLT@q(*ezZbsc7V|{zcSQw>2~U@-13}^hI8F$xPA#5ZYZMRnU|sAS%AfB&~fUI z3|Gi0`X~hhV04U*6VvjILHFIzOVBg+7rGb6u2~t>$n@D*vmOiJGA1=m?*dil9g5hV2 zac;p?++nc@ae_eT;|v*S#cLL2`PqT%ge3kvhb|z$T8yu0{4S4-V6liC$${+t9L}_e zU&jOZJlG81yk)^#qo{=-o^1U`4D(CW)kABB2FICYAc^5CCJxL zuHFjMT10L#6mHu&xtAOOGT8(Q*6-lhLGn}{uig3sP&1XnsGZ06pBNdT*Ev4M@zXqm z--FV@sT9g{O+*=#AOk60CS3)*tX`PAg%p#0&(bcg8U5WqRh_&F$Lrwr{mSargh{tN`4eFo{~@U z)y<3>LjOaK0D1E%Xt30hEj&^ZC;t|3>Z!wAWnuXtXvP#5rqE4_Ui%1cgVcP04Mb|g znc_PMYgb$pFBQ00dW1M_a16Ph8~_fLlZlks%h+SoJY%YJPC|&NT>`IR^APIip}C*) z>E!s+92fla9RF|NQ-eO7;E!Z>8?MJSWNSNE(;5#-JZy@GTjF7m4fPw@x)geiX)kAZ zBjDVSNM+Hk1TIq9B2PiasHw?*B_?cVUs6c)ErACdzkxI^!%a6XOn7CGkul0AaN#X6 zUwCUX^iLX2G2i0-@d0vX3C`Vk18;glx?sOOfw#_x*$Dh%zThPua=}N0@Gxb+0{@6a zOL0!VFX6OB+{WVxd^^L_unC<7r?sY0KksN<8rs1Z?q|-a3?{S`+KXNals`EkBLyyXe^e9UuoKX-uG zzhs8K(zly+lys09x@U?_PkFfQ4a*yNekZ4F^&l7lhc5H{(6Gc;a znB!u;uwyHD25O6tB5rIE!rn`Gd2g)aJP?1W<%xLS~@rNg>%JC96y;*VLQiPOW+~Lw=5D$#X9U_I7at0 zOvMKPrvdyI2p~D!i8Gbn#L90m1}W5^!0+Xf_9yU%IDS_Gf0*M>B=AQ$o?px~tHk=k zUAV-G36uDwOA@$n$>{|Cw_Lzj0{=UPW3*+~g)Ra4$2j5O6au`SaJ(aX;R1wy#PL6! zI~D&i$6rj~-(#j=^hP2U&(rx8Xgf8DbKi@ckvJ*~SNuE2rNsPKIDUBoe;shz)`X(F zIHQkwMbY`IDF)B%TGJSpn$UERZyraX)MyC`!Ej_?SAjH^pd0Dzbs>d5NO*h|$Hlpo zuR>iM7w1=jZ{+x<#4aELu_a+2Px714P=X*L^l}1!oJqncdC^idpENW zKSH`nI9Gfx!L5Vug#us5?Kl~)`dK`D68k8C4RsEP5M58W_9c#s1aZ$ix zhiQkLqkLZG%H+Aw>o_i&u}Dn^l+2=<3K~i{b!SZY0)8jpRDei6alE`3_AH8vb}j_m z%yE&#qCFqwcwBB!W@WDFr<@>O$=W#{K^9Kup$L+a;-U;S?xB}BF3Rn49<_0fi=?=U z@~2v9kj0ddNF#|j5?-HC2bHhy-zoKzCnemkiKolFTW>GPsNFBg7HZ#Lk|lNrWPeGa zHb(Xs(Y@i8lh@RuCKasH`>YGq)SsZ zm!^m1>0yO@RmV#zhGcrGt?SejJqW*qwK_cyZF*Rr7FMQ1E8x`WjG3PE^o)&ZIhfO; zEU*UJcGDkg-rj*gCHHH1L8EH>O6bcLcvq23BkYcSV=F!c)l?nBvvtXw-ZwTH-0SV! zHW1v}w{I{Q*jG{|`Hmg^J9e{lk`NVB()aGYec;Z$x5g=^vy5UXWm?ls&={yDmMPOs zO$Z=oblhB-B5t~6>U6B817l65Dgx^JB?~+WcbndAC=|G}LV?op)_uWbgHBLbZCOx2 zurOxAa2uFFwXy1wS$WAO`8NYEOc^pcXW+|Mn@VVgf#$iUVR^Q1bx)(dN!c2Vp%H&) z8X7i>gkHwO;&W_`DBNM*O+o>hqC7cfoE#I zVf)>m=V`cmP``7aZ!nO}-ayk7$x)$A*uEQvI{CSU+qweT^L^L1ZB+?$PrqQX&3{qx3shB=4PDbrOVMl#R!IiAX(cXJWII$`$8ju4kyS4?$%xy9>h9}T2m1Ro z`Xe4#<5;Spgo-Kal4^UF^gDPXXAk^JC))2{gl1r5@ zwdW6Hp?j zx8qA$*q-9Jn&m5jp@)*LLOE!vEt%j-2a;SDW|%4@Eu^h!>XxnQ5_~6bUXJf?)B<0F zjU4tt*wKN~P2oRl*82AJ(Sq@03z7pi1x1peNKDeO1{br6Zb=d#jve?0#FMOFgKx|l zu4F5!4t1dW&~iNT1mc6IDrIPDD<_Stfnij>=~9S8HT1hTI>he z)~rwoWH>sxAtXL2ti#35&`=-~JynAq=*eycY=(=K9rlo7T zZNhm9DvEV)g=8&!3HjlAJiAf06c@H1#R)Xk1Dm>|k#!`y0q5zzY?KYSR1iO=XIkRd zudq5 zPT+~{)}Ar1wY_meTBzHJkEtEpI75_4YiQaTJd^Q=4)r9SW-RP95m?i)JP5N7Z6UIU+*w)lOf zEyeJew%7maFXvj$WAuCmWv zP-!ZOB5GZBuq(=4?IZ^<&b9mugikI)Iwf?0VY!Pd*#uxBa|zr`eu8oR&bKJnZAhmk zg5&3Mz=RP8$_Rz|bn-ptD=`dY`TXlkyi zv<3L6^qvH6z2j97JXnWJD)>PlOeU9{P5mSJlLT&008cT2v+V?UPA@>_-kQQJjqJ9* z)y%}LT+o{dyt3sd7N<_$lxT{rvDnm+~%7m`TdiN|&%5L()vN&eTOfI$dnRI8fg)#)y^L6juPs8evCy9A`Z_dAtC~7I>0zk$M2QyLwN140t4i-b zfuaW?o`VUb?}5C`K^$pCK$#VHq_|)<878phu@KF&<#Mq*np&MGr68$O#aPf*5H$JQ zIjv$MK+(Ta2f(RRXQ2d%IXjt5oxPf@J=<7?mLiB^4$~2xI}Qe-3tM_v_-P1f6vT%r zf2L||NA2Tx&vsWA#`iTYRlBRv_*;v|cGLm3=LHCVHTsxV%|!@h-Q(o76mBU3sr{um z6E};b!JYm9MQcIl^m$aO2Y;x2b!+-c({qVZy|y_w*@2>~9XOhs!=>-HwXDx-8we}{sk7+-(=yZ zq^}Q!Up^;e4Gxe&UY=w4b}JzS-%Yb3SS_1HsNkE-Go>4gCuqhjE)`{%?uxK z{GpMDGydq%qrvF<3_=r4P)Be<+ho__QE%NN&d^AH^e}s$X(Ij2INy+Ij``A@Pa?;g z@oIZFhiSReE5ojQW{l%>$D-Gh{2kgJyCiZIrZ@b6!>~_qxOq8Vo%pDk^e@McHm_L_ zE9F!K8DiHll5N4u5~r7w^)0x~xv)HDyPcEY=I?_2?)$g?!4Bu}K{ps3eJpeTP)3az ztyDZuC=ufdj<4aPMqY2htCyeRuUyLwYp&Fhx^{e5=2%NCAj28H$=?_AckO) zqcr&RI=w=uw}Cj+37zID?nvMD_$(=i~{VRe^6H4ZvR8$H^(;z-ynVJi&DjCr|N;6!>rhxF;4WVC> zh7P=JYcKapI3jWKCTN#5Zl}3Y5r?01To|*3^Y15zKpZ~726DOsr*bo8_I@390xDAA z8lULx>x+udBEQneOSK|WvFg`2K3Imo z0XR*RP|Vn1%30X3X}sc{nyl)^x05S5ycB=N0)n9uXFEMpx>Duz2np9G@z~KLu5^ zg9v`H+JDHz72oETm!C|oaQu}rkKX0@r80by;{|?7;SQl+G906i%FLPu92yuQ-ME2_ z_25)-ciBw#0|>-=unezZ$IJxUTZRkE#5qY=AS@$g{PkQ;I&LjR!H*Vmf;dPCLKDX? zl=Y%Ej{md_7i-|7GQ5-V!!})ia|S_wHz)jN9swbd+NaYuPe4c#f|kt34UTs$osYl7 zJi%zo!ufbF}AxL!3r#LP=IKof;)3AzZkqd*M39{=9xwsZq@Au>3t$4W326i$j{!^Ky z2l>fF;48SGde}2>+HX0E(Arzz_uT>?2YfO3%-d5D2@hzEP=d()vuqxT*;Ik(;37irLhdOpR)NMNv;=ZbaZ&BP zytVgpT1F55Unz-SA>-cXz?h7w~{xNCF`iu zhs;!(U{plSil}u1UCaxBrQD{O)mdB`EF%bAPuEP{(PYoD2jXyrjxVW-u1ap`2bQG| zpd$yo{d-1(hldUy2}Td+O`fGMcaCcqMyn zFzAtkL&L%79{1?b@R6aB!+FI!q8=Q1EWA+&U&Jt&muW!1hy~Wk?_r=}xs?QBS$Jbw zv0dMEEX{U9%acQoJZ0gpreX1Wf#PbKr%9>HSi?zWgBPHGBhPy4^2nY99dF*@^u?;P1~NWJErRSp%WOU>yQZ>w=Poc zz*c0%2ZHT{3~W^B?~$^(SJO@44JFC2Oz5fdKz?}m(MMo)$hu`~lA_Y4X;_-3+T`SV zyp;UmdVG7%@Knc?OxHAB+tek4&(bVYS1m=?EKRXMvSQLXxkb8VxjMLMdx0;92D!8z zuP7?ABP&_}@0tH@fFXLWnseSv&k)p1>AZ*x8RHCYf$I6GC+yL_;~@O?MwJC8Wi7h z)j&0U(=eexjR6Y(X_GcIGIRt=T9q{2a4Z#4FUhWLk!^S3T-w!r#qeCsuoWdV1C=~+ z7yhFL8A@I^0#7yp_9S_L++|@qZK$E?hqfH3nrgs-gBTm(=wTRs;OL%b$xyYb?2-K& z@wRm6s3vS$b|5Q;2K7b$V$+m4MmJ^1qOWr78 zZISNlmg2+ORdq+z0`h4AuiUA5P_Ulrg>b=xHV_Bj_5;^;blZ{C0Q!L(z}X~l4NwDR zW!X|*l%S$0mT6j&tw3?9a8S||@7<7VHh%L*@SzFv|&O&vSr8cHOE&6#9kcO z2c3~2Z$JFqqO&JRw_*FTZyR9{1eOtME)P`T>#n4Lk8+^fmZ5l#41LaVY+vzR*H!Wg zuQF(KswP3RvrNm@ZAnrV7)+l+TKn;x`K;D1K52x(_ diff --git a/06_drivers_gpio_uart/kernel8.img b/06_drivers_gpio_uart/kernel8.img index 1ba2774034adb08e5d43e3f234a29c11a27939fc..f5878447f3f0106266df41aead4165f619acec6e 100755 GIT binary patch delta 2100 zcmZ8iYitx%6h3!mcRRZ+&*ewut3qOFUVG%o?J2QpGN$$+t zbIzReo$s7`W@KHYX{6MBioj71crI!!!n7S=%z;Ze(MUVIwX~tk7RR@EE#3CmBg0uBq0Hgl0Udi?m z#eG_UqlqOD;PNU&rJPu<+oKKB1Q+|B<;w?cfK^q?P()tRT!OZTA0)1BW(UfLU+t7~tt`?RRy@!6g9nir2ZbNxOEQm^1 z*>i#{phZ~l%CDlu@hoWQwFNVr&kk>uj;`JGaz?0h??Ic06&mhmK$Ha;EUVp)`m-Vg zI!PoX04$X~;*W<-4hxaPy~yF22OM^YC7X7j=noVDfh`Noiwdos+f1E7d26PSK!^aOiAdMa0c_zieg6jB;j;7CFdOEy4|v1!@A%Trlj*rtkO?0EWXu9z;YTA5 z+rg01QV@RH}EWi-~dwDkkOA_as^HKL{%c; zNGKJysyw(8g9qeZ~!8snb;94p_*pJ}(9)X(yx<0a6uTu`{#$V5ECS;m@ zlXr~7@xFZgaDJYZB-zKs*T`{p(CL4Ao}WY(j$JG(?+*u#iv%X06osf3CThwDD(@K_ zu6lSRCYsEiQfD>oX1W|`M{@wV#*J6L2Rufr7<$mA& z$2fiLQ)el=;B*R-i_JRAgnAcqxN7sBabdsUm8;(YdRe>6M@HBSu43<`sk527)8-zt z*RNitx_o&zO)35bOli{P6RJv>qvR#xWWy!JlGAAfVNaIS2~f&q;d$A{U4#9*_Id_- z`ulczarRcZ4co=0yM_8S9tX7jPydv;$A;0bP|wi7j$MO;FMBrkc~$`&kPLsu9l(6% z!$nhZ#eD8(E8RXz>*n?+*ai2umE75{rtdW#-8GDr&U-QUELPfNSy@vbVE0NNB|ov| zWpB=J*Jke<*x$FWzjkm4PBL#SzPhGW1#f^q#R eu|fB`)w!|}*<*_9&3(SP2kY}44|oCq delta 2088 zcmZ`)U2GIp6h3!mcRRaXgi`vm-L^Z+wrpp&e?prgZRob8mR5+cZH$p9tp%lm6t+qr zN_GnoN${aJ7gLQSmY^ZC2?|z&YofIJ0tq41Akjp_w0&S(`k*96_Q8(l&P=fndXu{| z=iKl7edo;GMDxhzkz(&v0%v8A@91s9loQ~x3%4@eNW1)%w4u~NnrPQ#CEfLO6Om~M z5>YM7p%TRS2I~36CD}J6G`Rf z*t+jw%(wviTXenW^a-|(_(D@*ng=lQl_1kx^fn|kQ66P30BTwU$}{u#R#0WSj13aS z`wM#3Rzf}3S727kWVwMy4ATV6LXW&r|c!c zCm!rrMkMq$yCTl!JM3_lQ=-iR<@C>BEAj-Ew0%Ktu@~(R2xFZNA34JY z9Fe%J&c%AOT$GR3PPi!g{ZQl+tUyYoagYL_5nAwfg39M>u8mK+O`SOjbQeb1Nz z8$xzS-B_K7x=^?KeWc$GfAE2sL@Hg!*=LeBjwikk%|~ z5RqTJF^oP;R#Wy#Va4VObR4Q|RaRgLl^F0+UlmD`n)u?;hpwTAGb1xN-BjnQsHSzhy0b@BDhY9et;RcH_qLL%ne$&a5OVZ~c6Y zLuEHzQvTcjpPzeKet)qRcUbsSUJaIvtmL}MgSVAAIF>*icKGZ z-bPxoT#js{63XLct6B)5?3J94$T0q{8?RWMV<+d?rh@xqf~_qKv4z6oR&-&k_E>B% zCLb8=+cR+RRe4Wr;K<(CCK=#%Ar1~Myc~@+6zi{fy>H-Pb!^Cx9~H7zPj!y$F=4AL zSS=g&1fP1|((>u#OEy-uoUrr`Qw^sq8Sgh^)v{?%Fz0Jai~j?b)>9M|e)q7}q9dNl zEHj{W2G|f|9c6xRfiPCYHhD|?CW=hZ6V~A^OI`wZ?C5+p+BbCQ<-M`kF?q*;yuk!+ zluWy&5KGTuOJ8X{>(~`vD7zRmJcuW2q@=O0+|YD;FndawI$TS`tj zUt`5fF)f+hC~mgZR;{mN?vgF!I@?)tYDsML4jy`AV9;pEffCa$Y?{F+^OqJ7U{l2n kCj3C@HczC~1Rb+LJvM*}e2=iHQePpqso6MKWj!s_KLavW3;+NC diff --git a/06_drivers_gpio_uart/src/bsp/driver/bcm.rs b/06_drivers_gpio_uart/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/06_drivers_gpio_uart/src/bsp/driver/bcm.rs +++ b/06_drivers_gpio_uart/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/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 47d250ee..0e3c202a 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 @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/06_drivers_gpio_uart/src/bsp/rpi.rs b/06_drivers_gpio_uart/src/bsp/rpi.rs index c22c47bb..47cbbab9 100644 --- a/06_drivers_gpio_uart/src/bsp/rpi.rs +++ b/06_drivers_gpio_uart/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/06_drivers_gpio_uart/src/main.rs b/06_drivers_gpio_uart/src/main.rs index 894e0d52..07c76abd 100644 --- a/06_drivers_gpio_uart/src/main.rs +++ b/06_drivers_gpio_uart/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() diff --git a/06_drivers_gpio_uart/src/panic_wait.rs b/06_drivers_gpio_uart/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/06_drivers_gpio_uart/src/panic_wait.rs +++ b/06_drivers_gpio_uart/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/06_drivers_gpio_uart/src/print.rs b/06_drivers_gpio_uart/src/print.rs index ce6587b5..a7fa1360 100644 --- a/06_drivers_gpio_uart/src/print.rs +++ b/06_drivers_gpio_uart/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 @@ -25,9 +31,3 @@ macro_rules! println { $crate::print::_print(format_args_nl!($($arg)*)); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index 3531c2d0..cea017d6 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -162,7 +162,7 @@ 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 -@@ -272,6 +272,18 @@ +@@ -277,6 +277,18 @@ let mut r = &self.inner; r.lock(|inner| fmt::Write::write_fmt(inner, args)) } @@ -181,7 +181,7 @@ diff -uNr 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 07_uart_ } impl interface::console::Read for PL011Uart { -@@ -288,14 +300,19 @@ +@@ -293,14 +305,19 @@ } // Read one character. @@ -243,7 +243,7 @@ diff -uNr 06_drivers_gpio_uart/src/bsp/rpi/link.ld 07_uart_chainloader/src/bsp/r diff -uNr 06_drivers_gpio_uart/src/bsp/rpi.rs 07_uart_chainloader/src/bsp/rpi.rs --- 06_drivers_gpio_uart/src/bsp/rpi.rs +++ 07_uart_chainloader/src/bsp/rpi.rs -@@ -12,6 +12,9 @@ +@@ -13,6 +13,9 @@ pub const BOOT_CORE_ID: u64 = 0; pub const BOOT_CORE_STACK_START: u64 = 0x80_000; @@ -295,7 +295,7 @@ diff -uNr 06_drivers_gpio_uart/src/main.rs 07_uart_chainloader/src/main.rs mod runtime_init; // Conditionally includes the selected `BSP` code. -@@ -66,25 +70,48 @@ +@@ -64,25 +68,48 @@ fn kernel_main() -> ! { use interface::console::All; diff --git a/07_uart_chainloader/kernel b/07_uart_chainloader/kernel index 706654449f1e7f07d59f49b3a3aa438c96ca550a..210c2c01f0afb0606d66eb5bbd677b6c17d11d8d 100755 GIT binary patch literal 85296 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 diff --git a/07_uart_chainloader/kernel8.img b/07_uart_chainloader/kernel8.img index 746524c7382bed2bfd0fa73af1f37de037d04a65..054d436b4f474c00719bd423b7e6c8087f6a6e32 100755 GIT binary patch delta 2894 zcmah~Yitx%6h3!mAG5nHQ0R7H`)BAu9R=W)aWu;%HmM$BaTFJ;X5}K)X8OJ@2Z6?txpep zmP)lcj1;4m!H&3=TM9yyM|$(?H;?ED*-FZUUaD>#rC-7>gf8E z2Po&}0w~T;Bscx3Fr7=JB~7@Ypz9NxAD;WG97>U4YaKrf5zK|s>!E&ZCVoilgE37q zhIE%P4A23H0nJap$8UvnCV(uw%n#utRCLK)dAgpqxRZ&EF@+AGfjexb=UQ-`8#*}q z^fkbvc@$~e|kWz56q>;bmNhXG?W#h1G zRBS8l;C5ravE0$&(pVNZ+W|c=MQG>-=8_W_9;@EvPHf_Pka#;g=WEd2@oX;3HkI?F zZ@3<^ZMdt)1)m}Mkl(X65hUDmFiUe*hJD|^+`%MmlU4~K#-8GKym7M6an0qhQpwEJ+D$OfMhgN@D% z9XJoP4#Nc(M4RyZT6m5XB*bf{AemhKI3c@hai5A#R3zaO1pG+Aj|2ipfFH#S65y>k zq)WQN31kA0<+)MfKAM>(8w&PkMt2+B`FM05`^%a$lHZr+I4#(NEr|MeMScMr>UTUF z%H)_aAd^&DR#N@4FLhOh;#{G*kAp6p2l05e#vL;^2le9m8aJ3M<+^V=%zHTi7s;*&fQucZO}F2Eb}-8Iw* zbW2e!eZTS%`ULLJOmo}+xXL6uQy4CJ6UVpx3mxUSd#G?FDaiBq2aAubl{A@c8+%Oa zDn+|x*mS1`fWEc?=p$%%{k3`Y^*i(E$LFKn4~;t~)oX-S<54>x+*Pg3qblWx*mhsbsUl*QGRJq0-2+xh$o<_~*jX@*c5A z6~^8#ODRhyMrIn|xRQ*ZC_CmQ)gL%x3|ZFA!D^r@=q!2z@q_rE=Xr~?$n0n!qVaFu z*AXINi+y3Fy~N<>{P3U7eCUpqwvfU#t7g~LJ>Amw>e4mKSF`T2TKm3URz4=tvUA6V zm)qKQYinAydX_A|PzBq|tp(VY@TkV0*nky|>_{lH){2F$x|y@1>}16vvWeZQcqb>$ z3vA!m?4~+Ej%V>j8?JbV`7-7D6oI?HhVKDn^Wv6Iu+JF*VBh35qz$8Wum zg*~`m-zoGV0XQXOY$5wHg*;uz>)Z|jJVf^8ymcJ@9!K$<0F(*&tm3Q-JmiS=i1h;B zgY_px!Y}-fei841$!L9y@Q@Hqk&~N+Ojv8Bx?^&{aW|Sjz%PQ1OSsbnZk({1!_ODE SRpOnga_r^a0K$H?^ZpyPJxVwL delta 2853 zcmZ`)Yitx%6h3!mXFJ=LR!g^~-Lf-l1v+h!S4(+GcX`RfM=9__jj{_8o&pvhZBTa` zmH7J6n_D6%i8TJeX`0+X$*oymO#gIXYS&%;v~Cw&N<)x z&hy@RbIHENT~&b%5_IdJpSBlDr+fe>^YLd4D0F$qOPhk;L3|tV(kGWZxU!DcLZa2m z^O^)PAxomxYd|knE2fIF+9OdrE}N-3$xJOIG*#y@zZTpR3H`O)ACc+R-Ksej!JJ^% zkU~Qi%O|y!@5#_@Y0$|1*PsuhQ>LyD_9zKfzJ+Ezm}MTg!@L{K(W)#n@nr9Q7R?7M zp|MnucQ3eYep{+!_eg5f(+D{-&SB^~M$rG>=@jeGwH$MHAuB-k1QSgq;unY3+}-?rcDS>+M-9<+14M#4#s;n>?azq0BEad{%P?ciR(===nd z0uxV`A?Qy8{f5q>InJ_xNk8H)2(nz&HNOl4Xebg~VOQ3E`MW zmC3YB0Lu}09La19@NT$rfg6Xo?+~ZS|HW;R!fD<;-WMaHIMW=mu(Rwbk4AoAuXtv~ z(e+_3P#&8HpftOXoO-XI&J@y?#$Hm<^~YOg&blU-_mWY2H9rgn)Vj}9S0kvK`*-ihS! z`gD3kUVGM(wOYPre%$#x9&AK1oUT>E$u0iU8MO)|kC!A`^HH~UFC+~G{^W@b;52Yu z0qkq#_7(eqZ7e8?qe|Nk$qc0}lT(~_P=;O=uLBE5UGgScN2_IXjRM`goYr~3vy7pl z?HLReThurj2&Zwc6XsphLhM=0pXbeejTURy0m5k(RZjW~??N14i@p8QX<#?J!(>1E zJx?Q)DQb9W`wYj4ikp|oiB@eIB>B6x*j;@SAjyZ5>wE?zeMRDZGS(vMzVkZzScj^S zjcmVKUBZLmN%MJ8AB?1p2;1XpiqDRuGp({;Bd12|Abk$osmt&MBD+%6K#iU{es`Q) zj-_%+^AVW*zPMNn&h#0BDjl8zX+9Fp^f~v6Wbzy1;zE9(dQ9H&6J_jqP`jU4$6xXyJ)ajqh_?Dsfn z_I&b+jhqKM88aO@3}zt)$(`ocN6ZmhG7B3P8CEsW!D>Qno0zFXvN`;j#~f)YF#JxC z6ZF$~(e@4&d}Z?M`67aspPE81$yhf0++ZMmMrR{y3K;Wikhr#ffiVVk_2}@EPy-!l z`o^@dQhb6_hln{mMKSi+ZlHY1eV8p~*{4qEe|5|Xyq0Ft5N#54p$oei9n2$Jk+x6vDVnGo$EHVwRPw%oAnv&kE*&w zEe}tfHf>F;?fDfO+O}`lrtgex-@HDQpDoSNv6}!>3+(xP%{*8y=h-xdy|2&LYsR}~ zU8t7|xkSip$M|ERgiy{AsFvWJoGt9}V6$iH`ruJ~fWdZ6Cpw;-vsKNKkET(JmXuzc?6V?}njN{-u zbMYUi6FP-{qN|2OIr5J=^3@!v z$p%8>;)?6z8L@5?>pfx%o*L(=^0~Nrv7Qh(VTMeMg(8OruZz#@&#Vo3u6~xVx8D>m k7es7Dg7I38EQ|hU99_$cvt@4L@k+jG``0AWdD%m4rY diff --git a/07_uart_chainloader/src/bsp/driver/bcm.rs b/07_uart_chainloader/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/07_uart_chainloader/src/bsp/driver/bcm.rs +++ b/07_uart_chainloader/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/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index e546e021..3f3dfaae 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 @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/07_uart_chainloader/src/bsp/rpi.rs b/07_uart_chainloader/src/bsp/rpi.rs index bfcf041e..6f803150 100644 --- a/07_uart_chainloader/src/bsp/rpi.rs +++ b/07_uart_chainloader/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; @@ -45,6 +46,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/07_uart_chainloader/src/main.rs b/07_uart_chainloader/src/main.rs index 89e7ade2..90dc2928 100644 --- a/07_uart_chainloader/src/main.rs +++ b/07_uart_chainloader/src/main.rs @@ -54,13 +54,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() diff --git a/07_uart_chainloader/src/panic_wait.rs b/07_uart_chainloader/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/07_uart_chainloader/src/panic_wait.rs +++ b/07_uart_chainloader/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/07_uart_chainloader/src/print.rs b/07_uart_chainloader/src/print.rs index ce6587b5..a7fa1360 100644 --- a/07_uart_chainloader/src/print.rs +++ b/07_uart_chainloader/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 @@ -25,9 +31,3 @@ macro_rules! println { $crate::print::_print(format_args_nl!($($arg)*)); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/08_timestamps/README.md b/08_timestamps/README.md index f16f2dd1..315c19c6 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -231,7 +231,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 -@@ -300,7 +300,14 @@ +@@ -305,7 +305,14 @@ } // Read one character. @@ -283,7 +283,7 @@ diff -uNr 07_uart_chainloader/src/bsp/rpi/link.ld 08_timestamps/src/bsp/rpi/link diff -uNr 07_uart_chainloader/src/bsp/rpi.rs 08_timestamps/src/bsp/rpi.rs --- 07_uart_chainloader/src/bsp/rpi.rs +++ 08_timestamps/src/bsp/rpi.rs -@@ -12,9 +12,6 @@ +@@ -13,9 +13,6 @@ pub const BOOT_CORE_ID: u64 = 0; pub const BOOT_CORE_STACK_START: u64 = 0x80_000; @@ -337,7 +337,7 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs mod runtime_init; // Conditionally includes the selected `BSP` code. -@@ -68,50 +64,25 @@ +@@ -66,50 +62,25 @@ /// The main function running after the early init. fn kernel_main() -> ! { @@ -409,7 +409,7 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs diff -uNr 07_uart_chainloader/src/print.rs 08_timestamps/src/print.rs --- 07_uart_chainloader/src/print.rs +++ 08_timestamps/src/print.rs -@@ -16,13 +16,71 @@ +@@ -22,12 +22,70 @@ } /// Prints with a newline. @@ -485,7 +485,6 @@ diff -uNr 07_uart_chainloader/src/print.rs 08_timestamps/src/print.rs }) } - diff -uNr 07_uart_chainloader/src/relocate.rs 08_timestamps/src/relocate.rs --- 07_uart_chainloader/src/relocate.rs +++ 08_timestamps/src/relocate.rs diff --git a/08_timestamps/kernel b/08_timestamps/kernel index 5d880c51b71ee6e6c839c3d8c3a8e4e51727e959..080fe56a5c1b639dbe53b75b68087c25e5ae95d9 100755 GIT binary patch delta 11398 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 delta 11778 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 BO|Sp} diff --git a/08_timestamps/src/bsp/driver/bcm.rs b/08_timestamps/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/08_timestamps/src/bsp/driver/bcm.rs +++ b/08_timestamps/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/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78303c49..a0c0d593 100644 --- a/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/08_timestamps/src/bsp/rpi.rs b/08_timestamps/src/bsp/rpi.rs index c22c47bb..47cbbab9 100644 --- a/08_timestamps/src/bsp/rpi.rs +++ b/08_timestamps/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/08_timestamps/src/main.rs b/08_timestamps/src/main.rs index d65a33b3..e99e681c 100644 --- a/08_timestamps/src/main.rs +++ b/08_timestamps/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() diff --git a/08_timestamps/src/panic_wait.rs b/08_timestamps/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/08_timestamps/src/panic_wait.rs +++ b/08_timestamps/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/08_timestamps/src/print.rs b/08_timestamps/src/print.rs index 86ab59b3..082e5cb0 100644 --- a/08_timestamps/src/print.rs +++ b/08_timestamps/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 @@ -83,9 +89,3 @@ macro_rules! warn { )); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/09_hw_debug_JTAG/kernel b/09_hw_debug_JTAG/kernel index 5d880c51b71ee6e6c839c3d8c3a8e4e51727e959..952a835ef34a181a7aae3a31cf64340f3d8cec74 100755 GIT binary patch delta 11416 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 F`~T=7e4qdT delta 11820 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 diff --git a/09_hw_debug_JTAG/kernel8.img b/09_hw_debug_JTAG/kernel8.img index c440952c696b5d68151c456316e8b8bbee4cadb9..ff216356283fe5c0599f47b8fc5d0bd8045dd910 100755 GIT binary patch delta 3509 zcmb7GeNa@_6~FhrUG}}Vs{#R0PV+@iMr z9_B`9Q+ndVn7lW?bKL)=l^(~dk^q?C&Y+iYmbi?l9z@)zjLzVd)?_Q{?xiVQtgOar9g*k<}iF3Y--1lanZ~pZMmS>T}5TxZ*NE9Z(^p zAYfq$Tmdp;_RV5DIn8;9+K*T`13?H^1sY;Do3awt8P0S2?)Yen==_H0g+s zTNG9;>gT*N0tF#MIv73wI4LOf6HA))aRAjzZ&*sW90&DU%h#R$|Dc%DJH!A{3qaAs z*3HYa8KWXvj{wvJ@9abMn@A2geUx6eWgLMG=_fa_l=i5+kk4Yav$$D~fcM&@d=5x{A*m|tB-1lknF4YrdDI=ls5Hi>_qoB) zB=5}6M5tScZTwh^}5IuFwWe1o*>IyQ%@3bL^E7NEs+U&;U|9|8&i??;1OL*??J?~jep;p<#NKkk&^-bQWq{eG1cQk!t1|7N6y|v*RI?QJpaW_ExSTs zPRk;X;TjG^wV2$2NFp_e^9?J^!fycbS6P9%1dp{!f|2R#9Dx4zr9m88puhWT`Y~IS zHSPhG2OcMEgf&69_q2vT1^hREU?W|Xm^=)qRj*aM#ofI;^(|eV@dKl8-OZT~;O%ltTMb7bPrZKaA#}Qp!L}E7XLE1ez4f=8TabYyc9d>#+Rd%s&R@<^$f-?Js z60>22+5PQpy(L5jJOdo$On+$os^vJB?px(d&ebP@X6-4Z$|_f-F$pE9JrP5ObD%w^ z4A~HoDMRzuo(s7V$yhe8tuh{DIb)(B@)aP6_XiA1*_^U+O@X}9wdE8(=EiaH4Z*6JX zl6G9Fo@>zf6+aJ}3mA@ytPUl=l`{=$s9eSFo>g8sG5u^g0R9-ShDz{<=Arfd;P$v`?imG+moFHw_c0vpl0&fc5x$ixf ztZOypNzZ=gew_0=zw>eL(VgQjytT^yYYq)Lk@IG9Xq<0aX{Npd45vPUQF z*Qo}c<;dT*;b~fj-5U<)kok8o@h>z_EkkJRnUl-yL#Gg#zk;Of-u^%ijOBv5jNZ{< zFcTMgrQygGOwKIqoT|8Nrf=gy0{|29?DP|CH?AVG3z0mhkiD zs=8{ry0UZkKp-7d4xke~Q7}75a)`OtxRt5y1l2K$Ni>KgwkFzviMX(9YH-3##NOq0 z&`QEQM+9tao^f%oj+20*u~-mGF@WSJn10UL^?5*(mHwNv>DPmOL~XpY63ld+9|#l~ zuO5qlistlFJ4NXGoMZrlZFG*W;!aqpOSi7?y{8khCtYmA^|u&Q8C>!M78bx& zATwr<(;V^v=O*$fQrz)_yE4!aPD_(k!#u-z@n8{&jDj7&Dvv@y0b`1e$dpcE*&=_z zOIINwLT6?>cd;wUG!IJ&(J_KAt`9|`A z!Nfv3Eb~G!Y|_G45X=5t5#K+z2ED28+$ z62j|072$p3U&(5~G>J}>lS!?Nn9Q@Wwhg3R-yi63){~jr90~Di6)5XbIr)&Ib!o3` z1@rRRvf2-vAPd?iLlT!rGy@^&VbI@QG;{{?8ePwE%$0YoOP^y@EvDkea}< zg;DK)@R(``NB?51!^1S!Au;*|^nRFy5IiY@cOaYoBF)psf)A{JUGV3j z@>%d-oE#2BHa`yjiyfzX;$BQx?y}%_-9;z5Z4ATg`=cf-*O(5|4P z3cY8B=OH2P@QBRzrVq1#{ummM(u`Q9$eU4!WeVf*&RJd>1qElOdFZiv5{8J)K;)yX zC=`WGJ6C3qWOterbqkUOA{kCY)vds5GMQYFa$P8dUL|-)r@g7>59>cZN zmf^q^v^JxzFP?|{11M}HYMS{HO?-dAQGr4N@+BPKRsW3zDAWm#urZ^ELdHz(yA)Ek zP5ll-TQb5vMbEc=(hQGB!n`mt%^OGlq(jiLe2Fk-|7h$0=t8m+Y#Lf`v5oY(tR~K2 zqQR^Nd_H(TYZ=aN%OI@Vh52ud+=g!3PHj1^E;Xg`jal%l6lRs92^psA!mnoV+2 zdeufT475(WFi9q{B)`i`(X%>fw#F<%lOAHFA@gWt+I*fJI&Vc_Eo;CrU?~DO1*oY> zaUzqp=8N@3ptrc>DG{PPSpxRXv}cgnnu}7{j1o{vM1B`~beUeftCd`m$8de|0eNr> zks5-#a{M^mm!){Zytqy;T2^r|@wvs1`xZ^S1o3-h_a#7q5{dAZ<9~L(9lCd7@6CJY zJCE)$$C2Pmu>Wvch=CjfCy00;Q>j9@G_cchGTMkp*Op8&*q%kc2Y_X_UbzD0jpry= zq?s%%v8z!OipMcq0|{57lN?F4VQAPT|LNtSD#85*3WG6AvEs7ok6B zGN-{(yvxMYS^NXv5>>Z(RHar;6{7DIJE&Y-R2SA}Y}(BDS60G}8Lff$f7elqM_k*y zqo;ev3(no`-JKnE&h5^vyF0s`Ki%8YzNhnN-5@WX&oj{`PuWx3OH?eWAh&69D#-1c zoPzq2CTD8{q$GIWvkuoTRZsR>)vim4kF_itTWQ1E72b{6>UfLxzs#h{DSN5}g_xy& zg|h@2E3L+-Y2MluO+R<3quZR$wG5zKrphVrVw#-tZdQ|1-W^DJ$58p9c`46QwWK&p zVUCwWA!OoOIbB7g{yt7EIYS+p)#k@E`Poh76&2ra@7Y85m0cAzFb68t#U+-M8g(M& z(r3B!RON=ceO`6isck!|$reqn(l%Qtcly);_>dP-hT ze_vq|k5{R>J=&&^HF=*VzXn*~AV7$Ame;6Tb(Nb|?ygq1y{av1(IHd>-@B{n^Ob83 Hd#(Qgf`d*8 diff --git a/09_hw_debug_JTAG/src/bsp/driver/bcm.rs b/09_hw_debug_JTAG/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/09_hw_debug_JTAG/src/bsp/driver/bcm.rs +++ b/09_hw_debug_JTAG/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/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 78303c49..a0c0d593 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 @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/09_hw_debug_JTAG/src/bsp/rpi.rs b/09_hw_debug_JTAG/src/bsp/rpi.rs index c22c47bb..47cbbab9 100644 --- a/09_hw_debug_JTAG/src/bsp/rpi.rs +++ b/09_hw_debug_JTAG/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/09_hw_debug_JTAG/src/main.rs b/09_hw_debug_JTAG/src/main.rs index d65a33b3..e99e681c 100644 --- a/09_hw_debug_JTAG/src/main.rs +++ b/09_hw_debug_JTAG/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() diff --git a/09_hw_debug_JTAG/src/panic_wait.rs b/09_hw_debug_JTAG/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/09_hw_debug_JTAG/src/panic_wait.rs +++ b/09_hw_debug_JTAG/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/09_hw_debug_JTAG/src/print.rs b/09_hw_debug_JTAG/src/print.rs index 86ab59b3..082e5cb0 100644 --- a/09_hw_debug_JTAG/src/print.rs +++ b/09_hw_debug_JTAG/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 @@ -83,9 +89,3 @@ macro_rules! warn { )); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/10_privilege_level/README.md b/10_privilege_level/README.md index d7b7e209..2339514a 100644 --- a/10_privilege_level/README.md +++ b/10_privilege_level/README.md @@ -371,7 +371,7 @@ diff -uNr 09_hw_debug_JTAG/src/arch/aarch64.rs 10_privilege_level/src/arch/aarch 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 -@@ -65,9 +65,17 @@ +@@ -63,9 +63,17 @@ /// The main function running after the early init. fn kernel_main() -> ! { use core::time::Duration; @@ -390,7 +390,7 @@ diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs println!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() -@@ -78,11 +86,12 @@ +@@ -76,11 +84,12 @@ println!(" {}. {}", i + 1, driver.compatible()); } diff --git a/10_privilege_level/kernel b/10_privilege_level/kernel index eb7c2e42253f02c75eb457706029204d15c03d47..e369ead6ad9c5763cdcc19f6a98acc885e52b3cf 100755 GIT binary patch delta 13014 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 Rys+@?wE@Z9WMCVv{$B#&Wa$6^ literal 94720 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 diff --git a/10_privilege_level/kernel8.img b/10_privilege_level/kernel8.img index 0268a52c000f8b846d083c2e6f635199c6f46f62..aa01e32fdc253699a514e7e72fb8f595148f31fa 100755 GIT binary patch delta 4219 zcmbtXdu&tJ89(P85+`;N=Vcp1$W0t<=LsPY2MSFBXvJjB%9ujPvW3zCOWKtJ zogEPBQkcr&q+5Vao}1DwIMe6%9MEVh08(Ozl!N^}geK4WZjK zMZ41Vz2D<}-|u{{a~<&ElUw%G?H& z5hkHRm2_W=x|x#7#Q3VuQ$MlvN-8+5J!Hu0I9y79htpDuXAt34 z=|Ff0lj9RVx^iu8F8u`CL?^jNF}d4<$!G-{?*$NBTU;dkedOOE}zq z=Toh894{cF;4=YyGhFu+-wyQ(^$;u_pgYyJc%-aEzEaw+F1B?o91j&Hh-+~5wGad? z8==1N4ou!EnLz>?jg$r1qC#9=MRgR~nVX1&9`e!!dEX=k_2EW{>ryn%VmonED}|2g zq+L;;t#PY!fAgddW}n$+n_$7a5w}>q3X~60Q8U*V_un>Qa)FLdhsxL%tN;M5$s;4Y zx!?^N)RbWjO&4-mBrAkEFVB3dP#G(l2JG{2kVUhFzuNYzCF6q0?KkRGD;M&p`z(jn z*F+)>jIYIRKa+_$D5bg#{q#+)D>KcgUO5N!Zh#)bs9~}VCUYsWm<=OF{@anr%5;Vi zoQ@%PIFIAlzF6-gg(U*OTXBuBdm6|4#h|7wn;Zry$xWkpf#*5NB(LWh)2;A(YpHJId>6$_AL(L1?i~FNWFejHm(+@tQqt>Nv5P} zpq~Ktj)U#p&AIgDq}&v6dv6gYFs=LkUcyQBRy{qM(DPx`99Kt?#(~pc?D$ zgrQHs=P;|w`uQ1TbQY3yfq7R&xa+@+lrdY7?%~O;@fq|hvqN_$mtqGUOtw)=>UHD$ zz-H%10LBg=gle==0du zuz_kWFuRc7ycqelGm&2>B7b}l@+SaK&bE7;M_I@<1K&KTBk5{d!{96=I0M4DhEFzii6uSs=MF3UXX+Bvyh%PT3G@q;ko$w9_yO)z{VNJxVlEQF&fumtDI1|oIUdjhPOAR|i zM}`pj3`6t4h--q1jzl8fbO8{toeO{_wtEJMIS;@>GdM8=2(1D@2LN;cARYi{K^6i4 zA~+cZ5DY*l9*sv2>*kpxG>ezmtO`|C+{aVyOx&$5Fv2t!u|3ekjaOM8x6 zn@2xMtHJN|o6-$9`Jf27WJyWwy~&$Z)DeF&m_T50K_+0?(qnZ zh=-j9Ed-jZ51M9}MQIcwwEhHi+Mr051H8~In3m8zR*RiBWt-A}t_&Qo#lXmsQG8AY z^A-JDP9bOEX-e*Ux*c}1mD`=&mCfqnf(Jcy_y@e(<}M6RDD)oF+DAcjj>1tH1J&o8DOc@ zLCONK*&xsLM!YcMp%qzrjZnxeI}nK8VEid*G!hvL+YqUTk#Ps~!|*-E0wv;7dMQJ+ zuyQmF6&ivcz5b!l3W;JgOv&iQ+578@9C)f`zE>n;fe#tQ3_Ug5;hG|t3q>^35t*v* z&}`ZFbj5d~gRXMUnyT+M2mQTs){3bjcF4ZvUnn+(h8k1i&|lzs8BZ0=W*7aac*^`<5gOJvP=0F zq1f}!3jezDe1X=Kr|Z5>mE{Qry0*ML>y{#n1v(Z8L%u*ym*-^kl*#Jw?HIlE@S6)a z{Y!a1*HcC-E1s=0mdiS^WM(LI%$7-^WeW(c`_>*~@`C;qMOsWp=H$(ts>z-T8G?IhVo~HF Sg-(g-BTIGkHCcHo{C@#*PAnM! delta 4656 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 OuYvBWFQMj@1^)(j@!$Rc diff --git a/10_privilege_level/src/bsp/driver/bcm.rs b/10_privilege_level/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/10_privilege_level/src/bsp/driver/bcm.rs +++ b/10_privilege_level/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/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78303c49..a0c0d593 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 @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/10_privilege_level/src/bsp/rpi.rs b/10_privilege_level/src/bsp/rpi.rs index c22c47bb..47cbbab9 100644 --- a/10_privilege_level/src/bsp/rpi.rs +++ b/10_privilege_level/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/10_privilege_level/src/main.rs b/10_privilege_level/src/main.rs index e89366c4..2259e30d 100644 --- a/10_privilege_level/src/main.rs +++ b/10_privilege_level/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() diff --git a/10_privilege_level/src/panic_wait.rs b/10_privilege_level/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/10_privilege_level/src/panic_wait.rs +++ b/10_privilege_level/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/10_privilege_level/src/print.rs b/10_privilege_level/src/print.rs index 86ab59b3..082e5cb0 100644 --- a/10_privilege_level/src/print.rs +++ b/10_privilege_level/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 @@ -83,9 +89,3 @@ macro_rules! warn { )); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -} diff --git a/11_virtual_memory/README.md b/11_virtual_memory/README.md index 87352d67..bcecf698 100644 --- a/11_virtual_memory/README.md +++ b/11_virtual_memory/README.md @@ -239,25 +239,24 @@ make chainbot ### finished sending [ML] Loaded! Executing the payload now -[ 5.732854] Booting on: Raspberry Pi 3 -[ 5.792441] MMU online -[ 5.793306] Special memory regions: -[ 5.796778] 0x00080000 - 0x0008FFFF | 64 KiB | C RO PX | Kernel code and RO data -[ 5.805026] 0x1FFF0000 - 0x1FFFFFFF | 64 KiB | Dev RW PXN | Remapped Device MMIO -[ 5.813014] 0x3F000000 - 0x3FFFFFFF | 16 MiB | Dev RW PXN | Device MMIO -[ 5.820220] Current privilege level: EL1 -[ 5.824127] Exception handling state: -[ 5.827774] Debug: Masked -[ 5.830986] SError: Masked -[ 5.834199] IRQ: Masked -[ 5.837412] FIQ: Masked -[ 5.840624] Architectural timer resolution: 52 ns -[ 5.845312] Drivers loaded: -[ 5.848091] 1. GPIO -[ 5.850695] 2. PL011Uart -[ 5.853734] Timer test, spinning for 1 second +[ 5.791515] Booting on: Raspberry Pi 3 +[ 5.793767] MMU online. Special regions: +[ 5.797674] 0x00080000 - 0x0008FFFF | 64 KiB | C RO PX | Kernel code and RO data +[ 5.805922] 0x1FFF0000 - 0x1FFFFFFF | 64 KiB | Dev RW PXN | Remapped Device MMIO +[ 5.813910] 0x3F000000 - 0x3FFFFFFF | 16 MiB | Dev RW PXN | Device MMIO +[ 5.821117] Current privilege level: EL1 +[ 5.825024] Exception handling state: +[ 5.828670] Debug: Masked +[ 5.831883] SError: Masked +[ 5.835095] IRQ: Masked +[ 5.838308] FIQ: Masked +[ 5.841520] Architectural timer resolution: 52 ns +[ 5.846209] Drivers loaded: +[ 5.848987] 1. GPIO +[ 5.851592] 2. PL011Uart +[ 5.854630] Timer test, spinning for 1 second [ !!! ] Writing through the remapped UART at 0x1FFF_1000 -[ 6.862236] Echoing input now +[ 6.863133] Echoing input now ``` ## Diff to previous @@ -547,7 +546,7 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ +pub unsafe fn init() -> Result<(), &'static str> { + // Fail early if translation granule is not supported. Both RPis support it, though. + if !ID_AA64MMFR0_EL1.matches_all(ID_AA64MMFR0_EL1::TGran64::Supported) { -+ return Err("MMU does not support 64 KiB translation granule"); ++ return Err("64 KiB translation granule not supported"); + } + + // Prepare the memory attribute indirection register. @@ -730,10 +729,10 @@ diff -uNr 10_privilege_level/src/bsp/rpi.rs 11_virtual_memory/src/bsp/rpi.rs use super::driver; -use crate::interface; +use crate::{interface, memory::KernelVirtualLayout}; + use core::fmt; pub const BOOT_CORE_ID: u64 = 0; - pub const BOOT_CORE_STACK_START: u64 = 0x80_000; -@@ -56,3 +57,13 @@ +@@ -69,3 +70,13 @@ // Configure PL011Uart's output pins. GPIO.map_pl011_uart(); } @@ -781,38 +780,35 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_memory/src/main.rs mod panic_wait; mod print; -@@ -48,6 +51,7 @@ +@@ -46,8 +49,16 @@ + /// # Safety + /// /// - Only a single core must be active and running this function. - /// - The init calls in this function must appear in the correct order. +-/// - The init calls in this function must appear in the correct order. ++/// - The init calls in this function must appear in the correct order: ++/// - Virtual memory must be activated first. ++/// - 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. unsafe fn kernel_init() -> ! { -+ // Bring up device drivers first, so that eventual MMU errors can be printed. - 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 -@@ -58,6 +62,13 @@ - - bsp::post_driver_init(); - -+ println!("Booting on: {}", bsp::board_name()); -+ + if let Err(string) = arch::mmu::init() { + panic!("MMU: {}", string); + } -+ println!("MMU online"); + - // Transition from unsafe to safe. - kernel_main() - } -@@ -67,7 +78,7 @@ - use core::time::Duration; - use interface::{console::All, time::Timer}; + for i in bsp::device_drivers().iter() { + if let Err(()) = i.init() { + panic!("Error loading driver: {}", i.compatible()) +@@ -67,6 +78,9 @@ -- println!("Booting on: {}", bsp::board_name()); -+ bsp::virt_mem_layout().print_layout(); + println!("Booting on: {}", bsp::board_name()); ++ println!("MMU online. Special regions:"); ++ bsp::virt_mem_layout().print_layout(); ++ println!( "Current privilege level: {}", -@@ -89,6 +100,13 @@ + arch::state::current_privilege_level() +@@ -87,6 +101,13 @@ println!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); @@ -830,7 +826,7 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_memory/src/main.rs diff -uNr 10_privilege_level/src/memory.rs 11_virtual_memory/src/memory.rs --- 10_privilege_level/src/memory.rs +++ 11_virtual_memory/src/memory.rs -@@ -0,0 +1,149 @@ +@@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2018-2019 Andre Richter @@ -973,8 +969,6 @@ diff -uNr 10_privilege_level/src/memory.rs 11_virtual_memory/src/memory.rs + pub fn print_layout(&self) { + use crate::println; + -+ println!("Special memory regions:"); -+ + for i in self.inner.iter() { + println!("{}", i); + } diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index 4cdc7bfc138bd4bfd5ff7ec03b8468c68c80be47..5d8908842af458418eb45cb5e574e26a897e9dc4 100755 GIT binary patch delta 13674 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 delta 14561 zcmbtb3wTsTmaeMK<8~g9CwY@jLLi+$NGIvMc!huh0R#dLC~DFq!C-h9z=>kEgF4D< zM(#}9Qo{EEGUIqrhd7Q#hE;>QGpOGz}^ugCVagM9-;AJsvSV^?09c@4F7- zc&Eo!`|i*T+gsZR*_8`_PD=D@PrCl;<_O~#@cjAWaN{#u`ayqQsNsZX-z!w#kV$kW zb?6tChZ&!a(~Q0MkdJ$8WC_WxG~%bjSaju}gHC(5ql)N0Tl_&XG*m3s*)$sW(4Xn3 zX}2>ym$cXPg@zcEkbxmDGcp`b-JeAa4W70AIl3>88a^AW&$AhQGl>4ll(-#$X2Kuo8Lwy9+H0yRC+OvBMOft{HGZ2tw|c{`TbiqP{G~be zcb|-hxmsIT=jq_TezHUB`y`%_-kllg`m?`H);0TUyZ=PnYwq~{wwgG=?cdCK`$rLv zwm93~=sZ1x>K&)z^fRR)Uc>p#+_yiqk-?n(VJZC^sD64WHJW=nYntmHZ;5SduZd`T zuCsr!&CuGO==A52!R_CyeA@uA=eCXN)V^tX`)obc6A0;Q20R1qw;8c17h0Hpb}=)~ z-b?k29;Ww!3QmFQe0kwcshX2ceLK)NTk8!neB(k*eP!h7e$bIGPc!^^cH?V1=!%kJ zp_MG5m3_&&C%C<)zAi-)yG4wHF82nLj=CW7teBTDduxrDcY*F}c_oN+IPZS0(+5nP z1_pAqza~3@$-W{oI3AeyfuKI`3>XCIcEUh77;W3HVpEzu6LlYOzZE#_UrY}715tWcu~#+;r4y+6xt__H))vyF5_6O$n!p>PasOOcMw;Rhx%dWv-6B+@Aa zz1mQt7CqyG2y^k!D?x7wNxoheX^@^&{mWZN7#C|t8ec4pGCo@nZG5vi#<+=*4h?+9 z34dEFNO2tahR>$uE&<Hj!;#2zT z$>G^mWyeV*TfCP)YoiYDYYrVaj}ze`rF+4l2dQVDkaoXA*typa()(;ozW`1)N<0@a z{atXTWU#%j7E}t7-nfD3BJBLjnISahTW&K%=s5Qm>nZRo{6vJGuQ|wg9B2z)DA}Bq zr<}zGF=RJn9={|aKpEp4Az6qD_z8m(rX3$F-Bd9U19cjcKd6=7Qoq0 zfm(Tefgr}uGn&ghB|ODOC)i71^}amf4&mPf(H7dp*9X&h2D2UrrlXS=Me4$@`)oG3 ztZPaQ4S`(f({U_l6S4pOiXub~8iO^4~(AzUq-}6ke)JI<^=v3$qbSZS^2VHH>nxvPMmU8rG!oe2r#K zoB%cw1K$y8I=iAsUX5N~I#mNLMwr_JvG9Kd_xCX1aar| zAgPaVJI!D@u(O@!=jFi!p|s|cLHb!xqOh4A6nGA_BNhoOoGzt?VEF+%okNHCTXveo zLPGc#b~+Y}krqZ%=;ypV3|x0uzWiI58An&l8d)}da_Hspz+5|Ce_gF5pmrPl5i-uq zI6dR^Q?Pb|T03M5e(UqaF)|F|NaY|u5k_aG=YUAJff(A!U>#CPoOl+_ubmCnor9%( zQaDXpF67?!Xl1!b-69V(2Z!i82ZMDHal#t;@HZ`(+`jFx%JS`W$8Ifn?{2Y1%x{i{ zx%LoUjvuTn-vQ(EVBJ$mA^MxyA^e$enlq-?mnF(txb7Qg7iqP(A4*$)R*GR0RASVUR@2h7J#YFFiiscU{hc7N5gT7Lmkq9R2i6QPL zk$pnRASRO8(WDsCWv57^{UF$xda5TuF@dbM3!|fdIW?d{dUX-`XO=P}92|BKDoy`V zn=uI{PF4&x?T_oc@$CuvSzu^$eY_sgR{8VOz=&r5Tk;bi+4eSj=bi(jE-_jS0-XZJ z=Ky{dQlem1RI0Bgh8RvGA;mW?+_@FjiR$=u7UU&SasDfWbhJYlHk}HTL<_$xiI74_ za~4cvjdLM@ln9sQ0VxZy1tCHCt4Se-ApA9ddIU`x znUEq1Z-1!<9YVPC=lpLY=(uGfG?@s^VIhByY6LEY?eIncxc?_K2%=FS5UNcfBu*Ps zX`HgrgMBvb;7ObPV6C0R@zyBn@%l=2(Mk3}Hj^EtjlR_co1Fv)(=wn5uo0bwwAXx_ zWivLxrl8VYeIF8O$5Sv?Elfg)``eVt!66%!w64e$%rz8KVjuC>#K-{uEQ;o62frHP zf?a-hG~F{R0lJvIj5LcL4x(;AgP!g+FipqH75cL;=jl1oTX!2V9lMht5XzyPKuPXW z<#?C>K(OJy_n_9)Lp?s4Df_U^wlOkAcgE0c`aVAzL+c&yh*S=n zy<{WJV#9tQgqsOEJSvVRiQ-usOOqMR;hSS=5`COM6ib&o_Fu)~6zY^~*`{E=B97k3 z*4p@saWpyTySr@3HD^`@^Za-^ad_S@gsNm3S>^8GPVfrV9|Ap!aSV7Lbe5v076C7M zYA5v3GSH#7UIo3iAA0I=$Y$H1uU^&mTBidt7~L0^B5Z|DIAXXL#%O$dJpJ)vNVDhf zH8bNXu$L43Mr6bhV3z?1!#7XH>F2vcpiv=%q9+&qI8=*)<}Jngz!5l|z&@fF%65E) z4BK6N$tdcI+2Ynki1`mteftYxDWWp+QBe1f@n=WT0=9nw|7a8)%TC7ekqLBk4DfLd z)`x+q&K5DF8q)r>1R8H@by)&+FWH~3i<~OcC2)KS2%mW(LTtd=LGK?&j4;)sR$mx$qt1q_?6y#zn@B6zYQ|S4 z((6J`LU&Kv%lMH*I+{H)gTI#up7miWzmQ1ZWc$D1v$z3i=T=aNAiwAbw#`5lD&AlANZQT*L_n&%bP1+9wHmDRfEyNMyJE9#sdQW{!U z)VYBoDtdxl!n)0in2v|7fg{l304@$z+ra80p$_&RVMds!cTfk1wm1VdP}u60 zNHB^pnD7MO0&-Y*f)M@OA)6se%TrsX=-Sb#X8i-B_CsCl&m#I+C?(>cCAxt)2+qDx z;;wbrjt_zAP{ujh56XDSgCXY+mr;7Kr(7SHWbt6&9pyU>`Vs6)87FDRTF{e_Q^>d$ zbR=YK1`&AsC>rebRG8ilGAM61Wdd2`sq+vu{DA_k* z{xB>Re>*b$qNo%6zEs*9|2r6=!1C}Uzm2a-qtDRQJZ&^ROsD4pZ%S|tZX_qcT19R(yj=QSV%3(Z}XxgeP>3fJ|Ecjje~Lm&Y#h4 z=NqzVel7%q@GalCAoBq4iGZ*VHs-)wvEDZhs*DZh_eJnGvZ>>HH=i_)o^T9^gCQJ@ zc6CET)4GD_OT{NnebfKkQjrcUPod<%sG| z&!e+x(17#yNZvf2J`CSH@>_QI_z84ma8U2gEs@>R3aNtz^=4GY^7!HFzrebhtL6K7I5msQ{3N7D zJ%hK(3(Q$PnchLKnxUpj{>c=29qX;+Ra5^D0y(Dh-BW44cgJ*-wGhRSuAb39J1oy! zJ)^(=(D)C`@18Y{rm&@p*EiO$@~n2OXpRvGff_mr-|wr zc_>iN=4?XnIho&HPG6g4Qn^|p3$HOZMN8FmZ@Gq!r2P3RT96zRjRrOML{1lXVS##t!gLS@6ui2 ziRylzx<@I}IB#C2`R%4m{+F4wJaTSh%i6}(j`g0ktLiJbb`8zCbvTp}cC*90W;U+a zbZdpfp={uuZPGy-l&NQwyj(r2?a3qR8Tm10i@Y_0dasrc6245xWCS<9N_t*0=R2JJ zzX*~$e}LY6&xYp4h7B$C6Fn{UP5fuGXbk(Jnm;;=P8Ii4v*?eiHq8yxZmW7mA@5Yr zsNGeTJ@1^`eb;PSLd&m~(8YP?##yo=#6v}JG^}gf;8?qEqhrIS_3PKQY;^FhYMNZN z+~I(iRB$c0E|Aw6^^CkOR?o=mHsn=qQLX&xs>$4dWE95#Mh;N@qpUeCd`ZjUF30q$F#pW~g zwDM}L;Vb6DLFK{4yzn~uuQiS(=J=gzd_FkYn&MU4CICQ8gKe&r&!xABfLac%NndVucS_ z@Ea7aI*kgXLu%DPj%opLpi$wi7QC77XDq>cyBfyM0hj$);Y?L<#M>0ES@3%mzRZGe zQ}}ud{-B9hk)HBEKj=^ku$7RH@UdIr*isX{KWgz}rh3~T9 z&nvvwg1@NnDAf?iNBDTv#J$8}8F*bSD6` zGXGOyvn_M|3a_i+zqPSz+1)n&rH$oh-fc6Laxqj+AT9`U#we*HCZ1~J)j@2m_dbgZ z7-{!gaE!EV791lDyDxJ$LNL;>3qu?uO?6vd#ECdrh!Dg!3kNXj9=2?ZQI}X1Xnl;j zL`y4$QHR}=Ngwvdu)|&qH^!*L9t?4ex`mbvn&kvWc3E%?Lu|v4jtoODNL-`(GaSG; zTxP*B4j;GR=yt6Z4WZj@w&3V?-$L5Btbf@310}(~SQen~ZL#3!d-quIbCM1v8^Z%l zvr!fTN}?h!;n&HjcftUJGJy;B$ccoE8EHB#F1XJor<3!sgir>VSg9Jj&{z1PAeO+_ zYfQVLBkIy7a?z)XsXZ3_qTSpBainz@d=UYIbdcKL0CoIb_M8347b&L>f$#ENu5bVhjR}m6Juq(%b`8*>M_(C&5la3?u zj+%m2KLAgc2M9_u)u7{Gw!*Q2M?6pA4$FLaJp~u_k~5YK&_Aqa5*H8>?tzRZsvTA< z92p&>@Lww&>ErxwU|i5K>4WPBsRaiiISK<7sN>7S3cm=36+VCxG$`B$E&OnU=P5iF zx*&n0MI8$NQM^e9H78F1@TQ3TQw^Z%P~oSf=g>iUOES-1!uP>fhh1qrIvm_RDx8IQ zp?6Wt;{uGv6}DYN5yUriCa3H zp-|=KFqS`39f)ViVMZ2Oa8&X>3yw-2u;3WmU1ra8n_`NPC!{tR$+1}FLACKj3yw*@ z(1IUV^YJi=8~mNqkr4Bk;_*<6!~dz485VMWg?CwSbc!BJY#&k)gLs@Wa$$^&jH*lW zskVe{GzSREC)EI(KBsV$5AiP3Zg{Lj{?TrDoJ1V$W<7SI-5$3bN6~HjB;Ar7Z+!GBB z@=ko994c9p;!%P49V5+@hV$!`#?L4m=UqiIGWgpe$D9WW_K1 zJS?w2nDP4${&W8-55E1pp}F>D_d!iOO$rzWCQO;!1?6LFD5h z^Xc;EKjb*`UON2a5Hf`C5)enb<2wYz(eBGE0-)U=w%};?WebF0m;LZk^HwJZkUSx1 z_bv;L8cIzI)X)*AHlpSsK3f?u|4Nz=`%jd6G19d#kPwDUp9RO%fp0sIRctSAQt$Z? zM-RleABc-?0rsb4yd!X9EKK;?1Q*N{W{3HATjtMEIKE)S`PTt1>KHOAr@`R83I~Qv z{lBVKyr%|`p)!TL;O7WQNNtQR{(!=fpi?G(JufteQQgm5hS$nr?>+MMIwO9IRktb}-$^MB$j=o1 z{Gvc3bx53&9?Len6}}`ZaQ>gbEupo#ksu))eiRae=(&&~<*wvIgvS3dfg!h~KI3MDnWLR!9x|k#Dbge6X4~R1&@XKBJm0Vt{3WDt#taN zib7lfO^Cd{P&hJbo=6G#9HLW1Ep80|z(8I%@~4xa3t21qf^(n65*rncFTB+%a+kvK z#W&*Z3NKJE#1TgWZM4XzLg7a8OUnRSZoq=$3ETRH{(jh4C<<{bbw{Lp^w07p->W#I zN+pxX8kwwW58~ojE3S`C)x_Av0~Be?vIK<}TkwY=Z3|7~eB5j|&=ok&->LF^D$u!7 zgEqy)y+dOA;TQa;3lakiVfn)ZTm=oGz%jw2>3^kgOz?=qzfzU+t@s*+n*|J_?wG3T ze^LV&eGjV^^D~8GK3k@^9S2S(7(%0C7qCR(Xj_Mx{}Y8{(8w-BWStXg04qAGbQyHm zVgoF}9g5KJ6^>zyXZu1>m6(swikf>>;h1kK6`cj~@RN{OfWKtjqy}=pWum~}tnV{i z62ClOO(*O5^fZXFyPyS#3h3R<3HJjow!xB(@-fiBmE>FTJ^0JtgO3511Ug=V`LS48 z?q+j(yraB5XJMk~&r0=_NgTNO_7H#W9zB>64t8ax|4-D^j) zy_BCRWM#b0#iIGg>1-6wbg(4;Nji(?*E?8t@R-(oS0O*|V7dH&gB{^|I?LksXRr-y zOat%BfVV}Fnd~;PATFeo!0b|fa|UyE@6Ke0Xm{-xwkb5uRa{U0hh;F6S>!U|wD|k!A3ViR>e9adCaIyL3hU zN_TyOyQto?5?Cu+*;rQWE_4@`d&=_*@>j3EV@>{*m?oaJ>(=J~AO+X|K%w$~N22h1 zN$|=7c5IrY(pcp2tgJ67b~k$Ji&wZnxdjak<(`!;SE;+Pv7it|DJ=sL%gPE0%L=x4%y1J0}ArLjD`U9~MFY diff --git a/11_virtual_memory/kernel8.img b/11_virtual_memory/kernel8.img index 823d6b9d5015bb0f873a2ef9b826770ba7ba3b52..450ae8c10de26f4fc2ae3f8a2fd5c9edfa9ec206 100755 GIT binary patch delta 5907 zcmb_f4Nz29mcIABZg{V0Y<>m0fqqS^(173{AWbAKNNm90R@aQqE)c>hwxtG=U8h{C ziP@PFacjAI-Q5hNDjH`dUYyL3>X?MgW&`8yW|G;-;yPw`Ols5Orsg%Mi8_hX{)9cZ z-+RWGNlj6;x9atK_wStVoO{l9Za>>=dbZaz&=?vQNs%x2yme*n`H1-Z`wCKiJtnri zKT|K9{ap=;-8dkz!~}FSVn(O?5E>|k$Ab}Ra;1?QqH|ak5s8){c5luFbK_|+hFRz! zx;7@F&1k-lWvoQRlj@5p_~G}v>kv`JjA1l0vn<2~NI1P8%@47nWM2%y0tum!=rfo| zFV~V{)EkH-CNPZ9r!yguxsK(LsN2k7&8LzpkEkUAQ|mFjO)T;ZB5zvJQEmh_p`+z9tYr83LIuaORBZ?47;I?ADGs?Ds7;_W9Nn_Ph0| z?CyayCP!+{7r_&4K+7_G-w#AZxp;H;i(R{#`u}rR`YYE>QQVMyhA~_1H6&kb85&HSHy;*XE1r`?w_B#SzsfldXk2uyItp^ zK@)pFAd?`BtAC3|J5Ogiq_(&lo#YcyAXk?PWU^i$pR{0hb-TbWZx`9^LJN!jM-o%FqnJ-dM~~H_3JJX7foJCm`h{t6_JBqH z^L`dHz2e6(tIwDt~M777w6G#^TPae*ovxAg#tF9UK^ofiFHt*eIU_!N*F#36z<; zHVkz3u%T(d&#_H`SkK)Z=Qu7<<(LK=rU1VMVnM=k^EB8~gr)wbaZDJ9HI7ORC2GNa zv6KcA^6(zomrz{vbyQE6eG@9&Ko=(Nv~R47O+nnWLWc5e$_2gAFecBrZS<#!cK@Yv zk_Q&607=zd9Sxcphw^6oVxo4N*e`Uq8qn@S_JcYIYB*Aq!hWZa$H zRa9yaE+oK%Emb3l;AN{8YA(QpT9e77=q#>*?;;Vx4jl~euux}C zba9m)Tpd55*JPJ42x{fBk|dbshZsCwO|HP9@}QRCK(B&lj3}F~!i=L`YH7qz&>o9h z*l(sUSQfw$ykl|T9rR<1(uthJCH4mDdYz=%qVW~a05?1wR-3su(5}oOlWvjx1c;b( z8=o)W^Y`}VlZW)Z2ylt;pk9Zz*OwdL`+Nf3leEprX>%7qm5zG}n2^Ey+*0W!FY%0) z(%&ZKZRe)-z2K|1!dnF%5B{r{92xZzo@CtHbKrT{jGpNGk+1qN?jMxQ&kyoFe0}gN ztbNBz;`774>VBAC1N&b3jhDRlv6r@3i{_1}ZYTy%JWSL=nMdZtRH4MC+$JKqYy`lJ z08i6X)`j`;%yiX|&mfCA=WG2HkdX;&M5dox^NS?~kvq*Ob~|WcvGyc(bGwy&wket2 zI53B)i6~|;b6+~GOfC!o9cF?;&cB>?qxG1a21?}gn+&wO8z^`fXg9hYvn$=0>;@Wc z1lr98`Yi(51^OMhvQ=a^3m}8Rh#}~6+O3AS)bryZFT6SJ@&GVs_lAguueRej?S>A( zrr_yp$5e}naqg}@VdmvC#%XrjrGz-es^v)@PPdVEflNX)UEM0M+v`y*R+7MO6#}1u zx4sLJFa`m9*OTxi`htv`t zmX`m0u`6i~kUuyqYD2L`NX^Iz#CYttU=$kV=Cov@(Z~r*8do}B_q6r~{7*Yy_m88q z&EwA38!;M!T zGcz+;5&+_gB>=;d)d1vb4M7EljZRSF1Q4>hDMEE;hfOClWHQr&xUy(M_1_2U+}Lqy84fuXxc9gg6CY7|V8pi$8#Z-3~<& zXA&O72kPg>S^A^2`M83b)7x<=?M!!=_SQFfm)gMZZC~(Bpa-e@8#UK!2+|oN)6_$$%;rGe7 zu59}vR{`O{teygrJ|(fwpni_syf2>aw-YF3EB$V^;<@W2Q*i0F=-0%in==*MF#MnSx-?G=_3K&&MW3JRA|F;fta?JZVB1^alkY zX<{B0NZqPZTH;=XC+I%6OITMLrtUS^3R6;l1D1YScdVRF&wJD~Azf<-ub%INDHFEz z&&QVd6kRY+oBG*;2d5H?78GAg<`;qyDB=@fF#mT!g5$~L$apzf3o)-2LUKZsxRfPy zYf)J-1P!l%YN07!!X;b*2Wn=Gu#|6C3n4c}Sl(Mfe_Et`lVWG_e=8G^;}dY19C!_i z+5X26sRkL_E>(~NH!8?;&t!$OO2&lJ38d7JC6I`E4o#rm8d7#&A3|pWEvh7SW6Q&0 znID@bJgJp*efhKSf%(V$aLOW^*)(#*RT*|yDA+XOiqz26m3z{_mT5TGDEx)w^}y4% zg1%i@nl-|C+JhegBmbF25;2RwqPIT}TdH0a;Ex7EbgbGhJi3%xy!pbSDq8H#Z+Nr{ zf(;tDGTwaf3wI{8cI_6g0`FdZ-VEQoJ-EIG#$@`ZUPs-Cz7j5T@fOzm;N5t8Meplf zWc1;77H>bV3cumCjE6SG47RX62eRoCethGxuns&G}$J>$`+Elw>*4hu%&=+bK1ZE3b)wOFF zfK2p0L~OjlN!cI%3p{H$&#s_9_pK99ElpcFdt)}#(p@XdLO-k3U?u2a#`V4tcK`A~ z|82c*gyA2X|0COr)?&#Xnv0K^Kwx_e*1*)ZbZQRJ5`{%ui1rIa3B)V}+Ug}%=c!oay3jNM%XZksP)S!?3u=@C_OggqYyXms7$WUjz zC-m`%{#NyOiZ0n$*UJC=LEGn~1^#Lp^ebDHcw5!+*i$>a3RoI%AFtBZ8ONaNeZ!4W zy|1lC$kU*$H}q9E0P)Phq1nnY3zdOS??R3l^;+j`@>VsmAHDgat<|W zdflA91C`5^=FU3h$*#6N-MibKgp#1_fbXYvcPM-IKB;s+wQt|vt|vPl-=C}P(taUL zbXfcIw6DL?=Y4tf!iN7TNN?7L<7Ez(s(RlrMs21SHhxb?SwkNSyjtK`tF4Cnf4nW$ z`@B~2c5DsxZhB96Z7sEI{s+5%owoWr+9cWx<+ljF{p;u(oAd2Q^u*R@k>Stf1@!vn f+8kxQwp-EXeR@AFym8CR!{OE~5%b>*c<%oJlRI1h delta 6800 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 W@wP@*($>=+>VItAVBga`m-4^y=zWL) diff --git a/11_virtual_memory/src/arch/aarch64/mmu.rs b/11_virtual_memory/src/arch/aarch64/mmu.rs index e81ce7fa..bdceefd3 100644 --- a/11_virtual_memory/src/arch/aarch64/mmu.rs +++ b/11_virtual_memory/src/arch/aarch64/mmu.rs @@ -278,7 +278,7 @@ fn configure_translation_control() { pub unsafe fn init() -> Result<(), &'static str> { // Fail early if translation granule is not supported. Both RPis support it, though. if !ID_AA64MMFR0_EL1.matches_all(ID_AA64MMFR0_EL1::TGran64::Supported) { - return Err("MMU does not support 64 KiB translation granule"); + return Err("64 KiB translation granule not supported"); } // Prepare the memory attribute indirection register. diff --git a/11_virtual_memory/src/bsp/driver/bcm.rs b/11_virtual_memory/src/bsp/driver/bcm.rs index 15283aea..16df7f3d 100644 --- a/11_virtual_memory/src/bsp/driver/bcm.rs +++ b/11_virtual_memory/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/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78303c49..a0c0d593 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 @@ -125,7 +125,7 @@ pub struct RegisterBlock { } /// The driver's mutex protected part. -struct PL011UartInner { +pub struct PL011UartInner { base_addr: usize, chars_written: usize, } @@ -149,13 +149,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 _ @@ -203,6 +220,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 //-------------------------------------------------------------------------------------------------- @@ -233,26 +255,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(()) } diff --git a/11_virtual_memory/src/bsp/rpi.rs b/11_virtual_memory/src/bsp/rpi.rs index a09554f2..d59d76b7 100644 --- a/11_virtual_memory/src/bsp/rpi.rs +++ b/11_virtual_memory/src/bsp/rpi.rs @@ -9,6 +9,7 @@ mod virt_mem_layout; use super::driver; use crate::{interface, memory::KernelVirtualLayout}; +use core::fmt; pub const BOOT_CORE_ID: u64 = 0; pub const BOOT_CORE_STACK_START: u64 = 0x80_000; @@ -43,6 +44,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/11_virtual_memory/src/main.rs b/11_virtual_memory/src/main.rs index 00638f0a..e0f6c3e4 100644 --- a/11_virtual_memory/src/main.rs +++ b/11_virtual_memory/src/main.rs @@ -49,25 +49,23 @@ mod print; /// # Safety /// /// - Only a single core must be active and running this function. -/// - The init calls in this function must appear in the correct order. +/// - The init calls in this function must appear in the correct order: +/// - Virtual memory must be activated first. +/// - 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. unsafe fn kernel_init() -> ! { - // Bring up device drivers first, so that eventual MMU errors can be printed. + if let Err(string) = arch::mmu::init() { + panic!("MMU: {}", string); + } + 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!("Booting on: {}", bsp::board_name()); - - if let Err(string) = arch::mmu::init() { - panic!("MMU: {}", string); - } - println!("MMU online"); + // println! is usable from here on. // Transition from unsafe to safe. kernel_main() @@ -78,6 +76,9 @@ fn kernel_main() -> ! { use core::time::Duration; use interface::{console::All, time::Timer}; + println!("Booting on: {}", bsp::board_name()); + + println!("MMU online. Special regions:"); bsp::virt_mem_layout().print_layout(); println!( diff --git a/11_virtual_memory/src/memory.rs b/11_virtual_memory/src/memory.rs index 1fba62d5..70b1b702 100644 --- a/11_virtual_memory/src/memory.rs +++ b/11_virtual_memory/src/memory.rs @@ -140,8 +140,6 @@ impl KernelVirtualLayout<{ NUM_SPECIAL_RANGES } pub fn print_layout(&self) { use crate::println; - println!("Special memory regions:"); - for i in self.inner.iter() { println!("{}", i); } diff --git a/11_virtual_memory/src/panic_wait.rs b/11_virtual_memory/src/panic_wait.rs index 5e6d3fa5..a8d2cc48 100644 --- a/11_virtual_memory/src/panic_wait.rs +++ b/11_virtual_memory/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/11_virtual_memory/src/print.rs b/11_virtual_memory/src/print.rs index 86ab59b3..082e5cb0 100644 --- a/11_virtual_memory/src/print.rs +++ b/11_virtual_memory/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 @@ -83,9 +89,3 @@ macro_rules! warn { )); }) } - -pub fn _print(args: fmt::Arguments) { - use interface::console::Write; - - bsp::console().write_fmt(args).unwrap(); -}