[1/2,nto] Fix nto target stopped by watchpoint.

Message ID 1445364649-12175-2-git-send-email-aristovski@qnx.com
State New, archived
Headers

Commit Message

Aleksandar Ristovski Oct. 20, 2015, 6:10 p.m. UTC
  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.
---
 gdb/nto-procfs.c | 21 ++++++++++++++++++++-
 gdb/nto-tdep.c   | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/nto-tdep.h   | 13 +++++++++++++
 3 files changed, 85 insertions(+), 1 deletion(-)
  

Comments

Pedro Alves Oct. 21, 2015, 9:28 a.m. UTC | #1
On 10/20/2015 07:10 PM, Aleksandar Ristovski wrote:
> Fix 'stopped by watchpoint' detection: add inferior data, use inferior data
> for storing last stopped flags needed for detection.
> 

OK.

Thanks,
Pedro Alves
  
Aleksandar Ristovski Oct. 21, 2015, 2:41 p.m. UTC | #2
On 15-10-21 05:28 AM, Pedro Alves wrote:
> On 10/20/2015 07:10 PM, Aleksandar Ristovski wrote:
>> Fix 'stopped by watchpoint' detection: add inferior data, use inferior data
>> for storing last stopped flags needed for detection.
>>
> 
> OK.
> 
> Thanks,
> Pedro Alves
> 
> 

Pushed a9889169e5b21efb8c42105fc62461be43968d64

Thank you,

Aleksandar Ristovski
  

Patch

diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c
index 82b428c..6ab78e3 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 62eb88a..e50d302 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 d029f07..6ed9da0 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