1*22193c58SMiguel Ojeda // SPDX-License-Identifier: GPL-2.0 2*22193c58SMiguel Ojeda 3*22193c58SMiguel Ojeda //! Rust printing macros sample. 4*22193c58SMiguel Ojeda 5*22193c58SMiguel Ojeda use kernel::pr_cont; 6*22193c58SMiguel Ojeda use kernel::prelude::*; 7*22193c58SMiguel Ojeda 8*22193c58SMiguel Ojeda module! { 9*22193c58SMiguel Ojeda type: RustPrint, 10*22193c58SMiguel Ojeda name: "rust_print", 11*22193c58SMiguel Ojeda author: "Rust for Linux Contributors", 12*22193c58SMiguel Ojeda description: "Rust printing macros sample", 13*22193c58SMiguel Ojeda license: "GPL", 14*22193c58SMiguel Ojeda } 15*22193c58SMiguel Ojeda 16*22193c58SMiguel Ojeda struct RustPrint; 17*22193c58SMiguel Ojeda 18*22193c58SMiguel Ojeda fn arc_print() -> Result { 19*22193c58SMiguel Ojeda use kernel::sync::*; 20*22193c58SMiguel Ojeda 21*22193c58SMiguel Ojeda let a = Arc::new(1, GFP_KERNEL)?; 22*22193c58SMiguel Ojeda let b = UniqueArc::new("hello, world", GFP_KERNEL)?; 23*22193c58SMiguel Ojeda 24*22193c58SMiguel Ojeda // Prints the value of data in `a`. 25*22193c58SMiguel Ojeda pr_info!("{}", a); 26*22193c58SMiguel Ojeda 27*22193c58SMiguel Ojeda // Uses ":?" to print debug fmt of `b`. 28*22193c58SMiguel Ojeda pr_info!("{:?}", b); 29*22193c58SMiguel Ojeda 30*22193c58SMiguel Ojeda let a: Arc<&str> = b.into(); 31*22193c58SMiguel Ojeda let c = a.clone(); 32*22193c58SMiguel Ojeda 33*22193c58SMiguel Ojeda // Uses `dbg` to print, will move `c` (for temporary debugging purposes). 34*22193c58SMiguel Ojeda dbg!(c); 35*22193c58SMiguel Ojeda 36*22193c58SMiguel Ojeda // Pretty-prints the debug formatting with lower-case hexadecimal integers. 37*22193c58SMiguel Ojeda pr_info!("{:#x?}", a); 38*22193c58SMiguel Ojeda 39*22193c58SMiguel Ojeda Ok(()) 40*22193c58SMiguel Ojeda } 41*22193c58SMiguel Ojeda 42*22193c58SMiguel Ojeda impl kernel::Module for RustPrint { 43*22193c58SMiguel Ojeda fn init(_module: &'static ThisModule) -> Result<Self> { 44*22193c58SMiguel Ojeda pr_info!("Rust printing macros sample (init)\n"); 45*22193c58SMiguel Ojeda 46*22193c58SMiguel Ojeda pr_emerg!("Emergency message (level 0) without args\n"); 47*22193c58SMiguel Ojeda pr_alert!("Alert message (level 1) without args\n"); 48*22193c58SMiguel Ojeda pr_crit!("Critical message (level 2) without args\n"); 49*22193c58SMiguel Ojeda pr_err!("Error message (level 3) without args\n"); 50*22193c58SMiguel Ojeda pr_warn!("Warning message (level 4) without args\n"); 51*22193c58SMiguel Ojeda pr_notice!("Notice message (level 5) without args\n"); 52*22193c58SMiguel Ojeda pr_info!("Info message (level 6) without args\n"); 53*22193c58SMiguel Ojeda 54*22193c58SMiguel Ojeda pr_info!("A line that"); 55*22193c58SMiguel Ojeda pr_cont!(" is continued"); 56*22193c58SMiguel Ojeda pr_cont!(" without args\n"); 57*22193c58SMiguel Ojeda 58*22193c58SMiguel Ojeda pr_emerg!("{} message (level {}) with args\n", "Emergency", 0); 59*22193c58SMiguel Ojeda pr_alert!("{} message (level {}) with args\n", "Alert", 1); 60*22193c58SMiguel Ojeda pr_crit!("{} message (level {}) with args\n", "Critical", 2); 61*22193c58SMiguel Ojeda pr_err!("{} message (level {}) with args\n", "Error", 3); 62*22193c58SMiguel Ojeda pr_warn!("{} message (level {}) with args\n", "Warning", 4); 63*22193c58SMiguel Ojeda pr_notice!("{} message (level {}) with args\n", "Notice", 5); 64*22193c58SMiguel Ojeda pr_info!("{} message (level {}) with args\n", "Info", 6); 65*22193c58SMiguel Ojeda 66*22193c58SMiguel Ojeda pr_info!("A {} that", "line"); 67*22193c58SMiguel Ojeda pr_cont!(" is {}", "continued"); 68*22193c58SMiguel Ojeda pr_cont!(" with {}\n", "args"); 69*22193c58SMiguel Ojeda 70*22193c58SMiguel Ojeda arc_print()?; 71*22193c58SMiguel Ojeda 72*22193c58SMiguel Ojeda trace::trace_rust_sample_loaded(42); 73*22193c58SMiguel Ojeda 74*22193c58SMiguel Ojeda Ok(RustPrint) 75*22193c58SMiguel Ojeda } 76*22193c58SMiguel Ojeda } 77*22193c58SMiguel Ojeda 78*22193c58SMiguel Ojeda impl Drop for RustPrint { 79*22193c58SMiguel Ojeda fn drop(&mut self) { 80*22193c58SMiguel Ojeda pr_info!("Rust printing macros sample (exit)\n"); 81*22193c58SMiguel Ojeda } 82*22193c58SMiguel Ojeda } 83*22193c58SMiguel Ojeda 84*22193c58SMiguel Ojeda mod trace { 85*22193c58SMiguel Ojeda use core::ffi::c_int; 86*22193c58SMiguel Ojeda 87*22193c58SMiguel Ojeda kernel::declare_trace! { 88*22193c58SMiguel Ojeda /// # Safety 89*22193c58SMiguel Ojeda /// 90*22193c58SMiguel Ojeda /// Always safe to call. 91*22193c58SMiguel Ojeda unsafe fn rust_sample_loaded(magic: c_int); 92*22193c58SMiguel Ojeda } 93*22193c58SMiguel Ojeda 94*22193c58SMiguel Ojeda pub(crate) fn trace_rust_sample_loaded(magic: i32) { 95*22193c58SMiguel Ojeda // SAFETY: Always safe to call. 96*22193c58SMiguel Ojeda unsafe { rust_sample_loaded(magic as c_int) } 97*22193c58SMiguel Ojeda } 98*22193c58SMiguel Ojeda } 99