First steps to integrate the fourth experiment type, still debugging
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1587 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
@ -10,6 +10,7 @@ set(MY_PROTOS
|
|||||||
)
|
)
|
||||||
|
|
||||||
set(MY_CAMPAIGN_SRCS
|
set(MY_CAMPAIGN_SRCS
|
||||||
|
aluinstr.hpp
|
||||||
experiment.hpp
|
experiment.hpp
|
||||||
experiment.cc
|
experiment.cc
|
||||||
campaign.hpp
|
campaign.hpp
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
#ifndef __L4SYS_ALUINSTR_HPP__
|
#ifndef __L4SYS_ALUINSTR_HPP__
|
||||||
#define __L4SYS_ALUINSTR_HPP__
|
#define __L4SYS_ALUINSTR_HPP__
|
||||||
|
|
||||||
|
#if 0
|
||||||
/**
|
/**
|
||||||
* Forward declaration of the Bochs instruction decode table.
|
* Forward declaration of the Bochs instruction decode table.
|
||||||
* This is necessary because, inconveniently, it is not declared in a header file.
|
* This is necessary because, inconveniently, it is not declared in a header file.
|
||||||
*/
|
*/
|
||||||
#include "cpu/fetchdecode.h"
|
#include "cpu/fetchdecode.h"
|
||||||
static const BxOpcodeInfo_t *BxOpcodeInfo32;
|
static const BxOpcodeInfo_t *BxOpcodeInfo32;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trying to order X86 ALU instructions.
|
* Trying to order X86 ALU instructions.
|
||||||
@ -54,7 +56,10 @@ struct BochsALUInstr {
|
|||||||
Bit8u opcode;
|
Bit8u opcode;
|
||||||
/**
|
/**
|
||||||
* the reg part of the modr/m field (known as nnn in bxInstruction_c)
|
* the reg part of the modr/m field (known as nnn in bxInstruction_c)
|
||||||
* A value of 8 or higher marks this field unused.
|
* it is used to
|
||||||
|
* a) further subdivide the functionality of a given opcode
|
||||||
|
* b) specify a register the instruction is supposed to use
|
||||||
|
* In this class, a value of 8 or higher marks this field unused.
|
||||||
*/
|
*/
|
||||||
Bit8u reg;
|
Bit8u reg;
|
||||||
/**
|
/**
|
||||||
@ -63,7 +68,7 @@ struct BochsALUInstr {
|
|||||||
* to their opcode. It is necessary to store this separately for
|
* to their opcode. It is necessary to store this separately for
|
||||||
* several reasons, one being the ability to separate
|
* several reasons, one being the ability to separate
|
||||||
* ALU input latch faults from ALU instruction latch faults.
|
* ALU input latch faults from ALU instruction latch faults.
|
||||||
* A value of 8 or higher marks this field unused.
|
* In this class, a value of 8 or higher marks this field unused.
|
||||||
*/
|
*/
|
||||||
Bit8u opcodeRegisterOffset;
|
Bit8u opcodeRegisterOffset;
|
||||||
/**
|
/**
|
||||||
@ -141,90 +146,77 @@ const BochsALUInstr aluInstructions [] = {
|
|||||||
#undef SHIFTOPS
|
#undef SHIFTOPS
|
||||||
/* --- \\\ SHIFT OPERATIONS /// --- */
|
/* --- \\\ SHIFT OPERATIONS /// --- */
|
||||||
|
|
||||||
/**
|
/* --- /// BINARY OPERATIONS \\\ --- */
|
||||||
*
|
|
||||||
* The remaining instructions, roughly ordered,
|
|
||||||
* in the form of a (probably obsolete) experiment method
|
|
||||||
* /**
|
|
||||||
* Assigns a given opcode a class of ALU instructions
|
|
||||||
* @param opcode the opcode to examine
|
|
||||||
* @returns an enum AluClass object
|
|
||||||
|
|
||||||
X86AluClass isALUInstruction(unsigned opcode);
|
// reg, immediate
|
||||||
*
|
|
||||||
* X86AluClass L4SysExperiment::isALUInstruction(unsigned opcode) {
|
// a macro to reduce copy-paste overhead
|
||||||
switch (opcode) {
|
#define BINOPS(IACODE, OPCODE8, OPCODE16) \
|
||||||
case BX_IA_ADC_EbGb:
|
{ BX_IA_##IACODE##_ALIb, OPCODE8, 8, 8, ALU_IMM8_REG }, \
|
||||||
case BX_IA_ADC_EdGd:
|
{ BX_IA_##IACODE##_AXIw, OPCODE16, 8, 8, ALU_IMM16_REG }, \
|
||||||
case BX_IA_ADC_EwGw:
|
{ BX_IA_##IACODE##_EAXId, OPCODE16, 8, 8, ALU_IMM32_REG }
|
||||||
case BX_IA_ADD_EbGb:
|
|
||||||
case BX_IA_ADD_EdGd:
|
// register ax, immediate
|
||||||
case BX_IA_ADD_EwGw:
|
BINOPS(ADC, 0x14, 0x15),
|
||||||
case BX_IA_AND_EbGb:
|
BINOPS(ADD, 0x04, 0x05),
|
||||||
case BX_IA_AND_EdGd:
|
BINOPS(AND, 0x24, 0x25),
|
||||||
case BX_IA_AND_EwGw:
|
BINOPS(CMP, 0x3C, 0x3D),
|
||||||
case BX_IA_CMP_EbGb:
|
BINOPS(OR, 0x0C, 0x0D),
|
||||||
case BX_IA_CMP_EdGd:
|
BINOPS(SBB, 0x1C, 0x1D),
|
||||||
case BX_IA_CMP_EwGw:
|
BINOPS(SUB, 0x2C, 0x2D),
|
||||||
case BX_IA_OR_EbGb:
|
BINOPS(XOR, 0x34, 0x35),
|
||||||
case BX_IA_OR_EdGd:
|
#undef BINOPS
|
||||||
case BX_IA_OR_EwGw:
|
|
||||||
case BX_IA_SBB_EbGb:
|
// a macro to reduce copy-paste overhead
|
||||||
case BX_IA_SBB_EdGd:
|
#define BINOPS(IACODE, OPCODE8, OPCODE16) \
|
||||||
case BX_IA_SBB_EwGw:
|
{ BX_IA_##IACODE##_EbGb, OPCODE8, 7, 8, ALU_IMM8_RM8 }, \
|
||||||
case BX_IA_SUB_EbGb:
|
{ BX_IA_##IACODE##_EwGw, OPCODE16, 7, 8, ALU_IMM16_RM16 }, \
|
||||||
case BX_IA_SUB_EdGd:
|
{ BX_IA_##IACODE##_EdGd, OPCODE16, 7, 8, ALU_IMM32_RM32 }
|
||||||
case BX_IA_SUB_EwGw:
|
// r/m, arbitrary register
|
||||||
case BX_IA_XOR_EbGb:
|
BINOPS(ADC, 0x10, 0x11),
|
||||||
case BX_IA_XOR_EdGd:
|
BINOPS(ADD, 0x00, 0x01),
|
||||||
case BX_IA_XOR_EwGw:
|
BINOPS(AND, 0x20, 0x21),
|
||||||
case BX_IA_ADC_ALIb:
|
BINOPS(CMP, 0x38, 0x39),
|
||||||
case BX_IA_ADC_AXIw:
|
BINOPS(OR, 0x08, 0x09),
|
||||||
case BX_IA_ADC_EAXId:
|
BINOPS(SBB, 0x18, 0x19),
|
||||||
case BX_IA_ADD_EbIb:
|
BINOPS(SUB, 0x28, 0x29),
|
||||||
case BX_IA_OR_EbIb:
|
BINOPS(XOR, 0x30, 0x31),
|
||||||
case BX_IA_ADC_EbIb:
|
#undef BINOPS
|
||||||
case BX_IA_SBB_EbIb:
|
|
||||||
case BX_IA_AND_EbIb:
|
#define BINOPS(IACODE, OPCODE8, OPCODE16) \
|
||||||
case BX_IA_SUB_EbIb:
|
{ BX_IA_##IACODE##_GbEb, OPCODE8, 7, 8, ALU_IMM8_RM8 }, \
|
||||||
case BX_IA_XOR_EbIb:
|
{ BX_IA_##IACODE##_GwEw, OPCODE16, 7, 8, ALU_IMM16_RM16 }, \
|
||||||
case BX_IA_CMP_EbIb:
|
{ BX_IA_##IACODE##_GdEd, OPCODE16, 7, 8, ALU_IMM32_RM32 }
|
||||||
case BX_IA_ADD_EwIw:
|
// arbitrary register, r/m
|
||||||
case BX_IA_OR_EwIw:
|
BINOPS(ADC, 0x12, 0x13),
|
||||||
case BX_IA_ADC_EwIw:
|
BINOPS(ADD, 0x02, 0x03),
|
||||||
case BX_IA_SBB_EwIw:
|
BINOPS(AND, 0x22, 0x23),
|
||||||
case BX_IA_AND_EwIw:
|
BINOPS(CMP, 0x3a, 0x3b),
|
||||||
case BX_IA_SUB_EwIw:
|
BINOPS(OR, 0x0a, 0x0b),
|
||||||
case BX_IA_XOR_EwIw:
|
BINOPS(SBB, 0x1a, 0x1b),
|
||||||
case BX_IA_CMP_EwIw:
|
BINOPS(SUB, 0x2a, 0x2b),
|
||||||
case BX_IA_ADD_EdId:
|
BINOPS(XOR, 0x32, 0x33),
|
||||||
case BX_IA_OR_EdId:
|
#undef BINOPS
|
||||||
case BX_IA_ADC_EdId:
|
|
||||||
case BX_IA_SBB_EdId:
|
// a macro to reduce copy-paste overhead
|
||||||
case BX_IA_AND_EdId:
|
#define BINOPS(OPCODE, WDE, WDI, CLASS) \
|
||||||
case BX_IA_SUB_EdId:
|
{ BX_IA_ADC_E##WDE##I##WDI, OPCODE, 2, 8, CLASS }, \
|
||||||
case BX_IA_XOR_EdId:
|
{ BX_IA_ADD_E##WDE##I##WDI, OPCODE, 0, 8, CLASS }, \
|
||||||
case BX_IA_CMP_EdId:
|
{ BX_IA_AND_E##WDE##I##WDI, OPCODE, 4, 8, CLASS }, \
|
||||||
case BX_IA_ADC_GbEb:
|
{ BX_IA_CMP_E##WDE##I##WDI, OPCODE, 7, 8, CLASS }, \
|
||||||
case BX_IA_ADC_GwEw:
|
{ BX_IA_OR_E##WDE##I##WDI, OPCODE, 1, 8, CLASS }, \
|
||||||
case BX_IA_ADC_GdEd:
|
{ BX_IA_SBB_E##WDE##I##WDI, OPCODE, 3, 8, CLASS }, \
|
||||||
case BX_IA_ADD_ALIb:
|
{ BX_IA_SUB_E##WDE##I##WDI, OPCODE, 5, 8, CLASS }, \
|
||||||
case BX_IA_ADD_AXIw:
|
{ BX_IA_XOR_E##WDE##I##WDI, OPCODE, 6, 8, CLASS }
|
||||||
case BX_IA_ADD_EAXId:
|
|
||||||
case BX_IA_ADD_GbEb:
|
BINOPS(80, b, b, ALU_IMM8_RM8),
|
||||||
case BX_IA_ADD_GwEw:
|
BINOPS(81, w, w, ALU_IMM16_RM16),
|
||||||
case BX_IA_ADD_GdEd:
|
BINOPS(81, d, d, ALU_IMM32_RM32),
|
||||||
case BX_IA_AND_ALIb:
|
BINOPS(83, w, w, ALU_IMM8_RM16),
|
||||||
case BX_IA_AND_AXIw:
|
BINOPS(83, d, d, ALU_IMM8_RM32),
|
||||||
case BX_IA_AND_EAXId:
|
#undef BINOPS
|
||||||
case BX_IA_AND_GbEb:
|
|
||||||
case BX_IA_AND_GwEw:
|
/* --- \\\ BINARY OPERATIONS /// --- */
|
||||||
case BX_IA_AND_GdEd:
|
|
||||||
default:
|
|
||||||
return ALU_UNDEF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __L4SYS_ALUINSTR_HPP__
|
#endif // __L4SYS_ALUINSTR_HPP__
|
||||||
|
|||||||
@ -63,7 +63,7 @@ bool L4SysCampaign::run() {
|
|||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
for (int i = 0; i < 25; ++i) {
|
for (int i = 0; i < 25; ++i) {
|
||||||
L4SysExperimentData *d = new L4SysExperimentData;
|
L4SysExperimentData *d = new L4SysExperimentData;
|
||||||
d->msg.set_exp_type(d->msg.GPRFLIP);
|
d->msg.set_exp_type(d->msg.IDCFLIP);
|
||||||
// modify for a random instruction
|
// modify for a random instruction
|
||||||
int instr_offset = rand() % L4SYS_NUMINSTR;
|
int instr_offset = rand() % L4SYS_NUMINSTR;
|
||||||
d->msg.set_instr_offset(instr_offset);
|
d->msg.set_instr_offset(instr_offset);
|
||||||
|
|||||||
@ -20,10 +20,6 @@
|
|||||||
|
|
||||||
#include "l4sys.pb.h"
|
#include "l4sys.pb.h"
|
||||||
|
|
||||||
// FIXME libudis86 test -- remove me
|
|
||||||
#include <udis86.h>
|
|
||||||
void foo() { ud_t x; ud_init(&x); }
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace fail;
|
using namespace fail;
|
||||||
|
|
||||||
@ -160,34 +156,24 @@ bool L4SysExperiment::run() {
|
|||||||
|
|
||||||
log << "startup" << endl;
|
log << "startup" << endl;
|
||||||
|
|
||||||
struct stat teststruct;
|
#if PREPARATION_STEP == 1
|
||||||
// STEP 1: run until interesting function starts, and save state
|
// STEP 1: run until interesting function starts, and save state
|
||||||
if (stat(L4SYS_STATE_FOLDER, &teststruct) == -1) {
|
bp.setWatchInstructionPointer(L4SYS_FUNC_ENTRY);
|
||||||
bp.setWatchInstructionPointer(L4SYS_FUNC_ENTRY);
|
simulator.addListenerAndResume(&bp);
|
||||||
simulator.addListenerAndResume(&bp);
|
|
||||||
|
|
||||||
log << "test function entry reached, saving state" << endl;
|
|
||||||
log << "EIP = " << hex << bp.getTriggerInstructionPointer() << " or "
|
|
||||||
<< simulator.getRegisterManager().getInstructionPointer()
|
|
||||||
<< endl;
|
|
||||||
simulator.save(L4SYS_STATE_FOLDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
log << "test function entry reached, saving state" << endl;
|
||||||
|
log << "EIP = " << hex << bp.getTriggerInstructionPointer() << " or "
|
||||||
|
<< simulator.getRegisterManager().getInstructionPointer()
|
||||||
|
<< endl;
|
||||||
|
simulator.save(L4SYS_STATE_FOLDER);
|
||||||
|
#elif PREPARATION_STEP == 2
|
||||||
// STEP 2: determine instructions executed
|
// STEP 2: determine instructions executed
|
||||||
#ifdef PREPARE_EXPERIMENT
|
|
||||||
log << "restoring state" << endl;
|
|
||||||
simulator.restore(L4SYS_STATE_FOLDER);
|
|
||||||
log << "EIP = " << hex
|
|
||||||
<< simulator.getRegisterManager().getInstructionPointer()
|
|
||||||
<< endl;
|
|
||||||
|
|
||||||
// make sure the timer interrupt doesn't disturb us
|
// count the first instruction which has already been executed
|
||||||
simulator.addSuppressedInterrupt(0);
|
int count = 1;
|
||||||
|
int ul = 1, kernel = 0;
|
||||||
int count;
|
|
||||||
int ul = 0, kernel = 0;
|
|
||||||
bp.setWatchInstructionPointer(ANY_ADDR);
|
bp.setWatchInstructionPointer(ANY_ADDR);
|
||||||
for (count = 0; bp.getTriggerInstructionPointer() != L4SYS_FUNC_EXIT; ++count) {
|
for (; bp.getTriggerInstructionPointer() != L4SYS_FUNC_EXIT; ++count) {
|
||||||
simulator.addListenerAndResume(&bp);
|
simulator.addListenerAndResume(&bp);
|
||||||
if(bp.getTriggerInstructionPointer() < 0xC0000000) {
|
if(bp.getTriggerInstructionPointer() < 0xC0000000) {
|
||||||
ul++;
|
ul++;
|
||||||
@ -198,7 +184,35 @@ bool L4SysExperiment::run() {
|
|||||||
}
|
}
|
||||||
log << "test function calculation position reached after " << dec << count << " instructions; "
|
log << "test function calculation position reached after " << dec << count << " instructions; "
|
||||||
<< "ul: " << ul << ", kernel: " << kernel << endl;
|
<< "ul: " << ul << ", kernel: " << kernel << endl;
|
||||||
#else
|
#elif PREPARATION_STEP == 3
|
||||||
|
// STEP 3: determine the output of a "golden run"
|
||||||
|
log << "restoring state" << endl;
|
||||||
|
simulator.restore(L4SYS_STATE_FOLDER);
|
||||||
|
log << "EIP = " << hex
|
||||||
|
<< simulator.getRegisterManager().getInstructionPointer()
|
||||||
|
<< endl;
|
||||||
|
|
||||||
|
ofstream golden_run_file(L4SYS_CORRECT_OUTPUT);
|
||||||
|
bp.setWatchInstructionPointer(L4SYS_FUNC_EXIT);
|
||||||
|
bp.setCounter(L4SYS_ITERATION_COUNT);
|
||||||
|
simulator.addListener(&bp);
|
||||||
|
BaseListener* ev = waitIOOrOther(true);
|
||||||
|
if (ev == &bp) {
|
||||||
|
golden_run.assign(output.c_str());
|
||||||
|
golden_run_file << output.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();
|
||||||
|
simulator.terminate(10);
|
||||||
|
}
|
||||||
|
simulator.clearListeners();
|
||||||
|
bp.setCounter(1);
|
||||||
|
log << "saving output generated during normal execution" << endl;
|
||||||
|
golden_run_file.close();
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// the files currently get too big.
|
// the files currently get too big.
|
||||||
/* I do not really have a clever idea to solve this.
|
/* I do not really have a clever idea to solve this.
|
||||||
@ -260,38 +274,13 @@ bool L4SysExperiment::run() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// STEP 3: determine the output of a "golden run"
|
#elif PREPARATION_STEP == 0
|
||||||
if (stat(L4SYS_CORRECT_OUTPUT, &teststruct) == -1) {
|
// LAST STEP: The actual experiment.
|
||||||
log << "restoring state" << endl;
|
struct stat teststruct;
|
||||||
simulator.restore(L4SYS_STATE_FOLDER);
|
if (stat(L4SYS_STATE_FOLDER, &teststruct) == -1 || stat(L4SYS_CORRECT_OUTPUT, &teststruct) == -1) {
|
||||||
log << "EIP = " << hex
|
log << "Important data missing - call \"prepare\" first." << endl;
|
||||||
<< simulator.getRegisterManager().getInstructionPointer()
|
simulator.terminate(1);
|
||||||
<< endl;
|
}
|
||||||
|
|
||||||
// make sure the timer interrupt doesn't disturb us
|
|
||||||
simulator.addSuppressedInterrupt(0);
|
|
||||||
|
|
||||||
ofstream golden_run_file(L4SYS_CORRECT_OUTPUT);
|
|
||||||
bp.setWatchInstructionPointer(L4SYS_FUNC_EXIT);
|
|
||||||
bp.setCounter(L4SYS_ITERATION_COUNT);
|
|
||||||
simulator.addListener(&bp);
|
|
||||||
BaseListener* ev = waitIOOrOther(true);
|
|
||||||
if (ev == &bp) {
|
|
||||||
golden_run.assign(output.c_str());
|
|
||||||
golden_run_file << output.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();
|
|
||||||
simulator.terminate(10);
|
|
||||||
}
|
|
||||||
simulator.clearListeners();
|
|
||||||
bp.setCounter(1);
|
|
||||||
log << "saving output generated during normal execution" << endl;
|
|
||||||
golden_run_file.close();
|
|
||||||
} else {
|
|
||||||
ifstream golden_run_file(L4SYS_CORRECT_OUTPUT);
|
ifstream golden_run_file(L4SYS_CORRECT_OUTPUT);
|
||||||
|
|
||||||
golden_run.reserve(teststruct.st_size);
|
golden_run.reserve(teststruct.st_size);
|
||||||
@ -303,9 +292,7 @@ bool L4SysExperiment::run() {
|
|||||||
|
|
||||||
//the generated output probably has a similar length
|
//the generated output probably has a similar length
|
||||||
output.reserve(teststruct.st_size);
|
output.reserve(teststruct.st_size);
|
||||||
}
|
|
||||||
|
|
||||||
// STEP 4: The actual experiment.
|
|
||||||
log << "restoring state" << endl;
|
log << "restoring state" << endl;
|
||||||
simulator.restore(L4SYS_STATE_FOLDER);
|
simulator.restore(L4SYS_STATE_FOLDER);
|
||||||
|
|
||||||
@ -366,7 +353,7 @@ bool L4SysExperiment::run() {
|
|||||||
// this is a twisted one
|
// this is a twisted one
|
||||||
|
|
||||||
// initial definitions
|
// initial definitions
|
||||||
bxICacheEntry_c *cache_entry = simulator.getCPUContext()->getICacheEntry();
|
bxICacheEntry_c *cache_entry = simulator.getICacheEntry();
|
||||||
unsigned length_in_bits = cache_entry->i->ilen() << 3;
|
unsigned length_in_bits = cache_entry->i->ilen() << 3;
|
||||||
|
|
||||||
// get the instruction in plain text in inject the error there
|
// get the instruction in plain text in inject the error there
|
||||||
|
|||||||
@ -6,8 +6,7 @@
|
|||||||
#include "efw/ExperimentFlow.hpp"
|
#include "efw/ExperimentFlow.hpp"
|
||||||
#include "efw/JobClient.hpp"
|
#include "efw/JobClient.hpp"
|
||||||
#include "util/Logger.hpp"
|
#include "util/Logger.hpp"
|
||||||
// not implemented yet
|
#include "aluinstr.hpp"
|
||||||
// #include "aluinstr.hpp"
|
|
||||||
|
|
||||||
class L4SysExperimentData;
|
class L4SysExperimentData;
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,10 @@
|
|||||||
|
|
||||||
// the bounds of the program
|
// the bounds of the program
|
||||||
#define L4SYS_ADDRESS_SPACE 0x203d000
|
#define L4SYS_ADDRESS_SPACE 0x203d000
|
||||||
#define L4SYS_FUNC_ENTRY 0x1000400
|
#define L4SYS_FUNC_ENTRY 0x10025ca
|
||||||
#define L4SYS_FUNC_EXIT 0x10005b0
|
#define L4SYS_FUNC_EXIT 0x1002810
|
||||||
#define L4SYS_NUMINSTR 56052774
|
#define L4SYS_NUMINSTR 83084798
|
||||||
|
// kernel: 3599694, userland: 79485104
|
||||||
|
|
||||||
#define L4SYS_ITERATION_COUNT 1
|
#define L4SYS_ITERATION_COUNT 1
|
||||||
|
|
||||||
@ -20,6 +21,8 @@
|
|||||||
|
|
||||||
// flags
|
// flags
|
||||||
#define HEADLESS_EXPERIMENT
|
#define HEADLESS_EXPERIMENT
|
||||||
//#define PREPARE_EXPERIMENT
|
// 0 - preparation complete
|
||||||
|
// >0 - next step to execute
|
||||||
|
#define PREPARATION_STEP 3
|
||||||
|
|
||||||
#endif // __EXPERIMENT_INFO_HPP__
|
#endif // __EXPERIMENT_INFO_HPP__
|
||||||
|
|||||||
Reference in New Issue
Block a user