Index: disassembler/DisassemblyWindow.java =================================================================== RCS file: /cvs/frysk/frysk-gui/frysk/gui/disassembler/DisassemblyWindow.java,v retrieving revision 1.30 diff -u -r1.30 DisassemblyWindow.java --- disassembler/DisassemblyWindow.java 21 Aug 2007 06:18:30 -0000 1.30 +++ disassembler/DisassemblyWindow.java 6 Sep 2007 07:46:26 -0000 @@ -80,6 +80,7 @@ import frysk.proc.Proc; import frysk.proc.Task; import frysk.stepping.TaskStepEngine; +import frysk.proc.MemoryMap; import lib.opcodes.Disassembler; import lib.opcodes.Instruction; @@ -157,6 +158,8 @@ private boolean closed = false; + private MemoryMap[] mmaps; + /** * The DisassmblyWindow, given a Task, will disassemble the instructions * and parameters for that task in memory and display them, as well as their @@ -253,7 +256,7 @@ { this.myTask = myTask; long pc_inc; - double highestAddress = Math.pow(2.0, (double)(8 * myTask.getIsa().getWordSize())) - 1.0; + final double highestAddress = Math.pow(2.0, (double)(8 * myTask.getIsa().getWordSize())) - 1.0; this.diss = new Disassembler(myTask.getMemory()); @@ -266,6 +269,8 @@ this.disassemblerView = (TreeView) this.glade.getWidget("disassemblerView"); + this.mmaps = this.myTask.getProc().getMaps(); + this.diss = new Disassembler(myTask.getMemory()); this.fromSpin.setRange(0.0, highestAddress); this.fromSpin.setValue((double) pc_inc); @@ -326,7 +331,18 @@ return; if (arg0.getType() == SpinEvent.Type.VALUE_CHANGED) - handleFromSpin(fromSpin.getValue()); + { + double value = fromSpin.getValue(); + if (value <= 0.0 || value >= highestAddress) + fromSpin.setValue(lastKnownFrom); + else + { + if (addressAccessible((long)value)) + handleFromSpin(value); + else + fromSpin.setValue(lastKnownFrom); + } + } } }); @@ -338,7 +354,18 @@ return; if (arg0.getType() == SpinEvent.Type.VALUE_CHANGED) - handleToSpin(toSpin.getValue()); + { + double value = toSpin.getValue(); + if (value <= 0.0 || value >= highestAddress) + toSpin.setValue(lastKnownTo); + else + { + if (addressAccessible((long)value)) + handleToSpin(value); + else + toSpin.setValue(lastKnownTo); + } + } } }); @@ -356,15 +383,20 @@ try { double d = (double) Long.parseLong(str, 16); - if (d > lastKnownTo) + if (!addressAccessible((long)d)) + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else { - if (lastKnownTo == lastKnownFrom) - handleFromSpin(lastKnownTo); - else - fromSpin.setValue(lastKnownTo); + if (d > lastKnownTo) + { + if (lastKnownTo == lastKnownFrom) + handleFromSpin(lastKnownTo); + else + fromSpin.setValue(lastKnownTo); + } + else + fromSpin.setValue(d); } - else - fromSpin.setValue(d); } catch (NumberFormatException nfe) { @@ -388,15 +420,20 @@ try { double d = (double) Long.parseLong(str, 16); - if (d < lastKnownFrom) + if (!(addressAccessible((long)d))) + toBox.setText("0x" + Long.toHexString((long) lastKnownTo)); + else { - if (lastKnownFrom == lastKnownTo) - handleToSpin(lastKnownFrom); + if (d < lastKnownFrom) + { + if (lastKnownFrom == lastKnownTo) + handleToSpin(lastKnownFrom); + else + toSpin.setValue(lastKnownFrom); + } else - toSpin.setValue(lastKnownFrom); + toSpin.setValue(d); } - else - toSpin.setValue(d); } catch (NumberFormatException nfe) { @@ -502,6 +539,18 @@ } this.refreshList(); } + /** + * return a boolean indicating whether or not this address is accessible. + * + * @return whether or not this address is accessible + */ + private boolean addressAccessible(long address) + { + for (int i=0; i< this.mmaps.length; i++) + if (mmaps[i].addressLow <= address && address < mmaps[i].addressHigh) + return true; + return false; + } protected void resetPCAndList () { @@ -822,11 +871,7 @@ return; this.toToggle = true; - - this.model.removeRow(this.model.getIter(this.lastPath)); - this.lastPath.previous(); - --this.numInstructions; - + Instruction ins = (Instruction) this.model.getValue(this.model.getIter(this.lastPath), (DataColumnObject) cols[OBJ]); Index: memory/MemoryWindow.java =================================================================== RCS file: /cvs/frysk/frysk-gui/frysk/gui/memory/MemoryWindow.java,v retrieving revision 1.45 diff -u -r1.45 MemoryWindow.java --- memory/MemoryWindow.java 3 Sep 2007 02:20:31 -0000 1.45 +++ memory/MemoryWindow.java 6 Sep 2007 07:46:26 -0000 @@ -87,6 +87,7 @@ import frysk.proc.Proc; import frysk.proc.Task; import frysk.stepping.TaskStepEngine; +import frysk.proc.MemoryMap; import lib.opcodes.Disassembler; import lib.opcodes.Instruction; @@ -194,6 +195,8 @@ private boolean toggle = true; private boolean closed = false; + + private MemoryMap[] mmaps; /** * The MemoryWindow displays the information stored at various locations in @@ -294,7 +297,7 @@ { this.myTask = myTask; long pc_inc; - double highestAddress = Math.pow(2.0, (double)(8 * myTask.getIsa().getWordSize())) - 1.0; + final double highestAddress = Math.pow(2.0, (double)(8 * myTask.getIsa().getWordSize())) - 1.0; if (currentFormat == 0) { @@ -304,6 +307,8 @@ currentFormat = THIRTYTWO_BIT; } + this.mmaps = this.myTask.getProc().getMaps(); + this.diss = new Disassembler(myTask.getMemory()); pc_inc = myTask.getIsa().pc(myTask); long end = pc_inc + 50; @@ -458,7 +463,18 @@ return; if (arg0.getType() == SpinEvent.Type.VALUE_CHANGED) - handleFromSpin(fromSpin.getValue()); + { + double value = fromSpin.getValue(); + if (value <= 0.0 || value >= highestAddress) + fromSpin.setValue(lastKnownFrom); + else + { + if (addressAccessible((long)value)) + handleFromSpin(value); + else + fromSpin.setValue(lastKnownFrom); + } + } } }); @@ -470,7 +486,18 @@ return; if (arg0.getType() == SpinEvent.Type.VALUE_CHANGED) - handleToSpin(toSpin.getValue()); + { + double value = toSpin.getValue(); + if (value <= 0.0 || value >= highestAddress) + toSpin.setValue(lastKnownTo); + else + { + if (addressAccessible((long)value)) + handleToSpin(value); + else + toSpin.setValue(lastKnownTo); + } + } } }); @@ -488,15 +515,20 @@ try { double d = (double) Long.parseLong(str, 16); - if (d > lastKnownTo) + if (!addressAccessible((long)d)) + fromBox.setText("0x" + Long.toHexString((long) lastKnownFrom)); + else { - if (lastKnownTo == lastKnownFrom) - handleFromSpin(lastKnownTo); - else - fromSpin.setValue(lastKnownTo); + if (d > lastKnownTo) + { + if (lastKnownTo == lastKnownFrom) + handleFromSpin(lastKnownTo); + else + fromSpin.setValue(lastKnownTo); + } + else + fromSpin.setValue(d); } - else - fromSpin.setValue(d); } catch (NumberFormatException nfe) { @@ -540,6 +572,19 @@ } + /** + * return a boolean indicating whether or not this address is accessible. + * + * @return whether or not this address is accessible + */ + private boolean addressAccessible(long address) + { + for (int i=0; i< this.mmaps.length; i++) + if (mmaps[i].addressLow <= address && address < mmaps[i].addressHigh) + return true; + return false; + } + private boolean refreshLock = false; public void resetTask (Task task)