@@ -8,42 +8,87 @@ let package = "bap"
88type r16 and r8
99
1010type 'a bitv = 'a Theory.Bitv .t Theory.Value .sort
11+ type reg = r8 Theory.Bitv .t Theory .var
12+
1113
1214let r16 : r16 bitv = Theory.Bitv. define 16
1315let r8 : r8 bitv = Theory.Bitv. define 8
1416let bool = Theory.Bool. t
1517
1618let reg t n = Theory.Var. define t n
1719
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))
2025
2126let untyped = List. map ~f: Theory.Var. forget
2227let (@<) xs ys = untyped xs @ untyped ys
2328
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
2538let sp = reg r16 " SP"
26- let flags = List. map ~f: (reg bool ) [
39+ let flags = regs bool [
2740 " CF" ; " ZF" ; " NF" ; " VF" ; " SF" ; " HF" ; " TF" ; " IF"
2841 ]
2942
43+
3044let datas = Theory.Mem. define r16 r8
3145let codes = Theory.Mem. define r16 r16
3246
3347let data = reg datas " data"
3448let code = reg codes " code"
3549
36- let parent = Theory.Target. declare ~package " avr "
50+ let parent = Theory.Target. declare ~package " avr8 "
3751 ~bits: 8
3852 ~byte: 8
3953 ~endianness: Theory.Endianness. le
4054
41- let atmega328 = Theory.Target. declare ~package " ATmega328"
55+
56+ let tiny = Theory.Target. declare ~package " avr8-tiny"
4257 ~parent
4358 ~data
4459 ~code
4560 ~vars: (gpr @< [sp] @< flags @< [data] @< [code])
4661
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+
4792let pcode =
4893 Theory.Language. declare ~package: " bap" " pcode-avr"
4994
@@ -69,7 +114,7 @@ let enable_loader () =
69114 | Ok arch -> arch in
70115 KB. promise Theory.Unit. target @@ fun unit ->
71116 KB. collect Image.Spec. slot unit >> | request_arch >> | function
72- | Some "avr" -> atmega328
117+ | Some "avr" -> Gcc. mega
73118 | _ -> Theory.Target. unknown
74119
75120
0 commit comments