ecos_kernel_test: experiment cleanup
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1476 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
@ -374,7 +374,7 @@ bool EcosKernelTestCampaign::run()
|
|||||||
" experiments to " << ecs_need_experiment.size() * 8 << endl;
|
" experiments to " << ecs_need_experiment.size() * 8 << endl;
|
||||||
|
|
||||||
// CSV header
|
// CSV header
|
||||||
results << "ec_instr1\tec_instr2\tec_instr2_absolute\tec_data_address\tbitnr\tbit_width\tresulttype\tecos_test_result\tfinish_reached\tlatest_ip\terror_corrected\tdetails" << endl;
|
results << "ec_instr1\tec_instr2\tec_instr2_absolute\tec_data_address\tbitnr\tbit_width\tresulttype\tecos_test_result\tlatest_ip\terror_corrected\tdetails" << endl;
|
||||||
|
|
||||||
// store no-effect "experiment" results
|
// store no-effect "experiment" results
|
||||||
for (vector<equivalence_class>::const_iterator it = ecs_no_effect.begin();
|
for (vector<equivalence_class>::const_iterator it = ecs_no_effect.begin();
|
||||||
@ -388,7 +388,6 @@ bool EcosKernelTestCampaign::run()
|
|||||||
<< "8\t" // ... and is 8 bits wide
|
<< "8\t" // ... and is 8 bits wide
|
||||||
<< "1\t"
|
<< "1\t"
|
||||||
<< "1\t" // dummy value (PASS): we didn't do any real experiments
|
<< "1\t" // dummy value (PASS): we didn't do any real experiments
|
||||||
<< "1\t"
|
|
||||||
<< "99\t" // dummy value: we didn't do any real experiments
|
<< "99\t" // dummy value: we didn't do any real experiments
|
||||||
<< "0\t\n";
|
<< "0\t\n";
|
||||||
}
|
}
|
||||||
@ -433,7 +432,6 @@ bool EcosKernelTestCampaign::run()
|
|||||||
<< "1\t" // 1 bit wide
|
<< "1\t" // 1 bit wide
|
||||||
<< res->msg.result(idx).resulttype() << "\t"
|
<< res->msg.result(idx).resulttype() << "\t"
|
||||||
<< res->msg.result(idx).ecos_test_result() << "\t"
|
<< res->msg.result(idx).ecos_test_result() << "\t"
|
||||||
<< res->msg.result(idx).finish_reached() << "\t"
|
|
||||||
<< res->msg.result(idx).latest_ip() << "\t"
|
<< res->msg.result(idx).latest_ip() << "\t"
|
||||||
<< res->msg.result(idx).error_corrected() << "\t"
|
<< res->msg.result(idx).error_corrected() << "\t"
|
||||||
<< res->msg.result(idx).details() << "\n";
|
<< res->msg.result(idx).details() << "\n";
|
||||||
|
|||||||
@ -45,9 +45,6 @@ message EcosKernelTestProtoMsg {
|
|||||||
}
|
}
|
||||||
required EcosTestResultType ecos_test_result = 4;
|
required EcosTestResultType ecos_test_result = 4;
|
||||||
|
|
||||||
// was finish() ever reached?
|
|
||||||
optional bool finish_reached = 5;
|
|
||||||
|
|
||||||
// did ECC correct the fault?
|
// did ECC correct the fault?
|
||||||
optional int32 error_corrected = 6;
|
optional int32 error_corrected = 6;
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#define LOCAL 0
|
#define LOCAL 0
|
||||||
|
|
||||||
#define PREREQUISITES 1 // 1: do step 0-2 ; 0: do step 3
|
#define PREREQUISITES 0 // 1: do step 0-2 ; 0: do step 3
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace fail;
|
using namespace fail;
|
||||||
@ -271,7 +271,6 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
// reaching finish() could happen before OR after FI
|
// reaching finish() could happen before OR after FI
|
||||||
BPSingleListener func_finish(ECOS_FUNC_FINISH);
|
BPSingleListener func_finish(ECOS_FUNC_FINISH);
|
||||||
simulator.addListener(&func_finish);
|
simulator.addListener(&func_finish);
|
||||||
bool finish_reached = false;
|
|
||||||
|
|
||||||
// no need to wait if offset is 0
|
// no need to wait if offset is 0
|
||||||
if (instr_offset > 0) {
|
if (instr_offset > 0) {
|
||||||
@ -282,12 +281,10 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
|
|
||||||
// finish() before FI?
|
// finish() before FI?
|
||||||
if (simulator.resume() == &func_finish) {
|
if (simulator.resume() == &func_finish) {
|
||||||
finish_reached = true;
|
|
||||||
log << "experiment reached finish() before FI" << endl;
|
log << "experiment reached finish() before FI" << endl;
|
||||||
|
|
||||||
// wait for bp
|
// wait for bp
|
||||||
simulator.resume();
|
simulator.resume();
|
||||||
//TODO: why wait here? it seems that something went completely wrong?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,6 +338,8 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
// 10000us = 500000 instructions
|
// 10000us = 500000 instructions
|
||||||
TimerListener ev_timeout(500000);
|
TimerListener ev_timeout(500000);
|
||||||
simulator.addListener(&ev_timeout);
|
simulator.addListener(&ev_timeout);
|
||||||
|
//TODO: if ev_timeout would depend on ECOS_NUMINSTR, ev_end would not be needed!
|
||||||
|
// --> (ECOS_NUMINSTR + ECOS_RECOVERYINSTR) * factor?
|
||||||
|
|
||||||
// remaining instructions until "normal" ending
|
// remaining instructions until "normal" ending
|
||||||
BPSingleListener ev_end(ANY_ADDR);
|
BPSingleListener ev_end(ANY_ADDR);
|
||||||
@ -361,40 +360,35 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
simulator.addFlow(&tp);
|
simulator.addFlow(&tp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BaseListener* ev = simulator.resume();
|
// the outcome of ecos' test case
|
||||||
|
|
||||||
bool ecos_test_passed = false;
|
bool ecos_test_passed = false;
|
||||||
bool ecos_test_failed = false;
|
bool ecos_test_failed = false;
|
||||||
|
|
||||||
while ( (ev == &func_test_output) || (ev == &func_finish) ) {
|
BaseListener* ev = simulator.resume();
|
||||||
// Do we reach finish() while waiting for ev_trap/ev_done?
|
|
||||||
if (ev == &func_finish) {
|
// wait until doing no more test_output
|
||||||
finish_reached = true;
|
while (ev == &func_test_output) {
|
||||||
log << "experiment reached finish()" << endl;
|
// 1st argument of cyg_test_output shows what has happened (FAIL or PASS)
|
||||||
}
|
address_t stack_ptr = simulator.getRegisterManager().getStackPointer(); // esp
|
||||||
else if(ev == &func_test_output) {
|
int32_t cyg_test_output_argument = simulator.getMemoryManager().getByte(stack_ptr + 4); // 1st argument is at esp+4
|
||||||
// 1st argument of cyg_test_output shows what has happened (FAIL or PASS)
|
|
||||||
address_t stack_ptr = simulator.getRegisterManager().getStackPointer(); // esp
|
log << "cyg_test_output_argument (#1): " << cyg_test_output_argument << endl;
|
||||||
int32_t cyg_test_output_argument = simulator.getMemoryManager().getByte(stack_ptr + 4); // 1st argument is at esp+4
|
|
||||||
|
/*
|
||||||
log << "cyg_test_output_argument (#1): " << cyg_test_output_argument << endl;
|
typedef enum {
|
||||||
|
CYGNUM_TEST_FAIL,
|
||||||
/*
|
CYGNUM_TEST_PASS,
|
||||||
typedef enum {
|
CYGNUM_TEST_EXIT,
|
||||||
CYGNUM_TEST_FAIL,
|
CYGNUM_TEST_INFO,
|
||||||
CYGNUM_TEST_PASS,
|
CYGNUM_TEST_GDBCMD,
|
||||||
CYGNUM_TEST_EXIT,
|
CYGNUM_TEST_NA
|
||||||
CYGNUM_TEST_INFO,
|
} Cyg_test_code;
|
||||||
CYGNUM_TEST_GDBCMD,
|
*/
|
||||||
CYGNUM_TEST_NA
|
|
||||||
} Cyg_test_code;
|
if (cyg_test_output_argument == 0) {
|
||||||
*/
|
ecos_test_failed = true;
|
||||||
|
} else if (cyg_test_output_argument == 1) {
|
||||||
if (cyg_test_output_argument == 0) {
|
ecos_test_passed = true;
|
||||||
ecos_test_failed = true;
|
|
||||||
} else if (cyg_test_output_argument == 1) {
|
|
||||||
ecos_test_passed = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for ev_trap/ev_done
|
// wait for ev_trap/ev_done
|
||||||
@ -404,24 +398,22 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
// record latest IP regardless of result
|
// record latest IP regardless of result
|
||||||
result->set_latest_ip(simulator.getRegisterManager().getInstructionPointer());
|
result->set_latest_ip(simulator.getRegisterManager().getInstructionPointer());
|
||||||
|
|
||||||
// record finish_reached and error_corrected regardless of result
|
// record error_corrected regardless of result
|
||||||
result->set_finish_reached(finish_reached);
|
|
||||||
int32_t error_corrected = simulator.getMemoryManager().getByte(ECOS_ERROR_CORRECTED);
|
int32_t error_corrected = simulator.getMemoryManager().getByte(ECOS_ERROR_CORRECTED);
|
||||||
result->set_error_corrected(error_corrected);
|
result->set_error_corrected(error_corrected);
|
||||||
|
|
||||||
// record ecos_test_result
|
// record ecos_test_result
|
||||||
if (ecos_test_failed) {
|
if (ecos_test_passed && !ecos_test_failed) {
|
||||||
result->set_ecos_test_result(result->FAIL);
|
|
||||||
} else if (ecos_test_passed) {
|
|
||||||
result->set_ecos_test_result(result->PASS);
|
result->set_ecos_test_result(result->PASS);
|
||||||
} else {
|
} else {
|
||||||
result->set_ecos_test_result(result->FAIL);
|
result->set_ecos_test_result(result->FAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev == &ev_end) {
|
if (ev == &func_finish) {
|
||||||
log << dec << "Result FINISHED" << endl;
|
// do we reach finish?
|
||||||
|
log << "experiment finished ordinarily" << endl;
|
||||||
result->set_resulttype(result->FINISHED);
|
result->set_resulttype(result->FINISHED);
|
||||||
} else if (ev == &ev_timeout) {
|
} else if (ev == &ev_timeout || ev == &ev_end) {
|
||||||
log << "Result TIMEOUT" << endl;
|
log << "Result TIMEOUT" << endl;
|
||||||
result->set_resulttype(result->TIMEOUT);
|
result->set_resulttype(result->TIMEOUT);
|
||||||
} else if (ev == &ev_below_text || ev == &ev_beyond_text) {
|
} else if (ev == &ev_below_text || ev == &ev_beyond_text) {
|
||||||
|
|||||||
Reference in New Issue
Block a user