X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=14728c73c3c5288bf5fe8f741f76249aa4b8d13c;hp=36f680e4b29a7e4dc94bfac4b96deffc6fdf9ca9;hb=3f38402660946d2792fd9a9974f3ffa670a123e8;hpb=46b8f7ea95b0a9815c40331c692f4346cfba33ee;ds=sidebyside diff --git a/client/GoodFET.py b/client/GoodFET.py index 36f680e..14728c7 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -149,11 +149,54 @@ class GoodFET: hi=ord(self.data[0]); lo=ord(self.data[1]); return (hi<<8)+lo; + def CCdebuginstr(self,instr): + self.writecmd(0x30,0x88,len(instr),instr); + return ord(self.data[0]); def MSP430peek(self,adr): """Read the contents of memory at an address.""" self.data=[adr&0xff, (adr&0xff00)>>8]; self.writecmd(0x11,0x02,2,self.data); return ord(self.data[0])+(ord(self.data[1])<<8); + def CCpeekcodebyte(self,adr): + """Read the contents of code memory at an address.""" + self.data=[adr&0xff, (adr&0xff00)>>8]; + self.writecmd(0x30,0x90,2,self.data); + return ord(self.data[0]); + def CCpeekdatabyte(self,adr): + """Read the contents of data memory at an address.""" + self.data=[adr&0xff, (adr&0xff00)>>8]; + self.writecmd(0x30,0x91, 2, self.data); + return ord(self.data[0]); + def CCpokedatabyte(self,adr,val): + """Write a byte to data memory.""" + self.data=[adr&0xff, (adr&0xff00)>>8, val]; + self.writecmd(0x30, 0x92, 3, self.data); + return ord(self.data[0]); + def CCchiperase(self): + """Erase all of the target's memory.""" + self.writecmd(0x30,0x80,0,None); + def CCstatus(self): + """Check the status.""" + self.writecmd(0x30,0x84,0,None); + return ord(self.data[0]) + CCstatusbits={0x80 : "erased", + 0x40 : "pcon_idle", + 0x20 : "halted", + 0x10 : "pm0", + 0x08 : "halted", + 0x04 : "locked", + 0x02 : "oscstable", + 0x01 : "overflow"}; + def CCstatusstr(self): + """Check the status as a string.""" + status=self.CCstatus(); + str=""; + i=1; + while i<0x100: + if(status&i): + str="%s %s" %(self.CCstatusbits[i],str); + i*=2; + return str; def MSP430poke(self,adr,val): """Read the contents of memory at an address.""" self.data=[adr&0xff, (adr&0xff00)>>8, val&0xff, (val&0xff00)>>8]; @@ -170,6 +213,10 @@ class GoodFET: self.writecmd(0x30,0x20,0,self.data); ident=self.CCidentstr(); print "Target identifies as %s." % ident; + print "Status: %s." % self.CCstatusstr(); + self.CCreleasecpu(); + self.CChaltcpu(); + print "Status: %s." % self.CCstatusstr(); def CCstop(self): """Stop debugging.""" self.writecmd(0x30,0x21,0,self.data); @@ -185,7 +232,12 @@ class GoodFET: def MSP430releasecpu(self): """Resume the CPU.""" self.writecmd(0x11,0xA1,0,self.data); - + def CChaltcpu(self): + """Halt the CPU.""" + self.writecmd(0x30,0x86,0,self.data); + def CCreleasecpu(self): + """Resume the CPU.""" + self.writecmd(0x30,0x87,0,self.data); def MSP430shiftir8(self,ins): """Shift the 8-bit Instruction Register.""" data=[ins]; @@ -246,6 +298,10 @@ class GoodFET: print "%04x %04x" % (i, self.MSP430peek(i)); i+=2; def CCtest(self): + self.CCreleasecpu(); + self.CChaltcpu(); + print "Status: %s" % self.CCstatusstr(); + #Grab ident three times, should be equal. ident1=self.CCident(); ident2=self.CCident(); @@ -255,10 +311,26 @@ class GoodFET: print "%04x, %04x, %04x" % (ident1, ident2, ident3); #Single step, printing PC. - print "Tracing execution at startup." + #print "Tracing execution at startup." for i in range(1,15): - print "PC=%04x" % self.CCgetPC(); + pc=self.CCgetPC(); + byte=self.CCpeekcodebyte(i); + print "PC=%04x, %02x" % (pc, byte); self.CCstep_instr(); + + #print "Verifying that debugging a NOP doesn't affect the PC." + for i in range(1,15): + pc=self.CCgetPC(); + self.CCdebuginstr([0x00]); + if(pc!=self.CCgetPC()): + print "ERROR: PC changed during CCdebuginstr([NOP])!"; + for i in range(0xE500,0xE600): + byte=self.CCpeekdatabyte(i); + print "data %04x: %02x" % (i,byte); + self.CCpokedatabyte(i,i&0xFF); + byte=self.CCpeekdatabyte(i); + print "data %04x: %02x" % (i,byte); + print "Status: %s." % self.CCstatusstr(); #Exit debugger self.CCstop(); print "Done.";