Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: gdb-patches@sourceware.org
Subject: [patch] [ia64] Fix (#2) shadowing of breakpoints [testcase fixup]
Date: Mon, 07 Sep 2009 04:11:00 -0000	[thread overview]
Message-ID: <20090907041040.GA25651@host0.dyn.jankratochvil.net> (raw)
In-Reply-To: <20090905185856.GA16389@host0.dyn.jankratochvil.net>

[ Fixed testcase forgotten former-duplicate test. ]

Hi,

found my previous fix was incomplete:
	[patch] ia64: Fix breakpoints memory shadow
	http://sourceware.org/ml/gdb-patches/2008-10/msg00678.html
	http://sourceware.org/ml/gdb-patches/2008-11/msg00001.html

Hiding of breakpoints in multiple slots of a single bundle could fail with
"set breakpoint always-inserted on":

original code:
0x4000000000000690 <main+16>:   [MII]       st4.rel [r2]=r14
0x4000000000000691 <main+17>:               mov r14=2;;
0x4000000000000692 <main+18>:               nop.i 0x0

displayed code:
0x4000000000000690 <main+16>:   [MII]       st4.rel [r2]=r14
0x4000000000000691 <main+17>:               break.i 0xccccc;;
0x4000000000000692 <main+18>:               nop.i 0x0

The insert breakpoints must read the memory in a both shadowed and unshadowed
way for the two different use cases there.  I think there is no guarantee of
order of restoration of shadow_contents so its content must be always fully
breakpoint-free.

Regression tested on ia64-rhel54-linux-gnu together with the next patch.
Patch has no code changes on non-ia64 arches.

A bit weird VAL error handling is going to be fixed up in the next patch.


Thanks,
Jan


gdb/
2009-09-05  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Fix ia64 shadowing of breakpoints in multiple slots of a single bundle.
	* ia64-tdep.c (ia64_memory_insert_breakpoint): New call
	of make_show_memory_breakpoints_cleanup with parameter 0.  Move the
	reading of SHADOW_CONTENTS to this memory state point of code.

gdb/testsuite/
2009-09-07  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/breakpoint-shadow.exp (Second breakpoint placed): Initialize
	$bpt2address.
	(Second breakpoint address is valid on ia64)
	(ia64 breakpoint in the Second breakpoint bundle): New.

--- gdb/ia64-tdep.c
+++ gdb/ia64-tdep.c
@@ -622,13 +622,28 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
 
   addr &= ~0x0f;
 
+  /* Enable the automatic memory restoration from breakpoints while
+     we read our instruction bundle for the purpose of SHADOW_CONTENTS.
+     Otherwise, we could possibly store into the shadow parts of the adjacent
+     placed breakpoints.  It is due to our SHADOW_CONTENTS overlapping the real
+     breakpoint instruction bits region.  */
+  cleanup = make_show_memory_breakpoints_cleanup (0);
+  val = target_read_memory (addr, bundle, BUNDLE_LEN);
+
+  /* Slot number 2 may skip at most 2 bytes at the beginning.  */
+  bp_tgt->shadow_len = BUNDLE_LEN - 2;
+
+  /* Store the whole bundle, except for the initial skipped bytes by the slot
+     number interpreted as bytes offset in PLACED_ADDRESS.  */
+  memcpy (bp_tgt->shadow_contents, bundle + slotnum, bp_tgt->shadow_len);
+
   /* Disable the automatic memory restoration from breakpoints while
      we read our instruction bundle.  Otherwise, the general restoration
      mechanism kicks in and we would possibly remove parts of the adjacent
      placed breakpoints.  It is due to our SHADOW_CONTENTS overlapping the real
      breakpoint instruction bits region.  */
-  cleanup = make_show_memory_breakpoints_cleanup (1);
-  val = target_read_memory (addr, bundle, BUNDLE_LEN);
+  make_show_memory_breakpoints_cleanup (1);
+  val |= target_read_memory (addr, bundle, BUNDLE_LEN);
 
   /* Check for L type instruction in slot 1, if present then bump up the slot
      number to the slot 2.  */
@@ -636,13 +651,6 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
   if (slotnum == 1 && template_encoding_table[template][slotnum] == L)
     slotnum = 2;
 
-  /* Slot number 2 may skip at most 2 bytes at the beginning.  */
-  bp_tgt->placed_size = bp_tgt->shadow_len = BUNDLE_LEN - 2;
-
-  /* Store the whole bundle, except for the initial skipped bytes by the slot
-     number interpreted as bytes offset in PLACED_ADDRESS.  */
-  memcpy (bp_tgt->shadow_contents, bundle + slotnum, bp_tgt->shadow_len);
-
   /* Breakpoints already present in the code will get deteacted and not get
      reinserted by bp_loc_is_permanent.  Multiple breakpoints at the same
      location cannot induce the internal error as they are optimized into
@@ -654,6 +662,8 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
 		    paddress (gdbarch, bp_tgt->placed_address));
   replace_slotN_contents (bundle, IA64_BREAKPOINT, slotnum);
 
+  bp_tgt->placed_size = bp_tgt->shadow_len;
+
   if (val == 0)
     val = target_write_memory (addr + slotnum, bundle + slotnum,
 			       bp_tgt->shadow_len);
--- gdb/testsuite/gdb.base/breakpoint-shadow.exp
+++ gdb/testsuite/gdb.base/breakpoint-shadow.exp
@@ -48,7 +48,26 @@ gdb_test_multiple "disass main" $test {
 }
 
 gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
-gdb_test "b [gdb_get_line_number "break-second"]" "Breakpoint \[0-9\] at .*" "Second breakpoint placed"
+set test "Second breakpoint placed"
+gdb_test_multiple "b [gdb_get_line_number "break-second"]" $test {
+    -re "Breakpoint \[0-9\] at (0x\[0-9a-f\]*):.*" {
+	pass $test
+	set bpt2address $expect_out(1,string)
+    }
+}
+
+if [istarget "ia64-*-*"] then {
+    # Unoptimized code should not use the 3rd slot for the first instruction of
+    # a source line.
+    set test "Second breakpoint address is valid on ia64"
+    if [string match "*\[01\]" $bpt2address] {
+	pass $test
+
+	gdb_test "b *($bpt2address + 1)" "Breakpoint \[0-9\] at .*" "ia64 breakpoint in the Second breakpoint bundle"
+    } else {
+	unresolved $test
+    }
+}
 
 set test "disassembly with breakpoints"
 gdb_test_multiple "disass main" $test {


  reply	other threads:[~2009-09-07  4:11 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-05 18:59 [patch] [ia64] Fix (#2) shadowing of breakpoints Jan Kratochvil
2009-09-07  4:11 ` Jan Kratochvil [this message]
2009-09-07 18:18   ` [patch] [ia64] Fix (#2) shadowing of breakpoints [testcase fixup] Joel Brobecker
2009-09-08 17:44     ` Jan Kratochvil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090907041040.GA25651@host0.dyn.jankratochvil.net \
    --to=jan.kratochvil@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox