Compare commits

...

41 Commits

Author SHA1 Message Date
a10dc97616 update injections + projects 2026-03-19 01:01:01 +01:00
d797e9f71c compile with -O0 and -ggdb3 2026-03-19 01:00:54 +01:00
ea6a009c0d add aot ghidra project 2026-03-18 23:13:34 +01:00
bc2eefface add c-only ghidra project 2026-03-18 23:13:27 +01:00
a0ea3a3bbf update .gitignore 2026-03-18 23:13:21 +01:00
92ac5ec7d8 move ghidra script location 2026-03-18 23:12:47 +01:00
07ac6f6fc3 update .gitattributes 2026-03-18 23:12:18 +01:00
7b47a70448 add aot injection 2026-03-18 23:11:00 +01:00
96082f33aa add c-only injection 2026-03-18 23:10:56 +01:00
945c1fe0bc update recipes 2026-03-18 23:10:41 +01:00
5efff7c84e add rough fail db table overview 2026-03-18 23:10:38 +01:00
83ae53768c update .gitattributes 2026-03-18 23:10:33 +01:00
c8fb5d537d add gitattributes 2026-03-18 20:06:36 +01:00
a6a335aaf4 move fail binaries 2026-03-18 19:54:44 +01:00
5d4d84de39 add ghidra script to import markers as bookmarks 2026-03-17 23:52:33 +01:00
8afdee2fd2 add recipe to download markers from mars 2026-03-17 23:52:22 +01:00
0d871c4e56 add recipe to export markers to csv 2026-03-17 23:09:12 +01:00
5e0b71a818 update radare2 config 2026-03-17 20:43:39 +01:00
af70aebcff update radare2 config 2026-03-17 20:42:26 +01:00
cacd2d8883 update radare2 config 2026-03-17 20:41:54 +01:00
35dec73236 update radare2 config 2026-03-17 20:40:57 +01:00
e23a3d5033 disable importing --sources because of libdwarf error on mars
FAIL_IMPORT requires dwarf_init from libdwarf, but provided version only
defines dwarf_init_b?
2026-03-13 00:37:28 +01:00
b500d56c8e make radare recipe accept an address 2026-03-13 00:31:23 +01:00
8a0193408f remove obsolete recipe 2026-03-13 00:24:57 +01:00
129ba0e0b6 add a c-only target (no WASM) 2026-03-13 00:22:03 +01:00
0f847d7d2d split compilation into wasm.just + add targets for interpreted wasm 2026-03-12 21:13:06 +01:00
28d1db3b79 launch fail on non-default port on mars 2026-03-12 15:36:09 +01:00
c1eb861bfb fix just path in mars.just 2026-03-12 15:16:57 +01:00
4b8a4ad0f1 split justfile into nixos.just + mars.just 2026-03-12 15:15:15 +01:00
a79219d39e add just static binaries 2026-03-12 14:57:48 +01:00
593b88c3fd don't stop server in all-in-one 2026-03-12 14:52:22 +01:00
b1a8fe0c53 add all in one recipe 2026-03-12 14:26:36 +01:00
99608cc645 use shebang recipes for conditional dependencies instead of inline templating 2026-03-12 14:06:45 +01:00
50c6e9adea add linux-posix + linux-baremetal recipes 2026-03-12 13:45:33 +01:00
66eb0b3814 replace compose-file with direct docker command + add dbeaver recipe 2026-03-12 10:16:09 +01:00
078fdca44b fix incompatible libdwarf version 2026-03-12 10:15:30 +01:00
744af52f76 slightly restructure flake 2026-03-12 09:27:07 +01:00
43414edd0a add injection targets 2026-03-12 01:42:34 +01:00
679aeb24d4 add build + fail recipes 2026-03-12 01:42:25 +01:00
facf04df7f add wasi/wamr dependencies 2026-03-12 01:41:43 +01:00
86baf67fac add binaries 2026-03-11 20:22:30 +01:00
158 changed files with 13522 additions and 35 deletions

7
.gitattributes vendored
View File

@ -5,3 +5,10 @@ fail/bin/import-trace filter=lfs diff=lfs merge=lfs -text
fail/bin/prune-trace filter=lfs diff=lfs merge=lfs -text fail/bin/prune-trace filter=lfs diff=lfs merge=lfs -text
fail/share/** filter=lfs diff=lfs merge=lfs -text fail/share/** filter=lfs diff=lfs merge=lfs -text
just-bin/just filter=lfs diff=lfs merge=lfs -text just-bin/just filter=lfs diff=lfs merge=lfs -text
injections/** filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
ghidra/**/*.db filter=lfs diff=lfs merge=lfs -text
ghidra/**/*.gbf filter=lfs diff=lfs merge=lfs -text
ghidra/**/*.prp filter=lfs diff=lfs merge=lfs -text
ghidra/**/*.bak filter=lfs diff=lfs merge=lfs -text
ghidra/**/*.dat filter=lfs diff=lfs merge=lfs -text

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/build-*
/ghidra/projects/**/*.lock*

5
db.conf Normal file
View File

@ -0,0 +1,5 @@
[client]
host=127.0.0.1
user=fail
password=fail
database=fail

BIN
fail-tables.png (Stored with Git LFS) Normal file

Binary file not shown.

130
fail.just Normal file
View File

