This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gdb and binutils branch master updated. 0d5ed1535229b7069757e04766f70a02fa60821c


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, master has been updated
       via  0d5ed1535229b7069757e04766f70a02fa60821c (commit)
      from  3e87153251d9a117182decbe57dd7d9d2a47c2b3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0d5ed1535229b7069757e04766f70a02fa60821c

commit 0d5ed1535229b7069757e04766f70a02fa60821c
Author: Maciej W. Rozycki <macro@codesourcery.com>
Date:   Fri Oct 3 12:44:58 2014 +0100

    Avoid software breakpoint's instruction shadow inconsistency
    
    This change:
    
    commit b775012e845380ed4c7421a1b87caf7bfae39f5f
    Author: Luis Machado <luisgpm@br.ibm.com>
    Date:   Fri Feb 24 15:10:59 2012 +0000
    
        2012-02-24  Luis Machado  <lgustavo@codesourcery.com>
    
    	* remote.c (remote_supports_cond_breakpoints): New forward
    	declaration.
    [...]
    
    changed the way breakpoints are inserted and removed such that
    `insert_bp_location' can now be called with the breakpoint being handled
    already in place, while previously the call was only ever made for
    breakpoints that have not been put in place.  This in turn caused an
    issue for software breakpoints and targets for which a breakpoint's
    `placed_address' may not be the same as the original requested address.
    
    The issue is `insert_bp_location' overwrites the previously adjusted
    value in `placed_address' with the original address, that is only
    replaced back with the correct adjusted address later on when
    `gdbarch_breakpoint_from_pc' is called.  Meanwhile there's a window
    where the value in `placed_address' does not correspond to data stored
    in `shadow_contents', leading to incorrect instruction bytes being
    supplied when `one_breakpoint_xfer_memory' is called to supply the
    instruction overlaid by the breakpoint.
    
    And this is exactly what happens on the MIPS target with software
    breakpoints placed in microMIPS code.  In this case not only
    `placed_address' is not the original address because of the ISA bit, but
    `mips_breakpoint_from_pc' has to read the original instruction to
    determine which one of the two software breakpoint instruction encodings
    to choose as well.  The 16-bit encoding is used to replace 16-bit
    instructions and similarly the 32-bit one is used with 32-bit
    instructions, to satisfy branch delay slot size requirements.
    
    The mismatch between `placed_address' and the address data in
    `shadow_contents' has been obtained from leads to the wrong encoding
    being used in some cases, which in the case of a 32-bit software
    breakpoint instruction replacing a 16-bit instruction causes corruption
    to the adjacent following instruction and leads the debug session astray
    if execution reaches there e.g. with a jump.
    
    To address this problem I made the change below, that adds a
    `reqstd_address' field to `struct bp_target_info' and leaves
    `placed_address' unchanged once it has been set.  This ensures data in
    `shadow_contents' is always consistent with `placed_address'.
    
    This approach also has this good side effect that all the places that
    examine the breakpoint's address see a consistent value, either
    `reqstd_address' or `placed_address', as required.  Currently some
    places see either the original or the adjusted address in
    `placed_address', depending on whether they have been called before
    `gdbarch_remote_breakpoint_from_pc' or afterwards.  This is in
    particular true for subsequent calls to
    `gdbarch_remote_breakpoint_from_pc' itself, e.g. from
    `one_breakpoint_xfer_memory'.  This is also important for places like
    `find_single_step_breakpoint' where a breakpoint's address is compared
    to the raw value of $pc.
    
    	* breakpoint.h (bp_target_info): Add `reqstd_address' member,
    	update comments.
    	* breakpoint.c (one_breakpoint_xfer_memory): Use `reqstd_address'
    	for the breakpoint's address.  Don't preinitialize `placed_size'.
    	(insert_bp_location): Set `reqstd_address' rather than
    	`placed_address'.
    	(bp_target_info_copy_insertion_state): Also copy `placed_address'.
    	(bkpt_insert_location): Use `reqstd_address' for the breakpoint's
    	address.
    	(bkpt_remove_location): Likewise.
    	(deprecated_insert_raw_breakpoint): Likewise.
    	(deprecated_remove_raw_breakpoint): Likewise.
    	(find_single_step_breakpoint): Likewise.
    	* mem-break.c (default_memory_insert_breakpoint): Use
    	`reqstd_address' for the breakpoint's address.  Don't set
    	`placed_address' or `placed_size' if breakpoint contents couldn't
    	have been determined.
    	* remote.c (remote_insert_breakpoint): Use `reqstd_address' for
    	the breakpoint's address.
    	(remote_insert_hw_breakpoint): Likewise.  Don't set
    	`placed_address' or `placed_size' if breakpoint couldn't have been
    	set.
    	* aarch64-linux-nat.c (aarch64_linux_insert_hw_breakpoint): Use
    	`reqstd_address' for the breakpoint's address.
    	* arm-linux-nat.c (arm_linux_hw_breakpoint_initialize): Likewise.
    	* ia64-tdep.c (ia64_memory_insert_breakpoint): Likewise.
    	* m32r-tdep.c (m32r_memory_insert_breakpoint): Likewise.
    	* microblaze-linux-tdep.c
    	(microblaze_linux_memory_remove_breakpoint): Likewise.
    	* monitor.c (monitor_insert_breakpoint): Likewise.
    	* nto-procfs.c (procfs_insert_breakpoint): Likewise.
    	(procfs_insert_hw_breakpoint): Likewise.
    	* ppc-linux-nat.c (ppc_linux_insert_hw_breakpoint): Likewise.
    	* ppc-linux-tdep.c (ppc_linux_memory_remove_breakpoint): Likewise.
    	* remote-m32r-sdi.c (m32r_insert_breakpoint): Likewise.
    	* remote-mips.c (mips_insert_breakpoint): Likewise.
    	* x86-nat.c (x86_insert_hw_breakpoint): Likewise.

-----------------------------------------------------------------------

Summary of changes:
 gdb/ChangeLog               |   40 ++++++++++++++++++++++++++++++++++++++++
 gdb/aarch64-linux-nat.c     |    4 ++--
 gdb/arm-linux-nat.c         |    2 +-
 gdb/breakpoint.c            |   23 ++++++++++++-----------
 gdb/breakpoint.h            |   13 ++++++++-----
 gdb/ia64-tdep.c             |    2 +-
 gdb/m32r-tdep.c             |    2 +-
 gdb/mem-break.c             |   22 ++++++++++++----------
 gdb/microblaze-linux-tdep.c |    2 +-
 gdb/monitor.c               |    2 +-
 gdb/nto-procfs.c            |    2 ++
 gdb/ppc-linux-nat.c         |    2 +-
 gdb/ppc-linux-tdep.c        |    2 +-
 gdb/remote-m32r-sdi.c       |    2 +-
 gdb/remote-mips.c           |    7 +++++--
 gdb/remote.c                |   14 ++++++++------
 gdb/x86-nat.c               |    3 ++-
 17 files changed, 99 insertions(+), 45 deletions(-)


hooks/post-receive
-- 
gdb and binutils


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]