To support dynamic debug, the logging needs to happen through a macro call. Only a macro provides the possibility to statically allocate the descriptor used by the dynamic debug core.
For consistency also remove the other logging methods. They have no external users anyways. All functions are thin wrappers around Device::printk() anyways. Only Device::pr_dbg() contains additional logic, move that to !dev_dbg(). As a side-effect this now evaluates cfg(debug_assertions) in the context of the caller and not device.rs. Which matches the C macros better. Signed-off-by: Thomas Weißschuh <[email protected]> --- rust/kernel/device.rs | 164 +++++++++++++++++++++----------------------------- 1 file changed, 70 insertions(+), 94 deletions(-) diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs index 2291d85b6849..2d49063f4f7c 100644 --- a/rust/kernel/device.rs +++ b/rust/kernel/device.rs @@ -298,88 +298,6 @@ pub unsafe fn from_raw<'a>(ptr: *mut bindings::device) -> &'a Self { unsafe { &*ptr.cast() } } - /// Prints an emergency-level message (level 0) prefixed with device information. - /// - /// More details are available from [`dev_emerg`]. - /// - /// [`dev_emerg`]: crate::dev_emerg - pub fn pr_emerg(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_EMERG, args) }; - } - - /// Prints an alert-level message (level 1) prefixed with device information. - /// - /// More details are available from [`dev_alert`]. - /// - /// [`dev_alert`]: crate::dev_alert - pub fn pr_alert(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_ALERT, args) }; - } - - /// Prints a critical-level message (level 2) prefixed with device information. - /// - /// More details are available from [`dev_crit`]. - /// - /// [`dev_crit`]: crate::dev_crit - pub fn pr_crit(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_CRIT, args) }; - } - - /// Prints an error-level message (level 3) prefixed with device information. - /// - /// More details are available from [`dev_err`]. - /// - /// [`dev_err`]: crate::dev_err - pub fn pr_err(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_ERR, args) }; - } - - /// Prints a warning-level message (level 4) prefixed with device information. - /// - /// More details are available from [`dev_warn`]. - /// - /// [`dev_warn`]: crate::dev_warn - pub fn pr_warn(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_WARNING, args) }; - } - - /// Prints a notice-level message (level 5) prefixed with device information. - /// - /// More details are available from [`dev_notice`]. - /// - /// [`dev_notice`]: crate::dev_notice - pub fn pr_notice(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_NOTICE, args) }; - } - - /// Prints an info-level message (level 6) prefixed with device information. - /// - /// More details are available from [`dev_info`]. - /// - /// [`dev_info`]: crate::dev_info - pub fn pr_info(&self, args: fmt::Arguments<'_>) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_INFO, args) }; - } - - /// Prints a debug-level message (level 7) prefixed with device information. - /// - /// More details are available from [`dev_dbg`]. - /// - /// [`dev_dbg`]: crate::dev_dbg - pub fn pr_dbg(&self, args: fmt::Arguments<'_>) { - if cfg!(debug_assertions) { - // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. - unsafe { self.printk(bindings::KERN_DEBUG, args) }; - } - } - /// Prints the provided message to the console. /// /// # Safety @@ -387,7 +305,7 @@ pub fn pr_dbg(&self, args: fmt::Arguments<'_>) { /// Callers must ensure that `klevel` is null-terminated; in particular, one of the /// `KERN_*`constants, for example, `KERN_CRIT`, `KERN_ALERT`, etc. #[cfg_attr(not(CONFIG_PRINTK), allow(unused_variables))] - unsafe fn printk(&self, klevel: &[u8], msg: fmt::Arguments<'_>) { + pub unsafe fn printk(&self, klevel: &[u8], msg: fmt::Arguments<'_>) { // SAFETY: `klevel` is null-terminated and one of the kernel constants. `self.as_raw` // is valid because `self` is valid. The "%pA" format string expects a pointer to // `fmt::Arguments`, which is what we're passing as the last argument. @@ -738,9 +656,9 @@ macro_rules! impl_device_context_into_aref { #[doc(hidden)] #[macro_export] macro_rules! dev_printk { - ($method:ident, $dev:expr, $($f:tt)*) => { - $crate::device::Device::$method($dev.as_ref(), $crate::prelude::fmt!($($f)*)) - } + ($klevel:expr, $dev:expr, $args:expr) => { + $crate::device::Device::printk($dev.as_ref(), $klevel, $args) + }; } /// Prints an emergency-level message (level 0) prefixed with device information. @@ -766,7 +684,14 @@ macro_rules! dev_printk { /// ``` #[macro_export] macro_rules! dev_emerg { - ($($f:tt)*) => { $crate::dev_printk!(pr_emerg, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_EMERG, dev, args) } + } + } + } } /// Prints an alert-level message (level 1) prefixed with device information. @@ -792,7 +717,14 @@ macro_rules! dev_emerg { /// ``` #[macro_export] macro_rules! dev_alert { - ($($f:tt)*) => { $crate::dev_printk!(pr_alert, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_ALERT, dev, args) } + } + } + } } /// Prints a critical-level message (level 2) prefixed with device information. @@ -818,7 +750,14 @@ macro_rules! dev_alert { /// ``` #[macro_export] macro_rules! dev_crit { - ($($f:tt)*) => { $crate::dev_printk!(pr_crit, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_CRIT, dev, args) } + } + } + } } /// Prints an error-level message (level 3) prefixed with device information. @@ -844,7 +783,14 @@ macro_rules! dev_crit { /// ``` #[macro_export] macro_rules! dev_err { - ($($f:tt)*) => { $crate::dev_printk!(pr_err, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_ERR, dev, args) } + } + } + } } /// Prints a warning-level message (level 4) prefixed with device information. @@ -870,7 +816,14 @@ macro_rules! dev_err { /// ``` #[macro_export] macro_rules! dev_warn { - ($($f:tt)*) => { $crate::dev_printk!(pr_warn, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_WARNING, dev, args) } + } + } + } } /// Prints a notice-level message (level 5) prefixed with device information. @@ -896,7 +849,14 @@ macro_rules! dev_warn { /// ``` #[macro_export] macro_rules! dev_notice { - ($($f:tt)*) => { $crate::dev_printk!(pr_notice, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_NOTICE, dev, args) } + } + } + } } /// Prints an info-level message (level 6) prefixed with device information. @@ -922,7 +882,14 @@ macro_rules! dev_notice { /// ``` #[macro_export] macro_rules! dev_info { - ($($f:tt)*) => { $crate::dev_printk!(pr_info, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_INFO, dev, args) } + } + } + } } /// Prints a debug-level message (level 7) prefixed with device information. @@ -948,5 +915,14 @@ macro_rules! dev_info { /// ``` #[macro_export] macro_rules! dev_dbg { - ($($f:tt)*) => { $crate::dev_printk!(pr_dbg, $($f)*) } + ($dev:expr, $($f:tt)*) => { + match (&$dev, $crate::prelude::fmt!($($f)*)) { + (dev, args) => { + if cfg!(debug_assertions) { + // SAFETY: `klevel` is null-terminated, uses one of the kernel constants. + unsafe { $crate::dev_printk!($crate::bindings::KERN_DEBUG, dev, args) } + } + } + } + } } -- 2.56.0

