// SPDX-License-Identifier: GPL-2.0 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. //! Assertion macros for driver self-tests. //! //! Self-tests run against live hardware during probe, so a failed assertion should not panic. These //! macros log the failure on the device and fail the enclosing test by returning //! [`EIO`](kernel::error::code::EIO) instead. /// Like [`assert!`], but logs the failure via `dev` and fails the enclosing test instead of /// panicking. /// /// As with [`assert!`], a custom message with format arguments can follow the condition. #[macro_export] macro_rules! selftest_assert { ($dev:expr, $cond:expr $(,)?) => { $crate::selftest_assert!($dev, $cond, "assertion failed: {}", ::core::stringify!($cond)) }; ($dev:expr, $cond:expr, $($arg:tt)+) => {{ if !$cond { ::kernel::dev_err!( $dev, "Selftest: {}:{}: {}\n", ::core::file!(), ::core::line!(), ::kernel::prelude::fmt!($($arg)+) ); return Err(::kernel::error::code::EIO); } }}; } /// Like [`assert_eq!`], but logs the failure via `dev` and fails the enclosing test instead of /// panicking. /// /// As with [`assert_eq!`], a custom message with format arguments can follow the compared values. #[macro_export] macro_rules! selftest_assert_eq { ($dev:expr, $left:expr, $right:expr $(,)?) => { match (&$left, &$right) { (left, right) => $crate::selftest_assert!( $dev, left == right, "assertion `{} == {}` failed: left {:?}, right {:?}", ::core::stringify!($left), ::core::stringify!($right), left, right ), } }; ($dev:expr, $left:expr, $right:expr, $($arg:tt)+) => { match (&$left, &$right) { (left, right) => $crate::selftest_assert!( $dev, left == right, "assertion `left == right` failed: {}: left {:?}, right {:?}", ::kernel::prelude::fmt!($($arg)+), left, right ), } }; }