Compare commits
39 Commits
main
...
ea6a009c0d
| Author | SHA1 | Date | |
|---|---|---|---|
|
ea6a009c0d
|
|||
|
bc2eefface
|
|||
|
a0ea3a3bbf
|
|||
|
92ac5ec7d8
|
|||
|
07ac6f6fc3
|
|||
|
7b47a70448
|
|||
|
96082f33aa
|
|||
|
945c1fe0bc
|
|||
|
5efff7c84e
|
|||
|
83ae53768c
|
|||
| c8fb5d537d | |||
| a6a335aaf4 | |||
| 5d4d84de39 | |||
| 8afdee2fd2 | |||
| 0d871c4e56 | |||
| 5e0b71a818 | |||
| af70aebcff | |||
| cacd2d8883 | |||
| 35dec73236 | |||
| e23a3d5033 | |||
| b500d56c8e | |||
| 8a0193408f | |||
| 129ba0e0b6 | |||
| 0f847d7d2d | |||
| 28d1db3b79 | |||
| c1eb861bfb | |||
| 4b8a4ad0f1 | |||
| a79219d39e | |||
| 593b88c3fd | |||
| b1a8fe0c53 | |||
| 99608cc645 | |||
| 50c6e9adea | |||
| 66eb0b3814 | |||
| 078fdca44b | |||
| 744af52f76 | |||
| 43414edd0a | |||
| 679aeb24d4 | |||
| facf04df7f | |||
| 86baf67fac |
7
.gitattributes
vendored
7
.gitattributes
vendored
@ -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/share/** 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
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/build-*
|
||||
/ghidra/projects/**/*.lock*
|
||||
5
db.conf
Normal file
5
db.conf
Normal 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
BIN
fail-tables.png
(Stored with Git LFS)
Normal file
Binary file not shown.
130
fail.just
Normal file
130
fail.just
Normal 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}}
|
||||
147
fail/bin/bochs-experiment-runner.py
Executable file
147
fail/bin/bochs-experiment-runner.py
Executable 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
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
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
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
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
BIN
fail/bin/prune-trace
(Stored with Git LFS)
Executable file
Binary file not shown.
1
fail/bin/resultbrowser.py
Symbolic link
1
fail/bin/resultbrowser.py
Symbolic link
@ -0,0 +1 @@
|
||||
./resultbrowser/run.py
|
||||
19
fail/bin/resultbrowser/README
Normal file
19
fail/bin/resultbrowser/README
Normal 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.
|
||||
4
fail/bin/resultbrowser/app/__init__.py
Normal file
4
fail/bin/resultbrowser/app/__init__.py
Normal file
@ -0,0 +1,4 @@
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
from app import views
|
||||
143
fail/bin/resultbrowser/app/data.py
Normal file
143
fail/bin/resultbrowser/app/data.py
Normal 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)
|
||||
|
||||
|
||||
216
fail/bin/resultbrowser/app/details.py
Normal file
216
fail/bin/resultbrowser/app/details.py
Normal 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)
|
||||
211
fail/bin/resultbrowser/app/model.py
Executable file
211
fail/bin/resultbrowser/app/model.py
Executable 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
|
||||
|
||||
|
||||
5
fail/bin/resultbrowser/app/static/css/barchart.css
Normal file
5
fail/bin/resultbrowser/app/static/css/barchart.css
Normal 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;}
|
||||
|
||||
214
fail/bin/resultbrowser/app/static/css/main.css
Normal file
214
fail/bin/resultbrowser/app/static/css/main.css
Normal 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;
|
||||
}
|
||||
BIN
fail/bin/resultbrowser/app/static/favicon.ico
Normal file
BIN
fail/bin/resultbrowser/app/static/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
11
fail/bin/resultbrowser/app/templates/about.html
Normal file
11
fail/bin/resultbrowser/app/templates/about.html
Normal 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 %}
|
||||
50
fail/bin/resultbrowser/app/templates/code.html
Normal file
50
fail/bin/resultbrowser/app/templates/code.html
Normal 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 %}
|
||||
|
||||
|
||||
55
fail/bin/resultbrowser/app/templates/index.html
Normal file
55
fail/bin/resultbrowser/app/templates/index.html
Normal 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 %}
|
||||
65
fail/bin/resultbrowser/app/templates/instr_details.html
Normal file
65
fail/bin/resultbrowser/app/templates/instr_details.html
Normal 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 %}
|
||||
32
fail/bin/resultbrowser/app/templates/layout.html
Normal file
32
fail/bin/resultbrowser/app/templates/layout.html
Normal 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">
|
||||
© FAIL* - Fault Injection Leveraged
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
42
fail/bin/resultbrowser/app/views.py
Normal file
42
fail/bin/resultbrowser/app/views.py
Normal 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)
|
||||
69
fail/bin/resultbrowser/conf.yml
Normal file
69
fail/bin/resultbrowser/conf.yml
Normal 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
5
fail/bin/resultbrowser/run.py
Executable 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
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
BIN
fail/share/vgabios.bin
(Stored with Git LFS)
Executable file
Binary file not shown.
330
flake.nix
330
flake.nix
@ -22,7 +22,19 @@ rec {
|
||||
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 {
|
||||
url = "https://github.com/NixOS/nixpkgs/archive/824421b1796332ad1bcb35bc7855da832c43305f.tar.gz";
|
||||
sha256 = "sha256:1w6cjnakz1yi66rs8c6nmhymsr7bj82vs2hz200ipi1sfiq8dy4y";
|
||||
@ -30,6 +42,14 @@ rec {
|
||||
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;
|
||||
|
||||
# =========================================================================================
|
||||
@ -82,9 +102,6 @@ rec {
|
||||
# Determine the project root, used e.g. in cmake scripts
|
||||
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++:
|
||||
# abbr -a cmake-debug "${cmakeDebug}"
|
||||
# abbr -a cmake-release "${cmakeRelease}"
|
||||
@ -111,14 +128,12 @@ rec {
|
||||
pyyaml
|
||||
]);
|
||||
|
||||
boost174 = boost174_pkgs.boost174;
|
||||
|
||||
libpcl = stdenv.mkDerivation rec {
|
||||
pname = "libpcl1";
|
||||
version = "1.12-2";
|
||||
|
||||
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=";
|
||||
};
|
||||
|
||||
@ -131,9 +146,6 @@ rec {
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
ls -al
|
||||
# dpkg-deb -x ${pname}_${version}_amd64.deb libpcl
|
||||
|
||||
mkdir -p $out/lib
|
||||
cp -rv usr/lib/x86_64-linux-gnu/* $out/lib/
|
||||
|
||||
@ -141,6 +153,207 @@ 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];
|
||||
|
||||
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 -ggdb";
|
||||
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 = "Release";
|
||||
cflags = "-O2 -ggdb -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 -ggdb";
|
||||
};
|
||||
libiwasm-linux-release = mkLibiwasm {
|
||||
buildenv = pkgs.multiStdenv;
|
||||
platform = "linux";
|
||||
buildtype = "Release";
|
||||
cflags = "-O2 -ggdb -DNDEBUG";
|
||||
};
|
||||
|
||||
# ===========================================================================================
|
||||
# Specify dependencies
|
||||
# https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-dependencies-overview
|
||||
@ -149,56 +362,88 @@ rec {
|
||||
|
||||
# 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
|
||||
# - 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
|
||||
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:
|
||||
# - 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
|
||||
buildInputs = with pkgs; [
|
||||
python # For resultbrowser
|
||||
buildInputs = with pkgs; [];
|
||||
|
||||
alsa-lib # libasound.so.2
|
||||
boost174 # libboost_coroutine.so.1.74.0, libboost_regex.so.1.74.0, libboost_thread.so.1.74.0
|
||||
capstone_4 # libcapstone.so.4
|
||||
libdwarf # libdwarf.so.1
|
||||
libelf # libelf.so.1
|
||||
mariadb-connector-c # libmariadb.so.3
|
||||
libpcl # libpcl.so.1
|
||||
protobuf # libprotobuf.so.32
|
||||
SDL # libSDL-1.2.so.0
|
||||
libx11 # libX11.so.6
|
||||
libxrandr # libXrandr.so.2
|
||||
libz # libz.so.1
|
||||
];
|
||||
# ===========================================================================================
|
||||
# Define buildable + installable packages
|
||||
# ===========================================================================================
|
||||
package = stdenv.mkDerivation rec {
|
||||
inherit nativeBuildInputs buildInputs;
|
||||
|
||||
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
|
||||
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
|
||||
libdwarf_pkgs.libdwarf # libdwarf.so.1
|
||||
elfutils # libelf.so.1
|
||||
mariadb # libmariadb.so.3
|
||||
libpcl # libpcl.so.1
|
||||
protobuf_21 # libprotobuf.so.32
|
||||
SDL # libSDL-1.2.so.0
|
||||
libx11 # libX11.so.6
|
||||
libxrandr # libXrandr.so.2
|
||||
libz # libz.so.1
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -rv ./bin $out/bin
|
||||
cp -rv ./share $out/share
|
||||
cp -rv ./fail/bin $out/bin
|
||||
cp -rv ./fail/share $out/share
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
in rec {
|
||||
in {
|
||||
# Provide package for "nix build"
|
||||
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 = {
|
||||
# Provide default environment for "nix develop".
|
||||
@ -212,7 +457,22 @@ rec {
|
||||
# =========================================================================================
|
||||
|
||||
# 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++";
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
0
ghidra/projects/2026-03-18_20-53_sum_c_fail.gpr
Normal file
0
ghidra/projects/2026-03-18_20-53_sum_c_fail.gpr
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/00/00000000.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/00/00000000.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/00/~00000000.db/db.2.gbf
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/00/~00000000.db/db.2.gbf
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~index.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~index.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~journal.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/idata/~journal.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/project.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/project.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
18
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/projectState
Normal file
18
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/projectState
Normal file
@ -0,0 +1,18 @@
|
||||
<?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-18_20-53_sum_c_fail:" />
|
||||
</ARRAY>
|
||||
<STATE NAME="SHOW_TABLE" TYPE="boolean" VALUE="false" />
|
||||
</SAVE_STATE>
|
||||
</PROJECT_DATA_XML_NAME>
|
||||
<PROJECT_DATA_XML_NAME NAME="LOADER_OPTIONS">
|
||||
<SAVE_STATE />
|
||||
</PROJECT_DATA_XML_NAME>
|
||||
<TOOL_MANAGER ACTIVE_WORKSPACE="Workspace">
|
||||
<WORKSPACE NAME="Workspace" ACTIVE="true" />
|
||||
</TOOL_MANAGER>
|
||||
</PROJECT>
|
||||
|
||||
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/00/00000000.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/00/00000000.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/00/~00000000.db/db.1.gbf
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/00/~00000000.db/db.1.gbf
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/~journal.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/user/~journal.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/versioned/~index.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/versioned/~index.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/versioned/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_20-53_sum_c_fail.rep/versioned/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
0
ghidra/projects/2026-03-18_22-56_sum_aot_fail.gpr
Normal file
0
ghidra/projects/2026-03-18_22-56_sum_aot_fail.gpr
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/00/00000000.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/00/00000000.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/00/~00000000.db/db.2.gbf
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/00/~00000000.db/db.2.gbf
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~index.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~index.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~journal.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/idata/~journal.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/project.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/project.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
419
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/projectState
Normal file
419
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/projectState
Normal file
@ -0,0 +1,419 @@
|
||||
<?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-18_22-56_sum_aot_fail:" />
|
||||
</ARRAY>
|
||||
<STATE NAME="SHOW_TABLE" TYPE="boolean" VALUE="false" />
|
||||
</SAVE_STATE>
|
||||
</PROJECT_DATA_XML_NAME>
|
||||
<PROJECT_DATA_XML_NAME NAME="LOADER_OPTIONS">
|
||||
<SAVE_STATE />
|
||||
</PROJECT_DATA_XML_NAME>
|
||||
<TOOL_MANAGER ACTIVE_WORKSPACE="Workspace">
|
||||
<WORKSPACE NAME="Workspace" ACTIVE="true">
|
||||
<RUNNING_TOOL TOOL_NAME="CodeBrowser">
|
||||
<ROOT_NODE X_POS="1920" Y_POS="0" WIDTH="1710" HEIGHT="1382" EX_STATE="0">
|
||||
<SPLIT_NODE WIDTH="1621" HEIGHT="816" DIVIDER_LOCATION="148" ORIENTATION="VERTICAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Entropy" OWNER="EntropyPlugin" TITLE="Entropy" ACTIVE="false" GROUP="Header" INSTANCE_ID="3207819926581772885" />
|
||||
<COMPONENT_INFO NAME="Overview" OWNER="OverviewPlugin" TITLE="Overview" ACTIVE="false" GROUP="Header" INSTANCE_ID="3207819926581772883" />
|
||||
</COMPONENT_NODE>
|
||||
<SPLIT_NODE WIDTH="1710" HEIGHT="1297" DIVIDER_LOCATION="185" ORIENTATION="HORIZONTAL">
|
||||
<SPLIT_NODE WIDTH="316" HEIGHT="1297" DIVIDER_LOCATION="640" ORIENTATION="VERTICAL">
|
||||
<COMPONENT_NODE TOP_INFO="1">
|
||||
<COMPONENT_INFO NAME="Program Tree" OWNER="ProgramTreePlugin" TITLE="Program Trees" ACTIVE="true" GROUP="Default" INSTANCE_ID="3720077652375986239" />
|
||||
<COMPONENT_INFO NAME="Bookmarks" OWNER="BookmarkPlugin" TITLE="Bookmarks" ACTIVE="true" GROUP="Core.Bookmarks" INSTANCE_ID="3720077652375986238" />
|
||||
</COMPONENT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="DataTypes Provider" OWNER="DataTypeManagerPlugin" TITLE="Data Type Manager" ACTIVE="true" GROUP="Default" INSTANCE_ID="3720077673712410662" />
|
||||
<COMPONENT_INFO NAME="Symbol Tree" OWNER="SymbolTreePlugin" TITLE="Symbol Tree" ACTIVE="true" GROUP="Default" INSTANCE_ID="3720077652375986234" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
<SPLIT_NODE WIDTH="2791" HEIGHT="1297" DIVIDER_LOCATION="664" ORIENTATION="VERTICAL">
|
||||
<SPLIT_NODE WIDTH="2934" HEIGHT="733" DIVIDER_LOCATION="705" ORIENTATION="VERTICAL">
|
||||
<SPLIT_NODE WIDTH="1390" HEIGHT="1297" DIVIDER_LOCATION="557" ORIENTATION="HORIZONTAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Listing" OWNER="CodeBrowserPlugin" TITLE="Listing: system.elf" ACTIVE="true" GROUP="Core" INSTANCE_ID="3720077673225871399" />
|
||||
</COMPONENT_NODE>
|
||||
<SPLIT_NODE WIDTH="614" HEIGHT="1297" DIVIDER_LOCATION="606" ORIENTATION="VERTICAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Decompiler" OWNER="DecompilePlugin" TITLE="Decompile: wasm_runtime_call_wasm" ACTIVE="true" GROUP="Default" INSTANCE_ID="3720077673225871392" />
|
||||
<COMPONENT_INFO NAME="Bytes" OWNER="ByteViewerPlugin" TITLE="Bytes: system.elf" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871394" />
|
||||
<COMPONENT_INFO NAME="Data Window" OWNER="DataWindowPlugin" TITLE="Defined Data" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410677" />
|
||||
<COMPONENT_INFO NAME="Defined Strings" OWNER="ViewStringsPlugin" TITLE="Defined Strings" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410681" />
|
||||
<COMPONENT_INFO NAME="Equates Table" OWNER="EquateTablePlugin" TITLE="Equates Table" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871397" />
|
||||
<COMPONENT_INFO NAME="External Programs" OWNER="ReferencesPlugin" TITLE="External Programs" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871400" />
|
||||
<COMPONENT_INFO NAME="Functions Window" OWNER="FunctionWindowPlugin" TITLE="Functions" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871403" />
|
||||
<COMPONENT_INFO NAME="Relocation Table" OWNER="RelocationTablePlugin" TITLE="Relocation Table" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410680" />
|
||||
</COMPONENT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Function Call Trees" OWNER="CallTreePlugin" TITLE="Function Call Trees: wasm_runtime_call_wasm" ACTIVE="true" GROUP="Default" INSTANCE_ID="3720077652375986235" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</SPLIT_NODE>
|
||||
<SPLIT_NODE WIDTH="1386" HEIGHT="189" DIVIDER_LOCATION="495" ORIENTATION="HORIZONTAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Data Type Preview" OWNER="DataTypePreviewPlugin" TITLE="Data Type Preview" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673641107496" />
|
||||
</COMPONENT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Virtual Disassembler - Current Instruction" OWNER="DisassembledViewPlugin" TITLE="Disassembled View" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871396" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</SPLIT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Console" OWNER="ConsolePlugin" TITLE="Console" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871393" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</SPLIT_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1710" HEIGHT="1382">
|
||||
<SPLIT_NODE WIDTH="3428" HEIGHT="1323" DIVIDER_LOCATION="619" ORIENTATION="HORIZONTAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Script Manager" OWNER="GhidraScriptMgrPlugin" TITLE="Script Manager" ACTIVE="false" GROUP="Script Group" INSTANCE_ID="3720077652375986236" />
|
||||
</COMPONENT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Script Editor" OWNER="GhidraScriptMgrPlugin" TITLE="ImportMarkersAsBookmarks.java" ACTIVE="false" GROUP="Script Group" INSTANCE_ID="3719883365486679291" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1745" HEIGHT="1168">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Memory Map" OWNER="MemoryMapPlugin" TITLE="Memory Map" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077652375986224" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="383" Y_POS="7" WIDTH="1020" HEIGHT="1038">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Function Graph" OWNER="FunctionGraphPlugin" TITLE="Function Graph" ACTIVE="false" GROUP="Function Graph" INSTANCE_ID="3720077673712410682" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="550" Y_POS="206" WIDTH="655" HEIGHT="509">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Register Manager" OWNER="RegisterPlugin" TITLE="Register Manager" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871402" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1424" HEIGHT="666">
|
||||
<SPLIT_NODE WIDTH="1408" HEIGHT="559" DIVIDER_LOCATION="573" ORIENTATION="HORIZONTAL">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Symbol Table" OWNER="SymbolTablePlugin" TITLE="Symbol Table" ACTIVE="false" GROUP="symbolTable" INSTANCE_ID="3720077673712410678" />
|
||||
</COMPONENT_NODE>
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Symbol References" OWNER="SymbolTablePlugin" TITLE="Symbol References" ACTIVE="false" GROUP="symbolTable" INSTANCE_ID="3720077673712410679" />
|
||||
</COMPONENT_NODE>
|
||||
</SPLIT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="-1" Y_POS="-1" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Checksum Generator" OWNER="ComputeChecksumsPlugin" TITLE="Checksum Generator" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871398" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="-1" Y_POS="-1" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Function Tags" OWNER="FunctionTagPlugin" TITLE="Function Tags" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410663" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="-1" Y_POS="-1" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Comment Window" OWNER="CommentWindowPlugin" TITLE="Comments" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410676" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="-1" Y_POS="-1" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Python" OWNER="InterpreterPanelPlugin" TITLE="Python" ACTIVE="false" GROUP="Default" INSTANCE_ID="3207819978370941531" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="0" Y_POS="0" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Source Files and Transforms" OWNER="SourceFilesTablePlugin" TITLE="Source Files and Transforms" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673225871401" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="0" Y_POS="0" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="PyGhidra" OWNER="PyGhidra" TITLE="PyGhidra" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410675" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="0" Y_POS="0" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Jython" OWNER="Jython" TITLE="Jython" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077673712410664" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1710" HEIGHT="1382">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Bundle Manager" OWNER="GhidraScriptMgrPlugin" TITLE="Bundle Manager" ACTIVE="false" GROUP="Default" INSTANCE_ID="3720077652375986237" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="0" Y_POS="0" WIDTH="0" HEIGHT="0">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Function Call Graph" OWNER="FunctionCallGraphPlugin" TITLE="Function Call Graph" ACTIVE="false" GROUP="Function Call Graph" INSTANCE_ID="3720077673641107497" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1710" HEIGHT="1382">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Graph" OWNER="DefaultGraphDisplay" TITLE="Code Flow Graph: wasm_runtime_call_wasm" ACTIVE="false" GROUP="ProgramGraph" INSTANCE_ID="3718980025694815627" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="1710" HEIGHT="1382">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Operands" OWNER="TableServicePlugin" TITLE="Operand References for 00100011" ACTIVE="false" GROUP="Default" INSTANCE_ID="3718980025694815637" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
<WINDOW_NODE X_POS="1920" Y_POS="0" WIDTH="938" HEIGHT="579">
|
||||
<COMPONENT_NODE TOP_INFO="0">
|
||||
<COMPONENT_INFO NAME="Instruction Info" OWNER="ShowInstructionInfoPlugin" TITLE="Instruction Info: Address 0011e4b7" ACTIVE="false" GROUP="Default" INSTANCE_ID="3719900393528349943" />
|
||||
</COMPONENT_NODE>
|
||||
</WINDOW_NODE>
|
||||
</ROOT_NODE>
|
||||
<DATA_STATE>
|
||||
<PLUGIN NAME="NavigationHistoryPlugin">
|
||||
<XML NAME="HISTORY_LIST_0">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="CURRENT_LOC_INDEX" TYPE="int" VALUE="2" />
|
||||
<STATE NAME="LOCATION_COUNT" TYPE="int" VALUE="3" />
|
||||
<STATE NAME="MEMENTO_CLASS0" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<STATE NAME="MEMENTO_CLASS1" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<STATE NAME="MEMENTO_CLASS2" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<XML NAME="MEMENTO_DATA0">
|
||||
<SAVE_STATE>
|
||||
<XML NAME="MEMENTO0">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="CURSOR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.codebrowser.CodeViewerLocationMemento" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871399" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00100000" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00100000" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.MemoryBlockStartFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<ARRAY NAME="_COMMENT" TYPE="string">
|
||||
<A VALUE="//" />
|
||||
<A VALUE="// .text" />
|
||||
<A VALUE="// SHT_PROGBITS [0x100000 - 0x1405c7]" />
|
||||
<A VALUE="// ram:00100000-ram:001405c7" />
|
||||
<A VALUE="//" />
|
||||
</ARRAY>
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_TYPE" TYPE="int" VALUE="-1" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<STATE NAME="NUM_MEMENTOS" TYPE="int" VALUE="1" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00100000" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00100000" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.MemoryBlockStartFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<ARRAY NAME="_COMMENT" TYPE="string">
|
||||
<A VALUE="//" />
|
||||
<A VALUE="// .text" />
|
||||
<A VALUE="// SHT_PROGBITS [0x100000 - 0x1405c7]" />
|
||||
<A VALUE="// ram:00100000-ram:001405c7" />
|
||||
<A VALUE="//" />
|
||||
</ARRAY>
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_TYPE" TYPE="int" VALUE="-1" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<XML NAME="MEMENTO_DATA1">
|
||||
<SAVE_STATE>
|
||||
<XML NAME="MEMENTO0">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="INDEX" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.decompile.DecompilerLocationMemento" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871392" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="X_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Y_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.FunctionReturnTypeFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_FUNC_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_RETURN_TYPE" TYPE="string" VALUE="void" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_SIGNATURE" TYPE="string" VALUE="void processEntry _start(void)" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<XML NAME="MEMENTO1">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="CURSOR_OFFSET" TYPE="int" VALUE="468" />
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.codebrowser.CodeViewerLocationMemento" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871399" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.FunctionReturnTypeFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_FUNC_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_RETURN_TYPE" TYPE="string" VALUE="void" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_SIGNATURE" TYPE="string" VALUE="void processEntry _start(void)" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<STATE NAME="NUM_MEMENTOS" TYPE="int" VALUE="2" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.FunctionReturnTypeFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_FUNC_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_RETURN_TYPE" TYPE="string" VALUE="void" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_SIGNATURE" TYPE="string" VALUE="void processEntry _start(void)" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<XML NAME="MEMENTO_DATA2">
|
||||
<SAVE_STATE>
|
||||
<XML NAME="MEMENTO0">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="INDEX" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.decompile.DecompilerLocationMemento" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871392" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="X_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Y_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.FunctionReturnTypeFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_FUNC_ADDRESS" TYPE="string" VALUE="0010000c" />
|
||||
<STATE NAME="_RETURN_TYPE" TYPE="string" VALUE="void" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_SIGNATURE" TYPE="string" VALUE="void processEntry _start(void)" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<XML NAME="MEMENTO1">
|
||||
<SAVE_STATE>
|
||||
<STATE NAME="CURSOR_OFFSET" TYPE="int" VALUE="633" />
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.codebrowser.CodeViewerLocationMemento" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871399" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_ADDR_REP" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.AddressFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<STATE NAME="MEMENTO_CLASS" TYPE="string" VALUE="ghidra.app.plugin.core.gotoquery.DefaultNavigatableLocationMemento" />
|
||||
<STATE NAME="NUM_MEMENTOS" TYPE="int" VALUE="2" />
|
||||
<STATE NAME="PROGRAM_ID" TYPE="long" VALUE="3720077563001659439" />
|
||||
<STATE NAME="PROGRAM_PATH_" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail:/system.elf" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_ADDR_REP" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.AddressFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="-1" />
|
||||
</SAVE_STATE>
|
||||
</XML>
|
||||
<STATE NAME="LIST_COUNT" TYPE="int" VALUE="1" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="ProgramTreePlugin">
|
||||
<STATE NAME="Current Viewname" TYPE="string" VALUE="Program Tree" />
|
||||
<ARRAY NAME="GroupNameDWARF0" TYPE="string">
|
||||
<A VALUE="system.elf" />
|
||||
</ARRAY>
|
||||
<ARRAY NAME="GroupNameProgram Tree0" TYPE="string">
|
||||
<A VALUE="system.elf" />
|
||||
</ARRAY>
|
||||
<STATE NAME="NavigationToggleState" TYPE="boolean" VALUE="false" />
|
||||
<STATE NAME="NumberOfGroupsDWARF" TYPE="int" VALUE="1" />
|
||||
<STATE NAME="NumberOfGroupsProgram Tree" TYPE="int" VALUE="1" />
|
||||
<STATE NAME="NumberOfViews" TYPE="int" VALUE="2" />
|
||||
<STATE NAME="TreeName-0" TYPE="string" VALUE="Program Tree" />
|
||||
<STATE NAME="TreeName-1" TYPE="string" VALUE="DWARF" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="DecompilePlugin">
|
||||
<STATE NAME="INDEX" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871392" />
|
||||
<STATE NAME="Num Disconnected" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Y_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_ADDR_REP" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.AddressFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="ByteViewerPlugin">
|
||||
<STATE NAME="Block Column" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Block Num" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Block Offset" TYPE="string" VALUE="0" />
|
||||
<STATE NAME="Index" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871394" />
|
||||
<STATE NAME="Num Disconnected" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="X Offset" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Y Offset" TYPE="int" VALUE="0" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="ProgramManagerPlugin">
|
||||
<STATE NAME="CURRENT_FILE" TYPE="string" VALUE="system.elf" />
|
||||
<STATE NAME="LOCATION_0" TYPE="string" VALUE="/home/christoph/Notes/TU/MastersThesis/FailNix/ghidra/projects/" />
|
||||
<STATE NAME="NUM_PROGRAMS" TYPE="int" VALUE="1" />
|
||||
<STATE NAME="PATHNAME_0" TYPE="string" VALUE="/system.elf" />
|
||||
<STATE NAME="PROJECT_NAME_0" TYPE="string" VALUE="2026-03-18_22-56_sum_aot_fail" />
|
||||
<STATE NAME="VERSION_0" TYPE="int" VALUE="-1" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_ADDR_REP" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.AddressFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="FunctionGraphPlugin">
|
||||
<SAVE_STATE NAME="COMPLEX_LAYOUT_NAME" TYPE="SaveState">
|
||||
<COMPLEX_LAYOUT_NAME>
|
||||
<STATE NAME="LAYOUT_CLASS_NAME" TYPE="string" VALUE="ghidra.app.plugin.core.functiongraph.graph.layout.DecompilerNestedLayoutProvider" />
|
||||
<STATE NAME="LAYOUT_NAME" TYPE="string" VALUE="Nested Code Layout" />
|
||||
</COMPLEX_LAYOUT_NAME>
|
||||
</SAVE_STATE>
|
||||
<STATE NAME="DISPLAY_POPUPS" TYPE="boolean" VALUE="true" />
|
||||
<STATE NAME="DISPLAY_SATELLITE" TYPE="boolean" VALUE="true" />
|
||||
<STATE NAME="DOCK_SATELLITE" TYPE="boolean" VALUE="true" />
|
||||
<STATE NAME="DOCK_SATELLITE_POSITION" TYPE="string" VALUE="LOWER_RIGHT" />
|
||||
<STATE NAME="Disconnected Count" TYPE="int" VALUE="0" />
|
||||
<ENUM NAME="EDGE_HOVER_HIGHLIGHT" TYPE="enum" CLASS="ghidra.app.plugin.core.functiongraph.EdgeDisplayType" VALUE="ScopedFlowsFromVertex" />
|
||||
<ENUM NAME="EDGE_SELECTION_HIGHLIGHT" TYPE="enum" CLASS="ghidra.app.plugin.core.functiongraph.EdgeDisplayType" VALUE="AllCycles" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673712410682" />
|
||||
</PLUGIN>
|
||||
<PLUGIN NAME="CodeBrowserPlugin">
|
||||
<STATE NAME="INDEX" TYPE="int" VALUE="10978" />
|
||||
<STATE NAME="NAV_ID" TYPE="long" VALUE="3720077673225871399" />
|
||||
<STATE NAME="Num Disconnected" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="Y_OFFSET" TYPE="int" VALUE="-15" />
|
||||
<STATE NAME="_ADDRESS" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_ADDR_REP" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_BYTE_ADDR" TYPE="string" VALUE="00102b2d" />
|
||||
<STATE NAME="_CHAR_OFFSET" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_CLASSNAME" TYPE="string" VALUE="ghidra.program.util.AddressFieldLocation" />
|
||||
<STATE NAME="_COLUMN" TYPE="int" VALUE="0" />
|
||||
<STATE NAME="_ROW" TYPE="int" VALUE="0" />
|
||||
</PLUGIN>
|
||||
</DATA_STATE>
|
||||
</RUNNING_TOOL>
|
||||
</WORKSPACE>
|
||||
</TOOL_MANAGER>
|
||||
</PROJECT>
|
||||
|
||||
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/00/00000000.prp
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/00/00000000.prp
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/00/~00000000.db/db.1.gbf
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/00/~00000000.db/db.1.gbf
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/~journal.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/user/~journal.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/versioned/~index.bak
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/versioned/~index.bak
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/versioned/~index.dat
(Stored with Git LFS)
Normal file
BIN
ghidra/projects/2026-03-18_22-56_sum_aot_fail.rep/versioned/~index.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
121
ghidra/scripts/ImportMarkersAsBookmarks.java
Normal file
121
ghidra/scripts/ImportMarkersAsBookmarks.java
Normal 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-18_20-53_sum_c_fail/c_host.o
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/c_host.o
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/c_module.o
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/c_module.o
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/grub/boot/grub/grub.cfg
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/grub/boot/grub/grub.cfg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/grub/boot/system.elf
(Stored with Git LFS)
Executable file
BIN
injections/2026-03-18_20-53_sum_c_fail/grub/boot/system.elf
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/markers.csv
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/markers.csv
(Stored with Git LFS)
Normal file
Binary file not shown.
|
BIN
injections/2026-03-18_20-53_sum_c_fail/result.txt
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/result.txt
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/startup.o
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/startup.o
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/cmos
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/cmos
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/config
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/config
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/cpu0
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/cpu0
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/dma
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/dma
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/drive0.buffer
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/drive0.buffer
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/floppy
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/floppy
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/floppy.buffer
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/floppy.buffer
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/gameport
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/gameport
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/hard_drive
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/hard_drive
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/ioapic
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/ioapic
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/keyboard
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/keyboard
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/memory
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/memory
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/memory.ram
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/memory.ram
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pc_system
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pc_system
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pic
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pic
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pit
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/pit
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/serial
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/serial
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga.memory
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga.memory
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga.pel_data
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/vga.pel_data
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/state/virt_timer
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/state/virt_timer
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/system.elf
(Stored with Git LFS)
Executable file
BIN
injections/2026-03-18_20-53_sum_c_fail/system.elf
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/system.iso
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/system.iso
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_20-53_sum_c_fail/trace.pb
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_20-53_sum_c_fail/trace.pb
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/grub/boot/grub/grub.cfg
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/grub/boot/grub/grub.cfg
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/grub/boot/system.elf
(Stored with Git LFS)
Executable file
BIN
injections/2026-03-18_22-56_sum_aot_fail/grub/boot/system.elf
(Stored with Git LFS)
Executable file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/markers.csv
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/markers.csv
(Stored with Git LFS)
Normal file
Binary file not shown.
|
BIN
injections/2026-03-18_22-56_sum_aot_fail/module_host.c
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/module_host.c
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/result.txt
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/result.txt
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/startup.o
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/startup.o
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/state/cmos
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-56_sum_aot_fail/state/cmos
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
injections/2026-03-18_22-56_sum_aot_fail/state/config
(Stored with Git LFS)
Normal file
BIN
injections/2026-03-18_22-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
Reference in New Issue
Block a user