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