ecos: ignore VGA mem accesses

Ignore VGA mem accesses for valid address range detection.

Change-Id: I4a85b6d4a2de52ecbd977d2dba474df818710600
This commit is contained in:
Horst Schirmeier
2013-04-05 11:47:00 +02:00
parent 84559fe467
commit 001d036613

View File

@ -37,6 +37,10 @@
#define TIMER_GRANULARITY 10 // microseconds
#define VIDEOMEM_START 0xb8000
#define VIDEOMEM_SIZE (80*25*2 *2) // two text mode screens
#define VIDEOMEM_END (VIDEOMEM_START + VIDEOMEM_SIZE)
using namespace std;
using namespace fail;
@ -229,10 +233,10 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
unsigned lo = ev_mem.getTriggerAddress();
unsigned hi = lo + ev_mem.getTriggerWidth() - 1;
if(hi > highest_addr) {
if (hi > highest_addr && (hi < VIDEOMEM_START || hi >= VIDEOMEM_END)) {
highest_addr = hi;
}
if(lo < lowest_addr) {
if (lo < lowest_addr && (lo < VIDEOMEM_START || lo >= VIDEOMEM_END)) {
lowest_addr = lo;
}
simulator.addListener(&ev_mem);
@ -248,7 +252,7 @@ bool EcosKernelTestExperiment::performTrace(guest_address_t addr_entry, guest_ad
unsigned estimated_timeout = (unsigned)estimated_timeout_overflow_check;
log << dec << "tracing finished after " << instr_counter << " instructions" << endl;
log << hex << "all memory accesses within [ 0x" << lowest_addr << " , 0x" << highest_addr << " ]" << endl;
log << hex << "all memory accesses within [ 0x" << lowest_addr << " , 0x" << highest_addr << " ] (ignoring VGA mem)" << endl;
log << dec << "elapsed simulated time (plus safety margin): " << (estimated_timeout * TIMER_GRANULARITY / 1000000.0) << "s" << endl;
// save these values for experiment STEP 3
@ -430,12 +434,18 @@ bool EcosKernelTestExperiment::faultInjection() {
simulator.addListener(&ev_beyond_text);
// memory access outside of bound determined in the golden run [lowest_addr, highest_addr]
// video memory accesses are OK, too
// FIXME: It would be nice to have a MemAccessListener that accepts a MemoryMap.
assert(lowest_addr < highest_addr && highest_addr < VIDEOMEM_START);
MemAccessListener ev_mem_low(0x0, MemAccessEvent::MEM_READWRITE);
ev_mem_low.setWatchWidth(lowest_addr);
MemAccessListener ev_mem_high(highest_addr + 1, MemAccessEvent::MEM_READWRITE);
ev_mem_high.setWatchWidth(0xFFFFFFFFU - (highest_addr + 1));
ev_mem_high.setWatchWidth(VIDEOMEM_START - (highest_addr + 1));
MemAccessListener ev_mem_veryhigh(VIDEOMEM_END, MemAccessEvent::MEM_READWRITE);
ev_mem_high.setWatchWidth(0xFFFFFFFFU - VIDEOMEM_END);
simulator.addListener(&ev_mem_low);
simulator.addListener(&ev_mem_high);
simulator.addListener(&ev_mem_veryhigh);
// timeout (e.g., stuck in a HLT instruction)
TimerListener ev_timeout(estimated_timeout);
@ -545,7 +555,7 @@ bool EcosKernelTestExperiment::faultInjection() {
} else if (ev == &ev_below_text || ev == &ev_beyond_text) {
log << "Result OUTSIDE" << endl;
result->set_resulttype(result->OUTSIDE);
} else if (ev == &ev_mem_low || ev == &ev_mem_high) {
} else if (ev == &ev_mem_low || ev == &ev_mem_high || ev == &ev_mem_veryhigh) {
log << "Result MEMORYACCESS" << endl;
result->set_resulttype(result->MEMORYACCESS);
} else if (ev == &ev_trap) {