diff rvinterf/etmsync/memops.c @ 977:ce0ded19a769

rvinterf: first attempt at TM3 memory read: omemdump command in fc-fsio
author Mychaela Falconia <falcon@ivan.Harhan.ORG>
date Thu, 10 Dec 2015 04:00:08 +0000
parents 38c7078712ab
children
line wrap: on
line diff
--- a/rvinterf/etmsync/memops.c	Sun Nov 29 05:22:41 2015 +0000
+++ b/rvinterf/etmsync/memops.c	Thu Dec 10 04:00:08 2015 +0000
@@ -8,6 +8,7 @@
 #include <string.h>
 #include <strings.h>
 #include "etm.h"
+#include "tm3.h"
 #include "limits.h"
 #include "localtypes.h"
 #include "exitcodes.h"
@@ -95,6 +96,47 @@
 	return(0);
 }
 
+do_memory_read_tm3(memaddr, databuf, nbytes)
+	u32 memaddr;
+	u_char *databuf;
+{
+	u_char cmdpkt[11];
+	int rc;
+
+	if (nbytes > TM3_MEMREAD_MAX) {
+		printf("error: # of bytes to read may not exceed %d\n",
+			TM3_MEMREAD_MAX);
+		return(ERROR_USAGE);
+	}
+	cmdpkt[1] = MEM_READ;
+	cmdpkt[2] = memaddr;
+	cmdpkt[3] = memaddr >> 8;
+	cmdpkt[4] = memaddr >> 16;
+	cmdpkt[5] = memaddr >> 24;
+	cmdpkt[6] = nbytes;
+	cmdpkt[7] = 0;
+	cmdpkt[8] = 0;
+	cmdpkt[9] = 0;
+	rc = etm_pkt_exch(cmdpkt, 9);
+	if (rc)
+		return(rc);
+	if (rvi_msg[3]) {
+		printf("TM3 error response to mem read request: 0x%02X\n",
+			rvi_msg[3]);
+		return(ERROR_TARGET);
+	}
+	if (rvi_msg_len != nbytes + 9) {
+		printf("error: mem read response has wrong length\n");
+		return(ERROR_TARGET);
+	}
+	if (rvi_msg[4] != nbytes || rvi_msg[5] || rvi_msg[6] || rvi_msg[7]) {
+		printf("error: mem read response has wrong length echo\n");
+		return(ERROR_TARGET);
+	}
+	bcopy(rvi_msg + 8, databuf, nbytes);
+	return(0);
+}
+
 do_dieid_read(databuf)
 	u_char *databuf;
 {