From 87ee9df37b70cb625973b67e1d29f4ff43a3b8bd Mon Sep 17 00:00:00 2001 From: hsc Date: Tue, 27 Nov 2012 17:06:32 +0000 Subject: [PATCH] ecos: additional burst fault model git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1961 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- src/experiments/ecos_kernel_test/campaign.cc | 23 ++++++++++++++++--- .../ecos_kernel_test/ecos_kernel_test.proto | 6 +++++ .../ecos_kernel_test/experiment.cc | 14 ++++++++--- .../ecos_kernel_test/experimentInfo.hpp | 1 + 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/experiments/ecos_kernel_test/campaign.cc b/src/experiments/ecos_kernel_test/campaign.cc index 80729c5d..0a109720 100644 --- a/src/experiments/ecos_kernel_test/campaign.cc +++ b/src/experiments/ecos_kernel_test/campaign.cc @@ -346,7 +346,11 @@ bool EcosKernelTestCampaign::add_experiment_ec(const std::string& variant, const } count_exp_jobs++; - count_exp += 8; + if (ECOS_FAULTMODEL_BURST) { + count_exp++; + } else { + count_exp += 8; + } // enqueue job #if 1 @@ -357,6 +361,7 @@ bool EcosKernelTestCampaign::add_experiment_ec(const std::string& variant, const d->msg.set_instr2_offset(instr2); d->msg.set_instr2_address(instr_absolute); d->msg.set_mem_addr(data_address); + d->msg.set_faultmodel(ECOS_FAULTMODEL_BURST ? d->msg.BURST : d->msg.SINGLEBITFLIP); campaignmanager.addParam(d); #endif @@ -371,7 +376,11 @@ bool EcosKernelTestCampaign::add_known_ec(const std::string& variant, const std: } count_known_jobs++; - count_known += 8; + if (ECOS_FAULTMODEL_BURST) { + count_known++; + } else { + count_known += 8; + } #if 1 add_result(variant, benchmark, instr1, instr2, instr_absolute, data_address, @@ -497,7 +506,8 @@ void EcosKernelTestCampaign::collect_results() EcosKernelTestExperimentData *res; while ((res = static_cast(campaignmanager.getDone()))) { // sanity check - if (res->msg.result_size() != 8) { + if ((!ECOS_FAULTMODEL_BURST && res->msg.result_size() != 8) + || (ECOS_FAULTMODEL_BURST && res->msg.result_size() != 1)) { m_log << "wtf, result_size = " << res->msg.result_size() << endl; continue; } @@ -505,6 +515,7 @@ void EcosKernelTestCampaign::collect_results() EcosKernelTestProtoMsg_Result const *prev_singleres = 0; int first_bit = 0, bit_width = 0; +#if !ECOS_FAULTMODEL_BURST // one job contains 8 experiments for (int idx = 0; idx < res->msg.result_size(); ++idx) { EcosKernelTestProtoMsg_Result const *cur_singleres = &res->msg.result(idx); @@ -533,6 +544,12 @@ void EcosKernelTestCampaign::collect_results() first_bit = cur_singleres->bit_offset(); bit_width = 1; } +#else + // burst fault: bits 0-7, one experiment + first_bit = 0; + bit_width = 8; + prev_singleres = &res->msg.result(0); +#endif add_result(res->msg.variant(), res->msg.benchmark(), res->msg.instr1_offset(), res->msg.instr2_offset(), res->msg.instr2_address(), res->msg.mem_addr(), first_bit, bit_width, prev_singleres->resulttype(), prev_singleres->ecos_test_result(), diff --git a/src/experiments/ecos_kernel_test/ecos_kernel_test.proto b/src/experiments/ecos_kernel_test/ecos_kernel_test.proto index 3a302522..60947814 100644 --- a/src/experiments/ecos_kernel_test/ecos_kernel_test.proto +++ b/src/experiments/ecos_kernel_test/ecos_kernel_test.proto @@ -24,6 +24,12 @@ message EcosKernelTestProtoMsg { // to instr_address optional int32 injection_ip = 7; + enum FaultModel { + SINGLEBITFLIP = 1; + BURST = 2; + } + optional FaultModel faultmodel = 10; + repeated group Result = 8 { // single experiment bit offset required int32 bit_offset = 1; diff --git a/src/experiments/ecos_kernel_test/experiment.cc b/src/experiments/ecos_kernel_test/experiment.cc index 51d80b1d..7d6a1bdf 100644 --- a/src/experiments/ecos_kernel_test/experiment.cc +++ b/src/experiments/ecos_kernel_test/experiment.cc @@ -321,7 +321,8 @@ bool EcosKernelTestExperiment::faultInjection() { } #endif - // for each job we're actually doing *8* experiments (one for each bit) + // for each job with the SINGLEBITFLIP fault model we're actually doing *8* + // experiments (one for each bit) for (int bit_offset = 0; bit_offset < 8; ++bit_offset) { // 8 results in one job EcosKernelTestProtoMsg_Result *result = param.msg.add_result(); @@ -365,7 +366,13 @@ bool EcosKernelTestExperiment::faultInjection() { // --- fault injection --- MemoryManager& mm = simulator.getMemoryManager(); byte_t data = mm.getByte(mem_addr); - byte_t newdata = data ^ (1 << bit_offset); + byte_t newdata; + if (param.msg.has_faultmodel() && param.msg.faultmodel() == param.msg.BURST) { + newdata = data ^ 0xff; + bit_offset = 8; // enforce loop termination + } else if (!param.msg.has_faultmodel() || param.msg.faultmodel() == param.msg.SINGLEBITFLIP) { + newdata = data ^ (1 << bit_offset); + } mm.setByte(mem_addr, newdata); // note at what IP we did it int32_t injection_ip = simulator.getRegisterManager().getInstructionPointer(); @@ -549,7 +556,8 @@ bool EcosKernelTestExperiment::faultInjection() { } } // sanity check: do we have exactly 8 results? - if (param.msg.result_size() != 8) { + if ((!param.msg.has_faultmodel() || param.msg.faultmodel() == param.msg.SINGLEBITFLIP) + && param.msg.result_size() != 8) { log << "WTF? param.msg.result_size() != 8" << endl; } else { param.msg.set_runtime(timer); diff --git a/src/experiments/ecos_kernel_test/experimentInfo.hpp b/src/experiments/ecos_kernel_test/experimentInfo.hpp index 051b7006..ac74b560 100644 --- a/src/experiments/ecos_kernel_test/experimentInfo.hpp +++ b/src/experiments/ecos_kernel_test/experimentInfo.hpp @@ -1,3 +1,4 @@ #pragma once #define PREREQUISITES 0 +#define ECOS_FAULTMODEL_BURST 0