From f3d19e2b8d9e9890dcbdfa0fec6ec62dd1cafddf Mon Sep 17 00:00:00 2001 From: hellwig Date: Thu, 13 Sep 2012 13:00:57 +0000 Subject: [PATCH] new regression-test experiment git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1635 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- src/experiments/hsc-simple/experiment.cc | 8 + src/experiments/regression-test/experiment.cc | 399 +++++++++++------- .../regression-test/experimentInfo.hpp | 18 +- .../regression-test/experimentInfo.hpp.sh | 10 +- 4 files changed, 264 insertions(+), 171 deletions(-) diff --git a/src/experiments/hsc-simple/experiment.cc b/src/experiments/hsc-simple/experiment.cc index 5957e5b2..aa784ab6 100644 --- a/src/experiments/hsc-simple/experiment.cc +++ b/src/experiments/hsc-simple/experiment.cc @@ -1,3 +1,5 @@ + + #include #include @@ -7,6 +9,9 @@ #include "sal/Listener.hpp" #include "util/Logger.hpp" #include "config/FailConfig.hpp" +#include "../plugins/serialoutput/SerialOutput.hpp" + + // Check if configuration dependencies are satisfied: #if !defined(CONFIG_EVENT_BREAKPOINTS) || !defined(CONFIG_SR_RESTORE) || !defined(CONFIG_SR_SAVE) @@ -21,6 +26,9 @@ bool HSCSimpleExperiment::run() Logger log("HSC", false); log << "experiment start" << endl; + SerialOutput so(0x3F8); + simulator.addFlow(&so); + // do funny things here... #if 1 // STEP 1 diff --git a/src/experiments/regression-test/experiment.cc b/src/experiments/regression-test/experiment.cc index 9768a34c..c02edd2f 100644 --- a/src/experiments/regression-test/experiment.cc +++ b/src/experiments/regression-test/experiment.cc @@ -1,23 +1,24 @@ #include #include +#include #include "experiment.hpp" #include "experimentInfo.hpp" #include "sal/SALInst.hpp" #include "sal/Listener.hpp" -#include "util/Logger.hpp" +#include "sal/Memory.hpp" #include "config/FailConfig.hpp" #include "sal/bochs/BochsRegister.hpp" +#include "../plugins/tracing/TracingPlugin.hpp" +#include "../plugins/serialoutput/SerialOutput.hpp" -//ToDo: -// more flow-control by BreakpointListener -// life-counter (counter over BreakpointListener) monitor whether a test takes too much "time" -// more tests + test of plugins // Check if configuration dependencies are satisfied: #if !defined(CONFIG_EVENT_BREAKPOINTS) || !defined(CONFIG_EVENT_MEMREAD) \ - || !defined(CONFIG_EVENT_MEMWRITE) || !defined(CONFIG_SR_SAVE) || !defined(CONFIG_SR_RESTORE) \ - || !defined(CONFIG_SR_REBOOT) || !defined(CONFIG_EVENT_TRAP) +|| !defined(CONFIG_EVENT_GUESTSYS) || !defined(CONFIG_EVENT_INTERRUPT) \ +|| !defined(CONFIG_EVENT_IOPORT) || !defined(CONFIG_EVENT_JUMP) || !defined(CONFIG_EVENT_MEMREAD) \ +|| !defined(CONFIG_EVENT_MEMWRITE) || !defined(CONFIG_EVENT_TRAP) || !defined(CONFIG_SR_REBOOT) \ +|| !defined(CONFIG_SR_SAVE) || !defined(CONFIG_SR_RESTORE) || !defined(CONFIG_SUPPRESS_INTERRUPTS) #error This experiment needs: breakpoints, memread, memwrite. Enable these in the configuration. #endif @@ -25,176 +26,252 @@ using namespace std; using namespace fail; bool RegressionTest::run() -{ - BPSingleListener bpPather(ANY_ADDR); - int count = 0; +{ + unsigned instrAddr_at_save = 0; + BaseListener *ev; - Logger log("Regression-Test", false); - log << "experiment start" << endl; - -//Breakpoint-Test - log << "Breakpoint-Test start." << endl; + //Result-File + fstream file ("regression-test.results", ios::out | ios::trunc); - BPSingleListener mainbp(ANY_ADDR); - mainbp.setCounter(1000); + file << "experiment start" << endl; - BPRangeListener bprange(REGRESSION_FUNC_LOOP_DONE, REGRESSION_FUNC_LOOP_DONE); - BPSingleListener breakcounter(REGRESSION_FUNC_LOOP_DONE); - simulator.addListener(&breakcounter); - - - while(true){ - - BaseListener* ev = simulator.resume(); - - if(ev == &breakcounter || ev == &bprange) { - - count++; - //First 5 times test BPSingleListener - if(count < 5){ - log << "Loop-Single-Test!" << endl; - simulator.addListener(&breakcounter); - //Next 5 times test BPRangeListener - }else if(count < 10){ - log << "Loop-Range-Test!" << endl; - simulator.addListener(&bprange); - //At 10 run of loop start BPSingleListener, BPRangeListener, mainListener - //which waits 1000 instructions. - }else if(count == 10){ - log << "loop-limit reached..." << endl; - simulator.addListener(&breakcounter); - simulator.addListener(&bprange); - simulator.addListener(&mainbp); - //If mainListener fires not first the test failes. - }else if(count >= 10){ - log << "Breakpoint-Test FAILED."<< endl; - break; - } - //If mainListener fires first the test success. - }else if(ev == &mainbp) { - log << "Breakpoint-Test SUCCESS." <= 10){ + file << "Breakpoint-Test FAILED."<< endl; + break; + } + //If mainListener fires first the test success. + }else if(ev == &mainbp) { + file << "Breakpoint-Test SUCCESS." < Watchdog fired. Timeout!" << endl; + } + } + file << "Breakpoint-Test end" << endl; + simulator.removeListener(&breakcounter); + simulator.removeListener(&bprange); + simulator.removeListener(&mainbp); + + } else if (ev == &mem_read_test) { + + file << "Memory-Read-Test start." << endl; + + MemReadListener memread(REGRESSION_VAR_MTEST_READ); + simulator.addListener(&memread); + simulator.resume(); + + file << "Memaddr-Read: " << hex << memread.getTriggerAddress() << dec << endl; + + if(memread.getTriggerAddress() == REGRESSION_VAR_MTEST_READ) { + file << "Memory-Read-Test SUCCESS." << endl; + } else { + file << "Memory-Read-Test FAILED." << endl; + } + + file << "Memory-Read-Test end." << endl; + simulator.removeListener(&memread); + + } else if (ev == &mem_write_test) { + + file << "Memory-Write-Test start." << endl; + + MemWriteListener memwrite(REGRESSION_VAR_MTEST_WRITE); + simulator.addListener(&memwrite); + simulator.resume(); + + file << "Memaddr-WRITE: " << hex << memwrite.getTriggerAddress() << dec << endl; + + if(memwrite.getTriggerAddress() == REGRESSION_VAR_MTEST_WRITE) { + file << "Memory-Write-Test SUCCESS." << endl; + } else { + file << "Memory-Write-Test FAILED." << endl; + } + + file << "Memory-Write-Test end." << endl; + + + } else if (ev == &trap_test) { + + file << "Trap-Test start" << endl; + + TrapListener trap(ANY_TRAP); + simulator.addListener(&trap); + simulator.resume(); + file << "Trap found: " << trap.getTriggerNumber() << endl; + + file << "Trap-Test end" << endl; + + simulator.removeListener(&trap); + + //After a division-error trap ecos halts the cpu + //Because of this a restore to start point is needed + + simulator.restore("regression-save"); + + if (simulator.getRegisterManager().getInstructionPointer() == instrAddr_at_save) { + file << "Save-/Restore-Test SUCCESS." << endl; + } else { + file << "Save-/Restore-Test FAILED. The instructionpointer after restore is \ + different to the ionstructionpointer after save! " << endl; + file << "Instructionpointer after save: " << instrAddr_at_save << endl; + file << "Instructionpointer after restore: " << \ + simulator.getRegisterManager().getInstructionPointer() << endl; + } + + // Reboot test + + file << "Reboot-Test start" << endl; + + BPSingleListener bpReboot(ANY_ADDR); + + simulator.addListener(&bpReboot); + simulator.resume(); + + long beforeReboot = bpReboot.getTriggerInstructionPointer(); + + file << "Before Reboot-Addr: 0x" << hex << beforeReboot << dec << endl; + + bpReboot.setWatchInstructionPointer(beforeReboot); + simulator.addListener(&bpReboot); + + simulator.reboot(); + + long afterReboot = bpReboot.getTriggerInstructionPointer(); + + file << "After Reboot-Addr: 0x" << hex << beforeReboot << dec << endl; + + if (beforeReboot == afterReboot){ + file << "Reboot-Test SUCCESS." << endl; + }else { + file << "Reboot-Test FAILED." << endl; + } + + file << "Reboot-Test end" << endl; + simulator.removeListener(&bpReboot); + + file << "Serial-Output: " << so.getOutput() << endl; + + simulator.terminate(); + + } else if (ev == &jump_test) { + file << "Jump-Test start" << endl; + + JumpListener jump(ANY_INSTR); + simulator.addListener(&jump); + simulator.resume(); + + file << "Jump-Instruction found: " << jump.getOpcode() << endl; + file << "current Instruction-Pointer: 0x" << hex <<\ + simulator.getRegisterManager().getInstructionPointer() << dec << endl; + + file << "Jump-Test end" << endl; + + simulator.removeListener(&jump); + + } else if (ev == &interrupt_test) { + + file << "Interrupt-Test start" << endl; + + InterruptListener interrupt(32); + simulator.addListener(&interrupt); + ev = simulator.resume(); + + if (ev == &interrupt) { + file << "Interrupt-Test SUCCESS. Interruptnum: " << interrupt.getTriggerNumber() \ + << endl; + } + + file << "Interrupt-Test end" << endl; + } else if (ev == &watchdog) { + file << "Watchdog fired. Timeout!" << endl; + } } - log << "Save-/Restore-Test end" << endl; - -// Reboot test - - log << "Reboot-Test start" << endl; - - BPSingleListener bpReboot(ANY_ADDR); + file << "experiment end" << endl; - simulator.addListener(&bpReboot); - simulator.resume(); - - long beforeReboot = bpReboot.getTriggerInstructionPointer(); - - log << "Before Reboot-Addr: 0x" << hex << beforeReboot << dec << endl; - - bpReboot.setWatchInstructionPointer(beforeReboot); - simulator.addListener(&bpReboot); - - simulator.reboot(); - - long afterReboot = bpReboot.getTriggerInstructionPointer(); - - log << "After Reboot-Addr: 0x" << hex << beforeReboot << dec << endl; - - if (beforeReboot == afterReboot){ - log << "Reboot-Test SUCCESS." << endl; - }else { - log << "Reboot-Test FAILED." << endl; - } - - log << "Reboot-Test end" << endl; - -// Trap test - - log << "Trap-Test start" << endl; - - bpPather.setWatchInstructionPointer(REGRESSION_FUNC_TRAP); - simulator.addListener(&bpPather); - simulator.resume(); - log << "Begin of Trap-Function found." << endl; - - TrapListener trap(ANY_TRAP); - simulator.addListener(&trap); - simulator.resume(); - log << "Trap found." << endl; - - log << "Trap-Test end" << endl; - return true; + } diff --git a/src/experiments/regression-test/experimentInfo.hpp b/src/experiments/regression-test/experimentInfo.hpp index d1273850..c9574317 100644 --- a/src/experiments/regression-test/experimentInfo.hpp +++ b/src/experiments/regression-test/experimentInfo.hpp @@ -3,13 +3,17 @@ // autogenerated, don't edit! -// loop_done() address: -// nm -C regressiontest|fgrep loop_done -#define REGRESSION_FUNC_LOOP_DONE 0x00003c91 -#define REGRESSION_FUNC_MTEST_READ 0x0000a748 -#define REGRESSION_FUNC_MTEST_WRITE 0x0000eba0 -#define REGRESSION_FUNC_TRAP 0x00003c48 -#define REGRESSION_FUNC_JUMP 0x00003c20 +// nm -C regressiontest.elf|fgrep loop_done +#define REGRESSION_FUNC_STARTED 0x00003c20 +#define REGRESSION_FUNC_BP 0x00003cc1 +#define REGRESSION_FUNC_LOOP_DONE 0x00003c8b +#define REGRESSION_FUNC_MEM_READ 0x00003cb2 +#define REGRESSION_FUNC_MEM_WRITE 0x00003ca3 +#define REGRESSION_VAR_MTEST_READ 0x0000aee8 +#define REGRESSION_VAR_MTEST_WRITE 0x0000f7a0 +#define REGRESSION_FUNC_TRAP 0x00003c38 +#define REGRESSION_FUNC_INTERRUPT 0x00003ce0 +#define REGRESSION_FUNC_JUMP 0x00003c63 #endif diff --git a/src/experiments/regression-test/experimentInfo.hpp.sh b/src/experiments/regression-test/experimentInfo.hpp.sh index 025b4fe5..f3d2331c 100755 --- a/src/experiments/regression-test/experimentInfo.hpp.sh +++ b/src/experiments/regression-test/experimentInfo.hpp.sh @@ -16,12 +16,16 @@ EOF function alldefs() { cat <