diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-04-22 13:20:31 -0400 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-04-22 13:20:31 -0400 |
commit | 5f2361f3afb5c8d15e0a5f262a0f8a7942084563 (patch) | |
tree | 7f8fc4f091569baeb0de62e3f081c28534aa6110 /src | |
parent | e8381142b061fbdf2f22d958f1c7559e9ffb3bd8 (diff) | |
download | gem5-5f2361f3afb5c8d15e0a5f262a0f8a7942084563.tar.xz |
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 (limited to 'src')
-rw-r--r-- | src/arch/arm/ArmSystem.py | 5 | ||||
-rw-r--r-- | src/arch/arm/linux/system.cc | 15 | ||||
-rw-r--r-- | src/arch/arm/linux/system.hh | 8 | ||||
-rw-r--r-- | src/cpu/pc_event.cc | 12 | ||||
-rw-r--r-- | src/cpu/pc_event.hh | 7 |
5 files changed, 42 insertions, 5 deletions
diff --git a/src/arch/arm/ArmSystem.py b/src/arch/arm/ArmSystem.py index 763b043dc..b48c2a29d 100644 --- a/src/arch/arm/ArmSystem.py +++ b/src/arch/arm/ArmSystem.py @@ -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") diff --git a/src/arch/arm/linux/system.cc b/src/arch/arm/linux/system.cc index de4c27d8b..e714cc913 100644 --- a/src/arch/arm/linux/system.cc +++ b/src/arch/arm/linux/system.cc @@ -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>( diff --git a/src/arch/arm/linux/system.hh b/src/arch/arm/linux/system.hh index feed8cfaa..008c64429 100644 --- a/src/arch/arm/linux/system.hh +++ b/src/arch/arm/linux/system.hh @@ -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 diff --git a/src/cpu/pc_event.cc b/src/cpu/pc_event.cc index c957fe4d5..837b17e34 100644 --- a/src/cpu/pc_event.cc +++ b/src/cpu/pc_event.cc @@ -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()); +} diff --git a/src/cpu/pc_event.hh b/src/cpu/pc_event.hh index c73fc3c5a..11fce2ca0 100644 --- a/src/cpu/pc_event.hh +++ b/src/cpu/pc_event.hh @@ -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__ |