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:
Andreas Sandberg 2013-04-22 13:20:31 -04:00
parent e8381142b0
commit 5f2361f3af
6 changed files with 49 additions and 5 deletions

View file

@ -68,3 +68,8 @@ class LinuxArmSystem(ArmSystem):
early_kernel_symbols = Param.Bool(False,
"enable early kernel symbol tables before MMU")
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")

View file

@ -62,11 +62,22 @@ using namespace Linux;
LinuxArmSystem::LinuxArmSystem(Params *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
kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic");
kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic");
#endif
}
if (p->panic_on_oops) {
kernelOopsEvent = addKernelFuncEventOrPanic<PanicPCEvent>(
"oops_exit", "Kernel oops in guest");
}
// With ARM udelay() is #defined to __udelay
uDelaySkipEvent = addKernelFuncEventOrPanic<UDelayEvent>(

View file

@ -98,10 +98,12 @@ class LinuxArmSystem : public ArmSystem
void mapPid(ThreadContext* tc, uint32_t pid);
private:
#ifndef NDEBUG
/** Event to halt the simulator if the kernel calls panic() */
BreakPCEvent *kernelPanicEvent;
#endif
PCEvent *kernelPanicEvent;
/** Event to halt the simulator if the kernel calls oopses */
PCEvent *kernelOopsEvent;
/**
* PC based event to skip udelay(<time>) calls and quiesce the
* processor for the appropriate amount of time. This is not functionally

View file

@ -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());
}

View file

@ -146,4 +146,11 @@ void sched_break_pc_sys(System *sys, 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__

View file

@ -62,6 +62,13 @@ class LinuxArmSystemBuilder(object):
system = FSConfig.makeArmSystem(self.mem_mode,
self.machine_type,
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)
return system