From 0963a062090514cd5462e62bafc608b4d87f3ddc Mon Sep 17 00:00:00 2001 From: hsc Date: Tue, 17 Apr 2012 17:56:23 +0000 Subject: [PATCH] wmoo: experiment works locally TODO: more result checking git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1093 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- core/experiments/weathermonitor/experiment.cc | 139 ++++++++++++++++++ .../weathermonitor/weathermonitor.proto | 21 +-- 2 files changed, 145 insertions(+), 15 deletions(-) diff --git a/core/experiments/weathermonitor/experiment.cc b/core/experiments/weathermonitor/experiment.cc index 4228b133..7b8e36fb 100644 --- a/core/experiments/weathermonitor/experiment.cc +++ b/core/experiments/weathermonitor/experiment.cc @@ -102,6 +102,145 @@ bool WeathermonitorExperiment::run() #elif 0 // STEP 3: The actual experiment. +#if !LOCAL + for (int i = 0; i < 500; ++i) { +#endif + + log << "restoring state" << endl; + sal::simulator.restore(statename); + + // get an experiment parameter set + log << "asking job server for experiment parameters" << endl; + WeathermonitorExperimentData param; +#if !LOCAL + if (!m_jc.getParam(param)) { + log << "Dying." << endl; + // communicate that we were told to die + sal::simulator.terminate(1); + } +#else + // XXX debug + param.msg.set_instr_offset(1000); + //param.msg.set_instr_address(12345); + param.msg.set_mem_addr(0x00103bdc); + param.msg.set_bit_offset(5); +#endif + + int id = param.getWorkloadID(); + int instr_offset = param.msg.instr_offset(); + int mem_addr = param.msg.mem_addr(); + int bit_offset = param.msg.bit_offset(); + log << "job " << id << " instr " << instr_offset << " mem " << mem_addr << "+" << bit_offset << endl; + + // XXX debug +/* + std::stringstream fname; + fname << "job." << ::getpid(); + std::ofstream job(fname.str().c_str()); + job << "job " << id << " instr " << instr_offset << " (" << param.msg.instr_address() << ") mem " << mem_addr << "+" << bit_offset << endl; + job.close(); +*/ + + // this marks THE END + fi::BPEvent ev_end(fi::ANY_ADDR); + ev_end.setCounter(WEATHER_NUMINSTR); + sal::simulator.addEvent(&ev_end); + + // no need to wait if offset is 0 + if (instr_offset > 0) { + // XXX could be improved with intermediate states (reducing runtime until injection) + bp.setWatchInstructionPointer(fi::ANY_ADDR); + bp.setCounter(instr_offset); + sal::simulator.addEventAndWait(&bp); + } + + // --- fault injection --- + sal::MemoryManager& mm = sal::simulator.getMemoryManager(); + sal::byte_t data = mm.getByte(mem_addr); + sal::byte_t newdata = data ^ (1 << bit_offset); + mm.setByte(mem_addr, newdata); + // note at what IP we did it + int32_t injection_ip = sal::simulator.getRegisterManager().getInstructionPointer(); + param.msg.set_injection_ip(injection_ip); + log << "fault injected @ ip " << injection_ip + << " 0x" << std::hex << ((int)data) << " -> 0x" << ((int)newdata) << endl; + // sanity check + if (param.msg.has_instr_address() && + injection_ip != param.msg.instr_address()) { + std::stringstream ss; + ss << "SANITY CHECK FAILED: " << injection_ip + << " != " << param.msg.instr_address(); + log << ss.str() << endl; + param.msg.set_resulttype(param.msg.UNKNOWN); + param.msg.set_latest_ip(injection_ip); + param.msg.set_details(ss.str()); + + sal::simulator.clearEvents(); +#if !LOCAL + m_jc.sendResult(param); + continue; +#endif + } + + // --- aftermath --- + // four possible outcomes: + // - trap, "crash" + // - jump outside text segment + // - (XXX unaligned jump inside text segment) + // - (XXX weird instructions?) + // - (XXX results displayed?) + // - reaches THE END + + // catch traps as "extraordinary" ending + fi::TrapEvent ev_trap(fi::ANY_TRAP); + sal::simulator.addEvent(&ev_trap); + // jump outside text segment + fi::BPRangeEvent ev_below_text(fi::ANY_ADDR, WEATHER_TEXT_START - 1); + fi::BPRangeEvent ev_beyond_text(WEATHER_TEXT_END + 1, fi::ANY_ADDR); + sal::simulator.addEvent(&ev_below_text); + sal::simulator.addEvent(&ev_beyond_text); + +#if LOCAL && 0 + // XXX debug + log << "enabling tracing" << endl; + TracingPlugin tp; + tp.setLogIPOnly(true); + tp.setOstream(&std::cout); + // this must be done *after* configuring the plugin: + sal::simulator.addFlow(&tp); +#endif + + fi::BaseEvent* ev = sal::simulator.waitAny(); + + // record latest IP regardless of result + param.msg.set_latest_ip(sal::simulator.getRegisterManager().getInstructionPointer()); + + if (ev == &ev_end) { + log << "Result FINISHED" << endl; + param.msg.set_resulttype(param.msg.FINISHED); + } else if (ev == &ev_below_text || ev == &ev_beyond_text) { + log << "Result OUTSIDE" << endl; + param.msg.set_resulttype(param.msg.OUTSIDE); + } else if (ev == &ev_trap) { + log << std::dec << "Result TRAP #" << ev_trap.getTriggerNumber() << endl; + param.msg.set_resulttype(param.msg.TRAP); + + std::stringstream ss; + ss << ev_trap.getTriggerNumber(); + param.msg.set_details(ss.str()); + } else { + log << "Result WTF?" << endl; + param.msg.set_resulttype(param.msg.UNKNOWN); + + std::stringstream ss; + ss << "eventid " << ev->getId() << " EIP " << sal::simulator.getRegisterManager().getInstructionPointer(); + param.msg.set_details(ss.str()); + } +#if !LOCAL + m_jc.sendResult(param); + + } +#endif // XXX #endif diff --git a/core/experiments/weathermonitor/weathermonitor.proto b/core/experiments/weathermonitor/weathermonitor.proto index 0ed8ca0e..fbb5bfc3 100644 --- a/core/experiments/weathermonitor/weathermonitor.proto +++ b/core/experiments/weathermonitor/weathermonitor.proto @@ -19,24 +19,15 @@ message WeathermonitorProtoMsg { enum ResultType { FINISHED = 1; TRAP = 2; - HALT = 3; - UNKNOWN = 4; + OUTSIDE = 3; + HALT = 4; + UNKNOWN = 5; } optional ResultType resulttype = 6; - // result details: - // resultdata = result[0-2] - repeated uint32 resultdata = 7 [packed=true]; - - // was finish() ever reached? - optional bool finish_reached = 8; - - // especially interesting for TRAP/ UNKNOWN: latest IP - optional uint32 latest_ip = 9; - - // did ECC correct the fault? - optional int32 error_corrected = 10; + // especially interesting for TRAP/UNKNOWN: latest IP + optional uint32 latest_ip = 7; // optional textual description of what happened - optional string details = 11; + optional string details = 8; }