arm: Enable support for triggering a sim panic on kernel panics
Add the options 'panic_on_panic' and 'panic_on_oops' to the LinuxArmSystem SimObject. When these option are enabled, the simulator panics when the guest kernel panics or oopses. Enable panic on panic and panic on oops in ARM-based test cases.
This commit is contained in:
parent
e8381142b0
commit
5f2361f3af
|
@ -68,3 +68,8 @@ class LinuxArmSystem(ArmSystem):
|
||||||
early_kernel_symbols = Param.Bool(False,
|
early_kernel_symbols = Param.Bool(False,
|
||||||
"enable early kernel symbol tables before MMU")
|
"enable early kernel symbol tables before MMU")
|
||||||
enable_context_switch_stats_dump = Param.Bool(False, "enable stats/task info dumping at context switch boundaries")
|
enable_context_switch_stats_dump = Param.Bool(False, "enable stats/task info dumping at context switch boundaries")
|
||||||
|
|
||||||
|
panic_on_panic = Param.Bool(False, "Trigger a gem5 panic if the " \
|
||||||
|
"guest kernel panics")
|
||||||
|
panic_on_oops = Param.Bool(False, "Trigger a gem5 panic if the " \
|
||||||
|
"guest kernel oopses")
|
||||||
|
|
|
@ -62,11 +62,22 @@ using namespace Linux;
|
||||||
|
|
||||||
LinuxArmSystem::LinuxArmSystem(Params *p)
|
LinuxArmSystem::LinuxArmSystem(Params *p)
|
||||||
: ArmSystem(p),
|
: ArmSystem(p),
|
||||||
enableContextSwitchStatsDump(p->enable_context_switch_stats_dump)
|
enableContextSwitchStatsDump(p->enable_context_switch_stats_dump),
|
||||||
|
kernelPanicEvent(NULL), kernelOopsEvent(NULL)
|
||||||
{
|
{
|
||||||
|
if (p->panic_on_panic) {
|
||||||
|
kernelPanicEvent = addKernelFuncEventOrPanic<PanicPCEvent>(
|
||||||
|
"panic", "Kernel panic in simulated kernel");
|
||||||
|
} else {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic");
|
kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p->panic_on_oops) {
|
||||||
|
kernelOopsEvent = addKernelFuncEventOrPanic<PanicPCEvent>(
|
||||||
|
"oops_exit", "Kernel oops in guest");
|
||||||
|
}
|
||||||
|
|
||||||
// With ARM udelay() is #defined to __udelay
|
// With ARM udelay() is #defined to __udelay
|
||||||
uDelaySkipEvent = addKernelFuncEventOrPanic<UDelayEvent>(
|
uDelaySkipEvent = addKernelFuncEventOrPanic<UDelayEvent>(
|
||||||
|
|
|
@ -98,10 +98,12 @@ class LinuxArmSystem : public ArmSystem
|
||||||
void mapPid(ThreadContext* tc, uint32_t pid);
|
void mapPid(ThreadContext* tc, uint32_t pid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#ifndef NDEBUG
|
|
||||||
/** Event to halt the simulator if the kernel calls panic() */
|
/** Event to halt the simulator if the kernel calls panic() */
|
||||||
BreakPCEvent *kernelPanicEvent;
|
PCEvent *kernelPanicEvent;
|
||||||
#endif
|
|
||||||
|
/** Event to halt the simulator if the kernel calls oopses */
|
||||||
|
PCEvent *kernelOopsEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PC based event to skip udelay(<time>) calls and quiesce the
|
* PC based event to skip udelay(<time>) calls and quiesce the
|
||||||
* processor for the appropriate amount of time. This is not functionally
|
* processor for the appropriate amount of time. This is not functionally
|
||||||
|
|
|
@ -158,3 +158,15 @@ sched_break_pc(Addr addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PanicPCEvent::PanicPCEvent(PCEventQueue *q, const std::string &desc, Addr pc)
|
||||||
|
: PCEvent(q, desc, pc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PanicPCEvent::process(ThreadContext *tc)
|
||||||
|
{
|
||||||
|
StringWrap name(tc->getCpuPtr()->name() + ".panic_event");
|
||||||
|
panic(descr());
|
||||||
|
}
|
||||||
|
|
|
@ -146,4 +146,11 @@ void sched_break_pc_sys(System *sys, Addr addr);
|
||||||
|
|
||||||
void sched_break_pc(Addr addr);
|
void sched_break_pc(Addr addr);
|
||||||
|
|
||||||
|
class PanicPCEvent : public PCEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PanicPCEvent(PCEventQueue *q, const std::string &desc, Addr pc);
|
||||||
|
virtual void process(ThreadContext *tc);
|
||||||
|
};
|
||||||
|
|
||||||
#endif // __PC_EVENT_HH__
|
#endif // __PC_EVENT_HH__
|
||||||
|
|
|
@ -62,6 +62,13 @@ class LinuxArmSystemBuilder(object):
|
||||||
system = FSConfig.makeArmSystem(self.mem_mode,
|
system = FSConfig.makeArmSystem(self.mem_mode,
|
||||||
self.machine_type,
|
self.machine_type,
|
||||||
None, False)
|
None, False)
|
||||||
|
|
||||||
|
# We typically want the simulator to panic if the kernel
|
||||||
|
# panics or oopses. This prevents the simulator from running
|
||||||
|
# an obviously failed test case until the end of time.
|
||||||
|
system.panic_on_panic = True
|
||||||
|
system.panic_on_oops = True
|
||||||
|
|
||||||
self.init_system(system)
|
self.init_system(system)
|
||||||
return system
|
return system
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue