diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java index 64e23511a74..994822cf063 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java @@ -29,6 +29,7 @@ import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IMemorySpaces; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlock.MemorySpaceDMContext; +import org.eclipse.cdt.dsf.gdb.service.IGDBMemory; import org.eclipse.cdt.dsf.gdb.service.IGDBMemory2; import org.eclipse.cdt.dsf.service.DsfServices; import org.eclipse.cdt.dsf.service.DsfSession; @@ -49,6 +50,8 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import com.ibm.icu.text.MessageFormat; + /** * A specialization of the DSF memory block retrieval implementation supporting * memory spaces. The memory space support is provisional, thus this class is @@ -173,6 +176,14 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements } } + // check for block address exceeding maximum allowed address value + int addressSize = getAddressSize(memoryDmc, memorySpaceID); + BigInteger endAddress = BigInteger.ONE.shiftLeft(addressSize*8).subtract(BigInteger.ONE); + if (endAddress.compareTo(blockAddress) < 0) { + throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, + MessageFormat.format(Messages.Err_ExceedsMaxAddress, expression, endAddress.toString(16)), null)); + } + /* * At this point, we only resolved the requested memory block * start address and we have no idea of the block's length. @@ -403,6 +414,16 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements return super.getAddressableSize(); } + + private int getAddressSize(IMemoryDMContext aContext, String memorySpaceID) { + IGDBMemory memoryService = (IGDBMemory)getServiceTracker().getService(); + if (memoryService != null && aContext != null) { + IMemoryDMContext context = resolveMemSpaceContext(aContext, memorySpaceID); + return memoryService.getAddressSize(context); + } + return super.getAddressSize(); + } + private IMemoryDMContext resolveMemSpaceContext(IMemoryDMContext aContext, String aMemorySpaceID) { IMemoryDMContext context = aContext; if (aMemorySpaceID != null && aMemorySpaceID.length() > 0) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java index 83f2cea57b6..627fee0d25a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java @@ -21,7 +21,8 @@ public class Messages extends NLS { NLS.initializeMessages("org.eclipse.cdt.dsf.gdb.internal.memory.messages", Messages.class); //$NON-NLS-1$ } - public static String Err_MemoryServiceNotAvailable; + public static String Err_ExceedsMaxAddress; + public static String Err_MemoryServiceNotAvailable; public static String Err_MemoryReadFailed; public static String Err_MemoryWriteFailed; public static String Err_InvalidEncodedAddress; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties index 9a8f8148b26..ea7e2c1a2a8 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties @@ -9,6 +9,7 @@ # Freescale Semiconductor - initial API and implementation ############################################################################### +Err_ExceedsMaxAddress=Expression value {0} exceeds maximum address 0x{1} Err_MemoryServiceNotAvailable=The required DSF memory service is not available. Err_MemoryReadFailed=Error reading memory block Err_MemoryWriteFailed=Error writing memory block