From 193e5b757e8d158f93f59cef1e5385975c449948 Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Wed, 18 Mar 2015 18:16:47 +0100 Subject: [PATCH] adapt experiments to new restore() behavior This change adapts several experiments, including the DatabaseExperiment framework, to the restore() behavior update from the previous change. Existing traces should continue to be usable. This is not tested yet, mainly because I don't have access to most of the experiment targets / guest systems necessary for testing. Please test your own experiments if possible, or at least leave me a note that you couldn't test it! Especially the cored-voter/experiment.cc update may be broken, but maybe the "FISHY" +2 in there was not OK in the first place. Change-Id: I0c5daeabc8fe6ce0c3ce3e7e13d02195f41340ad --- src/core/efw/DatabaseExperiment.cc | 39 ++++++++++--------- src/experiments/cored-tester/experiment.cc | 26 +++++++------ src/experiments/cored-voter/experiment.cc | 4 +- .../dciao-kernelstructs/experiment.cc | 2 +- src/experiments/fiascoFail/experiment.cc | 2 +- src/experiments/kesogc/experiment.cc | 3 +- src/experiments/kesorefs/experiment.cc | 2 +- src/experiments/vezs-example/experiment.cc | 3 +- 8 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/core/efw/DatabaseExperiment.cc b/src/core/efw/DatabaseExperiment.cc index 82fccf24..93736d1d 100644 --- a/src/core/efw/DatabaseExperiment.cc +++ b/src/core/efw/DatabaseExperiment.cc @@ -109,28 +109,29 @@ bool DatabaseExperiment::run() simulator.clearListeners(); - // Generate an experiment listener, that matches on any IP - // event. It is used to forward to the injection - // point. The +1 is needed, since even for the zeroth - // dynamic instruction we need at least one breakpoint - // event. - BPSingleListener bp; - bp.setWatchInstructionPointer(ANY_ADDR); - bp.setCounter(injection_instr + 1); - simulator.addListener(&bp); - if (!this->cb_before_fast_forward()) { continue; } - fail::BaseListener * listener; - while (true) { - listener = simulator.resume(); - if (listener == &bp) { - break; - } else { - bool should_continue = this->cb_during_fast_forward(listener); - if (!should_continue) - break; // Stop fast forwarding + + // Do we need to fast-forward at all? + if (injection_instr > 0) { + // Create a listener that matches any IP event. It is used to + // forward to the injection point. + BPSingleListener bp; + bp.setWatchInstructionPointer(ANY_ADDR); + bp.setCounter(injection_instr); + simulator.addListener(&bp); + + fail::BaseListener * listener; + while (true) { + listener = simulator.resume(); + if (listener == &bp) { + break; + } else { + bool should_continue = this->cb_during_fast_forward(listener); + if (!should_continue) + break; // Stop fast forwarding + } } } if (!this->cb_after_fast_forward(listener)) { diff --git a/src/experiments/cored-tester/experiment.cc b/src/experiments/cored-tester/experiment.cc index 0e8a486d..a5cc698a 100644 --- a/src/experiments/cored-tester/experiment.cc +++ b/src/experiments/cored-tester/experiment.cc @@ -321,18 +321,22 @@ bool CoredTester::run() { simulator.addListener(&l_fail_trace); BPSingleListener bp; - bp.setWatchInstructionPointer(ANY_ADDR); - // TODO: why does this need a +1? - bp.setCounter(injection_instr+1); - simulator.addListener(&bp); - - fail::BaseListener * listener = simulator.resume(); + fail::BaseListener *listener = 0; bool ok = true; - while ( ok && (listener == &l_fail_trace) ) { - // m_log << "CP IP 0x" << std::hex << simulator.getCPU(0).getInstructionPointer() << std::endl; - ok = cpoint.check(s_fail_trace, l_fail_trace.getTriggerInstructionPointer()) == Checkpoint::IDENTICAL; - if(ok) listener = simulator.addListenerAndResume(&l_fail_trace); + // do we have to fast-forward at all? + if (injection_instr > 0) { + bp.setWatchInstructionPointer(ANY_ADDR); + bp.setCounter(injection_instr); + simulator.addListener(&bp); + + listener = simulator.resume(); + + while ( ok && (listener == &l_fail_trace) ) { + // m_log << "CP IP 0x" << std::hex << simulator.getCPU(0).getInstructionPointer() << std::endl; + ok = cpoint.check(s_fail_trace, l_fail_trace.getTriggerInstructionPointer()) == Checkpoint::IDENTICAL; + if(ok) listener = simulator.addListenerAndResume(&l_fail_trace); + } } unsigned experiment_number = cpoint.getCount(); @@ -347,7 +351,7 @@ bool CoredTester::run() { break; } - if (listener != &bp) { + if (listener != &bp && injection_instr > 0) { result = param.msg.add_result(); handleEvent(*result, result->NOINJECTION, "WTF"); diff --git a/src/experiments/cored-voter/experiment.cc b/src/experiments/cored-voter/experiment.cc index a09af3ad..75c9d16b 100644 --- a/src/experiments/cored-voter/experiment.cc +++ b/src/experiments/cored-voter/experiment.cc @@ -349,11 +349,11 @@ bool CoredVoter::run() { // Fast forward to injection address m_log << "Trying to inject @ instr #" << dec << injection_instr << endl; - if ((injection_instr + 2) > 0) { + if (injection_instr > 0) { simulator.clearListeners(); BPSingleListener bp; bp.setWatchInstructionPointer(ANY_ADDR); - bp.setCounter(injection_instr + 2); // FIXME: FISHY! + bp.setCounter(injection_instr); simulator.addListener(&bp); fail::BaseListener * listener = simulator.resume(); diff --git a/src/experiments/dciao-kernelstructs/experiment.cc b/src/experiments/dciao-kernelstructs/experiment.cc index f3bb3da2..1b360e9f 100644 --- a/src/experiments/dciao-kernelstructs/experiment.cc +++ b/src/experiments/dciao-kernelstructs/experiment.cc @@ -197,7 +197,7 @@ bool DCIAOKernelStructs::run() { simulator.addListener(&l_time_marker_print); bp.setWatchInstructionPointer(ANY_ADDR); - bp.setCounter(injection_instr+1); + bp.setCounter(injection_instr); simulator.addListener(&bp); // Add vport listener diff --git a/src/experiments/fiascoFail/experiment.cc b/src/experiments/fiascoFail/experiment.cc index b9cac1c4..16237200 100644 --- a/src/experiments/fiascoFail/experiment.cc +++ b/src/experiments/fiascoFail/experiment.cc @@ -253,7 +253,7 @@ bool FiascoFailExperiment::faultInjection() if(instr_offset > 0) { bp.setWatchInstructionPointer(ANY_ADDR); // Create new Breakpoint... - bp.setCounter(instr_offset + 1); // ...to break when the IP for the fault injection is reached... + bp.setCounter(instr_offset); // ...to break when the IP for the fault injection is reached... simulator.addListener(&bp); // ...and add it to the actual listeners BaseListener *go = waitIOOrOther(true); // Resume simulation and log VGA-Output diff --git a/src/experiments/kesogc/experiment.cc b/src/experiments/kesogc/experiment.cc index 19f60219..30d0eacb 100644 --- a/src/experiments/kesogc/experiment.cc +++ b/src/experiments/kesogc/experiment.cc @@ -187,8 +187,7 @@ bool KESOgc::run() BPSingleListener bp; bp.setWatchInstructionPointer(ANY_ADDR); - // Fix offset by 1 error - bp.setCounter(injection_instr + 1); + bp.setCounter(injection_instr); simulator.addListener(&bp); diff --git a/src/experiments/kesorefs/experiment.cc b/src/experiments/kesorefs/experiment.cc index 0e1e9a84..ef39088f 100644 --- a/src/experiments/kesorefs/experiment.cc +++ b/src/experiments/kesorefs/experiment.cc @@ -161,7 +161,7 @@ bool KESOrefs::run() BPSingleListener bp; bp.setWatchInstructionPointer(ANY_ADDR); - bp.setCounter(injection_instr + 1); + bp.setCounter(injection_instr); simulator.addListener(&bp); bool inject = true; diff --git a/src/experiments/vezs-example/experiment.cc b/src/experiments/vezs-example/experiment.cc index d5267793..b0759f85 100644 --- a/src/experiments/vezs-example/experiment.cc +++ b/src/experiments/vezs-example/experiment.cc @@ -160,8 +160,7 @@ bool VEZSExperiment::run() BPSingleListener bp; bp.setWatchInstructionPointer(ANY_ADDR); - // Fix offset by 1 error - bp.setCounter(injection_instr + 1); + bp.setCounter(injection_instr); simulator.addListener(&bp);