From b778b36f29b74d6d571df85f984ae684672ea162 Mon Sep 17 00:00:00 2001 From: Michel Jaouen Date: Tue, 19 Apr 2011 08:43:33 +0200 Subject: smp : infra for smp minimum support --- src/server/gdb_server.c | 52 +++++++++++++++++++++++++++++++++++++++++++++---- src/server/gdb_server.h | 6 +----- 2 files changed, 49 insertions(+), 9 deletions(-) (limited to 'src/server') diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 0b808589..aeb4e2e8 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -11,6 +11,9 @@ * Copyright (C) 2011 by Broadcom Corporation * * Evan Hunter - ehunter@broadcom.com * * * + * Copyright (C) ST-Ericsson SA 2011 * + * michel.jaouen@stericsson.com : smp minimum support * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -39,6 +42,7 @@ #include #include #include "rtos/rtos.h" +#include "target/smp.h" /** @@ -62,7 +66,7 @@ struct gdb_connection int closed; int busy; int noack_mode; - bool sync; /* set flag to true if you want the next stepi to return immediately. + bool sync; /* set flag to true if you want the next stepi to return immediately. allowing GDB to pick up a fresh set of register values from the target without modifying the target state. */ /* We delay reporting memory write errors until next step/continue or memory @@ -2360,6 +2364,24 @@ static int gdb_input_inner(struct connection *connection) "ocd_gdb_restart %s", target_name(target)); break; + + case 'j': + /* packet supported only by smp target i.e cortex_a.c*/ + /* handle smp packet replying coreid played to gbd */ + gdb_read_smp_packet( + connection, target, + packet, packet_size); + break; + + case 'J': + /* packet supported only by smp target i.e cortex_a.c */ + /* handle smp packet setting coreid to be played at next + * resume to gdb */ + gdb_write_smp_packet( + connection, target, + packet, packet_size); + break; + default: /* ignore unknown packets */ LOG_DEBUG("ignoring 0x%2.2x packet", packet[0]); @@ -2411,21 +2433,43 @@ static int gdb_input(struct connection *connection) static int gdb_target_start(struct target *target, const char *port) { - struct gdb_service *gdb_service = malloc(sizeof(struct gdb_service)); + + struct gdb_service *gdb_service; + int ret; + gdb_service = malloc(sizeof(struct gdb_service)); + if (NULL == gdb_service) return -ENOMEM; gdb_service->target = target; + gdb_service->core[0] = -1; + gdb_service->core[1] = -1; + target->gdb_service = gdb_service; - return add_service("gdb", + ret = add_service("gdb", port, 1, &gdb_new_connection, &gdb_input, &gdb_connection_closed, gdb_service); + /* initialialize all targets gdb service with the same pointer */ + { + struct target_list *head; + struct target *curr; + head = target->head; + while(head != (struct target_list*)NULL) + { + curr = head->target; + if (curr != target) curr->gdb_service = gdb_service; + head = head->next; + } + } + return ret; } static int gdb_target_add_one(struct target *target) { + /* one gdb instance per smp list */ + if ((target->smp) && (target->gdb_service)) return ERROR_OK; int retval = gdb_target_start(target, gdb_port_next); - if (retval == ERROR_OK) + if (retval == ERROR_OK) { long portnumber; /* If we can parse the port number diff --git a/src/server/gdb_server.h b/src/server/gdb_server.h index cb3962ff..e393fb72 100644 --- a/src/server/gdb_server.h +++ b/src/server/gdb_server.h @@ -30,15 +30,11 @@ #define GDB_SERVER_H struct image; +struct reg; #include #define GDB_BUFFER_SIZE 16384 -struct gdb_service -{ - struct target *target; -}; - int gdb_target_add_all(struct target *target); int gdb_register_commands(struct command_context *command_context); -- cgit v1.2.3