From 80fe96e8e1ead6ec62de9bed4919dc86a4d27e67 Mon Sep 17 00:00:00 2001 From: dodge-this Date: Thu, 15 Nov 2012 05:00:02 +0000 Subject: [PATCH] ARMread/writeStream() functions enabled, allowing the reading/writing of byte-aligned bytes, not just 32-bit word-aligned numbers git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@1334 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFETARM7.py | 83 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/client/GoodFETARM7.py b/client/GoodFETARM7.py index 207670b..7596c60 100644 --- a/client/GoodFETARM7.py +++ b/client/GoodFETARM7.py @@ -437,6 +437,7 @@ class GoodFETARM(GoodFET): def resettap(self): self.writecmd(0x13, RESETTAP, 0,[]) + def ARMsetModeARM(self): r0 = None if ((self.current_dbgstate & DBG_TBIT)): @@ -448,6 +449,7 @@ class GoodFETARM(GoodFET): self.resettap() self.current_dbgstate = self.ARMget_dbgstate(); return self.current_dbgstate + def ARMsetModeThumb(self): # needs serious work and truing self.resettap() debugstr("=== Switching to THUMB mode ===") @@ -463,9 +465,11 @@ class GoodFETARM(GoodFET): self.ARMset_register(0,r0) self.current_dbgstate = self.ARMget_dbgstate(); return self.current_dbgstate + def ARMget_regCPSRstr(self): psr = self.ARMget_regCPSR() return hex(psr), PSRdecode(psr) + def ARMget_regCPSR(self): """Get an ARM's Register""" r0 = self.ARMget_register(0) @@ -476,6 +480,7 @@ class GoodFETARM(GoodFET): retval = self.ARMget_register(0) self.ARMset_register(0, r0) return retval + def ARMset_regCPSR(self, val): """Get an ARM's Register""" r0 = self.ARMget_register(0) @@ -486,6 +491,7 @@ class GoodFETARM(GoodFET): self.ARM_nop( 0) # push nop into pipeline - execute self.ARMset_register(0, r0) return(val) + def ARMreadMem(self, adr, wrdcount=1): retval = [] r0 = self.ARMget_register(0); # store R0 and R1 @@ -515,7 +521,39 @@ class GoodFETARM(GoodFET): self.ARMset_register(1, r1); # restore R0 and R1 self.ARMset_register(0, r0); return retval - def ARMreadChunk(self, adr, wordcount, verbose=1): + + def ARMreadStream(self, addr, bytecount): + baseaddr = addr & 0xfffffffc + endaddr = ((addr + bytecount + 3) & 0xfffffffc) + diffstart = 4 - (addr - baseaddr) + diffend = 4 - (endaddr - (addr + bytecount )) + + + out = [] + data = self.ARMreadChunk( baseaddr, ((endaddr-baseaddr) / 4) ) + #print data, hex(baseaddr), hex(diffstart), hex(endaddr), hex(diffend) + if len(data) == 1: + #print "single dword" + out.append( struct.pack("0: + out.append( struct.pack(">sys.stderr,hex(self.ARMget_register(1)) self.ARMset_register(1, r1); # restore R0 and R1 self.ARMset_register(0, r0); + + def ARMwriteStream(self, addr, datastr): + #bytecount = len(datastr) + #baseaddr = addr & 0xfffffffc + #diffstart = addr - baseaddr + #endaddr = ((addr + bytecount) & 0xfffffffc) + 4 + #diffend = 4 - (endaddr - (addr+bytecount)) + bytecount = len(datastr) + baseaddr = addr & 0xfffffffc + endaddr = ((addr + bytecount + 3) & 0xfffffffc) + diffstart = 4 - (addr - baseaddr) + diffend = 4 - (endaddr - (addr + bytecount )) + + print hex(baseaddr), hex(diffstart), hex(endaddr), hex(diffend) + out = [] + if diffstart: + dword = self.ARMreadChunk(baseaddr, 1)[0] & (0xffffffff>>(8*diffstart)) + dst = "\x00" * (4-diffstart) + datastr[:diffstart]; print hex(dword), repr(dst) + datachk = struct.unpack("