mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
lkdtm/bugs: Add cases for BUG and PANIC occurring in hardirq context
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>
This commit is contained in:
parent
b7737c38e7
commit
eb972eab07
|
|
@ -8,6 +8,7 @@
|
||||||
#include "lkdtm.h"
|
#include "lkdtm.h"
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
#include <linux/hrtimer.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/signal.h>
|
#include <linux/sched/signal.h>
|
||||||
#include <linux/sched/task_stack.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);
|
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)
|
static void lkdtm_BUG(void)
|
||||||
{
|
{
|
||||||
BUG();
|
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 int warn_counter;
|
||||||
|
|
||||||
static void lkdtm_WARNING(void)
|
static void lkdtm_WARNING(void)
|
||||||
|
|
@ -696,7 +747,9 @@ static noinline void lkdtm_CORRUPT_PAC(void)
|
||||||
static struct crashtype crashtypes[] = {
|
static struct crashtype crashtypes[] = {
|
||||||
CRASHTYPE(PANIC),
|
CRASHTYPE(PANIC),
|
||||||
CRASHTYPE(PANIC_STOP_IRQOFF),
|
CRASHTYPE(PANIC_STOP_IRQOFF),
|
||||||
|
CRASHTYPE(PANIC_IN_HARDIRQ),
|
||||||
CRASHTYPE(BUG),
|
CRASHTYPE(BUG),
|
||||||
|
CRASHTYPE(BUG_IN_HARDIRQ),
|
||||||
CRASHTYPE(WARNING),
|
CRASHTYPE(WARNING),
|
||||||
CRASHTYPE(WARNING_MESSAGE),
|
CRASHTYPE(WARNING_MESSAGE),
|
||||||
CRASHTYPE(EXCEPTION),
|
CRASHTYPE(EXCEPTION),
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
#PANIC
|
#PANIC
|
||||||
#PANIC_STOP_IRQOFF Crashes entire system
|
#PANIC_STOP_IRQOFF Crashes entire system
|
||||||
|
#PANIC_IN_HARDIRQ Crashes entire system
|
||||||
BUG kernel BUG at
|
BUG kernel BUG at
|
||||||
|
#BUG_IN_HARDIRQ Crashes entire system
|
||||||
WARNING WARNING:
|
WARNING WARNING:
|
||||||
WARNING_MESSAGE message trigger
|
WARNING_MESSAGE message trigger
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user