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.
*/
class MemWriteListener : public MemAccessListener {
class GenericMemWriteListener : public MemAccessListener {
public:
MemWriteListener()
GenericMemWriteListener()
: MemAccessListener(MemAccessEvent::MEM_READ) { }
MemWriteListener(address_t addr)
GenericMemWriteListener(address_t addr)
: MemAccessListener(addr, MemAccessEvent::MEM_WRITE) { }
};

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,28 @@
#include <iostream>
#include "QEMUListener.hpp"
#include "../SALInst.hpp"
extern "C" {
#include "qemu/failqemu.h"
}
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

View File

@ -17,7 +17,18 @@ public:
// 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

View File

@ -1,16 +1,27 @@
#include <iostream>
#include "../SALInst.hpp"
#include "../SALConfig.hpp"
#include "config/FailConfig.hpp"
struct CPUX86State; // fwd
extern "C" {
#include <stdio.h>
//#include "qemu/failqemu.h"
#include "qemu/failqemu.h"
struct CPUX86State;
void failqemu_init(struct CPUX86State *env)
void fail_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();
}
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);
}
}