Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Implementing Write to memory and Write to register.

	-data-write-register-values is not in the texinfo manual but implemented in
	gdb-5.2.1/gdb/mi/mim-main.c:
	Write given values into registers. The registers and values are
	given as pairs. The corresponding MI command is 
	-data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]

	* src/.../core/command/MIDataWriteRegisterValues.java: New file.
	* src/.../core/command/CommandFactory.java (createMIDataWriteMemory): New method.
	* src/.../core/cdi/Register.java (setValue): Implemented.
	

	Althought -data-write-memory is not documented in the texinfo manual
	it is implemented and well documented in the code(gdb-5.2.1/gdb/mi/mi-main.c).
	"mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");

	* src/.../core/command/MIDataWriteMemory.java: New file
	* src/.../core/command/CommandFactory.java (createMIDataWriteMemory): New method.
	* src/.../core/cdi/MemoryBlock.java (setValue): Implemented.


	* src/.../core/cdi/CTarget.java (getMemoryBlock): Remove
	we use the MemoryManager instead.
	(EvaluateExpressionToValue): Removed not use.
	* src/.../core/cdi/SourceManager.java (setFile): Removed not use.
	(getFile): Removed not use.
	(reset): Removed not use.



Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/ChangeLog,v
retrieving revision 1.10
diff -u -r1.10 ChangeLog
--- ChangeLog	19 Oct 2002 19:21:24 -0000	1.10
+++ ChangeLog	20 Oct 2002 23:22:00 -0000
@@ -1,3 +1,34 @@
+2002-10-20 Alain Magloire
+
+	-data-write-register-values is not in the texinfo manual but implemented in
+	gdb-5.2.1/gdb/mi/mim-main.c:
+	Write given values into registers. The registers and values are
+	given as pairs. The corresponding MI command is 
+	-data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]
+
+	* src/.../core/command/MIDataWriteRegisterValues.java: New file.
+	* src/.../core/command/CommandFactory.java (createMIDataWriteMemory): New method.
+	* src/.../core/cdi/Register.java (setValue): Implemented.
+	
+2002-10-20 Alain Magloire
+
+	Althought -data-write-memory is not documented in the texinfo manual
+	it is implemented and well documented in the code(gdb-5.2.1/gdb/mi/mi-main.c).
+	"mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
+
+	* src/.../core/command/MIDataWriteMemory.java: New file
+	* src/.../core/command/CommandFactory.java (createMIDataWriteMemory): New method.
+	* src/.../core/cdi/MemoryBlock.java (setValue): Implemented.
+
+2002-10-20 Alain Magloire
+
+	* src/.../core/cdi/CTarget.java (getMemoryBlock): Remove
+	we use the MemoryManager instead.
+	(EvaluateExpressionToValue): Removed not use.
+	* src/.../core/cdi/SourceManager.java (setFile): Removed not use.
+	(getFile): Removed not use.
+	(reset): Removed not use.
+
 2002-10-19 Alain Magloire
 
 	The responsability to generate Events for modify memory blocks is push
Index: src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java,v
retrieving revision 1.30
diff -u -r1.30 CTarget.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java	19 Oct 2002 19:19:11 -0000	1.30
+++ src/org/eclipse/cdt/debug/mi/core/cdi/CTarget.java	20 Oct 2002 23:22:07 -0000
@@ -12,12 +12,10 @@
 import org.eclipse.cdt.debug.core.cdi.ICDIRegisterObject;
 import org.eclipse.cdt.debug.core.cdi.ICDISession;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIGlobalVariable;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIRegister;
 import org.eclipse.cdt.debug.core.cdi.model.ICDISharedLibrary;
 import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
-import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
 import org.eclipse.cdt.debug.mi.core.MIException;
 import org.eclipse.cdt.debug.mi.core.MISession;
 import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
@@ -500,26 +498,10 @@
 	}
 
 	/**
-	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getCMemoryBlock(long, long)
-	 */
-	public ICDIMemoryBlock getCMemoryBlock(long startAddress, long length)
-		throws CDIException {
-		return null;
-	}
-
-	/**
 	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#getProcess()
 	 */
 	public Process getProcess() {
 		return session.getMISession().getMIInferior();
-	}
-
-	/**
-	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#evaluateExpressionToValue(String)
-	 */
-	public ICDIValue evaluateExpressionToValue(String expressionText)
-		throws CDIException {
-		return null;
 	}
 
 }
Index: src/org/eclipse/cdt/debug/mi/core/cdi/MemoryBlock.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/MemoryBlock.java,v
retrieving revision 1.3
diff -u -r1.3 MemoryBlock.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/MemoryBlock.java	19 Oct 2002 19:19:53 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/MemoryBlock.java	20 Oct 2002 23:22:04 -0000
@@ -5,7 +5,13 @@
 
 import org.eclipse.cdt.debug.core.cdi.CDIException;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock;
