qemu: MemWriteListener specialization

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1619 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
hsc
2012-09-12 14:07:15 +00:00
parent a8756f3d0a
commit d40113c535
8 changed files with 64 additions and 13 deletions

View File

@ -337,14 +337,14 @@ public:
}; };
/** /**
* \class MemWriteListener * \class GenericMemWriteListener
* Observes memory write accesses. * Observes memory write accesses.
*/ */
class MemWriteListener : public MemAccessListener { class GenericMemWriteListener : public MemAccessListener {
public: public:
MemWriteListener() GenericMemWriteListener()
: MemAccessListener(MemAccessEvent::MEM_READ) { } : MemAccessListener(MemAccessEvent::MEM_READ) { }
MemWriteListener(address_t addr) GenericMemWriteListener(address_t addr)
: MemAccessListener(addr, MemAccessEvent::MEM_WRITE) { } : MemAccessListener(addr, MemAccessEvent::MEM_WRITE) { }
}; };

View File

@ -6,6 +6,7 @@
namespace fail { namespace fail {
typedef GenericBPSingleListener BPSingleListener; typedef GenericBPSingleListener BPSingleListener;
typedef GenericMemWriteListener MemWriteListener;
/** /**
* \class TimerListener * \class TimerListener

View File

@ -6,6 +6,8 @@
namespace fail { namespace fail {
typedef GenericMemWriteListener MemWriteListener;
class Gem5BPSingleListener : public GenericBPSingleListener class Gem5BPSingleListener : public GenericBPSingleListener
{ {
public: public:

View File

@ -9,7 +9,8 @@
namespace fail { namespace fail {
QEMUController::QEMUController() QEMUController::QEMUController()
: SimulatorController(new QEMURegisterManager(), new QEMUMemoryManager()) : SimulatorController(new QEMURegisterManager(), new QEMUMemoryManager()),
m_cpuenv(0)
{ {
// TODO: probably do additional RegisterManager initializations // TODO: probably do additional RegisterManager initializations
} }

View File

@ -10,6 +10,8 @@
#include "../SimulatorController.hpp" #include "../SimulatorController.hpp"
#include "../Listener.hpp" #include "../Listener.hpp"
struct CPUX86State;
namespace fail { namespace fail {
class ExperimentFlow; class ExperimentFlow;
@ -19,8 +21,9 @@ class ExperimentFlow;
* Very rudimentary, QEMU-specific implementation of a SimulatorController. * Very rudimentary, QEMU-specific implementation of a SimulatorController.
*/ */
class QEMUController : public SimulatorController { class QEMUController : public SimulatorController {
private:
public: public:
CPUX86State *m_cpuenv;
// Initialize the controller. // Initialize the controller.
QEMUController(); QEMUController();
~QEMUController(); ~QEMUController();
@ -52,6 +55,8 @@ public:
* Reboot simulator. Clears all Listeners. TODO. * Reboot simulator. Clears all Listeners. TODO.
*/ */
void reboot() {} void reboot() {}
/* internal, QEMU-specific stuff */
void setCPUEnv(struct CPUX86State *env) { m_cpuenv = env; }
}; };
} // end-of-namespace: fail } // end-of-namespace: fail

View File

@ -1,8 +1,28 @@
#include <iostream>
#include "QEMUListener.hpp" #include "QEMUListener.hpp"
#include "../SALInst.hpp" #include "../SALInst.hpp"
extern "C" {
#include "qemu/failqemu.h"
}
namespace fail { namespace fail {
// TODO bool QEMUMemWriteListener::onAddition()
{
std::cout << "QEMUMemWriteListener::onAddition" << std::endl;
if (failqemu_add_watchpoint(simulator.m_cpuenv, m_WatchAddr, m_WatchWidth, 1) != 0) {
std::cout << "adding watchpoint failed!" << std::endl;
return false;
}
return true;
}
void QEMUMemWriteListener::onDeletion()
{
std::cout << "QEMUMemWriteListener::onDeletion" << std::endl;
failqemu_remove_watchpoint(simulator.m_cpuenv, m_WatchAddr, m_WatchWidth, 1);
}
} // end-of-namespace: fail } // end-of-namespace: fail

View File

@ -17,7 +17,18 @@ public:
// TODO // TODO
}; };
// TODO: MemWriteListener class QEMUMemWriteListener : public GenericMemWriteListener {
public:
QEMUMemWriteListener()
: GenericMemWriteListener() { }
QEMUMemWriteListener(address_t addr)
: GenericMemWriteListener(addr) { }
virtual bool onAddition();
virtual void onDeletion();
};
typedef QEMUMemWriteListener MemWriteListener;
} // end-of-namespace: fail } // end-of-namespace: fail

View File

@ -1,16 +1,27 @@
#include <iostream>
#include "../SALInst.hpp" #include "../SALInst.hpp"
#include "../SALConfig.hpp"
#include "config/FailConfig.hpp" #include "config/FailConfig.hpp"
struct CPUX86State; // fwd
extern "C" { extern "C" {
#include <stdio.h> #include "qemu/failqemu.h"
//#include "qemu/failqemu.h"
struct CPUX86State; void fail_init(struct CPUX86State *env)
void failqemu_init(struct CPUX86State *env)
{ {
printf("FailQEMU v%s\n", FAIL_VERSION); std::cout << "FailQEMU v" FAIL_VERSION << std::endl;
fail::simulator.setCPUEnv(env);
fail::simulator.startup(); fail::simulator.startup();
} }
void fail_watchpoint_hit(struct CPUX86State *env, uint64_t addr, int width, int is_write)
{
std::cout << "fail_breakpoint_hit" << std::endl;
// FIXME: instruction pointer
fail::simulator.onMemoryAccess(addr, width, is_write == 1, 0);
}
} }