X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2Fgplay-arm.py;h=70333d7e6e07b9a1ab7143ee4f90d59f2b33f98a;hp=44f5d04a9d59ad261ccf42080c2049c51c237532;hb=f7fdc48f01ada713d5034763a2f3395fe2a7c51b;hpb=4aff58296d9e7e4d1454c300fbdaaf509d136caa diff --git a/client/gplay-arm.py b/client/gplay-arm.py index 44f5d04..70333d7 100755 --- a/client/gplay-arm.py +++ b/client/gplay-arm.py @@ -1,6 +1,6 @@ #!/usr/bin/env ipython -import sys, struct, binascii -from GoodFETARM import * +import sys, struct, binascii,time +from GoodFETARM7 import * from intelhex import IntelHex @@ -9,14 +9,116 @@ data = [] client=GoodFETARM(); def init(): #Initailize FET and set baud rate + print >>sys.stderr,"Connecting to goodfet..." client.serInit() # #Connect to target + print >>sys.stderr,"Setting up JTAG ARM on goodfet..." client.setup() + print >>sys.stderr,"Starting JTAG ARM on goodfet...\n\n" client.start() - print "STARTUP: "+repr(client.data) + print "STARTUP: %s\n"%repr(client.data) # +def print_registers(): + return [ hex(client.ARMget_register(x)) for x in range(15) ] + +def regwratchet(num,hi=13,lo=0): + for x in xrange(lo,hi+1): + client.ARMset_register(x,num) + +def test(): + print "ARM JTAG Test Unit" + print " Chip ID", hex(client.ARMident()) + print client.ARMidentstr() + print " Debug State: ",hex(client.ARMget_dbgstate()) + print " Debug CTRL: ",hex(client.ARMget_dbgctrl()) + print + print "Testing Register Read/Writes" + print " Storing old values" + originalregs = [client.ARMget_register(x) for x in xrange(16)] + + print "Simple test" + test = [None for x in xrange(15)] + control = [x for x in xrange(15)] + for x in xrange(15): + client.ARMset_register(x,control[x]) + test[x] = client.ARMget_register(x) + if control != test: + print "FAIL" + print "Control:",control + print "Test: ",test + + print "A little harder..." + test = [None for x in xrange(15)] + control = [4*x for x in xrange(15)] + for x in xrange(15): + client.ARMset_register(x,control[x]) + test[x] = client.ARMget_register(x) + if control != test: + print "FAIL" + print "Control:",control + print "Test: ",test + + print "Complex testing 1" + for y in xrange(0,0xffffffff,0x10101010): + test = [None for x in xrange(15)] + control = [y for x in xrange(15)] + print " Test parms: ",control + for x in xrange(15): + client.ARMset_register(x,control[x]) + test[x] = client.ARMget_register(x) + if control != test: + print "FAIL" + print "Control:",control + print "Test: ",test + + print "Complex testing 2" + for y in xrange(0,0xffffffff,101010101): + test = [None for x in xrange(15)] + control = [y for x in xrange(15)] + print " Test parms: ",control + for x in xrange(15): + client.ARMset_register(x,control[x]) + test[x] = client.ARMget_register(x) + if control != test: + print "FAIL" + print "Control:",control + print "Test: ",test + + test = [None for x in xrange(15)] + control = [0x100*x for x in xrange(15)] + for x in xrange(15): + client.ARMset_register(x,control[x]) + test[x] = client.ARMget_register(x) + if control != test: + print "FAIL" + print "Control:",control + print "Test: ",test + + print "Resetting original register values..." + for x in xrange(16): + client.ARMset_register(x,originalregs[x]) + regs = [client.ARMget_register(x) for x in xrange(16)] + print "Original: \t",originalregs + print "Now (r15 may differ:\t",regs + + print "Testing setting and movement of PC between instructions" + #client.ARMsetPC(0x0) + print "PC:",client.ARMgetPC() + print "PC:",client.ARMgetPC() + print "PC:",client.ARMgetPC() + print "PC:",client.ARMgetPC() + print "Testing readChunk/writeChunk" + mem=client.ARMreadChunk(0x200000,32) + client.ARMwriteChunk(0x200000,mem) + mem2=client.ARMreadChunk(0x200000,32) + if (mem != mem2): + print "Failed: \n%s\n%s"%(repr([hex(x) for x in mem]), repr([hex(x) for x in mem2])) + else: + print "Passed." + + def test1(): global data print "\n\nTesting JTAG for ARM\n" @@ -83,7 +185,7 @@ def test2(): print "TEST CHAIN0: %s"%repr(client.data) print "Debug State: %x"%client.ARMget_dbgstate () print "IDCODE: %x"%client.ARMident() - #print "Debug State: %x"%client.ARMget_dbgstate () + print "Debug State: %x"%client.ARMget_dbgstate () client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7]) print "Loopback: \t %s"%repr(client.data) # loopback print "Debug State: %x"%client.ARMget_dbgstate () @@ -115,10 +217,170 @@ def test3(): client.writecmd(0x33,0xd4,1,[0]) print "test_get_reg: \t %s"%repr(client.data) +def test4(): + print "IDCODE: %x"%client.ARMident() + print "Debug State: %x"%client.ARMget_dbgstate () + print "set_register(0,0x4141): %x"%client.ARMset_register(0,0x4141) + print "get_register(0): %x"%client.ARMget_register(0) + print "set_register(1,0x4141): %x"%client.ARMset_register(1,0x4142) + print "get_register(1): %x"%client.ARMget_register(1) + print "set_register(2,0x4141): %x"%client.ARMset_register(2,0x4143) + print "get_register(2): %x"%client.ARMget_register(2) + print "set_register(3,0x4141): %x"%client.ARMset_register(3,0x4144) + print "get_register(3): %x"%client.ARMget_register(3) + print "set_register(4,0x4141): %x"%client.ARMset_register(4,0x4145) + print "get_register(4): %x"%client.ARMget_register(4) + print "set_register(5,0x4141): %x"%client.ARMset_register(5,0x4146) + print "get_register(5): %x"%client.ARMget_register(5) + print "set_register(6,0x4141): %x"%client.ARMset_register(6,0x4147) + print "get_register(6): %x"%client.ARMget_register(6) + print "set_register(7,0x4141): %x"%client.ARMset_register(7,0x4148) + print "get_register(7): %x"%client.ARMget_register(7) + print "set_register(8,0x4141): %x"%client.ARMset_register(8,0x4149) + print "get_register(8): %x"%client.ARMget_register(8) + print "set_register(9,0x4141): %x"%client.ARMset_register(9,0x4140) + print "get_register(9): %x"%client.ARMget_register(9) + print "set_register(10,0x4141): %x"%client.ARMset_register(10,0x4151) + print "get_register(10): %x"%client.ARMget_register(10) + print "set_register(11,0x4141): %x"%client.ARMset_register(11,0x4152) + print "get_register(11): %x"%client.ARMget_register(11) + print "set_register(12,0x4141): %x"%client.ARMset_register(12,0x4153) + print "get_register(12): %x"%client.ARMget_register(12) + print "set_register(13,0x4141): %x"%client.ARMset_register(13,0x4154) + print "get_register(13): %x"%client.ARMget_register(13) + print "set_register(14,0x4141): %x"%client.ARMset_register(14,0x4155) + print "get_register(14): %x"%client.ARMget_register(14) + #print "set_register(15,0x4141): %x"%client.ARMset_register(15,0x41414156) + #print "get_register(15): %x"%client.ARMget_register(15) + + +seed = 0 +def test5(start=0,end=15): + global results,seed + results = [[] for x in range(end)] + while True: + #print "IDCODE: %x"%client.ARMident() + #print "Debug State: %x"%client.ARMget_dbgstate () + for x in range(start,end): + num = client.ARMset_register(x,seed) + print "set_register(%d,0x%x): %x"%(x,seed,num) + num = client.ARMget_register(x) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + if (num != seed): + for y in range(13): + num = client.ARMset_register(x,seed) + print "set_register(%d,0x%x): %x"%(x,seed,num) + num = client.ARMget_register(x) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + seed += 1 + client.ARMident() + client.ARMident() + print "Debug State: %x"%client.ARMget_dbgstate () + +def test6(start=0,end=15): + global results,seed + results = [[] for x in range(end)] + while True: + #print "IDCODE: %x"%client.ARMident() + #print "Debug State: %x"%client.ARMget_dbgstate () + for x in range(start,end): + num = client.ARMset_register(x,seed+x) + print "set_register(%d,0x%x): %x"%(x,seed+x,num) + client.ARMident() + client.ARMident() + for x in range(start,end): + num = client.ARMget_register(x) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + if (num != seed+x): + for y in range(13): + num = client.ARMset_register(x,seed+x) + print "set_register(%d,0x%x): %x"%(x,seed+x,num) + num = client.ARMget_register(x) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + client.ARMident() + client.ARMident() + print "Debug State: %x"%client.ARMget_dbgstate () + seed += 1 + +def test7(start=0,end=14): + global results,seed + results = [[] for x in range(end)] + while True: + #print "IDCODE: %x"%client.ARMident() + #print "Debug State: %x"%client.ARMget_dbgstate () + for x in range(end,start-1, -1): + num = client.ARMset_register(x,seed+x) + time.sleep(1) + print "set_register(%d,0x%x): %x"%(x,seed+x,num) + for y in range(10): + for x in range(start,endi+1): + num = client.ARMget_register(x) + time.sleep(1) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + seed += 1 + +def readtest(start=0,end=14): + global results,seed + results = [[] for x in range(end)] + while True: + #print "IDCODE: %x"%client.ARMident() + #print "Debug State: %x"%client.ARMget_dbgstate () + for x in range(end,start, -1): + num = client.ARMget_register(x) + time.sleep(1) + print "get_register(%d): %x"%(x,num) + for y in range(10): + for x in range(start,end,2): + num = client.ARMget_register(x) + time.sleep(1) + print "get_register(%d): %x"%(x,num) + results[x].append(num) + seed += 1 + init() -print "Don't forget to 'client.stop()' if you want to exit cleanly" +def printResults(): + for y in range(len(results)): + x=results[y] + print "%.2x=%s"%(y,repr(["%x"%t for t in x])) + +def ARMreadMem(self, adr, wrdcount): + retval = [] + r0 = self.ARMget_register(5); # store R0 and R1 + r1 = self.ARMget_register(9); + #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) + for word in range(adr, adr+(wrdcount*4), 4): + #sys.stdin.readline() + self.ARMset_register(5, word); # write address into R0 + self.ARMset_register(9, 0xdeadbeef) + self.ARM_nop(0) + self.ARM_nop(1) + self.ARMdebuginstr(0xe4959004L, 0); # push LDR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive reads) + self.ARM_nop(0) + self.ARMrestart() + self.ARMwaitDBG() + time.sleep(.4) + self.ARMdebuginstr(0x47146,0) + self.ARMdebuginstr(0x47147,0) + print hex(self.ARMget_register(9)) + # 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(9) ) # 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(9, r1); # restore R0 and R1 + self.ARMset_register(5, r0); + return retval """ case 0xD0: // loopback test