1
2 """
3 The initial arm module.
4 """
5
6 import struct
7
8 import envi
9 from envi.archs.arm import ArmModule
10 from envi.archs.arm.regs import *
11 from envi.archs.arm.thumbdisasm import *
12
13
14
15
16
17
18
19
20
21
22
24 """
25 Implement calling conventions for your arch.
26 """
36
37
40
41 aapcs = ArmArchitectureProcedureCall()
42
46
47 - def stc(self, parms):
48 print >>sys.stderr,"CoProcEmu: stc(%s)"%repr(parms)
49 - def ldc(self, parms):
50 print >>sys.stderr,"CoProcEmu: ldc(%s)"%repr(parms)
51 - def cdp(self, parms):
52 print >>sys.stderr,"CoProcEmu: cdp(%s)"%repr(parms)
53 - def mcr(self, parms):
54 print >>sys.stderr,"CoProcEmu: mcr(%s)"%repr(parms)
55 - def mcrr(self, parms):
56 print >>sys.stderr,"CoProcEmu: mcrr(%s)"%repr(parms)
57 - def mrc(self, parms):
58 print >>sys.stderr,"CoProcEmu: mrc(%s)"%repr(parms)
59 - def mrrc(self, parms):
60 print >>sys.stderr,"CoProcEmu: mrrc(%s)"%repr(parms)
61
62
63
64 -class ArmEmulator(ArmModule, ArmRegisterContext, envi.Emulator):
65
77
79 """
80 Used in PDE.
81 A flag setting operation has resulted in un-defined value. Set
82 the flags to un-defined as well.
83 """
84 self.setRegister(REG_EFLAGS, None)
85
87 flags = self.getSPSR(mode)
88 if state:
89 flags |= which
90 else:
91 flags &= ~which
92 self.setSPSR(mode, flags)
93
95
96
97
98 flags = self.getSPSR(mode)
99 if flags == None:
100 raise envi.PDEUndefinedFlag(self)
101 return bool(flags & which)
102
104 bytes = self.readMemory(addr, size)
105 if bytes == None:
106 return None
107
108
109 if len(bytes) != size:
110 raise Exception("Read Gave Wrong Length At 0x%.8x (va: 0x%.8x wanted %d got %d)" % (self.getProgramCounter(),addr, size, len(bytes)))
111 if size == 1:
112 return struct.unpack("B", bytes)[0]
113 elif size == 2:
114 return struct.unpack("<H", bytes)[0]
115 elif size == 4:
116 return struct.unpack("<L", bytes)[0]
117 elif size == 8:
118 return struct.unpack("<Q", bytes)[0]
119
121
122
123 if size == 1:
124 bytes = struct.pack("B",value & 0xff)
125 elif size == 2:
126 bytes = struct.pack("<H",value & 0xffff)
127 elif size == 4:
128 bytes = struct.pack("<L", value & 0xffffffff)
129 elif size == 8:
130 bytes = struct.pack("<Q", value & 0xffffffffffffffff)
131 self.writeMemory(addr, bytes)
132
134
135 bytes = self.readMemory(addr, size)
136 if bytes == None:
137 return None
138 if size == 1:
139 return struct.unpack("b", bytes)[0]
140 elif size == 2:
141 return struct.unpack("<h", bytes)[0]
142 elif size == 4:
143 return struct.unpack("<l", bytes)[0]
144
161
167
173
175 return self._rctx_vals[REG_CPSR] & 0x1f
176
179
182
184 return self._rctx_vals[((mode&0xf)*17)+16]
185
187 self._rctx_vals[((mode&0xf)*17)+16] = psr
188
197
199 """
200 Return the current value of the specified register index.
201 """
202 if mode == None:
203 mode = self.getProcMode() & 0xf
204 else:
205 mode &= 0xf
206 idx = (index & 0xffff)
207 ridx = idx + (mode*17)
208 ridx = reg_table[ridx][2]
209 if idx == index:
210 return self._rctx_vals[ridx]
211
212 offset = (index >> 24) & 0xff
213 width = (index >> 16) & 0xff
214
215 mask = (2**width)-1
216 return (self._rctx_vals[ridx] >> offset) & mask
217
219 """
220 Set a register value by index.
221 """
222 if mode == None:
223 mode = self.getProcMode() & 0xf
224 else:
225 mode &= 0xf
226
227 self._rctx_dirty = True
228
229 idx = (index & 0xffff)
230 ridx = idx + (mode*17)
231 ridx = reg_table[ridx][2]
232 if idx == index:
233 self._rctx_vals[ridx] = (value & self._rctx_masks[ridx])
234 return
235
236
237
238 offset = (index >> 24) & 0xff
239 width = (index >> 16) & 0xff
240
241
242 mask = (2**width)-1
243 mask = mask << offset
244
245
246 basewidth = self._rctx_widths[ridx]
247 basemask = (2**basewidth)-1
248
249
250 finalmask = basemask ^ mask
251
252 curval = self._rctx_vals[ridx]
253
254 self._rctx_vals[ridx] = (curval & finalmask) | (value << offset)
255
257 """
258 Do the core of integer subtraction but only *return* the
259 resulting value rather than assigning it.
260 (allows cmp and sub to use the same code)
261 """
262
263
264 src1 = self.getOperValue(op, 1)
265 src2 = self.getOperValue(op, 2)
266 Sflag = op.iflags & IF_PSR_S
267
268 if src1 == None or src2 == None:
269 self.undefFlags()
270 return None
271
272 return self.intSubBase(src1, src2, Sflag)
273
275
276
277
278
279
280 usrc = e_bits.unsigned(src1, 4)
281 udst = e_bits.unsigned(src2, 4)
282
283 ssrc = e_bits.signed(src1, 4)
284 sdst = e_bits.signed(src2, 4)
285
286 ures = udst - usrc
287 sres = sdst - ssrc
288
289 if Sflag:
290 curmode = self.getProcMode()
291 if rd == 15:
292 if(curmode != PM_sys and curmode != PM_usr):
293 self.setCPSR(self.getSPSR(curmode))
294 else:
295 raise Exception("Messed up opcode... adding to r15 from PM_usr or PM_sys")
296 self.setFlag(PSR_C, e_bits.is_unsigned_carry(ures, 4))
297 self.setFlag(PSR_Z, not ures)
298 self.setFlag(PSR_N, e_bits.is_signed(ures, 4))
299 self.setFlag(PSR_V, e_bits.is_signed_overflow(sres, 4))
300
301
302
303
304
305
306
307
308
309
310
311 return ures
312
313
331
335
365
366 i_stmia = i_stm
367
368
399
400 i_ldmia = i_ldm
401
408
409
410
411
412
414 src1 = self.getOperValue(op, 1)
415 src2 = self.getOperValue(op, 2)
416
417
418 if src1 == None or src2 == None:
419 self.undefFlags()
420 self.setOperValue(op, 0, None)
421 return
422
423 dsize = op.opers[0].tsize
424 ssize = op.opers[1].tsize
425 s2size = op.opers[2].tsize
426
427 usrc1 = e_bits.unsigned(src1, 4)
428 usrc2 = e_bits.unsigned(src2, 4)
429 ssrc1 = e_bits.signed(src1, 4)
430 ssrc2 = e_bits.signed(src2, 4)
431
432 ures = usrc1 + usrc2
433 sres = ssrc1 + ssrc2
434
435
436 self.setOperValue(op, 0, ures)
437
438 curmode = self.getProcMode()
439 if op.flags & IF_S:
440 if op.opers[0].reg == 15 and (curmode != PM_sys and curmode != PM_usr):
441 self.setCPSR(self.getSPSR(curmode))
442 else:
443 raise Exception("Messed up opcode... adding to r15 from PM_usr or PM_sys")
444 self.setFlag(PSR_C, e_bits.is_unsigned_carry(ures, dsize))
445 self.setFlag(PSR_Z, not ures)
446 self.setFlag(PSR_N, e_bits.is_signed(ures, dsize))
447 self.setFlag(PSR_V, e_bits.is_signed_overflow(sres, dsize))
448
451
452 - def i_bl(self, op):
455
466
467
469 src1 = self.getOperValue(op, 1)
470 src2 = self.getOperValue(op, 2)
471
472
473 if src1 == None or src2 == None:
474 self.undefFlags()
475 self.setOperValue(op, 0, None)
476 return
477
478 dsize = op.opers[0].tsize
479 ssize = op.opers[1].tsize
480 s2size = op.opers[2].tsize
481
482 usrc1 = e_bits.unsigned(src1, 4)
483 usrc2 = e_bits.unsigned(src2, 4)
484 ssrc1 = e_bits.signed(src1, 4)
485 ssrc2 = e_bits.signed(src2, 4)
486
487 ures = usrc2 - usrc1
488 sres = ssrc2 - ssrc1
489
490
491 self.setOperValue(op, 0, ures)
492
493 curmode = self.getProcMode()
494 if op.flags & IF_S:
495 if op.opers[0].reg == 15:
496 if (curmode != PM_sys and curmode != PM_usr):
497 self.setCPSR(self.getSPSR(curmode))
498 else:
499 raise Exception("Messed up opcode... adding to r15 from PM_usr or PM_sys")
500 self.setFlag(PSR_C, e_bits.is_unsigned_carry(ures, dsize))
501 self.setFlag(PSR_Z, not ures)
502 self.setFlag(PSR_N, e_bits.is_signed(ures, dsize))
503 self.setFlag(PSR_V, e_bits.is_signed_overflow(sres, dsize))
504
518
532
534 src1 = self.getOperValue(op, 1)
535 src2 = self.getOperValue(op, 2)
536
537
538 if src1 == None or src2 == None:
539 self.undefFlags()
540 self.setOperValue(op, 0, None)
541 return
542
543 usrc1 = e_bits.unsigned(src1, 4)
544 usrc2 = e_bits.unsigned(src2, 4)
545
546 ures = usrc1 ^ usrc2
547
548 self.setOperValue(op, 0, ures)
549
550 curmode = self.getProcMode()
551 if op.iflags & IF_S:
552 if op.opers[0].reg == 15:
553 if (curmode != PM_sys and curmode != PM_usr):
554 self.setCPSR(self.getSPSR(curmode))
555 else:
556 raise Exception("Messed up opcode... adding to r15 from PM_usr or PM_sys")
557 self.setFlag(PSR_C, e_bits.is_unsigned_carry(ures, 4))
558 self.setFlag(PSR_Z, not ures)
559 self.setFlag(PSR_N, e_bits.is_signed(ures, 4))
560 self.setFlag(PSR_V, e_bits.is_signed_overflow(sres, 4))
561
562
563
564
565
567 cpnum = op.opers[0]
568 coproc = self._getCoProc(cpnum)
569 coproc.stc(op.opers)
570
572 cpnum = op.opers[0]
573 coproc = self._getCoProc(cpnum)
574 coproc.ldc(op.opers)
575
577 cpnum = op.opers[0]
578 coproc = self._getCoProc(cpnum)
579 coproc.cdp(op.opers)
580
582 cpnum = op.opers[0]
583 coproc = self._getCoProc(cpnum)
584 coproc.mrc(op.opers)
585
587 cpnum = op.opers[0]
588 coproc = self._getCoProc(cpnum)
589 coproc.mrrc(op.opers)
590
592 cpnum = op.opers[0]
593 coproc = self._getCoProc(cpnum)
594 coproc.mrrc(op.opers)
595
597 cpnum = op.opers[0]
598 coproc = self._getCoProc(cpnum)
599 coproc.mcrr(op.opers)
600
601
602
603
604 opcode_dist = \
605 [('and', 4083),
606 ('stm', 1120),
607 ('ldr', 1064),
608 ('add', 917),
609 ('stc', 859),
610 ('str', 770),
611 ('bl', 725),
612 ('ldm', 641),
613 ('b', 472),
614 ('ldc', 469),
615 ('tst', 419),
616 ('rsb', 196),
617 ('eor', 180),
618 ('mul', 159),
619 ('swi', 128),
620 ('sub', 110),
621 ('adc', 96),
622 ('cdp', 74),
623 ('orr', 66),
624 ('cmn', 59),
625 ('mcr', 55),
626 ('stc2', 54),
627 ('ldc2', 52),
628 ('mrc', 49),
629 ('mvn', 47),
630 ('rsc', 46),
631 ('teq', 45),
632 ('cmp', 41),
633 ('sbc', 40),
634 ('mov', 35),
635 ('bic', 34),
636 ('mcr2', 29),
637 ('mrc2', 28),
638 ('swp', 28),
639 ('mcrr', 21),
640 ('mrrc', 20),
641 ('usada8', 20),
642 ('qadd', 13),
643 ('mrrc2', 10),
644 ('add16', 9),
645 ('mla', 9),
646 ('mcrr2', 7),
647 ('uqsub16', 6),
648 ('uqadd16', 5),
649 ('sub16', 5),
650 ('umull', 4),
651 ('uq', 3),
652 ('smlsdx', 3),
653 ('uhsub16', 3),
654 ('uqsubaddx', 3),
655 ('qdsub', 2),
656 ('subaddx', 2),
657 ('uqadd8', 2),
658 ('ssat', 2),
659 ('uqaddsubx', 2),
660 ('smull', 2),
661 ('blx', 2),
662 ('smlal', 2),
663 ('shsub16', 1),
664 ('', 1),
665 ('smlsd', 1),
666 ('pkhbt', 1),
667 ('revsh', 1),
668 ('qadd16', 1),
669 ('uqsub8', 1),
670 ('ssub16', 1),
671 ('usad8', 1),
672 ('uadd16', 1),
673 ('smladx', 1),
674 ('swpb', 1),
675 ('smlaldx', 1),
676 ('usat', 1),
677 ('umlal', 1),
678 ('rev16', 1),
679 ('sadd16', 1),
680 ('sel', 1),
681 ('sub8', 1),
682 ('pkhtb', 1),
683 ('umaal', 1),
684 ('addsubx', 1),
685 ('add8', 1),
686 ('smlad', 1),
687 ('sxtb', 1),
688 ('sadd8', 1)]
689