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:
@ -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) { }
|
||||
};
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
namespace fail {
|
||||
|
||||
typedef GenericBPSingleListener BPSingleListener;
|
||||
typedef GenericMemWriteListener MemWriteListener;
|
||||
|
||||
/**
|
||||
* \class TimerListener
|
||||
|
||||
@ -6,6 +6,8 @@
|
||||
|
||||
namespace fail {
|
||||
|
||||
typedef GenericMemWriteListener MemWriteListener;
|
||||
|
||||
class Gem5BPSingleListener : public GenericBPSingleListener
|
||||
{
|
||||
public:
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user