@@ -8,42 +8,87 @@ let package = "bap"
8
8
type r16 and r8
9
9
10
10
type 'a bitv = 'a Theory.Bitv .t Theory.Value .sort
11
+ type reg = r8 Theory.Bitv .t Theory .var
12
+
11
13
12
14
let r16 : r16 bitv = Theory.Bitv. define 16
13
15
let r8 : r8 bitv = Theory.Bitv. define 8
14
16
let bool = Theory.Bool. t
15
17
16
18
let reg t n = Theory.Var. define t n
17
19
18
- let array ?(index =string_of_int) t pref size =
19
- List. init size ~f: (fun i -> reg t (pref ^ index i))
20
+ let array ?(rev =false ) ?(start =0 ) ?(index =string_of_int) t pref size =
21
+ let stop = if rev then start- size else start+ size in
22
+ let stride = if rev then - 1 else 1 in
23
+ List. range ~stride start stop |>
24
+ List. map ~f: (fun i -> reg t (pref ^ index i))
20
25
21
26
let untyped = List. map ~f: Theory.Var. forget
22
27
let (@<) xs ys = untyped xs @ untyped ys
23
28
24
- let gpr = array r8 " R" 32
29
+ let regs t = List. map ~f: (reg t)
30
+ let nums = array r8 " R" 24
31
+ let wxyz = regs r8 [
32
+ " Wlo" ; " Whi" ;
33
+ " Xlo" ; " Xhi" ;
34
+ " Ylo" ; " Yhi" ;
35
+ " Zlo" ; " Zhi" ;
36
+ ]
37
+ let gpr = nums @< wxyz
25
38
let sp = reg r16 " SP"
26
- let flags = List. map ~f: (reg bool ) [
39
+ let flags = regs bool [
27
40
" CF" ; " ZF" ; " NF" ; " VF" ; " SF" ; " HF" ; " TF" ; " IF"
28
41
]
29
42
43
+
30
44
let datas = Theory.Mem. define r16 r8
31
45
let codes = Theory.Mem. define r16 r16
32
46
33
47
let data = reg datas " data"
34
48
let code = reg codes " code"
35
49
36
- let parent = Theory.Target. declare ~package " avr "
50
+ let parent = Theory.Target. declare ~package " avr8 "
37
51
~bits: 8
38
52
~byte: 8
39
53
~endianness: Theory.Endianness. le
40
54
41
- let atmega328 = Theory.Target. declare ~package " ATmega328"
55
+
56
+ let tiny = Theory.Target. declare ~package " avr8-tiny"
42
57
~parent
43
58
~data
44
59
~code
45
60
~vars: (gpr @< [sp] @< flags @< [data] @< [code])
46
61
62
+ let mega = Theory.Target. declare ~package " avr8-mega"
63
+ ~parent: tiny
64
+
65
+ let xmega = Theory.Target. declare ~package " avr8-xmega"
66
+ ~parent: mega
67
+
68
+ module Gcc = struct
69
+ let abi = Theory.Abi. declare ~package " avr-gcc"
70
+ let wreg = regs r8 [" Whi" ; " Wlo" ]
71
+ let args = wreg @ array ~rev: true ~start: 23 r8 " R" 16
72
+ let rets = wreg @ array ~rev: true ~start: 23 r8 " R" 6
73
+ let regs = Theory.Role.Register. [
74
+ [general; integer], gpr;
75
+ [function_argument], untyped args;
76
+ [function_return], untyped rets;
77
+ [stack_pointer], untyped [sp];
78
+ [caller_saved], rets @< regs r8 [" R0" ; " Xlo" ; " Xhi" ; " Zlo" ; " Zhi" ];
79
+ [callee_saved], array ~start: 1 r8 " R" 17 @< regs r8 [" Ylo" ; " Yhi" ];
80
+ ]
81
+
82
+ let target parent name =
83
+ Theory.Target. declare ~package name ~regs ~parent ~abi
84
+
85
+ let tiny = target tiny " avr8-tiny-gcc"
86
+ let mega = target mega " avr8-mega-gcc"
87
+ let xmega = target xmega " avr8-xmega-gcc"
88
+ end
89
+
90
+
91
+
47
92
let pcode =
48
93
Theory.Language. declare ~package: " bap" " pcode-avr"
49
94
@@ -69,7 +114,7 @@ let enable_loader () =
69
114
| Ok arch -> arch in
70
115
KB. promise Theory.Unit. target @@ fun unit ->
71
116
KB. collect Image.Spec. slot unit >> | request_arch >> | function
72
- | Some "avr" -> atmega328
117
+ | Some "avr" -> Gcc. mega
73
118
| _ -> Theory.Target. unknown
74
119
75
120
0 commit comments