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
module AST = Asl_ast
type cpu = {
env : Eval.Env.t;
reset : unit -> unit;
step : unit -> unit;
getPC : unit -> Primops.bigint;
setPC : Primops.bigint -> unit;
elfwrite : Int64.t -> char -> unit;
opcode : string -> Primops.bigint -> unit;
}
let mkCPU (env : Eval.Env.t): cpu =
let loc = AST.Unknown in
let reset (_ : unit): unit =
Eval.eval_proccall loc env (AST.FIdent ("__TakeColdReset", 0)) [] []
and step (_ : unit): unit =
Eval.eval_proccall loc env (AST.FIdent ("__InstructionExecute", 0)) [] []
and getPC (_ : unit): Primops.bigint =
let r = Eval.eval_funcall loc env (AST.FIdent ("__getPC", 0)) [] [] in
Value.to_integer loc r
and setPC (x : Primops.bigint): unit =
let a = Value.VInt x in
Eval.eval_proccall loc env (AST.FIdent ("__setPC", 0)) [] [a]
and elfwrite (addr: Int64.t) (b: char): unit =
let a = Value.VBits (Primops.mkBits 64 (Z.of_int64 addr)) in
let b = Value.VBits (Primops.mkBits 8 (Z.of_int (Char.code b))) in
Eval.eval_proccall loc env (AST.FIdent ("__ELFWriteMemory", 0)) [] [a; b]
and opcode (iset: string) (opcode: Primops.bigint): unit =
let op = Value.VBits (Primops.prim_cvt_int_bits (Z.of_int 32) opcode) in
let decoder = Eval.Env.getDecoder env (Ident iset) in
Eval.eval_decode_case AST.Unknown env decoder op
in
{
env = env;
reset = reset;
step = step;
getPC = getPC;
setPC = setPC;
elfwrite = elfwrite;
opcode = opcode
}