From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30134 invoked by alias); 3 Aug 2007 17:58:30 -0000 Received: (qmail 30118 invoked by uid 22791); 3 Aug 2007 17:58:28 -0000 X-Spam-Check-By: sourceware.org Received: from NaN.false.org (HELO nan.false.org) (208.75.86.248) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 03 Aug 2007 17:58:26 +0000 Received: from nan.false.org (localhost [127.0.0.1]) by nan.false.org (Postfix) with ESMTP id 9F66E98123 for ; Fri, 3 Aug 2007 17:58:25 +0000 (GMT) Received: from caradoc.them.org (22.svnf5.xdsl.nauticom.net [209.195.183.55]) by nan.false.org (Postfix) with ESMTP id 63C2B98122 for ; Fri, 3 Aug 2007 17:58:25 +0000 (GMT) Received: from drow by caradoc.them.org with local (Exim 4.67) (envelope-from ) id 1IH1Pr-0002wG-0M for gdb-patches@sourceware.org; Fri, 03 Aug 2007 13:58:23 -0400 Date: Fri, 03 Aug 2007 17:58:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sourceware.org Subject: [rfc] Adjust address size on MIPS Message-ID: <20070803175822.GA11142@caradoc.them.org> Mail-Followup-To: gdb-patches@sourceware.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.15 (2007-04-09) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-08/txt/msg00068.txt.bz2 I recently tried to use a 64-bit stub to debug an O32 MIPS program. It fell down because GDB would send a "m83000000" packet, instead of the proper "mffffffff83000000" packet (sign extended 64-bit addresses). I think that if a stub sends us some 64-bit registers in the "g" packet, the polite thing to do would be to send it 64-bit addresses by default. Does this sound wrong to anyone? I can't actually test this at the moment (I can't run tests on that target and my normal board is still packed from moving house). But I'll get around to testing it once I have the board up again. -- Daniel Jacobowitz CodeSourcery 2007-08-03 Daniel Jacobowitz * mips-tdep.c (mips_gdbarch_init): Use tdesc_register_size. Set gdbarch_addr_bit if known. * target-descriptions.c (tdesc_find_register_early): New. (tdesc_numbered_register): Use it. (tdesc_register_size): New. * target-descriptions.h (tdesc_register_size): Declare. Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.440 diff -u -p -r1.440 mips-tdep.c --- mips-tdep.c 20 Jul 2007 17:29:59 -0000 1.440 +++ mips-tdep.c 3 Aug 2007 17:38:41 -0000 @@ -4848,6 +4848,7 @@ mips_gdbarch_init (struct gdbarch_info i int i, num_regs; enum mips_fpu_type fpu_type; struct tdesc_arch_data *tdesc_data = NULL; + int known_wordsize = -1; /* Check any target description for validity. */ if (tdesc_has_registers (info.target_desc)) @@ -4894,6 +4895,8 @@ mips_gdbarch_init (struct gdbarch_info i return NULL; } + known_wordsize = tdesc_register_size (feature, "pc") / 8; + feature = tdesc_find_feature (info.target_desc, "org.gnu.gdb.mips.cp0"); if (feature == NULL) @@ -5082,12 +5085,20 @@ mips_gdbarch_init (struct gdbarch_info i fprintf_unfiltered (gdb_stdlog, "mips_gdbarch_init: fpu_type = %d\n", fpu_type); + if (info.target_desc && known_wordsize == -1) + { + /* Some useful properties can be inferred from the target. */ + if (tdesc_property (info.target_desc, PROPERTY_GP32) != NULL) + known_wordsize = 4; + else if (tdesc_property (info.target_desc, PROPERTY_GP64) != NULL) + known_wordsize = 8; + } + /* Check for blatant incompatibilities. */ /* If we have only 32-bit registers, then we can't debug a 64-bit ABI. */ - if (info.target_desc - && tdesc_property (info.target_desc, PROPERTY_GP32) != NULL + if (known_wordsize == 4 && mips_abi != MIPS_ABI_EABI32 && mips_abi != MIPS_ABI_O32) { @@ -5132,19 +5143,16 @@ mips_gdbarch_init (struct gdbarch_info i tdep->register_size_valid_p = 0; tdep->register_size = 0; - if (info.target_desc) + if (known_wordsize) { - /* Some useful properties can be inferred from the target. */ - if (tdesc_property (info.target_desc, PROPERTY_GP32) != NULL) - { - tdep->register_size_valid_p = 1; - tdep->register_size = 4; - } - else if (tdesc_property (info.target_desc, PROPERTY_GP64) != NULL) - { - tdep->register_size_valid_p = 1; - tdep->register_size = 8; - } + tdep->register_size_valid_p = 1; + tdep->register_size = known_wordsize; + + /* The address space must be as big as the PC register. Make + sure we send sufficiently large addresses to the target + system. If we don't know this, we'll use the size of + a pointer instead. */ + set_gdbarch_addr_bit (gdbarch, known_wordsize * 8); } /* Initially set everything according to the default ABI/ISA. */ Index: target-descriptions.c =================================================================== RCS file: /cvs/src/src/gdb/target-descriptions.c,v retrieving revision 1.10 diff -u -p -r1.10 target-descriptions.c --- target-descriptions.c 3 Jul 2007 01:23:01 -0000 1.10 +++ target-descriptions.c 3 Aug 2007 17:38:42 -0000 @@ -432,10 +432,9 @@ tdesc_data_cleanup (void *data_untyped) /* Search FEATURE for a register named NAME. */ -int -tdesc_numbered_register (const struct tdesc_feature *feature, - struct tdesc_arch_data *data, - int regno, const char *name) +static struct tdesc_reg * +tdesc_find_register_early (const struct tdesc_feature *feature, + const char *name) { int ixr; struct tdesc_reg *reg; @@ -444,15 +443,28 @@ tdesc_numbered_register (const struct td VEC_iterate (tdesc_reg_p, feature->registers, ixr, reg); ixr++) if (strcasecmp (reg->name, name) == 0) - { - /* Make sure the vector includes a REGNO'th element. */ - while (regno >= VEC_length (tdesc_reg_p, data->registers)) - VEC_safe_push (tdesc_reg_p, data->registers, NULL); - VEC_replace (tdesc_reg_p, data->registers, regno, reg); - return 1; - } + return reg; - return 0; + return NULL; +} + +/* Search FEATURE for a register named NAME. Assign REGNO to it. */ + +int +tdesc_numbered_register (const struct tdesc_feature *feature, + struct tdesc_arch_data *data, + int regno, const char *name) +{ + struct tdesc_reg *reg = tdesc_find_register_early (feature, name); + + if (reg == NULL) + return 0; + + /* Make sure the vector includes a REGNO'th element. */ + while (regno >= VEC_length (tdesc_reg_p, data->registers)) + VEC_safe_push (tdesc_reg_p, data->registers, NULL); + VEC_replace (tdesc_reg_p, data->registers, regno, reg); + return 1; } /* Search FEATURE for a register whose name is in NAMES. */ @@ -471,6 +483,19 @@ tdesc_numbered_register_choices (const s return 0; } +/* Search FEATURE for a register named NAME, and return its size in + bits. The register must exist. */ + +int +tdesc_register_size (const struct tdesc_feature *feature, + const char *name) +{ + struct tdesc_reg *reg = tdesc_find_register_early (feature, name); + + gdb_assert (reg != NULL); + return reg->bitsize; +} + /* Look up a register by its GDB internal register number. */ static struct tdesc_reg * Index: target-descriptions.h =================================================================== RCS file: /cvs/src/src/gdb/target-descriptions.h,v retrieving revision 1.7 diff -u -p -r1.7 target-descriptions.h --- target-descriptions.h 13 Jun 2007 18:26:59 -0000 1.7 +++ target-descriptions.h 3 Aug 2007 17:38:42 -0000 @@ -105,6 +105,12 @@ int tdesc_numbered_register_choices (con struct tdesc_arch_data *data, int regno, const char *const names[]); +/* Search FEATURE for a register named NAME, and return its size in + bits. The register must exist. */ + +int tdesc_register_size (const struct tdesc_feature *feature, + const char *name); + /* Accessors for target descriptions. */