Added mechanism to specialize listener + basic BPSingleListener for gem5
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1603 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
@ -28,6 +28,8 @@ elseif(BUILD_GEM5)
|
|||||||
Register.cc
|
Register.cc
|
||||||
SimulatorController.cc
|
SimulatorController.cc
|
||||||
gem5/Gem5Controller.cc
|
gem5/Gem5Controller.cc
|
||||||
|
gem5/Gem5Listener.cc
|
||||||
|
gem5/Gem5PCEvent.cc
|
||||||
)
|
)
|
||||||
endif(BUILD_BOCHS)
|
endif(BUILD_BOCHS)
|
||||||
|
|
||||||
|
|||||||
@ -69,7 +69,7 @@ bool BPRangeListener::isMatching(address_t addr, address_t aspace) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BPSingleListener::isMatching(address_t addr, address_t aspace) const
|
bool GenericBPSingleListener::isMatching(address_t addr, address_t aspace) const
|
||||||
{
|
{
|
||||||
if (aspaceIsMatching(aspace)) {
|
if (aspaceIsMatching(aspace)) {
|
||||||
if (m_WatchInstrPtr == ANY_ADDR || m_WatchInstrPtr == addr)
|
if (m_WatchInstrPtr == ANY_ADDR || m_WatchInstrPtr == addr)
|
||||||
|
|||||||
@ -156,8 +156,8 @@ public:
|
|||||||
* \class BPSingleListener
|
* \class BPSingleListener
|
||||||
* A Breakpoint listener to observe specific instruction pointers.
|
* A Breakpoint listener to observe specific instruction pointers.
|
||||||
*/
|
*/
|
||||||
class BPSingleListener : public BPListener {
|
class GenericBPSingleListener : public BPListener {
|
||||||
private:
|
protected:
|
||||||
address_t m_WatchInstrPtr;
|
address_t m_WatchInstrPtr;
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@ -172,7 +172,7 @@ public:
|
|||||||
* Here, too, ANY_ADDR is a placeholder to allow debugging
|
* Here, too, ANY_ADDR is a placeholder to allow debugging
|
||||||
* in a random address space.
|
* in a random address space.
|
||||||
*/
|
*/
|
||||||
BPSingleListener(address_t ip = 0, address_t address_space = ANY_ADDR)
|
GenericBPSingleListener(address_t ip = 0, address_t address_space = ANY_ADDR)
|
||||||
: BPListener(address_space), m_WatchInstrPtr(ip) { }
|
: BPListener(address_space), m_WatchInstrPtr(ip) { }
|
||||||
/**
|
/**
|
||||||
* Returns the instruction pointer this listener waits for.
|
* Returns the instruction pointer this listener waits for.
|
||||||
@ -595,4 +595,14 @@ public:
|
|||||||
|
|
||||||
} // end-of-namespace: fail
|
} // end-of-namespace: fail
|
||||||
|
|
||||||
|
#if defined BUILD_BOCHS
|
||||||
|
#include "bochs/BochsListener.hpp"
|
||||||
|
#elif defined BUILD_OVP
|
||||||
|
// #include "ovp/OVPListener.hpp"
|
||||||
|
#elif defined BUILD_GEM5
|
||||||
|
#include "gem5/Gem5Listener.hpp"
|
||||||
|
#else
|
||||||
|
#error SAL Config Target not defined
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // __LISTENER_HPP__
|
#endif // __LISTENER_HPP__
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
#ifndef __BOCHS_EVENTS_HPP__
|
#ifndef __BOCHS_LISTENER_HPP__
|
||||||
#define __BOCHS_EVENTS_HPP__
|
#define __BOCHS_LISTENER_HPP__
|
||||||
|
|
||||||
#include "../Listener.hpp"
|
#include "../Listener.hpp"
|
||||||
|
|
||||||
#include "BochsController.hpp"
|
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
|
typedef GenericBPSingleListener BPSingleListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class TimerListener
|
* \class TimerListener
|
||||||
* Concrete TimerListener implementation of GenericTimerListener for the Bochs
|
* Concrete TimerListener implementation of GenericTimerListener for the Bochs
|
||||||
@ -75,4 +75,4 @@ public:
|
|||||||
|
|
||||||
} // end-of-namespace: fail
|
} // end-of-namespace: fail
|
||||||
|
|
||||||
#endif // __BOCHS_EVENTS_HPP__
|
#endif // __BOCHS_LISTENER_HPP__
|
||||||
|
|||||||
@ -1,12 +1,27 @@
|
|||||||
#include "Gem5Controller.hpp"
|
#include "Gem5Controller.hpp"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "sim/core.hh"
|
||||||
|
#include "sim/sim_exit.hh"
|
||||||
|
//#include "sim/root.hh"
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
int interrupt_to_fire = -1;
|
int interrupt_to_fire = -1;
|
||||||
|
|
||||||
void Gem5Controller::save(const std::string &path)
|
void Gem5Controller::save(const std::string &path)
|
||||||
{
|
{
|
||||||
|
// Takes a snapshot in the m5out dir
|
||||||
|
Tick when = curTick() + 1;
|
||||||
|
exitSimLoop("checkpoint", 0, when, 0);
|
||||||
|
|
||||||
|
// This could be a version to take snapshots with a specified name
|
||||||
|
/*Root* root = Root::root();
|
||||||
|
|
||||||
|
std::ofstream file(path.c_str());
|
||||||
|
root->serialize(file);
|
||||||
|
file.close();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gem5Controller::restore(const std::string &path)
|
void Gem5Controller::restore(const std::string &path)
|
||||||
|
|||||||
33
src/core/sal/gem5/Gem5Listener.cc
Normal file
33
src/core/sal/gem5/Gem5Listener.cc
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "Gem5Listener.hpp"
|
||||||
|
#include "../SALInst.hpp"
|
||||||
|
|
||||||
|
#include "sim/system.hh"
|
||||||
|
|
||||||
|
namespace fail {
|
||||||
|
|
||||||
|
Gem5BPSingleListener::Gem5BPSingleListener(address_t ip)
|
||||||
|
: GenericBPSingleListener(ip)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Gem5BPSingleListener::onAddition()
|
||||||
|
{
|
||||||
|
if(!m_Breakpoint)
|
||||||
|
{
|
||||||
|
System* sys = *System::systemList.begin();
|
||||||
|
m_Breakpoint = new Gem5PCEvent(&sys->pcEventQueue, this->m_WatchInstrPtr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Gem5BPSingleListener::~Gem5BPSingleListener()
|
||||||
|
{
|
||||||
|
if(m_Breakpoint)
|
||||||
|
{
|
||||||
|
delete m_Breakpoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end-of-namespace: fail
|
||||||
23
src/core/sal/gem5/Gem5Listener.hpp
Normal file
23
src/core/sal/gem5/Gem5Listener.hpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef __GEM5_LISTENER_HPP__
|
||||||
|
#define __GEM5_LISTENER_HPP__
|
||||||
|
|
||||||
|
#include "../Listener.hpp"
|
||||||
|
#include "Gem5PCEvent.hh"
|
||||||
|
|
||||||
|
namespace fail {
|
||||||
|
|
||||||
|
class Gem5BPSingleListener : public GenericBPSingleListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Gem5BPSingleListener(address_t ip = 0);
|
||||||
|
virtual bool onAddition();
|
||||||
|
~Gem5BPSingleListener();
|
||||||
|
private:
|
||||||
|
Gem5PCEvent* m_Breakpoint;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Gem5BPSingleListener BPSingleListener;
|
||||||
|
|
||||||
|
} // end-of-namespace: fail
|
||||||
|
|
||||||
|
#endif // __GEM5_LISTENER_HPP__
|
||||||
7
src/core/sal/gem5/Gem5PCEvent.cc
Normal file
7
src/core/sal/gem5/Gem5PCEvent.cc
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include "Gem5PCEvent.hh"
|
||||||
|
#include "../SALInst.hpp"
|
||||||
|
|
||||||
|
void Gem5PCEvent::process(ThreadContext *tc)
|
||||||
|
{
|
||||||
|
fail::simulator.onBreakpoint(this->evpc, fail::ANY_ADDR);
|
||||||
|
}
|
||||||
14
src/core/sal/gem5/Gem5PCEvent.hh
Normal file
14
src/core/sal/gem5/Gem5PCEvent.hh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef __GEM5_PCEVENT_HPP__
|
||||||
|
#define __GEM5_PCEVENT_HPP__
|
||||||
|
|
||||||
|
#include "cpu/pc_event.hh"
|
||||||
|
|
||||||
|
class Gem5PCEvent : public PCEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Gem5PCEvent(PCEventQueue* queue, Addr ip)
|
||||||
|
: PCEvent(queue, "Fail Breakpoint", ip) {}
|
||||||
|
virtual void process(ThreadContext *tc);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __GEM5_PCEVENT_HPP__
|
||||||
@ -1,6 +1,7 @@
|
|||||||
#include "ElfReader.hpp"
|
#include "ElfReader.hpp"
|
||||||
#include "elfinfo/elfinfo.h"
|
#include "elfinfo/elfinfo.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
namespace fail {
|
namespace fail {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user