From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28378 invoked by alias); 7 Nov 2003 05:58:41 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 28371 invoked from network); 7 Nov 2003 05:58:40 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 7 Nov 2003 05:58:40 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id hA75weM26016 for ; Fri, 7 Nov 2003 00:58:40 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id hA75we627406 for ; Fri, 7 Nov 2003 00:58:40 -0500 Received: from localhost.localdomain (vpn50-2.rdu.redhat.com [172.16.50.2]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id hA75wdH8006873 for ; Fri, 7 Nov 2003 00:58:39 -0500 Received: (from kev@localhost) by localhost.localdomain (8.11.6/8.11.6) id hA75wX715561 for gdb-patches@sources.redhat.com; Thu, 6 Nov 2003 22:58:33 -0700 Date: Fri, 07 Nov 2003 05:58:00 -0000 From: Kevin Buettner Message-Id: <1031107055833.ZM15560@localhost.localdomain> To: gdb-patches@sources.redhat.com Subject: [PATCH] FR-V: Add support for 64-bit iacc0 register MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-11/txt/msg00111.txt.bz2 I've just committed the patch below. * frv-tdep.c (first_pseudo_regnum, iacc0_regnum, frv_num_pseudo_regs): Define. (new_variant): Set name for iacc0_regnum. (frv_register_name): Accommodate pseudo-registers. (frv_register_type): Add case for iacc0_regnum. (frv_pseudo_register_read, frv_pseudo_register_write): New functions. (frv_gdbarch_init): Set number of pseudo registers. Establish pseudo-register read/write methods. Index: frv-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/frv-tdep.c,v retrieving revision 1.59 diff -u -p -r1.59 frv-tdep.c --- frv-tdep.c 5 Nov 2003 16:44:12 -0000 1.59 +++ frv-tdep.c 7 Nov 2003 02:57:36 -0000 @@ -85,7 +85,16 @@ enum { last_spr_regnum = 148, /* The total number of registers we know exist. */ - frv_num_regs = last_spr_regnum + 1 + frv_num_regs = last_spr_regnum + 1, + + /* Pseudo registers */ + first_pseudo_regnum = frv_num_regs, + + /* iacc0 - the 64-bit concatenation of iacc0h and iacc0l. */ + iacc0_regnum = first_pseudo_regnum + 0, + + last_pseudo_regnum = iacc0_regnum, + frv_num_pseudo_regs = last_pseudo_regnum - first_pseudo_regnum + 1, }; static LONGEST frv_call_dummy_words[] = @@ -161,8 +170,10 @@ new_variant (void) /* By default, don't supply any general-purpose or floating-point register names. */ - var->register_names = (char **) xmalloc (frv_num_regs * sizeof (char *)); - for (r = 0; r < frv_num_regs; r++) + var->register_names + = (char **) xmalloc ((frv_num_regs + frv_num_pseudo_regs) + * sizeof (char *)); + for (r = 0; r < frv_num_regs + frv_num_pseudo_regs; r++) var->register_names[r] = ""; /* Do, however, supply default names for the known special-purpose @@ -187,6 +198,7 @@ new_variant (void) /* iacc0 (Only found on MB93405.) */ var->register_names[iacc0h_regnum] = "iacc0h"; var->register_names[iacc0l_regnum] = "iacc0l"; + var->register_names[iacc0_regnum] = "iacc0"; return var; } @@ -235,7 +247,7 @@ frv_register_name (int reg) { if (reg < 0) return "?toosmall?"; - if (reg >= frv_num_regs) + if (reg >= frv_num_regs + frv_num_pseudo_regs) return "?toolarge?"; return CURRENT_VARIANT->register_names[reg]; @@ -247,10 +259,34 @@ frv_register_type (struct gdbarch *gdbar { if (reg >= first_fpr_regnum && reg <= last_fpr_regnum) return builtin_type_float; + else if (reg == iacc0_regnum) + return builtin_type_int64; else return builtin_type_int32; } +static void +frv_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, + int reg, void *buffer) +{ + if (reg == iacc0_regnum) + { + regcache_raw_read (regcache, iacc0h_regnum, buffer); + regcache_raw_read (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); + } +} + +static void +frv_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, + int reg, const void *buffer) +{ + if (reg == iacc0_regnum) + { + regcache_raw_write (regcache, iacc0h_regnum, buffer); + regcache_raw_write (regcache, iacc0l_regnum, (bfd_byte *) buffer + 4); + } +} + static int frv_register_sim_regno (int reg) { @@ -1202,6 +1238,8 @@ frv_gdbarch_init (struct gdbarch_info in set_gdbarch_ptr_bit (gdbarch, 32); set_gdbarch_num_regs (gdbarch, frv_num_regs); + set_gdbarch_num_pseudo_regs (gdbarch, frv_num_pseudo_regs); + set_gdbarch_sp_regnum (gdbarch, sp_regnum); set_gdbarch_deprecated_fp_regnum (gdbarch, fp_regnum); set_gdbarch_pc_regnum (gdbarch, pc_regnum); @@ -1209,6 +1247,9 @@ frv_gdbarch_init (struct gdbarch_info in set_gdbarch_register_name (gdbarch, frv_register_name); set_gdbarch_register_type (gdbarch, frv_register_type); set_gdbarch_register_sim_regno (gdbarch, frv_register_sim_regno); + + set_gdbarch_pseudo_register_read (gdbarch, frv_pseudo_register_read); + set_gdbarch_pseudo_register_write (gdbarch, frv_pseudo_register_write); set_gdbarch_skip_prologue (gdbarch, frv_skip_prologue); set_gdbarch_breakpoint_from_pc (gdbarch, frv_breakpoint_from_pc);