Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Markus Deuling <deuling@de.ibm.com>
To: GDB Patches <gdb-patches@sourceware.org>,
	        Ulrich Weigand <uweigand@de.ibm.com>
Subject: [rfc] Wrap addresses in spu-gdb
Date: Wed, 08 Aug 2007 06:46:00 -0000	[thread overview]
Message-ID: <46B9664D.90907@de.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1110 bytes --]

Hi,

this patch makes GDB aware of a special feature of the SPU hardware. Every SPU has its own dedicated memory, called the Local Store (LS). Currently this is 256K of memory. If accessing memory above this 256K, the address is wrapped to fit in 256K (modulo calculation). So every memory address is valid. The size of the Local Store is found in the SPU's LSLR register.

This examples tries to access an address > LS size and runs into an error which is fixed by this patch:

(gdb) p *0xfffd0162
Error accessing memory address 0xfffd0162: Invalid argument.

The patch introduces three new functions to spu-tdep for address conversion which also will be used by the Cell Broadband Engine combined debugger.

ChangeLog:

	* spu-tdep.c (spu_address_to_pointer): New function.
	(spu_pointer_to_address): Likewise.
	(spu_integer_to_address): Likewise.
	(spu_gdbarch_init): Add spu_address_to_pointer, spu_pointer_to_address
	and spu_integer_to_address to gdbarch.


Tested on spu-elf. Testsuite showed no regression. 

Ok to commit?

-- 
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com






[-- Attachment #2: diff-spu-wrap-addr --]
[-- Type: text/plain, Size: 2152 bytes --]

diff -urpN src/gdb/spu-tdep.c dev/gdb/spu-tdep.c
--- src/gdb/spu-tdep.c	2007-06-18 05:36:44.000000000 +0200
+++ dev/gdb/spu-tdep.c	2007-08-08 08:39:41.000000000 +0200
@@ -324,6 +324,47 @@ spu_register_reggroup_p (struct gdbarch 
   return default_register_reggroup_p (gdbarch, regnum, group);
 }
 
+/* Address conversion.  */
+
+static void
+spu_address_to_pointer (struct type *type, gdb_byte *buf, CORE_ADDR addr)
+{
+  store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
+}
+
+static CORE_ADDR
+spu_pointer_to_address (struct type *type, const gdb_byte *buf)
+{
+  ULONGEST addr = extract_unsigned_integer (buf, TYPE_LENGTH (type));
+  ULONGEST lslr = SPU_LS_SIZE - 1; /* Hard-wired LS size.  */
+
+  if (target_has_registers && target_has_stack && target_has_memory)
+    {
+      struct frame_info *frame = get_selected_frame (NULL);
+      lslr = get_frame_register_unsigned (frame, SPU_LSLR_REGNUM);
+    }
+
+  return addr & lslr;
+}
+
+static CORE_ADDR
+spu_integer_to_address (struct gdbarch *gdbarch,
+			struct type *type, const gdb_byte *buf)
+{
+  ULONGEST addr = unpack_long (type, buf);
+  ULONGEST lslr = SPU_LS_SIZE - 1; /* Hard-wired LS size.  */
+
+  if (target_has_registers && target_has_stack && target_has_memory
+      /* FIXME: Currently needed for dwarf2_read_address to work.  */
+      && type != builtin_type_uint32)
+    {
+      struct frame_info *frame = get_selected_frame (NULL);
+      lslr = get_frame_register_unsigned (frame, SPU_LSLR_REGNUM);
+    }
+
+  return addr & lslr;
+}
+
 
 /* Decoding SPU instructions.  */
 
@@ -2008,6 +2049,11 @@ spu_gdbarch_init (struct gdbarch_info in
   set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
   set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
 
+  /* Address conversion.  */
+  set_gdbarch_address_to_pointer (gdbarch, spu_address_to_pointer);
+  set_gdbarch_pointer_to_address (gdbarch, spu_pointer_to_address);
+  set_gdbarch_integer_to_address (gdbarch, spu_integer_to_address);
+
   /* Inferior function calls.  */
   set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
   set_gdbarch_frame_align (gdbarch, spu_frame_align);


             reply	other threads:[~2007-08-08  6:46 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-08  6:46 Markus Deuling [this message]
2007-08-08 11:42 ` Daniel Jacobowitz
2007-08-08 14:12   ` Ulrich Weigand
2007-08-08 17:10     ` Jim Blandy
2007-08-09 10:39     ` Markus Deuling
2007-08-20 18:42       ` Ulrich Weigand
2007-08-21  9:57         ` Markus Deuling
2007-08-21 11:14           ` Daniel Jacobowitz
2007-08-27 13:01             ` Markus Deuling
2007-08-27 14:32               ` Ulrich Weigand

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=46B9664D.90907@de.ibm.com \
    --to=deuling@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=uweigand@de.ibm.com \
    /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