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
Branch: 	gdb_7_6-branch
Changes by:	sergiodj@sourceware.org	2013-04-25 12:22:26

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-25  Andrew Haley  <aph@redhat.com>
	
	* arm-tdep.c (BranchDest): Cast result as "unsigned long",
	instead of "long".
	
	gdb/testsuite/ChangeLog:
	
	2013-04-25  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&only_with_tag=gdb_7_6-branch&r1=1.15260.2.45&r2=1.15260.2.46
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/arm-tdep.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.377&r2=1.377.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=1.3580.2.18&r2=1.3580.2.19
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.arch/arm-bl-branch-dest.c.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=NONE&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.arch/arm-bl-branch-dest.exp.diff?cvsroot=src&only_with_tag=gdb_7_6-branch&r1=NONE&r2=1.2.2.2


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