ecos: fail-client accepts commandline parameters for prerequisites phase

This allows us to generate prerequisites (traces, state snapshots, memory
maps) in parallel, and without the previous shell script hacks.

Change-Id: I05a0321a794b4033d05eed20f5bffbd1e910cf1b
This commit is contained in:
Horst Schirmeier
2013-03-28 18:08:16 +01:00
parent 0eeec70570
commit 59e5fd3169
2 changed files with 40 additions and 8 deletions

View File

@ -19,6 +19,7 @@
#include "util/WallclockTimer.hpp"
#include "util/gzstream/gzstream.h"
#include "config/FailConfig.hpp"
#include "util/CommandLine.hpp"
// You need to have the tracing plugin enabled for this
#include "../plugins/tracing/TracingPlugin.hpp"
@ -64,7 +65,7 @@ bool EcosKernelTestExperiment::retrieveGuestAddresses(guest_address_t addr_finis
bp.setWatchInstructionPointer(addr_finish);
// memory map serialization
ofstream mm(EcosKernelTestCampaign::filename_memorymap().c_str(), ios::out);
ofstream mm(EcosKernelTestCampaign::filename_memorymap(m_variant, m_benchmark).c_str(), ios::out);
if (!mm.is_open()) {
log << "failed to open " << EcosKernelTestCampaign::filename_memorymap() << endl;
return false;
@ -142,9 +143,9 @@ bool EcosKernelTestExperiment::establishState(guest_address_t addr_entry, guest_
for (unsigned i = 0; ; ++i) {
log << "saving state at offset " << dec << (i * MULTIPLE_SNAPSHOTS_DISTANCE) << endl;
simulator.save(EcosKernelTestCampaign::filename_state(i * MULTIPLE_SNAPSHOTS_DISTANCE));
simulator.save(EcosKernelTestCampaign::filename_state(i * MULTIPLE_SNAPSHOTS_DISTANCE, m_variant, m_benchmark));
#if MULTIPLE_SNAPSHOTS
simulator.restore(EcosKernelTestCampaign::filename_state(i * MULTIPLE_SNAPSHOTS_DISTANCE));
simulator.restore(EcosKernelTestCampaign::filename_state(i * MULTIPLE_SNAPSHOTS_DISTANCE, m_variant, m_benchmark));
simulator.addListener(&step);
simulator.addListener(&finish);
@ -164,7 +165,7 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
log << "STEP 2: record trace for fault-space pruning" << endl;
log << "restoring state" << endl;
simulator.restore(EcosKernelTestCampaign::filename_state(0));
simulator.restore(EcosKernelTestCampaign::filename_state(0, m_variant, m_benchmark));
log << "EIP = " << hex << simulator.getCPU(0).getInstructionPointer() << endl;
assert(simulator.getCPU(0).getInstructionPointer() == addr_entry);
@ -173,12 +174,12 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
// restrict memory access logging to injection target
MemoryMap mm;
EcosKernelTestCampaign::readMemoryMap(mm, EcosKernelTestCampaign::filename_memorymap().c_str());
EcosKernelTestCampaign::readMemoryMap(mm, EcosKernelTestCampaign::filename_memorymap(m_variant, m_benchmark).c_str());
tp.restrictMemoryAddresses(&mm);
// record trace
ogzstream of(EcosKernelTestCampaign::filename_trace().c_str());
ogzstream of(EcosKernelTestCampaign::filename_trace(m_variant, m_benchmark).c_str());
tp.setTraceFile(&of);
// this must be done *after* configuring the plugin:
simulator.addFlow(&tp);
@ -257,11 +258,11 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
// serialize trace to file
if (of.fail()) {
log << "failed to write " << EcosKernelTestCampaign::filename_trace() << endl;
log << "failed to write " << EcosKernelTestCampaign::filename_trace(m_variant, m_benchmark) << endl;
return false;
}
of.close();
log << "trace written to " << EcosKernelTestCampaign::filename_trace() << endl;
log << "trace written to " << EcosKernelTestCampaign::filename_trace(m_variant, m_benchmark) << endl;
return true;
}
@ -609,11 +610,41 @@ bool EcosKernelTestExperiment::readELFSymbols(
return true;
}
void EcosKernelTestExperiment::parseOptions()
{
CommandLine &cmd = CommandLine::Inst();
cmd.addOption("", "", Arg::None, "USAGE: fail-client -Wf,[option] -Wf,[option] ... <BochsOptions...>");
CommandLine::option_handle HELP =
cmd.addOption("h", "help", Arg::None, "-h,--help\t Print usage and exit");
CommandLine::option_handle VARIANT =
cmd.addOption("", "variant", Arg::Required, "--variant v\t experiment variant");
CommandLine::option_handle BENCHMARK =
cmd.addOption("", "benchmark", Arg::Required, "--benchmark b\t benchmark");
if (!cmd.parse()) {
cerr << "Error parsing arguments." << endl;
simulator.terminate(1);
} else if (cmd[HELP]) {
cmd.printUsage();
simulator.terminate(0);
}
if (cmd[VARIANT].count() > 0 && cmd[BENCHMARK].count() > 0) {
m_variant = std::string(cmd[VARIANT].first()->arg);
m_benchmark = std::string(cmd[BENCHMARK].first()->arg);
} else {
cerr << "Please supply parameters for --variant and --benchmark." << endl;
simulator.terminate(1);
}
}
bool EcosKernelTestExperiment::run()
{
log << "startup" << endl;
#if PREREQUISITES
parseOptions();
log << "retrieving ELF symbol addresses ..." << endl;
guest_address_t entry, finish, test_output, errors_corrected,
panic, text_start, text_end;

View File

@ -15,6 +15,7 @@ public:
EcosKernelTestExperiment() : log("eCos Kernel Test", false) {}
bool run();
void parseOptions();
bool retrieveGuestAddresses(fail::guest_address_t addr_finish); // step 0
bool establishState(fail::guest_address_t addr_entry, fail::guest_address_t addr_finish, fail::guest_address_t addr_errors_corrected); // step 1
bool performTrace(fail::guest_address_t addr_entry, fail::guest_address_t addr_finish); // step 2