122193c58SMiguel Ojeda // SPDX-License-Identifier: GPL-2.0 222193c58SMiguel Ojeda 322193c58SMiguel Ojeda //! Rust printing macros sample. 422193c58SMiguel Ojeda 522193c58SMiguel Ojeda use kernel::pr_cont; 622193c58SMiguel Ojeda use kernel::prelude::*; 722193c58SMiguel Ojeda 822193c58SMiguel Ojeda module! { 922193c58SMiguel Ojeda type: RustPrint, 1022193c58SMiguel Ojeda name: "rust_print", 1122193c58SMiguel Ojeda author: "Rust for Linux Contributors", 1222193c58SMiguel Ojeda description: "Rust printing macros sample", 1322193c58SMiguel Ojeda license: "GPL", 1422193c58SMiguel Ojeda } 1522193c58SMiguel Ojeda 1622193c58SMiguel Ojeda struct RustPrint; 1722193c58SMiguel Ojeda 18*798bb342SLinus Torvalds #[expect(clippy::disallowed_macros)] 1922193c58SMiguel Ojeda fn arc_print() -> Result { 2022193c58SMiguel Ojeda use kernel::sync::*; 2122193c58SMiguel Ojeda 2222193c58SMiguel Ojeda let a = Arc::new(1, GFP_KERNEL)?; 2322193c58SMiguel Ojeda let b = UniqueArc::new("hello, world", GFP_KERNEL)?; 2422193c58SMiguel Ojeda 2522193c58SMiguel Ojeda // Prints the value of data in `a`. 2622193c58SMiguel Ojeda pr_info!("{}", a); 2722193c58SMiguel Ojeda 2822193c58SMiguel Ojeda // Uses ":?" to print debug fmt of `b`. 2922193c58SMiguel Ojeda pr_info!("{:?}", b); 3022193c58SMiguel Ojeda 3122193c58SMiguel Ojeda let a: Arc<&str> = b.into(); 3222193c58SMiguel Ojeda let c = a.clone(); 3322193c58SMiguel Ojeda 3422193c58SMiguel Ojeda // Uses `dbg` to print, will move `c` (for temporary debugging purposes). 3522193c58SMiguel Ojeda dbg!(c); 3622193c58SMiguel Ojeda 3722193c58SMiguel Ojeda // Pretty-prints the debug formatting with lower-case hexadecimal integers. 3822193c58SMiguel Ojeda pr_info!("{:#x?}", a); 3922193c58SMiguel Ojeda 4022193c58SMiguel Ojeda Ok(()) 4122193c58SMiguel Ojeda } 4222193c58SMiguel Ojeda 4322193c58SMiguel Ojeda impl kernel::Module for RustPrint { 4422193c58SMiguel Ojeda fn init(_module: &'static ThisModule) -> Result<Self> { 4522193c58SMiguel Ojeda pr_info!("Rust printing macros sample (init)\n"); 4622193c58SMiguel Ojeda 4722193c58SMiguel Ojeda pr_emerg!("Emergency message (level 0) without args\n"); 4822193c58SMiguel Ojeda pr_alert!("Alert message (level 1) without args\n"); 4922193c58SMiguel Ojeda pr_crit!("Critical message (level 2) without args\n"); 5022193c58SMiguel Ojeda pr_err!("Error message (level 3) without args\n"); 5122193c58SMiguel Ojeda pr_warn!("Warning message (level 4) without args\n"); 5222193c58SMiguel Ojeda pr_notice!("Notice message (level 5) without args\n"); 5322193c58SMiguel Ojeda pr_info!("Info message (level 6) without args\n"); 5422193c58SMiguel Ojeda 5522193c58SMiguel Ojeda pr_info!("A line that"); 5622193c58SMiguel Ojeda pr_cont!(" is continued"); 5722193c58SMiguel Ojeda pr_cont!(" without args\n"); 5822193c58SMiguel Ojeda 5922193c58SMiguel Ojeda pr_emerg!("{} message (level {}) with args\n", "Emergency", 0); 6022193c58SMiguel Ojeda pr_alert!("{} message (level {}) with args\n", "Alert", 1); 6122193c58SMiguel Ojeda pr_crit!("{} message (level {}) with args\n", "Critical", 2); 6222193c58SMiguel Ojeda pr_err!("{} message (level {}) with args\n", "Error", 3); 6322193c58SMiguel Ojeda pr_warn!("{} message (level {}) with args\n", "Warning", 4); 6422193c58SMiguel Ojeda pr_notice!("{} message (level {}) with args\n", "Notice", 5); 6522193c58SMiguel Ojeda pr_info!("{} message (level {}) with args\n", "Info", 6); 6622193c58SMiguel Ojeda 6722193c58SMiguel Ojeda pr_info!("A {} that", "line"); 6822193c58SMiguel Ojeda pr_cont!(" is {}", "continued"); 6922193c58SMiguel Ojeda pr_cont!(" with {}\n", "args"); 7022193c58SMiguel Ojeda 7122193c58SMiguel Ojeda arc_print()?; 7222193c58SMiguel Ojeda 7322193c58SMiguel Ojeda trace::trace_rust_sample_loaded(42); 7422193c58SMiguel Ojeda 7522193c58SMiguel Ojeda Ok(RustPrint) 7622193c58SMiguel Ojeda } 7722193c58SMiguel Ojeda } 7822193c58SMiguel Ojeda 7922193c58SMiguel Ojeda impl Drop for RustPrint { 8022193c58SMiguel Ojeda fn drop(&mut self) { 8122193c58SMiguel Ojeda pr_info!("Rust printing macros sample (exit)\n"); 8222193c58SMiguel Ojeda } 8322193c58SMiguel Ojeda } 8422193c58SMiguel Ojeda 8522193c58SMiguel Ojeda mod trace { 8622193c58SMiguel Ojeda use core::ffi::c_int; 8722193c58SMiguel Ojeda 8822193c58SMiguel Ojeda kernel::declare_trace! { 8922193c58SMiguel Ojeda /// # Safety 9022193c58SMiguel Ojeda /// 9122193c58SMiguel Ojeda /// Always safe to call. 9222193c58SMiguel Ojeda unsafe fn rust_sample_loaded(magic: c_int); 9322193c58SMiguel Ojeda } 9422193c58SMiguel Ojeda 9522193c58SMiguel Ojeda pub(crate) fn trace_rust_sample_loaded(magic: i32) { 9622193c58SMiguel Ojeda // SAFETY: Always safe to call. 9722193c58SMiguel Ojeda unsafe { rust_sample_loaded(magic as c_int) } 9822193c58SMiguel Ojeda } 9922193c58SMiguel Ojeda } 100