xref: /linux/samples/rust/rust_print_main.rs (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
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