comparison rvinterf/etmsync/memops.c @ 911:42719fa3e6af

etmsync: memory read implemented
author Space Falcon <falcon@ivan.Harhan.ORG>
date Tue, 08 Sep 2015 07:52:29 +0000
parents
children f50c71442d50
comparison
equal deleted inserted replaced
910:d1333db6385f 911:42719fa3e6af
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 "limits.h"
12 #include "localtypes.h"
13 #include "exitcodes.h"
14
15 extern u_char rvi_msg[];
16 extern int rvi_msg_len;
17
18 do_memory_read(memaddr, databuf, nbytes)
19 u32 memaddr;
20 u_char *databuf;
21 {
22 u_char cmdpkt[10];
23 int rc;
24
25 if (nbytes > MAX_MEMREAD_BYTES) {
26 printf("error: # of bytes to read may not exceed %d\n",
27 MAX_MEMREAD_BYTES);
28 return(ERROR_USAGE);
29 }
30 cmdpkt[1] = ETM_CORE;
31 cmdpkt[2] = TMCORE_OPC_MEM;
32 cmdpkt[3] = 0x01;
33 cmdpkt[4] = nbytes;
34 cmdpkt[5] = memaddr;
35 cmdpkt[6] = memaddr >> 8;
36 cmdpkt[7] = memaddr >> 16;
37 cmdpkt[8] = memaddr >> 24;
38 rc = etm_pkt_exch(cmdpkt, 8);
39 if (rc)
40 return(rc);
41 if (rvi_msg[3]) {
42 printf("ETM error response to mem read request: 0x%02X\n",
43 rvi_msg[3]);
44 return(ERROR_TARGET);
45 }
46 if (rvi_msg_len != nbytes + 7) {
47 printf("error: mem read response has wrong length\n");
48 return(ERROR_TARGET);
49 }
50 if (rvi_msg[4] != TMCORE_OPC_MEM || rvi_msg[5] != 0x01) {
51 printf("error: mem read response has wrong opcode\n");
52 return(ERROR_TARGET);
53 }
54 bcopy(rvi_msg + 6, databuf, nbytes);
55 return(0);
56 }