wmoo experiment WIP
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1084 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
32
core/experiments/weathermonitor/CMakeLists.txt
Normal file
32
core/experiments/weathermonitor/CMakeLists.txt
Normal file
@ -0,0 +1,32 @@
|
||||
set(EXPERIMENT_NAME weathermonitor)
|
||||
set(EXPERIMENT_TYPE WeathermonitorExperiment)
|
||||
configure_file(../instantiate-experiment.ah.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/instantiate-${EXPERIMENT_NAME}.ah @ONLY
|
||||
)
|
||||
|
||||
## Setup desired protobuf descriptions HERE ##
|
||||
set(MY_PROTOS
|
||||
weathermonitor.proto
|
||||
)
|
||||
|
||||
set(MY_CAMPAIGN_SRCS
|
||||
experimentInfo.hpp
|
||||
experiment.hpp
|
||||
experiment.cc
|
||||
campaign.hpp
|
||||
campaign.cc
|
||||
)
|
||||
|
||||
#### PROTOBUFS ####
|
||||
find_package(Protobuf REQUIRED)
|
||||
include_directories(${PROTOBUF_INCLUDE_DIRS})
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${MY_PROTOS})
|
||||
|
||||
## Build library
|
||||
add_library(${EXPERIMENT_NAME} ${PROTO_SRCS} ${PROTO_HDRS} ${MY_CAMPAIGN_SRCS})
|
||||
|
||||
## This is the example's campaign server distributing experiment parameters
|
||||
add_executable(${EXPERIMENT_NAME}-server main.cc)
|
||||
target_link_libraries(${EXPERIMENT_NAME}-server ${EXPERIMENT_NAME} fail ${PROTOBUF_LIBRARY} ${Boost_THREAD_LIBRARY})
|
||||
51
core/experiments/weathermonitor/campaign.cc
Normal file
51
core/experiments/weathermonitor/campaign.cc
Normal file
@ -0,0 +1,51 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#include "campaign.hpp"
|
||||
#include "experimentInfo.hpp"
|
||||
#include "controller/CampaignManager.hpp"
|
||||
#include "util/Logger.hpp"
|
||||
#include "util/MemoryMap.hpp"
|
||||
|
||||
#include "vptr_map.hpp"
|
||||
|
||||
#include "plugins/tracing/TracingPlugin.hpp"
|
||||
char const * const trace_filename = "trace.pb";
|
||||
|
||||
using namespace fi;
|
||||
using std::endl;
|
||||
|
||||
char const * const results_csv = "weathermonitor.csv";
|
||||
|
||||
// equivalence class type: addr, [i1, i2]
|
||||
// addr: byte to inject a bit-flip into
|
||||
// [i1, i2]: interval of instruction numbers, counted from experiment
|
||||
// begin
|
||||
struct equivalence_class {
|
||||
sal::address_t data_address;
|
||||
int instr1, instr2;
|
||||
sal::address_t instr2_absolute;
|
||||
};
|
||||
|
||||
bool WeathermonitorCampaign::run()
|
||||
{
|
||||
Logger log("Weathermonitor Campaign");
|
||||
|
||||
ifstream test(results_csv);
|
||||
if (test.is_open()) {
|
||||
log << results_csv << " already exists" << endl;
|
||||
return false;
|
||||
}
|
||||
ofstream results(results_csv);
|
||||
if (!results.is_open()) {
|
||||
log << "failed to open " << results_csv << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
log << "startup" << endl;
|
||||
|
||||
// XXX
|
||||
|
||||
return true;
|
||||
}
|
||||
19
core/experiments/weathermonitor/campaign.hpp
Normal file
19
core/experiments/weathermonitor/campaign.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef __WEATHERMONITOR_CAMPAIGN_HPP__
|
||||
#define __WEATHERMONITOR_CAMPAIGN_HPP__
|
||||
|
||||
#include "controller/Campaign.hpp"
|
||||
#include "controller/ExperimentData.hpp"
|
||||
#include "weathermonitor.pb.h"
|
||||
|
||||
class WeathermonitorExperimentData : public fi::ExperimentData {
|
||||
public:
|
||||
WeathermonitorProtoMsg msg;
|
||||
WeathermonitorExperimentData() : fi::ExperimentData(&msg) {}
|
||||
};
|
||||
|
||||
class WeathermonitorCampaign : public fi::Campaign {
|
||||
public:
|
||||
virtual bool run();
|
||||
};
|
||||
|
||||
#endif
|
||||
63
core/experiments/weathermonitor/experiment.cc
Normal file
63
core/experiments/weathermonitor/experiment.cc
Normal file
@ -0,0 +1,63 @@
|
||||
#include <iostream>
|
||||
|
||||
// getpid
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "util/Logger.hpp"
|
||||
|
||||
#include "experiment.hpp"
|
||||
#include "experimentInfo.hpp"
|
||||
#include "campaign.hpp"
|
||||
|
||||
#include "SAL/SALConfig.hpp"
|
||||
#include "SAL/SALInst.hpp"
|
||||
#include "SAL/Memory.hpp"
|
||||
#include "SAL/bochs/BochsRegister.hpp"
|
||||
#include "controller/Event.hpp"
|
||||
|
||||
// you need to have the tracing plugin enabled for this
|
||||
#include "plugins/tracing/TracingPlugin.hpp"
|
||||
|
||||
#include "vptr_map.hpp"
|
||||
|
||||
#define LOCAL 1
|
||||
|
||||
using std::endl;
|
||||
|
||||
bool WeathermonitorExperiment::run()
|
||||
{
|
||||
char const *statename = "bochs.state";
|
||||
Logger log("Weathermonitor", false);
|
||||
fi::BPEvent bp;
|
||||
|
||||
log << "startup" << endl;
|
||||
|
||||
#if 1
|
||||
// STEP 0: record memory map with vptr addresses
|
||||
fi::GuestEvent g;
|
||||
while (true) {
|
||||
sal::simulator.addEventAndWait(&g);
|
||||
std::cout << g.getData() << std::flush;
|
||||
}
|
||||
#elif 0
|
||||
// STEP 1: run until interesting function starts, and save state
|
||||
bp.setWatchInstructionPointer(WEATHER_FUNC_MAIN);
|
||||
sal::simulator.addEventAndWait(&bp);
|
||||
log << "test function entry reached, saving state" << endl;
|
||||
log << "EIP = " << std::hex << bp.getTriggerInstructionPointer() << endl;
|
||||
sal::simulator.save(statename);
|
||||
assert(bp.getTriggerInstructionPointer() == WEATHER_FUNC_MAIN);
|
||||
assert(sal::simulator.getRegisterManager().getInstructionPointer() == WEATHER_FUNC_MAIN);
|
||||
#elif 0
|
||||
// STEP 2: record trace for fault-space pruning
|
||||
// XXX
|
||||
|
||||
#elif 0
|
||||
// STEP 3: The actual experiment.
|
||||
// XXX
|
||||
|
||||
#endif
|
||||
// Explicitly terminate, or the simulator will continue to run.
|
||||
sal::simulator.terminate();
|
||||
}
|
||||
14
core/experiments/weathermonitor/experiment.hpp
Normal file
14
core/experiments/weathermonitor/experiment.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef __WEATHERMONITOR_EXPERIMENT_HPP__
|
||||
#define __WEATHERMONITOR_EXPERIMENT_HPP__
|
||||
|
||||
#include "controller/ExperimentFlow.hpp"
|
||||
#include "jobserver/JobClient.hpp"
|
||||
|
||||
class WeathermonitorExperiment : public fi::ExperimentFlow {
|
||||
fi::JobClient m_jc;
|
||||
public:
|
||||
WeathermonitorExperiment() : m_jc("ios.cs.tu-dortmund.de") {}
|
||||
bool run();
|
||||
};
|
||||
|
||||
#endif
|
||||
37
core/experiments/weathermonitor/experimentInfo.hpp
Normal file
37
core/experiments/weathermonitor/experimentInfo.hpp
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef __WEATHERMONITOR_EXPERIMENT_INFO_HPP__
|
||||
#define __WEATHERMONITOR_EXPERIMENT_INFO_HPP__
|
||||
|
||||
// FIXME autogenerate this
|
||||
|
||||
#define GUARDED_WEATHERMONITOR 0
|
||||
|
||||
#if !GUARDED_WEATHERMONITOR // without vptr guards
|
||||
|
||||
// main() address:
|
||||
// nm -C vanilla.elf|fgrep main
|
||||
#define WEATHER_FUNC_MAIN 0x001010f0
|
||||
// Temperature::measure() address:
|
||||
// nm -C vanilla.elf|fgrep 'Temperature::measure()'
|
||||
#define WEATHER_FUNC_TEMP_MEASURE 0x001010f0
|
||||
// number of instructions we want to observe
|
||||
#define WEATHER_NUMINSTR 10000
|
||||
// data/BSS begin:
|
||||
// nm -C vanilla.elf|fgrep ___DATA_START__
|
||||
#define WEATHER_DATA_START 0x00101c34
|
||||
// data/BSS end:
|
||||
// nm -C vanilla.elf|fgrep ___BSS_END__
|
||||
#define WEATHER_DATA_END 0x00103529
|
||||
// text begin:
|
||||
// nm -C vanilla.elf|fgrep ___TEXT_START__
|
||||
#define WEATHER_TEXT_START 0x00100000
|
||||
// text end:
|
||||
// nm -C vanilla.elf|fgrep ___TEXT_END__
|
||||
#define WEATHER_TEXT_END 0x00101a5b
|
||||
|
||||
#else // with guards
|
||||
|
||||
// XXX
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
11
core/experiments/weathermonitor/main.cc
Normal file
11
core/experiments/weathermonitor/main.cc
Normal file
@ -0,0 +1,11 @@
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
#include "controller/CampaignManager.hpp"
|
||||
#include "experiments/checksum-oostubs/campaign.hpp"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
WeathermonitorCampaign c;
|
||||
return !fi::campaignmanager.runCampaign(&c);
|
||||
}
|
||||
2
core/experiments/weathermonitor/vptr_map.hpp
Normal file
2
core/experiments/weathermonitor/vptr_map.hpp
Normal file
@ -0,0 +1,2 @@
|
||||
// will be generated from STEP 0 output with region2array.sh
|
||||
// XXX
|
||||
42
core/experiments/weathermonitor/weathermonitor.proto
Normal file
42
core/experiments/weathermonitor/weathermonitor.proto
Normal file
@ -0,0 +1,42 @@
|
||||
message WeathermonitorProtoMsg {
|
||||
// Input: experiment parameters
|
||||
required int32 instr_offset = 1;
|
||||
optional int32 instr_address = 2; // for sanity checks
|
||||
required int32 mem_addr = 3;
|
||||
required int32 bit_offset = 4;
|
||||
|
||||
// ----------------------------------------------------
|
||||
|
||||
// Output: experiment results
|
||||
// (make these optional to reduce overhead for server->client communication)
|
||||
|
||||
// instruction pointer where injection was done
|
||||
optional uint32 injection_ip = 5;
|
||||
|
||||
// result type:
|
||||
// FINISHED = planned number of instructions were executed
|
||||
// TRAP = premature guest "crash"
|
||||
enum ResultType {
|
||||
FINISHED = 1;
|
||||
TRAP = 2;
|
||||
HALT = 3;
|
||||
UNKNOWN = 4;
|
||||
}
|
||||
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;
|
||||
|
||||
// optional textual description of what happened
|
||||
optional string details = 11;
|
||||
}
|
||||
Reference in New Issue
Block a user