changeset c717bd5e0a1d in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=c717bd5e0a1d
description:
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.
diffstat:
src/arch/arm/ArmSystem.py | 5 +++++
src/arch/arm/linux/system.cc | 15 +++++++++++++--
src/arch/arm/linux/system.hh | 8 +++++---
src/cpu/pc_event.cc | 12 ++++++++++++
src/cpu/pc_event.hh | 7 +++++++
tests/configs/arm_generic.py | 7 +++++++
6 files changed, 49 insertions(+), 5 deletions(-)
diffs (110 lines):
diff -r f10eb34e3e38 -r c717bd5e0a1d src/arch/arm/ArmSystem.py
--- a/src/arch/arm/ArmSystem.py Mon Apr 22 13:20:31 2013 -0400
+++ b/src/arch/arm/ArmSystem.py Mon Apr 22 13:20:31 2013 -0400
@@ -68,3 +68,8 @@
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")
diff -r f10eb34e3e38 -r c717bd5e0a1d src/arch/arm/linux/system.cc
--- a/src/arch/arm/linux/system.cc Mon Apr 22 13:20:31 2013 -0400
+++ b/src/arch/arm/linux/system.cc Mon Apr 22 13:20:31 2013 -0400
@@ -62,11 +62,22 @@
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>(
diff -r f10eb34e3e38 -r c717bd5e0a1d src/arch/arm/linux/system.hh
--- a/src/arch/arm/linux/system.hh Mon Apr 22 13:20:31 2013 -0400
+++ b/src/arch/arm/linux/system.hh Mon Apr 22 13:20:31 2013 -0400
@@ -98,10 +98,12 @@
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
diff -r f10eb34e3e38 -r c717bd5e0a1d src/cpu/pc_event.cc
--- a/src/cpu/pc_event.cc Mon Apr 22 13:20:31 2013 -0400
+++ b/src/cpu/pc_event.cc Mon Apr 22 13:20:31 2013 -0400
@@ -158,3 +158,15 @@
}
}
+
+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());
+}
diff -r f10eb34e3e38 -r c717bd5e0a1d src/cpu/pc_event.hh
--- a/src/cpu/pc_event.hh Mon Apr 22 13:20:31 2013 -0400
+++ b/src/cpu/pc_event.hh Mon Apr 22 13:20:31 2013 -0400
@@ -146,4 +146,11 @@
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__
diff -r f10eb34e3e38 -r c717bd5e0a1d tests/configs/arm_generic.py
--- a/tests/configs/arm_generic.py Mon Apr 22 13:20:31 2013 -0400
+++ b/tests/configs/arm_generic.py Mon Apr 22 13:20:31 2013 -0400
@@ -62,6 +62,13 @@
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
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev