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]

src/gdb ChangeLog arm-tdep.c testsuite/ChangeL ...


CVSROOT:	/cvs/src
Module name:	src
Changes by:	sergiodj@sourceware.org	2013-04-22 09:20:33

Modified files:
	gdb            : ChangeLog arm-tdep.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.arch: arm-bl-branch-dest.c 
	                        arm-bl-branch-dest.exp 

Log message:
	Andrew Haley found a bug on GDB running on ARM when using
	--enable-64-bit-bfd.  Basically the issue happens when dealing with "bl"
	instructions: GDB does branch destination calculation and (wrongly)
	sign-extends the PC.  Here is a piece of his original message explaining
	the problem:
	
	>      next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
	>
	>      /* The Linux kernel offers some user-mode helpers in a high page.  We can
	>         not read this page (as of 2.6.23), and even if we could then we couldn't
	>         set breakpoints in it, and even if we could then the atomic operations
	>         would fail when interrupted.  They are all called as functions and return
	>         to the address in LR, so step to there instead.  */
	>      if (next_pc > 0xffff0000)
	>        next_pc = get_frame_register_unsigned (frame, ARM_LR_REGNUM);
	>
	>      arm_insert_single_step_breakpoint (gdbarch, aspace, next_pc);
	>
	>    Unfortunately, branch destination addresses are SIGN EXTENDED to 64
	>    bits.  So,
	>
	>    (top-gdb) p/x next_pc
	>    $14 = 0xffffffffb6df2864
	>
	>    Which triggers the next_pc = get_frame_register_unsigned(), and we
	>    cannot step into any branches because the destination PC is wrong.
	
	Anyway, the fix is simple and Andrew himself provided it for us.  It
	took a while for me to figure out how to trigger the bug (in order to
	write a testcase for it), but I finally made it.
	
	The attached patch fixes the problem (by casting to `unsigned long'
	instead of just `long'), and also includes a testcase to reproduce the
	issue.
	
	gdb/ChangeLog:
	
	2013-04-22  Andrew Haley  <aph@redhat.com>
	
	* arm-tdep.c (BranchDest): Cast result as "unsigned long",
	instead of "long".
	
	gdb/testsuite/ChangeLog:
	
	2013-04-22  Sergio Durigan Junior  <sergiodj@redhat.com>
	
	* gdb.arch/arm-bl-branch-dest.c: New file.
	* gdb.arch/arm-bl-branch-dest.exp: Likewise.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.15462&r2=1.15463
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/arm-tdep.c.diff?cvsroot=src&r1=1.379&r2=1.380
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3631&r2=1.3632
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.arch/arm-bl-branch-dest.c.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.arch/arm-bl-branch-dest.exp.diff?cvsroot=src&r1=NONE&r2=1.1


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