1 // SPDX-License-Identifier: GPL-2.0 2 3 //! Printing facilities. 4 //! 5 //! C header: [`include/linux/printk.h`](srctree/include/linux/printk.h) 6 //! 7 //! Reference: <https://docs.kernel.org/core-api/printk-basics.html> 8 9 use crate::{ 10 ffi::{c_char, c_void}, 11 fmt, 12 prelude::*, 13 str::RawFormatter, 14 sync::atomic::{ 15 Atomic, 16 AtomicType, 17 Relaxed, // 18 }, 19 }; 20 21 // Called from `vsprintf` with format specifier `%pA`. 22 #[expect(clippy::missing_safety_doc)] 23 #[export] 24 unsafe extern "C" fn rust_fmt_argument( 25 buf: *mut c_char, 26 end: *mut c_char, 27 ptr: *const c_void, 28 ) -> *mut c_char { 29 use fmt::Write; 30 // SAFETY: The C contract guarantees that `buf` is valid if it's less than `end`. 31 let mut w = unsafe { RawFormatter::from_ptrs(buf.cast(), end.cast()) }; 32 // SAFETY: TODO. 33 let _ = w.write_fmt(unsafe { *ptr.cast::<fmt::Arguments<'_>>() }); 34 w.pos().cast() 35 } 36 37 /// Format strings. 38 /// 39 /// Public but hidden since it should only be used from public macros. 40 #[doc(hidden)] 41 pub mod format_strings { 42 /// The length we copy from the `KERN_*` kernel prefixes. 43 const LENGTH_PREFIX: usize = 2; 44 45 /// The length of the fixed format strings. 46 pub const LENGTH: usize = 10; 47 48 /// Generates a fixed format string for the kernel's [`_printk`]. 49 /// 50 /// The format string is always the same for a given level, i.e. for a 51 /// given `prefix`, which are the kernel's `KERN_*` constants. 52 /// 53 /// [`_printk`]: srctree/include/linux/printk.h 54 const fn generate(is_cont: bool, prefix: &[u8; 3]) -> [u8; LENGTH] { 55 // Ensure the `KERN_*` macros are what we expect. 56 assert!(prefix[0] == b'\x01'); 57 if is_cont { 58 assert!(prefix[1] == b'c'); 59 } else { 60 assert!(prefix[1] >= b'0' && prefix[1] <= b'7'); 61 } 62 assert!(prefix[2] == b'\x00'); 63 64 let suffix: &[u8; LENGTH - LENGTH_PREFIX] = if is_cont { 65 b"%pA\0\0\0\0\0" 66 } else { 67 b"%s: %pA\0" 68 }; 69 70 [ 71 prefix[0], prefix[1], suffix[0], suffix[1], suffix[2], suffix[3], suffix[4], suffix[5], 72 suffix[6], suffix[7], 73 ] 74 } 75 76 // Generate the format strings at compile-time. 77 // 78 // This avoids the compiler generating the contents on the fly in the stack. 79 // 80 // Furthermore, `static` instead of `const` is used to share the strings 81 // for all the kernel. 82 pub static EMERG: [u8; LENGTH] = generate(false, bindings::KERN_EMERG); 83 pub static ALERT: [u8; LENGTH] = generate(false, bindings::KERN_ALERT); 84 pub static CRIT: [u8; LENGTH] = generate(false, bindings::KERN_CRIT); 85 pub static ERR: [u8; LENGTH] = generate(false, bindings::KERN_ERR); 86 pub static WARNING: [u8; LENGTH] = generate(false, bindings::KERN_WARNING); 87 pub static NOTICE: [u8; LENGTH] = generate(false, bindings::KERN_NOTICE); 88 pub static INFO: [u8; LENGTH] = generate(false, bindings::KERN_INFO); 89 pub static DEBUG: [u8; LENGTH] = generate(false, bindings::KERN_DEBUG); 90 pub static CONT: [u8; LENGTH] = generate(true, bindings::KERN_CONT); 91 } 92 93 /// Prints a message via the kernel's [`_printk`]. 94 /// 95 /// Public but hidden since it should only be used from public macros. 96 /// 97 /// # Safety 98 /// 99 /// The format string must be one of the ones in [`format_strings`], and 100 /// the module name must be null-terminated. 101 /// 102 /// [`_printk`]: srctree/include/linux/_printk.h 103 #[doc(hidden)] 104 #[cfg_attr(not(CONFIG_PRINTK), allow(unused_variables))] 105 pub unsafe fn call_printk( 106 format_string: &[u8; format_strings::LENGTH], 107 module_name: &[u8], 108 args: fmt::Arguments<'_>, 109 ) { 110 // `_printk` does not seem to fail in any path. 111 #[cfg(CONFIG_PRINTK)] 112 // SAFETY: TODO. 113 unsafe { 114 bindings::_printk( 115 format_string.as_ptr(), 116 module_name.as_ptr(), 117 core::ptr::from_ref(&args).cast::<c_void>(), 118 ); 119 } 120 } 121 122 /// Prints a message via the kernel's [`_printk`] for the `CONT` level. 123 /// 124 /// Public but hidden since it should only be used from public macros. 125 /// 126 /// [`_printk`]: srctree/include/linux/printk.h 127 #[doc(hidden)] 128 #[cfg_attr(not(CONFIG_PRINTK), allow(unused_variables))] 129 pub fn call_printk_cont(args: fmt::Arguments<'_>) { 130 // `_printk` does not seem to fail in any path. 131 // 132 // SAFETY: The format string is fixed. 133 #[cfg(CONFIG_PRINTK)] 134 unsafe { 135 bindings::_printk( 136 format_strings::CONT.as_ptr(), 137 core::ptr::from_ref(&args).cast::<c_void>(), 138 ); 139 } 140 } 141 142 /// Performs formatting and forwards the string to [`call_printk`]. 143 /// 144 /// Public but hidden since it should only be used from public macros. 145 #[doc(hidden)] 146 #[cfg(not(testlib))] 147 #[macro_export] 148 #[expect(clippy::crate_in_macro_def)] 149 macro_rules! print_macro ( 150 // The non-continuation cases (most of them, e.g. `INFO`). 151 ($format_string:path, false, $($arg:tt)+) => ( 152 // To remain sound, `arg`s must be expanded outside the `unsafe` block. 153 // Typically one would use a `let` binding for that; however, `format_args!` 154 // takes borrows on the arguments, but does not extend the scope of temporaries. 155 // Therefore, a `match` expression is used to keep them around, since 156 // the scrutinee is kept until the end of the `match`. 157 match $crate::prelude::fmt!($($arg)+) { 158 // SAFETY: This hidden macro should only be called by the documented 159 // printing macros which ensure the format string is one of the fixed 160 // ones. All `__LOG_PREFIX`s are null-terminated as they are generated 161 // by the `module!` proc macro or fixed values defined in a kernel 162 // crate. 163 args => unsafe { 164 $crate::print::call_printk( 165 &$format_string, 166 crate::__LOG_PREFIX, 167 args, 168 ); 169 } 170 } 171 ); 172 173 // The `CONT` case. 174 ($format_string:path, true, $($arg:tt)+) => ( 175 $crate::print::call_printk_cont( 176 $crate::prelude::fmt!($($arg)+), 177 ); 178 ); 179 ); 180 181 /// Stub for doctests 182 #[cfg(testlib)] 183 #[macro_export] 184 macro_rules! print_macro ( 185 ($format_string:path, $e:expr, $($arg:tt)+) => ( 186 () 187 ); 188 ); 189 190 // We could use a macro to generate these macros. However, doing so ends 191 // up being a bit ugly: it requires the dollar token trick to escape `$` as 192 // well as playing with the `doc` attribute. Furthermore, they cannot be easily 193 // imported in the prelude due to [1]. So, for the moment, we just write them 194 // manually, like in the C side; while keeping most of the logic in another 195 // macro, i.e. [`print_macro`]. 196 // 197 // [1]: https://github.com/rust-lang/rust/issues/52234 198 199 /// Prints an emergency-level message (level 0). 200 /// 201 /// Use this level if the system is unusable. 202 /// 203 /// Equivalent to the kernel's [`pr_emerg`] macro. 204 /// 205 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 206 /// [`std::format!`] for information about the formatting syntax. 207 /// 208 /// [`pr_emerg`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_emerg 209 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 210 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 211 /// 212 /// # Examples 213 /// 214 /// ``` 215 /// pr_emerg!("hello {}\n", "there"); 216 /// ``` 217 #[macro_export] 218 macro_rules! pr_emerg ( 219 ($($arg:tt)*) => ( 220 $crate::print_macro!($crate::print::format_strings::EMERG, false, $($arg)*) 221 ) 222 ); 223 224 /// Prints an alert-level message (level 1). 225 /// 226 /// Use this level if action must be taken immediately. 227 /// 228 /// Equivalent to the kernel's [`pr_alert`] macro. 229 /// 230 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 231 /// [`std::format!`] for information about the formatting syntax. 232 /// 233 /// [`pr_alert`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_alert 234 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 235 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 236 /// 237 /// # Examples 238 /// 239 /// ``` 240 /// pr_alert!("hello {}\n", "there"); 241 /// ``` 242 #[macro_export] 243 macro_rules! pr_alert ( 244 ($($arg:tt)*) => ( 245 $crate::print_macro!($crate::print::format_strings::ALERT, false, $($arg)*) 246 ) 247 ); 248 249 /// Prints a critical-level message (level 2). 250 /// 251 /// Use this level for critical conditions. 252 /// 253 /// Equivalent to the kernel's [`pr_crit`] macro. 254 /// 255 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 256 /// [`std::format!`] for information about the formatting syntax. 257 /// 258 /// [`pr_crit`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_crit 259 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 260 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 261 /// 262 /// # Examples 263 /// 264 /// ``` 265 /// pr_crit!("hello {}\n", "there"); 266 /// ``` 267 #[macro_export] 268 macro_rules! pr_crit ( 269 ($($arg:tt)*) => ( 270 $crate::print_macro!($crate::print::format_strings::CRIT, false, $($arg)*) 271 ) 272 ); 273 274 /// Prints an error-level message (level 3). 275 /// 276 /// Use this level for error conditions. 277 /// 278 /// Equivalent to the kernel's [`pr_err`] macro. 279 /// 280 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 281 /// [`std::format!`] for information about the formatting syntax. 282 /// 283 /// [`pr_err`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_err 284 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 285 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 286 /// 287 /// # Examples 288 /// 289 /// ``` 290 /// pr_err!("hello {}\n", "there"); 291 /// ``` 292 #[macro_export] 293 macro_rules! pr_err ( 294 ($($arg:tt)*) => ( 295 $crate::print_macro!($crate::print::format_strings::ERR, false, $($arg)*) 296 ) 297 ); 298 299 /// Prints a warning-level message (level 4). 300 /// 301 /// Use this level for warning conditions. 302 /// 303 /// Equivalent to the kernel's [`pr_warn`] macro. 304 /// 305 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 306 /// [`std::format!`] for information about the formatting syntax. 307 /// 308 /// [`pr_warn`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_warn 309 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 310 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 311 /// 312 /// # Examples 313 /// 314 /// ``` 315 /// pr_warn!("hello {}\n", "there"); 316 /// ``` 317 #[macro_export] 318 macro_rules! pr_warn ( 319 ($($arg:tt)*) => ( 320 $crate::print_macro!($crate::print::format_strings::WARNING, false, $($arg)*) 321 ) 322 ); 323 324 /// Prints a notice-level message (level 5). 325 /// 326 /// Use this level for normal but significant conditions. 327 /// 328 /// Equivalent to the kernel's [`pr_notice`] macro. 329 /// 330 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 331 /// [`std::format!`] for information about the formatting syntax. 332 /// 333 /// [`pr_notice`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_notice 334 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 335 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 336 /// 337 /// # Examples 338 /// 339 /// ``` 340 /// pr_notice!("hello {}\n", "there"); 341 /// ``` 342 #[macro_export] 343 macro_rules! pr_notice ( 344 ($($arg:tt)*) => ( 345 $crate::print_macro!($crate::print::format_strings::NOTICE, false, $($arg)*) 346 ) 347 ); 348 349 /// Prints an info-level message (level 6). 350 /// 351 /// Use this level for informational messages. 352 /// 353 /// Equivalent to the kernel's [`pr_info`] macro. 354 /// 355 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 356 /// [`std::format!`] for information about the formatting syntax. 357 /// 358 /// [`pr_info`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_info 359 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 360 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 361 /// 362 /// # Examples 363 /// 364 /// ``` 365 /// pr_info!("hello {}\n", "there"); 366 /// ``` 367 #[macro_export] 368 #[doc(alias = "print")] 369 macro_rules! pr_info ( 370 ($($arg:tt)*) => ( 371 $crate::print_macro!($crate::print::format_strings::INFO, false, $($arg)*) 372 ) 373 ); 374 375 /// Prints a debug-level message (level 7). 376 /// 377 /// Use this level for debug messages. 378 /// 379 /// Equivalent to the kernel's [`pr_debug`] macro, except that it doesn't support dynamic debug 380 /// yet. 381 /// 382 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 383 /// [`std::format!`] for information about the formatting syntax. 384 /// 385 /// [`pr_debug`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_debug 386 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 387 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 388 /// 389 /// # Examples 390 /// 391 /// ``` 392 /// pr_debug!("hello {}\n", "there"); 393 /// ``` 394 #[macro_export] 395 #[doc(alias = "print")] 396 macro_rules! pr_debug ( 397 ($($arg:tt)*) => ( 398 if cfg!(debug_assertions) { 399 $crate::print_macro!($crate::print::format_strings::DEBUG, false, $($arg)*) 400 } 401 ) 402 ); 403 404 /// Continues a previous log message in the same line. 405 /// 406 /// Use only when continuing a previous `pr_*!` macro (e.g. [`pr_info!`]). 407 /// 408 /// Equivalent to the kernel's [`pr_cont`] macro. 409 /// 410 /// Mimics the interface of [`std::print!`]. See [`core::fmt`] and 411 /// [`std::format!`] for information about the formatting syntax. 412 /// 413 /// [`pr_info!`]: crate::pr_info! 414 /// [`pr_cont`]: https://docs.kernel.org/core-api/printk-basics.html#c.pr_cont 415 /// [`std::print!`]: https://doc.rust-lang.org/std/macro.print.html 416 /// [`std::format!`]: https://doc.rust-lang.org/std/macro.format.html 417 /// 418 /// # Examples 419 /// 420 /// ``` 421 /// # use kernel::pr_cont; 422 /// pr_info!("hello"); 423 /// pr_cont!(" {}\n", "there"); 424 /// ``` 425 #[macro_export] 426 macro_rules! pr_cont ( 427 ($($arg:tt)*) => ( 428 $crate::print_macro!($crate::print::format_strings::CONT, true, $($arg)*) 429 ) 430 ); 431 432 /// A lightweight `call_once` primitive. 433 /// 434 /// This structure provides the Rust equivalent of the kernel's `DO_ONCE_LITE` macro. 435 /// While it would be possible to implement the feature entirely as a Rust macro, 436 /// the functionality that can be implemented as regular functions has been 437 /// extracted and implemented as the `OnceLite` struct for better code maintainability. 438 pub struct OnceLite(Atomic<State>); 439 440 #[derive(Clone, Copy, PartialEq, Eq)] 441 #[repr(i32)] 442 enum State { 443 Incomplete = 0, 444 Complete = 1, 445 } 446 447 // SAFETY: `State` and `i32` has the same size and alignment, and it's round-trip 448 // transmutable to `i32`. 449 unsafe impl AtomicType for State { 450 type Repr = i32; 451 } 452 453 impl OnceLite { 454 /// Creates a new [`OnceLite`] in the incomplete state. 455 #[inline(always)] 456 #[allow(clippy::new_without_default)] 457 pub const fn new() -> Self { 458 OnceLite(Atomic::new(State::Incomplete)) 459 } 460 461 /// Calls the provided function exactly once. 462 /// 463 /// There is no other synchronization between two `call_once()`s 464 /// except that only one will execute `f`, in other words, callers 465 /// should not use a failed `call_once()` as a proof that another 466 /// `call_once()` has already finished and the effect is observable 467 /// to this thread. 468 pub fn call_once<F>(&self, f: F) -> bool 469 where 470 F: FnOnce(), 471 { 472 // Avoid expensive cmpxchg if already completed. 473 // ORDERING: `Relaxed` is used here since no synchronization is required. 474 let old = self.0.load(Relaxed); 475 if old == State::Complete { 476 return false; 477 } 478 479 // ORDERING: `Relaxed` is used here since no synchronization is required. 480 let old = self.0.xchg(State::Complete, Relaxed); 481 if old == State::Complete { 482 return false; 483 } 484 485 f(); 486 true 487 } 488 } 489 490 /// Run the given function exactly once. 491 /// 492 /// This is equivalent to the kernel's `DO_ONCE_LITE` macro. 493 /// 494 /// # Examples 495 /// 496 /// ``` 497 /// kernel::do_once_lite! { 498 /// kernel::pr_info!("This will be printed only once\n"); 499 /// }; 500 /// ``` 501 #[macro_export] 502 macro_rules! do_once_lite { 503 { $($e:tt)* } => {{ 504 #[link_section = ".data..once"] 505 static ONCE: $crate::print::OnceLite = $crate::print::OnceLite::new(); 506 ONCE.call_once(|| { $($e)* }); 507 }}; 508 } 509 510 /// Prints an emergency-level message (level 0) only once. 511 /// 512 /// Equivalent to the kernel's `pr_emerg_once` macro. 513 #[macro_export] 514 macro_rules! pr_emerg_once ( 515 ($($arg:tt)*) => ( 516 $crate::do_once_lite! { $crate::pr_emerg!($($arg)*) } 517 ) 518 ); 519 520 /// Prints an alert-level message (level 1) only once. 521 /// 522 /// Equivalent to the kernel's `pr_alert_once` macro. 523 #[macro_export] 524 macro_rules! pr_alert_once ( 525 ($($arg:tt)*) => ( 526 $crate::do_once_lite! { $crate::pr_alert!($($arg)*) } 527 ) 528 ); 529 530 /// Prints a critical-level message (level 2) only once. 531 /// 532 /// Equivalent to the kernel's `pr_crit_once` macro. 533 #[macro_export] 534 macro_rules! pr_crit_once ( 535 ($($arg:tt)*) => ( 536 $crate::do_once_lite! { $crate::pr_crit!($($arg)*) } 537 ) 538 ); 539 540 /// Prints an error-level message (level 3) only once. 541 /// 542 /// Equivalent to the kernel's `pr_err_once` macro. 543 #[macro_export] 544 macro_rules! pr_err_once ( 545 ($($arg:tt)*) => ( 546 $crate::do_once_lite! { $crate::pr_err!($($arg)*) } 547 ) 548 ); 549 550 /// Prints a warning-level message (level 4) only once. 551 /// 552 /// Equivalent to the kernel's `pr_warn_once` macro. 553 #[macro_export] 554 macro_rules! pr_warn_once ( 555 ($($arg:tt)*) => ( 556 $crate::do_once_lite! { $crate::pr_warn!($($arg)*) } 557 ) 558 ); 559 560 /// Prints a notice-level message (level 5) only once. 561 /// 562 /// Equivalent to the kernel's `pr_notice_once` macro. 563 #[macro_export] 564 macro_rules! pr_notice_once ( 565 ($($arg:tt)*) => ( 566 $crate::do_once_lite! { $crate::pr_notice!($($arg)*) } 567 ) 568 ); 569 570 /// Prints an info-level message (level 6) only once. 571 /// 572 /// Equivalent to the kernel's `pr_info_once` macro. 573 #[macro_export] 574 macro_rules! pr_info_once ( 575 ($($arg:tt)*) => ( 576 $crate::do_once_lite! { $crate::pr_info!($($arg)*) } 577 ) 578 ); 579