[1/3] Fix inferior memory reading in GDBServer for arm/aarch32.

Message ID 20161209120558.GF13661@E107787-LIN
State New, archived
Headers

Commit Message

Yao Qi Dec. 9, 2016, 12:05 p.m. UTC
  On 16-12-01 13:09:56, Antoine Tremblay wrote:
> 
> After some more thought, it can happen even with current code too that
> single step breakpoints are installed without a step-over.
> 
> Consider this situation:
> 
> In non-stop:
> 
> the user issues:
> 
> thread 1
> step&
> thread 2
> step&
> thread 3
> step&
> 
> In a similar way as non-stop-fair-events.exp (threads are looping).
> 
> GDBServer:
> 
>  linux_resume is called
>  GDBServer has pending events,
>  threads are not resumed and single-step breakpoint for thread 1 not installed.
> 
>  linux_wait_1 is called with a pending event on thread 2 at pc A
>  GDBServer handles the event and calls proceed_all_lwps
>  This calls proceed_one_lwp and installs single-step breakpoints on all
>  the threads that need one.
> 
>  Now since thread 1 needs to install a single-step breakpoint and is at pc B
>  (different than thread 2), a step-over is not initiated and get_next_pc
>  is called to figure out the next instruction from pc B.
> 
>  However it may just be that thread 3 as a single step breakpoint at pc
>  B. And thus get_next_pc fails.
> 
> This situation is tested with non-stop-fair-events.exp.
> 
> Sorry for the confusion, you can consider only the two last replies as
> valid.

This helps understanding the problem, and helps me recalling one patch
in my tree, but I didn't submit it (I can't remember why).

Single-step breakpoints are installed in proceed_one_lwp for each thread.
GDBserver proceeds two threads for resume_step, as requested by GDB,
and the thread proceeded later may see the single-step breakpoints
installed for the thread proceeded just now.

Please add these explanations to the commit log.
  

Patch

diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index ed9b356..a62904a 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -263,7 +263,7 @@  get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr,
   ULONGEST res;
 
   res = 0;
-  (*the_target->read_memory) (memaddr, (unsigned char *) &res, len);
+  read_inferior_memory (memaddr, (unsigned char *) &res, len);
   return res;
 }