From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16846 invoked by alias); 8 Aug 2007 23:23:37 -0000 Received: (qmail 16611 invoked by uid 22791); 8 Aug 2007 23:23:36 -0000 X-Spam-Check-By: sourceware.org Received: from hq.tensilica.com (HELO mailapp.tensilica.com) (65.205.227.29) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 08 Aug 2007 23:23:29 +0000 Received: from localhost ([127.0.0.1]) by mailapp.tensilica.com with esmtp (Exim 4.34) id 1IIusA-0004Wa-H9 for gdb-patches@sources.redhat.com; Wed, 08 Aug 2007 16:23:26 -0700 Received: from mailapp.tensilica.com ([127.0.0.1]) by localhost (mailapp [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 16603-09 for ; Wed, 8 Aug 2007 16:23:26 -0700 (PDT) Received: from maxim_fc5.hq.tensilica.com ([192.168.11.68]) by mailapp.tensilica.com with esmtp (Exim 4.34) id 1IIusA-0004WU-3i for gdb-patches@sources.redhat.com; Wed, 08 Aug 2007 16:23:26 -0700 Message-ID: <46BA506E.6090605@hq.tensilica.com> Date: Wed, 08 Aug 2007 23:23:00 -0000 From: Maxim Grigoriev User-Agent: Thunderbird 1.5.0.9 (X11/20070102) MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: Add Xtensa register groups for coprocessors Content-Type: multipart/mixed; boundary="------------040204030609080805050209" 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/msg00171.txt.bz2 This is a multi-part message in MIME format. --------------040204030609080805050209 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 130 This patch adds support for Xtensa-specific register groups associated with co-processors. I've committed this patch. -- Maxim --------------040204030609080805050209 Content-Type: text/x-patch; name="xtensa-patch.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xtensa-patch.diff" Content-length: 4716 2007-08-08 Maxim Grigoriev * xtensa-tdep.h (XTENSA_MAX_COPROCESSOR): New. (xtensa_register_group_t): Add entries for coprocessors. * xtensa-tdep.c (xtensa_init_reggroups): New register groups. (xtensa_add_reggroups): Likewise. (xtensa_register_reggroup_p): Likewise. (xtensa_coprocessor_register_group): New function. (xtensa_cp): New. Index: gdb/xtensa-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/xtensa-tdep.h,v retrieving revision 1.4 diff -u -r1.4 xtensa-tdep.h --- gdb/xtensa-tdep.h 31 May 2007 17:32:21 -0000 1.4 +++ gdb/xtensa-tdep.h 8 Aug 2007 23:05:23 -0000 @@ -44,6 +44,8 @@ /* Xtensa register group. */ +#define XTENSA_MAX_COPROCESSOR 0x08 /* Number of Xtensa coprocessors. */ + typedef enum { xtRegisterGroupUnknown = 0, @@ -58,6 +60,16 @@ xtRegisterGroupFloat = 0x0400, /* Floating Point. */ xtRegisterGroupVectra = 0x0800, /* Vectra. */ xtRegisterGroupSystem = 0x1000, /* System. */ + + xtRegisterGroupCP0 = 0x01000000, /* CP0. */ + xtRegisterGroupCP1 = 0x02000000, /* CP1. */ + xtRegisterGroupCP2 = 0x04000000, /* CP2. */ + xtRegisterGroupCP3 = 0x08000000, /* CP3. */ + xtRegisterGroupCP4 = 0x10000000, /* CP4. */ + xtRegisterGroupCP5 = 0x20000000, /* CP5. */ + xtRegisterGroupCP6 = 0x40000000, /* CP6. */ + xtRegisterGroupCP7 = 0x80000000, /* CP7. */ + } xtensa_register_group_t; Index: gdb/xtensa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/xtensa-tdep.c,v retrieving revision 1.9 diff -u -r1.9 xtensa-tdep.c --- gdb/xtensa-tdep.c 18 Jun 2007 17:45:26 -0000 1.9 +++ gdb/xtensa-tdep.c 8 Aug 2007 23:05:30 -0000 @@ -658,6 +658,7 @@ static struct reggroup *xtensa_ar_reggroup; static struct reggroup *xtensa_user_reggroup; static struct reggroup *xtensa_vectra_reggroup; +static struct reggroup *xtensa_cp[XTENSA_MAX_COPROCESSOR]; static void xtensa_init_reggroups (void) @@ -665,25 +666,51 @@ xtensa_ar_reggroup = reggroup_new ("ar", USER_REGGROUP); xtensa_user_reggroup = reggroup_new ("user", USER_REGGROUP); xtensa_vectra_reggroup = reggroup_new ("vectra", USER_REGGROUP); -} + xtensa_cp[0] = reggroup_new ("cp0", USER_REGGROUP); + xtensa_cp[1] = reggroup_new ("cp1", USER_REGGROUP); + xtensa_cp[2] = reggroup_new ("cp2", USER_REGGROUP); + xtensa_cp[3] = reggroup_new ("cp3", USER_REGGROUP); + xtensa_cp[4] = reggroup_new ("cp4", USER_REGGROUP); + xtensa_cp[5] = reggroup_new ("cp5", USER_REGGROUP); + xtensa_cp[6] = reggroup_new ("cp6", USER_REGGROUP); + xtensa_cp[7] = reggroup_new ("cp7", USER_REGGROUP); +} static void xtensa_add_reggroups (struct gdbarch *gdbarch) { + int i; + + /* Predefined groups. */ reggroup_add (gdbarch, all_reggroup); reggroup_add (gdbarch, save_reggroup); reggroup_add (gdbarch, restore_reggroup); reggroup_add (gdbarch, system_reggroup); - reggroup_add (gdbarch, vector_reggroup); /* vectra */ - reggroup_add (gdbarch, general_reggroup); /* core */ - reggroup_add (gdbarch, float_reggroup); /* float */ - - reggroup_add (gdbarch, xtensa_ar_reggroup); /* ar */ - reggroup_add (gdbarch, xtensa_user_reggroup); /* user */ - reggroup_add (gdbarch, xtensa_vectra_reggroup); /* vectra */ + reggroup_add (gdbarch, vector_reggroup); + reggroup_add (gdbarch, general_reggroup); + reggroup_add (gdbarch, float_reggroup); + + /* Xtensa-specific groups. */ + reggroup_add (gdbarch, xtensa_ar_reggroup); + reggroup_add (gdbarch, xtensa_user_reggroup); + reggroup_add (gdbarch, xtensa_vectra_reggroup); + + for (i = 0; i < XTENSA_MAX_COPROCESSOR; i++) + reggroup_add (gdbarch, xtensa_cp[i]); } +static int +xtensa_coprocessor_register_group (struct reggroup *group) +{ + int i; + + for (i = 0; i < XTENSA_MAX_COPROCESSOR; i++) + if (group == xtensa_cp[i]) + return i; + + return -1; +} #define SAVE_REST_FLAGS (XTENSA_REGISTER_FLAGS_READABLE \ | XTENSA_REGISTER_FLAGS_WRITABLE \ @@ -700,6 +727,7 @@ xtensa_register_t* reg = ®MAP[regnum]; xtensa_register_type_t type = reg->type; xtensa_register_group_t rg = reg->group; + int cp_number; /* First, skip registers that are not visible to this target (unknown and unmapped registers when not using ISS). */ @@ -725,6 +753,8 @@ if (group == save_reggroup || group == restore_reggroup) return (regnum < gdbarch_num_regs (current_gdbarch) && (reg->flags & SAVE_REST_FLAGS) == SAVE_REST_VALID); + if ((cp_number = xtensa_coprocessor_register_group (group)) >= 0) + return rg & (xtRegisterGroupCP0 << cp_number); else return 1; } --------------040204030609080805050209--