comparison rvinterf/etmsync/memops.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
comparison
equal deleted inserted replaced
-1:000000000000 0:e7502631a0f9
1 /*
2 * Functions for reading memory regions and Calypso die ID via ETM
3 */
4
5 #include <sys/types.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <strings.h>
10 #include "etm.h"
11 #include "tm3.h"
12 #include "limits.h"
13 #include "localtypes.h"
14 #include "exitcodes.h"
15
16 extern u_char rvi_msg[];
17 extern int rvi_msg_len;
18
19 do_memory_read(memaddr, databuf, nbytes)
20 u32 memaddr;
21 u_char *databuf;
22 {
23 u_char cmdpkt[10];
24 int rc;
25
26 if (nbytes > MAX_MEMREAD_BYTES) {
27 printf("error: # of bytes to read may not exceed %d\n",
28 MAX_MEMREAD_BYTES);
29 return(ERROR_USAGE);
30 }
31 cmdpkt[1] = ETM_CORE;
32 cmdpkt[2] = TMCORE_OPC_MEM;
33 cmdpkt[3] = 0x01;
34 cmdpkt[4] = nbytes;
35 cmdpkt[5] = memaddr;
36 cmdpkt[6] = memaddr >> 8;
37 cmdpkt[7] = memaddr >> 16;
38 cmdpkt[8] = memaddr >> 24;
39 rc = etm_pkt_exch(cmdpkt, 8);
40 if (rc)
41 return(rc);
42 if (rvi_msg[3]) {
43 printf("ETM error response to mem read request: 0x%02X\n",
44 rvi_msg[3]);
45 return(ERROR_TARGET);
46 }
47 if (rvi_msg_len != nbytes + 7) {
48 printf("error: mem read response has wrong length\n");
49 return(ERROR_TARGET);
50 }
51 if (rvi_msg[4] != TMCORE_OPC_MEM || rvi_msg[5] != 0x01) {
52 printf("error: mem read response has wrong opcode\n");
53 return(ERROR_TARGET);
54 }
55 bcopy(rvi_msg + 6, databuf, nbytes);
56 return(0);
57 }
58
59 do_memory_read_16(memaddr, databuf, nwords)
60 u32 memaddr;
61 u_char *databuf;
62 {
63 u_char cmdpkt[10];
64 int rc;
65
66 if (nwords > MAX_MEMREAD_16BIT) {
67 printf("error: # of 16-bit words to read may not exceed %d\n",
68 MAX_MEMREAD_16BIT);
69 return(ERROR_USAGE);
70 }
71 cmdpkt[1] = ETM_CORE;
72 cmdpkt[2] = TMCORE_OPC_MEM;
73 cmdpkt[3] = 0x02;
74 cmdpkt[4] = nwords;
75 cmdpkt[5] = memaddr;
76 cmdpkt[6] = memaddr >> 8;
77 cmdpkt[7] = memaddr >> 16;
78 cmdpkt[8] = memaddr >> 24;
79 rc = etm_pkt_exch(cmdpkt, 8);
80 if (rc)
81 return(rc);
82 if (rvi_msg[3]) {
83 printf("ETM error response to mem read 16 request: 0x%02X\n",
84 rvi_msg[3]);
85 return(ERROR_TARGET);
86 }
87 if (rvi_msg_len != nwords * 2 + 7) {
88 printf("error: mem read 16 response has wrong length\n");
89 return(ERROR_TARGET);
90 }
91 if (rvi_msg[4] != TMCORE_OPC_MEM || rvi_msg[5] != 0x02) {
92 printf("error: mem read 16 response has wrong opcode\n");
93 return(ERROR_TARGET);
94 }
95 bcopy(rvi_msg + 6, databuf, nwords * 2);
96 return(0);
97 }
98
99 do_memory_read_tm3(memaddr, databuf, nbytes)
100 u32 memaddr;
101 u_char *databuf;
102 {
103 u_char cmdpkt[11];
104 int rc;
105
106 if (nbytes > TM3_MEMREAD_MAX) {
107 printf("error: # of bytes to read may not exceed %d\n",
108 TM3_MEMREAD_MAX);
109 return(ERROR_USAGE);
110 }
111 cmdpkt[1] = MEM_READ;
112 cmdpkt[2] = memaddr;
113 cmdpkt[3] = memaddr >> 8;
114 cmdpkt[4] = memaddr >> 16;
115 cmdpkt[5] = memaddr >> 24;
116 cmdpkt[6] = nbytes;
117 cmdpkt[7] = 0;
118 cmdpkt[8] = 0;
119 cmdpkt[9] = 0;
120 rc = etm_pkt_exch(cmdpkt, 9);
121 if (rc)
122 return(rc);
123 if (rvi_msg[3]) {
124 printf("TM3 error response to mem read request: 0x%02X\n",
125 rvi_msg[3]);
126 return(ERROR_TARGET);
127 }
128 if (rvi_msg_len != nbytes + 9) {
129 printf("error: mem read response has wrong length\n");
130 return(ERROR_TARGET);
131 }
132 if (rvi_msg[4] != nbytes || rvi_msg[5] || rvi_msg[6] || rvi_msg[7]) {
133 printf("error: mem read response has wrong length echo\n");
134 return(ERROR_TARGET);
135 }
136 bcopy(rvi_msg + 8, databuf, nbytes);
137 return(0);
138 }
139
140 do_dieid_read(databuf)
141 u_char *databuf;
142 {
143 u_char cmdpkt[4];
144 int rc;
145
146 cmdpkt[1] = ETM_CORE;
147 cmdpkt[2] = TMCORE_OPC_DIEID;
148 rc = etm_pkt_exch(cmdpkt, 2);
149 if (rc)
150 return(rc);
151 if (rvi_msg[3]) {
152 printf("ETM error response to die ID read request: 0x%02X\n",
153 rvi_msg[3]);
154 return(ERROR_TARGET);
155 }
156 if (rvi_msg_len != 14) {
157 printf("error: die ID read response has wrong length\n");
158 return(ERROR_TARGET);
159 }
160 if (rvi_msg[4] != TMCORE_OPC_DIEID) {
161 printf("error: die ID read response has wrong opcode\n");
162 return(ERROR_TARGET);
163 }
164 bcopy(rvi_msg + 5, databuf, 8);
165 return(0);
166 }