1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#! /bin/python3
import argparse
import arancini
from arch import x86
from compare import compare
from run import run_native_execution
from utils import check_version
def read_logs(txl_path, native_path, program):
txl = []
with open(txl_path, "r") as txl_file:
txl = txl_file.readlines()
native = []
if program is not None:
breakpoints = arancini.parse_break_addresses(txl)
native = run_native_execution(program, breakpoints)
else:
assert(native_path is not None)
with open(native_path, "r") as native_file:
native = native_file.readlines()
return txl, native
def parse_arguments():
parser = argparse.ArgumentParser(description='Comparator for emulator logs to reference')
parser.add_argument('-p', '--program',
type=str,
help='Path to oracle program')
parser.add_argument('-r', '--ref',
type=str,
required=True,
help='Path to the reference log (gathered with run.sh)')
parser.add_argument('-t', '--txl',
type=str,
required=True,
help='Path to the translation log (gathered via Arancini)')
parser.add_argument('-s', '--stats',
action='store_true',
default=False,
help='Run statistics on comparisons')
parser.add_argument('-v', '--verbose',
action='store_true',
default=True,
help='Path to oracle program')
parser.add_argument('--progressive',
action='store_true',
default=False,
help='Try to match exhaustively before declaring \
mismatch')
args = parser.parse_args()
return args
def main():
args = parse_arguments()
txl_path = args.txl
native_path = args.ref
program = args.program
stats = args.stats
verbose = args.verbose
progressive = args.progressive
# Our architexture
arch = x86.ArchX86()
if verbose:
print("Enabling verbose program output")
print(f"Verbose: {verbose}")
print(f"Statistics: {stats}")
print(f"Progressive: {progressive}")
if program is None and native_path is None:
raise ValueError('Either program or path to native file must be'
'provided')
txl, native = read_logs(txl_path, native_path, program)
if program != None and native_path != None:
with open(native_path, 'w') as w:
w.write(''.join(native))
txl = arancini.parse(txl, arch)
native = arancini.parse(native, arch)
compare(txl, native, stats)
if __name__ == "__main__":
check_version('3.7')
main()
|