FreeCalypso > hg > freecalypso-tools
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 } |