From 3e9fde6d2f51211801286a632021bd96e107ad35 Mon Sep 17 00:00:00 2001 From: Scott Tepavich Date: Tue, 4 Sep 2012 08:32:31 -0700 Subject: Bug [388356] Disassembly view attempts to disassemble beyond address space --- .../cdt/ui/disassembly/TCFDisassemblyBackend.java | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java b/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java index 4e446c1da..9ad29c07c 100644 --- a/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java +++ b/plugins/org.eclipse.tcf.cdt.ui/src/org/eclipse/tcf/internal/cdt/ui/disassembly/TCFDisassemblyBackend.java @@ -510,9 +510,29 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { fCallback.setUpdatePending(false); return; } + final int addr_bits = mem.getAddressSize() * 8; + int accessSize = 0; + BigInteger bit = new BigInteger("1"); + BigInteger mem_end = bit.shiftLeft(addr_bits); + mem_end = mem_end.subtract(bit); + + if (startAddress.compareTo(mem_end) > 0) { + fCallback.setUpdatePending(false); + return; + } + + BigInteger requestedLineEndAddr = startAddress.add(BigInteger.valueOf(linesHint * mem.getAddressSize())); + + if (requestedLineEndAddr.compareTo(mem_end) > 0) { + accessSize = mem_end.subtract(startAddress).intValue() + 1; + } + else { + accessSize = linesHint * mem.getAddressSize(); + } + final String contextId = mem.getID(); Map params = new HashMap(); - disass.disassemble(contextId, startAddress, linesHint * 4, params, new DoneDisassemble() { + disass.disassemble(contextId, startAddress, accessSize, params, new DoneDisassemble() { public void doneDisassemble(IToken token, final Throwable error, IDisassemblyLine[] disassembly) { if (execContext != fExecContext) return; if (error != null) { @@ -522,7 +542,6 @@ public class TCFDisassemblyBackend extends AbstractDisassemblyBackend { if (modCount == getModCount()) { fCallback.insertError(startAddress, TCFModel.getErrorMessage(error, false)); fCallback.setUpdatePending(false); - int addr_bits = mem.getAddressSize() * 8; if (fCallback.getAddressSize() < addr_bits) fCallback.addressSizeChanged(addr_bits); } } -- cgit v1.2.3