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:
@ -19,6 +19,7 @@
|
|||||||
#include "util/WallclockTimer.hpp"
|
#include "util/WallclockTimer.hpp"
|
||||||
#include "util/gzstream/gzstream.h"
|
#include "util/gzstream/gzstream.h"
|
||||||
#include "config/FailConfig.hpp"
|
#include "config/FailConfig.hpp"
|
||||||
|
#include "util/CommandLine.hpp"
|
||||||
|
|
||||||
// You need to have the tracing plugin enabled for this
|
// You need to have the tracing plugin enabled for this
|
||||||
#include "../plugins/tracing/TracingPlugin.hpp"
|
#include "../plugins/tracing/TracingPlugin.hpp"
|
||||||
@ -64,7 +65,7 @@ bool EcosKernelTestExperiment::retrieveGuestAddresses(guest_address_t addr_finis
|
|||||||
bp.setWatchInstructionPointer(addr_finish);
|
bp.setWatchInstructionPointer(addr_finish);
|
||||||
|
|
||||||
// memory map serialization
|
// 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()) {
|
if (!mm.is_open()) {
|
||||||
log << "failed to open " << EcosKernelTestCampaign::filename_memorymap() << endl;
|
log << "failed to open " << EcosKernelTestCampaign::filename_memorymap() << endl;
|
||||||
return false;
|
return false;
|
||||||
@ -142,9 +143,9 @@ bool EcosKernelTestExperiment::establishState(guest_address_t addr_entry, guest_
|
|||||||
|
|
||||||
for (unsigned i = 0; ; ++i) {
|
for (unsigned i = 0; ; ++i) {
|
||||||
log << "saving state at offset " << dec << (i * MULTIPLE_SNAPSHOTS_DISTANCE) << endl;
|
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
|
#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(&step);
|
||||||
simulator.addListener(&finish);
|
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 << "STEP 2: record trace for fault-space pruning" << endl;
|
||||||
|
|
||||||
log << "restoring state" << 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;
|
log << "EIP = " << hex << simulator.getCPU(0).getInstructionPointer() << endl;
|
||||||
assert(simulator.getCPU(0).getInstructionPointer() == addr_entry);
|
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
|
// restrict memory access logging to injection target
|
||||||
MemoryMap mm;
|
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);
|
tp.restrictMemoryAddresses(&mm);
|
||||||
|
|
||||||
// record trace
|
// record trace
|
||||||
ogzstream of(EcosKernelTestCampaign::filename_trace().c_str());
|
ogzstream of(EcosKernelTestCampaign::filename_trace(m_variant, m_benchmark).c_str());
|
||||||
tp.setTraceFile(&of);
|
tp.setTraceFile(&of);
|
||||||
// this must be done *after* configuring the plugin:
|
// this must be done *after* configuring the plugin:
|
||||||
simulator.addFlow(&tp);
|
simulator.addFlow(&tp);
|
||||||
@ -257,11 +258,11 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
|
|||||||
|
|
||||||
// serialize trace to file
|
// serialize trace to file
|
||||||
if (of.fail()) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
of.close();
|
of.close();
|
||||||
log << "trace written to " << EcosKernelTestCampaign::filename_trace() << endl;
|
log << "trace written to " << EcosKernelTestCampaign::filename_trace(m_variant, m_benchmark) << endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -609,11 +610,41 @@ bool EcosKernelTestExperiment::readELFSymbols(
|
|||||||
return true;
|
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()
|
bool EcosKernelTestExperiment::run()
|
||||||
{
|
{
|
||||||
log << "startup" << endl;
|
log << "startup" << endl;
|
||||||
|
|
||||||
#if PREREQUISITES
|
#if PREREQUISITES
|
||||||
|
parseOptions();
|
||||||
|
|
||||||
log << "retrieving ELF symbol addresses ..." << endl;
|
log << "retrieving ELF symbol addresses ..." << endl;
|
||||||
guest_address_t entry, finish, test_output, errors_corrected,
|
guest_address_t entry, finish, test_output, errors_corrected,
|
||||||
panic, text_start, text_end;
|
panic, text_start, text_end;
|
||||||
|
|||||||
@ -15,6 +15,7 @@ public:
|
|||||||
EcosKernelTestExperiment() : log("eCos Kernel Test", false) {}
|
EcosKernelTestExperiment() : log("eCos Kernel Test", false) {}
|
||||||
bool run();
|
bool run();
|
||||||
|
|
||||||
|
void parseOptions();
|
||||||
bool retrieveGuestAddresses(fail::guest_address_t addr_finish); // step 0
|
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 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
|
bool performTrace(fail::guest_address_t addr_entry, fail::guest_address_t addr_finish); // step 2
|
||||||
|
|||||||
Reference in New Issue
Block a user