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

Reply via email to