From 78a0d863a2172b2849736d4b41ffb145342d6cfe Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Wed, 11 Jun 2014 10:54:26 +0200 Subject: [PATCH 01/12] Expand Protocol for own Fail-Stop-Function --- src/experiments/l4-sys/experiment.cc | 16 +++++++++++++--- src/experiments/l4-sys/l4sys.proto | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index df69ddb5..4c8f3cd6 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -240,7 +240,7 @@ void L4SysExperiment::startAndSaveInitState(fail::BPSingleListener* bp) void L4SysExperiment::CR3run(fail::BPSingleListener *bp) { - log << "CR3Run: Watching for instruction " << hex << L4SYS_FUNC_ENTRY << endl; + log << "CR_3Run: Watching for instruction " << hex << L4SYS_FUNC_ENTRY << endl; bp->setWatchInstructionPointer(L4SYS_FUNC_ENTRY); simulator.addListenerAndResume(bp); log << "Reached entry point @ " << hex << bp->getTriggerInstructionPointer() @@ -471,10 +471,11 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) simulator.addListener(bp); ++count; } - +#if 0 if (curr_addr < 0xC0000000) // XXX filter for kernel-only experiment continue; - +#endif + currtime = simulator.getTimerTicks(); deltatime = currtime - prevtime; @@ -815,6 +816,10 @@ bool L4SysExperiment::run() BPSingleListener ev_longjmp(L4SYS_BREAK_LONGJMP); simulator.addListener(&ev_longjmp); + //If we come to our own exit function, we can stop + BPSingleListener ev_exit(L4SYS_BREAK_EXIT); + simulator.addListener(&ev_exit); + unsigned instr_left = L4SYS_TOTINSTR - instr_offset; // XXX offset is in NUMINSTR, TOTINSTR is higher BPSingleListener ev_incomplete(ANY_ADDR, L4SYS_ADDRESS_SPACE); /* @@ -870,6 +875,11 @@ bool L4SysExperiment::run() result->set_resulttype(param->msg.TIMEOUT); result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); result->set_output(sanitised(currentOutput.c_str())); + } else if (ev == &ev_exit) { + log << "Result FAILSTOP" << endl; + result->set_resulttype(param->msg.FAILSTOP); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); } else { log << "Result WTF?" << endl; stringstream ss; diff --git a/src/experiments/l4-sys/l4sys.proto b/src/experiments/l4-sys/l4sys.proto index 73fb7ed0..6d876454 100644 --- a/src/experiments/l4-sys/l4sys.proto +++ b/src/experiments/l4-sys/l4sys.proto @@ -31,6 +31,7 @@ message L4SysProtoMsg { TIMEOUT = 3; WRONG = 4; UNKNOWN = 5; + FAILSTOP = 6; } required DatabaseCampaignMessage fsppilot = 1; From 53dc6bbf3669bf976920fbed10c173d3dab11d59 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Wed, 11 Jun 2014 11:04:03 +0200 Subject: [PATCH 02/12] Code cleanup --- src/experiments/l4-sys/CMakeLists.txt | 2 - src/experiments/l4-sys/campaign.cc | 160 +-------------- src/experiments/l4-sys/campaign.hpp | 5 - src/experiments/l4-sys/conversion.cc | 16 -- src/experiments/l4-sys/conversion.hpp | 25 --- src/experiments/l4-sys/experiment.cc | 236 +--------------------- src/experiments/l4-sys/experimentInfo.hpp | 26 ++- 7 files changed, 27 insertions(+), 443 deletions(-) delete mode 100644 src/experiments/l4-sys/conversion.cc delete mode 100644 src/experiments/l4-sys/conversion.hpp diff --git a/src/experiments/l4-sys/CMakeLists.txt b/src/experiments/l4-sys/CMakeLists.txt index 1ea51cc9..8bccf74f 100644 --- a/src/experiments/l4-sys/CMakeLists.txt +++ b/src/experiments/l4-sys/CMakeLists.txt @@ -20,8 +20,6 @@ set(MY_CAMPAIGN_SRCS UDIS86.cc InstructionFilter.hpp InstructionFilter.cc - conversion.hpp - conversion.cc ) #### PROTOBUFS #### diff --git a/src/experiments/l4-sys/campaign.cc b/src/experiments/l4-sys/campaign.cc index 5815ec33..bd45cbec 100644 --- a/src/experiments/l4-sys/campaign.cc +++ b/src/experiments/l4-sys/campaign.cc @@ -1,164 +1,12 @@ -#include -#include - #include "campaign.hpp" -#include "experimentInfo.hpp" -#include "conversion.hpp" -#include "comm/DatabaseCampaignMessage.pb.h" +#include "experiment.hpp" #include "cpn/CampaignManager.hpp" -#include "util/Logger.hpp" -#include "sal/SALConfig.hpp" - -using namespace std; -using namespace fail; - -char const * const results_csv = "l4sys.csv"; - -extern L4SysConversion l4sysResultConversion; -extern L4SysConversion l4sysExperimentConversion; -extern L4SysConversion l4sysRegisterConversion; - -#if 0 -bool L4SysCampaign::run() { - Logger log("L4SysCampaign"); - - 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; - - int count = 0; - srand(time(NULL)); - - for (int i = 0; i < L4SYS_NUMINSTR; ++i) { - for (int r = 1; r < 9; ++r) { - for (int b = 0; b < 32; ++b) { - L4SysExperimentData *d = new L4SysExperimentData; - d->msg.set_exp_type(d->msg.GPRFLIP); - d->msg.set_register_offset(static_cast(r)); - d->msg.set_instr_offset(i); - d->msg.set_bit_offset(b); - campaignmanager.addParam(d); - ++count; - } - } - } - - for (int i = 0; i < 20000; ++i) { - L4SysExperimentData *d = new L4SysExperimentData; - d->msg.set_exp_type(d->msg.GPRFLIP); - // affect a random register - int reg_offset = rand() % 8 + 1; - d->msg.set_register_offset( - static_cast(reg_offset)); - // modify for a random instruction - int instr_offset = rand() % L4SYS_NUMINSTR; - d->msg.set_instr_offset(instr_offset); - // modify a random bit - int bit_offset = rand() % 32; - d->msg.set_bit_offset(bit_offset); - - campaignmanager.addParam(d); - ++count; - } - for (int i = 0; i < 20000; ++i) { - L4SysExperimentData *d = new L4SysExperimentData; - d->msg.set_exp_type(d->msg.ALUINSTR); - // modify for a random instruction - int instr_offset = rand() % L4SYS_NUMINSTR; - d->msg.set_instr_offset(instr_offset); - // this value is not required for this experiment, so set it to an arbitrary value - d->msg.set_bit_offset(0); - - campaignmanager.addParam(d); - ++count; - } - for (int i = 0; i < 20000; ++i) { - L4SysExperimentData *d = new L4SysExperimentData; - d->msg.set_exp_type(d->msg.IDCFLIP); - // modify for a random instruction - int instr_offset = rand() % L4SYS_NUMINSTR; - d->msg.set_instr_offset(instr_offset); - // modify a random bit - Bochs supports at most 15 bytes of instruction - int bit_offset = rand() % 125; - d->msg.set_bit_offset(bit_offset); - - campaignmanager.addParam(d); - ++count; - } - for (int i = 0; i < 20000; ++i) { - L4SysExperimentData *d = new L4SysExperimentData; - d->msg.set_exp_type(d->msg.RATFLIP); - // modify for a random instruction - int instr_offset = rand() % L4SYS_NUMINSTR; - d->msg.set_instr_offset(instr_offset); - // this value is not required for this experiment, so set it to an arbitrary value - d->msg.set_bit_offset(0); - - campaignmanager.addParam(d); - ++count; - } - - campaignmanager.noMoreParameters(); - log << "done enqueueing parameter sets (" << count << ")." << endl; - - // collect results - L4SysExperimentData *res; - int rescount = 0; - results - << "exp_type,injection_ip,register,instr_offset,injection_bit,resulttype,resultdata,output,details" - << endl; - while ((res = static_cast(campaignmanager.getDone()))) { - rescount++; - - results << l4sysExperimentConversion.output(res->msg.exp_type()) - << "," << hex << res->msg.injection_ip() << dec << ","; - if (res->msg.has_register_offset()) - results << l4sysRegisterConversion.output(res->msg.register_offset()); - else - results << "None"; - results << "," << res->msg.instr_offset() << "," << res->msg.bit_offset() - << "," - << l4sysResultConversion.output(res->msg.resulttype()) << "," - << res->msg.resultdata(); - if (res->msg.has_output()) - results << "," << res->msg.output(); - if (res->msg.has_details()) - results << "," << res->msg.details(); - results << endl; - delete res; - } - - log << "done. sent " << count << " received " << rescount << endl; - results.close(); - - return true; -} -#endif - -using namespace google::protobuf; void L4SysCampaign::cb_send_pilot(DatabaseCampaignMessage p) { -#if 0 - int inj_instr = p.injection_instr(); - int data_addr = p.data_address(); - int reg = (data_addr >> 8) & 0xF; - int width = (data_addr >> 4) & 0xF; - int offs = data_addr & 0xF; -#endif L4SysExperimentData *d = new L4SysExperimentData; d->msg.mutable_fsppilot()->CopyFrom(p); - d->msg.set_exp_type(d->msg.GPRFLIP); - //d->msg.set_exp_type(d->msg.MEM); - campaignmanager.addParam(d); + //d->msg.set_exp_type(d->msg.GPRFLIP); + d->msg.set_exp_type(d->msg.MEM); + fail::campaignmanager.addParam(d); } diff --git a/src/experiments/l4-sys/campaign.hpp b/src/experiments/l4-sys/campaign.hpp index ec68f624..ab883d30 100644 --- a/src/experiments/l4-sys/campaign.hpp +++ b/src/experiments/l4-sys/campaign.hpp @@ -13,15 +13,10 @@ public: }; class L4SysCampaign : public fail::DatabaseCampaign { -#if 0 -public: - virtual bool run(); -#else virtual const google::protobuf::Descriptor * cb_result_message() { return google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("L4SysProtoMsg"); } virtual void cb_send_pilot(DatabaseCampaignMessage pilot); -#endif }; #endif // __L4SYS_CAMPAIGN_HPP__ diff --git a/src/experiments/l4-sys/conversion.cc b/src/experiments/l4-sys/conversion.cc deleted file mode 100644 index 7fc44c76..00000000 --- a/src/experiments/l4-sys/conversion.cc +++ /dev/null @@ -1,16 +0,0 @@ -#include "conversion.hpp" - -char const *l4sys_output_result_strings[] = { "Unknown", "No effect", "Incomplete execution", "Crash", "Silent data corruption", "Error" }; -char const *l4sys_output_experiment_strings[] = { "Unknown", "GPR Flip", "RAT Flip", "IDC Flip", "ALU Instr Flip" }; -char const *l4sys_output_register_strings[] = { "Unknown", "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI" }; - -L4SysConversion l4sysResultConversion( - l4sys_output_result_strings, - sizeof(l4sys_output_result_strings)); -L4SysConversion l4sysExperimentConversion( - l4sys_output_experiment_strings, - sizeof(l4sys_output_experiment_strings)); -L4SysConversion l4sysRegisterConversion( - l4sys_output_register_strings, - sizeof(l4sys_output_register_strings)); - diff --git a/src/experiments/l4-sys/conversion.hpp b/src/experiments/l4-sys/conversion.hpp deleted file mode 100644 index 515640de..00000000 --- a/src/experiments/l4-sys/conversion.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __L4SYS_CONVERSION_HPP__ - #define __L4SYS_CONVERSION_HPP__ - -#include "l4sys.pb.h" - -class L4SysConversion { -public: - L4SysConversion(char const **strings, size_t array_size) - : m_Strings(strings) - { - m_ElementCount = array_size / sizeof(char*); - } - char const * output(unsigned int res) { - if (res == 0 || res >= m_ElementCount) { - return m_Strings[0]; - } else { - return m_Strings[res]; - } - } -private: - char const **m_Strings; - size_t m_ElementCount; -}; - -#endif // __L4SYS_CONVERSION_HPP__ diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 4c8f3cd6..843b9fb2 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -36,9 +36,6 @@ using namespace fail; save, and restore. Enable these in the configuration. #endif -//string golden_run; -extern L4SysConversion l4sysRegisterConversion; - string L4SysExperiment::sanitised(const string &in_str) { string result; int in_str_size = in_str.size(); @@ -474,8 +471,7 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) #if 0 if (curr_addr < 0xC0000000) // XXX filter for kernel-only experiment continue; -#endif - +#endif currtime = simulator.getTimerTicks(); deltatime = currtime - prevtime; @@ -816,7 +812,7 @@ bool L4SysExperiment::run() BPSingleListener ev_longjmp(L4SYS_BREAK_LONGJMP); simulator.addListener(&ev_longjmp); - //If we come to our own exit function, we can stop + //If we come to our own exit function, we can stop BPSingleListener ev_exit(L4SYS_BREAK_EXIT); simulator.addListener(&ev_exit); @@ -844,10 +840,6 @@ bool L4SysExperiment::run() << (void*)&ev_incomplete << endl; BaseListener *ev = afterInjection(result); log << "afterInj: res.devstep = " << result->deviate_steps() << endl; -#if 0 - //do not discard output recorded so far - BaseListener *ev = waitIOOrOther(false); -#endif /* copying a string object that contains control sequences * unfortunately does not work with the library I am using, @@ -875,11 +867,11 @@ bool L4SysExperiment::run() result->set_resulttype(param->msg.TIMEOUT); result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); result->set_output(sanitised(currentOutput.c_str())); - } else if (ev == &ev_exit) { - log << "Result FAILSTOP" << endl; - result->set_resulttype(param->msg.FAILSTOP); - result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); - result->set_output(sanitised(currentOutput.c_str())); + } else if (ev == &ev_exit) { + log << "Result FAILSTOP" << endl; + result->set_resulttype(param->msg.FAILSTOP); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); } else { log << "Result WTF?" << endl; stringstream ss; @@ -890,220 +882,6 @@ bool L4SysExperiment::run() m_jc.sendResult(*param); -// XXX: Fixme to work with database campaign! -#if 0 - else if (exp_type == param->msg.IDCFLIP) { - // this is a twisted one - - // initial definitions - bxInstruction_c *currInstr = simulator.getCurrentInstruction(); - unsigned length_in_bits = currInstr->ilen() << 3; - - // get the instruction in plain text and inject the error there - // Note: we need to fetch some extra bytes into the array - // in case the faulty instruction is interpreted to be longer - // than the original one - Bit8u curr_instr_plain[MAX_INSTR_BYTES]; - const Bit8u *addr = calculateInstructionAddress(); - memcpy(curr_instr_plain, addr, MAX_INSTR_BYTES); - - // CampaignManager has no idea of the instruction length - // (neither do we), therefore this small adaption - bit_offset %= length_in_bits; - param->msg.set_bit_offset(bit_offset); - - // do some access calculation - int byte_index = bit_offset >> 3; - Bit8u bit_index = bit_offset & 7; - - // apply the fault - curr_instr_plain[byte_index] ^= 0x80 >> bit_index; - - // decode the instruction - bxInstruction_c bochs_instr; - memset(&bochs_instr, 0, sizeof(bxInstruction_c)); - fetchInstruction(simulator.getCPUContext(), curr_instr_plain, - &bochs_instr); - - // inject it - injectInstruction(currInstr, &bochs_instr); - - // do the logging - logInjection(); - } else if (exp_type == param->msg.RATFLIP) { - ud_type_t which = UD_NONE; - unsigned rnd = 0; - Udis86 udis(injection_ip); - do { - bxInstruction_c *currInstr = simulator.getCurrentInstruction(); - udis.setInputBuffer(calculateInstructionAddress(), currInstr->ilen()); - if (!udis.fetchNextInstruction()) { - terminateWithError( - "Could not decode instruction using UDIS86", 32); - } - ud_t _ud = udis.getCurrentState(); - - /* start Bjoern Doebel's code (slightly modified) */ - /* ============================================== */ - unsigned opcount = 0; - unsigned operands[4] = { ~0U, ~0U, ~0U, ~0U }; - enum { - RAT_IDX_MASK = 0x0FF, - RAT_IDX_OFFSET = 0x100 - }; - - for (unsigned i = 0; i < 3; ++i) { - /* - * Case 1: operand is a register - */ - if (_ud.operand[i].type == UD_OP_REG) { - operands[opcount++] = i; - } else if (_ud.operand[i].type == UD_OP_MEM) { - /* - * Case 2: operand is memory op. - * - * In this case, we may have 2 registers involved for the - * index-scale address calculation. - */ - if (_ud.operand[i].base != 0) // 0 if hard-wired mem operand - operands[opcount++] = i; - if (_ud.operand[i].index != 0) - operands[opcount++] = i + RAT_IDX_OFFSET; - } - } - - if (opcount == 0) { - // try the next instruction - singleStep(true); - } else { - // assign the necessary variables - rnd = rand() % opcount; - - if (operands[rnd] > RAT_IDX_OFFSET) { - which = _ud.operand[operands[rnd] - RAT_IDX_OFFSET].index; - } else { - which = _ud.operand[operands[rnd]].base; - } - } - /* ============================================ */ - /* end Bjoern Doebel's code (slightly modified) */ - - } while (which == UD_NONE && - simulator.getCPU(0).getInstructionPointer() != L4SYS_FUNC_EXIT); - - if (simulator.getCPU(0).getInstructionPointer() == L4SYS_FUNC_EXIT) { - stringstream ss; - ss << "Reached the end of the experiment "; - ss << "without finding an appropriate instruction"; - - terminateWithError(ss.str(), 33); - } - - // store the real injection point - param->msg.set_injection_ip(simulator.getCPU(0).getInstructionPointer()); - - // so we are able to flip the associated registers - // for details on the algorithm, see Bjoern Doebel's SWIFI/RATFlip class - - // some declarations - GPRegisterId bochs_reg = Udis86::udisGPRToFailBochsGPR(which); - param->msg.set_register_offset(static_cast(bochs_reg + 1)); - ConcreteCPU &cpu = simulator.getCPU(0); - Register *bochsRegister = cpu.getRegister(bochs_reg); - Register *exchangeRegister = NULL; - - // first, decide if the fault hits a register bound to this thread - // (ten percent chance) - if (rand() % 10 == 0) { - // assure exchange of registers - unsigned int exchg_reg = rand() % 7; - if (exchg_reg == bochs_reg) - exchg_reg++; - exchangeRegister = cpu.getRegister(exchg_reg); - param->msg.set_details(l4sysRegisterConversion.output(exchg_reg + 1)); - } - - // prepare the fault - regdata_t data = cpu.getRegisterContent(bochsRegister); - if (rnd > 0) { - //input register - do the fault injection here - regdata_t newdata = 0; - if (exchangeRegister != NULL) { - // the data is taken from a process register chosen before - newdata = cpu.getRegisterContent(exchangeRegister); - } else { - // the data comes from an uninitialised register - newdata = rand(); - stringstream ss; - ss << "0x" << hex << newdata; - param->msg.set_details(ss.str()); - } - cpu.setRegisterContent(bochsRegister, newdata); - } - - // execute the instruction - singleStep(true); - - // restore the register if we are still in the thread - if (rnd == 0) { - // output register - do the fault injection here - if (exchangeRegister != NULL) { - // write the result into the wrong local register - regdata_t newdata = cpu.getRegisterContent(bochsRegister); - cpu.setRegisterContent(exchangeRegister, newdata); - } - // otherwise, just assume it is stored in an unused register - } - // restore the actual value of the register - // in reality, it would never have been overwritten - cpu.setRegisterContent(bochsRegister, data); - - // log the injection - logInjection(); - - } else if (exp_type == param->msg.ALUINSTR) { - static BochsALUInstructions aluInstrObject(aluInstructions, aluInstructionsSize); - // find the closest ALU instruction after the current IP - - bxInstruction_c *currInstr; - while (!aluInstrObject.isALUInstruction( - currInstr = simulator.getCurrentInstruction()) && - simulator.getCPU(0).getInstructionPointer() != L4SYS_FUNC_EXIT) { - singleStep(true); - } - - if (simulator.getCPU(0).getInstructionPointer() == L4SYS_FUNC_EXIT) { - stringstream ss; - ss << "Reached the end of the experiment "; - ss << "without finding an appropriate instruction"; - - terminateWithError(ss.str(), 34); - } - - // store the real injection point - param->msg.set_injection_ip(simulator.getCPU(0).getInstructionPointer()); - - // now exchange it with a random equivalent - bxInstruction_c newInstr; - string details; - aluInstrObject.randomEquivalent(newInstr, details); - if (memcmp(&newInstr, currInstr, sizeof(bxInstruction_c)) == 0) { - // something went wrong - exit experiment - terminateWithError( - "Did not hit an ALU instruction - correct the source code please!", - 40); - } - // record information on the new instruction - param->msg.set_details(details); - - // inject it - injectInstruction(currInstr, &newInstr); - - // do the logging - logInjection(); - } -#endif - #endif terminate(0); diff --git a/src/experiments/l4-sys/experimentInfo.hpp b/src/experiments/l4-sys/experimentInfo.hpp index 3901beb0..40d684e2 100644 --- a/src/experiments/l4-sys/experimentInfo.hpp +++ b/src/experiments/l4-sys/experimentInfo.hpp @@ -6,23 +6,29 @@ // the bounds of the program (space, instructions and time) // client -#define L4SYS_ADDRESS_SPACE 0x1fd4c000 +#define L4SYS_ADDRESS_SPACE 0x1fd77000 // server #define L4SYS_ADDRESS_SPACE_TRACE L4SYS_ADDRESS_SPACE //#define L4SYS_ADDRESS_SPACE_TRACE 0x1fd4c000 +#define L4SYS_exp_start 0x20000216 +#define L4SYS_exp_end 0x2000029c +#define L4SYS_inj_start 0x2000022f +#define L4SYS_inj_end 0x20000252 + // FUNC_{ENTRY,EXIT} specifies the range that needs to // be captured to log program output properly -#define L4SYS_FUNC_ENTRY 0x20000220 -#define L4SYS_FUNC_EXIT 0x20000216 +#define L4SYS_FUNC_ENTRY L4SYS_exp_start +#define L4SYS_FUNC_EXIT L4SYS_exp_end // FILTER_{ENTRY,EXIT} specifies the range that injections // should be carried out on (should be a subset of the above) // and only works with FILTER_INSTRUCTIONS turned on -#define L4SYS_FILTER_ENTRY 0x200002ba -#define L4SYS_FILTER_EXIT 0x20000444 +#define L4SYS_FILTER_ENTRY L4SYS_inj_start +#define L4SYS_FILTER_EXIT L4SYS_inj_end -#define L4SYS_BREAK_BLINK 0xf004b800 -#define L4SYS_BREAK_LONGJMP 0xf004c88e +#define L4SYS_BREAK_BLINK 0x0 +#define L4SYS_BREAK_LONGJMP 0x0 +#define L4SYS_BREAK_EXIT 0x0 // select instruction filtering // XXX: this should be always on and the code should be @@ -31,12 +37,12 @@ #define L4SYS_FILTER_INSTRUCTIONS 1 // kernel: 2377547, userland: 79405472 -#define L4SYS_NUMINSTR 27025 -#define L4SYS_TOTINSTR 189122 +#define L4SYS_NUMINSTR 16 +#define L4SYS_TOTINSTR 58401 #define L4SYS_BOCHS_IPS 5000000 // several file names used -#define L4SYS_STATE_FOLDER "l4sys.state" +#define L4SYS_STATE_FOLDER "l4sys.state" #define L4SYS_INSTRUCTION_LIST "ip.list" #define L4SYS_ALU_INSTRUCTIONS "alu.list" #define L4SYS_CORRECT_OUTPUT "golden.out" From 23d86aba5dae9fc1ed8c700fb68fe41b24282b46 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Wed, 11 Jun 2014 18:06:12 +0200 Subject: [PATCH 03/12] Remove Injection functionallity which is currently broken and unused (fetchInstruction, logInjection, singleStep) --- src/experiments/l4-sys/experiment.cc | 84 --------------------------- src/experiments/l4-sys/experiment.hpp | 31 ---------- 2 files changed, 115 deletions(-) diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 843b9fb2..8dbafc23 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -12,7 +12,6 @@ #include "InstructionFilter.hpp" #include "aluinstr.hpp" #include "campaign.hpp" -#include "conversion.hpp" #include "sal/SALConfig.hpp" #include "sal/SALInst.hpp" @@ -89,89 +88,6 @@ const Bit8u *L4SysExperiment::calculateInstructionAddress() { return result; } -bx_bool L4SysExperiment::fetchInstruction(BX_CPU_C *instance, - const Bit8u *instr, bxInstruction_c *iStorage) { - unsigned remainingInPage = instance->eipPageWindowSize - eipBiased(); - int ret; - -#if BX_SUPPORT_X86_64 - if (BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64) - ret = instance->fetchDecode64(instr, iStorage, remainingInPage); - else -#endif - ret = instance->fetchDecode32(instr, iStorage, remainingInPage); - - if (ret < 0) { - // handle instrumentation callback inside boundaryFetch - instance->boundaryFetch(instr, remainingInPage, iStorage); - return 0; - } - - return 1; -} - -void L4SysExperiment::logInjection() { -// XXX fixme -#if 0 - // explicit type assignment necessary before sending over output stream - int id = param->getWorkloadID(); - int instr_offset = param->msg.instr_offset(); - int bit_offset = param->msg.bit_offset(); - int exp_type = param->msg.exp_type(); - address_t injection_ip = param->msg.injection_ip(); - - log << "job " << id << " exp_type " << exp_type << endl; - log << "inject @ ip " << hex << injection_ip << " (offset " << dec << instr_offset - << ")" << " bit " << bit_offset << endl; -#endif -} - -BaseListener *L4SysExperiment::singleStep(bool preserveAddressSpace) { - // XXX: fixme - return 0; -#if 0 - address_t aspace = (preserveAddressSpace ? L4SYS_ADDRESS_SPACE : ANY_ADDR); - BPSingleListener singlestepping_event(ANY_ADDR, aspace); - simulator.addListener(&singlestepping_event); - /* prepare for the case that the kernel panics and never - switches back to this thread by introducing a scheduling timeout - of 10 seconds */ - TimerListener schedTimeout(10000000); - simulator.addListener(&schedTimeout); - BaseListener *ev = waitIOOrOther(false); - simulator.removeListener(&singlestepping_event); - simulator.removeListener(&schedTimeout); - - if (ev == &schedTimeout) { - // otherwise we just assume this thread is never scheduled again - log << "Result TIMEOUT" << endl; - param->msg.set_resulttype(param->msg.TIMEOUT); - param->msg.set_resultdata( - simulator.getCPU(0).getInstructionPointer()); - param->msg.set_output(sanitised(currentOutput.c_str())); - param->msg.set_details("Timed out immediately after injecting"); - - m_jc.sendResult(*param); - terminate(0); - } - return ev; -#endif -} - -void L4SysExperiment::injectInstruction( - bxInstruction_c *oldInstr, bxInstruction_c *newInstr) { - // backup the current and insert the faulty instruction - bxInstruction_c backupInstr; - memcpy(&backupInstr, oldInstr, sizeof(bxInstruction_c)); - memcpy(oldInstr, newInstr, sizeof(bxInstruction_c)); - - // execute the faulty instruction, then return - singleStep(false); - - //restore the old instruction - memcpy(oldInstr, &backupInstr, sizeof(bxInstruction_c)); -} - unsigned L4SysExperiment::calculateTimeout(unsigned instr_left) { // the timeout in seconds, plus one backup second (avoids rounding overhead) // [instr] / [instr / s] = [s] diff --git a/src/experiments/l4-sys/experiment.hpp b/src/experiments/l4-sys/experiment.hpp index a250e066..091f6451 100644 --- a/src/experiments/l4-sys/experiment.hpp +++ b/src/experiments/l4-sys/experiment.hpp @@ -26,8 +26,6 @@ typedef struct TraceInstrType { unsigned bp_counter; } TraceInstr; -typedef std::vector TraceVector; - class L4SysExperiment : public fail::ExperimentFlow { private: fail::JobClient m_jc; //!< the job client connecting to the campaign server @@ -74,35 +72,6 @@ private: * @returns a value for Bochs' eipBiased variable */ Bit32u eipBiased(); - /** - * Parses a raw instruction into a bxInstruction_c structure. - * This simple version of the function is taken from Bochs - * where it is currently disabled due to the TRACE_CACHE option, - * and has been modified to fit the needs of instruction modification. - * @param instance a pointer to the current Bochs CPU - * @param instr a pointer to the address the instruction is fetched from - * @param iStorage an outgoing value which contains the parsed instruction - * @returns \a false if the instruction continued on the following page in memory - */ - bx_bool fetchInstruction(BX_CPU_C *instance, const Bit8u *instr, bxInstruction_c *iStorage); - /** - * Write out the injection parameters to the logger. - */ - void logInjection(); - /** - * Proceeds by one single instruction. - * @param preserveAddressSpace if set, the address space of the next instruction - * must match with the current address space - * (for example, this is important when debugging in the kernel) - * @returns the listener that was triggered, in case there were more than one - */ - fail::BaseListener *singleStep(bool preserveAddressSpace); - /** - * Injects a new instruction into the Bochs instruction stream and restores the previous one - * @param oldInstr address of the instruction to be replaced - * @param newInstr address of the instruction to replace it with - */ - void injectInstruction(bxInstruction_c *oldInstr, bxInstruction_c *newInstr); /** * Calculate the timeout of the current workload in milliseconds. */ From 191b14c0e618aeeb36de1aae012d50525d394f6b Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Fri, 13 Jun 2014 20:39:40 +0200 Subject: [PATCH 04/12] Enhancd experiment to accept config parameters. Combine all prep steps as well as the final example in one binary. Use parameter prep to specify what you would like to do. --- src/experiments/l4-sys/experiment.cc | 411 ++++++++++++++++++++------ src/experiments/l4-sys/experiment.hpp | 50 +++- src/experiments/l4-sys/main.cc | 7 + 3 files changed, 372 insertions(+), 96 deletions(-) diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 8dbafc23..01c3daaa 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -17,11 +18,12 @@ #include "sal/SALInst.hpp" #include "sal/Memory.hpp" #include "sal/Listener.hpp" -#include "config/FailConfig.hpp" -#include "util/ProtoStream.hpp" -#include "TracePlugin.pb.h" -#include "util/gzstream/gzstream.h" #include +#include "config/FailConfig.hpp" +#include "TracePlugin.pb.h" +#include "util/ProtoStream.hpp" +#include "util/gzstream/gzstream.h" +#include "util/CommandLine.hpp" using namespace std; using namespace fail; @@ -88,10 +90,10 @@ const Bit8u *L4SysExperiment::calculateInstructionAddress() { return result; } -unsigned L4SysExperiment::calculateTimeout(unsigned instr_left) { +unsigned L4SysExperiment::calculateTimeout(unsigned instr_left, unsigned ips) { // the timeout in seconds, plus one backup second (avoids rounding overhead) // [instr] / [instr / s] = [s] - unsigned seconds = instr_left / L4SYS_BOCHS_IPS + 1; + unsigned seconds = instr_left / ips + 1; // 1.1 (+10 percent) * 1000000 mus/s * [s] return 1100000 * seconds; } @@ -135,9 +137,12 @@ void L4SysExperiment::terminateWithError(string details, int reason, } -void L4SysExperiment::startAndSaveInitState(fail::BPSingleListener* bp) +void L4SysExperiment::runToStart(fail::BPSingleListener *bp) { - bp->setWatchInstructionPointer(L4SYS_FUNC_ENTRY); + bp->setWatchInstructionPointer(conf.func_entry); + + log << "run until ip reaches 0x" << hex << conf.func_entry << endl; + simulator.addListenerAndResume(bp); log << "test function entry reached, saving state" << endl; @@ -146,22 +151,15 @@ void L4SysExperiment::startAndSaveInitState(fail::BPSingleListener* bp) << simulator.getCPU(0).getInstructionPointer() << endl; log << "check the source code if the two instruction pointers are not equal" << endl; - simulator.save(L4SYS_STATE_FOLDER); - delete bp; + + if(conf.address_space == conf.address_space_trace) { + conf.address_space_trace = BX_CPU(0)->cr3; + } + + conf.address_space = BX_CPU(0)->cr3; } -void L4SysExperiment::CR3run(fail::BPSingleListener *bp) -{ - log << "CR_3Run: Watching for instruction " << hex << L4SYS_FUNC_ENTRY << endl; - bp->setWatchInstructionPointer(L4SYS_FUNC_ENTRY); - simulator.addListenerAndResume(bp); - log << "Reached entry point @ " << hex << bp->getTriggerInstructionPointer() - << " == " << simulator.getCPU(0).getInstructionPointer() - << endl; - log << "CR3 = " << hex << BX_CPU(0)->cr3 << endl; -} - BaseListener* L4SysExperiment::afterInjection(L4SysProtoMsg_Result* res) { @@ -170,14 +168,14 @@ BaseListener* L4SysExperiment::afterInjection(L4SysProtoMsg_Result* res) simtime_t t_inject = simulator.getTimerTicks(); simtime_t t_bailout; - ifstream instr_list_file(L4SYS_INSTRUCTION_LIST, ios::binary); + ifstream instr_list_file(conf.instruction_list.c_str(), ios::binary); instr_list_file.seekg((1 + res->instr_offset()) * sizeof(TraceInstr)); - RangeSetInstructionFilter filtering(L4SYS_FILTER); + RangeSetInstructionFilter filtering(conf.filter.c_str()); for (;;) { // Step over _all_ instructions in the trace AS - BPSingleListener stepListener(ANY_ADDR, L4SYS_ADDRESS_SPACE_TRACE); + BPSingleListener stepListener(ANY_ADDR, conf.address_space_trace); TraceInstr curr_instr; instr_list_file.read(reinterpret_cast(&curr_instr), @@ -230,16 +228,16 @@ BaseListener* L4SysExperiment::afterInjection(L4SysProtoMsg_Result* res) void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) { - fail::MemAccessListener ML(ANY_ADDR, MemAccessEvent::MEM_READWRITE); - ogzstream out("trace.pb"); - ProtoOStream *os = new ProtoOStream(&out); + fail::MemAccessListener ML(ANY_ADDR, MemAccessEvent::MEM_READWRITE); + ogzstream out(conf.trace.c_str()); + ProtoOStream *os = new ProtoOStream(&out); size_t count = 0, inst_accepted = 0, mem = 0, mem_valid = 0; simtime_t prevtime = 0, currtime; simtime_diff_t deltatime; log << "restoring state" << endl; - simulator.restore(L4SYS_STATE_FOLDER); + simulator.restore(conf.state_folder.c_str()); currtime = simulator.getTimerTicks(); log << "EIP = " << hex @@ -256,14 +254,14 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) } #if L4SYS_FILTER_INSTRUCTIONS - ofstream instr_list_file(L4SYS_INSTRUCTION_LIST, ios::binary); - RangeSetInstructionFilter filtering(L4SYS_FILTER); + ofstream instr_list_file(conf.instruction_list.c_str(), ios::binary); + RangeSetInstructionFilter filtering(conf.filter.c_str()); bp->setWatchInstructionPointer(ANY_ADDR); map times_called_map; bool injecting = false; - while (bp->getTriggerInstructionPointer() != L4SYS_FUNC_EXIT) { + while (bp->getTriggerInstructionPointer() != conf.func_exit) { fail::BaseListener *res = simulator.resume(); address_t curr_addr = 0; @@ -271,7 +269,7 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) if (res == &ML) { curr_addr = ML.getTriggerInstructionPointer(); simulator.addListener(&ML); - if ((L4SYS_ADDRESS_SPACE_TRACE != ANY_ADDR) && (BX_CPU(0)->cr3 != L4SYS_ADDRESS_SPACE_TRACE)) { + if ((conf.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != conf.address_space_trace)) { continue; } ++mem; @@ -285,11 +283,11 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) currtime = simulator.getTimerTicks(); deltatime = currtime - prevtime; - if (curr_addr == L4SYS_FILTER_ENTRY) { + if (curr_addr == conf.filter_entry) { injecting = true; } - if (curr_addr == L4SYS_FILTER_EXIT) { + if (curr_addr == conf.filter_exit) { injecting = false; } @@ -300,7 +298,7 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) if (!injecting or !filtering.isValidInstr(curr_addr, reinterpret_cast(calculateInstructionAddress())) or - (BX_CPU(0)->cr3 != L4SYS_ADDRESS_SPACE_TRACE) + (BX_CPU(0)->cr3 != conf.address_space_trace) ) { //log << "connt..." << std::endl; continue; @@ -365,7 +363,7 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; #else bp->setWatchInstructionPointer(ANY_ADDR); - while (bp->getTriggerInstructionPointer() != L4SYS_FUNC_EXIT) + while (bp->getTriggerInstructionPointer() != conf.func_exit) { fail::BaseListener *res = simulator.resume(); address_t curr_addr = 0; @@ -374,7 +372,7 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) if (res == &ML) { curr_addr = ML.getTriggerInstructionPointer(); simulator.addListener(&ML); - if ((L4SYS_ADDRESS_SPACE_TRACE != ANY_ADDR) && (BX_CPU(0)->cr3 != L4SYS_ADDRESS_SPACE_TRACE)) { + if ((func.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != func.address_space_trace)) { continue; } ++mem; @@ -421,20 +419,22 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) << dec << count << " instructions; " << count << " accepted" << endl; log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; #endif + conf.numinstr = inst_accepted; + conf.totinstr = count; delete bp; } void L4SysExperiment::goldenRun(fail::BPSingleListener* bp) { log << "restoring state" << endl; - simulator.restore(L4SYS_STATE_FOLDER); + simulator.restore(conf.state_folder.c_str()); log << "EIP = " << hex << simulator.getCPU(0).getInstructionPointer() << endl; std::string golden_run; - ofstream golden_run_file(L4SYS_CORRECT_OUTPUT); - bp->setWatchInstructionPointer(L4SYS_FUNC_EXIT); + ofstream golden_run_file(conf.golden_run.c_str()); + bp->setWatchInstructionPointer(conf.func_exit); simulator.addListener(bp); BaseListener* ev = waitIOOrOther(true); if (ev == bp) { @@ -468,23 +468,23 @@ void L4SysExperiment::getJobParameters() } -void L4SysExperiment::validatePrerequisites() +void L4SysExperiment::validatePrerequisites(std::string state, std::string output) { struct stat teststruct; - if (stat(L4SYS_STATE_FOLDER, &teststruct) == -1 || - stat(L4SYS_CORRECT_OUTPUT, &teststruct) == -1) { + if (stat(state.c_str(), &teststruct) == -1 || + stat(output.c_str(), &teststruct) == -1) { log << "Important data missing - call \"prepare\" first." << endl; terminate(10); } } -void L4SysExperiment::readGoldenRun(std::string& target) +void L4SysExperiment::readGoldenRun(std::string& target, std::string golden_run) { - ifstream golden_run_file(L4SYS_CORRECT_OUTPUT); + ifstream golden_run_file(golden_run.c_str()); if (!golden_run_file.good()) { - log << "Could not open file " << L4SYS_CORRECT_OUTPUT << endl; + log << "Could not open file " << golden_run.c_str() << endl; terminate(20); } @@ -495,7 +495,7 @@ void L4SysExperiment::readGoldenRun(std::string& target) } -void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset) +void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset, std::string instr_list) { /* * The L4Sys experiment uses instruction filtering to restrict the range @@ -513,7 +513,7 @@ void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int in * index into this trace file and determine the value for the breakpoint * counter. */ - ifstream instr_list_file(L4SYS_INSTRUCTION_LIST, ios::binary); + ifstream instr_list_file(instr_list.c_str(), ios::binary); if (!instr_list_file.good()) { log << "Missing instruction trace" << endl; @@ -542,12 +542,12 @@ void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int in fail::BPSingleListener* L4SysExperiment::prepareMemoryExperiment(int ip, int offset, int dataAddress) { - fail::BPSingleListener *bp = new BPSingleListener(0, L4SYS_ADDRESS_SPACE_TRACE); + fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); log << "\033[34;1mMemory fault injection\033[0m at instruction " << std::hex << offset << ", ip " << ip << ", address " << dataAddress << std::endl; #if L4SYS_FILTER_INSTRUCTIONS - setupFilteredBreakpoint(bp, offset); + setupFilteredBreakpoint(bp, offset, conf.instruction_list); assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); #else bp->setWatchInstructionPointer(ANY_ADDR); @@ -560,7 +560,7 @@ L4SysExperiment::prepareMemoryExperiment(int ip, int offset, int dataAddress) fail::BPSingleListener* L4SysExperiment::prepareRegisterExperiment(int ip, int offset, int dataAddress) { - fail::BPSingleListener *bp = new BPSingleListener(0, L4SYS_ADDRESS_SPACE_TRACE); + fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); int reg, regOffset; reg = ((dataAddress >> 4) & 0xF) + 1; // regs start at 1 @@ -571,7 +571,7 @@ L4SysExperiment::prepareRegisterExperiment(int ip, int offset, int dataAddress) << regOffset << ")" << std::endl; #if L4SYS_FILTER_INSTRUCTIONS - setupFilteredBreakpoint(bp, offset); + setupFilteredBreakpoint(bp, offset, conf.instruction_list); log << bp->getWatchInstructionPointer() << std::endl; log << ip << std::endl; assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); @@ -618,38 +618,13 @@ void L4SysExperiment::doRegisterInjection(int regDesc, int bit) << newdata << std::endl; } - -bool L4SysExperiment::run() -{ - BPSingleListener *bp = 0; - srand(time(NULL)); - - log << "Starting L4Sys Experiment, phase " << PREPARATION_STEP << endl; - -#if PREPARATION_STEP == 1 - // STEP 1: run until interesting function starts, and save state - // -> needs L4SYS_ADDRESS_SPACE, because it runs until L4SYS_FUNC_ENTRY - startAndSaveInitState(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); -#elif PREPARATION_STEP == 2 - // STEP 2: determine instructions executed - collectInstructionTrace(new BPSingleListener(0, ANY_ADDR)); - -#elif PREPARATION_STEP == 3 - // STEP 3: determine the output of a "golden run" - // -> golden run needs L4SYS_ADDRESS_SPACE as it breaks on - // L4SYS_FUNC_EXIT - goldenRun(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); - -#elif PREPARATION_STEP == 4 - CR3run(new BPSingleListener(0)); - -#elif PREPARATION_STEP == 0 +void L4SysExperiment::doExperiments(fail::BPSingleListener* bp) { // LAST STEP: The actual experiment. - validatePrerequisites(); + validatePrerequisites(conf.state_folder, conf.golden_run); // Read the golden run output for validation purposes std::string golden_run; - readGoldenRun(golden_run); + readGoldenRun(golden_run, conf.golden_run); getJobParameters(); @@ -680,7 +655,7 @@ bool L4SysExperiment::run() simulator.clearListeners(); log << "Bit " << bit << ", restoring state." << endl; - simulator.restore(L4SYS_STATE_FOLDER); + simulator.restore(conf.state_folder.c_str()); log << " ... EIP = " << std::hex << simulator.getCPU(0).getInstructionPointer() << std::endl; simulator.addListener(bp); @@ -717,23 +692,23 @@ bool L4SysExperiment::run() log << "doing nothing for experiment type " << exp_type << std::endl; } - BPSingleListener ev_done(L4SYS_FUNC_EXIT, L4SYS_ADDRESS_SPACE); + BPSingleListener ev_done(conf.func_exit, conf.address_space); simulator.addListener(&ev_done); // Well-known bailout point -- if we hit L4SYS_BREAK_BLINK, which // is the entry of Vga::blink_cursor(), we know that we are in some // kind of error handler - BPSingleListener ev_blink(L4SYS_BREAK_BLINK); + BPSingleListener ev_blink(conf.break_blink); simulator.addListener(&ev_blink); - BPSingleListener ev_longjmp(L4SYS_BREAK_LONGJMP); + BPSingleListener ev_longjmp(conf.break_longjmp); simulator.addListener(&ev_longjmp); //If we come to our own exit function, we can stop - BPSingleListener ev_exit(L4SYS_BREAK_EXIT); + BPSingleListener ev_exit(conf.break_exit); simulator.addListener(&ev_exit); - unsigned instr_left = L4SYS_TOTINSTR - instr_offset; // XXX offset is in NUMINSTR, TOTINSTR is higher - BPSingleListener ev_incomplete(ANY_ADDR, L4SYS_ADDRESS_SPACE); + unsigned instr_left = conf.totinstr - instr_offset; // XXX offset is in NUMINSTR, TOTINSTR is higher + BPSingleListener ev_incomplete(ANY_ADDR, conf.address_space); /* * Use hard-coded value for incomplete counter. We are currently looking at short-running pieces * of code. This means that in the error case, where a lot of data is still to be printed to serial @@ -746,7 +721,7 @@ bool L4SysExperiment::run() /* * This timeout will always be at least one second - see calculateTimeout() */ - TimerListener ev_timeout(calculateTimeout(instr_left)); + TimerListener ev_timeout(calculateTimeout(instr_left, conf.emul_ips)); simulator.addListener(&ev_timeout); log << "continue... (" << simulator.getListenerCount() << " breakpoints, timeout @ " << ev_timeout.getTimeout() @@ -797,10 +772,266 @@ bool L4SysExperiment::run() } m_jc.sendResult(*param); +} -#endif - terminate(0); + +void L4SysExperiment::parseOptions(L4SysConfig &conf) { + CommandLine &cmd = CommandLine::Inst(); + + cmd.addOption("", "", Arg::None, "USAGE: fail-client -Wf,[option] -Wf,[option] ... "); + CommandLine::option_handle HELP = + cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit"); + CommandLine::option_handle STEP = + cmd.addOption("s", "step", Arg::Optional, "-s,--step \tSpecify preparation step, without this argumnt fail-client start in experiment mode (cr3: get CR3, cc: Create Checkpoint, it: collect instruction trace, gr: golden run, all: do the whole preparation)"); + + + CommandLine::option_handle OPT_MAX_INSTR_BYTES = + cmd.addOption("", "max_instr_bytes", Arg::Optional, "--max_instr_bytes \t define MAX_INSTR_BYTES"); + CommandLine::option_handle OPT_ADDRESS_SPACE = + cmd.addOption("", "address_space", Arg::Optional, "--address_space \t define L4SYS_ADDRESS_SPACE"); + CommandLine::option_handle OPT_ADDRESS_SPACE_TRACE = + cmd.addOption("", "address_space_trace", Arg::Optional, "--address_space_trace \t define L4SYS_ADDRESS_SPACE_TRACE"); + CommandLine::option_handle OPT_FUNC_ENTRY = + cmd.addOption("", "func_entry", Arg::Optional, "--func_entry \t define L4SYS_FUNC_ENTRY"); + CommandLine::option_handle OPT_FUNC_EXIT = + cmd.addOption("", "func_exit", Arg::Optional, "--func_exit \t define L4SYS_FUNC_EXIT"); + CommandLine::option_handle OPT_FILTER_ENTRY = + cmd.addOption("", "filter_entry", Arg::Optional, "--filter_entry \t define L4SYS_FILTER_ENTRY"); + CommandLine::option_handle OPT_FILTER_EXIT = + cmd.addOption("", "filter_exit", Arg::Optional, "--filter_exit \t define L4SYS_FILTER_EXIT"); + CommandLine::option_handle OPT_BREAK_BLINK = + cmd.addOption("", "break_blink", Arg::Optional, "--break_blink \t define L4SYS_BREAK_BLINK"); + CommandLine::option_handle OPT_BREAK_LONGJMP = + cmd.addOption("", "break_longjmp", Arg::Optional, "--break_longjmp \t define L4SYS_BREAK_LONGJMP"); + CommandLine::option_handle OPT_BREAK_EXIT = + cmd.addOption("", "break_exit", Arg::Optional, "--break_exit \t define L4SYS_BREAK_EXIT"); + CommandLine::option_handle OPT_FILTER_INSTRUCTIONS = + cmd.addOption("", "filter_instructions", Arg::Optional, "--filter_instructions \t define L4SYS_FILTER_INSTRUCTIONS"); + CommandLine::option_handle OPT_NUMINSTR = + cmd.addOption("", "numinstr", Arg::Optional, "--numinstr \t define L4SYS_NUMINSTR"); + CommandLine::option_handle OPT_TOTINSTR = + cmd.addOption("", "totinstr", Arg::Optional, "--totinstr \t define L4SYS_TOTINSTR"); + CommandLine::option_handle OPT_EMUL_IPS = + cmd.addOption("", "bochs_ips", Arg::Optional, "--bochs_ips \t define L4SYS_BOCHS_IPS"); + CommandLine::option_handle OPT_STATE_FOLDER = + cmd.addOption("", "state_folder", Arg::Optional, "--state_folder \t define L4SYS_STATE_FOLDER"); + CommandLine::option_handle OPT_INSTRUCTION_LIST = + cmd.addOption("", "instruction_list", Arg::Optional, "--instruction_list \t define L4SYS_INSTRUCTION_LIST"); + CommandLine::option_handle OPT_ALU_INSTRUCTIONS = + cmd.addOption("", "alu_instructions", Arg::Optional, "--alu_instructions \t define L4SYS_ALU_INSTRUCTIONS"); + CommandLine::option_handle OPT_CORRECT_OUTPUT = + cmd.addOption("", "golden_run", Arg::Optional, "--correct_output \t define L4SYS_CORRECT_OUTPUT"); + CommandLine::option_handle OPT_FILTER = + cmd.addOption("", "filter", Arg::Optional, "--filter \t define L4SYS_FILTER"); + CommandLine::option_handle OPT_TRACE = + cmd.addOption("", "trace", Arg::Optional, "--trace \t define outputfile for trace (default trace.pb)"); + + if (!cmd.parse()) { + cerr << "Error parsing arguments." << endl; + simulator.terminate(1); + } else if (cmd[HELP]) { + cmd.printUsage(); + simulator.terminate(0); + } + + if (cmd[OPT_MAX_INSTR_BYTES]) { + conf.max_instr_bytes = strtol(cmd[OPT_MAX_INSTR_BYTES].arg, NULL, 16); + } else { + conf.max_instr_bytes = MAX_INSTR_BYTES; + } + + if (cmd[OPT_ADDRESS_SPACE]) { + conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); + } else { + conf.address_space = L4SYS_ADDRESS_SPACE; + } + + if (cmd[OPT_ADDRESS_SPACE_TRACE]) { + conf.address_space_trace = strtol(cmd[OPT_ADDRESS_SPACE_TRACE].arg, NULL, 16); + } else { + conf.address_space_trace = L4SYS_ADDRESS_SPACE_TRACE; + } + + if (cmd[OPT_FUNC_ENTRY]) { + conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); + } else { + conf.func_entry = L4SYS_FUNC_ENTRY; + } + + if (cmd[OPT_FUNC_EXIT]) { + conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); + } else { + conf.func_exit = L4SYS_FUNC_EXIT; + } + + if (cmd[OPT_FILTER_ENTRY]) { + conf.filter_entry = strtol(cmd[OPT_FILTER_ENTRY].arg, NULL, 16); + } else { + conf.filter_entry = L4SYS_FILTER_ENTRY; + } + + if (cmd[OPT_FILTER_EXIT]) { + conf.filter_exit = strtol(cmd[OPT_FILTER_EXIT].arg, NULL, 16); + } else { + conf.filter_exit = L4SYS_FILTER_EXIT; + } + + if (cmd[OPT_BREAK_BLINK]) { + conf.break_blink = strtol(cmd[OPT_BREAK_BLINK].arg, NULL, 16); + } else { + conf.break_blink = L4SYS_BREAK_BLINK; + } + + if (cmd[OPT_BREAK_LONGJMP]) { + conf.break_longjmp = strtol(cmd[OPT_BREAK_LONGJMP].arg, NULL, 16); + } else { + conf.break_longjmp = L4SYS_BREAK_LONGJMP; + } + + if (cmd[OPT_BREAK_EXIT]) { + conf.break_exit = strtol(cmd[OPT_BREAK_EXIT].arg, NULL, 16); + } else { + conf.break_exit = L4SYS_BREAK_EXIT; + } + + if (cmd[OPT_FILTER_INSTRUCTIONS]) { + conf.filter_instructions = strtol(cmd[OPT_FILTER_INSTRUCTIONS].arg, NULL, 16); + } else { + conf.filter_instructions = L4SYS_FILTER_INSTRUCTIONS; + } + + if (cmd[OPT_NUMINSTR]) { + conf.numinstr = strtol(cmd[OPT_NUMINSTR].arg, NULL, 16); + } else { + conf.numinstr = L4SYS_NUMINSTR; + } + + if (cmd[OPT_TOTINSTR]) { + conf.totinstr = strtol(cmd[OPT_TOTINSTR].arg, NULL, 16); + } else { + conf.totinstr = L4SYS_TOTINSTR; + } + + if (cmd[OPT_EMUL_IPS]) { + conf.emul_ips = strtol(cmd[OPT_EMUL_IPS].arg, NULL, 16); + } else { + conf.emul_ips = L4SYS_BOCHS_IPS; + } + + if (cmd[OPT_STATE_FOLDER]) { + conf.state_folder = std::string(cmd[OPT_STATE_FOLDER].arg); + } else { + conf.state_folder = L4SYS_STATE_FOLDER; + } + + if (cmd[OPT_INSTRUCTION_LIST]) { + conf.instruction_list = std::string(cmd[OPT_INSTRUCTION_LIST].arg); + } else { + conf.instruction_list = L4SYS_INSTRUCTION_LIST; + } + + if (cmd[OPT_ALU_INSTRUCTIONS]) { + conf.alu_instructions = std::string(cmd[OPT_ALU_INSTRUCTIONS].arg); + } else { + conf.alu_instructions = L4SYS_ALU_INSTRUCTIONS; + } + + if (cmd[OPT_CORRECT_OUTPUT]) { + conf.golden_run = std::string(cmd[OPT_CORRECT_OUTPUT].arg); + } else { + conf.golden_run = L4SYS_CORRECT_OUTPUT; + } + + if (cmd[OPT_FILTER]) { + conf.filter = std::string(cmd[OPT_FILTER].arg); + } else { + conf.filter = L4SYS_FILTER; + } + + if (cmd[OPT_TRACE]) { + conf.trace = std::string(cmd[OPT_TRACE].arg); + } else { + conf.trace = std::string("trace.pb"); + } + + if (cmd[STEP]) { + if (!std::string("cr3").compare(cmd[STEP].arg) ) { + log << "calculate cr3" << endl; + conf.step = L4SysConfig::GET_CR3; + } else if (!std::string("cc").compare(cmd[STEP].arg) ) { + log << "Create Checkpoint" << endl; + conf.step = L4SysConfig::CREATE_CHECKPOINT; + } else if (!std::string("it").compare(cmd[STEP].arg) ) { + log << "collect instruction trace" << endl; + conf.step = L4SysConfig::COLLECT_INSTR_TRACE; + } else if (!std::string("gr").compare(cmd[STEP].arg) ) { + log << "golden run" << endl; + conf.step = L4SysConfig::GOLDEN_RUN; + } else if (!std::string("all").compare(cmd[STEP].arg) ) { + log << "do all preparation steps" << endl; + conf.step = L4SysConfig::FULL_PREPARATION; + } else { + cerr << "Wrong argument for option '--step'" << endl; + simulator.terminate(1); + } + } else { + conf.step = L4SysConfig::NO_PREP; + } + +} + +bool L4SysExperiment::run() +{ + srand(time(NULL)); + + log << "Starting L4Sys Experiment, phase " << PREPARATION_STEP << endl; + + parseOptions(conf); + + switch(conf.step) { + case L4SysConfig::GET_CR3: { + log << "CR_3Run: Watching for instruction " << hex << conf.func_entry << endl; + runToStart(new BPSingleListener(0)); + log << "CR3 = " << hex << conf.address_space << endl; + break; + } + case L4SysConfig::CREATE_CHECKPOINT: { + // STEP 1: run until interesting function starts, and save state + // -> needs L4SYS_ADDRESS_SPACE, because it runs until L4SYS_FUNC_ENTRY + runToStart(new BPSingleListener(0, conf.address_space)); + simulator.save(conf.state_folder); + break; + } + case L4SysConfig::COLLECT_INSTR_TRACE: { + // STEP 2: determine instructions executed + collectInstructionTrace(new BPSingleListener(0, ANY_ADDR)); + break; + } + case L4SysConfig::GOLDEN_RUN: { + // STEP 3: determine the output of a "golden run" + // -> golden run needs L4SYS_ADDRESS_SPACE as it breaks on + // L4SYS_FUNC_EXIT + goldenRun(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); + break; + } + case L4SysConfig::FULL_PREPARATION: { + runToStart(new BPSingleListener(0)); + simulator.save(conf.state_folder); + simulator.clearListeners(); + collectInstructionTrace(new BPSingleListener(0, ANY_ADDR)); + simulator.clearListeners(); + goldenRun(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); + break; + } + default: { + BPSingleListener *bp = 0; + doExperiments(bp); + } + } + + + terminate(0); // experiment successfully conducted return true; } diff --git a/src/experiments/l4-sys/experiment.hpp b/src/experiments/l4-sys/experiment.hpp index 091f6451..34afc43c 100644 --- a/src/experiments/l4-sys/experiment.hpp +++ b/src/experiments/l4-sys/experiment.hpp @@ -28,6 +28,7 @@ typedef struct TraceInstrType { class L4SysExperiment : public fail::ExperimentFlow { private: + class L4SysConfig; fail::JobClient m_jc; //!< the job client connecting to the campaign server fail::Logger log; // Date: Fri, 13 Jun 2014 21:08:36 +0200 Subject: [PATCH 05/12] Code Restructuring. --- src/experiments/l4-sys/CMakeLists.txt | 3 + src/experiments/l4-sys/experiment.cc | 947 +----------------- src/experiments/l4-sys/experimentFI.cc | 471 +++++++++ src/experiments/l4-sys/experimentInfo.hpp | 10 +- src/experiments/l4-sys/experimentParameter.cc | 213 ++++ .../l4-sys/experimentPreparation.cc | 286 ++++++ 6 files changed, 980 insertions(+), 950 deletions(-) create mode 100644 src/experiments/l4-sys/experimentFI.cc create mode 100644 src/experiments/l4-sys/experimentParameter.cc create mode 100644 src/experiments/l4-sys/experimentPreparation.cc diff --git a/src/experiments/l4-sys/CMakeLists.txt b/src/experiments/l4-sys/CMakeLists.txt index 8bccf74f..e7df8dfa 100644 --- a/src/experiments/l4-sys/CMakeLists.txt +++ b/src/experiments/l4-sys/CMakeLists.txt @@ -14,6 +14,9 @@ set(MY_CAMPAIGN_SRCS aluinstr.cc experiment.hpp experiment.cc + experimentFI.cc + experimentParameter.cc + experimentPreparation.cc campaign.hpp campaign.cc UDIS86.hpp diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 01c3daaa..9a18d830 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -1,29 +1,10 @@ #include -#include -#include -#include -#include -#include -#include -#include #include "experiment.hpp" -#include "experimentInfo.hpp" -#include "UDIS86.hpp" -#include "InstructionFilter.hpp" -#include "aluinstr.hpp" #include "campaign.hpp" #include "sal/SALConfig.hpp" -#include "sal/SALInst.hpp" -#include "sal/Memory.hpp" -#include "sal/Listener.hpp" -#include #include "config/FailConfig.hpp" -#include "TracePlugin.pb.h" -#include "util/ProtoStream.hpp" -#include "util/gzstream/gzstream.h" -#include "util/CommandLine.hpp" using namespace std; using namespace fail; @@ -37,67 +18,6 @@ using namespace fail; save, and restore. Enable these in the configuration. #endif -string L4SysExperiment::sanitised(const string &in_str) { - string result; - int in_str_size = in_str.size(); - result.reserve(in_str_size); - for (int idx = 0; idx < in_str_size; idx++) { - char cur_char = in_str[idx]; - unsigned cur_char_value = static_cast(cur_char); - // also exclude the delimiter (',') - if (cur_char_value < 0x20 || cur_char_value > 0x7E || cur_char_value == ',') { - char str_nr[5]; - sprintf(str_nr, "\\%03o", cur_char_value); - result += str_nr; - } else { - result += cur_char; - } - } - return result; -} - -BaseListener* L4SysExperiment::waitIOOrOther(bool clear_output) { - IOPortListener ev_ioport(0x3F8, true); - BaseListener* ev = NULL; - if (clear_output) - currentOutput.clear(); - while (true) { - simulator.addListener(&ev_ioport); - ev = simulator.resume(); - //log << "hello " << simulator.getListenerCount() << std::endl; - //simulator.removeListener(&ev_ioport); - if (ev == &ev_ioport) { - currentOutput += ev_ioport.getData(); - //log << currentOutput << std::endl; - } else { - break; - } - } - return ev; -} - -Bit32u L4SysExperiment::eipBiased() { - BX_CPU_C *cpu_context = simulator.getCPUContext(); - Bit32u EIP = cpu_context->gen_reg[BX_32BIT_REG_EIP].dword.erx; - return EIP + cpu_context->eipPageBias; -} - -const Bit8u *L4SysExperiment::calculateInstructionAddress() { - // pasted in from various nested Bochs functions and macros - I hope - // they will not change too soon (as do the Bochs developers, probably) - BX_CPU_C *cpu_context = simulator.getCPUContext(); - const Bit8u *result = cpu_context->eipFetchPtr + eipBiased(); - return result; -} - -unsigned L4SysExperiment::calculateTimeout(unsigned instr_left, unsigned ips) { - // the timeout in seconds, plus one backup second (avoids rounding overhead) - // [instr] / [instr / s] = [s] - unsigned seconds = instr_left / ips + 1; - // 1.1 (+10 percent) * 1000000 mus/s * [s] - return 1100000 * seconds; -} - L4SysExperiment::L4SysExperiment() : m_jc("localhost"), log("L4Sys", false) { @@ -118,875 +38,12 @@ void L4SysExperiment::terminate(int reason) { simulator.terminate(reason); } -void L4SysExperiment::terminateWithError(string details, int reason, - L4SysProtoMsg_Result *r = 0) { - L4SysProtoMsg_Result *result; - - if (r) - result = r; - else - result = param->msg.add_result(); - result->set_resulttype(param->msg.UNKNOWN); - result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); - result->set_output(sanitised(currentOutput.c_str())); - result->set_details(details); - - m_jc.sendResult(*param); - terminate(reason); -} - - -void L4SysExperiment::runToStart(fail::BPSingleListener *bp) -{ - bp->setWatchInstructionPointer(conf.func_entry); - - log << "run until ip reaches 0x" << hex << conf.func_entry << endl; - - simulator.addListenerAndResume(bp); - - log << "test function entry reached, saving state" << endl; - log << "EIP: expected " << hex << bp->getTriggerInstructionPointer() - << " and actually got " - << simulator.getCPU(0).getInstructionPointer() - << endl; - log << "check the source code if the two instruction pointers are not equal" << endl; - - if(conf.address_space == conf.address_space_trace) { - conf.address_space_trace = BX_CPU(0)->cr3; - } - - conf.address_space = BX_CPU(0)->cr3; -} - - - -BaseListener* L4SysExperiment::afterInjection(L4SysProtoMsg_Result* res) -{ - BaseListener *bl = 0; - - simtime_t t_inject = simulator.getTimerTicks(); - simtime_t t_bailout; - - ifstream instr_list_file(conf.instruction_list.c_str(), ios::binary); - instr_list_file.seekg((1 + res->instr_offset()) * sizeof(TraceInstr)); - - RangeSetInstructionFilter filtering(conf.filter.c_str()); - - for (;;) { - // Step over _all_ instructions in the trace AS - BPSingleListener stepListener(ANY_ADDR, conf.address_space_trace); - - TraceInstr curr_instr; - instr_list_file.read(reinterpret_cast(&curr_instr), - sizeof(TraceInstr)); - - t_bailout = simulator.getTimerTicks(); - - // step until next traced instruction - simulator.addListener(&stepListener); - bl = waitIOOrOther(false); - - // bail out if we hit a listener other than the single step - // one -> in this case the experiment is over prematurely - if (bl != &stepListener) { - // Note, the difference in this case is the diff between the - // last correct instruction and the starting point -> this is - // useful for TIMEOUT events where the actual time now would be - // the complete TIMEOUT whereas we are interested in the time - // until execution deviates from the original trace - res->set_deviate_steps(t_bailout - t_inject); - res->set_deviate_eip(-1); - log << "bailing out of single-stepping mode" << endl; - break; - } - - address_t eip = stepListener.getTriggerInstructionPointer(); - - if (!filtering.isValidInstr(eip)) - continue; - - if (eip != curr_instr.trigger_addr) { - // In the case where we see an actual instruction stream deviation, we - // want the real diff between NOW and the injection start point - t_bailout = simulator.getTimerTicks(); - log << "got " << hex << eip << " expected " - << curr_instr.trigger_addr << endl; - - log << "mismatch found after " << (t_bailout - t_inject) << " instructions." << endl; - res->set_deviate_steps(t_bailout - t_inject); - res->set_deviate_eip(eip); - - return waitIOOrOther(false); - } - } - - log << "left single-stepping mode after " << (t_bailout - t_inject) - << " instructions." << endl; - return bl; -} - -void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) -{ - fail::MemAccessListener ML(ANY_ADDR, MemAccessEvent::MEM_READWRITE); - ogzstream out(conf.trace.c_str()); - ProtoOStream *os = new ProtoOStream(&out); - - size_t count = 0, inst_accepted = 0, mem = 0, mem_valid = 0; - simtime_t prevtime = 0, currtime; - simtime_diff_t deltatime; - - log << "restoring state" << endl; - simulator.restore(conf.state_folder.c_str()); - currtime = simulator.getTimerTicks(); - - log << "EIP = " << hex - << simulator.getCPU(0).getInstructionPointer() - << endl; - - if (!simulator.addListener(&ML)) { - log << "did not add memory listener..." << std::endl; - exit(1); - } - if (!simulator.addListener(bp)) { - log << "did not add breakpoint listener..." << std::endl; - exit(1); - } - -#if L4SYS_FILTER_INSTRUCTIONS - ofstream instr_list_file(conf.instruction_list.c_str(), ios::binary); - RangeSetInstructionFilter filtering(conf.filter.c_str()); - bp->setWatchInstructionPointer(ANY_ADDR); - - map times_called_map; - bool injecting = false; - - while (bp->getTriggerInstructionPointer() != conf.func_exit) { - fail::BaseListener *res = simulator.resume(); - address_t curr_addr = 0; - - // XXX: See the API problem below! - if (res == &ML) { - curr_addr = ML.getTriggerInstructionPointer(); - simulator.addListener(&ML); - if ((conf.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != conf.address_space_trace)) { - continue; - } - ++mem; - } else if (res == bp) { - curr_addr = bp->getTriggerInstructionPointer(); - assert(curr_addr == simulator.getCPU(0).getInstructionPointer()); - simulator.addListener(bp); - ++count; - } - - currtime = simulator.getTimerTicks(); - deltatime = currtime - prevtime; - - if (curr_addr == conf.filter_entry) { - injecting = true; - } - - if (curr_addr == conf.filter_exit) { - injecting = false; - } - - // Only trace if: - // 1) we are between FILTER_ENTRY and FILTER_EXIT, and - // 2) we have a valid instruction according to filter rules, and - // 3) we are in the TRACE address space - if (!injecting or - !filtering.isValidInstr(curr_addr, reinterpret_cast(calculateInstructionAddress())) - or - (BX_CPU(0)->cr3 != conf.address_space_trace) - ) { - //log << "connt..." << std::endl; - continue; - } - - if (res == &ML) { -#if 0 - log << "Memory event IP " << std::hex << ML.getTriggerInstructionPointer() - << " @ " << ML.getTriggerAddress() << "(" - << ML.getTriggerAccessType() << "," << ML.getTriggerWidth() - << ")" << std::endl; -#endif - ++mem_valid; - - Trace_Event te; - if (deltatime != 0) { te.set_time_delta(1); }; - te.set_ip(curr_addr); - te.set_memaddr(ML.getTriggerAddress()); - te.set_accesstype( (ML.getTriggerAccessType() & MemAccessEvent::MEM_READ) ? te.READ : te.WRITE ); - te.set_width(ML.getTriggerWidth()); - os->writeMessage(&te); - } else if (res == bp) { - unsigned times_called = times_called_map[curr_addr]; - ++times_called; - times_called_map[curr_addr] = times_called; - - //log << "breakpoint event" << std::endl; - // now check if we want to add the instruction for fault injection - ++inst_accepted; - - // 1) The 'old' way of logging instructions -> DEPRECATE soon - // BUT: we are currently using the bp_counter stored in this - // file! - TraceInstr new_instr; - //log << "writing IP " << hex << curr_addr << " counter " - // << dec << times_called << "(" << hex << BX_CPU(0)->cr3 << ")" - // << endl; - new_instr.trigger_addr = curr_addr; - new_instr.bp_counter = times_called; - - instr_list_file.write(reinterpret_cast(&new_instr), sizeof(TraceInstr)); - - // 2) The 'new' way -> generate Events that can be processed by - // the generic *-trace tools - // XXX: need to log CR3 if we want multiple binaries here - Trace_Event e; - if (deltatime != 0) { e.set_time_delta(1); }; - e.set_ip(curr_addr); - os->writeMessage(&e); - } else { - printf("Unknown res? %p\n", res); - } - prevtime = currtime; - - //short sanity check - //log << "continue..." << std::endl; - } - log << "saving instructions triggered during normal execution" << endl; - instr_list_file.close(); - log << "test function calculation position reached after " - << dec << count << " instructions; " << inst_accepted << " accepted" << endl; - log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; -#else - bp->setWatchInstructionPointer(ANY_ADDR); - while (bp->getTriggerInstructionPointer() != conf.func_exit) - { - fail::BaseListener *res = simulator.resume(); - address_t curr_addr = 0; - - // XXX: See the API problem below! - if (res == &ML) { - curr_addr = ML.getTriggerInstructionPointer(); - simulator.addListener(&ML); - if ((func.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != func.address_space_trace)) { - continue; - } - ++mem; - } else if (res == bp) { - curr_addr = bp->getTriggerInstructionPointer(); - assert(curr_addr == simulator.getCPU(0).getInstructionPointer()); - simulator.addListener(bp); - ++count; - } -#if 0 - if (curr_addr < 0xC0000000) // XXX filter for kernel-only experiment - continue; -#endif - currtime = simulator.getTimerTicks(); - deltatime = currtime - prevtime; - - if (res == &ML) { -#if 0 - log << "Memory event IP " << std::hex << ML.getTriggerInstructionPointer() - << " @ " << ML.getTriggerAddress() << "(" - << ML.getTriggerAccessType() << "," << ML.getTriggerWidth() - << ")" << std::endl; -#endif - ++mem_valid; - - Trace_Event te; - if (deltatime != 0) { te.set_time_delta(deltatime); }; - te.set_ip(curr_addr); - te.set_memaddr(ML.getTriggerAddress()); - te.set_accesstype( (ML.getTriggerAccessType() & MemAccessEvent::MEM_READ) ? te.READ : te.WRITE ); - te.set_width(ML.getTriggerWidth()); - os->writeMessage(&te); - } else if (res == bp) { - Trace_Event e; - if (deltatime != 0) { e.set_time_delta(deltatime); }; - e.set_ip(curr_addr); - os->writeMessage(&e); - } else { - printf("Unknown res? %p\n", res); - } - prevtime = currtime; - } - log << "test function calculation position reached after " - << dec << count << " instructions; " << count << " accepted" << endl; - log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; -#endif - conf.numinstr = inst_accepted; - conf.totinstr = count; - delete bp; -} - -void L4SysExperiment::goldenRun(fail::BPSingleListener* bp) -{ - log << "restoring state" << endl; - simulator.restore(conf.state_folder.c_str()); - log << "EIP = " << hex - << simulator.getCPU(0).getInstructionPointer() - << endl; - - std::string golden_run; - ofstream golden_run_file(conf.golden_run.c_str()); - bp->setWatchInstructionPointer(conf.func_exit); - simulator.addListener(bp); - BaseListener* ev = waitIOOrOther(true); - if (ev == bp) { - golden_run.assign(currentOutput.c_str()); - golden_run_file << currentOutput.c_str(); - log << "Output successfully logged!" << endl; - } else { - log - << "Obviously, there is some trouble with" - << " the events registered - aborting simulation!" - << endl; - golden_run_file.close(); - terminate(10); - } - - log << "saving output generated during normal execution" << endl; - golden_run_file.close(); - delete bp; -} - - -void L4SysExperiment::getJobParameters() -{ - // get the experiment parameters - log << "asking job server for experiment parameters" << endl; - if (!m_jc.getParam(*param)) { - log << "Dying." << endl; - // communicate that we were told to die - terminate(1); - } -} - - -void L4SysExperiment::validatePrerequisites(std::string state, std::string output) -{ - struct stat teststruct; - if (stat(state.c_str(), &teststruct) == -1 || - stat(output.c_str(), &teststruct) == -1) { - log << "Important data missing - call \"prepare\" first." << endl; - terminate(10); - } -} - - -void L4SysExperiment::readGoldenRun(std::string& target, std::string golden_run) -{ - ifstream golden_run_file(golden_run.c_str()); - - if (!golden_run_file.good()) { - log << "Could not open file " << golden_run.c_str() << endl; - terminate(20); - } - - target.assign((istreambuf_iterator(golden_run_file)), - istreambuf_iterator()); - - golden_run_file.close(); -} - - -void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset, std::string instr_list) -{ - /* - * The L4Sys experiment uses instruction filtering to restrict the range - * of fault injection to only e.g., kernel instructions. - * - * To speed up injection, L4Sys furthermore does not use per-instruction - * breakpoints but only places a breakpoint on the actually interesting - * instruction (e.g., the injection EIP). Hence, we also do not count - * instructions from the beginning of the experiment, but we count how - * often a certain EIP was hit before the injection. - * - * To achieve these properties, we use an additional trace file that - * provides us with a 'hit counter' of each injection candidate. We use - * the global instruction ID (DataBaseCampaign: instruction_offset) to - * index into this trace file and determine the value for the breakpoint - * counter. - */ - ifstream instr_list_file(instr_list.c_str(), ios::binary); - - if (!instr_list_file.good()) { - log << "Missing instruction trace" << endl; - terminate(21); - } - - log << "inst offset " << dec << instOffset << " sizeof(TraceInstr) " << sizeof(TraceInstr) << endl; - TraceInstr curr_instr; - instr_list_file.seekg(instOffset * sizeof(TraceInstr)); - log << instr_list_file.eof() << " " << instr_list_file.bad() << " " - << instr_list_file.fail() << endl; - if (instr_list_file.eof()) { - log << "Job parameters indicate position outside the traced instruction list." << endl; - terminate(1); - } - instr_list_file.read(reinterpret_cast(&curr_instr), sizeof(TraceInstr)); - instr_list_file.close(); - - log << "setting watchpoint at " << hex << curr_instr.trigger_addr << endl; - bp->setWatchInstructionPointer(curr_instr.trigger_addr); - log << "setting bp counter " << hex << curr_instr.bp_counter << endl; - bp->setCounter(curr_instr.bp_counter); -} - - -fail::BPSingleListener* -L4SysExperiment::prepareMemoryExperiment(int ip, int offset, int dataAddress) -{ - fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); - log << "\033[34;1mMemory fault injection\033[0m at instruction " << std::hex << offset - << ", ip " << ip << ", address " << dataAddress << std::endl; - -#if L4SYS_FILTER_INSTRUCTIONS - setupFilteredBreakpoint(bp, offset, conf.instruction_list); - assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); -#else - bp->setWatchInstructionPointer(ANY_ADDR); - bp->setCounter(offset); -#endif - return bp; -} - - -fail::BPSingleListener* -L4SysExperiment::prepareRegisterExperiment(int ip, int offset, int dataAddress) -{ - fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); - - int reg, regOffset; - reg = ((dataAddress >> 4) & 0xF) + 1; // regs start at 1 - regOffset = dataAddress & 0xF; - - log << "\033[32;1mGPR bitflip\033[0m at instr. offset " << offset - << " reg data (" << reg << ", " - << regOffset << ")" << std::endl; - -#if L4SYS_FILTER_INSTRUCTIONS - setupFilteredBreakpoint(bp, offset, conf.instruction_list); - log << bp->getWatchInstructionPointer() << std::endl; - log << ip << std::endl; - assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); - log << bp->getCounter() << std::endl; -#else - log << "Exp offset: " << offset << std::endl; - bp->setWatchInstructionPointer(ANY_ADDR); - bp->setCounter(offset); -#endif - return bp; -} - - -bool L4SysExperiment::doMemoryInjection(int address, int bit) -{ - MemoryManager& mm = simulator.getMemoryManager(); - - // XXX: evil, but I need to bail out if memory access is invalid - host_address_t addr = reinterpret_cast(&mm)->guestToHost(address); - if (addr == (host_address_t)ADDR_INV) - return false; - - byte_t data = mm.getByte(address); - byte_t newdata = data ^ (1 << bit); - mm.setByte(address, newdata); - log << "[" << std::hex << address << "] " << (int)data - << " -> " << (int)newdata << std::endl; - return true; -} - - -void L4SysExperiment::doRegisterInjection(int regDesc, int bit) -{ - int reg, offset; - reg = (regDesc >> 4) + 1; // regs start at 1 - offset = regDesc & 0xF; - - ConcreteCPU& cpu = simulator.getCPU(0); - Register *reg_target = cpu.getRegister(reg - 1); - regdata_t data = cpu.getRegisterContent(reg_target); - regdata_t newdata = data ^ (1 << (bit + 8 * offset)); - cpu.setRegisterContent(reg_target, newdata); - log << "Reg[" << reg << "]: " << std::hex << data << " -> " - << newdata << std::endl; -} - -void L4SysExperiment::doExperiments(fail::BPSingleListener* bp) { - // LAST STEP: The actual experiment. - validatePrerequisites(conf.state_folder, conf.golden_run); - - // Read the golden run output for validation purposes - std::string golden_run; - readGoldenRun(golden_run, conf.golden_run); - - getJobParameters(); - - int exp_type = param->msg.exp_type(); - int instr_offset = param->msg.fsppilot().injection_instr(); - int regData = param->msg.fsppilot().data_address(); - - if (exp_type == param->msg.MEM) { - bp = prepareMemoryExperiment(param->msg.fsppilot().injection_instr_absolute(), - param->msg.fsppilot().injection_instr(), - param->msg.fsppilot().data_address()); - } else if (exp_type == param->msg.GPRFLIP) { - bp = prepareRegisterExperiment(param->msg.fsppilot().injection_instr_absolute(), - param->msg.fsppilot().injection_instr(), - param->msg.fsppilot().data_address()); - } else { - log << "Unsupported experiment type: " << exp_type << std::endl; - terminate(1); - } - - assert(bp); - - for (unsigned bit = 0; bit < 8; ++bit) { - - L4SysProtoMsg_Result *result = param->msg.add_result(); - result->set_instr_offset(instr_offset); - - simulator.clearListeners(); - - log << "Bit " << bit << ", restoring state." << endl; - simulator.restore(conf.state_folder.c_str()); - log << " ... EIP = " << std::hex << simulator.getCPU(0).getInstructionPointer() << std::endl; - - simulator.addListener(bp); - - simtime_t now = simulator.getTimerTicks(); - fail::BaseListener *go = waitIOOrOther(true); - assert(go == bp); - - log << "Hit BP @ " << hex << bp->getTriggerInstructionPointer() << " " << bp->getWatchInstructionPointer() - << " Start time " << now << ", new time " << simulator.getTimerTicks() - << ", diff = " << simulator.getTimerTicks() - now << std::endl; - -#if L4SYS_FILTER_INSTRUCTIONS - assert(bp->getTriggerInstructionPointer() == bp->getWatchInstructionPointer()); -#endif - result->set_injection_ip(bp->getTriggerInstructionPointer()); - - if (exp_type == param->msg.MEM) { - result->set_bit_offset(bit); - log << "injection addr: " - << std::hex << param->msg.fsppilot().data_address() - << std::endl; - result->set_injection_address(param->msg.fsppilot().data_address()); - if (!doMemoryInjection(param->msg.fsppilot().data_address(), bit)) - { - terminateWithError("invalid mem access", 51, result); - } - } else if (exp_type == param->msg.GPRFLIP) { - int reg = (param->msg.fsppilot().data_address() >> 4) + 1; - result->set_register_offset(static_cast(reg)); - result->set_bit_offset(bit + 8 * (param->msg.fsppilot().data_address() & 0xF)); - doRegisterInjection(param->msg.fsppilot().data_address(), bit); - } else { - log << "doing nothing for experiment type " << exp_type << std::endl; - } - - BPSingleListener ev_done(conf.func_exit, conf.address_space); - simulator.addListener(&ev_done); - - // Well-known bailout point -- if we hit L4SYS_BREAK_BLINK, which - // is the entry of Vga::blink_cursor(), we know that we are in some - // kind of error handler - BPSingleListener ev_blink(conf.break_blink); - simulator.addListener(&ev_blink); - BPSingleListener ev_longjmp(conf.break_longjmp); - simulator.addListener(&ev_longjmp); - - //If we come to our own exit function, we can stop - BPSingleListener ev_exit(conf.break_exit); - simulator.addListener(&ev_exit); - - unsigned instr_left = conf.totinstr - instr_offset; // XXX offset is in NUMINSTR, TOTINSTR is higher - BPSingleListener ev_incomplete(ANY_ADDR, conf.address_space); - /* - * Use hard-coded value for incomplete counter. We are currently looking at short-running pieces - * of code. This means that in the error case, where a lot of data is still to be printed to serial - * line, the benchmark does not complete this within * <1.x> cycles. Instead, we use - * a frame large enough to catch some more output even at the end of a run. - */ - ev_incomplete.setCounter(2000000); - simulator.addListener(&ev_incomplete); - - /* - * This timeout will always be at least one second - see calculateTimeout() - */ - TimerListener ev_timeout(calculateTimeout(instr_left, conf.emul_ips)); - simulator.addListener(&ev_timeout); - log << "continue... (" << simulator.getListenerCount() - << " breakpoints, timeout @ " << ev_timeout.getTimeout() - << std::endl; - - log << "TOListener " << (void*)&ev_timeout << " incompListener " - << (void*)&ev_incomplete << endl; - BaseListener *ev = afterInjection(result); - log << "afterInj: res.devstep = " << result->deviate_steps() << endl; - - /* copying a string object that contains control sequences - * unfortunately does not work with the library I am using, - * which is why output is passed on as C string and - * the string compare is done on C strings - */ - if (ev == &ev_done) { - if (strcmp(currentOutput.c_str(), golden_run.c_str()) == 0) { - log << "Result DONE" << endl; - result->set_resulttype(param->msg.DONE); - } else { - log << "Result WRONG" << endl; - result->set_resulttype(param->msg.WRONG); - result->set_output(sanitised(currentOutput.c_str())); - } - } else if ((ev == &ev_incomplete) || - (ev == &ev_blink) || - (ev == &ev_longjmp)) { - log << "Result INCOMPLETE" << endl; - result->set_resulttype(param->msg.INCOMPLETE); - result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); - result->set_output(sanitised(currentOutput.c_str())); - } else if (ev == &ev_timeout) { - log << "Result TIMEOUT" << endl; - result->set_resulttype(param->msg.TIMEOUT); - result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); - result->set_output(sanitised(currentOutput.c_str())); - } else if (ev == &ev_exit) { - log << "Result FAILSTOP" << endl; - result->set_resulttype(param->msg.FAILSTOP); - result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); - result->set_output(sanitised(currentOutput.c_str())); - } else { - log << "Result WTF?" << endl; - stringstream ss; - ss << "eventid " << ev; - terminateWithError(ss.str(), 50); - } - } - - m_jc.sendResult(*param); -} - - - -void L4SysExperiment::parseOptions(L4SysConfig &conf) { - CommandLine &cmd = CommandLine::Inst(); - - cmd.addOption("", "", Arg::None, "USAGE: fail-client -Wf,[option] -Wf,[option] ... "); - CommandLine::option_handle HELP = - cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit"); - CommandLine::option_handle STEP = - cmd.addOption("s", "step", Arg::Optional, "-s,--step \tSpecify preparation step, without this argumnt fail-client start in experiment mode (cr3: get CR3, cc: Create Checkpoint, it: collect instruction trace, gr: golden run, all: do the whole preparation)"); - - - CommandLine::option_handle OPT_MAX_INSTR_BYTES = - cmd.addOption("", "max_instr_bytes", Arg::Optional, "--max_instr_bytes \t define MAX_INSTR_BYTES"); - CommandLine::option_handle OPT_ADDRESS_SPACE = - cmd.addOption("", "address_space", Arg::Optional, "--address_space \t define L4SYS_ADDRESS_SPACE"); - CommandLine::option_handle OPT_ADDRESS_SPACE_TRACE = - cmd.addOption("", "address_space_trace", Arg::Optional, "--address_space_trace \t define L4SYS_ADDRESS_SPACE_TRACE"); - CommandLine::option_handle OPT_FUNC_ENTRY = - cmd.addOption("", "func_entry", Arg::Optional, "--func_entry \t define L4SYS_FUNC_ENTRY"); - CommandLine::option_handle OPT_FUNC_EXIT = - cmd.addOption("", "func_exit", Arg::Optional, "--func_exit \t define L4SYS_FUNC_EXIT"); - CommandLine::option_handle OPT_FILTER_ENTRY = - cmd.addOption("", "filter_entry", Arg::Optional, "--filter_entry \t define L4SYS_FILTER_ENTRY"); - CommandLine::option_handle OPT_FILTER_EXIT = - cmd.addOption("", "filter_exit", Arg::Optional, "--filter_exit \t define L4SYS_FILTER_EXIT"); - CommandLine::option_handle OPT_BREAK_BLINK = - cmd.addOption("", "break_blink", Arg::Optional, "--break_blink \t define L4SYS_BREAK_BLINK"); - CommandLine::option_handle OPT_BREAK_LONGJMP = - cmd.addOption("", "break_longjmp", Arg::Optional, "--break_longjmp \t define L4SYS_BREAK_LONGJMP"); - CommandLine::option_handle OPT_BREAK_EXIT = - cmd.addOption("", "break_exit", Arg::Optional, "--break_exit \t define L4SYS_BREAK_EXIT"); - CommandLine::option_handle OPT_FILTER_INSTRUCTIONS = - cmd.addOption("", "filter_instructions", Arg::Optional, "--filter_instructions \t define L4SYS_FILTER_INSTRUCTIONS"); - CommandLine::option_handle OPT_NUMINSTR = - cmd.addOption("", "numinstr", Arg::Optional, "--numinstr \t define L4SYS_NUMINSTR"); - CommandLine::option_handle OPT_TOTINSTR = - cmd.addOption("", "totinstr", Arg::Optional, "--totinstr \t define L4SYS_TOTINSTR"); - CommandLine::option_handle OPT_EMUL_IPS = - cmd.addOption("", "bochs_ips", Arg::Optional, "--bochs_ips \t define L4SYS_BOCHS_IPS"); - CommandLine::option_handle OPT_STATE_FOLDER = - cmd.addOption("", "state_folder", Arg::Optional, "--state_folder \t define L4SYS_STATE_FOLDER"); - CommandLine::option_handle OPT_INSTRUCTION_LIST = - cmd.addOption("", "instruction_list", Arg::Optional, "--instruction_list \t define L4SYS_INSTRUCTION_LIST"); - CommandLine::option_handle OPT_ALU_INSTRUCTIONS = - cmd.addOption("", "alu_instructions", Arg::Optional, "--alu_instructions \t define L4SYS_ALU_INSTRUCTIONS"); - CommandLine::option_handle OPT_CORRECT_OUTPUT = - cmd.addOption("", "golden_run", Arg::Optional, "--correct_output \t define L4SYS_CORRECT_OUTPUT"); - CommandLine::option_handle OPT_FILTER = - cmd.addOption("", "filter", Arg::Optional, "--filter \t define L4SYS_FILTER"); - CommandLine::option_handle OPT_TRACE = - cmd.addOption("", "trace", Arg::Optional, "--trace \t define outputfile for trace (default trace.pb)"); - - if (!cmd.parse()) { - cerr << "Error parsing arguments." << endl; - simulator.terminate(1); - } else if (cmd[HELP]) { - cmd.printUsage(); - simulator.terminate(0); - } - - if (cmd[OPT_MAX_INSTR_BYTES]) { - conf.max_instr_bytes = strtol(cmd[OPT_MAX_INSTR_BYTES].arg, NULL, 16); - } else { - conf.max_instr_bytes = MAX_INSTR_BYTES; - } - - if (cmd[OPT_ADDRESS_SPACE]) { - conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); - } else { - conf.address_space = L4SYS_ADDRESS_SPACE; - } - - if (cmd[OPT_ADDRESS_SPACE_TRACE]) { - conf.address_space_trace = strtol(cmd[OPT_ADDRESS_SPACE_TRACE].arg, NULL, 16); - } else { - conf.address_space_trace = L4SYS_ADDRESS_SPACE_TRACE; - } - - if (cmd[OPT_FUNC_ENTRY]) { - conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); - } else { - conf.func_entry = L4SYS_FUNC_ENTRY; - } - - if (cmd[OPT_FUNC_EXIT]) { - conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); - } else { - conf.func_exit = L4SYS_FUNC_EXIT; - } - - if (cmd[OPT_FILTER_ENTRY]) { - conf.filter_entry = strtol(cmd[OPT_FILTER_ENTRY].arg, NULL, 16); - } else { - conf.filter_entry = L4SYS_FILTER_ENTRY; - } - - if (cmd[OPT_FILTER_EXIT]) { - conf.filter_exit = strtol(cmd[OPT_FILTER_EXIT].arg, NULL, 16); - } else { - conf.filter_exit = L4SYS_FILTER_EXIT; - } - - if (cmd[OPT_BREAK_BLINK]) { - conf.break_blink = strtol(cmd[OPT_BREAK_BLINK].arg, NULL, 16); - } else { - conf.break_blink = L4SYS_BREAK_BLINK; - } - - if (cmd[OPT_BREAK_LONGJMP]) { - conf.break_longjmp = strtol(cmd[OPT_BREAK_LONGJMP].arg, NULL, 16); - } else { - conf.break_longjmp = L4SYS_BREAK_LONGJMP; - } - - if (cmd[OPT_BREAK_EXIT]) { - conf.break_exit = strtol(cmd[OPT_BREAK_EXIT].arg, NULL, 16); - } else { - conf.break_exit = L4SYS_BREAK_EXIT; - } - - if (cmd[OPT_FILTER_INSTRUCTIONS]) { - conf.filter_instructions = strtol(cmd[OPT_FILTER_INSTRUCTIONS].arg, NULL, 16); - } else { - conf.filter_instructions = L4SYS_FILTER_INSTRUCTIONS; - } - - if (cmd[OPT_NUMINSTR]) { - conf.numinstr = strtol(cmd[OPT_NUMINSTR].arg, NULL, 16); - } else { - conf.numinstr = L4SYS_NUMINSTR; - } - - if (cmd[OPT_TOTINSTR]) { - conf.totinstr = strtol(cmd[OPT_TOTINSTR].arg, NULL, 16); - } else { - conf.totinstr = L4SYS_TOTINSTR; - } - - if (cmd[OPT_EMUL_IPS]) { - conf.emul_ips = strtol(cmd[OPT_EMUL_IPS].arg, NULL, 16); - } else { - conf.emul_ips = L4SYS_BOCHS_IPS; - } - - if (cmd[OPT_STATE_FOLDER]) { - conf.state_folder = std::string(cmd[OPT_STATE_FOLDER].arg); - } else { - conf.state_folder = L4SYS_STATE_FOLDER; - } - - if (cmd[OPT_INSTRUCTION_LIST]) { - conf.instruction_list = std::string(cmd[OPT_INSTRUCTION_LIST].arg); - } else { - conf.instruction_list = L4SYS_INSTRUCTION_LIST; - } - - if (cmd[OPT_ALU_INSTRUCTIONS]) { - conf.alu_instructions = std::string(cmd[OPT_ALU_INSTRUCTIONS].arg); - } else { - conf.alu_instructions = L4SYS_ALU_INSTRUCTIONS; - } - - if (cmd[OPT_CORRECT_OUTPUT]) { - conf.golden_run = std::string(cmd[OPT_CORRECT_OUTPUT].arg); - } else { - conf.golden_run = L4SYS_CORRECT_OUTPUT; - } - - if (cmd[OPT_FILTER]) { - conf.filter = std::string(cmd[OPT_FILTER].arg); - } else { - conf.filter = L4SYS_FILTER; - } - - if (cmd[OPT_TRACE]) { - conf.trace = std::string(cmd[OPT_TRACE].arg); - } else { - conf.trace = std::string("trace.pb"); - } - - if (cmd[STEP]) { - if (!std::string("cr3").compare(cmd[STEP].arg) ) { - log << "calculate cr3" << endl; - conf.step = L4SysConfig::GET_CR3; - } else if (!std::string("cc").compare(cmd[STEP].arg) ) { - log << "Create Checkpoint" << endl; - conf.step = L4SysConfig::CREATE_CHECKPOINT; - } else if (!std::string("it").compare(cmd[STEP].arg) ) { - log << "collect instruction trace" << endl; - conf.step = L4SysConfig::COLLECT_INSTR_TRACE; - } else if (!std::string("gr").compare(cmd[STEP].arg) ) { - log << "golden run" << endl; - conf.step = L4SysConfig::GOLDEN_RUN; - } else if (!std::string("all").compare(cmd[STEP].arg) ) { - log << "do all preparation steps" << endl; - conf.step = L4SysConfig::FULL_PREPARATION; - } else { - cerr << "Wrong argument for option '--step'" << endl; - simulator.terminate(1); - } - } else { - conf.step = L4SysConfig::NO_PREP; - } - -} bool L4SysExperiment::run() { srand(time(NULL)); - log << "Starting L4Sys Experiment, phase " << PREPARATION_STEP << endl; - parseOptions(conf); switch(conf.step) { @@ -1012,7 +69,7 @@ bool L4SysExperiment::run() // STEP 3: determine the output of a "golden run" // -> golden run needs L4SYS_ADDRESS_SPACE as it breaks on // L4SYS_FUNC_EXIT - goldenRun(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); + goldenRun(new BPSingleListener(0, conf.address_space)); break; } case L4SysConfig::FULL_PREPARATION: { @@ -1021,7 +78,7 @@ bool L4SysExperiment::run() simulator.clearListeners(); collectInstructionTrace(new BPSingleListener(0, ANY_ADDR)); simulator.clearListeners(); - goldenRun(new BPSingleListener(0, L4SYS_ADDRESS_SPACE)); + goldenRun(new BPSingleListener(0, conf.address_space)); break; } default: { diff --git a/src/experiments/l4-sys/experimentFI.cc b/src/experiments/l4-sys/experimentFI.cc new file mode 100644 index 00000000..89369f61 --- /dev/null +++ b/src/experiments/l4-sys/experimentFI.cc @@ -0,0 +1,471 @@ +#include + +#include "experiment.hpp" +#include "UDIS86.hpp" +#include "InstructionFilter.hpp" +#include "aluinstr.hpp" +#include "campaign.hpp" + +#include "sal/SALConfig.hpp" +#include "sal/SALInst.hpp" +#include "sal/Memory.hpp" +#include "sal/Listener.hpp" +#include +#include "config/FailConfig.hpp" +#include "TracePlugin.pb.h" +#include "util/ProtoStream.hpp" +#include "util/gzstream/gzstream.h" +#include "util/CommandLine.hpp" + +using namespace std; +using namespace fail; + +string L4SysExperiment::sanitised(const string &in_str) { + string result; + int in_str_size = in_str.size(); + result.reserve(in_str_size); + for (int idx = 0; idx < in_str_size; idx++) { + char cur_char = in_str[idx]; + unsigned cur_char_value = static_cast(cur_char); + // also exclude the delimiter (',') + if (cur_char_value < 0x20 || cur_char_value > 0x7E || cur_char_value == ',') { + char str_nr[5]; + sprintf(str_nr, "\\%03o", cur_char_value); + result += str_nr; + } else { + result += cur_char; + } + } + return result; +} + +BaseListener* L4SysExperiment::waitIOOrOther(bool clear_output) { + IOPortListener ev_ioport(0x3F8, true); + BaseListener* ev = NULL; + if (clear_output) + currentOutput.clear(); + while (true) { + simulator.addListener(&ev_ioport); + ev = simulator.resume(); + //log << "hello " << simulator.getListenerCount() << std::endl; + //simulator.removeListener(&ev_ioport); + if (ev == &ev_ioport) { + currentOutput += ev_ioport.getData(); + //log << currentOutput << std::endl; + } else { + break; + } + } + return ev; +} + +unsigned L4SysExperiment::calculateTimeout(unsigned instr_left, unsigned ips) { + // the timeout in seconds, plus one backup second (avoids rounding overhead) + // [instr] / [instr / s] = [s] + unsigned seconds = instr_left / ips + 1; + // 1.1 (+10 percent) * 1000000 mus/s * [s] + return 1100000 * seconds; +} + + +BaseListener* L4SysExperiment::afterInjection(L4SysProtoMsg_Result* res) +{ + BaseListener *bl = 0; + + simtime_t t_inject = simulator.getTimerTicks(); + simtime_t t_bailout; + + ifstream instr_list_file(conf.instruction_list.c_str(), ios::binary); + instr_list_file.seekg((1 + res->instr_offset()) * sizeof(TraceInstr)); + + RangeSetInstructionFilter filtering(conf.filter.c_str()); + + for (;;) { + // Step over _all_ instructions in the trace AS + BPSingleListener stepListener(ANY_ADDR, conf.address_space_trace); + + TraceInstr curr_instr; + instr_list_file.read(reinterpret_cast(&curr_instr), + sizeof(TraceInstr)); + + t_bailout = simulator.getTimerTicks(); + + // step until next traced instruction + simulator.addListener(&stepListener); + bl = waitIOOrOther(false); + + // bail out if we hit a listener other than the single step + // one -> in this case the experiment is over prematurely + if (bl != &stepListener) { + // Note, the difference in this case is the diff between the + // last correct instruction and the starting point -> this is + // useful for TIMEOUT events where the actual time now would be + // the complete TIMEOUT whereas we are interested in the time + // until execution deviates from the original trace + res->set_deviate_steps(t_bailout - t_inject); + res->set_deviate_eip(-1); + log << "bailing out of single-stepping mode" << endl; + break; + } + + address_t eip = stepListener.getTriggerInstructionPointer(); + + if (!filtering.isValidInstr(eip)) + continue; + + if (eip != curr_instr.trigger_addr) { + // In the case where we see an actual instruction stream deviation, we + // want the real diff between NOW and the injection start point + t_bailout = simulator.getTimerTicks(); + log << "got " << hex << eip << " expected " + << curr_instr.trigger_addr << endl; + + log << "mismatch found after " << (t_bailout - t_inject) << " instructions." << endl; + res->set_deviate_steps(t_bailout - t_inject); + res->set_deviate_eip(eip); + + return waitIOOrOther(false); + } + } + + log << "left single-stepping mode after " << (t_bailout - t_inject) + << " instructions." << endl; + return bl; +} + +void L4SysExperiment::getJobParameters() +{ + // get the experiment parameters + log << "asking job server for experiment parameters" << endl; + if (!m_jc.getParam(*param)) { + log << "Dying." << endl; + // communicate that we were told to die + terminate(1); + } +} + + +void L4SysExperiment::validatePrerequisites(std::string state, std::string output) +{ + struct stat teststruct; + if (stat(state.c_str(), &teststruct) == -1 || + stat(output.c_str(), &teststruct) == -1) { + log << "Important data missing - call \"prepare\" first." << endl; + terminate(10); + } +} + + +void L4SysExperiment::readGoldenRun(std::string& target, std::string golden_run) +{ + ifstream golden_run_file(golden_run.c_str()); + + if (!golden_run_file.good()) { + log << "Could not open file " << golden_run.c_str() << endl; + terminate(20); + } + + target.assign((istreambuf_iterator(golden_run_file)), + istreambuf_iterator()); + + golden_run_file.close(); +} + + +void L4SysExperiment::setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset, std::string instr_list) +{ + /* + * The L4Sys experiment uses instruction filtering to restrict the range + * of fault injection to only e.g., kernel instructions. + * + * To speed up injection, L4Sys furthermore does not use per-instruction + * breakpoints but only places a breakpoint on the actually interesting + * instruction (e.g., the injection EIP). Hence, we also do not count + * instructions from the beginning of the experiment, but we count how + * often a certain EIP was hit before the injection. + * + * To achieve these properties, we use an additional trace file that + * provides us with a 'hit counter' of each injection candidate. We use + * the global instruction ID (DataBaseCampaign: instruction_offset) to + * index into this trace file and determine the value for the breakpoint + * counter. + */ + ifstream instr_list_file(instr_list.c_str(), ios::binary); + + if (!instr_list_file.good()) { + log << "Missing instruction trace" << endl; + terminate(21); + } + + log << "inst offset " << dec << instOffset << " sizeof(TraceInstr) " << sizeof(TraceInstr) << endl; + TraceInstr curr_instr; + instr_list_file.seekg(instOffset * sizeof(TraceInstr)); + log << instr_list_file.eof() << " " << instr_list_file.bad() << " " + << instr_list_file.fail() << endl; + if (instr_list_file.eof()) { + log << "Job parameters indicate position outside the traced instruction list." << endl; + terminate(1); + } + instr_list_file.read(reinterpret_cast(&curr_instr), sizeof(TraceInstr)); + instr_list_file.close(); + + log << "setting watchpoint at " << hex << curr_instr.trigger_addr << endl; + bp->setWatchInstructionPointer(curr_instr.trigger_addr); + log << "setting bp counter " << hex << curr_instr.bp_counter << endl; + bp->setCounter(curr_instr.bp_counter); +} + + +fail::BPSingleListener* +L4SysExperiment::prepareMemoryExperiment(int ip, int offset, int dataAddress) +{ + fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); + log << "\033[34;1mMemory fault injection\033[0m at instruction " << std::hex << offset + << ", ip " << ip << ", address " << dataAddress << std::endl; + +#if L4SYS_FILTER_INSTRUCTIONS + setupFilteredBreakpoint(bp, offset, conf.instruction_list); + assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); +#else + bp->setWatchInstructionPointer(ANY_ADDR); + bp->setCounter(offset); +#endif + return bp; +} + + +fail::BPSingleListener* +L4SysExperiment::prepareRegisterExperiment(int ip, int offset, int dataAddress) +{ + fail::BPSingleListener *bp = new BPSingleListener(0, conf.address_space_trace); + + int reg, regOffset; + reg = ((dataAddress >> 4) & 0xF) + 1; // regs start at 1 + regOffset = dataAddress & 0xF; + + log << "\033[32;1mGPR bitflip\033[0m at instr. offset " << offset + << " reg data (" << reg << ", " + << regOffset << ")" << std::endl; + +#if L4SYS_FILTER_INSTRUCTIONS + setupFilteredBreakpoint(bp, offset, conf.instruction_list); + log << bp->getWatchInstructionPointer() << std::endl; + log << ip << std::endl; + assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); + log << bp->getCounter() << std::endl; +#else + log << "Exp offset: " << offset << std::endl; + bp->setWatchInstructionPointer(ANY_ADDR); + bp->setCounter(offset); +#endif + return bp; +} + + +bool L4SysExperiment::doMemoryInjection(int address, int bit) +{ + MemoryManager& mm = simulator.getMemoryManager(); + + // XXX: evil, but I need to bail out if memory access is invalid + host_address_t addr = reinterpret_cast(&mm)->guestToHost(address); + if (addr == (host_address_t)ADDR_INV) + return false; + + byte_t data = mm.getByte(address); + byte_t newdata = data ^ (1 << bit); + mm.setByte(address, newdata); + log << "[" << std::hex << address << "] " << (int)data + << " -> " << (int)newdata << std::endl; + return true; +} + + +void L4SysExperiment::doRegisterInjection(int regDesc, int bit) +{ + int reg, offset; + reg = (regDesc >> 4) + 1; // regs start at 1 + offset = regDesc & 0xF; + + ConcreteCPU& cpu = simulator.getCPU(0); + Register *reg_target = cpu.getRegister(reg - 1); + regdata_t data = cpu.getRegisterContent(reg_target); + regdata_t newdata = data ^ (1 << (bit + 8 * offset)); + cpu.setRegisterContent(reg_target, newdata); + log << "Reg[" << reg << "]: " << std::hex << data << " -> " + << newdata << std::endl; +} + +void L4SysExperiment::terminateWithError(string details, int reason, + L4SysProtoMsg_Result *r = 0) { + L4SysProtoMsg_Result *result; + + if (r) + result = r; + else + result = param->msg.add_result(); + + result->set_resulttype(param->msg.UNKNOWN); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); + result->set_details(details); + + m_jc.sendResult(*param); + terminate(reason); +} + +void L4SysExperiment::doExperiments(fail::BPSingleListener* bp) { + // LAST STEP: The actual experiment. + validatePrerequisites(conf.state_folder, conf.golden_run); + + // Read the golden run output for validation purposes + std::string golden_run; + readGoldenRun(golden_run, conf.golden_run); + + getJobParameters(); + + int exp_type = param->msg.exp_type(); + int instr_offset = param->msg.fsppilot().injection_instr(); + int regData = param->msg.fsppilot().data_address(); + + if (exp_type == param->msg.MEM) { + bp = prepareMemoryExperiment(param->msg.fsppilot().injection_instr_absolute(), + param->msg.fsppilot().injection_instr(), + param->msg.fsppilot().data_address()); + } else if (exp_type == param->msg.GPRFLIP) { + bp = prepareRegisterExperiment(param->msg.fsppilot().injection_instr_absolute(), + param->msg.fsppilot().injection_instr(), + param->msg.fsppilot().data_address()); + } else { + log << "Unsupported experiment type: " << exp_type << std::endl; + terminate(1); + } + + assert(bp); + + for (unsigned bit = 0; bit < 8; ++bit) { + + L4SysProtoMsg_Result *result = param->msg.add_result(); + result->set_instr_offset(instr_offset); + + simulator.clearListeners(); + + log << "Bit " << bit << ", restoring state." << endl; + simulator.restore(conf.state_folder.c_str()); + log << " ... EIP = " << std::hex << simulator.getCPU(0).getInstructionPointer() << std::endl; + + simulator.addListener(bp); + + simtime_t now = simulator.getTimerTicks(); + fail::BaseListener *go = waitIOOrOther(true); + assert(go == bp); + + log << "Hit BP @ " << hex << bp->getTriggerInstructionPointer() << " " << bp->getWatchInstructionPointer() + << " Start time " << now << ", new time " << simulator.getTimerTicks() + << ", diff = " << simulator.getTimerTicks() - now << std::endl; + +#if L4SYS_FILTER_INSTRUCTIONS + assert(bp->getTriggerInstructionPointer() == bp->getWatchInstructionPointer()); +#endif + result->set_injection_ip(bp->getTriggerInstructionPointer()); + + if (exp_type == param->msg.MEM) { + result->set_bit_offset(bit); + log << "injection addr: " + << std::hex << param->msg.fsppilot().data_address() + << std::endl; + result->set_injection_address(param->msg.fsppilot().data_address()); + if (!doMemoryInjection(param->msg.fsppilot().data_address(), bit)) + { + terminateWithError("invalid mem access", 51, result); + } + } else if (exp_type == param->msg.GPRFLIP) { + int reg = (param->msg.fsppilot().data_address() >> 4) + 1; + result->set_register_offset(static_cast(reg)); + result->set_bit_offset(bit + 8 * (param->msg.fsppilot().data_address() & 0xF)); + doRegisterInjection(param->msg.fsppilot().data_address(), bit); + } else { + log << "doing nothing for experiment type " << exp_type << std::endl; + } + + BPSingleListener ev_done(conf.func_exit, conf.address_space); + simulator.addListener(&ev_done); + + // Well-known bailout point -- if we hit L4SYS_BREAK_BLINK, which + // is the entry of Vga::blink_cursor(), we know that we are in some + // kind of error handler + BPSingleListener ev_blink(conf.break_blink); + simulator.addListener(&ev_blink); + BPSingleListener ev_longjmp(conf.break_longjmp); + simulator.addListener(&ev_longjmp); + + //If we come to our own exit function, we can stop + BPSingleListener ev_exit(conf.break_exit); + simulator.addListener(&ev_exit); + + unsigned instr_left = conf.totinstr - instr_offset; // XXX offset is in NUMINSTR, TOTINSTR is higher + BPSingleListener ev_incomplete(ANY_ADDR, conf.address_space); + /* + * Use hard-coded value for incomplete counter. We are currently looking at short-running pieces + * of code. This means that in the error case, where a lot of data is still to be printed to serial + * line, the benchmark does not complete this within * <1.x> cycles. Instead, we use + * a frame large enough to catch some more output even at the end of a run. + */ + ev_incomplete.setCounter(2000000); + simulator.addListener(&ev_incomplete); + + /* + * This timeout will always be at least one second - see calculateTimeout() + */ + TimerListener ev_timeout(calculateTimeout(instr_left, conf.emul_ips)); + simulator.addListener(&ev_timeout); + log << "continue... (" << simulator.getListenerCount() + << " breakpoints, timeout @ " << ev_timeout.getTimeout() + << std::endl; + + log << "TOListener " << (void*)&ev_timeout << " incompListener " + << (void*)&ev_incomplete << endl; + BaseListener *ev = afterInjection(result); + log << "afterInj: res.devstep = " << result->deviate_steps() << endl; + + /* copying a string object that contains control sequences + * unfortunately does not work with the library I am using, + * which is why output is passed on as C string and + * the string compare is done on C strings + */ + if (ev == &ev_done) { + if (strcmp(currentOutput.c_str(), golden_run.c_str()) == 0) { + log << "Result DONE" << endl; + result->set_resulttype(param->msg.DONE); + } else { + log << "Result WRONG" << endl; + result->set_resulttype(param->msg.WRONG); + result->set_output(sanitised(currentOutput.c_str())); + } + } else if ((ev == &ev_incomplete) || + (ev == &ev_blink) || + (ev == &ev_longjmp)) { + log << "Result INCOMPLETE" << endl; + result->set_resulttype(param->msg.INCOMPLETE); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); + } else if (ev == &ev_timeout) { + log << "Result TIMEOUT" << endl; + result->set_resulttype(param->msg.TIMEOUT); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); + } else if (ev == &ev_exit) { + log << "Result FAILSTOP" << endl; + result->set_resulttype(param->msg.FAILSTOP); + result->set_resultdata(simulator.getCPU(0).getInstructionPointer()); + result->set_output(sanitised(currentOutput.c_str())); + } else { + log << "Result WTF?" << endl; + stringstream ss; + ss << "eventid " << ev; + terminateWithError(ss.str(), 50); + } + } + + m_jc.sendResult(*param); +} + diff --git a/src/experiments/l4-sys/experimentInfo.hpp b/src/experiments/l4-sys/experimentInfo.hpp index 40d684e2..28b8adcf 100644 --- a/src/experiments/l4-sys/experimentInfo.hpp +++ b/src/experiments/l4-sys/experimentInfo.hpp @@ -26,9 +26,9 @@ #define L4SYS_FILTER_ENTRY L4SYS_inj_start #define L4SYS_FILTER_EXIT L4SYS_inj_end -#define L4SYS_BREAK_BLINK 0x0 -#define L4SYS_BREAK_LONGJMP 0x0 -#define L4SYS_BREAK_EXIT 0x0 +#define L4SYS_BREAK_BLINK 0xdead +#define L4SYS_BREAK_LONGJMP 0xdead +#define L4SYS_BREAK_EXIT 0xdead // select instruction filtering // XXX: this should be always on and the code should be @@ -37,8 +37,8 @@ #define L4SYS_FILTER_INSTRUCTIONS 1 // kernel: 2377547, userland: 79405472 -#define L4SYS_NUMINSTR 16 -#define L4SYS_TOTINSTR 58401 +#define L4SYS_NUMINSTR 0x1 +#define L4SYS_TOTINSTR 0x1 #define L4SYS_BOCHS_IPS 5000000 // several file names used diff --git a/src/experiments/l4-sys/experimentParameter.cc b/src/experiments/l4-sys/experimentParameter.cc new file mode 100644 index 00000000..3086e3b6 --- /dev/null +++ b/src/experiments/l4-sys/experimentParameter.cc @@ -0,0 +1,213 @@ +#include + +#include "experiment.hpp" +#include "experimentInfo.hpp" + +#include "util/CommandLine.hpp" + +using namespace std; +using namespace fail; + +void L4SysExperiment::parseOptions(L4SysConfig &conf) { + CommandLine &cmd = CommandLine::Inst(); + + cmd.addOption("", "", Arg::None, "USAGE: fail-client -Wf,[option] -Wf,[option] ... "); + CommandLine::option_handle HELP = + cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit"); + CommandLine::option_handle STEP = + cmd.addOption("s", "step", Arg::Optional, "-s,--step \tSpecify preparation step, without this argumnt fail-client start in experiment mode (cr3: get CR3, cc: Create Checkpoint, it: collect instruction trace, gr: golden run, all: do the whole preparation)"); + + + CommandLine::option_handle OPT_MAX_INSTR_BYTES = + cmd.addOption("", "max_instr_bytes", Arg::Optional, "--max_instr_bytes \t define MAX_INSTR_BYTES"); + CommandLine::option_handle OPT_ADDRESS_SPACE = + cmd.addOption("", "address_space", Arg::Optional, "--address_space \t define L4SYS_ADDRESS_SPACE"); + CommandLine::option_handle OPT_ADDRESS_SPACE_TRACE = + cmd.addOption("", "address_space_trace", Arg::Optional, "--address_space_trace \t define L4SYS_ADDRESS_SPACE_TRACE"); + CommandLine::option_handle OPT_FUNC_ENTRY = + cmd.addOption("", "func_entry", Arg::Optional, "--func_entry \t define L4SYS_FUNC_ENTRY"); + CommandLine::option_handle OPT_FUNC_EXIT = + cmd.addOption("", "func_exit", Arg::Optional, "--func_exit \t define L4SYS_FUNC_EXIT"); + CommandLine::option_handle OPT_FILTER_ENTRY = + cmd.addOption("", "filter_entry", Arg::Optional, "--filter_entry \t define L4SYS_FILTER_ENTRY"); + CommandLine::option_handle OPT_FILTER_EXIT = + cmd.addOption("", "filter_exit", Arg::Optional, "--filter_exit \t define L4SYS_FILTER_EXIT"); + CommandLine::option_handle OPT_BREAK_BLINK = + cmd.addOption("", "break_blink", Arg::Optional, "--break_blink \t define L4SYS_BREAK_BLINK"); + CommandLine::option_handle OPT_BREAK_LONGJMP = + cmd.addOption("", "break_longjmp", Arg::Optional, "--break_longjmp \t define L4SYS_BREAK_LONGJMP"); + CommandLine::option_handle OPT_BREAK_EXIT = + cmd.addOption("", "break_exit", Arg::Optional, "--break_exit \t define L4SYS_BREAK_EXIT"); + CommandLine::option_handle OPT_FILTER_INSTRUCTIONS = + cmd.addOption("", "filter_instructions", Arg::Optional, "--filter_instructions \t define L4SYS_FILTER_INSTRUCTIONS"); + CommandLine::option_handle OPT_NUMINSTR = + cmd.addOption("", "numinstr", Arg::Optional, "--numinstr \t define L4SYS_NUMINSTR"); + CommandLine::option_handle OPT_TOTINSTR = + cmd.addOption("", "totinstr", Arg::Optional, "--totinstr \t define L4SYS_TOTINSTR"); + CommandLine::option_handle OPT_EMUL_IPS = + cmd.addOption("", "bochs_ips", Arg::Optional, "--bochs_ips \t define L4SYS_BOCHS_IPS"); + CommandLine::option_handle OPT_STATE_FOLDER = + cmd.addOption("", "state_folder", Arg::Optional, "--state_folder \t define L4SYS_STATE_FOLDER"); + CommandLine::option_handle OPT_INSTRUCTION_LIST = + cmd.addOption("", "instruction_list", Arg::Optional, "--instruction_list \t define L4SYS_INSTRUCTION_LIST"); + CommandLine::option_handle OPT_ALU_INSTRUCTIONS = + cmd.addOption("", "alu_instructions", Arg::Optional, "--alu_instructions \t define L4SYS_ALU_INSTRUCTIONS"); + CommandLine::option_handle OPT_CORRECT_OUTPUT = + cmd.addOption("", "golden_run", Arg::Optional, "--correct_output \t define L4SYS_CORRECT_OUTPUT"); + CommandLine::option_handle OPT_FILTER = + cmd.addOption("", "filter", Arg::Optional, "--filter \t define L4SYS_FILTER"); + CommandLine::option_handle OPT_TRACE = + cmd.addOption("", "trace", Arg::Optional, "--trace \t define outputfile for trace (default trace.pb)"); + + if (!cmd.parse()) { + cerr << "Error parsing arguments." << endl; + simulator.terminate(1); + } else if (cmd[HELP]) { + cmd.printUsage(); + simulator.terminate(0); + } + + if (cmd[OPT_MAX_INSTR_BYTES]) { + conf.max_instr_bytes = strtol(cmd[OPT_MAX_INSTR_BYTES].arg, NULL, 16); + } else { + conf.max_instr_bytes = MAX_INSTR_BYTES; + } + + if (cmd[OPT_ADDRESS_SPACE]) { + conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); + } else { + conf.address_space = L4SYS_ADDRESS_SPACE; + } + + if (cmd[OPT_ADDRESS_SPACE_TRACE]) { + conf.address_space_trace = strtol(cmd[OPT_ADDRESS_SPACE_TRACE].arg, NULL, 16); + } else { + conf.address_space_trace = L4SYS_ADDRESS_SPACE_TRACE; + } + + if (cmd[OPT_FUNC_ENTRY]) { + conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); + } else { + conf.func_entry = L4SYS_FUNC_ENTRY; + } + + if (cmd[OPT_FUNC_EXIT]) { + conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); + } else { + conf.func_exit = L4SYS_FUNC_EXIT; + } + + if (cmd[OPT_FILTER_ENTRY]) { + conf.filter_entry = strtol(cmd[OPT_FILTER_ENTRY].arg, NULL, 16); + } else { + conf.filter_entry = L4SYS_FILTER_ENTRY; + } + + if (cmd[OPT_FILTER_EXIT]) { + conf.filter_exit = strtol(cmd[OPT_FILTER_EXIT].arg, NULL, 16); + } else { + conf.filter_exit = L4SYS_FILTER_EXIT; + } + + if (cmd[OPT_BREAK_BLINK]) { + conf.break_blink = strtol(cmd[OPT_BREAK_BLINK].arg, NULL, 16); + } else { + conf.break_blink = L4SYS_BREAK_BLINK; + } + + if (cmd[OPT_BREAK_LONGJMP]) { + conf.break_longjmp = strtol(cmd[OPT_BREAK_LONGJMP].arg, NULL, 16); + } else { + conf.break_longjmp = L4SYS_BREAK_LONGJMP; + } + + if (cmd[OPT_BREAK_EXIT]) { + conf.break_exit = strtol(cmd[OPT_BREAK_EXIT].arg, NULL, 16); + } else { + conf.break_exit = L4SYS_BREAK_EXIT; + } + + if (cmd[OPT_FILTER_INSTRUCTIONS]) { + conf.filter_instructions = strtol(cmd[OPT_FILTER_INSTRUCTIONS].arg, NULL, 16); + } else { + conf.filter_instructions = L4SYS_FILTER_INSTRUCTIONS; + } + + if (cmd[OPT_NUMINSTR]) { + conf.numinstr = strtol(cmd[OPT_NUMINSTR].arg, NULL, 16); + } else { + conf.numinstr = L4SYS_NUMINSTR; + } + + if (cmd[OPT_TOTINSTR]) { + conf.totinstr = strtol(cmd[OPT_TOTINSTR].arg, NULL, 16); + } else { + conf.totinstr = L4SYS_TOTINSTR; + } + + if (cmd[OPT_EMUL_IPS]) { + conf.emul_ips = strtol(cmd[OPT_EMUL_IPS].arg, NULL, 16); + } else { + conf.emul_ips = L4SYS_BOCHS_IPS; + } + + if (cmd[OPT_STATE_FOLDER]) { + conf.state_folder = std::string(cmd[OPT_STATE_FOLDER].arg); + } else { + conf.state_folder = L4SYS_STATE_FOLDER; + } + + if (cmd[OPT_INSTRUCTION_LIST]) { + conf.instruction_list = std::string(cmd[OPT_INSTRUCTION_LIST].arg); + } else { + conf.instruction_list = L4SYS_INSTRUCTION_LIST; + } + + if (cmd[OPT_ALU_INSTRUCTIONS]) { + conf.alu_instructions = std::string(cmd[OPT_ALU_INSTRUCTIONS].arg); + } else { + conf.alu_instructions = L4SYS_ALU_INSTRUCTIONS; + } + + if (cmd[OPT_CORRECT_OUTPUT]) { + conf.golden_run = std::string(cmd[OPT_CORRECT_OUTPUT].arg); + } else { + conf.golden_run = L4SYS_CORRECT_OUTPUT; + } + + if (cmd[OPT_FILTER]) { + conf.filter = std::string(cmd[OPT_FILTER].arg); + } else { + conf.filter = L4SYS_FILTER; + } + + if (cmd[OPT_TRACE]) { + conf.trace = std::string(cmd[OPT_TRACE].arg); + } else { + conf.trace = std::string("trace.pb"); + } + + if (cmd[STEP]) { + if (!std::string("cr3").compare(cmd[STEP].arg) ) { + log << "calculate cr3" << endl; + conf.step = L4SysConfig::GET_CR3; + } else if (!std::string("cc").compare(cmd[STEP].arg) ) { + log << "Create Checkpoint" << endl; + conf.step = L4SysConfig::CREATE_CHECKPOINT; + } else if (!std::string("it").compare(cmd[STEP].arg) ) { + log << "collect instruction trace" << endl; + conf.step = L4SysConfig::COLLECT_INSTR_TRACE; + } else if (!std::string("gr").compare(cmd[STEP].arg) ) { + log << "golden run" << endl; + conf.step = L4SysConfig::GOLDEN_RUN; + } else if (!std::string("all").compare(cmd[STEP].arg) ) { + log << "do all preparation steps" << endl; + conf.step = L4SysConfig::FULL_PREPARATION; + } else { + cerr << "Wrong argument for option '--step'" << endl; + simulator.terminate(1); + } + } else { + conf.step = L4SysConfig::NO_PREP; + } +} diff --git a/src/experiments/l4-sys/experimentPreparation.cc b/src/experiments/l4-sys/experimentPreparation.cc new file mode 100644 index 00000000..5050bf96 --- /dev/null +++ b/src/experiments/l4-sys/experimentPreparation.cc @@ -0,0 +1,286 @@ +#include + +#include "experiment.hpp" +#include "experimentInfo.hpp" +#include "InstructionFilter.hpp" +#include "aluinstr.hpp" + +#include "sal/SALConfig.hpp" +#include "sal/SALInst.hpp" +#include "sal/Memory.hpp" +#include "sal/Listener.hpp" +#include +#include "config/FailConfig.hpp" +#include "TracePlugin.pb.h" +#include "util/ProtoStream.hpp" +#include "util/gzstream/gzstream.h" +#include "util/CommandLine.hpp" + +using namespace std; +using namespace fail; + +Bit32u L4SysExperiment::eipBiased() { + BX_CPU_C *cpu_context = simulator.getCPUContext(); + Bit32u EIP = cpu_context->gen_reg[BX_32BIT_REG_EIP].dword.erx; + return EIP + cpu_context->eipPageBias; +} + +const Bit8u *L4SysExperiment::calculateInstructionAddress() { + // pasted in from various nested Bochs functions and macros - I hope + // they will not change too soon (as do the Bochs developers, probably) + BX_CPU_C *cpu_context = simulator.getCPUContext(); + const Bit8u *result = cpu_context->eipFetchPtr + eipBiased(); + return result; +} + +void L4SysExperiment::runToStart(fail::BPSingleListener *bp) +{ + bp->setWatchInstructionPointer(conf.func_entry); + + log << "run until ip reaches 0x" << hex << conf.func_entry << endl; + + simulator.addListenerAndResume(bp); + + log << "test function entry reached, saving state" << endl; + log << "EIP: expected " << hex << bp->getTriggerInstructionPointer() + << " and actually got " + << simulator.getCPU(0).getInstructionPointer() + << endl; + log << "check the source code if the two instruction pointers are not equal" << endl; + + if(conf.address_space == conf.address_space_trace) { + conf.address_space_trace = BX_CPU(0)->cr3; + } + + conf.address_space = BX_CPU(0)->cr3; +} + + +void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) +{ + fail::MemAccessListener ML(ANY_ADDR, MemAccessEvent::MEM_READWRITE); + ogzstream out(conf.trace.c_str()); + ProtoOStream *os = new ProtoOStream(&out); + + size_t count = 0, inst_accepted = 0, mem = 0, mem_valid = 0; + simtime_t prevtime = 0, currtime; + simtime_diff_t deltatime; + + log << "restoring state" << endl; + simulator.restore(conf.state_folder.c_str()); + currtime = simulator.getTimerTicks(); + + log << "EIP = " << hex + << simulator.getCPU(0).getInstructionPointer() + << endl; + + if (!simulator.addListener(&ML)) { + log << "did not add memory listener..." << std::endl; + exit(1); + } + if (!simulator.addListener(bp)) { + log << "did not add breakpoint listener..." << std::endl; + exit(1); + } + +#if L4SYS_FILTER_INSTRUCTIONS + ofstream instr_list_file(conf.instruction_list.c_str(), ios::binary); + RangeSetInstructionFilter filtering(conf.filter.c_str()); + bp->setWatchInstructionPointer(ANY_ADDR); + + map times_called_map; + bool injecting = false; + + while (bp->getTriggerInstructionPointer() != conf.func_exit) { + fail::BaseListener *res = simulator.resume(); + address_t curr_addr = 0; + + // XXX: See the API problem below! + if (res == &ML) { + curr_addr = ML.getTriggerInstructionPointer(); + simulator.addListener(&ML); + if ((conf.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != conf.address_space_trace)) { + continue; + } + ++mem; + } else if (res == bp) { + curr_addr = bp->getTriggerInstructionPointer(); + assert(curr_addr == simulator.getCPU(0).getInstructionPointer()); + simulator.addListener(bp); + ++count; + } + + currtime = simulator.getTimerTicks(); + deltatime = currtime - prevtime; + + if (curr_addr == conf.filter_entry) { + injecting = true; + } + + if (curr_addr == conf.filter_exit) { + injecting = false; + } + + // Only trace if: + // 1) we are between FILTER_ENTRY and FILTER_EXIT, and + // 2) we have a valid instruction according to filter rules, and + // 3) we are in the TRACE address space + if (!injecting or + !filtering.isValidInstr(curr_addr, reinterpret_cast(calculateInstructionAddress())) + or + (BX_CPU(0)->cr3 != conf.address_space_trace) + ) { + //log << "connt..." << std::endl; + continue; + } + + if (res == &ML) { +#if 0 + log << "Memory event IP " << std::hex << ML.getTriggerInstructionPointer() + << " @ " << ML.getTriggerAddress() << "(" + << ML.getTriggerAccessType() << "," << ML.getTriggerWidth() + << ")" << std::endl; +#endif + ++mem_valid; + + Trace_Event te; + if (deltatime != 0) { te.set_time_delta(1); }; + te.set_ip(curr_addr); + te.set_memaddr(ML.getTriggerAddress()); + te.set_accesstype( (ML.getTriggerAccessType() & MemAccessEvent::MEM_READ) ? te.READ : te.WRITE ); + te.set_width(ML.getTriggerWidth()); + os->writeMessage(&te); + } else if (res == bp) { + unsigned times_called = times_called_map[curr_addr]; + ++times_called; + times_called_map[curr_addr] = times_called; + + //log << "breakpoint event" << std::endl; + // now check if we want to add the instruction for fault injection + ++inst_accepted; + + // 1) The 'old' way of logging instructions -> DEPRECATE soon + // BUT: we are currently using the bp_counter stored in this + // file! + TraceInstr new_instr; + //log << "writing IP " << hex << curr_addr << " counter " + // << dec << times_called << "(" << hex << BX_CPU(0)->cr3 << ")" + // << endl; + new_instr.trigger_addr = curr_addr; + new_instr.bp_counter = times_called; + + instr_list_file.write(reinterpret_cast(&new_instr), sizeof(TraceInstr)); + + // 2) The 'new' way -> generate Events that can be processed by + // the generic *-trace tools + // XXX: need to log CR3 if we want multiple binaries here + Trace_Event e; + if (deltatime != 0) { e.set_time_delta(1); }; + e.set_ip(curr_addr); + os->writeMessage(&e); + } else { + printf("Unknown res? %p\n", res); + } + prevtime = currtime; + + //short sanity check + //log << "continue..." << std::endl; + } + log << "saving instructions triggered during normal execution" << endl; + instr_list_file.close(); + log << "test function calculation position reached after " + << dec << count << " instructions; " << inst_accepted << " accepted" << endl; + log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; +#else + bp->setWatchInstructionPointer(ANY_ADDR); + while (bp->getTriggerInstructionPointer() != conf.func_exit) + { + fail::BaseListener *res = simulator.resume(); + address_t curr_addr = 0; + + // XXX: See the API problem below! + if (res == &ML) { + curr_addr = ML.getTriggerInstructionPointer(); + simulator.addListener(&ML); + if ((func.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != func.address_space_trace)) { + continue; + } + ++mem; + } else if (res == bp) { + curr_addr = bp->getTriggerInstructionPointer(); + assert(curr_addr == simulator.getCPU(0).getInstructionPointer()); + simulator.addListener(bp); + ++count; + } +#if 0 + if (curr_addr < 0xC0000000) // XXX filter for kernel-only experiment + continue; +#endif + currtime = simulator.getTimerTicks(); + deltatime = currtime - prevtime; + + if (res == &ML) { +#if 0 + log << "Memory event IP " << std::hex << ML.getTriggerInstructionPointer() + << " @ " << ML.getTriggerAddress() << "(" + << ML.getTriggerAccessType() << "," << ML.getTriggerWidth() + << ")" << std::endl; +#endif + ++mem_valid; + + Trace_Event te; + if (deltatime != 0) { te.set_time_delta(deltatime); }; + te.set_ip(curr_addr); + te.set_memaddr(ML.getTriggerAddress()); + te.set_accesstype( (ML.getTriggerAccessType() & MemAccessEvent::MEM_READ) ? te.READ : te.WRITE ); + te.set_width(ML.getTriggerWidth()); + os->writeMessage(&te); + } else if (res == bp) { + Trace_Event e; + if (deltatime != 0) { e.set_time_delta(deltatime); }; + e.set_ip(curr_addr); + os->writeMessage(&e); + } else { + printf("Unknown res? %p\n", res); + } + prevtime = currtime; + } + log << "test function calculation position reached after " + << dec << count << " instructions; " << count << " accepted" << endl; + log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; +#endif + conf.numinstr = inst_accepted; + conf.totinstr = count; + delete bp; +} + +void L4SysExperiment::goldenRun(fail::BPSingleListener* bp) +{ + log << "restoring state" << endl; + simulator.restore(conf.state_folder.c_str()); + log << "EIP = " << hex + << simulator.getCPU(0).getInstructionPointer() + << endl; + + std::string golden_run; + ofstream golden_run_file(conf.golden_run.c_str()); + bp->setWatchInstructionPointer(conf.func_exit); + simulator.addListener(bp); + BaseListener* ev = waitIOOrOther(true); + if (ev == bp) { + golden_run.assign(currentOutput.c_str()); + golden_run_file << currentOutput.c_str(); + log << "Output successfully logged!" << endl; + } else { + log + << "Obviously, there is some trouble with" + << " the events registered - aborting simulation!" + << endl; + golden_run_file.close(); + terminate(10); + } + + log << "saving output generated during normal execution" << endl; + golden_run_file.close(); + delete bp; +} From 57c5fbf8622fb01dfc0326f00b5dc6713715b384 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Fri, 13 Jun 2014 21:37:26 +0200 Subject: [PATCH 06/12] Bugfix for last commit --- src/experiments/l4-sys/experimentFI.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/experiments/l4-sys/experimentFI.cc b/src/experiments/l4-sys/experimentFI.cc index 89369f61..6b224563 100644 --- a/src/experiments/l4-sys/experimentFI.cc +++ b/src/experiments/l4-sys/experimentFI.cc @@ -1,6 +1,7 @@ #include #include "experiment.hpp" +#include "experimentInfo.hpp" #include "UDIS86.hpp" #include "InstructionFilter.hpp" #include "aluinstr.hpp" @@ -14,8 +15,6 @@ #include "config/FailConfig.hpp" #include "TracePlugin.pb.h" #include "util/ProtoStream.hpp" -#include "util/gzstream/gzstream.h" -#include "util/CommandLine.hpp" using namespace std; using namespace fail; From 43b8c2351c458c86c478da93c065ce87da5a52d2 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Mon, 16 Jun 2014 14:08:08 +0200 Subject: [PATCH 07/12] More code cleanup --- src/experiments/l4-sys/experiment.cc | 1 - src/experiments/l4-sys/experimentFI.cc | 10 ++-------- src/experiments/l4-sys/experimentPreparation.cc | 11 +++-------- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 9a18d830..d3e5ed19 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -4,7 +4,6 @@ #include "campaign.hpp" #include "sal/SALConfig.hpp" -#include "config/FailConfig.hpp" using namespace std; using namespace fail; diff --git a/src/experiments/l4-sys/experimentFI.cc b/src/experiments/l4-sys/experimentFI.cc index 6b224563..a2d041d3 100644 --- a/src/experiments/l4-sys/experimentFI.cc +++ b/src/experiments/l4-sys/experimentFI.cc @@ -2,19 +2,13 @@ #include "experiment.hpp" #include "experimentInfo.hpp" -#include "UDIS86.hpp" #include "InstructionFilter.hpp" +#include "UDIS86.hpp" #include "aluinstr.hpp" #include "campaign.hpp" -#include "sal/SALConfig.hpp" -#include "sal/SALInst.hpp" -#include "sal/Memory.hpp" -#include "sal/Listener.hpp" #include -#include "config/FailConfig.hpp" -#include "TracePlugin.pb.h" -#include "util/ProtoStream.hpp" +#include "sal/SALConfig.hpp" using namespace std; using namespace fail; diff --git a/src/experiments/l4-sys/experimentPreparation.cc b/src/experiments/l4-sys/experimentPreparation.cc index 5050bf96..42776f86 100644 --- a/src/experiments/l4-sys/experimentPreparation.cc +++ b/src/experiments/l4-sys/experimentPreparation.cc @@ -6,15 +6,10 @@ #include "aluinstr.hpp" #include "sal/SALConfig.hpp" -#include "sal/SALInst.hpp" -#include "sal/Memory.hpp" -#include "sal/Listener.hpp" -#include -#include "config/FailConfig.hpp" -#include "TracePlugin.pb.h" -#include "util/ProtoStream.hpp" #include "util/gzstream/gzstream.h" -#include "util/CommandLine.hpp" +#include "util/ProtoStream.hpp" +#include "TracePlugin.pb.h" +#include "sal/Listener.hpp" using namespace std; using namespace fail; From 15c7a863e9aa035422e12b31c668c74f1b4905de Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Tue, 17 Jun 2014 12:44:58 +0200 Subject: [PATCH 08/12] Enhance campain to use parameters. Now we need to add the parameter --tpye to chosse between memory and register injection. --- src/experiments/l4-sys/campaign.cc | 12 ++++++++++-- src/experiments/l4-sys/campaign.hpp | 10 ++++++++++ src/experiments/l4-sys/main.cc | 23 +++++++++++++++++++++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/experiments/l4-sys/campaign.cc b/src/experiments/l4-sys/campaign.cc index bd45cbec..0b111863 100644 --- a/src/experiments/l4-sys/campaign.cc +++ b/src/experiments/l4-sys/campaign.cc @@ -6,7 +6,15 @@ void L4SysCampaign::cb_send_pilot(DatabaseCampaignMessage p) { L4SysExperimentData *d = new L4SysExperimentData; d->msg.mutable_fsppilot()->CopyFrom(p); - //d->msg.set_exp_type(d->msg.GPRFLIP); - d->msg.set_exp_type(d->msg.MEM); + + if(!type.compare("mem")) { + d->msg.set_exp_type(d->msg.MEM); + } else if(!type.compare("reg")) { + d->msg.set_exp_type(d->msg.GPRFLIP); + } else { + log << "Specified FI-type not supported" << std::endl; + exit(-1); + } + fail::campaignmanager.addParam(d); } diff --git a/src/experiments/l4-sys/campaign.hpp b/src/experiments/l4-sys/campaign.hpp index ab883d30..22066c75 100644 --- a/src/experiments/l4-sys/campaign.hpp +++ b/src/experiments/l4-sys/campaign.hpp @@ -1,11 +1,16 @@ #ifndef __L4SYS_CAMPAIGN_HPP__ #define __L4SYS_CAMPAIGN_HPP__ + #include "cpn/DatabaseCampaign.hpp" #include "comm/ExperimentData.hpp" #include "l4sys.pb.h" #include +#include "util/Logger.hpp" + +#include + class L4SysExperimentData : public fail::ExperimentData { public: L4SysProtoMsg msg; @@ -17,6 +22,11 @@ class L4SysCampaign : public fail::DatabaseCampaign { { return google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("L4SysProtoMsg"); } virtual void cb_send_pilot(DatabaseCampaignMessage pilot); + + fail::Logger log; // Date: Tue, 17 Jun 2014 17:07:17 +0200 Subject: [PATCH 09/12] Code cleanup remove non-intruction-filtering part which is unused and broken --- src/experiments/l4-sys/experimentFI.cc | 13 ---- .../l4-sys/experimentPreparation.cc | 67 ++----------------- 2 files changed, 5 insertions(+), 75 deletions(-) diff --git a/src/experiments/l4-sys/experimentFI.cc b/src/experiments/l4-sys/experimentFI.cc index a2d041d3..bbfe0f6c 100644 --- a/src/experiments/l4-sys/experimentFI.cc +++ b/src/experiments/l4-sys/experimentFI.cc @@ -216,13 +216,8 @@ L4SysExperiment::prepareMemoryExperiment(int ip, int offset, int dataAddress) log << "\033[34;1mMemory fault injection\033[0m at instruction " << std::hex << offset << ", ip " << ip << ", address " << dataAddress << std::endl; -#if L4SYS_FILTER_INSTRUCTIONS setupFilteredBreakpoint(bp, offset, conf.instruction_list); assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); -#else - bp->setWatchInstructionPointer(ANY_ADDR); - bp->setCounter(offset); -#endif return bp; } @@ -240,17 +235,11 @@ L4SysExperiment::prepareRegisterExperiment(int ip, int offset, int dataAddress) << " reg data (" << reg << ", " << regOffset << ")" << std::endl; -#if L4SYS_FILTER_INSTRUCTIONS setupFilteredBreakpoint(bp, offset, conf.instruction_list); log << bp->getWatchInstructionPointer() << std::endl; log << ip << std::endl; assert(bp->getWatchInstructionPointer() == (address_t)(ip & 0xFFFFFFFF)); log << bp->getCounter() << std::endl; -#else - log << "Exp offset: " << offset << std::endl; - bp->setWatchInstructionPointer(ANY_ADDR); - bp->setCounter(offset); -#endif return bp; } @@ -356,9 +345,7 @@ void L4SysExperiment::doExperiments(fail::BPSingleListener* bp) { << " Start time " << now << ", new time " << simulator.getTimerTicks() << ", diff = " << simulator.getTimerTicks() - now << std::endl; -#if L4SYS_FILTER_INSTRUCTIONS assert(bp->getTriggerInstructionPointer() == bp->getWatchInstructionPointer()); -#endif result->set_injection_ip(bp->getTriggerInstructionPointer()); if (exp_type == param->msg.MEM) { diff --git a/src/experiments/l4-sys/experimentPreparation.cc b/src/experiments/l4-sys/experimentPreparation.cc index 42776f86..683d1fa0 100644 --- a/src/experiments/l4-sys/experimentPreparation.cc +++ b/src/experiments/l4-sys/experimentPreparation.cc @@ -78,7 +78,6 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) exit(1); } -#if L4SYS_FILTER_INSTRUCTIONS ofstream instr_list_file(conf.instruction_list.c_str(), ios::binary); RangeSetInstructionFilter filtering(conf.filter.c_str()); bp->setWatchInstructionPointer(ANY_ADDR); @@ -185,68 +184,12 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) instr_list_file.close(); log << "test function calculation position reached after " << dec << count << " instructions; " << inst_accepted << " accepted" << endl; - log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; -#else - bp->setWatchInstructionPointer(ANY_ADDR); - while (bp->getTriggerInstructionPointer() != conf.func_exit) - { - fail::BaseListener *res = simulator.resume(); - address_t curr_addr = 0; - - // XXX: See the API problem below! - if (res == &ML) { - curr_addr = ML.getTriggerInstructionPointer(); - simulator.addListener(&ML); - if ((func.address_space_trace != ANY_ADDR) && (BX_CPU(0)->cr3 != func.address_space_trace)) { - continue; - } - ++mem; - } else if (res == bp) { - curr_addr = bp->getTriggerInstructionPointer(); - assert(curr_addr == simulator.getCPU(0).getInstructionPointer()); - simulator.addListener(bp); - ++count; - } -#if 0 - if (curr_addr < 0xC0000000) // XXX filter for kernel-only experiment - continue; -#endif - currtime = simulator.getTimerTicks(); - deltatime = currtime - prevtime; + log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; + + conf.numinstr = inst_accepted; + conf.totinstr = count; - if (res == &ML) { -#if 0 - log << "Memory event IP " << std::hex << ML.getTriggerInstructionPointer() - << " @ " << ML.getTriggerAddress() << "(" - << ML.getTriggerAccessType() << "," << ML.getTriggerWidth() - << ")" << std::endl; -#endif - ++mem_valid; - - Trace_Event te; - if (deltatime != 0) { te.set_time_delta(deltatime); }; - te.set_ip(curr_addr); - te.set_memaddr(ML.getTriggerAddress()); - te.set_accesstype( (ML.getTriggerAccessType() & MemAccessEvent::MEM_READ) ? te.READ : te.WRITE ); - te.set_width(ML.getTriggerWidth()); - os->writeMessage(&te); - } else if (res == bp) { - Trace_Event e; - if (deltatime != 0) { e.set_time_delta(deltatime); }; - e.set_ip(curr_addr); - os->writeMessage(&e); - } else { - printf("Unknown res? %p\n", res); - } - prevtime = currtime; - } - log << "test function calculation position reached after " - << dec << count << " instructions; " << count << " accepted" << endl; - log << "mem accesses: " << mem << ", valid: " << mem_valid << std::endl; -#endif - conf.numinstr = inst_accepted; - conf.totinstr = count; - delete bp; + delete bp; } void L4SysExperiment::goldenRun(fail::BPSingleListener* bp) From a20d3cd12f32d73c3e71558c3d11482887267262 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Tue, 17 Jun 2014 17:08:14 +0200 Subject: [PATCH 10/12] exchange experimentInfo.hpp by experiment.conf which is know paresd during runtime (no recompile anymore) --- scripts/l4sys/l4sys-prepare.sh | 108 +++------- src/experiments/l4-sys/experiment.cc | 11 - src/experiments/l4-sys/experiment.conf | 73 +++++++ src/experiments/l4-sys/experiment.hpp | 3 +- src/experiments/l4-sys/experimentFI.cc | 1 - src/experiments/l4-sys/experimentInfo.hpp | 56 ----- src/experiments/l4-sys/experimentParameter.cc | 198 +++++++++++++----- .../l4-sys/experimentPreparation.cc | 20 +- 8 files changed, 262 insertions(+), 208 deletions(-) create mode 100644 src/experiments/l4-sys/experiment.conf delete mode 100644 src/experiments/l4-sys/experimentInfo.hpp diff --git a/scripts/l4sys/l4sys-prepare.sh b/scripts/l4sys/l4sys-prepare.sh index 9712661f..33995797 100755 --- a/scripts/l4sys/l4sys-prepare.sh +++ b/scripts/l4sys/l4sys-prepare.sh @@ -1,97 +1,43 @@ #!/bin/bash # Script to automate the preparation steps for an L4Sys experiment -# -# The L4Sys experiment manual lists four steps that need to be performed -# in order to launch an L4Sys campaign. This script automates the final -# three steps. -# -# Usage: Follow the manual. Find injection addresses and CR3 value and -# adjust experimentInfo.hpp accordingly. Then run this script. -# -# TODO: Adjust $FAILDIR to your needs! -BAK=experimentInfo.hpp.bak -CFG=experimentInfo.hpp -FAIL_CMD="fail-client -q" # -rc bochs-dbg.rc" -FAILDIR=/home/doebel/src/fail -DBNAME=fail +FAIL_CMD="fail-client" # -rc bochs-dbg.rc" +FAIL_ARGS="-f bochsrc-bd -q" +FAILDIR=/home/tstumpf/code/fail +BUILDDIR=/home/tstumpf/obj/fail +DBNAME=failtobias +BINDIR=~/local/bin -if [ -n "$1" ] ; then - if [ "$1" = "mem" ]; then - IMPORTER=MemoryImporter; - fi -fi +TYPE=$1 -if [ "$IMPORTER" = "MemoryImporter" ]; then - echo "Preparing memory injection experiment." +echo -e "\033[32;1m==========================================================================================" +echo "[$(date)] Prepare FI-Experiment ...." +echo -e "==========================================================================================\033[0m" + +if [ -n $TYPE ] ; then + if [ $TYPE = "mem" ]; then + IMPORTER=MemoryImporter; + echo "Preparing memory injection experiment." + elif [ $TYPE = "reg" ]; then + IMPORTER=RegisterImporter; + echo "Preparing register injection experiment." + else + echo "Specified experiment type not knwon"; + exit + fi else - IMPORTER=RegisterImporter; - echo "Preparing register injection experiment." + echo "Specify your experiment type (mem/reg)" + exit fi -function buildfail { - echo -e "\033[33mCompiling....\033[0m" - cd $FAILDIR/build - FAIL_BUILD_PARALLEL=16 $FAILDIR/scripts/rebuild-bochs.sh - >/dev/null - cd - -} - -function BuildNRun { - buildfail - echo -e "\033[33mRunning...\033[0m" - $FAIL_CMD $@ -} - -# backup experiment config -cp $CFG $BAK - blink_addr=$(nm -C fiasco.image| grep blink | cut -d\ -f 1) longjmp_addr=$(nm -C fiasco.image| grep longjmp | cut -d\ -f 1) -#echo -e "\033[35;1m[$(date)] ================== Step 0: Getting CR3 =================\033[0m" -#cat $BAK | sed -e 's/PREPARATION_STEP.*/PREPARATION_STEP 4/' >$CFG -#buildfail -#cr3=`$FAIL_CMD -f bochsrc-bd 2>/dev/null | grep CR3 | sed -e 's/ //g' | cut -d\= -f 2` -#echo \#defne L4SYS_ADDRESS_SPACE 0x$cr3 -#cat $BAK | sed -e "s/L4SYS_ADDRESS_SPACE .*/L4SYS_ADDRESS_SPACE 0x$cr3/" >$CFG -mv $CFG $BAK - -cat $BAK | sed -e "s/L4SYS_BREAK_BLINK .*/L4SYS_BREAK_BLINK 0x$blink_addr/" >$CFG -mv $CFG $BAK -cat $BAK | sed -e "s/L4SYS_BREAK_LONGJMP .*/L4SYS_BREAK_LONGJMP 0x$longjmp_addr/" >$CFG -mv $CFG $BAK - -echo -e "\033[35;1m[$(date)] ================== Step 1: Generating Snapshot =================\033[0m" -cat $BAK | sed -e 's/PREPARATION_STEP.*/PREPARATION_STEP 1/' >$CFG -BuildNRun -f bochsrc-bd - -echo -e "\033[35;1m[$(date)] ================== Step 2: Get Instruction Count ===============\033[0m" -cat $BAK | sed -e 's/PREPARATION_STEP.*/PREPARATION_STEP 2/' >$CFG -buildfail - -echo -e "\033[32mRunning...\033[0m" -values=`$FAIL_CMD 2>/dev/null | grep instructions\; | sed -e 's/.*after \(.*\) instructions;\(.*\) accepted/\1 \2/'` -echo $values -filtered_instr=`echo $values | cut -d\ -f 2` -total_instr=`echo $values | cut -d\ -f 1` - -echo -e "\033[35;1m[$(date)] ================== Step 3: Golden Run ==========================\033[0m" -cat $BAK | sed -e 's/PREPARATION_STEP.*/PREPARATION_STEP 3/' >$CFG -BuildNRun - -# now get ready to rumble... -echo -e "\033[35;1m[$(date)] ================== Step 4: Build Injection Client ==============\033[0m" -cat $BAK | sed -e "s/L4SYS_NUMINSTR.*/L4SYS_NUMINSTR $filtered_instr/" >$BAK.2 -cat $BAK.2 | sed -e "s/L4SYS_TOTINSTR.*/L4SYS_TOTINSTR $total_instr/" >$BAK.3 -cat $BAK.3 | sed -e "s/PREPARATION_STEP.*/PREPARATION_STEP 0/">$CFG -rm $BAK $BAK.2 $BAK.3 -buildfail - -echo -e "\033[35;1m[$(date)] ================== Step 5: Trace Import/Prune ==============\033[0m" -import-trace --importer $IMPORTER -e fiasco.image -d $DBNAME -t trace.pb -prune-trace -d $DBNAME +$BINDIR/fail-client -Wf,--step=all -Wf,--blink_addr=$blink_addr -Wf,--longjmp_addr=$longjmp_addr $FAIL_ARGS +$BINDIR/import-trace --importer $IMPORTER -e fiasco.image -d $DBNAME -t trace.pb +$BINDIR/prune-trace -d $DBNAME echo -e "\033[32;1m==========================================================================================" echo "[$(date)] Preparations are finished. Happy injecting...." diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index d3e5ed19..328f7c9c 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -8,15 +8,6 @@ using namespace std; using namespace fail; -// Check if configuration dependencies are satisfied: -#if !defined(CONFIG_EVENT_BREAKPOINTS) || !defined(CONFIG_SR_RESTORE) || \ - !defined(CONFIG_EVENT_MEMREAD) || !defined(CONFIG_EVENT_MEMWRITE) || \ - !defined(CONFIG_SR_SAVE) || \ - !defined(CONFIG_EVENT_IOPORT) -#error This experiment needs: breakpoints, memory accesses, I/O port events, \ - save, and restore. Enable these in the configuration. -#endif - L4SysExperiment::L4SysExperiment() : m_jc("localhost"), log("L4Sys", false) { @@ -37,8 +28,6 @@ void L4SysExperiment::terminate(int reason) { simulator.terminate(reason); } - - bool L4SysExperiment::run() { srand(time(NULL)); diff --git a/src/experiments/l4-sys/experiment.conf b/src/experiments/l4-sys/experiment.conf new file mode 100644 index 00000000..06ed823f --- /dev/null +++ b/src/experiments/l4-sys/experiment.conf @@ -0,0 +1,73 @@ +#experiment specific config +address_space=0x1fd77000 + +# if address_space_trace is not set then we use address_space for tracing +#address_space_trace=0x0 + +func_entry=0x20000216 +func_exit=0x2000029c + +# if filter entry/exit is not set, then (filter_entry=func_entry) and +# (filter_exit = func_exit) +filter_entry=0x2000022f +filter_exit=0x20000252 + +#default break_* value is 0 +#break_blink=0xdead +#break_longjmp=0xdead +#break_exit=0xdead + +#experiment values calculated during preparation +numinstr=16 +totinstr=58401 + +#default config +emul_ips=5000000 +max_instr_bytes=15 + +#default files +state_folder=l4sys.state +instruction_list=ip.list +golden_run=golden.out +filter=filter.list +trace=trace.pb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/experiments/l4-sys/experiment.hpp b/src/experiments/l4-sys/experiment.hpp index 34afc43c..3a6114d9 100644 --- a/src/experiments/l4-sys/experiment.hpp +++ b/src/experiments/l4-sys/experiment.hpp @@ -140,8 +140,9 @@ private: * combination. */ void doRegisterInjection(int regDesc, int bit); - + int updateConfig(std::string parameter, std::string value); + void setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset, std::string instr_list); void parseOptions(L4SysConfig&); diff --git a/src/experiments/l4-sys/experimentFI.cc b/src/experiments/l4-sys/experimentFI.cc index bbfe0f6c..215eefb5 100644 --- a/src/experiments/l4-sys/experimentFI.cc +++ b/src/experiments/l4-sys/experimentFI.cc @@ -1,7 +1,6 @@ #include #include "experiment.hpp" -#include "experimentInfo.hpp" #include "InstructionFilter.hpp" #include "UDIS86.hpp" #include "aluinstr.hpp" diff --git a/src/experiments/l4-sys/experimentInfo.hpp b/src/experiments/l4-sys/experimentInfo.hpp deleted file mode 100644 index 28b8adcf..00000000 --- a/src/experiments/l4-sys/experimentInfo.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef __L4SYS_EXPERIMENT_INFO_HPP__ - #define __L4SYS_EXPERIMENT_INFO_HPP__ - -// the maximum number of bytes in a Bochs instruction -#define MAX_INSTR_BYTES 15 - -// the bounds of the program (space, instructions and time) -// client -#define L4SYS_ADDRESS_SPACE 0x1fd77000 -// server -#define L4SYS_ADDRESS_SPACE_TRACE L4SYS_ADDRESS_SPACE -//#define L4SYS_ADDRESS_SPACE_TRACE 0x1fd4c000 - -#define L4SYS_exp_start 0x20000216 -#define L4SYS_exp_end 0x2000029c -#define L4SYS_inj_start 0x2000022f -#define L4SYS_inj_end 0x20000252 - -// FUNC_{ENTRY,EXIT} specifies the range that needs to -// be captured to log program output properly -#define L4SYS_FUNC_ENTRY L4SYS_exp_start -#define L4SYS_FUNC_EXIT L4SYS_exp_end -// FILTER_{ENTRY,EXIT} specifies the range that injections -// should be carried out on (should be a subset of the above) -// and only works with FILTER_INSTRUCTIONS turned on -#define L4SYS_FILTER_ENTRY L4SYS_inj_start -#define L4SYS_FILTER_EXIT L4SYS_inj_end - -#define L4SYS_BREAK_BLINK 0xdead -#define L4SYS_BREAK_LONGJMP 0xdead -#define L4SYS_BREAK_EXIT 0xdead - -// select instruction filtering -// XXX: this should be always on and the code should be -// reworked to do the non-filtering work with an empty -// filter list -#define L4SYS_FILTER_INSTRUCTIONS 1 - -// kernel: 2377547, userland: 79405472 -#define L4SYS_NUMINSTR 0x1 -#define L4SYS_TOTINSTR 0x1 -#define L4SYS_BOCHS_IPS 5000000 - -// several file names used -#define L4SYS_STATE_FOLDER "l4sys.state" -#define L4SYS_INSTRUCTION_LIST "ip.list" -#define L4SYS_ALU_INSTRUCTIONS "alu.list" -#define L4SYS_CORRECT_OUTPUT "golden.out" -#define L4SYS_FILTER "filter.list" - -// flags -// 0 - preparation complete -// >0 - next step to execute -#define PREPARATION_STEP 0 - -#endif // __L4SYS_EXPERIMENT_INFO_HPP__ diff --git a/src/experiments/l4-sys/experimentParameter.cc b/src/experiments/l4-sys/experimentParameter.cc index 3086e3b6..d1d9c93a 100644 --- a/src/experiments/l4-sys/experimentParameter.cc +++ b/src/experiments/l4-sys/experimentParameter.cc @@ -1,23 +1,102 @@ #include +#include +#include #include "experiment.hpp" -#include "experimentInfo.hpp" #include "util/CommandLine.hpp" using namespace std; using namespace fail; +#define EXPERIMENT_CONF "experiment.conf" + + +static void parameterMissing(fail::Logger log, string c) { + log << "Error: Missing config parameter (" << c << ")" << endl; + simulator.terminate(1); +} + +int L4SysExperiment::updateConfig(string parameter, string value) { + + bool replaced = false; + + std::list buf; + + ifstream is(EXPERIMENT_CONF); + + if (is) { + while(!is.eof()) { + string tmp; + getline(is, tmp); + if( !tmp.compare(0, parameter.length() + 1, string(parameter + "=")) ) { + buf.push_back(string(parameter + "=" + value) ); + replaced = true; + } else { + buf.push_back(tmp); + } + } + } else { + cerr << "Open config file failed" << endl; + return -1; + } + is.close(); + + ofstream os(EXPERIMENT_CONF); + + if (os) { + if(!replaced) + os << parameter << "=" << value << endl; + + while(!buf.empty()) { + os << buf.front() << endl; + buf.pop_front(); + } + } else { + cerr << "Open config file for update failed" << endl; + return -1; + } + + return 0; +} + void L4SysExperiment::parseOptions(L4SysConfig &conf) { CommandLine &cmd = CommandLine::Inst(); + ifstream fin(EXPERIMENT_CONF); + + //Currently we don't delete the parameterstring to avoid deling ptr in the cmd + //Nevertheless, we shouldn't need them, so deleting should be safe + + //We interpret the file content as parameters to our main function, so we don't + //need an own parser. Program parameters appear earlier in the parameter list + //and will overwrite the parameters from the config file. + while(fin.good()) { + string buffer; + string prefix("--"); + + getline(fin, buffer, '\n'); + + if( !(strncmp(buffer.c_str(),"#",1) == 0) && + !(strncmp(buffer.c_str()," ",1) == 0 ) && + !(strncmp(buffer.c_str(),"",1) == 0 ) ) { + string t(prefix + buffer); + //Workarround, if we just alloc t.length some of the arguments values + //disappear + char *c = (char *) malloc(t.length() * 2); + strcpy(c, t.c_str()); + cmd.add_args( c ); + } + } + + cout << "end of config file" << endl; + cmd.addOption("", "", Arg::None, "USAGE: fail-client -Wf,[option] -Wf,[option] ... "); CommandLine::option_handle HELP = cmd.addOption("h", "help", Arg::None, "-h,--help \tPrint usage and exit"); CommandLine::option_handle STEP = cmd.addOption("s", "step", Arg::Optional, "-s,--step \tSpecify preparation step, without this argumnt fail-client start in experiment mode (cr3: get CR3, cc: Create Checkpoint, it: collect instruction trace, gr: golden run, all: do the whole preparation)"); - CommandLine::option_handle OPT_MAX_INSTR_BYTES = cmd.addOption("", "max_instr_bytes", Arg::Optional, "--max_instr_bytes \t define MAX_INSTR_BYTES"); CommandLine::option_handle OPT_ADDRESS_SPACE = @@ -38,26 +117,23 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { cmd.addOption("", "break_longjmp", Arg::Optional, "--break_longjmp \t define L4SYS_BREAK_LONGJMP"); CommandLine::option_handle OPT_BREAK_EXIT = cmd.addOption("", "break_exit", Arg::Optional, "--break_exit \t define L4SYS_BREAK_EXIT"); - CommandLine::option_handle OPT_FILTER_INSTRUCTIONS = - cmd.addOption("", "filter_instructions", Arg::Optional, "--filter_instructions \t define L4SYS_FILTER_INSTRUCTIONS"); CommandLine::option_handle OPT_NUMINSTR = cmd.addOption("", "numinstr", Arg::Optional, "--numinstr \t define L4SYS_NUMINSTR"); CommandLine::option_handle OPT_TOTINSTR = cmd.addOption("", "totinstr", Arg::Optional, "--totinstr \t define L4SYS_TOTINSTR"); CommandLine::option_handle OPT_EMUL_IPS = - cmd.addOption("", "bochs_ips", Arg::Optional, "--bochs_ips \t define L4SYS_BOCHS_IPS"); + cmd.addOption("", "emul_ips", Arg::Optional, "--emul_ips \t define L4SYS_BOCHS_IPS"); CommandLine::option_handle OPT_STATE_FOLDER = cmd.addOption("", "state_folder", Arg::Optional, "--state_folder \t define L4SYS_STATE_FOLDER"); CommandLine::option_handle OPT_INSTRUCTION_LIST = cmd.addOption("", "instruction_list", Arg::Optional, "--instruction_list \t define L4SYS_INSTRUCTION_LIST"); - CommandLine::option_handle OPT_ALU_INSTRUCTIONS = - cmd.addOption("", "alu_instructions", Arg::Optional, "--alu_instructions \t define L4SYS_ALU_INSTRUCTIONS"); CommandLine::option_handle OPT_CORRECT_OUTPUT = cmd.addOption("", "golden_run", Arg::Optional, "--correct_output \t define L4SYS_CORRECT_OUTPUT"); CommandLine::option_handle OPT_FILTER = cmd.addOption("", "filter", Arg::Optional, "--filter \t define L4SYS_FILTER"); CommandLine::option_handle OPT_TRACE = cmd.addOption("", "trace", Arg::Optional, "--trace \t define outputfile for trace (default trace.pb)"); + if (!cmd.parse()) { cerr << "Error parsing arguments." << endl; @@ -68,123 +144,133 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { } if (cmd[OPT_MAX_INSTR_BYTES]) { - conf.max_instr_bytes = strtol(cmd[OPT_MAX_INSTR_BYTES].arg, NULL, 16); + conf.max_instr_bytes = strtol(cmd[OPT_MAX_INSTR_BYTES].arg, NULL, 10); + log << "max_instr_bytes: "<< dec << conf.max_instr_bytes << endl; } else { - conf.max_instr_bytes = MAX_INSTR_BYTES; + parameterMissing(log, "max_instr_bytes"); } if (cmd[OPT_ADDRESS_SPACE]) { - conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); + conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); + log << "address_space: "<< hex << conf.address_space << endl; } else { - conf.address_space = L4SYS_ADDRESS_SPACE; + parameterMissing(log, "adress_space"); } if (cmd[OPT_ADDRESS_SPACE_TRACE]) { - conf.address_space_trace = strtol(cmd[OPT_ADDRESS_SPACE_TRACE].arg, NULL, 16); + conf.address_space_trace = strtol(cmd[OPT_ADDRESS_SPACE_TRACE].arg, NULL, 16); + if( conf.address_space_trace == 0 ) + conf.address_space_trace = conf.address_space; + else + log << "address_space_trace: "<< hex << conf.address_space_trace << endl; + } else { - conf.address_space_trace = L4SYS_ADDRESS_SPACE_TRACE; + conf.address_space_trace = conf.address_space; } if (cmd[OPT_FUNC_ENTRY]) { - conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); - } else { - conf.func_entry = L4SYS_FUNC_ENTRY; + conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); + log << "func_entry: "<< hex << conf.func_entry << endl; + } else{ + parameterMissing(log, "filter_entry"); } if (cmd[OPT_FUNC_EXIT]) { - conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); + conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); + log << "func_exit: "<< hex << conf.func_exit << endl; } else { - conf.func_exit = L4SYS_FUNC_EXIT; + parameterMissing(log, "filter_exit"); } if (cmd[OPT_FILTER_ENTRY]) { - conf.filter_entry = strtol(cmd[OPT_FILTER_ENTRY].arg, NULL, 16); + conf.filter_entry = strtol(cmd[OPT_FILTER_ENTRY].arg, NULL, 16); + log << "filter_entry: "<< hex << conf.filter_entry << endl; } else { - conf.filter_entry = L4SYS_FILTER_ENTRY; + conf.filter_entry = conf.func_entry; } if (cmd[OPT_FILTER_EXIT]) { - conf.filter_exit = strtol(cmd[OPT_FILTER_EXIT].arg, NULL, 16); + conf.filter_exit = strtol(cmd[OPT_FILTER_EXIT].arg, NULL, 16); + log << "filter_exit: "<< hex << conf.filter_exit << endl; } else { - conf.filter_exit = L4SYS_FILTER_EXIT; + conf.filter_exit = conf.func_exit; } if (cmd[OPT_BREAK_BLINK]) { - conf.break_blink = strtol(cmd[OPT_BREAK_BLINK].arg, NULL, 16); + conf.break_blink = strtol(cmd[OPT_BREAK_BLINK].arg, NULL, 16); + log << "break_blink: "<< hex << conf.break_blink << endl; } else { - conf.break_blink = L4SYS_BREAK_BLINK; + conf.break_blink = 0; } if (cmd[OPT_BREAK_LONGJMP]) { - conf.break_longjmp = strtol(cmd[OPT_BREAK_LONGJMP].arg, NULL, 16); + conf.break_longjmp = strtol(cmd[OPT_BREAK_LONGJMP].arg, NULL, 16); + log << "break_longjmp: "<< hex << conf.break_longjmp << endl; } else { - conf.break_longjmp = L4SYS_BREAK_LONGJMP; + conf.break_longjmp = 0; } if (cmd[OPT_BREAK_EXIT]) { - conf.break_exit = strtol(cmd[OPT_BREAK_EXIT].arg, NULL, 16); + conf.break_exit = strtol(cmd[OPT_BREAK_EXIT].arg, NULL, 16); + log << "break_exit: "<< hex << conf.break_exit << endl; } else { - conf.break_exit = L4SYS_BREAK_EXIT; - } - - if (cmd[OPT_FILTER_INSTRUCTIONS]) { - conf.filter_instructions = strtol(cmd[OPT_FILTER_INSTRUCTIONS].arg, NULL, 16); - } else { - conf.filter_instructions = L4SYS_FILTER_INSTRUCTIONS; + conf.break_exit = 0; } if (cmd[OPT_NUMINSTR]) { - conf.numinstr = strtol(cmd[OPT_NUMINSTR].arg, NULL, 16); + conf.numinstr = strtol(cmd[OPT_NUMINSTR].arg, NULL, 10); + log << "numinstr: "<< dec << conf.numinstr << endl; } else { - conf.numinstr = L4SYS_NUMINSTR; + parameterMissing(log, "numinstr"); } if (cmd[OPT_TOTINSTR]) { - conf.totinstr = strtol(cmd[OPT_TOTINSTR].arg, NULL, 16); + conf.totinstr = strtol(cmd[OPT_TOTINSTR].arg, NULL, 10); + log << "totinstr: "<< dec << conf.totinstr << endl; } else { - conf.totinstr = L4SYS_TOTINSTR; + parameterMissing(log, "totinstr"); } if (cmd[OPT_EMUL_IPS]) { - conf.emul_ips = strtol(cmd[OPT_EMUL_IPS].arg, NULL, 16); + conf.emul_ips = strtol(cmd[OPT_EMUL_IPS].arg, NULL, 10); + log << "emul_ips = " << dec << conf.emul_ips << endl; } else { - conf.emul_ips = L4SYS_BOCHS_IPS; + parameterMissing(log, "emul_ips"); } if (cmd[OPT_STATE_FOLDER]) { - conf.state_folder = std::string(cmd[OPT_STATE_FOLDER].arg); + conf.state_folder = std::string(cmd[OPT_STATE_FOLDER].arg); + log << "state_folder: "<< conf.state_folder << endl; } else { - conf.state_folder = L4SYS_STATE_FOLDER; + conf.state_folder = "l4sys.state"; } if (cmd[OPT_INSTRUCTION_LIST]) { - conf.instruction_list = std::string(cmd[OPT_INSTRUCTION_LIST].arg); + conf.instruction_list = std::string(cmd[OPT_INSTRUCTION_LIST].arg); + log << "instruction_list: "<< conf.instruction_list << endl; } else { - conf.instruction_list = L4SYS_INSTRUCTION_LIST; - } - - if (cmd[OPT_ALU_INSTRUCTIONS]) { - conf.alu_instructions = std::string(cmd[OPT_ALU_INSTRUCTIONS].arg); - } else { - conf.alu_instructions = L4SYS_ALU_INSTRUCTIONS; + conf.instruction_list = "ip.list"; } if (cmd[OPT_CORRECT_OUTPUT]) { - conf.golden_run = std::string(cmd[OPT_CORRECT_OUTPUT].arg); + conf.golden_run = std::string(cmd[OPT_CORRECT_OUTPUT].arg); + log << "golden_run: "<< conf.golden_run << endl; } else { - conf.golden_run = L4SYS_CORRECT_OUTPUT; + conf.golden_run = "golden.out"; } if (cmd[OPT_FILTER]) { - conf.filter = std::string(cmd[OPT_FILTER].arg); + conf.filter = std::string(cmd[OPT_FILTER].arg); + log << "filter: "<< conf.filter << endl; } else { - conf.filter = L4SYS_FILTER; + conf.filter = "filter.list"; } if (cmd[OPT_TRACE]) { - conf.trace = std::string(cmd[OPT_TRACE].arg); + conf.trace = std::string(cmd[OPT_TRACE].arg); + log << "trace: "<< conf.trace << endl; } else { - conf.trace = std::string("trace.pb"); + conf.trace = "trace.pb"; } if (cmd[STEP]) { diff --git a/src/experiments/l4-sys/experimentPreparation.cc b/src/experiments/l4-sys/experimentPreparation.cc index 683d1fa0..644de464 100644 --- a/src/experiments/l4-sys/experimentPreparation.cc +++ b/src/experiments/l4-sys/experimentPreparation.cc @@ -1,7 +1,9 @@ #include +#include +#include +#include #include "experiment.hpp" -#include "experimentInfo.hpp" #include "InstructionFilter.hpp" #include "aluinstr.hpp" @@ -47,7 +49,11 @@ void L4SysExperiment::runToStart(fail::BPSingleListener *bp) conf.address_space_trace = BX_CPU(0)->cr3; } - conf.address_space = BX_CPU(0)->cr3; + conf.address_space = BX_CPU(0)->cr3; + + char tmp[20]; + sprintf(tmp, "0x%lx", BX_CPU(0)->cr3); + updateConfig("address_space", tmp ); } @@ -189,6 +195,16 @@ void L4SysExperiment::collectInstructionTrace(fail::BPSingleListener* bp) conf.numinstr = inst_accepted; conf.totinstr = count; + //Write new values into config file + char numimstr_str[20]; + + sprintf(numimstr_str, "%li", inst_accepted); + updateConfig("numinstr", numimstr_str ); + + char totinstr_str[20]; + sprintf(totinstr_str, "%li", count); + updateConfig("totinstr", totinstr_str); + delete bp; } From 329e5571addd7e1f9369010d4bced8d7b4f51794 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Thu, 19 Jun 2014 19:23:46 +0200 Subject: [PATCH 11/12] Add config parameter to specify the hostname or ip addr. of the campain server. Add some documentiation to experiment.hpp --- src/experiments/l4-sys/experiment.cc | 3 ++- src/experiments/l4-sys/experiment.conf | 1 + src/experiments/l4-sys/experiment.hpp | 27 ++++++++++++++----- src/experiments/l4-sys/experimentParameter.cc | 20 ++++++++++++-- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/experiments/l4-sys/experiment.cc b/src/experiments/l4-sys/experiment.cc index 328f7c9c..728cb6f7 100644 --- a/src/experiments/l4-sys/experiment.cc +++ b/src/experiments/l4-sys/experiment.cc @@ -9,7 +9,7 @@ using namespace std; using namespace fail; L4SysExperiment::L4SysExperiment() - : m_jc("localhost"), log("L4Sys", false) + : log("L4Sys", false) { param = new L4SysExperimentData; } @@ -71,6 +71,7 @@ bool L4SysExperiment::run() } default: { BPSingleListener *bp = 0; + m_jc = fail::JobClient(conf.campain_server.c_str()); doExperiments(bp); } } diff --git a/src/experiments/l4-sys/experiment.conf b/src/experiments/l4-sys/experiment.conf index 06ed823f..cb2d7a42 100644 --- a/src/experiments/l4-sys/experiment.conf +++ b/src/experiments/l4-sys/experiment.conf @@ -24,6 +24,7 @@ totinstr=58401 #default config emul_ips=5000000 max_instr_bytes=15 +campain_server=localhost #default files state_folder=l4sys.state diff --git a/src/experiments/l4-sys/experiment.hpp b/src/experiments/l4-sys/experiment.hpp index 3a6114d9..9d1f9cd5 100644 --- a/src/experiments/l4-sys/experiment.hpp +++ b/src/experiments/l4-sys/experiment.hpp @@ -82,22 +82,22 @@ private: */ void terminateWithError(std::string details, int reason, L4SysProtoMsg_Result*); /** - * Run until L4SYS_FUNC_ENTRY and save state (experiment preparation, - * phase 1) + * Run until reaching the entry point of the experiment and save + * state. */ void runToStart(fail::BPSingleListener *bp); /** * Collect list of executed instructions, considering instruction - * filtering if configured (experiment preparation, phase 2). + * filtering if configured. */ void collectInstructionTrace(fail::BPSingleListener* bp); /** - * Perform the golden run (experiment preparation, phase 3) + * Perform the golden run. */ void goldenRun(fail::BPSingleListener* bp); /** - * Doing fault injection expiriments (experiment preparation, phase 0) + * Doing fault injection expiriments. */ void doExperiments(fail::BPSingleListener *bp); @@ -141,12 +141,24 @@ private: */ void doRegisterInjection(int regDesc, int bit); - int updateConfig(std::string parameter, std::string value); - void setupFilteredBreakpoint(fail::BPSingleListener* bp, int instOffset, std::string instr_list); + /** + * Updates a parameter of the config file or adds a new one + * if the parameter was not specified. + */ + int updateConfig(std::string parameter, std::string value); + + /** + * Adds the value of the config file to the parameter list and + * parse the parameter list. This function makes use of the + * CommandLine Parser from the fail* framework. + */ void parseOptions(L4SysConfig&); + /** + * Configuration Setup. + */ class L4SysConfig { public: unsigned long int max_instr_bytes; @@ -167,6 +179,7 @@ private: std::string golden_run; std::string filter; std::string trace; + std::string campain_server; unsigned long int numinstr; unsigned long int totinstr; diff --git a/src/experiments/l4-sys/experimentParameter.cc b/src/experiments/l4-sys/experimentParameter.cc index d1d9c93a..2d3c43d5 100644 --- a/src/experiments/l4-sys/experimentParameter.cc +++ b/src/experiments/l4-sys/experimentParameter.cc @@ -133,6 +133,8 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { cmd.addOption("", "filter", Arg::Optional, "--filter \t define L4SYS_FILTER"); CommandLine::option_handle OPT_TRACE = cmd.addOption("", "trace", Arg::Optional, "--trace \t define outputfile for trace (default trace.pb)"); + CommandLine::option_handle OPT_CAMPAIN_SERVER = + cmd.addOption("", "campain_server", Arg::Optional, "--campain_server \t specify the hostname of the campain server (default localhost)"); if (!cmd.parse()) { @@ -153,8 +155,12 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { if (cmd[OPT_ADDRESS_SPACE]) { conf.address_space = strtol(cmd[OPT_ADDRESS_SPACE].arg, NULL, 16); log << "address_space: "<< hex << conf.address_space << endl; + + //Confi address_space=0 means no address space filtering + if (conf.address_space == 0) + conf.address_space = fail::ANY_ADDR; } else { - parameterMissing(log, "adress_space"); + conf.address_space = fail::ANY_ADDR; } if (cmd[OPT_ADDRESS_SPACE_TRACE]) { @@ -163,11 +169,14 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { conf.address_space_trace = conf.address_space; else log << "address_space_trace: "<< hex << conf.address_space_trace << endl; - } else { conf.address_space_trace = conf.address_space; } + + if (conf.address_space_trace == 0) + conf.address_space_trace = fail::ANY_ADDR; + if (cmd[OPT_FUNC_ENTRY]) { conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); log << "func_entry: "<< hex << conf.func_entry << endl; @@ -273,6 +282,13 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { conf.trace = "trace.pb"; } + if (cmd[OPT_CAMPAIN_SERVER]) { + conf.campain_server = std::string(cmd[OPT_CAMPAIN_SERVER].arg); + log << "campain_server: "<< conf.campain_server << endl; + } else { + conf.campain_server = "localhost"; + } + if (cmd[STEP]) { if (!std::string("cr3").compare(cmd[STEP].arg) ) { log << "calculate cr3" << endl; From 820a57a3a1529deca35689075e123cf69fd2e4f9 Mon Sep 17 00:00:00 2001 From: Tobias Stumpf Date: Fri, 20 Jun 2014 15:09:42 +0200 Subject: [PATCH 12/12] Update documentation and fix typo --- src/experiments/l4-sys/experiment.conf | 6 +- src/experiments/l4-sys/experimentParameter.cc | 4 +- src/experiments/l4-sys/manual.pdf | Bin 172322 -> 149705 bytes src/experiments/l4-sys/manual.tex | 199 +++++++----------- 4 files changed, 82 insertions(+), 127 deletions(-) diff --git a/src/experiments/l4-sys/experiment.conf b/src/experiments/l4-sys/experiment.conf index cb2d7a42..05713001 100644 --- a/src/experiments/l4-sys/experiment.conf +++ b/src/experiments/l4-sys/experiment.conf @@ -4,11 +4,15 @@ address_space=0x1fd77000 # if address_space_trace is not set then we use address_space for tracing #address_space_trace=0x0 +# specifies the range that needs to be captured to log program output properly func_entry=0x20000216 func_exit=0x2000029c +# specifies the range that injections should be carried out on (should be a +subset of the above) # if filter entry/exit is not set, then (filter_entry=func_entry) and -# (filter_exit = func_exit) +# (filter_exit = func_exit), the filter range have to be a supset of +# the function filter_entry=0x2000022f filter_exit=0x20000252 diff --git a/src/experiments/l4-sys/experimentParameter.cc b/src/experiments/l4-sys/experimentParameter.cc index 2d3c43d5..3a978360 100644 --- a/src/experiments/l4-sys/experimentParameter.cc +++ b/src/experiments/l4-sys/experimentParameter.cc @@ -181,14 +181,14 @@ void L4SysExperiment::parseOptions(L4SysConfig &conf) { conf.func_entry = strtol(cmd[OPT_FUNC_ENTRY].arg, NULL, 16); log << "func_entry: "<< hex << conf.func_entry << endl; } else{ - parameterMissing(log, "filter_entry"); + parameterMissing(log, "func_entry"); } if (cmd[OPT_FUNC_EXIT]) { conf.func_exit = strtol(cmd[OPT_FUNC_EXIT].arg, NULL, 16); log << "func_exit: "<< hex << conf.func_exit << endl; } else { - parameterMissing(log, "filter_exit"); + parameterMissing(log, "func_exit"); } if (cmd[OPT_FILTER_ENTRY]) { diff --git a/src/experiments/l4-sys/manual.pdf b/src/experiments/l4-sys/manual.pdf index 0902a40f93d1736a98732863029711def72a5e3f..9f340b93b52f427d81d2447228caba6312d4c33f 100644 GIT binary patch delta 123010 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�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�B%K>AG)kQF&FGk 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