From: dodge-this Date: Mon, 9 Aug 2010 12:35:27 +0000 (+0000) Subject: still working on it X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=8776829cc0b0dc7601698bb73cdca227af95ef60 still working on it about to rip out more functionity from embedded to python git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@688 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETARM.py b/client/GoodFETARM.py index 45ab3f9..4573425 100644 --- a/client/GoodFETARM.py +++ b/client/GoodFETARM.py @@ -6,7 +6,7 @@ # Contributions and bug reports welcome. # -import sys, binascii, struct +import sys, binascii, struct, time import atlasutils.smartprint as asp from GoodFET import GoodFET from intelhex import IntelHex @@ -65,6 +65,7 @@ WAIT_DBG = 0x9f SHIFT_DR = 0xa0 SETWATCH0 = 0xa1 SETWATCH1 = 0xa2 +CHAIN0 = 0xa3 PM_usr = 0b10000 PM_fiq = 0b10001 @@ -175,6 +176,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 +258,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 +277,10 @@ class GoodFETARM(GoodFET): retval = struct.unpack(">8)&0xff,(data>>16)&0xff,(data>>24)&0xff]) @@ -338,6 +342,7 @@ class GoodFETARM(GoodFET): 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 +368,26 @@ 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() - print self.ARMget_register(1) + #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? @@ -383,7 +398,35 @@ 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 + + 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 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 @@ -439,6 +482,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("