diff rvinterf/tmsh/omr.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children 2159f260ed13
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/tmsh/omr.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,94 @@
+/*
+ * Old-style memory read command
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "pktmux.h"
+#include "limits.h"
+#include "localtypes.h"
+#include "tm3.h"
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+
+static void
+memdump_line(off, inbuf, len)
+	u_char *inbuf;
+{
+	char outbuf[80], *dp;
+	int i, c;
+
+	sprintf(outbuf, "omr %02X:  ", off);
+	dp = index(outbuf, '\0');
+	for (i = 0; i < 16; i++) {
+		if (i < len)
+			sprintf(dp, "%02X ", inbuf[i]);
+		else
+			strcpy(dp, "   ");
+		dp += 3;
+		if (i == 7 || i == 15)
+			*dp++ = ' ';
+	}
+	for (i = 0; i < len; i++) {
+		c = inbuf[i];
+		if (c < ' ' || c > '~')
+			c = '.';
+		*dp++ = c;
+	}
+	*dp = '\0';
+	async_msg_output(outbuf);
+}
+
+void
+handle_omr_response()
+{
+	int off, len;
+
+	if (rvi_msg[3]) {
+		print_etm_pkt_raw("TM3 memread error");
+		return;
+	}
+	if (rvi_msg_len < 10) {
+bad:		print_etm_pkt_raw("omr bad resp");
+		return;
+	}
+	if (rvi_msg[5] || rvi_msg[6] || rvi_msg[7])
+		goto bad;
+	if (rvi_msg_len != rvi_msg[4] + 9)
+		goto bad;
+	for (off = 0; off < rvi_msg[4]; off += len) {
+		len = rvi_msg[4] - off;
+		if (len > 16)
+			len = 16;
+		memdump_line(off, rvi_msg + 8 + off, len);
+	}
+}
+
+void
+cmd_omr(argc, argv)
+	char **argv;
+{
+	u32 addr, size;
+	u_char cmdpkt[11];
+
+	addr = strtoul(argv[1], 0, 16);
+	size = strtoul(argv[2], 0, 16);
+	if (size < 1 || size > TM3_MEMREAD_MAX) {
+		printf("error: count argument outside valid range\n");
+		return;
+	}
+	cmdpkt[1] = MEM_READ;
+	cmdpkt[2] = addr;
+	cmdpkt[3] = addr >> 8;
+	cmdpkt[4] = addr >> 16;
+	cmdpkt[5] = addr >> 24;
+	cmdpkt[6] = size;
+	cmdpkt[7] = 0;
+	cmdpkt[8] = 0;
+	cmdpkt[9] = 0;
+	send_etm_cmd(cmdpkt, 9);
+}