DCiAOKernelImporter: different injection semantic.

Is now very similar to normal importer, and may be deleted in the future, but
at the moment, this should be merged, since it is the importer used in the
sobres-2013 paper.

This changes the MySQL Schema. instr1_absolute was introduced.

Change-Id: I1bc2919bd14c335beca6d586b7cc0f80767ad7d5
This commit is contained in:
Christian Dietrich
2013-04-10 17:37:23 +02:00
parent 6d8b3331d8
commit 6789a313a9
10 changed files with 85 additions and 62 deletions

View File

@ -11,9 +11,9 @@ using namespace fail;
bool DCiAOKernelImporter::inDynamicKernelMemory(fail::address_t addr) {
const std::string &name = m_elf->getSymbol(addr).getDemangledName();
bool dynamic = name.find("os::data::dynamic", 0) != std::string::npos;
// bool stack = name.find("_stack") != std::string::npos;
// return dynamic && !stack;
return dynamic;
bool stack = name.find("_stack") != std::string::npos;
return dynamic && !stack;
// return dynamic;
}
bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
@ -31,8 +31,12 @@ bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
// instruction counter within trace
unsigned instr = 0;
unsigned instr_last_kernel_inject = 0;
unsigned instr_last_kernel_leave = 0;
unsigned instr_last_kernel_enter = 0;
address_t inject_kernel_addr = getInjectKernelAddress();
address_t enter_kernel_addr = getEnterKernelAddress();
address_t leave_kernel_addr = getLeaveKernelAddress();
@ -50,14 +54,18 @@ bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
// new instruction
instr++;
if (ev.ip() == inject_kernel_addr) {
instr_last_kernel_inject = instr;
already_written_addresses.clear();
}
if (ev.ip() == enter_kernel_addr) {
in_kernel_space = true;
instr_last_kernel_enter = instr;
}
if (ev.ip() == leave_kernel_addr) {
instr_last_kernel_leave = instr;
in_kernel_space = false;
already_written_addresses.clear();
}
continue;
}
@ -77,13 +85,18 @@ bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
address_t from = ev.memaddr(), to = ev.memaddr() + ev.width();
// Iterate over all accessed bytes
for (address_t data_address = from; data_address < to; ++data_address) {
int instr1 = instr_last_kernel_leave;
int instr2 = instr; // the current instruction
margin_info_t left_margin, right_margin;
left_margin.dyninstr = instr_last_kernel_inject + 1;
left_margin.ip = inject_kernel_addr;
left_margin.time = 0;
right_margin.dyninstr = instr; // the current instruction
right_margin.ip = ev.ip();
right_margin.time = 0;
/* Was the byte already written in this kernel
space */
if (already_written_addresses.find(data_address)
== already_written_addresses.end())
!= already_written_addresses.end())
continue;
ev.set_memaddr(data_address);
@ -91,8 +104,9 @@ bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
// we now have an interval-terminating R/W event to the memaddr
// we're currently looking at; the EC is defined by
// data_address [last_kernel_leave, read_instr] (instr_absolute)
if (!add_trace_event(instr1, instr2, 0, 0, ev)) { // FIXME use timing data
// data_address [last_kernel_leave, read_instr]
// (instr_absolute)
if (!add_trace_event(left_margin, right_margin, ev)) {
LOG << "add_trace_event failed" << std::endl;
return false;
}
@ -100,6 +114,10 @@ bool DCiAOKernelImporter::copy_to_database(fail::ProtoIStream &ps) {
if (row_count % 1000 == 0) {
LOG << "Imported " << row_count << " traces into the database" << std::endl;
}
/* This was the first read, we ignore all further
reads in this kernel transition */
already_written_addresses.insert(data_address);
}
}
}