@ -0,0 +1,130 @@
[doc("Trace a golden run using FAIL*")]
[group("4: fail")]
trace module:
{{ BOCHS_RUNNER }} \
-V {{ FAIL_SHARE }}/vgabios.bin \
-b {{ FAIL_SHARE }}/BIOS-bochs-latest \
-1 \
-f {{ FAIL_TRACE }} \
-e {{ BUILD_DIR }}-{{ module }}/system.elf \
-i {{ BUILD_DIR }}-{{ module }}/system.iso \
-- \
-Wf,--start-symbol=start_trace \
-Wf,--save-symbol=start_trace \
-Wf,--end-symbol=stop_trace \
-Wf,--state-file={{ BUILD_DIR }}-{{ module }}/state \
-Wf,--trace-file={{ BUILD_DIR }}-{{ module }}/trace.pb \
-Wf,--elf-file={{ BUILD_DIR }}-{{ module }}/system.elf
@echo "Next step: \"just import {{ module }}\""
# [doc("Dump a FAIL* golden run trace")]
# [group("fail")]
# dump module:
# {{ FAIL_DUMP }} {{ BUILD_DIR }}-{{ module }}/trace.pb
[doc("Import a FAIL* golden run trace")]
[group("4: fail")]
import module:
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i MemoryImporter \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i RegisterImporter \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --flags
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i RegisterImporter \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --no-gp --ip
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i ElfImporter --objdump objdump \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i ElfImporter --objdump objdump \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem
{{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
-i ElfImporter --objdump objdump \
-e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
# -i ElfImporter --objdump objdump \
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b ip --sources
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
# -i ElfImporter --objdump objdump \
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b mem --sources
# {{ FAIL_IMPORT }} --database-option-file ./db.conf -t {{ BUILD_DIR }}-{{ module }}/trace.pb \
# -i ElfImporter --objdump objdump \
# -e {{ BUILD_DIR }}-{{ module }}/system.elf -v {{ module }} -b regs --sources
{{ FAIL_PRUNE }} --database-option-file ./db.conf -v {{ module }} -b %% --overwrite
@echo "Next step: \"just server {{ module }}\""
[doc("Start the FAIL* campaign server")]
[group("4: fail")]
server module:
{{ FAIL_SERVER }} \
--port {{FAIL_SERVER_PORT}} \
--database-option-file ./db.conf \
-v {{ module }} \
-b % \
--inject-single-bit \
--inject-registers \
&
@echo "Next step: \"just client {{ module }}\""
[doc("Stop the FAIL* campaign server")]
[group("4: fail")]
stop-server:
pkill -f {{ FAIL_SERVER }}
[doc("Start a FAIL* campaign client")]
[group("4: fail")]
client module:
{{ BOCHS_RUNNER }} \
-V {{ FAIL_SHARE }}/vgabios.bin \
-b {{ FAIL_SHARE }}/BIOS-bochs-latest \
-f {{ FAIL_INJECT }} \
-e {{ BUILD_DIR }}-{{ module }}/system.elf \
-i {{ BUILD_DIR }}-{{ module }}/system.iso \
-j {{ num_cpus() }} \
-- \
-Wf,--server-port={{FAIL_SERVER_PORT}} \
-Wf,--state-dir={{ BUILD_DIR }}-{{ module }}/state \
-Wf,--trap \
-Wf,--timeout=500000 \
-Wf,--ok-marker=ok_marker \
-Wf,--fail-marker=fail_marker \
> /dev/null
@echo "Next step: \"just result {{ module }}\" or \"just resultbrowser\""
[doc("Query FAIL* marker statistics from the database")]
[group("4: fail")]
result module:
@echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults \
FROM variant v \
JOIN trace t ON v.id = t.variant_id \
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \
JOIN fsppilot p ON r.pilot_id = p.id \
WHERE v.variant = \"{{ module }}\" \
GROUP BY v.id, resulttype \
ORDER BY variant, benchmark, resulttype;" | mariadb --defaults-file=./db.conf -t
[doc("Dump FAIL* markers to CSV")]
[group("4: fail")]
result-csv module:
@echo "SELECT \
CONCAT(\"0x\", HEX(p.injection_instr_absolute)) AS fault_address, \
SUM(t.time2 - t.time1 + 1) AS total_fail_markers \
FROM trace t \
JOIN variant v ON v.id = t.variant_id \
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address \
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \
JOIN fsppilot p ON p.id = r.pilot_id \
WHERE v.variant = \"{{ module }}\" AND r.resulttype = \"FAIL_MARKER\" \
GROUP BY p.injection_instr_absolute \
ORDER BY SUM(t.time2 - t.time1 + 1) DESC;" | mariadb --defaults-file=./db.conf --batch --raw | sed 's/\t/,/g'
[doc("Start the FAIL* resultbrowser")]
[group("4: fail")]
resultbrowser:
{{ RESULT_BROWSER }} -c ./db.conf --host=0.0.0.0 --port={{RESULTBROWSER_PORT}}

View File

@ -0,0 +1,147 @@
#!/usr/bin/python3
import os, sys
from optparse import OptionParser
from subprocess import *
from tempfile import mkstemp, mkdtemp
import shutil
from distutils.spawn import find_executable
import os.path
def parseArgs():
parser = OptionParser()
parser.add_option("-e", "--elf-file", dest="elf_file",
help="elf file to be executed", metavar="ELF")
parser.add_option("-i", "--iso-file", dest="iso_file",
help="iso file to be executed", metavar="ISO")
parser.add_option("-f", "--fail-client", dest="fail_client",
help="fail-client to be executed", metavar="ISO")
parser.add_option("-m", "--memory", dest="memory", default="16",
help="memory for the bochs VM", metavar="SIZE")
parser.add_option("-b", "--bios", dest="bios", default="/fs/proj/i4ezs/tools/fail-ws21/buildartifacts/BIOS-bochs-latest",
help="bios image for bochs", metavar="BIOS")
parser.add_option("-V", "--vgabios", dest="vgabios", default="/fs/proj/i4ezs/tools/fail-ws21/buildartifacts/vgabios.bin",
help="vgabios image for bochs", metavar="VGABIOS")
parser.add_option("-F", "--freq", dest="freq", default="5",
help="frquency in MHZ", metavar="MHZ")
parser.add_option("-1", "--once",
action="store_false", dest="forever", default=True,
help="fail-client to be executed")
parser.add_option("-j", "--jobs",
dest="jobs", default="1",
help="parallel execution")
(options, args) = parser.parse_args()
if not (options.elf_file and options.iso_file and options.fail_client):
parser.error("elf, iso and fail-client are required")
return options, args
def execute(options, args, bochsrc, statedir):
failcmd = options.fail_client
command = "FAIL_ELF_PATH=%s FAIL_STATEDIR=%s %s -q -f %s %s" % \
(options.elf_file, statedir, failcmd, bochsrc, " ".join(args))
print("executing: " + command)
p = Popen(command, shell=True, stdout=PIPE, stderr=STDOUT)
reconnect = 0
while p.poll() is None:
line = p.stdout.readline()
if line is None:
break
if "Connection refused" in line.decode("utf-8", "ignore"):
reconnect += 1
print(line),
if reconnect > 10:
return 1
p.wait()
if reconnect > 0:
return 123
return p.returncode
def main(options, args):
bochsrc_args = {
"memory": options.memory,
"bios": options.bios,
"vgabios": options.vgabios,
"iso": options.iso_file,
"ips": int(options.freq) * 1000000,
}
bochsrc_text = """
config_interface: textconfig
display_library: nogui
romimage: file="{bios}"
cpu: count=1, ips={ips}, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpuid: mmx=1, sep=1, sse=sse4_2, xapic=1, aes=1, movbe=1, xsave=1, cpuid_limit_winnt=0
memory: guest={memory}, host={memory}
vgaromimage: file="{vgabios}"
vga: extension=vbe
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
ata0-slave: type=cdrom, path="{iso}", status=inserted
port_e9_hack: enabled=1
com1: enabled=1, mode=file, dev=serial.out
boot: cdrom
clock: sync=none, time0=946681200
floppy_bootsig_check: disabled=0
panic: action=fatal
error: action=fatal
info: action=ignore
debug: action=ignore
pass: action=ignore
debugger_log: -
parport1: enabled=0
vga_update_interval: 300000
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
private_colormap: enabled=0
i440fxsupport: enabled=0, slot1=pcivga
""".format(**bochsrc_args)
bochsrc = mkstemp()
fd = os.fdopen(bochsrc[0], "w")
fd.write(bochsrc_text)
fd.close()
bochsrc = bochsrc[1]
statedir = mkdtemp()
if options.forever:
while True:
res = execute(options, args, bochsrc, statedir)
if res != 0:
break
ret = 0
else:
ret = execute(options, args, bochsrc, statedir)
os.unlink(bochsrc)
shutil.rmtree(statedir)
sys.exit(ret)
if __name__ == "__main__":
(options, args) = parseArgs()
import threading
i = 1
# n-1 jobs in threads
while i < int(options.jobs):
fred = threading.Thread(target = main, args = (options, args))
fred.start()
print("starting: "+str(i))
i = i + 1
main(options, args)

BIN
fail/bin/fail-x86-tracing (Stored with Git LFS) Executable file

Binary file not shown.

BIN
fail/bin/generic-experiment-client (Stored with Git LFS) Executable file

Binary file not shown.

BIN
fail/bin/generic-experiment-server (Stored with Git LFS) Executable file

Binary file not shown.

BIN
fail/bin/import-trace (Stored with Git LFS) Executable file

Binary file not shown.

BIN
fail/bin/prune-trace (Stored with Git LFS) Executable file

Binary file not shown.

1
fail/bin/resultbrowser.py Symbolic link
View File

@ -0,0 +1 @@
./resultbrowser/run.py

View File

@ -0,0 +1,19 @@
FAIL* Result Browser
Requirements:
* Python
* Flask (sudo pip install Flask)
* MySQLDB (sudo aptitude install python-mysqldb)
* YAML (sudo aptitude install python-yaml)
Based on Flask web microframework (Werkzeug, Jinja 2)
and old school MySQL bindings.
Connects to a FAIL* result database given by a mysql config file.
Usage:
./run.py
Defaults to mysql config file ~/.my.cnf, or
./run.py -c <path to sqlconfig.cnf>
YAML based configuration for table and variant details.

View File

@ -0,0 +1,4 @@
from flask import Flask
app = Flask(__name__)
from app import views

View File

@ -0,0 +1,143 @@
from pprint import pprint
from . import details
from . import model
def scrub(table_name):
return ''.join( chr for chr in table_name if chr.isalnum() or chr == '_' )
class Resulttype:
def __init__(self, name, count):
self.name = name
self.count = count
def getName(self):
return self.name
def getCount(self):
return self.count
class Variant:
def __init__(self, id, name, table, benchmark, detail):
self.id = id
self.dbname = name
self.parenttable = table # TableDetails
self.details = detail # VariantDetails
self.benchmark = benchmark # BenchmarkDetails
self.results = {}
self.totalresults = 0
def getMapper(self):
mapper = self.benchmark.getMapper()
if not mapper: #try benchmark mapper
mapper = self.details.getMapper()
if not mapper: # of not there, try parent tables mapper
mapper = self.parenttable.getMapper()
if not mapper: # no mapper found at all, try default mapper
mapper = model.detaildealer.getDefaultMapper()
return mapper
def addResulttype(self, name, count):
mapper = self.getMapper()
label = mapper.getLabel(name)
oldcount = self.results.setdefault(label, 0)
self.results[label] = oldcount + count
self.totalresults += count
def getResultLabels(self):
return self.results.keys()
def getDBName(self):
return str(self.name)
def getId(self):
return self.id
def getResults(self):
return self.results
def getTableDetails(self):
return self.parenttable
def getBenchmarkDetails(self):
return self.benchmark
def getDetails(self):
return self.details
def getTotals(self):
return self.totalresults
def __str__(self):
ret = "Variant: " + self.getDetails().getTitle() + " - " + self.getBenchmarkDetails().getTitle() +" (id: " + str( self.id )+ ")" + " "
ret += "Total Results: " + str( self.totalresults ) + "\n"
for v in self.results:
ret += "\t" + v.name + ": " + str( v.count ) + "\n"
return ret
__repr__ = __str__
'''A ResultTable contains n Variants'''
class ResultTable:
def __init__(self, name, cfg):
self.name = scrub(name)
self.details = cfg.getTable(name)
self.variants = {}
def addVariant(self, var):
if var.getId() in self.variants:
return
self.variants[var.getId()] = var # Add if not existing yet
def getVariant(self, id):
if id in self.variants:
return self.variants[id]
return None
def getVariantById(self, varid):
for k,v in self.variants.items():
if int(v.getId()) == int(varid):
return v
return None
def getDetails(self):
return self.details
def getVariants(self):
return self.variants
def __str__(self):
ret = "Result: " + self.getDetails().getTitle() + "\n"
for k,v in self.variants.items():
ret += "\t" + str(v) + "\n"
return ret
__repr__ = __str__
'''Overview has n ResultTables'''
class Overview:
def __init__(self):
self.tables = {}
def add(self, table):
self.tables[table.getDetails().getDBName()] = table
def getTables(self):
return self.tables
def getTable(self, dbname):
return self.tables.get(dbname, None)
def getVariantById(self, variant_id):
for key,table in self.tables.items():
variant = table.getVariantById(variant_id)
if variant:
return variant
print("Variant not found.")
return None
def length(self):
return len(self.tables)

View File

@ -0,0 +1,216 @@
class BasicDetails(object):
def __init__(self,name):
self.dbname = name
self.title = name
self.details = ''
self.mapper = None
def getDBName(self):
return self.dbname
def getDetails(self):
return self.details
def setDetails(self,det):
self.details = det
def getTitle(self):
return self.title
def addMapper(self, mapper):
self.mapper = mapper
def getMapper(self):
return self.mapper
def extractDetails(self, dictionary):
self.details = dictionary.pop(('details'), '')
self.title = dictionary.pop(('title'), self.dbname)
custommapping = dictionary.pop(('mapping'), None)
if custommapping:
self.mapper = ResulttypeMapper()
self.mapper.add(custommapping)
else:
self.mapper = None
def __repr__(self):
return self.getTitle() + ": " + self.getDetails()
__str__ = __repr__
class BenchmarkDetails(BasicDetails):
def __init__(self, dbname):
BasicDetails.__init__(self, dbname)
def __repr__(self):
return "Benchmark: " + BasicDetails.__repr__(self)
__str__ = __repr__
class VariantDetails(BasicDetails):
def __init__(self, dbname):
BasicDetails.__init__(self, dbname)
self.benchmarks = {}
def addBenchmark(self, bm):
self.benchmarks[bm.getDBName()] = bm
def getBenchmark(self, dbbm):
return self.benchmarks.get(dbbm, BenchmarkDetails(dbbm))
def __repr__(self):
ret = "Variant: " + BasicDetails.__repr__(self)
for v in self.benchmarks.values():
ret += "\n\t\t" + str(v)
return ret
__str__ = __repr__
class TableDetails(BasicDetails):
def __init__(self, tbl):
BasicDetails.__init__(self, tbl)
self.variants = {}
def addVariant(self, var):
self.variants[var.getDBName()] = var
def getVariant(self, varname):
return self.variants.get(varname, VariantDetails(varname))
def __repr__(self):
ret = "Table: " + BasicDetails.__repr__(self) + "(" + self.getDBName() + ")"
for v in self.variants.values():
ret += "\n\t" + str(v)
return ret
__str__ = __repr__
from pprint import pprint
class ResulttypeMapper(object):
def __init__(self):
self.mappings = {}
def add(self, mapping):
for label, dbnamelist in mapping.items():
self.mappings[label] = dbnamelist
def getLabel(self, dbname):
for label, dbnamelist in self.mappings.items():
if dbname in dbnamelist:
return label
return dbname
def getLabelList(self):
return self.mappings.keys()
def getDBNames(self, label):
return self.mappings.get(label, None)
def __repr__(self):
ret = "Resulttype Mapper:"
for label,dbnames in self.mappings.items():
ret += "\n\t" + label
for db in dbnames:
ret += "\n\t\t" + db
return ret
__str__ = __repr__
import yaml
class DetailDealer:
def __init__(self, configfile=None):
self.tables = {}
self.defaultMapper = ResulttypeMapper()
if not configfile:
return
self.reload(configfile)
if not self.tables:
print("DetailDealer: no details found for " + configfile)
def reload(self, configfile):
self.tables = {}
self.defaultMapper = ResulttypeMapper()
if not configfile:
return # no details.
f = open(configfile)
# use safe_load instead load
cfg = yaml.safe_load(f)
f.close()
# Read out default mapping, if existent
self.extractDefaults(cfg)
tables = cfg.pop('tables', None)
if tables:
for tablename,details in tables.items():
tab = TableDetails(tablename)
# pop: return and remove when key present, else return 'notfound'
tab.extractDetails(details)
variants = details.pop('variants')
for variantname, vdetails in variants.items():
var = VariantDetails(variantname)
var.extractDetails(vdetails)
benchmarks = vdetails.pop('benchmarks')
for benchmark, bdetails in benchmarks.items():
bm = BenchmarkDetails(benchmark)
bm.extractDetails(bdetails)
var.addBenchmark(bm)
tab.addVariant(var)
self.tables[tab.getDBName()] = (tab)
def extractDefaults(self, cfg):
defs = cfg.pop('defaults', None)
if defs:
defmap = defs.pop('mapping', None)
if defmap:
self.defaultMapper.add(defmap)
def getDefaultMapper(self):
return self.defaultMapper
def getTable(self, tablename):
tab = self.tables.get(tablename, None)
if tab:
return tab
return TableDetails(tablename)
def getVariant(self, tablename, variantname):
tab = self.getTable(tablename)
if tab:
return tab.getVariant(variantname)
return VariantDetails(variantname) # Default
def getBenchmark(self, table, variant, bechmark):
tab = self.getTable(table)
if tab:
var = tab.getVariant(variant)
if var:
return var.getBenchmark(bechmark)
return BenchmarkDetails(benchmark) # Default
def __repr__(self):
ret = str(self.defaultMapper) + '\n'
for tabledetails in self.tables.values():
ret += str(tabledetails) + '\n'
return ret
if __name__ == "__main__":
dd = DetailDealer('./test.yml')
pprint(dd)

View File

@ -0,0 +1,211 @@
#!/usr/bin/env python
import MySQLdb
import MySQLdb.cursors
import yaml
import sys
import os.path
from pprint import pprint
from . import data
from . import details
"""Get command line options"""
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-c", "--conf", type="string", help="MySQL config file", dest="config", default= os.path.join(os.path.expanduser("~"),".my.cnf"))
parser.add_option("-s", "--host", type="string", help="Webserver hostname", dest="host", default="localhost")
parser.add_option("-d", "--details", type="string", help="Detailed information (YAML configuration file)", dest="details", default=None)
parser.add_option("-p", "--port", type="string", help="Webserver port", dest="port", default="5000")
opts, args = parser.parse_args()
"""Check if configuration files exist"""
def checkConfigFile(msg, fname):
if not os.path.isfile(fname):
sys.exit("Error: '" + fname + "' not found")
else:
print(msg, "->", fname)
# Check sql config
sqlconfig = opts.config
checkConfigFile("MySQL config", sqlconfig)
# Check details file
if opts.details:
checkConfigFile("Details", opts.details)
# Instantiate global detail dealer, will be initialized in reloadOverview
detaildealer = details.DetailDealer()
"""Remove all characters from string except alphanuermics and _"""
def scrub(table_name):
return ''.join( chr for chr in table_name if chr.isalnum() or chr == '_' )
"""Global mysql handles"""
db = None
cur = None
def loadSession(dbconf):
global db
if db:
db.close()
db = MySQLdb.connect(read_default_file=dbconf, cursorclass=MySQLdb.cursors.DictCursor)
return db.cursor()
def closeSession():
if cur: cur.close()
global db
db.close()
db = None
'''Populate variant results for overview data'''
def getVariants(cur, table):
restbl = table.getDetails().getDBName()
cur.execute("""SELECT sum((t.time2 - t.time1 + 1) * width) AS total, resulttype,variant, v.id as variant_id, benchmark, details FROM variant v JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address JOIN %s r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id GROUP BY v.id, resulttype, details""" % (restbl)) # % is used here, as a tablename must not be quoted
res = cur.fetchall()
rdic = {}
# Build dict with variant id as key
for r in res:
# if variant entry already exists:
variant = table.getVariant(int(r['variant_id']))
if not variant: # if variant did not exist yet, create it:
variant_details = detaildealer.getVariant(restbl, r['variant'])
benchmark_details = detaildealer.getBenchmark(restbl, r['variant'], r['benchmark'])
table_details = detaildealer.getTable(restbl)
variant = data.Variant(int(r['variant_id']), r['variant'], table_details, benchmark_details, variant_details)
variant.addResulttype(r['resulttype'], r['total'])
table.addVariant(variant)
'''Get overview data for index page'''
def reloadOverview():
overview = data.Overview()
detaildealer.reload(opts.details)
cur = loadSession(sqlconfig)
cur.execute("show tables like 'result_%'")
result_tables = cur.fetchall()
results = {}
for rdic in result_tables:
# r is the tablename, -> result_FOOBAR
for key, tablename in rdic.items():
table = data.ResultTable(tablename,detaildealer)
getVariants(cur, table)
overview.add(table)
# Check if objdump table exists
cur.execute("SHOW TABLES like 'objdump'")
objdump_exists = (len(cur.fetchall()) == 1)
closeSession()
return overview, objdump_exists
"""Load overview data at server startup"""
print("Loading overview data from database. This may take a while ...")
overview_data, objdump_exists = reloadOverview()
print("done.")
## Get overview data for views.index()
def getOverview():
return overview_data
def objdumpExists():
return objdump_exists
"""Get Results for one variant id"""
def getVariantResult(table, variantid):
cur = loadSession(sqlconfig)
restbl = scrub(table)
stmt = "SELECT resulttype, count(*) as total from %s r join fsppilot on r.pilot_id=fsppilot.id join variant on fsppilot.variant_id=variant.id" % (restbl)
where = " WHERE variant.id = %s group by resulttype ORDER BY resulttype "
stmt = stmt + where
cur.execute(stmt, variantid)
res = cur.fetchall()
closeSession()
return res
'''Show objdump together with according injection result types.'''
def getCode(result_table, variant_id, resultlabel=None):
result_table = scrub(result_table)
filt = ''
if not variant_id or not result_table:
return None
variant = overview_data.getVariantById(variant_id)
mapper = variant.getMapper()
if resultlabel:
dbnames = mapper.getDBNames(resultlabel)
if dbnames:
filt = " and ( "
for dbn in dbnames[:-1]:
filt += "resulttype = '" + dbn + "' OR "
filt += "resulttype = '" + dbnames[-1] +"' ) "
else:
filt = " and resulttype = '" + resultlabel + "' "
# I especially like this one:
select = "SELECT instr_address, opcode, disassemble, comment, sum(t.time2 - t.time1 + 1) as totals, GROUP_CONCAT(DISTINCT resulttype SEPARATOR ', ') as results FROM variant v "
join = " JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address JOIN %s r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id JOIN objdump ON objdump.variant_id = v.id AND objdump.instr_address = injection_instr_absolute " %(scrub(result_table))
where = "WHERE v.id = %s "
group = "GROUP BY injection_instr_absolute ORDER BY totals DESC "
cur = loadSession(sqlconfig)
stmt = select + join + where + filt + group
cur.execute(stmt, (variant_id))
dump = cur.fetchall()
closeSession()
resulttypes = variant.getResultLabels()
return dump, resulttypes
def getCodeExcerpt(variant_id, instr_addr):
code = {}
limit = 8
cur = loadSession(sqlconfig)
cur.execute( """(SELECT instr_address, opcode, disassemble, comment FROM objdump \
WHERE instr_address < %s AND variant_id = %s \
ORDER BY instr_address DESC LIMIT %s) \
ORDER BY instr_address ASC""" , (instr_addr, variant_id, limit))
below = cur.fetchall()
code['below'] = below
cur.execute("""SELECT instr_address, opcode, disassemble, comment FROM objdump \
WHERE instr_address >= %s AND variant_id = %s \
ORDER BY instr_address ASC LIMIT %s""", (instr_addr, variant_id, limit+1))
upper = cur.fetchall()
code['upper'] = upper
closeSession()
return code
def getResultsbyInstruction(result_table, variant_id, instr_addr, resultlabel=None):
restypefilter = None
if resultlabel:
variant = overview_data.getVariantById(variant_id)
mapper = variant.getMapper()
if resultlabel:
dbnames = mapper.getDBNames(resultlabel)
if dbnames:
restypefilter = " and ( "
for dbn in dbnames[:-1]:
restypefilter += "resulttype = '" + dbn + "' OR "
restypefilter += "resulttype = '" + dbnames[-1] +"' ) "
select = "SELECT bitoffset as 'Bit Offset', hex(injection_instr_absolute) as 'Instruction Address', hex(original_value) as 'Original Value', hex(data_address) as 'Data Address', resulttype as 'Result Type', details as 'Details' from %s " % scrub(result_table)
join = "JOIN fsppilot ON pilot_id = fsppilot.id "
where = "WHERE variant_id = %s and injection_instr_absolute = %s "
order = "ORDER BY data_address, bitoffset"
cur = loadSession(sqlconfig)
if not restypefilter:
stmt = select + join + where + order
cur.execute(stmt, (variant_id, instr_addr))
else:
stmt = select + join + where + restypefilter + order
cur.execute(stmt, (variant_id, instr_addr))
res = cur.fetchall()
closeSession()
return res
def showDBstatus():
res = "TODO"
return res

View File

@ -0,0 +1,5 @@
dl.horizontal {font-size:12px; width:850px;}
dl.horizontal dt {float:left; width:300px; clear:both; margin:0 0 5px 0; padding:3px;}
dl.horizontal dd {float:left; width:500px; border:1px solid #aaaaaa; margin:0 0 5px 0; padding:2px; -moz-box-shadow: 1px 1px 3px #aaaaaa;}
dl.horizontal dd span {background:#91b4e6; display:block; color:black; text-indent:4px;}

View File

@ -0,0 +1,214 @@
body {
margin: 0;
padding: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #444;
}
a:visited {
color : #444;
}
a:link {
color : #444;
text-decoration: none;
}
/*
* Create dark grey header with a white logo
*/
header {
background-color: #2B2B2B;
height: 30px;
width: 100%;
opacity: .9;
margin-bottom: 10px;
}
header h1.logo {
margin: 0;
font-size: 1.5em;
color: #fff;
text-transform: uppercase;
float: left;
}
header h1.logo:hover {
color: #fff;
text-decoration: none;
}
/*
* Center the body content
*/
.container {
width: 95%;
margin: 0 auto;
}
div.jumbo {
padding: 10px 0 30px 0;
background-color: #eeeeee;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
h2 {
font-size: 1.2em;
margin-top: 40px;
text-align: center;
letter-spacing: -1px;
}
h3 {
font-size: 1.0em;
font-weight: 100;
margin-top: 30px;
text-align: center;
/*letter-spacing: -1px;*/
color: #999;
}
#footer {
text-align: center;
color: #444;
font-size:10pt;
}
/*
* Table styles
*/
.codetable, .resulttable, .overviewtable{
font-family: monospace;
margin: auto;
}
.overviewtable {
border: 1px gray solid;
margin: auto;
}
/*
.overviewtable tr:nth-child(4n), .overviewtable tr:nth-child(4n-1) {
background: #fff;
}
.overviewtable tr:nth-child(4n-2), .overviewtable tr:nth-child(4n-3) {
background: #e8ffb3;
}
*/
.resulttable, .codetable, .overviewtable{
margin: auto;
border: solid #ccc 1px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 1px 1px #ccc;
-moz-box-shadow: 0 1px 1px #ccc;
box-shadow: 0 1px 1px #ccc;
}
.codetable tr:hover, .resulttable tr:hover {
background: #fbf8e9;
/* -o-transition: all 0.1s ease-in-out;
-webkit-transition: all 0.1s ease-in-out;
-moz-transition: all 0.1s ease-in-out;
-ms-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
*/
}
.resulttable td, .resulttable th, .codetable td, .codetable th {
border-left: none;
border-top: none;
padding: 2px;
text-align: left;
display: table-cell;
}
.codetable td a {
text-decoration: none;
display: block;
padding: 0px;
height: 100%;
}
.resulttable th, .codetable th, .overviewtable th {
background-color: #dce9f9;
background-image: -webkit-gradient(linear, left top, left bottom, from(#efe), to(#91b4e6));
background-image: -webkit-linear-gradient(top, #efe, #91b4e6);
background-image: -moz-linear-gradient(top, #efe, #91b4e6);
background-image: -ms-linear-gradient(top, #efe, #91b4e6);
background-image: -o-linear-gradient(top, #efe, #91b4e6);
background-image: linear-gradient(top, #efe, #91b4e6);
-webkit-box-shadow: 0 1px 0 rgba(255,255,255,.8) inset;
-moz-box-shadow:0 1px 0 rgba(255,255,255,.8) inset;
box-shadow: 0 1px 0 rgba(255,255,255,.8) inset;
border-top: none;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
}
.resulttable td:first-child, .resulttable th:first-child, .codetable td:first-child, .codetable th:first-child {
border-left: none;
}
.resulttable th:first-child, .codetable th:first-child {
-moz-border-radius: 6px 0 0 0;
-webkit-border-radius: 6px 0 0 0;
border-radius: 6px 0 0 0;
}
.resulttable th:last-child, .codetable th:last-child {
-moz-border-radius: 0 6px 0 0;
-webkit-border-radius: 0 6px 0 0;
border-radius: 0 6px 0 0;
}
.resulttable th:only-child, .codetable th:only-child{
-moz-border-radius: 6px 6px 0 0;
-webkit-border-radius: 6px 6px 0 0;
border-radius: 6px 6px 0 0;
}
.resulttable tr:last-child td:first-child, .codetable tr:last-child td:first-child {
-moz-border-radius: 0 0 0 6px;
-webkit-border-radius: 0 0 0 6px;
border-radius: 0 0 0 6px;
}
.resulttable tr:last-child td:last-child, .codetable tr:last-child td:last-child {
-moz-border-radius: 0 0 6px 0;
-webkit-border-radius: 0 0 6px 0;
border-radius: 0 0 6px 0;
}
.resulttypemenu {
text-align: center;
font-size: 12px
}
/*
* Display navigation links inline
*/
.menu {
float: right;
margin-top: 8px;
}
.menu li {
display: inline;
}
.menu li + li {
margin-left: 35px;
}
.menu li a {
color: #999;
text-decoration: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,11 @@
{% extends "layout.html" %}
{% block content %}
{% if status %}
<h2>About</h2>
{{ status }}
{% else %}
<h2> Sorry, no status information.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,50 @@
{% extends "layout.html" %}
{% block content %}
<h1>Variant Results</h1>
{% if resulttypes %}
<table>
<tr><td>Result Table</td><td><b>{{ variant_details.getTableDetails().getTitle() }}</b><td></tr>
<tr><td>Variant </td><td><b>{{ variant_details.getDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getDetails().getDetails() }}</b></td></tr>
<tr><td>Benchmark </td><td><b>{{ variant_details.getBenchmarkDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getBenchmarkDetails().getDetails() }}</b></td></tr>
<tr><td>Result Count </td><td><b>{{ results|length }}</b></td></tr>
</table>
<hr>
<p class='resulttypemenu'>| <a href="{{ url_for('code', variant_id=request.args.get('variant_id'), table=request.args.get('table')) }}">All Results</a> |
{% for restype in resulttypes %}
<a href="{{ url_for('code', variant_id=request.args.get('variant_id'), table=request.args.get('table'), resulttype=restype )}}">{{ restype}}</a> |
{% endfor %}
</p>
<hr>
<table class="codetable">
<tr>
<th>Address</th>
<th>Opcode</th>
<th>Disassembly</th>
<th>Comment</th>
<th>Results</th>
<th># Results</th>
</tr>
{% for d in results %}
{% set link = url_for('instr_details', table=request.args.get('table'), variant_id=request.args.get('variant_id'), benchmark=request.args.get('benchmark'), variant=request.args.get('variant'), resulttype=request.args.get('resulttype'), instr_address=d['instr_address'] ) %}
<tr>
<td><a href="{{ link }}">{{ "0x%x"|format(d['instr_address']) }}</a></td>
<td><a href="{{ link }}">{{ d['opcode'] }}</a></td>
<td><a href="{{ link }}">{{ d['disassemble'] }}</a></td>
<td><a href="{{ link }}">{{ d['comment'] }}</a></td>
<td><a href="{{ link }}">{{ d['results'] }}</a></td>
<td><a href="{{ link }}">{{ d['totals'] }}</a></td>
</tr>
{% endfor %}
</table>
{% else %}
<h1> Sorry, no dump found.</h1>
{% endif %}
{%endblock %}

View File

@ -0,0 +1,55 @@
{% extends "layout.html" %}
{% block content %}
{%if overview %}
{% for tablekey, resulttable in overview.getTables().items() %}
<h2>Result table: {{ resulttable.getDetails().getTitle() }}</h2>
-> <a href="{{ url_for('index', reload=1) }}">Reload data</a> <-
<dl>
<dt>Details:</td>
<dd>
{{ resulttable.getDetails().getDetails() }}
<dd>
</dl>
{% if not objdump_there %}
No objdump found
{% endif %}
<table class="overviewtable" cellspacing="0px">
{% for varid, variant in resulttable.getVariants().items() %}
<tr><th>
{% set variant_title=variant.getDetails().getTitle() ~ " - " ~ variant.getBenchmarkDetails().getTitle() ~ " id: " ~ variant.getId() %}
{% if objdump_there %}
<a href="{{ url_for('code',table=resulttable.getDetails().getDBName(), variant_id=variant.getId() ) }}">{{ variant_title }}</a>
{% else %}
{{ variant_title }}
{% endif %}
(Total: {{ variant.getTotals() }})</a>
</th></tr>
<tr><td>
{% if variant.getDetails().getDetails() %}
Variant Details: {{ variant.getDetails().getDetails() }}
{% endif %}
{% if variant.getBenchmarkDetails().getDetails() %}
<br> Benchmark Details: {{ variant.getBenchmarkDetails().getDetails() }}</td></tr>
{% endif %}
<tr><td>
<dl class="horizontal">
{% for reslabel,count in variant.getResults().items() %}
<dt>
{% if objdump_there %}
<a href="{{ url_for('code', table=resulttable.getDetails().getDBName(), variant_id=variant.getId(), resulttype=reslabel ) }}">{{ reslabel }}</a>
{% else %}
{{ reslabel }}
{% endif %}
</dt>
<dd><span style="width:{{count * 100 / variant.getTotals() }}%;">{{count}}</span></dd>
{% endfor %}
</dl></td></tr>
{% endfor %}
</table>
{% endfor %}
{% else %}
<h2> Sorry, no results found.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,65 @@
{% extends "layout.html" %}
{% block content %}
{% if code %}
<h1>Result by Instruction</h1>
<table>
<tr><td>Result Table</td><td><b>{{ variant_details.getTableDetails().getTitle() }}</b><td></tr>
<tr><td>Variant </td><td><b>{{ variant_details.getDetails().getTitle() }}</b></td></tr>
<tr><td>Benchmark </td><td><b>{{ variant_details.getBenchmarkDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getDetails().getDetails() }}</b></td></tr>
<tr><td>Instruction Address </td><td><b>{{ "0x%x (Dec: %d)"|format(request.args.get('instr_address')|int, request.args.get('instr_address')|int) }}</b></td></tr>
<tr><td>Total Results</td><td><b>{{ result|length }}</b></td></tr>
</table>
<hr>
<h2>Code</h2>
<table class="codetable">
<tr>
<th>Address</th>
<th>Opcode</th>
<th>Disassembly</th>
<th>Comment</th>
</tr>
{% for d in code['below'] %}
<tr>
<td>{{ "0x%x"|format(d['instr_address']) }}</td>
<td>{{ d['opcode'] }}</td>
<td>{{ d['disassemble'] }}</td>
<td>{{ d['comment'] }}</td>
</tr>
{% endfor %}
<tr style="font-weight: bold">
<td>{{ "0x%x"|format(code['upper'][0]['instr_address']) }}</td>
<td>{{ code['upper'][0]['opcode'] }}</td>
<td>{{ code['upper'][0]['disassemble'] }}</td>
<td>{{ code['upper'][0]['comment'] }}</td>
</tr>
{% for d in code['upper'][1:] %}
<tr>
<td>{{ "0x%x"|format(d['instr_address']) }}</td>
<td>{{ d['opcode'] }}</td>
<td>{{ d['disassemble'] }}</td>
<td>{{ d['comment'] }}</td>
</tr>
{% endfor %}</table>
<hr>
<h2>Results ({{ result|length }})</h2>
<table class="resulttable">
<tr>
{% for key, value in result[0].items() -%}
<th>{{ key }}</th>
{% endfor -%}
</tr>
{% for r in result -%}
<tr>
{% for k,v in r.items() -%}
<td>{{ v }}</td>
{% endfor -%}
</tr>
{% endfor -%}
</tr>
</table>
{% else %}
<h2> Sorry, no details found.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<title>FAIL* Results</title>
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"></strong>
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/barchart.css') }}"></strong>
</head>
<body>
<header>
<div class="container">
<h1 class="logo">FAIL*</h1>
<strong><nav>
<ul class="menu">
<li><a href="{{ url_for('index') }}">Home</a></li>
<li><a href="{{ url_for('about') }}">About</a></li>
</ul>
</nav></strong>
</div>
</header>
<div class="container">
{% block content %}
{% endblock %}
</div>
<hr>
<div id="footer">
&copy; FAIL* - Fault Injection Leveraged
</div>
</body>
</html>

View File

@ -0,0 +1,42 @@
from flask import render_template,request
from app import app
# import model
# import data
from . import model
from . import data
@app.route('/')
@app.route('/index')
def index():
reload_overview = request.args.get('reload', False)
if reload_overview:
print("Reloading overview...")
model.reloadOverview()
return render_template("index.html", overview=model.getOverview(), objdump_there = model.objdumpExists())
@app.route('/code')
def code():
variant_id = request.args.get('variant_id', None)
resulttype = request.args.get('resulttype', None)
table = request.args.get('table', None)
res,restypes = model.getCode(table, variant_id, resulttype)
var_dets = model.getOverview().getVariantById(variant_id)
return render_template("code.html", results=res, resulttypes=restypes, variant_details=var_dets )
@app.route('/instr_details')
def instr_details():
table = request.args.get('table', None)
variant_id = request.args.get('variant_id', None)
instr_addr = request.args.get('instr_address', None)
resulttype = request.args.get('resulttype', None)
codeexcerpt = model.getCodeExcerpt(variant_id, instr_addr)
var_dets = model.getOverview().getVariantById(variant_id)
results = model.getResultsbyInstruction(table, variant_id, instr_addr, resulttype)
return render_template("instr_details.html", code=codeexcerpt, result=results, variant_details=var_dets)
@app.route('/about')
def about():
stat = model.showDBstatus()
return render_template("about.html", status=stat)

View File

@ -0,0 +1,69 @@
# YAML-based: http://yaml.org/
# Online parser for testing: http://yaml-online-parser.appspot.com/
# Some notes:
# YAML is case-sensitive and structured by indention!
#
# The 'defaults' section describes an *optional* default result type mapping for all tables.
# The 'tables' section describes result tables in more detail.
# A table consists of variants, each variant of benchmarks.
# Each of these configuration items
# title: Table title
# details: Some textual description
# mapping: A distinct mapping, if not set, the parent item's mapping is used
defaults:
mapping:
Everything OK:
- OK
- OK_DETECTED_ERROR
- OK_WRONG_CONTROL_FLOW
Outside Data Section:
- ERR_OUTSIDE_DATA
Hardware Trap:
- ERR_OUTSIDE_TEXT
- ERR_TRAP
Silent Data Corruption:
- ERR_WRONG_RESULT
tables:
result_CoredVoterProtoMsg:
title: CoRed Voter Experiment Results
variants:
x86_cored_voter:
title: x86 CoRed Voter Experiment
details: Some interesting details about the experiment.
benchmarks:
ean-random-4:
title: Random 4 bit injections
details: |
The details can also written this way.
The pipe insert the newlines. Cool, isn't it?
ean-random-5:
title: Random 5 bit injections
details: Details about 5 bit random injection benchmark.
mapping:
Alright:
- OK
- OK_DETECTED_ERROR
- OK_WRONG_CONTROL_FLOW
Not Alright:
- ERR_OUTSIDE_DATA
- ERR_OUTSIDE_TEXT
- ERR_TRAP
- ERR_WRONG_RESULT
Timeout:
- ERR_TIMEOUT
# Another variant within result_CoredVoterProtoMsg
x86_cored_voter2:
title: variant title
details: variant details
benchmarks:
ean-random-2:
title: benchmarktitle
details: some benchmark details
ean-random-3:
title: benchmark random 3
details: some benchmark 3 details

5
fail/bin/resultbrowser/run.py Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env python
from app import app
from app import model
app.run(debug=False, port=int(model.opts.port), host=model.opts.host)

BIN
fail/share/BIOS-bochs-latest (Stored with Git LFS) Executable file

Binary file not shown.

BIN
fail/share/vgabios.bin (Stored with Git LFS) Executable file

Binary file not shown.

327
flake.nix
View File

@ -22,7 +22,19 @@ rec {
overlays = []; overlays = [];
}; };
boost174_pkgs = i386_pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
overlays = [];
# Build crosscompiler
crossSystem = {
config = "i386-elf";
libc = "newlib";
};
};
boost_pkgs =
import (builtins.fetchTarball { import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz"; url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz";
sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y"; sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y";
@ -30,6 +42,14 @@ rec {
inherit system; inherit system;
}; };
libdwarf_pkgs =
import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/f597e7e9fcf37d8ed14a12835ede0a7d362314bd.tar.gz";
sha256 = "sha256:1l79hh7jh7m8yc5mvc8dbg6s8rf30bgm994kf07xriqbzwfn158r";
}) {
inherit system;
};
inherit (pkgs) lib stdenv; inherit (pkgs) lib stdenv;
# ========================================================================================= # =========================================================================================
@ -82,9 +102,6 @@ rec {
# Determine the project root, used e.g. in cmake scripts # Determine the project root, used e.g. in cmake scripts
set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel) set -g -x FLAKE_PROJECT_ROOT (git rev-parse --show-toplevel)
# Rust Bevy:
# abbr -a build-release-windows "CARGO_FEATURE_PURE=1 cargo xwin build --release --target x86_64-pc-windows-msvc"
# C/C++: # C/C++:
# abbr -a cmake-debug "${cmakeDebug}" # abbr -a cmake-debug "${cmakeDebug}"
# abbr -a cmake-release "${cmakeRelease}" # abbr -a cmake-release "${cmakeRelease}"
@ -111,14 +128,12 @@ rec {
pyyaml pyyaml
]); ]);
boost174 = boost174_pkgs.boost174;
libpcl = stdenv.mkDerivation rec { libpcl = stdenv.mkDerivation rec {
pname = "libpcl1"; pname = "libpcl1";
version = "1.12-2"; version = "1.12-2";
src = pkgs.fetchurl { src = pkgs.fetchurl {
url = "http://launchpadlibrarian.net/521269537/libpcl1_1.12-2_amd64.deb"; url = "http://launchpadlibrarian.net/521269537/${pname}_${version}_amd64.deb";
hash = "sha256-GL3mjPAccAtRMAJPnDMCHiDf6xNvGi4oUWylOIqBjP0="; hash = "sha256-GL3mjPAccAtRMAJPnDMCHiDf6xNvGi4oUWylOIqBjP0=";
}; };
@ -131,9 +146,6 @@ rec {
installPhase = '' installPhase = ''
runHook preInstall runHook preInstall
ls -al
# dpkg-deb -x ${pname}_${version}_amd64.deb libpcl
mkdir -p $out/lib mkdir -p $out/lib
cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/ cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/
@ -141,6 +153,208 @@ rec {
''; '';
}; };
wasi-sdk = stdenv.mkDerivation rec {
pname = "wasi-sdk";
version = "29";
src = let
baseurl = "https://github.com/WebAssembly/wasi-sdk/releases/download";
in
builtins.fetchTarball {
url = "${baseurl}/${pname}-${version}/${pname}-${version}.0-x86_64-linux.tar.gz";
sha256 = "sha256:16afis71iqfvwiny4dz0lk9f7wbary0wa67ybwyhywr8g57ss6hq";
};
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
buildInputs = with pkgs; [
libgcc.lib
];
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -rv ./* $out/
runHook postInstall
'';
};
iwasm = stdenv.mkDerivation rec {
pname = "iwasm";
version = "2.4.4";
src = let
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
in
builtins.fetchTarball {
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
sha256 = "sha256:05irihz3yf7hpc0a59qz9i62imhrsni9xy9nxwsn6b8s92c1yzrp";
};
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
buildInputs = with pkgs; [
libz
zstd
libgcc.lib
];
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp -rv ./* $out/bin/
runHook postInstall
'';
};
wamrc = stdenv.mkDerivation rec {
pname = "wamrc";
version = "2.4.4";
src = let
baseurl = "https://github.com/bytecodealliance/wasm-micro-runtime/releases/download";
in
builtins.fetchTarball {
url = "${baseurl}/WAMR-${version}/${pname}-${version}-x86_64-ubuntu-22.04.tar.gz";
sha256 = "sha256:0264arh03gc35z0zdvw07qdvqgfvsxr3qgl1aszghwicmdmh4sqj";
};
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
buildInputs = with pkgs; [
libz
zstd
libgcc.lib
];
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp -rv ./* $out/bin/
runHook postInstall
'';
};
wamr = stdenv.mkDerivation {
pname = "wamr";
version = "2.4.4";
src = pkgs.fetchFromGitea {
domain = "gitea.local.chriphost.de";
owner = "christoph";
repo = "wamr";
rev = "fd69a4e76ec0d384bd79f514772b7dfa240fc0d7";
hash = "sha256-rlCx4isI0k6rC9E0hWIA9LeinqiACug7zxj9z/e4SBQ=";
};
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -rv ./* $out/
runHook postInstall
'';
};
mkLibiwasm = {
buildenv,
platform,
buildtype,
cflags,
extraCmakeFlags ? [],
}:
buildenv.mkDerivation {
pname = "libiwasm";
version = "2.4.4";
src = pkgs.fetchFromGitea {
domain = "gitea.local.chriphost.de";
owner = "christoph";
repo = "wamr";
rev = "fd69a4e76ec0d384bd79f514772b7dfa240fc0d7";
hash = "sha256-rlCx4isI0k6rC9E0hWIA9LeinqiACug7zxj9z/e4SBQ=";
};
nativeBuildInputs = with pkgs; [cmake];
dontStrip = true;
cmakeBuildType = buildtype;
cmakeFlags =
extraCmakeFlags
++ [
"-DCMAKE_VERBOSE_MAKEFILE=ON"
"-DCMAKE_COLOR_DIAGNOSTICS=ON"
"-DWAMR_BUILD_PLATFORM=${platform}"
"-DWAMR_BUILD_TARGET=X86_32"
"-DWAMR_BUILD_AOT=1"
"-DWAMR_BUILD_WAMR_COMPILER=0"
"-DWAMR_BUILD_INTERP=1"
"-DWAMR_BUILD_FAST_INTERP=0"
"-DWAMR_BUILD_JIT=0"
"-DWAMR_BUILD_FAST_JIT=0"
"-DWAMR_BUILD_LIBC_BUILTIN=1"
"-DWAMR_BUILD_LIBC_WASI=0"
"-DWAMR_BUILD_SIMD=0"
];
# Since GCC 15, implicit declarations are an error. Disable this.
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration " + cflags;
};
libiwasm-baremetal-debug = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "Debug";
cflags = "-O0 -ggdb3";
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-baremetal-release = mkLibiwasm {
buildenv = i386_pkgs.stdenv;
platform = "baremetal";
buildtype = "MinSizeRel";
cflags = "-O2 -ggdb3 -DNDEBUG";
extraCmakeFlags = [
"-DCMAKE_SYSTEM_NAME=Generic"
"-DCMAKE_SYSTEM_PROCESSOR=i386"
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
];
};
libiwasm-linux-debug = mkLibiwasm {
buildenv = pkgs.multiStdenv;
platform = "linux";
buildtype = "Debug";
cflags = "-O0 -ggdb3";
};
libiwasm-linux-release = mkLibiwasm {
buildenv = pkgs.multiStdenv;
platform = "linux";
buildtype = "MinSizeRel";
cflags = "-O2 -ggdb3 -DNDEBUG";
};
# =========================================================================================== # ===========================================================================================
# Specify dependencies # Specify dependencies
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview # https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
@ -149,56 +363,88 @@ rec {
# Add dependencies to nativeBuildInputs if they are executed during the build: # Add dependencies to nativeBuildInputs if they are executed during the build:
# - Those which are needed on $PATH during the build, for example cmake and pkg-config # - Those which are needed on $PATH during the build, for example cmake and pkg-config
# - Setup hooks, for example makeWrapper # - Setup hooks, for example makeWrapper/autoPatchelfHook
# - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl # - Interpreters needed by patchShebangs for build scripts (with the --build flag), which can be the case for e.g. perl
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
autoPatchelfHook just
gdb
xxd
wabt
grub2
xorriso
mariadb.client
dbeaver-bin
iwasm
wamrc
fail-bin
# Don't install to not pollute our PATH. Just export as environment variable.
# wasi-sdk
# libiwasm_debug
# libiwasm_release
]; ];
# Add dependencies to buildInputs if they will end up copied or linked into the final output or otherwise used at runtime: # Add dependencies to buildInputs if they will end up copied or linked into the final output or otherwise used at runtime:
# - Libraries used by compilers, for example zlib # - Libraries used by compilers, for example zlib
# - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl # - Interpreters needed by patchShebangs for scripts which are installed, which can be the case for e.g. perl
buildInputs = with pkgs; [ buildInputs = with pkgs; [];
python # For resultbrowser
# ===========================================================================================
# Define buildable + installable packages
# ===========================================================================================
fail-bin = stdenv.mkDerivation {
pname = "fail";
version = "1.0.0";
src = ./.;
nativeBuildInputs = with pkgs; [
autoPatchelfHook
];
buildInputs = with pkgs; [
# FAIL runtime dependencies
python # bochs-experiment-runner.py, resultbrowser.py
alsa-lib # libasound.so.2 alsa-lib # libasound.so.2
boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0 boost_pkgs.boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
capstone_4 # libcapstone.so.4 capstone_4 # libcapstone.so.4
libdwarf # libdwarf.so.1 libdwarf_pkgs.libdwarf # libdwarf.so.1
libelf # libelf.so.1 elfutils # libelf.so.1
mariadb-connector-c # libmariadb.so.3 mariadb # libmariadb.so.3
libpcl # libpcl.so.1 libpcl # libpcl.so.1
protobuf # libprotobuf.so.32 protobuf_21 # libprotobuf.so.32
SDL # libSDL-1.2.so.0 SDL # libSDL-1.2.so.0
libx11 # libX11.so.6 libx11 # libX11.so.6
libxrandr # libXrandr.so.2 libxrandr # libXrandr.so.2
libz # libz.so.1 libz # libz.so.1
]; ];
# ===========================================================================================
# Define buildable + installable packages
# ===========================================================================================
package = stdenv.mkDerivation rec {
inherit nativeBuildInputs buildInputs;
pname = "fail";
version = "1.0.0";
src = ./.;
installPhase = '' installPhase = ''
runHook preInstall runHook preInstall
mkdir -p $out mkdir -p $out
cp -rv ./bin $out/bin cp -rv ./fail/bin $out/bin
cp -rv ./share $out/share cp -rv ./fail/share $out/share
runHook postInstall runHook postInstall
''; '';
}; };
in rec { in {
# Provide package for "nix build" # Provide package for "nix build"
packages = { packages = {
default = package; default = fail-bin;
fail = fail-bin;
wasi-sdk = wasi-sdk;
iwasm = iwasm;
wamrc = wamrc;
};
apps = {
default = flake-utils.lib.mkApp {drv = fail-bin;};
fail = fail-bin;
wasi-sdk = wasi-sdk;
iwasm = iwasm;
wamrc = wamrc;
}; };
apps.default = flake-utils.lib.mkApp {drv = package;};
devShells = { devShells = {
# Provide default environment for "nix develop". # Provide default environment for "nix develop".
@ -212,7 +458,22 @@ rec {
# ========================================================================================= # =========================================================================================
# Dynamic libraries from buildinputs: # Dynamic libraries from buildinputs:
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; # LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
JUST_JUSTFILE = "./nixos.just";
# Those are read by the justfile
FAIL_SHARE = "${fail-bin}/share";
WASI_ROOT = wasi-sdk;
WAMR_ROOT = wamr;
LIBIWASM_DEBUG = "${libiwasm-baremetal-debug}/lib";
LIBIWASM_RELEASE = "${libiwasm-baremetal-release}/lib";
LIBIWASM_LINUX_DEBUG = "${libiwasm-linux-debug}/lib";
LIBIWASM_LINUX_RELEASE = "${libiwasm-linux-release}/lib";
CROSS_CC = "${i386_pkgs.stdenv.cc}/bin/i386-elf-gcc";
CROSS_CXX = "${i386_pkgs.stdenv.cc}/bin/i386-elf-g++";
LINUX_CC = "${pkgs.multiStdenv.cc}/bin/gcc";
LINUX_CXX = "${pkgs.multiStdenv.cc}/bin/g++";
}; };
}; };
}); });

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
ghidra/projects/2026-03-19_00-20_sum_c_fail.rep/project.prp (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<PROJECT>
<PROJECT_DATA_XML_NAME NAME="DISPLAY_DATA">
<SAVE_STATE>
<ARRAY NAME="EXPANDED_PATHS" TYPE="string">
<A VALUE="2026-03-19_00-20_sum_c_fail:" />
</ARRAY>
<STATE NAME="SHOW_TABLE" TYPE="boolean" VALUE="false" />
</SAVE_STATE>
</PROJECT_DATA_XML_NAME>
<TOOL_MANAGER ACTIVE_WORKSPACE="Workspace">
<WORKSPACE NAME="Workspace" ACTIVE="true" />
</TOOL_MANAGER>
</PROJECT>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<PROJECT>
<PROJECT_DATA_XML_NAME NAME="DISPLAY_DATA">
<SAVE_STATE>
<ARRAY NAME="EXPANDED_PATHS" TYPE="string">
<A VALUE="2026-03-19_00-56_sum_aot_fail:" />
</ARRAY>
<STATE NAME="SHOW_TABLE" TYPE="boolean" VALUE="false" />
</SAVE_STATE>
</PROJECT_DATA_XML_NAME>
<TOOL_MANAGER ACTIVE_WORKSPACE="Workspace">
<WORKSPACE NAME="Workspace" ACTIVE="true" />
</TOOL_MANAGER>
</PROJECT>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,121 @@
// CSV format per line:
// 0x401000,<count>
//
// Creates NOTE bookmarks in category: FAIL_MARKER
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.BookmarkManager;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class ImportMarkersAsBookmarks extends GhidraScript {
private static final String BOOKMARK_TYPE = "NOTE";
private static final String BOOKMARK_CATEGORY = "FAIL_MARKER";
@Override
public void run() throws Exception {
File input = askFile("Select CSV file", "Import");
BookmarkManager bm = currentProgram.getBookmarkManager();
int imported = 0;
int skipped = 0;
int lineNo = 0;
try (BufferedReader br = new BufferedReader(new FileReader(input))) {
String line;
while ((line = br.readLine()) != null) {
lineNo++;
if (monitor.isCancelled()) {
println("Cancelled.");
break;
}
line = line.trim();
if (line.isEmpty() || line.startsWith("#")) {
continue;
}
String[] parts = splitCsvLine(line);
if (parts.length < 1) {
skipped++;
printerr("Line " + lineNo + ": missing address");
continue;
}
String addrText = parts[0].trim();
String description = parts.length >= 2 ? parts[1].trim() : "";
if (addrText.isEmpty()) {
skipped++;
printerr("Line " + lineNo + ": empty address");
continue;
}
Address addr = parseAddress(addrText);
if (addr == null) {
skipped++;
printerr("Line " + lineNo + ": invalid address: " + addrText);
continue;
}
println("Adding bookmark at " + addr + " with description " + description);
bm.setBookmark(addr, BOOKMARK_TYPE, BOOKMARK_CATEGORY, description);
imported++;
}
}
println("Imported " + imported + " bookmarks.");
if (skipped > 0) {
println("Skipped " + skipped + " lines.");
}
}
public Address parseAddress(String text) {
text = text.trim();
if (text.startsWith("\"") && text.endsWith("\"") && text.length() >= 2) {
text = text.substring(1, text.length() - 1).trim();
}
if (text.startsWith("0x") || text.startsWith("0X")) {
text = text.substring(2);
}
try {
return toAddr(text);
} catch (Exception e) {
return null;
}
}
private String[] splitCsvLine(String line) {
java.util.ArrayList<String> fields = new java.util.ArrayList<>();
StringBuilder current = new StringBuilder();
boolean inQuotes = false;
for (int i = 0; i < line.length(); i++) {
char c = line.charAt(i);
if (c == '"') {
if (inQuotes && i + 1 < line.length() && line.charAt(i + 1) == '"') {
current.append('"');
i++;
} else {
inQuotes = !inQuotes;
}
} else if (c == ',' && !inQuotes) {
fields.add(current.toString());
current.setLength(0);
} else {
current.append(c);
}
}
fields.add(current.toString());
return fields.toArray(new String[0]);
}
}

BIN
injections/2026-03-19_00-20_sum_c_fail/c_host.o (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/c_module.o (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/grub/boot/system.elf (Stored with Git LFS) Executable file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/markers.csv (Stored with Git LFS) Normal file

Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:6afb5fdb5407b4691d171b4d1263b71b7022219618986628e8d881a3e9a56aa3
3 size 163

BIN
injections/2026-03-19_00-20_sum_c_fail/results.txt (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/startup.o (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/cmos (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/config (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/cpu0 (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/dma (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/drive0.buffer (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/floppy (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/floppy.buffer (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/gameport (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/hard_drive (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/ioapic (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/keyboard (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/memory (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/memory.ram (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/pc_system (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/pic (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/pit (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/serial (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/vga (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/vga.memory (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/vga.pel_data (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/state/virt_timer (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/system.elf (Stored with Git LFS) Executable file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/system.iso (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-20_sum_c_fail/trace.pb (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/grub/boot/system.elf (Stored with Git LFS) Executable file

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/markers.csv (Stored with Git LFS) Normal file

Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
2 oid sha256:32ef478d280b93e53311ae1e0862765cbd5c4e8c5aa8679591df5220471cdcf5
3 size 6102

BIN
injections/2026-03-19_00-56_sum_aot_fail/module_host.c (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/results.txt (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/startup.o (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/state/cmos (Stored with Git LFS) Normal file

Binary file not shown.

BIN
injections/2026-03-19_00-56_sum_aot_fail/state/config (Stored with Git LFS) Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More