ERIKA Enterprise is a OSEK conforming embedded RTOS. The supplied tracer
and experiment are similar to the cored-{tracing,tester} experiment, but
checks the integrity of the RTOS application in a different
manner. Stacks and stackpointers are located differently in ERIKA. This
experiment was used in RTAS'15 Hoffmann et al.
Change-Id: Idc8d874eb4d4ef15837f903270cfa521bc9514a2
100 lines
3.6 KiB
Python
Executable File
100 lines
3.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import os,sys
|
|
import logging
|
|
import imp
|
|
import math
|
|
import collections
|
|
import numpy
|
|
|
|
tmp_path = "%s/git/versuchung/src"% os.environ["HOME"]
|
|
if os.path.exists(tmp_path):
|
|
sys.path.append(tmp_path)
|
|
|
|
|
|
from versuchung.experiment import Experiment
|
|
from versuchung.types import String, Bool,List
|
|
from versuchung.database import Database
|
|
from versuchung.files import File, Directory, Executable
|
|
from versuchung.archives import GitArchive
|
|
from versuchung.execute import shell
|
|
from versuchung.tex import DatarefDict
|
|
from threading import Thread
|
|
|
|
class FailTrace(Experiment):
|
|
inputs = {
|
|
"erika": GitArchive("gitosis@i4git.informatik.uni-erlangen.de:erika"),
|
|
"bochs-runner": Executable("/proj/i4danceos/tools/fail/bochs-experiment-runner.py"),
|
|
"erika-tracing": Executable("/proj/i4danceos/tools/fail/erika-tracing"),
|
|
}
|
|
outputs = {
|
|
"trace": Directory("trace"),
|
|
"elf": File("erika.elf"),
|
|
"iso": File("erika.iso"),
|
|
}
|
|
|
|
def run(self):
|
|
logging.info("Cloning ERIKA...")
|
|
|
|
with self.erika as erika_path:
|
|
shell("cd %s/examples/x86/coptermock-isorc; make", erika_path)
|
|
|
|
self.iso.copy_contents(os.path.join(erika_path, "examples/x86/coptermock-isorc/Debug/erika.iso"))
|
|
self.elf.copy_contents(os.path.join(erika_path, "examples/x86/coptermock-isorc/Debug/Debug/out.elf"))
|
|
|
|
shell(("cd %(resultdir)s; python %(bochs)s -F 50 -i %(iso)s -e %(elf)s -f %(fail)s"
|
|
+ " -m 8 -1 -- -Wf,--end-symbol=test_finish -Wf,--start-symbol=EE_oo_StartOS"
|
|
+ " -Wf,--trace-file=trace.pb -Wf,--save-symbol=EE_oo_StartOS") % {
|
|
"resultdir": self.trace.path,
|
|
"bochs": self.bochs_runner.path,
|
|
"iso": self.iso.path,
|
|
"elf": self.elf.path,
|
|
"fail": self.erika_tracing.path
|
|
}
|
|
)
|
|
|
|
|
|
class FailImport(Experiment):
|
|
inputs = {
|
|
"trace": FailTrace("FailTrace"),
|
|
"fail-tool-dir": Directory("/proj/i4danceos/tools/fail"),
|
|
}
|
|
|
|
def run(self):
|
|
variant = "erika/error-hook"
|
|
for (label, importer, importer_args) in [\
|
|
("mem", "MemoryImporter", []),
|
|
("regs", "RegisterImporter", []),
|
|
("ip", "RegisterImporter", ["--no-gp", "--ip"]),
|
|
("flags", "RegisterImporter", ["--no-gp", "--flags"]),
|
|
]:
|
|
benchmark = label
|
|
logging.info("Importing coredos/%s", benchmark)
|
|
cmdline = "%(path)s/import-trace -v %(variant)s -b %(benchmark)s -i %(importer)s "\
|
|
+ "-t %(trace)s -e %(elf)s %(args)s"
|
|
shell(cmdline %\
|
|
{"path": self.fail_tool_dir.path,
|
|
"variant": variant,
|
|
"benchmark": benchmark,
|
|
"importer": importer,
|
|
"trace": os.path.join(self.trace.trace.path, "trace.pb"),
|
|
"elf": self.trace.elf.path,
|
|
"args": " ".join(importer_args)})
|
|
shell("%s/prune-trace -v %s -b %% -p basic --overwrite",
|
|
self.fail_tool_dir.path, variant)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import shutil, sys
|
|
if len(sys.argv) > 1:
|
|
action = sys.argv[1]; del sys.argv[1]
|
|
actions = {"trace": FailTrace,
|
|
"import": FailImport}
|
|
|
|
if action in actions:
|
|
experiment = actions[action]()
|
|
dirname = experiment(sys.argv)
|
|
else:
|
|
print "No action to be taken, use: %s" % ", ".join(actions.keys())
|
|
|