diff --git a/01_wait_forever/Makefile b/01_wait_forever/Makefile index addfbba0..df1de73d 100644 --- a/01_wait_forever/Makefile +++ b/01_wait_forever/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/01_wait_forever/kernel b/01_wait_forever/kernel index d30e3832..c83ecbe7 100755 Binary files a/01_wait_forever/kernel and b/01_wait_forever/kernel differ diff --git a/02_runtime_init/Makefile b/02_runtime_init/Makefile index addfbba0..df1de73d 100644 --- a/02_runtime_init/Makefile +++ b/02_runtime_init/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/02_runtime_init/kernel b/02_runtime_init/kernel index 6a6530a4..64add528 100644 Binary files a/02_runtime_init/kernel and b/02_runtime_init/kernel differ diff --git a/02_runtime_init/kernel8.img b/02_runtime_init/kernel8.img index 7c705efd..39f1d432 100755 Binary files a/02_runtime_init/kernel8.img and b/02_runtime_init/kernel8.img differ diff --git a/03_hacky_hello_world/Makefile b/03_hacky_hello_world/Makefile index 829c277e..c488eb59 100644 --- a/03_hacky_hello_world/Makefile +++ b/03_hacky_hello_world/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/03_hacky_hello_world/kernel b/03_hacky_hello_world/kernel index 219cdaef..3bed3f75 100755 Binary files a/03_hacky_hello_world/kernel and b/03_hacky_hello_world/kernel differ diff --git a/03_hacky_hello_world/kernel8.img b/03_hacky_hello_world/kernel8.img index f03410b4..e8af6975 100755 Binary files a/03_hacky_hello_world/kernel8.img and b/03_hacky_hello_world/kernel8.img differ diff --git a/04_zero_overhead_abstraction/Makefile b/04_zero_overhead_abstraction/Makefile index 829c277e..c488eb59 100644 --- a/04_zero_overhead_abstraction/Makefile +++ b/04_zero_overhead_abstraction/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/04_zero_overhead_abstraction/kernel b/04_zero_overhead_abstraction/kernel index 1914791b..d7385d48 100755 Binary files a/04_zero_overhead_abstraction/kernel and b/04_zero_overhead_abstraction/kernel differ diff --git a/04_zero_overhead_abstraction/kernel8.img b/04_zero_overhead_abstraction/kernel8.img index 047a060c..60f5c5e4 100755 Binary files a/04_zero_overhead_abstraction/kernel8.img and b/04_zero_overhead_abstraction/kernel8.img differ diff --git a/05_safe_globals/Makefile b/05_safe_globals/Makefile index 829c277e..c488eb59 100644 --- a/05_safe_globals/Makefile +++ b/05_safe_globals/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/05_safe_globals/kernel b/05_safe_globals/kernel index bb7ef115..4304d46e 100755 Binary files a/05_safe_globals/kernel and b/05_safe_globals/kernel differ diff --git a/05_safe_globals/kernel8.img b/05_safe_globals/kernel8.img index bbd2853c..817b1495 100755 Binary files a/05_safe_globals/kernel8.img and b/05_safe_globals/kernel8.img differ diff --git a/06_drivers_gpio_uart/Makefile b/06_drivers_gpio_uart/Makefile index 829c277e..c488eb59 100644 --- a/06_drivers_gpio_uart/Makefile +++ b/06_drivers_gpio_uart/Makefile @@ -47,7 +47,7 @@ CONTAINER_UTILS = rustembedded/osdev-utils DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work -DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel .PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/06_drivers_gpio_uart/kernel b/06_drivers_gpio_uart/kernel index 5b430568..968f61f7 100755 Binary files a/06_drivers_gpio_uart/kernel and b/06_drivers_gpio_uart/kernel differ diff --git a/06_drivers_gpio_uart/kernel8.img b/06_drivers_gpio_uart/kernel8.img index 8390c832..92f3154c 100755 Binary files a/06_drivers_gpio_uart/kernel8.img and b/06_drivers_gpio_uart/kernel8.img differ diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index 15d06349..2cca69d4 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -107,7 +107,7 @@ diff -uNr 06_drivers_gpio_uart/Makefile 07_uart_chainloader/Makefile DOCKER_CMD = docker run -it --rm DOCKER_ARG_CURDIR = -v $(shell pwd):/work -w /work --DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) -kernel $(OUTPUT) +-DOCKER_EXEC_QEMU = $(QEMU_BINARY) -M $(QEMU_MACHINE_TYPE) $(QEMU_MISC_ARGS) -kernel +DOCKER_ARG_TTY = --privileged -v /dev:/dev -.PHONY: all doc qemu clippy clean readelf objdump nm diff --git a/07_uart_chainloader/kernel b/07_uart_chainloader/kernel index 4e8bb759..4e57cd28 100755 Binary files a/07_uart_chainloader/kernel and b/07_uart_chainloader/kernel differ diff --git a/07_uart_chainloader/kernel8.img b/07_uart_chainloader/kernel8.img index 88748df9..4fa40a59 100755 Binary files a/07_uart_chainloader/kernel8.img and b/07_uart_chainloader/kernel8.img differ diff --git a/08_timestamps/README.md b/08_timestamps/README.md index 8b4ecf62..08dc5f81 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -387,15 +387,15 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs - for i in 0..size { - *kernel_addr.offset(i as isize) = bsp::console().read_char() as u8; - } -+ println!("Booting on: {}", bsp::board_name()); -+ println!( ++ info!("Booting on: {}", bsp::board_name()); ++ info!( + "Architectural timer resolution: {} ns", + arch::timer().resolution().as_nanos() + ); + -+ println!("Drivers loaded:"); ++ info!("Drivers loaded:"); + for (i, driver) in bsp::device_drivers().iter().enumerate() { -+ println!(" {}. {}", i + 1, driver.compatible()); ++ info!(" {}. {}", i + 1, driver.compatible()); } - println!("[ML] Loaded! Executing the payload now\n"); @@ -409,7 +409,7 @@ diff -uNr 07_uart_chainloader/src/main.rs 08_timestamps/src/main.rs - // Jump to loaded kernel! - kernel() + loop { -+ println!("Spinning for 1 second"); ++ info!("Spinning for 1 second"); + arch::timer().spin_for(Duration::from_secs(1)); + } } @@ -417,17 +417,14 @@ 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 -@@ -22,12 +22,70 @@ +@@ -31,3 +31,71 @@ + $crate::print::_print(format_args_nl!($($arg)*)); + }) } - - /// Prints with a newline. --/// --/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html - #[macro_export] - macro_rules! println { - () => ($crate::print!("\n")); -- ($($arg:tt)*) => ({ -- $crate::print::_print(format_args_nl!($($arg)*)); ++ ++/// Prints am info, with newline. ++#[macro_export] ++macro_rules! info { + ($string:expr) => ({ + #[allow(unused_imports)] + use crate::interface::time::Timer; @@ -490,8 +487,8 @@ diff -uNr 07_uart_chainloader/src/print.rs 08_timestamps/src/print.rs + timestamp_subsec_us modulo 1_000, + $($arg)* + )); - }) - } ++ }) ++} diff -uNr 07_uart_chainloader/src/relocate.rs 08_timestamps/src/relocate.rs --- 07_uart_chainloader/src/relocate.rs diff --git a/08_timestamps/kernel b/08_timestamps/kernel index 54730324..8f87a370 100755 Binary files a/08_timestamps/kernel and b/08_timestamps/kernel differ diff --git a/08_timestamps/kernel8.img b/08_timestamps/kernel8.img index 8e20b916..058dc35c 100755 Binary files a/08_timestamps/kernel8.img and b/08_timestamps/kernel8.img differ diff --git a/08_timestamps/src/main.rs b/08_timestamps/src/main.rs index e99e681c..b64756ba 100644 --- a/08_timestamps/src/main.rs +++ b/08_timestamps/src/main.rs @@ -65,22 +65,22 @@ fn kernel_main() -> ! { use core::time::Duration; use interface::time::Timer; - println!("Booting on: {}", bsp::board_name()); - println!( + info!("Booting on: {}", bsp::board_name()); + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() ); - println!("Drivers loaded:"); + info!("Drivers loaded:"); for (i, driver) in bsp::device_drivers().iter().enumerate() { - println!(" {}. {}", i + 1, driver.compatible()); + info!(" {}. {}", i + 1, driver.compatible()); } // Test a failing timer case. arch::timer().spin_for(Duration::from_nanos(1)); loop { - println!("Spinning for 1 second"); + info!("Spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); } } diff --git a/08_timestamps/src/print.rs b/08_timestamps/src/print.rs index 082e5cb0..6e8a45b5 100644 --- a/08_timestamps/src/print.rs +++ b/08_timestamps/src/print.rs @@ -22,9 +22,19 @@ macro_rules! print { } /// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html #[macro_export] macro_rules! println { () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints am info, with newline. +#[macro_export] +macro_rules! info { ($string:expr) => ({ #[allow(unused_imports)] use crate::interface::time::Timer; diff --git a/09_hw_debug_JTAG/kernel b/09_hw_debug_JTAG/kernel index 54730324..8f87a370 100755 Binary files a/09_hw_debug_JTAG/kernel and b/09_hw_debug_JTAG/kernel differ diff --git a/09_hw_debug_JTAG/kernel8.img b/09_hw_debug_JTAG/kernel8.img index 8e20b916..058dc35c 100755 Binary files a/09_hw_debug_JTAG/kernel8.img and b/09_hw_debug_JTAG/kernel8.img differ diff --git a/09_hw_debug_JTAG/src/main.rs b/09_hw_debug_JTAG/src/main.rs index e99e681c..b64756ba 100644 --- a/09_hw_debug_JTAG/src/main.rs +++ b/09_hw_debug_JTAG/src/main.rs @@ -65,22 +65,22 @@ fn kernel_main() -> ! { use core::time::Duration; use interface::time::Timer; - println!("Booting on: {}", bsp::board_name()); - println!( + info!("Booting on: {}", bsp::board_name()); + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() ); - println!("Drivers loaded:"); + info!("Drivers loaded:"); for (i, driver) in bsp::device_drivers().iter().enumerate() { - println!(" {}. {}", i + 1, driver.compatible()); + info!(" {}. {}", i + 1, driver.compatible()); } // Test a failing timer case. arch::timer().spin_for(Duration::from_nanos(1)); loop { - println!("Spinning for 1 second"); + info!("Spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); } } diff --git a/09_hw_debug_JTAG/src/print.rs b/09_hw_debug_JTAG/src/print.rs index 082e5cb0..6e8a45b5 100644 --- a/09_hw_debug_JTAG/src/print.rs +++ b/09_hw_debug_JTAG/src/print.rs @@ -22,9 +22,19 @@ macro_rules! print { } /// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html #[macro_export] macro_rules! println { () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints am info, with newline. +#[macro_export] +macro_rules! info { ($string:expr) => ({ #[allow(unused_imports)] use crate::interface::time::Timer; diff --git a/10_privilege_level/README.md b/10_privilege_level/README.md index e254ab0b..6163c30b 100644 --- a/10_privilege_level/README.md +++ b/10_privilege_level/README.md @@ -359,16 +359,16 @@ diff -uNr 09_hw_debug_JTAG/src/arch/aarch64.rs 10_privilege_level/src/arch/aarch + exception, + exception::{Debug, SError, FIQ, IRQ}, + }; -+ use crate::println; ++ use crate::info; + + let to_mask_str = |x: bool| -> &'static str { + if x { "Masked" } else { "Unmasked" } + }; + -+ println!(" Debug: {}", to_mask_str(exception::is_masked::())); -+ println!(" SError: {}", to_mask_str(exception::is_masked::())); -+ println!(" IRQ: {}", to_mask_str(exception::is_masked::())); -+ println!(" FIQ: {}", to_mask_str(exception::is_masked::())); ++ info!(" Debug: {}", to_mask_str(exception::is_masked::())); ++ info!(" SError: {}", to_mask_str(exception::is_masked::())); ++ info!(" IRQ: {}", to_mask_str(exception::is_masked::())); ++ info!(" FIQ: {}", to_mask_str(exception::is_masked::())); + } +} @@ -382,30 +382,30 @@ diff -uNr 09_hw_debug_JTAG/src/main.rs 10_privilege_level/src/main.rs - use interface::time::Timer; + use interface::{console::All, time::Timer}; - println!("Booting on: {}", bsp::board_name()); + info!("Booting on: {}", bsp::board_name()); + -+ println!( ++ info!( + "Current privilege level: {}", + arch::state::current_privilege_level() + ); -+ println!("Exception handling state:"); ++ info!("Exception handling state:"); + arch::state::print_exception_state(); + - println!( + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() @@ -76,11 +84,12 @@ - println!(" {}. {}", i + 1, driver.compatible()); + info!(" {}. {}", i + 1, driver.compatible()); } - // Test a failing timer case. - arch::timer().spin_for(Duration::from_nanos(1)); -+ println!("Timer test, spinning for 1 second"); ++ info!("Timer test, spinning for 1 second"); + arch::timer().spin_for(Duration::from_secs(1)); -+ println!("Echoing input now"); ++ info!("Echoing input now"); loop { -- println!("Spinning for 1 second"); +- info!("Spinning for 1 second"); - arch::timer().spin_for(Duration::from_secs(1)); + let c = bsp::console().read_char(); + bsp::console().write_char(c); diff --git a/10_privilege_level/kernel b/10_privilege_level/kernel index e315cffd..54a7ced7 100755 Binary files a/10_privilege_level/kernel and b/10_privilege_level/kernel differ diff --git a/10_privilege_level/kernel8.img b/10_privilege_level/kernel8.img index 3f2d3ab9..4ba3e68a 100755 Binary files a/10_privilege_level/kernel8.img and b/10_privilege_level/kernel8.img differ diff --git a/10_privilege_level/src/arch/aarch64.rs b/10_privilege_level/src/arch/aarch64.rs index 7427441a..692f6ddb 100644 --- a/10_privilege_level/src/arch/aarch64.rs +++ b/10_privilege_level/src/arch/aarch64.rs @@ -124,15 +124,15 @@ pub mod state { exception, exception::{Debug, SError, FIQ, IRQ}, }; - use crate::println; + use crate::info; let to_mask_str = |x: bool| -> &'static str { if x { "Masked" } else { "Unmasked" } }; - println!(" Debug: {}", to_mask_str(exception::is_masked::())); - println!(" SError: {}", to_mask_str(exception::is_masked::())); - println!(" IRQ: {}", to_mask_str(exception::is_masked::())); - println!(" FIQ: {}", to_mask_str(exception::is_masked::())); + info!(" Debug: {}", to_mask_str(exception::is_masked::())); + info!(" SError: {}", to_mask_str(exception::is_masked::())); + info!(" IRQ: {}", to_mask_str(exception::is_masked::())); + info!(" FIQ: {}", to_mask_str(exception::is_masked::())); } } diff --git a/10_privilege_level/src/main.rs b/10_privilege_level/src/main.rs index 2259e30d..1e79195d 100644 --- a/10_privilege_level/src/main.rs +++ b/10_privilege_level/src/main.rs @@ -65,29 +65,29 @@ fn kernel_main() -> ! { use core::time::Duration; use interface::{console::All, time::Timer}; - println!("Booting on: {}", bsp::board_name()); + info!("Booting on: {}", bsp::board_name()); - println!( + info!( "Current privilege level: {}", arch::state::current_privilege_level() ); - println!("Exception handling state:"); + info!("Exception handling state:"); arch::state::print_exception_state(); - println!( + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() ); - println!("Drivers loaded:"); + info!("Drivers loaded:"); for (i, driver) in bsp::device_drivers().iter().enumerate() { - println!(" {}. {}", i + 1, driver.compatible()); + info!(" {}. {}", i + 1, driver.compatible()); } - println!("Timer test, spinning for 1 second"); + info!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); - println!("Echoing input now"); + info!("Echoing input now"); loop { let c = bsp::console().read_char(); bsp::console().write_char(c); diff --git a/10_privilege_level/src/print.rs b/10_privilege_level/src/print.rs index 082e5cb0..6e8a45b5 100644 --- a/10_privilege_level/src/print.rs +++ b/10_privilege_level/src/print.rs @@ -22,9 +22,19 @@ macro_rules! print { } /// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html #[macro_export] macro_rules! println { () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints am info, with newline. +#[macro_export] +macro_rules! info { ($string:expr) => ({ #[allow(unused_imports)] use crate::interface::time::Timer; diff --git a/11_virtual_memory/README.md b/11_virtual_memory/README.md index 15ad14d1..43876bc1 100644 --- a/11_virtual_memory/README.md +++ b/11_virtual_memory/README.md @@ -603,7 +603,7 @@ diff -uNr 10_privilege_level/src/arch/aarch64.rs 11_virtual_memory/src/arch/aarc //-------------------------------------------------------------------------------------------------- // Implementation of the kernel's architecture abstraction code @@ -136,3 +138,8 @@ - println!(" FIQ: {}", to_mask_str(exception::is_masked::())); + info!(" FIQ: {}", to_mask_str(exception::is_masked::())); } } + @@ -846,16 +846,16 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_memory/src/main.rs panic!("Error loading driver: {}", i.compatible()) @@ -67,6 +80,9 @@ - println!("Booting on: {}", bsp::board_name()); + info!("Booting on: {}", bsp::board_name()); -+ println!("MMU online. Special regions:"); ++ info!("MMU online. Special regions:"); + bsp::virt_mem_layout().print_layout(); + - println!( + info!( "Current privilege level: {}", arch::state::current_privilege_level() @@ -87,6 +103,13 @@ - println!("Timer test, spinning for 1 second"); + info!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); + let remapped_uart = unsafe { bsp::driver::PL011Uart::new(0x1FFF_1000) }; @@ -865,7 +865,7 @@ diff -uNr 10_privilege_level/src/main.rs 11_virtual_memory/src/main.rs + ) + .unwrap(); + - println!("Echoing input now"); + info!("Echoing input now"); loop { let c = bsp::console().read_char(); @@ -1013,10 +1013,10 @@ diff -uNr 10_privilege_level/src/memory.rs 11_virtual_memory/src/memory.rs + + /// Print the memory layout. + pub fn print_layout(&self) { -+ use crate::println; ++ use crate::info; + + for i in self.inner.iter() { -+ println!("{}", i); ++ info!("{}", i); + } + } +} diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index 93712ebb..a9a29379 100755 Binary files a/11_virtual_memory/kernel and b/11_virtual_memory/kernel differ diff --git a/11_virtual_memory/kernel8.img b/11_virtual_memory/kernel8.img index 646cdc21..cc876c59 100755 Binary files a/11_virtual_memory/kernel8.img and b/11_virtual_memory/kernel8.img differ diff --git a/11_virtual_memory/src/arch/aarch64.rs b/11_virtual_memory/src/arch/aarch64.rs index 6f0ee250..04cf801b 100644 --- a/11_virtual_memory/src/arch/aarch64.rs +++ b/11_virtual_memory/src/arch/aarch64.rs @@ -126,16 +126,16 @@ pub mod state { exception, exception::{Debug, SError, FIQ, IRQ}, }; - use crate::println; + use crate::info; let to_mask_str = |x: bool| -> &'static str { if x { "Masked" } else { "Unmasked" } }; - println!(" Debug: {}", to_mask_str(exception::is_masked::())); - println!(" SError: {}", to_mask_str(exception::is_masked::())); - println!(" IRQ: {}", to_mask_str(exception::is_masked::())); - println!(" FIQ: {}", to_mask_str(exception::is_masked::())); + info!(" Debug: {}", to_mask_str(exception::is_masked::())); + info!(" SError: {}", to_mask_str(exception::is_masked::())); + info!(" IRQ: {}", to_mask_str(exception::is_masked::())); + info!(" FIQ: {}", to_mask_str(exception::is_masked::())); } } diff --git a/11_virtual_memory/src/main.rs b/11_virtual_memory/src/main.rs index c87cdeca..eb027bdc 100644 --- a/11_virtual_memory/src/main.rs +++ b/11_virtual_memory/src/main.rs @@ -78,29 +78,29 @@ fn kernel_main() -> ! { use core::time::Duration; use interface::{console::All, time::Timer}; - println!("Booting on: {}", bsp::board_name()); + info!("Booting on: {}", bsp::board_name()); - println!("MMU online. Special regions:"); + info!("MMU online. Special regions:"); bsp::virt_mem_layout().print_layout(); - println!( + info!( "Current privilege level: {}", arch::state::current_privilege_level() ); - println!("Exception handling state:"); + info!("Exception handling state:"); arch::state::print_exception_state(); - println!( + info!( "Architectural timer resolution: {} ns", arch::timer().resolution().as_nanos() ); - println!("Drivers loaded:"); + info!("Drivers loaded:"); for (i, driver) in bsp::device_drivers().iter().enumerate() { - println!(" {}. {}", i + 1, driver.compatible()); + info!(" {}. {}", i + 1, driver.compatible()); } - println!("Timer test, spinning for 1 second"); + info!("Timer test, spinning for 1 second"); arch::timer().spin_for(Duration::from_secs(1)); let remapped_uart = unsafe { bsp::driver::PL011Uart::new(0x1FFF_1000) }; @@ -110,7 +110,7 @@ fn kernel_main() -> ! { ) .unwrap(); - println!("Echoing input now"); + info!("Echoing input now"); loop { let c = bsp::console().read_char(); bsp::console().write_char(c); diff --git a/11_virtual_memory/src/memory.rs b/11_virtual_memory/src/memory.rs index 70b1b702..a05e5392 100644 --- a/11_virtual_memory/src/memory.rs +++ b/11_virtual_memory/src/memory.rs @@ -138,10 +138,10 @@ impl KernelVirtualLayout<{ NUM_SPECIAL_RANGES } /// Print the memory layout. pub fn print_layout(&self) { - use crate::println; + use crate::info; for i in self.inner.iter() { - println!("{}", i); + info!("{}", i); } } } diff --git a/11_virtual_memory/src/print.rs b/11_virtual_memory/src/print.rs index 082e5cb0..6e8a45b5 100644 --- a/11_virtual_memory/src/print.rs +++ b/11_virtual_memory/src/print.rs @@ -22,9 +22,19 @@ macro_rules! print { } /// Prints with a newline. +/// +/// Carbon copy from https://doc.rust-lang.org/src/std/macros.rs.html #[macro_export] macro_rules! println { () => ($crate::print!("\n")); + ($($arg:tt)*) => ({ + $crate::print::_print(format_args_nl!($($arg)*)); + }) +} + +/// Prints am info, with newline. +#[macro_export] +macro_rules! info { ($string:expr) => ({ #[allow(unused_imports)] use crate::interface::time::Timer;