From bd3bef1f7245927ac4f16eb5bb1487ec98185081 Mon Sep 17 00:00:00 2001 From: hsc Date: Wed, 24 Oct 2012 22:35:46 +0000 Subject: [PATCH] nanojpeg: load existing results before starting campaign git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1823 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- src/experiments/nanojpeg/campaign.cc | 56 +++++++++++++++++---------- src/experiments/nanojpeg/campaign.hpp | 10 ++++- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/experiments/nanojpeg/campaign.cc b/src/experiments/nanojpeg/campaign.cc index e010af9a..e973330c 100644 --- a/src/experiments/nanojpeg/campaign.cc +++ b/src/experiments/nanojpeg/campaign.cc @@ -69,13 +69,6 @@ bool NanoJPEGCampaign::run() } ProtoIStream ps(&tracef); - // experiment count - int count_exp = 0; - int count_exp_jobs = 0; - // known output count - int count_known = 0; - int count_known_jobs = 0; - // instruction counter within trace unsigned instr = 0; @@ -151,7 +144,6 @@ bool NanoJPEGCampaign::run() // new EC with experiments: acc->first -- instr, common_mask // if (reg != RID_EBP && reg != RID_ESI && reg != RID_EDI) { count_exp += add_experiment_ec(acc->first, instr, ev.ip(), reg, common_mask); - count_exp_jobs++; // } // new memory access EC in access cascade @@ -196,7 +188,6 @@ bool NanoJPEGCampaign::run() // new EC with known result: acc->first -- instr, common_mask // if (reg != RID_EBP && reg != RID_ESI && reg != RID_EDI) { count_known += add_known_ec(acc->first, instr, ev.ip(), reg, common_mask); - count_known_jobs++; // } } @@ -216,6 +207,7 @@ bool NanoJPEGCampaign::run() } } campaignmanager.noMoreParameters(); + available_results.clear(); cout << "experiments planned: " << dec << count_exp << " (" << count_exp_jobs << " jobs)" << endl; cout << "known outcome ECs: " << dec << count_known @@ -278,7 +270,12 @@ int NanoJPEGCampaign::add_experiment_ec(unsigned instr_ecstart, unsigned instr_o c += v & 1; } - // TODO check result CSV if we already know the answer + bitmask = check_available(instr_offset, register_id, bitmask); + if (!bitmask) { + return 0; + } + + count_exp_jobs++; // enqueue job NanoJPEGExperimentData *d = new NanoJPEGExperimentData; @@ -303,7 +300,12 @@ int NanoJPEGCampaign::add_known_ec(unsigned instr_ecstart, unsigned instr_offset c += v & 1; } - // TODO check result CSV if we already stored the answer + bitmask = check_available(instr_offset, register_id, bitmask); + if (!bitmask) { + return 0; + } + + count_known_jobs++; add_result(instr_ecstart, instr_offset, instr_address, register_id, 0, 0, bitmask, NanoJPEGProtoMsg_Result::FINISHED, 0, INFINITY, ""); @@ -314,31 +316,32 @@ bool NanoJPEGCampaign::init_results() { // read already existing results bool file_exists = false; -/* - set existing_results; - ifstream oldresults(results_filename, ios::in); + ifstream oldresults(NANOJPEG_RESULTS, ios::in); if (oldresults.is_open()) { char buf[16*1024]; - uint64_t addr; + unsigned ignore; + unsigned instr_offset; + int register_id; + uint64_t bitmask; int count = 0; m_log << "scanning existing results ..." << endl; file_exists = true; while (oldresults.getline(buf, sizeof(buf)).good()) { stringstream ss; ss << buf; - ss >> addr; + ss >> hex >> ignore >> instr_offset >> ignore >> register_id >> ignore + >> ignore >> bitmask; if (ss.fail()) { continue; } ++count; - if (!existing_results.insert(addr).second) { - m_log << "duplicate: " << addr << endl; - } + available_results + [std::pair(instr_offset, register_id)] + |= bitmask; } - m_log << "found " << dec << count << " existing results" << endl; + m_log << "found " << dec << count << " existing result rows" << endl; oldresults.close(); } -*/ // non-destructive: due to the CSV header we can always manually recover // from an accident (append mode) @@ -354,6 +357,17 @@ bool NanoJPEGCampaign::init_results() return true; } +uint64_t NanoJPEGCampaign::check_available(unsigned instr_offset, + fail::GPRegisterId register_id, uint64_t bitmask) +{ + std::map, uint64_t>::iterator it; + it = available_results.find(std::pair(instr_offset, (int)register_id)); + if (it == available_results.end()) { + return bitmask; + } + return bitmask & ~it->second; +} + void NanoJPEGCampaign::add_result(unsigned instr_ecstart, unsigned instr_offset, uint32_t instr_address, fail::GPRegisterId register_id, unsigned timeout, uint32_t injection_ip, uint64_t bitmask, int resulttype, diff --git a/src/experiments/nanojpeg/campaign.hpp b/src/experiments/nanojpeg/campaign.hpp index 05ab6b59..a643c688 100644 --- a/src/experiments/nanojpeg/campaign.hpp +++ b/src/experiments/nanojpeg/campaign.hpp @@ -2,6 +2,8 @@ #define __NANOJPEG_CAMPAIGN_HPP__ #include +#include +#include #include "cpn/Campaign.hpp" #include "comm/ExperimentData.hpp" @@ -17,6 +19,8 @@ public: class NanoJPEGCampaign : public fail::Campaign { fail::Logger m_log; + int count_exp, count_exp_jobs; + int count_known, count_known_jobs; int add_experiment_ec(unsigned instr_ecstart, unsigned instr_offset, unsigned instr_address, fail::GPRegisterId register_id, uint64_t bitmask); int add_known_ec(unsigned instr_ecstart, unsigned instr_offset, @@ -27,9 +31,13 @@ class NanoJPEGCampaign : public fail::Campaign { unsigned timeout, uint32_t injection_ip, uint64_t bitmask, int resulttype, uint32_t latest_ip, float psnr, char const *details); void finalize_results(); + uint64_t check_available(unsigned instr_offset, + fail::GPRegisterId register_id, uint64_t bitmask); std::ofstream resultstream; + std::map, uint64_t> available_results; public: - NanoJPEGCampaign() : m_log("nJPEG Campaign") {} + NanoJPEGCampaign() : m_log("nJPEG Campaign"), + count_exp(0), count_exp_jobs(0), count_known(0), count_known_jobs(0) {} virtual bool run(); };