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
This commit is contained in:
@ -346,7 +346,11 @@ bool EcosKernelTestCampaign::add_experiment_ec(const std::string& variant, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
count_exp_jobs++;
|
count_exp_jobs++;
|
||||||
count_exp += 8;
|
if (ECOS_FAULTMODEL_BURST) {
|
||||||
|
count_exp++;
|
||||||
|
} else {
|
||||||
|
count_exp += 8;
|
||||||
|
}
|
||||||
|
|
||||||
// enqueue job
|
// enqueue job
|
||||||
#if 1
|
#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_offset(instr2);
|
||||||
d->msg.set_instr2_address(instr_absolute);
|
d->msg.set_instr2_address(instr_absolute);
|
||||||
d->msg.set_mem_addr(data_address);
|
d->msg.set_mem_addr(data_address);
|
||||||
|
d->msg.set_faultmodel(ECOS_FAULTMODEL_BURST ? d->msg.BURST : d->msg.SINGLEBITFLIP);
|
||||||
campaignmanager.addParam(d);
|
campaignmanager.addParam(d);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -371,7 +376,11 @@ bool EcosKernelTestCampaign::add_known_ec(const std::string& variant, const std:
|
|||||||
}
|
}
|
||||||
|
|
||||||
count_known_jobs++;
|
count_known_jobs++;
|
||||||
count_known += 8;
|
if (ECOS_FAULTMODEL_BURST) {
|
||||||
|
count_known++;
|
||||||
|
} else {
|
||||||
|
count_known += 8;
|
||||||
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
add_result(variant, benchmark, instr1, instr2, instr_absolute, data_address,
|
add_result(variant, benchmark, instr1, instr2, instr_absolute, data_address,
|
||||||
@ -497,7 +506,8 @@ void EcosKernelTestCampaign::collect_results()
|
|||||||
EcosKernelTestExperimentData *res;
|
EcosKernelTestExperimentData *res;
|
||||||
while ((res = static_cast<EcosKernelTestExperimentData *>(campaignmanager.getDone()))) {
|
while ((res = static_cast<EcosKernelTestExperimentData *>(campaignmanager.getDone()))) {
|
||||||
// sanity check
|
// 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;
|
m_log << "wtf, result_size = " << res->msg.result_size() << endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -505,6 +515,7 @@ void EcosKernelTestCampaign::collect_results()
|
|||||||
EcosKernelTestProtoMsg_Result const *prev_singleres = 0;
|
EcosKernelTestProtoMsg_Result const *prev_singleres = 0;
|
||||||
int first_bit = 0, bit_width = 0;
|
int first_bit = 0, bit_width = 0;
|
||||||
|
|
||||||
|
#if !ECOS_FAULTMODEL_BURST
|
||||||
// one job contains 8 experiments
|
// one job contains 8 experiments
|
||||||
for (int idx = 0; idx < res->msg.result_size(); ++idx) {
|
for (int idx = 0; idx < res->msg.result_size(); ++idx) {
|
||||||
EcosKernelTestProtoMsg_Result const *cur_singleres = &res->msg.result(idx);
|
EcosKernelTestProtoMsg_Result const *cur_singleres = &res->msg.result(idx);
|
||||||
@ -533,6 +544,12 @@ void EcosKernelTestCampaign::collect_results()
|
|||||||
first_bit = cur_singleres->bit_offset();
|
first_bit = cur_singleres->bit_offset();
|
||||||
bit_width = 1;
|
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(),
|
add_result(res->msg.variant(), res->msg.benchmark(), res->msg.instr1_offset(),
|
||||||
res->msg.instr2_offset(), res->msg.instr2_address(), res->msg.mem_addr(),
|
res->msg.instr2_offset(), res->msg.instr2_address(), res->msg.mem_addr(),
|
||||||
first_bit, bit_width, prev_singleres->resulttype(), prev_singleres->ecos_test_result(),
|
first_bit, bit_width, prev_singleres->resulttype(), prev_singleres->ecos_test_result(),
|
||||||
|
|||||||
@ -24,6 +24,12 @@ message EcosKernelTestProtoMsg {
|
|||||||
// to instr_address
|
// to instr_address
|
||||||
optional int32 injection_ip = 7;
|
optional int32 injection_ip = 7;
|
||||||
|
|
||||||
|
enum FaultModel {
|
||||||
|
SINGLEBITFLIP = 1;
|
||||||
|
BURST = 2;
|
||||||
|
}
|
||||||
|
optional FaultModel faultmodel = 10;
|
||||||
|
|
||||||
repeated group Result = 8 {
|
repeated group Result = 8 {
|
||||||
// single experiment bit offset
|
// single experiment bit offset
|
||||||
required int32 bit_offset = 1;
|
required int32 bit_offset = 1;
|
||||||
|
|||||||
@ -321,7 +321,8 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
}
|
}
|
||||||
#endif
|
#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) {
|
for (int bit_offset = 0; bit_offset < 8; ++bit_offset) {
|
||||||
// 8 results in one job
|
// 8 results in one job
|
||||||
EcosKernelTestProtoMsg_Result *result = param.msg.add_result();
|
EcosKernelTestProtoMsg_Result *result = param.msg.add_result();
|
||||||
@ -365,7 +366,13 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
// --- fault injection ---
|
// --- fault injection ---
|
||||||
MemoryManager& mm = simulator.getMemoryManager();
|
MemoryManager& mm = simulator.getMemoryManager();
|
||||||
byte_t data = mm.getByte(mem_addr);
|
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);
|
mm.setByte(mem_addr, newdata);
|
||||||
// note at what IP we did it
|
// note at what IP we did it
|
||||||
int32_t injection_ip = simulator.getRegisterManager().getInstructionPointer();
|
int32_t injection_ip = simulator.getRegisterManager().getInstructionPointer();
|
||||||
@ -549,7 +556,8 @@ bool EcosKernelTestExperiment::faultInjection() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// sanity check: do we have exactly 8 results?
|
// 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;
|
log << "WTF? param.msg.result_size() != 8" << endl;
|
||||||
} else {
|
} else {
|
||||||
param.msg.set_runtime(timer);
|
param.msg.set_runtime(timer);
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define PREREQUISITES 0
|
#define PREREQUISITES 0
|
||||||
|
#define ECOS_FAULTMODEL_BURST 0
|
||||||
|
|||||||
Reference in New Issue
Block a user