]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
lkdtm/bugs: Add cases for BUG and PANIC occurring in hardirq context
authorArd Biesheuvel <ardb@kernel.org>
Sat, 6 Dec 2025 19:01:16 +0000 (20:01 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Mon, 15 Dec 2025 12:05:37 +0000 (12:05 +0000)
Add lkdtm cases to trigger a BUG() or panic() from hardirq context. This
is useful for testing pstore behavior being invoked from such contexts.

Reviewed-by: Kees Cook <kees@kernel.org>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
drivers/misc/lkdtm/bugs.c
tools/testing/selftests/lkdtm/tests.txt

index 376047beea3d64e63a9986ed715b1233d278717e..fa05d77acb558dcf842a27691ed0a250559717dd 100644 (file)
@@ -8,6 +8,7 @@
 #include "lkdtm.h"
 #include <linux/cpu.h>
 #include <linux/list.h>
+#include <linux/hrtimer.h>
 #include <linux/sched.h>
 #include <linux/sched/signal.h>
 #include <linux/sched/task_stack.h>
@@ -100,11 +101,61 @@ static void lkdtm_PANIC_STOP_IRQOFF(void)
        stop_machine(panic_stop_irqoff_fn, &v, cpu_online_mask);
 }
 
+static bool wait_for_panic;
+
+static enum hrtimer_restart panic_in_hardirq(struct hrtimer *timer)
+{
+       panic("from hard IRQ context");
+
+       wait_for_panic = false;
+       return HRTIMER_NORESTART;
+}
+
+static void lkdtm_PANIC_IN_HARDIRQ(void)
+{
+       struct hrtimer timer;
+
+       wait_for_panic = true;
+       hrtimer_setup_on_stack(&timer, panic_in_hardirq,
+                              CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
+       hrtimer_start(&timer, us_to_ktime(100), HRTIMER_MODE_REL_HARD);
+
+       while (wait_for_panic)
+               ;
+
+       hrtimer_cancel(&timer);
+}
+
 static void lkdtm_BUG(void)
 {
        BUG();
 }
 
+static bool wait_for_bug;
+
+static enum hrtimer_restart bug_in_hardirq(struct hrtimer *timer)
+{
+       BUG();
+
+       wait_for_bug = false;
+       return HRTIMER_NORESTART;
+}
+
+static void lkdtm_BUG_IN_HARDIRQ(void)
+{
+       struct hrtimer timer;
+
+       wait_for_bug = true;
+       hrtimer_setup_on_stack(&timer, bug_in_hardirq,
+                              CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
+       hrtimer_start(&timer, us_to_ktime(100), HRTIMER_MODE_REL_HARD);
+
+       while (wait_for_bug)
+               ;
+
+       hrtimer_cancel(&timer);
+}
+
 static int warn_counter;
 
 static void lkdtm_WARNING(void)
@@ -696,7 +747,9 @@ static noinline void lkdtm_CORRUPT_PAC(void)
 static struct crashtype crashtypes[] = {
        CRASHTYPE(PANIC),
        CRASHTYPE(PANIC_STOP_IRQOFF),
+       CRASHTYPE(PANIC_IN_HARDIRQ),
        CRASHTYPE(BUG),
+       CRASHTYPE(BUG_IN_HARDIRQ),
        CRASHTYPE(WARNING),
        CRASHTYPE(WARNING_MESSAGE),
        CRASHTYPE(EXCEPTION),
index cff124c1eddd3ea5337fdaf2abd95ecab89ba838..67cd53715d9323a9e510fedf3fd49211381c2963 100644 (file)
@@ -1,6 +1,8 @@
 #PANIC
 #PANIC_STOP_IRQOFF Crashes entire system
+#PANIC_IN_HARDIRQ Crashes entire system
 BUG kernel BUG at
+#BUG_IN_HARDIRQ Crashes entire system
 WARNING WARNING:
 WARNING_MESSAGE message trigger
 EXCEPTION