summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Ristovski <aristovski@qnx.com>2015-10-21 10:37:33 -0400
committerAleksandar Ristovski <aristovski@qnx.com>2015-10-21 10:37:33 -0400
commita9889169e5b21efb8c42105fc62461be43968d64 (patch)
treed269afcd6d625ac1df1f9786992e42f029063bb4
parent2b35fb28f397a26c0da03f7579116d28af2af824 (diff)
downloadbinutils-gdb-a9889169e5b21efb8c42105fc62461be43968d64.tar.gz
[nto] Fix nto target stopped by watchpoint.
Fix 'stopped by watchpoint' detection: add inferior data, use inferior data for storing last stopped flags needed for detection. gdb/ChangeLog: * nto-procfs.c (procfs_wait): Set stopped_flags nad stopped_pc. (procfs_stopped_by_watchpoint): Use flags stored in inferior data. * nto-tdep.c (nto_new_inferior_data_reg): New definition. (nto_new_inferior_data, nto_inferior_data_cleanup, nto_inferior_data): New functions. (_initialize_nto_tdep): New forward declaration, new function. * nto-tdep.h (struct nto_inferior_data): New struct. (nto_inferior_data): New function declaration.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/nto-procfs.c21
-rw-r--r--gdb/nto-tdep.c52
-rw-r--r--gdb/nto-tdep.h13
4 files changed, 96 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e54695046c6..277a0ceadd7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+2015-10-21 Aleksandar Ristovski <aristovski@qnx.com>
+
+ * nto-procfs.c (procfs_wait): Set stopped_flags nad stopped_pc.
+ (procfs_stopped_by_watchpoint): Use flags stored in inferior data.
+ * nto-tdep.c (nto_new_inferior_data_reg): New definition.
+ (nto_new_inferior_data, nto_inferior_data_cleanup, nto_inferior_data):
+ New functions.
+ (_initialize_nto_tdep): New forward declaration, new function.
+ * nto-tdep.h (struct nto_inferior_data): New struct.
+ (nto_inferior_data): New function declaration.
+
2015-10-20 Jan Kratochvil <jan.kratochvil@redhat.com>
* findvar.c (address_from_register): Check REGNUM validity.
diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c
index 82b428c0783..6ab78e35b0a 100644
--- a/gdb/nto-procfs.c
+++ b/gdb/nto-procfs.c
@@ -784,6 +784,9 @@ procfs_wait (struct target_ops *ops,
devctl (ctl_fd, DCMD_PROC_STATUS, &status, sizeof (status), 0);
}
+ nto_inferior_data (NULL)->stopped_flags = status.flags;
+ nto_inferior_data (NULL)->stopped_pc = status.ip;
+
if (status.flags & _DEBUG_FLAG_SSTEP)
{
ourstatus->kind = TARGET_WAITKIND_STOPPED;
@@ -1626,5 +1629,21 @@ procfs_insert_hw_watchpoint (struct target_ops *self,
static int
procfs_stopped_by_watchpoint (struct target_ops *ops)
{
- return 0;
+ /* NOTE: nto_stopped_by_watchpoint will be called ONLY while we are
+ stopped due to a SIGTRAP. This assumes gdb works in 'all-stop' mode;
+ future gdb versions will likely run in 'non-stop' mode in which case
+ we will have to store/examine statuses per thread in question.
+ Until then, this will work fine. */
+
+ struct inferior *inf = current_inferior ();
+ struct nto_inferior_data *inf_data;
+
+ gdb_assert (inf != NULL);
+
+ inf_data = nto_inferior_data (inf);
+
+ return inf_data->stopped_flags
+ & (_DEBUG_FLAG_TRACE_RD
+ | _DEBUG_FLAG_TRACE_WR
+ | _DEBUG_FLAG_TRACE_MODIFY);
}
diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c
index 62eb88afdb2..e50d3021972 100644
--- a/gdb/nto-tdep.c
+++ b/gdb/nto-tdep.c
@@ -46,6 +46,8 @@ static char default_nto_target[] = "";
struct nto_target_ops current_nto_target;
+static const struct inferior_data *nto_inferior_data_reg;
+
static char *
nto_target (void)
{
@@ -477,3 +479,53 @@ nto_read_auxv_from_initial_stack (CORE_ADDR initial_stack, gdb_byte *readbuf,
}
return len_read;
}
+
+/* Allocate new nto_inferior_data object. */
+
+static struct nto_inferior_data *
+nto_new_inferior_data (void)
+{
+ struct nto_inferior_data *const inf_data
+ = XCNEW (struct nto_inferior_data);
+
+ return inf_data;
+}
+
+/* Free inferior data. */
+
+static void
+nto_inferior_data_cleanup (struct inferior *const inf, void *const dat)
+{
+ xfree (dat);
+}
+
+/* Return nto_inferior_data for the given INFERIOR. If not yet created,
+ construct it. */
+
+struct nto_inferior_data *
+nto_inferior_data (struct inferior *const inferior)
+{
+ struct inferior *const inf = inferior ? inferior : current_inferior ();
+ struct nto_inferior_data *inf_data;
+
+ gdb_assert (inf != NULL);
+
+ inf_data = inferior_data (inf, nto_inferior_data_reg);
+ if (inf_data == NULL)
+ {
+ set_inferior_data (inf, nto_inferior_data_reg,
+ (inf_data = nto_new_inferior_data ()));
+ }
+
+ return inf_data;
+}
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_nto_tdep;
+
+void
+_initialize_nto_tdep (void)
+{
+ nto_inferior_data_reg
+ = register_inferior_data_with_cleanup (NULL, nto_inferior_data_cleanup);
+}
diff --git a/gdb/nto-tdep.h b/gdb/nto-tdep.h
index d029f073ddd..6ed9da0c2ce 100644
--- a/gdb/nto-tdep.h
+++ b/gdb/nto-tdep.h
@@ -142,6 +142,16 @@ struct private_thread_info
char name[1];
};
+/* Per-inferior data, common for both procfs and remote. */
+struct nto_inferior_data
+{
+ /* Last stopped flags result from wait function */
+ unsigned int stopped_flags;
+
+ /* Last known stopped PC */
+ CORE_ADDR stopped_pc;
+};
+
/* Generic functions in nto-tdep.c. */
void nto_init_solib_absolute_prefix (void);
@@ -171,4 +181,7 @@ char *nto_extra_thread_info (struct target_ops *self, struct thread_info *);
LONGEST nto_read_auxv_from_initial_stack (CORE_ADDR inital_stack,
gdb_byte *readbuf,
LONGEST len, size_t sizeof_auxv_t);
+
+struct nto_inferior_data *nto_inferior_data (struct inferior *inf);
+
#endif