Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Apr 2004 21:44:15 -0800 (PST)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 50312 for review
Message-ID:  <200404040544.i345iFYS097551@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=50312

Change 50312 by marcel@marcel_nfs on 2004/04/03 21:43:26

	Implement the 'P' command (write register). While here,
	add comments describing each command.

Affected files ...

.. //depot/projects/gdb/sys/gdb/gdb_main.c#13 edit

Differences ...

==== //depot/projects/gdb/sys/gdb/gdb_main.c#13 (text+ko) ====

@@ -113,19 +113,19 @@
 	while (gdb_rx_begin() == 0) {
 		printf("GDB: got '%s'\n", gdb_rxp);
 		switch (gdb_rx_char()) {
-		case '?':
+		case '?':	/* Last signal. */
 			gdb_tx_begin('S');
 			gdb_tx_hex(gdb_cpu_signal(type, code), 2);
 			gdb_tx_end();
 			break;
-		case 'c': {	/* continue */
+		case 'c': {	/* Continue. */
 			uintmax_t addr;
 			if (!gdb_rx_varhex(&addr))
 				gdb_cpu_setreg(GDB_REG_PC, addr);
 			kdb_cpu_clear_singlestep();
 			return (1);
 		}
-		case 'g': {
+		case 'g': {	/* Read registers. */
 			size_t r;
 			gdb_tx_begin(0);
 			for (r = 0; r < GDB_NREGS; r++)
@@ -133,10 +133,10 @@
 			gdb_tx_end();
 			break;
 		}
-		case 'G':
+		case 'G':	/* Write registers. */
 			gdb_tx_err(0);
 			break;
-		case 'H': {
+		case 'H': {	/* Set thread. */
 			intmax_t tid;
 			gdb_rx_char();
 			gdb_rx_varhex(&tid);
@@ -145,10 +145,10 @@
 			gdb_tx_ok();
 			break;
 		}
-		case 'k':
+		case 'k':	/* Kill request. */
 			kdb_cpu_clear_singlestep();
 			return (1);
-		case 'm': {
+		case 'm': {	/* Read memory. */
 			uintmax_t addr, size;
 			if (gdb_rx_varhex(&addr) || gdb_rx_char() != ',' ||
 			    gdb_rx_varhex(&size)) {
@@ -160,10 +160,21 @@
 			gdb_tx_end();
 			break;
 		}
-		case 'M':
+		case 'M':	/* Write memory. */
 			gdb_tx_err(0);
 			break;
-		case 'q':
+		case 'P': {	/* Write register. */
+			uintmax_t reg, val;
+			if (gdb_rx_varhex(&reg) || gdb_rx_char() != '=' ||
+			    gdb_rx_varhex(&val)) {
+				gdb_tx_err(EINVAL);
+				break;
+			}
+			gdb_cpu_setreg(reg, val);
+			gdb_tx_ok();
+			break;
+		}
+		case 'q':	/* General query. */
 			if (gdb_rx_equal("fThreadInfo")) {
 				thr_iter = LIST_FIRST(&allproc);
 				gdb_tx_begin('m');
@@ -186,14 +197,14 @@
 			} else if (!gdb_cpu_query())
 				gdb_tx_empty();
 			break;
-		case 's': {	/* single step */
+		case 's': {	/* Step. */
 			uintmax_t addr;
 			if (!gdb_rx_varhex(&addr))
 				gdb_cpu_setreg(GDB_REG_PC, addr);
 			kdb_cpu_set_singlestep();
 			return (1);
 		}
-		case 'T': {
+		case 'T': {	/* Thread alive. */
 			intmax_t tid;
 			pid_t curtid;
 			gdb_rx_varhex(&tid);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404040544.i345iFYS097551>