+import org.eclipse.cdt.debug.mi.core.MIException;
+import org.eclipse.cdt.debug.mi.core.MIFormat;
+import org.eclipse.cdt.debug.mi.core.MISession;
+import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
+import org.eclipse.cdt.debug.mi.core.command.MIDataWriteMemory;
 import org.eclipse.cdt.debug.mi.core.output.MIDataReadMemoryInfo;
+import org.eclipse.cdt.debug.mi.core.output.MIInfo;
 import org.eclipse.cdt.debug.mi.core.output.MIMemory;
 
 /**
@@ -120,7 +126,23 @@
 	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock#setValue(long, byte[])
 	 */
 	public void setValue(long offset, byte[] bytes) throws CDIException {
-		throw new CDIException("Not supported");
+		MISession mi = getCTarget().getCSession().getMISession();
+		CommandFactory factory = mi.getCommandFactory();
+		for (int i = 0; i < bytes.length; i++) {
+			long l = new Byte(bytes[i]).longValue();
+			String value = "0x" + Long.toHexString(l);
+			MIDataWriteMemory mem = factory.createMIDataWriteMemory(offset + i,
+				expression, MIFormat.HEXADECIMAL, 1, value);
+			try {
+				mi.postCommand(mem);
+				MIInfo info = mem.getMIInfo();
+				if (info == null) {
+					throw new CDIException("No answer");
+				}
+			} catch (MIException e) {
+				throw new CDIException(e.getMessage());
+			}
+		}
 	}
 
 }
Index: src/org/eclipse/cdt/debug/mi/core/cdi/Register.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/Register.java,v
retrieving revision 1.3
diff -u -r1.3 Register.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/Register.java	2 Oct 2002 04:50:39 -0000	1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/Register.java	20 Oct 2002 23:22:05 -0000
@@ -19,7 +19,9 @@
 import org.eclipse.cdt.debug.mi.core.MISession;
 import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
 import org.eclipse.cdt.debug.mi.core.command.MIDataListRegisterValues;
+import org.eclipse.cdt.debug.mi.core.command.MIDataWriteRegisterValues;
 import org.eclipse.cdt.debug.mi.core.output.MIDataListRegisterValuesInfo;
+import org.eclipse.cdt.debug.mi.core.output.MIInfo;
 import org.eclipse.cdt.debug.mi.core.output.MIRegisterValue;
 
 /**
@@ -198,7 +200,21 @@
 	 * @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariable#setValue(String)
 	 */
 	public void setValue(String expression) throws CDIException {
-		throw new CDIException("Register setting is not supported");
+		MISession mi = getCTarget().getCSession().getMISession();
+		CommandFactory factory = mi.getCommandFactory();
+		int[] regnos = new int[]{((RegisterObject)regObject).getId()};
+		String[] values = new String[]{expression};
+		MIDataWriteRegisterValues registers =
+				factory.createMIDataWriteRegisterValues(format, regnos, values);
+		try {
+			mi.postCommand(registers);
+			MIInfo info = registers.getMIInfo();
+			if (info == null) {
+				throw new CDIException("No answer");
+			}
+		} catch (MIException e) {
+			throw new CDIException(e.getMessage());
+		}
 	}
 
 	/**
Index: src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java,v
retrieving revision 1.15
diff -u -r1.15 SourceManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java	12 Oct 2002 01:21:51 -0000	1.15
+++ src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java	20 Oct 2002 23:22:08 -0000
@@ -5,8 +5,6 @@
  */
 package org.eclipse.cdt.debug.mi.core.cdi;
 
-import java.io.File;
-
 import org.eclipse.cdt.debug.core.cdi.CDIException;
 import org.eclipse.cdt.debug.core.cdi.ICDISourceManager;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
