X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETARM.py;h=a2212d382d9f60348560f68fddc43fd1d7d1f533;hp=45ab3f91107edb012255e1f0ad530cff3365a72d;hb=6ec4512553ac11e9893437fd80ab21992f0ab4f5;hpb=f1115f89754a6482731b77cf2bf71bb7534f9a28 diff --git a/client/GoodFETARM.py b/client/GoodFETARM.py index 45ab3f9..a2212d3 100644 --- a/client/GoodFETARM.py +++ b/client/GoodFETARM.py @@ -6,7 +6,11 @@ # Contributions and bug reports welcome. # -import sys, binascii, struct + + +raise Exception("DEPRECATED. USE GoodFETARM7") + +import sys, binascii, struct, time import atlasutils.smartprint as asp from GoodFET import GoodFET from intelhex import IntelHex @@ -65,6 +69,13 @@ WAIT_DBG = 0x9f SHIFT_DR = 0xa0 SETWATCH0 = 0xa1 SETWATCH1 = 0xa2 +CHAIN0 = 0xa3 + + +MSB = 0 +LSB = 1 +NOEND = 2 +NORETIDLE = 4 PM_usr = 0b10000 PM_fiq = 0b10001 @@ -175,6 +186,7 @@ class GoodFETARM(GoodFET): """Halt the CPU.""" self.writecmd(0x13,HALTCPU,0,self.data) print "CPSR: (%s) %s"%(self.ARMget_regCPSRstr()) + halt=ARMhaltcpu def ARMreleasecpu(self): """Resume the CPU.""" self.writecmd(0x13,RESUMECPU,0,self.data) @@ -256,9 +268,11 @@ class GoodFETARM(GoodFET): def ARMset_dbgctrl(self,config): """Write the config register of an ARM.""" self.writecmd(0x13,SET_DEBUG_CTRL,1,[config&7]) - #def ARMlockchip(self): - # """Set the flash lock bit in info mem.""" - # self.writecmd(0x13, LOCKCHIP, 0, []) + def ARMlockchip(self): + """Set the flash lock bit in info mem. + Chip-Specific. Not implemented""" + #self.writecmd(0x13, LOCKCHIP, 0, []) + raise Exception("Unimplemented: lockchip. This is chip specific and must be implemented for each chip.") def ARMidentstr(self): @@ -273,10 +287,10 @@ class GoodFETARM(GoodFET): retval = struct.unpack(">8)&0xff,(data>>16)&0xff,(data>>24)&0xff]) + def ARMshiftDR(self, data, bits, flags): + self.writecmd(0x13,SHIFT_DR,8,[bits&0xff, flags&0xff, 0, 0, data&0xff,(data>>8)&0xff,(data>>16)&0xff,(data>>24)&0xff]) return self.data def ARMwaitDBG(self, timeout=0xff): self.writecmd(0x13,WAIT_DBG,2,[timeout&0xf,timeout>>8]) return self.data def ARMrestart(self): + #self.ARMset_IR(ARM7TDMI_IR_BYPASS) self.ARMset_IR(ARM7TDMI_IR_RESTART) def ARMset_watchpoint0(self, addr, addrmask, data, datamask, ctrl, ctrlmask): self.data = [] @@ -363,16 +378,54 @@ class GoodFETARM(GoodFET): retval = [] r0 = self.ARMget_register(0); # store R0 and R1 r1 = self.ARMget_register(1); - print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) + #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) for word in range(adr, adr+(wrdcount*4), 4): + sys.stdin.readline() self.ARMset_register(0, word); # write address into R0 + #time.sleep(1) + self.ARMset_register(1, 0xdeadbeef) + #time.sleep(1) self.ARM_nop(0) + #time.sleep(1) self.ARM_nop(1) + #time.sleep(1) self.ARMdebuginstr(ARM_READ_MEM, 0); # push LDR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive reads) + #time.sleep(1) + self.ARM_nop(0) + #time.sleep(1) + self.ARMrestart() + #time.sleep(1) + self.ARMwaitDBG() + #time.sleep(1) + print hex(self.ARMget_register(1)) + + + # FIXME: this may end up changing te current debug-state. should we compare to current_dbgstate? + #print repr(self.data[4]) + if (len(self.data)>4 and self.data[4] == '\x00'): + print >>sys.stderr,("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE") + raise Exception("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE") + return (-1); + else: + retval.append( self.ARMget_register(1) ) # read memory value from R1 register + #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1))) + self.ARMset_register(1, r1); # restore R0 and R1 + self.ARMset_register(0, r0); + return retval + + def ARMwriteMem(self, adr, wordarray): + r0 = self.ARMget_register(0); # store R0 and R1 + r1 = self.ARMget_register(1); + #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) + for word in xrange(adr, adr+len(string), 4): + self.ARMset_register(0, word); # write address into R0 + self.ARM_nop(0) + self.ARM_nop(1) + self.ARMdebuginstr(ARM_WRITE_MEM, 0); # push STR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive writes) self.ARM_nop(0) self.ARMrestart() self.ARMwaitDBG() - print self.ARMget_register(1) + print hex(self.ARMget_register(1)) # FIXME: this may end up changing te current debug-state. should we compare to current_dbgstate? @@ -383,7 +436,7 @@ class GoodFETARM(GoodFET): return (-1); else: retval.append( self.ARMget_register(1) ) # read memory value from R1 register - print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1))) + #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1))) self.ARMset_register(1, r1); # restore R0 and R1 self.ARMset_register(0, r0); return retval @@ -439,6 +492,14 @@ class GoodFETARM(GoodFET): str="%s %s" %(self.ARMstatusbits[i],str) i*=2 return str + def ARMchain0(self, address, bits, data): + bulk = chop(address,4) + bulk.extend(chop(bits,8)) + bulk.extend(chop(data,4)) + print (repr(bulk)) + self.writecmd(0x13,CHAIN0,16,bulk) + d1,b1,a1 = struct.unpack("