summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorMichel Jaouen <michel.jaouen@stericsson.com>2011-04-19 08:43:33 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-04-28 12:22:10 +0200
commitb778b36f29b74d6d571df85f984ae684672ea162 (patch)
tree774bc2d5f73daa527a6131b0fcb6351f4eb0812f /src/server
parent36d60ee6c8d3aa1865dac2378c481954ba402910 (diff)
downloadopenocd+libswd-b778b36f29b74d6d571df85f984ae684672ea162.tar.gz
openocd+libswd-b778b36f29b74d6d571df85f984ae684672ea162.tar.bz2
openocd+libswd-b778b36f29b74d6d571df85f984ae684672ea162.tar.xz
openocd+libswd-b778b36f29b74d6d571df85f984ae684672ea162.zip
smp : infra for smp minimum support
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c52
-rw-r--r--src/server/gdb_server.h6
2 files changed, 49 insertions, 9 deletions
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 <target/image.h>
#include <jtag/jtag.h>
#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 <target/target.h>
#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);