@@ -33,25 +31,6 @@
 
 	public SourceManager(CSession session) {
 		super(session);
-	}
-	
-	/**
-	 * @see org.eclipse.cdt.debug.core.cdi.ICDISourceManager#getDirectories()
-	 */
-	public File[] getDirectories() throws CDIException {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.cdt.debug.core.cdi.ICDISourceManager#reset()
-	 */
-	public void reset() throws CDIException {
-	}
-
-	/**
-	 * @see org.eclipse.cdt.debug.core.cdi.ICDISourceManager#set(File[])
-	 */
-	public void set(File[] directories) throws CDIException {
 	}
 
 	/**
Index: src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java,v
retrieving revision 1.15
diff -u -r1.15 CommandFactory.java
--- src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java	2 Oct 2002 04:53:54 -0000	1.15
+++ src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java	20 Oct 2002 23:22:11 -0000
@@ -68,12 +68,16 @@
 		return new MIDataListRegisterNames();
 	}
 
-	public MIDataListRegisterNames createMIDataListRegisterNames(int[] regno) {
-		return new MIDataListRegisterNames(regno);
+	public MIDataListRegisterNames createMIDataListRegisterNames(int[] regnos) {
+		return new MIDataListRegisterNames(regnos);
 	}
 
-	public MIDataListRegisterValues createMIDataListRegisterValues(int fmt, int[] regno) {
-		return new MIDataListRegisterValues(fmt, regno);
+	public MIDataListRegisterValues createMIDataListRegisterValues(int fmt, int[] regnos) {
+		return new MIDataListRegisterValues(fmt, regnos);
+	}
+
+	public MIDataWriteRegisterValues createMIDataWriteRegisterValues(int fmt, int[] regnos, String[] values) {
+		return new MIDataWriteRegisterValues(fmt, regnos, values);
 	}
 
 	public MIDataReadMemory createMIDataReadMemory(long offset, String address,
@@ -81,6 +85,12 @@
 							int rows, int cols, Character asChar) {
 		return new MIDataReadMemory(offset, address, wordFormat, wordSize,
 						rows, cols, asChar);
+	}
+
+	public MIDataWriteMemory createMIDataWriteMemory(long offset, String address,
+							int wordFormat, int wordSize,
+							String value) {
+		return new MIDataWriteMemory(offset, address, wordFormat, wordSize, value);
 	}
 
 	public MIEnvironmentCD createMIEnvironmentCD(String pathdir) {
Index: src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteMemory.java
===================================================================
RCS file: src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteMemory.java
diff -N src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteMemory.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteMemory.java	20 Oct 2002 23:22:10 -0000
@@ -0,0 +1,93 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+
+package org.eclipse.cdt.debug.mi.core.command;
+
+import org.eclipse.cdt.debug.mi.core.MIFormat;
+
+/**
+ * 
+ *    -data-write-memory [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
+ *
+ * where:
+ * 
+ * DATA-MEMORY-WRITE:
+ *
+ *   COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
+ *   offset from the beginning of the memory grid row where the cell to
+ *   be written is.
+ *   ADDR: start address of the row in the memory grid where the memory
+ *   cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
+ *   the location to write to.
+ *   FORMAT: a char indicating format for the ``word''. See 
+ *   the ``x'' command.
+ *   WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
+ *   VALUE: value to be written into the memory address.
+ *
+ *   Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
+ *
+ *  Prints nothing.
+ *
+ */
+public class MIDataWriteMemory extends MICommand {
+
+	public MIDataWriteMemory(long offset, String address, int wordFormat, int wordSize,
+		String value) {
+
+		super ("-data-write-memory");
+
+		if (offset != 0) {
+			setOptions(new String[] { "-o", Long.toString(offset)});
+		}
+
+		String format = "x";
+		switch (wordFormat) {
+			case MIFormat.UNSIGNED :
+				format = "u";
+				break;
+
+			case MIFormat.FLOAT :
+				format = "f";
+				break;
+
+			case MIFormat.ADDRESS :
+				format = "a";
+				break;
+
+			case MIFormat.INSTRUCTION :
+				format = "i";
+				break;
+
+			case MIFormat.CHAR :
+				format = "c";
+				break;
+
+			case MIFormat.STRING :
+				format = "s";
+				break;
+
+			case MIFormat.DECIMAL :
+				format = "d";
+				break;
+
+			case MIFormat.BINARY :
+				format = "t";
+				break;
+
+			case MIFormat.OCTAL :
+				format = "o";
+				break;
+
+			case MIFormat.HEXADECIMAL :
+			default :
+				format = "x";
+				break;
+		}
+
+		setParameters(new String[] {address, format, Integer.toString(wordSize), value});
+	}
+
+}
Index: src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteRegisterValues.java
===================================================================
RCS file: src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteRegisterValues.java
diff -N src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteRegisterValues.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/debug/mi/core/command/MIDataWriteRegisterValues.java	20 Oct 2002 23:22:11 -0000
@@ -0,0 +1,67 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+
+package org.eclipse.cdt.debug.mi.core.command;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.cdt.debug.mi.core.MIFormat;
+
+/**
+ * 
+ * Write given values into registers. The registers and values are
+ * given as pairs. The corresponding MI command is 
+ * -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]
+ *
+ */
+public class MIDataWriteRegisterValues extends MICommand {
+
+	public MIDataWriteRegisterValues(int fmt, int[] regnos, String[] values) {
+		super("-data-write-register-values");
+
+		String format = "x";
+		switch (fmt) {
+			case MIFormat.NATURAL:
+				format = "N";
+			break;
+
+			case MIFormat.RAW:
+				format = "r";
+			break;
+
+			case MIFormat.DECIMAL:
+				format = "d";
+			break;
+
+			case MIFormat.BINARY:
+				format = "t";
+			break;
+
+			case MIFormat.OCTAL:
+				format = "o";
+			break;
+
+			case MIFormat.HEXADECIMAL:
+			default:
+				format = "x";
+			break;
+		}
+
+		setOptions(new String[]{format});
+
+		if (regnos != null && values != null) {
+			List aList = new ArrayList(regnos.length);
+			for (int i = 0; i < regnos.length && i < values.length; i++) {
+				aList.add(Integer.toString(regnos[i]));
+				aList.add(values[i]);
+			}
+			String[] array = (String[])aList.toArray(new String[0]);
+			setParameters(array);
+		}
+	}
+
+}



Back to the top