OSDN Git Service

Handle breakpoints on L instruction type in MLX instruction bundle by
authorpetrs <petrs>
Fri, 10 May 2002 16:08:22 +0000 (16:08 +0000)
committerpetrs <petrs>
Fri, 10 May 2002 16:08:22 +0000 (16:08 +0000)
moving the breakpoint to the third slot (X instruction type) as L holds
only data.

gdb/ChangeLog
gdb/ia64-tdep.c

index a238023..b5cd55f 100644 (file)
@@ -1,3 +1,9 @@
+2002-05-10  Petr Sorfa  <petrs@caldera.com>
+
+       * ia64-tdep.c: Handle breakpoints on L instruction type
+       in MLX instruction bundle by moving the breakpoint to
+       the third slot (X instruction type) as L holds only data.
+
 2002-05-10  Kevin Buettner  <kevinb@redhat.com>
 
        * dbxread.c (discarding_local_symbols_complaint): New complaint.
index 4b14152..ab7e467 100644 (file)
@@ -564,6 +564,7 @@ ia64_memory_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
   int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
   long long instr;
   int val;
+  int template;
 
   if (slotnum > 2)
     error("Can't insert breakpoint for slot numbers greater than 2.");
@@ -571,6 +572,15 @@ ia64_memory_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
   addr &= ~0x0f;
 
   val = target_read_memory (addr, bundle, BUNDLE_LEN);
+
+  /* Check for L type instruction in 2nd slot, if present then
+     bump up the slot number to the 3rd slot */
+  template = extract_bit_field (bundle, 0, 5);
+  if (slotnum == 1 && template_encoding_table[template][1] == L)
+    {
+      slotnum = 2;
+    }
+
   instr = slotN_contents (bundle, slotnum);
   memcpy(contents_cache, &instr, sizeof(instr));
   replace_slotN_contents (bundle, BREAKPOINT, slotnum);
@@ -587,10 +597,20 @@ ia64_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
   int slotnum = (addr & 0x0f) / SLOT_MULTIPLIER;
   long long instr;
   int val;
+  int template;
 
   addr &= ~0x0f;
 
   val = target_read_memory (addr, bundle, BUNDLE_LEN);
+
+  /* Check for L type instruction in 2nd slot, if present then
+     bump up the slot number to the 3rd slot */
+  template = extract_bit_field (bundle, 0, 5);
+  if (slotnum == 1 && template_encoding_table[template][1] == L)
+    {
+      slotnum = 2;
+    }
+
   memcpy (&instr, contents_cache, sizeof instr);
   replace_slotN_contents (bundle, instr, slotnum);
   if (val == 0)