diff --git a/src/experiments/abo-simple-arm/CMakeLists.txt b/src/experiments/abo-simple-arm/CMakeLists.txt new file mode 100644 index 00000000..71fa28a4 --- /dev/null +++ b/src/experiments/abo-simple-arm/CMakeLists.txt @@ -0,0 +1,17 @@ +set(EXPERIMENT_NAME abo-simple-arm) +set(EXPERIMENT_TYPE ABOSimpleARMExperiment) +configure_file(../instantiate-experiment.ah.in + ${CMAKE_CURRENT_BINARY_DIR}/instantiate-${EXPERIMENT_NAME}.ah @ONLY +) + +#experiment sources +set(MY_EXPERIMENT_SRCS + experiment.hpp + experiment.cc +) + +#### include directories #### +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +## build library +add_library(fail-${EXPERIMENT_NAME} ${MY_EXPERIMENT_SRCS}) diff --git a/src/experiments/abo-simple-arm/experiment.cc b/src/experiments/abo-simple-arm/experiment.cc new file mode 100644 index 00000000..593df46c --- /dev/null +++ b/src/experiments/abo-simple-arm/experiment.cc @@ -0,0 +1,40 @@ +#include "util/Logger.hpp" +#include "experiment.hpp" +#include "sal/SALConfig.hpp" +#include "sal/SALInst.hpp" +#include "sal/Listener.hpp" +#include "config/FailConfig.hpp" + +using namespace std; +using namespace fail; + +// Check if configuration dependencies are satisfied: +#if !defined(CONFIG_EVENT_BREAKPOINTS) && !defined(CONFIG_EVENT_BREAKPOINTS_RANGE) + #error This experiment needs: breakpoints. Enable them in the configuration. +#endif + +bool ABOSimpleARMExperiment::run() +{ + Logger log("abo-simple", false); + log << "Startup!" << endl; + + BPSingleListener* ret; + BPSingleListener bp(0x800334); + ret = (BPSingleListener*)simulator.addListenerAndResume(&bp); + log << hex << ret->getTriggerInstructionPointer() << ": " + << simulator.getMnemonic() << endl; + bp.setWatchInstructionPointer(ANY_ADDR); + simulator.clearListeners(); + while ((ret = (BPSingleListener*)simulator.addListenerAndResume(&bp)) != 0) { + log << hex << ret->getTriggerInstructionPointer() << ": " + << simulator.getMnemonic() << " => Abort? " << flush; + char ch; + cin.clear(); cin.sync(); cin >> ch; + cout << endl; + if (ch == 'y' || ch == 'Y') + break; + } + + // Explicitly terminate, or the simulator will continue to run. + simulator.terminate(); +} diff --git a/src/experiments/abo-simple-arm/experiment.hpp b/src/experiments/abo-simple-arm/experiment.hpp new file mode 100644 index 00000000..dd73b7bc --- /dev/null +++ b/src/experiments/abo-simple-arm/experiment.hpp @@ -0,0 +1,13 @@ +#ifndef __ABO_SIMPLE_ARM_EXPERIMENT_HPP__ + #define __ABO_SIMPLE_ARM_EXPERIMENT_HPP__ + +#include "efw/ExperimentFlow.hpp" +#include "efw/JobClient.hpp" + +class ABOSimpleARMExperiment : public fail::ExperimentFlow { +public: + ABOSimpleARMExperiment() { } + bool run(); +}; + +#endif // __ABO_SIMPLE_ARM_EXPERIMENT_HPP__