Skip to content

Commit

Permalink
updating debugger
Browse files Browse the repository at this point in the history
  • Loading branch information
andrew committed Aug 3, 2012
1 parent 31d1c3d commit 7994e18
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 35 deletions.
4 changes: 0 additions & 4 deletions js/common/mmu.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,10 +226,6 @@ function Mmu(size) {
}
}

this.getPhysicalSize = function() {
return this.physicalMemory.getSize();
}

this.readHalfWord = function(address)
{
//if(address >= 0xbfd00000)
Expand Down
26 changes: 21 additions & 5 deletions js/node/node_main.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ function addCommand(name,fun){
commandLUT[name] = fun;
}


function callNoException(newThis,func,args){
var oldTriggerException = emu.cpu.triggerException;
emu.cpu.triggerException = function () {};
var ret = func.apply(newThis,args);
emu.cpu.triggerException = oldTriggerException;
return ret;
}

// START debugging interface

Expand Down Expand Up @@ -137,6 +143,7 @@ addCommand("break", function (s,command) {
});



addCommand("readreg", function (s,command) {
arg = command.split(" ")[1];
var val = 0;
Expand Down Expand Up @@ -164,6 +171,7 @@ addCommand("readreg", function (s,command) {
s.write("ok "+ val.toString(16) +'\n');
});


addCommand("writereg", function (s,command) {
var arg = command.split(" ")[1];
var val = parseInt(command.split(" ")[2],16);
Expand All @@ -176,7 +184,6 @@ addCommand("writereg", function (s,command) {
}

}

if(arg == "PC"){
emu.cpu.PC.putUInt32(val);
} else if (arg == "HI") {
Expand All @@ -192,21 +199,30 @@ addCommand("writereg", function (s,command) {


addCommand("physmemsize", function (s,command) {
s.write("ok " + emu.mmu.getPhysicalSize().toString(16) + '\n');
s.write("ok " + emu.mmu.physicalMemory.getSize().toString(16) + '\n');
})


addCommand("readpb", function (s,command) {
var addr = command.split(" ")[1];
addr = parseInt(addr,16);
var val = emu.mmu.physicalMemory.getByte(addr)
s.write("ok "+ val.toString(16) +'\n');
})


addCommand("readb", function (s,command) {
var addr = command.split(" ")[1];
addr = parseInt(addr,16);
var val = emu.mmu.readByte(addr);
var val = callNoException(emu.mmu,emu.mmu.readByte,[addr]);
s.write("ok "+ val.toString(16) +'\n');
});


addCommand("readword", function (s,command) {
var addr = command.split(" ")[1];
addr = parseInt(addr,16);
var val = emu.mmu.readWord(addr);
var val = callNoException(emu.mmu,emu.mmu.readWord,[addr]);
s.write("ok "+ val.toString(16) +'\n');
});

Expand Down
14 changes: 12 additions & 2 deletions tools/MemoryDump.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@

dbg = mips32emu.DbgEngine.DbgEngine()

for i in range(dbg.getPhysMemorySize()):
sys.stdout.write(chr(dbg.readByte(i)))

if len(sys.argv) == 1:
r = xrange(dbg.getPhysMemorySize())
elif len(sys.argv) == 2:
r = xrange(int(sys.argv[1],16),dbg.getPhysMemorySize())
elif len(sys.argv) == 3:
r = xrange(int(sys.argv[1],16),int(sys.argv[2],16))
else:
raise Exception("incorrect arguments")

for i in r:
sys.stdout.write(chr(dbg.readByte(i,True)))
sys.stdout.flush()
14 changes: 10 additions & 4 deletions tools/PCsampler.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sys
import time
import mips32emu.DbgEngine

import socket


dbg = mips32emu.DbgEngine.DbgEngine()
Expand All @@ -11,6 +11,12 @@


while 1:
time.sleep(1)
pc = dbg.readReg("PC")
print("PC: %08X (%s)"%(pc,dbg.getFunctionName(pc)))
try:
time.sleep(2)
pc = dbg.readReg("PC")
print("PC: %08X (%s)"%(pc,dbg.getFunctionName(pc)))
except socket.error:
try:
dbg.pingAndReconnect()
except socket.error as e:
print("reconnect failed..." + str(e))
16 changes: 12 additions & 4 deletions tools/mips32emu/AssemblyViewPanel.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import wx
import DbgEngine

import socket
#this is a panel class which can be used for displaying disassembly

class AssemblyViewPanel(wx.Panel):
Expand All @@ -14,7 +14,7 @@ def __init__(self,parent,id=-1):
wx.FONTWEIGHT_NORMAL, False, 'Courier 10 Pitch')
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.timerHandler, self.timer)
self.timer.Start(700,False)
self.timer.Start(1500,False)
def timerHandler(self,evt):
self.Refresh()
def OnSize(self, event):
Expand All @@ -27,17 +27,25 @@ def OnPaint(self, event):
dc.SetBrush(wx.Brush('#000000'))
size = 10
dc.SetFont(self.font)
pc = self.dbg.readReg("PC")
try:
self.dbg.pingAndReconnect()
pc = self.dbg.readReg("PC")
except socket.error:
pc = 0
count = 0
nInstr = sy//20
pcIdx = nInstr//2

for i in range(0,sy,20):
curInstrAddr = pc + (4*(count-pcIdx))
dc.DrawLine(0,i,sx,i)
if curInstrAddr < 0:
op = None
else:
op = self.dbg.readWord(curInstrAddr)
try:
op = self.dbg.readWord(curInstrAddr)
except socket.error:
op = None
if count == pcIdx:
dc.SetBrush(wx.Brush('#ff0000'))
dc.DrawRectangle(0,i+1, sx, 19)
Expand Down
70 changes: 58 additions & 12 deletions tools/mips32emu/CpuViewPanel.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,50 @@
import wx
import DbgEngine
import socket


regalias = {

"GR0" : "G0",
"GR1" : "AT",
"GR2" : "V0" ,
"GR3" : "V1" ,
"GR4" : "A0" ,
"GR5" : "A1" ,
"GR6" : "A2" ,
"GR7" : "A3" ,
"GR8" : "T0" ,
"GR9" : "T1" ,
"GR10" : "T2" ,
"GR11" : "T3" ,
"GR12" : "T4" ,
"GR13" : "T5" ,
"GR14" : "T6" ,
"GR15" : "T7" ,
"GR16" : "S0" ,
"GR17" : "S1" ,
"GR18" : "S2" ,
"GR19" : "S3" ,
"GR20" : "S4" ,
"GR21" : "S5" ,
"GR22" : "S6" ,
"GR23" : "S7" ,
"GR24" : "T8" ,
"GR25" : "T9" ,
"GR26" : "K0" ,
"GR27" : "K1" ,
"GR28" : "GP" ,
"GR29" : "SP" ,
"GR30" : "FP" ,
"GR31" : "RA" ,
}


class RegisterView(wx.Panel):
def __init__(self,parent,name,id=-1):
wx.Panel.__init__(self, parent)
self.parent = parent
self.name = name
self.name = regalias.get(name,name)
self.initGUI()
self.setValue(0)
def initGUI(self):
Expand All @@ -19,13 +57,16 @@ def initGUI(self):
self.tctl = tctl
sizer.Add(tctl)
def setValue(self,v):
self.tctl.Clear()
if v == None:
self.tctl.WriteText("????????")
return
if 2**32 <= v < 0:
newText = "????????"
elif 2**32 <= v < 0:
raise Exception("illegal value for Register view %d"%v)
self.tctl.WriteText("%08X"%v)
else:
newText = "%08X"%v
if self.tctl.GetValue() == newText:
return
self.tctl.Clear()
self.tctl.WriteText(newText)


class CpuViewPanel(wx.Panel):
Expand All @@ -37,7 +78,7 @@ def __init__(self,parent,id=-1):
self.dbg = DbgEngine.DbgEngine()
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.timerHandler, self.timer)
self.timer.Start(700,False)
self.timer.Start(1500,False)
def timerHandler(self,evt):
self.updateDebuggerDisplay()
self.Refresh()
Expand All @@ -61,9 +102,14 @@ def initGUI(self):
gridSizer.Add(rv)
def updateDebuggerDisplay(self):
registers= ["PC","LO","HI"] + ["GR%d"%i for i in range(32) ]
for r in registers:
try:
self.rvs[r].setValue(self.dbg.readReg(r))
except Exception as e:
print e
try:
self.dbg.pingAndReconnect()
for r in registers:
try:
self.rvs[r].setValue(self.dbg.readReg(r))
except Exception as e:
self.rvs[r].setValue(None)
except socket.error:
for r in registers:
self.rvs[r].setValue(None)

27 changes: 23 additions & 4 deletions tools/mips32emu/DbgEngine.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,25 @@

class DbgEngine(object):
def __init__(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect(('localhost', 8123))
try:
self.reconnect()
except socket.error:
pass
self.pctofnLookup = {}
self.disasmCache = util.Cache(50000)
def reconnect(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect(('localhost', 8123))


def ping(self):
self.readReg("PC")
def pingAndReconnect(self):
try:
self.ping()
except socket.error:
self.reconnect()

def disassemble(self,op):
try:
return self.disasmCache.get(op)
Expand All @@ -37,8 +52,12 @@ def step(self):
return
else:
raise Exception("step failed")
def readByte(self,addr):
self.s.send("readb "+hex(addr)+'\n')
def readByte(self,addr,phys):
if phys:
c = 'readpb '
else:
c = 'readb '
self.s.send(c+hex(addr)+'\n')
res = self.s.recv(1024)
if res.startswith('ok'):
return int(res.split(' ')[1],16)
Expand Down

0 comments on commit 7994e18

Please sign in to comment.