remove target argument from gdb packet handling functions
[fw/openocd] / src / target / smp.c
1 /***************************************************************************
2  *                                                                         *
3  * Copyright (C) ST-Ericsson SA 2011                                       *
4  * Author: Michel Jaouen <michel.jaouen@stericsson.com> for ST-Ericsson.   *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "server/server.h"
25 #include <helper/types.h>
26
27 #include "target/target.h"
28
29 #include "server/gdb_server.h"
30 #include "smp.h"
31
32
33 /*  implementation of new packet in gdb interface for smp feature          */
34 /*                                                                         */
35 /*   j : smp  status request                                               */
36 /*   J : smp  set request                                                  */
37 /*                                                                         */
38 /*   jc :read core id displayed by gdb connection                          */
39 /*   reply XXXXXXXX core id is int32_t , 8 hex digits                      */
40 /*                                                                         */
41 /*   Reply ENN error not supported (target not smp)                        */
42 /*                                                                         */
43 /*   JcXX  set core id displayed at next gdb continue                      */
44 /*   maximum 8 bytes described core id int32_t (8 hex digits)              */
45 /*  (core id -1 , reserved for returning to normal continue mode) */
46 /*  Reply ENN error not supported(target not smp,core id out of range)     */
47 /*  Reply OK : for success                                                 */
48 /*                                                                         */
49 /*  handling of this packet within gdb can be done by the creation         */
50 /*  internal variable by mean of function allocate_computed_value          */
51 /*  set $_core 1 => Jc01 packet is sent                                    */
52 /*  print $_core => jc packet is sent and result is affected in $          */
53 /*  Another way to test this packet is the usage of maintenance packet     */
54 /*  maint packet Jc01                                                      */
55 /*  maint packet jc                                                        */
56                                                 
57 static const char DIGITS[16] = "0123456789abcdef";
58
59
60 /* packet j :smp status request */
61 int gdb_read_smp_packet(struct connection *connection,
62                 char *packet, int packet_size)
63 {
64         struct target *target = get_target_from_connection(connection);
65         uint32_t len = sizeof(int32_t);
66         uint8_t *buffer;
67         char *hex_buffer;
68         int retval = ERROR_OK;
69         if (target->smp)
70         {
71                 if (strstr(packet, "jc"))
72                 {
73                         hex_buffer = malloc(len * 2 + 1);
74                         buffer = (uint8_t *)&target->gdb_service->core[0];
75                         uint32_t i;
76                         for (i = 0; i < 4; i++)
77                         {
78                                 uint8_t t = buffer[i];
79                                 hex_buffer[2 * i] = DIGITS[(t >> 4) & 0xf];
80                                 hex_buffer[2 * i + 1] = DIGITS[t & 0xf];
81                         }
82
83                         retval = gdb_put_packet(connection, hex_buffer, len * 2);
84
85                         free(hex_buffer);
86                 }
87         }
88         else
89                 retval = gdb_put_packet(connection,"E01",3);
90         return retval;
91 }
92
93 /* J :  smp set request */
94 int gdb_write_smp_packet(struct connection *connection,
95                 char *packet, int packet_size)
96 {
97         struct target *target = get_target_from_connection(connection);
98         char *separator;
99         int coreid = 0;
100         int retval = ERROR_OK;
101
102         /* skip command character */
103         if (target->smp)
104         {
105                 if (strstr(packet, "Jc"))
106                 {
107                         packet+=2;
108                         coreid = strtoul(packet, &separator, 16);
109                         target->gdb_service->core[1] = coreid;
110                         retval = gdb_put_packet(connection, "OK", 2);
111                 }
112         }
113         else
114         {
115                 retval = gdb_put_packet(connection,"E01",3);
116         }
117
118         return retval;
119 }