From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15511 invoked by alias); 13 May 2005 12:28:05 -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 13452 invoked from network); 13 May 2005 12:27:22 -0000 Received: from unknown (HELO miranda.se.axis.com) (193.13.178.8) by sourceware.org with SMTP; 13 May 2005 12:27:22 -0000 Received: from [10.92.19.1] (ironmaiden.se.axis.com [10.92.19.1]) by miranda.se.axis.com (8.12.9/8.12.9/Debian-5local0.1) with ESMTP id j4DCRLm8025827 for ; Fri, 13 May 2005 14:27:21 +0200 Message-ID: <42849D2B.9030905@axis.com> Date: Fri, 13 May 2005 13:18:00 -0000 From: Orjan Friberg User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511 MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [commit/cris] Add guru mode setting for CRISv32 Content-Type: multipart/mixed; boundary="------------090307030105050604020308" X-SW-Source: 2005-05/txt/msg00323.txt.bz2 This is a multi-part message in MIME format. --------------090307030105050604020308 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 834 Committed the following. 2005-05-13 Orjan Friberg * cris-tdep.c (usr_cmd_cris_version): Change type to int. (cris_mode_normal, cris_mode_guru, cris_modes, usr_cmd_cris_mode): Add. (struct gdbarch_tdep): Change type of cris_version to int. Add cris_mode. (cris_mode, set_cris_mode): New functions. (crisv32_single_step_through_delay): Read from NRP register instead of ERP register in guru mode. (cris_breakpoint_from_pc): Rename break_insn to break8_insn. Add break15_insn, returned in guru mode. (_initialize_cris_tdep): Add call to add_setshow_enum_cmd for new cris-mode setting. (cris_dump_tdep): Add dump of cris_mode. (cris_gdbarch_init): Add cris_mode to search criteria for architecture. Register the sigtramp frame sniffer only if not in guru mode. -- Orjan Friberg Axis Communications --------------090307030105050604020308 Content-Type: text/plain; name="patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch" Content-length: 6169 Index: cris-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/cris-tdep.c,v retrieving revision 1.127 diff -u -p -r1.127 cris-tdep.c --- cris-tdep.c 17 Feb 2005 13:49:49 -0000 1.127 +++ cris-tdep.c 13 May 2005 12:25:42 -0000 @@ -146,19 +146,32 @@ enum cris_regnums extern const struct cris_spec_reg cris_spec_regs[]; /* CRIS version, set via the user command 'set cris-version'. Affects - register names and sizes.*/ -static unsigned int usr_cmd_cris_version; + register names and sizes. */ +static int usr_cmd_cris_version; /* Indicates whether to trust the above variable. */ static int usr_cmd_cris_version_valid = 0; +static const char cris_mode_normal[] = "CRIS_MODE_NORMAL"; +static const char cris_mode_guru[] = "CRIS_MODE_GURU"; +static const char *cris_modes[] = { + cris_mode_normal, + cris_mode_guru, + 0 +}; + +/* CRIS mode, set via the user command 'set cris-mode'. Affects + type of break instruction among other things. */ +static const char *usr_cmd_cris_mode = cris_mode_normal; + /* Whether to make use of Dwarf-2 CFI (default on). */ static int usr_cmd_cris_dwarf2_cfi = 1; /* CRIS architecture specific information. */ struct gdbarch_tdep { - unsigned int cris_version; + int cris_version; + const char *cris_mode; int cris_dwarf2_cfi; }; @@ -170,6 +183,12 @@ cris_version (void) return (gdbarch_tdep (current_gdbarch)->cris_version); } +static const char * +cris_mode (void) +{ + return (gdbarch_tdep (current_gdbarch)->cris_mode); +} + /* Sigtramp identification code copied from i386-linux-tdep.c. */ #define SIGTRAMP_INSN0 0x9c5f /* movu.w 0xXX, $r9 */ @@ -456,7 +475,15 @@ crisv32_single_step_through_delay (struc int ret = 0; char buf[4]; - frame_unwind_register (this_frame, ERP_REGNUM, buf); + if (cris_mode () == cris_mode_guru) + { + frame_unwind_register (this_frame, NRP_REGNUM, buf); + } + else + { + frame_unwind_register (this_frame, ERP_REGNUM, buf); + } + erp = extract_unsigned_integer (buf, 4); if (erp & 0x1) @@ -687,6 +714,9 @@ static void cris_dump_tdep (struct gdbar static void set_cris_version (char *ignore_args, int from_tty, struct cmd_list_element *c); +static void set_cris_mode (char *ignore_args, int from_tty, + struct cmd_list_element *c); + static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty, struct cmd_list_element *c); @@ -1394,10 +1424,14 @@ cris_unwind_sp (struct gdbarch *gdbarch, static const unsigned char * cris_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) { - static unsigned char break_insn[] = {0x38, 0xe9}; + static unsigned char break8_insn[] = {0x38, 0xe9}; + static unsigned char break15_insn[] = {0x3f, 0xe9}; *lenptr = 2; - return break_insn; + if (cris_mode () == cris_mode_guru) + return break15_insn; + else + return break8_insn; } /* Returns 1 if spec_reg is applicable to the current gdbarch's CRIS version, @@ -3922,6 +3956,15 @@ _initialize_cris_tdep (void) set_cris_version, NULL, /* FIXME: i18n: Current CRIS version is %s. */ &setlist, &showlist); + + add_setshow_enum_cmd ("cris-mode", class_support, + cris_modes, &usr_cmd_cris_mode, + _("Set the current CRIS mode."), + _("Show the current CRIS mode."), + _("Set if autodetection fails."), + set_cris_mode, + NULL, /* FIXME: i18n: Current CRIS version is %s. */ + &setlist, &showlist); add_setshow_boolean_cmd ("cris-dwarf2-cfi", class_support, &usr_cmd_cris_dwarf2_cfi, @@ -3945,6 +3988,8 @@ cris_dump_tdep (struct gdbarch *gdbarch, { fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_version = %i\n", tdep->cris_version); + fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_mode = %s\n", + tdep->cris_mode); fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_dwarf2_cfi = %i\n", tdep->cris_dwarf2_cfi); } @@ -3966,6 +4011,19 @@ set_cris_version (char *ignore_args, int } static void +set_cris_mode (char *ignore_args, int from_tty, + struct cmd_list_element *c) +{ + struct gdbarch_info info; + + /* Update the current architecture, if needed. */ + gdbarch_info_init (&info); + if (!gdbarch_update_p (info)) + internal_error (__FILE__, __LINE__, + "cris_gdbarch_update: failed to update architecture."); +} + +static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty, struct cmd_list_element *c) { @@ -4003,14 +4061,15 @@ cris_gdbarch_init (struct gdbarch_info i /* Make the current settings visible to the user. */ usr_cmd_cris_version = cris_version; - /* Find a candidate among the list of pre-declared architectures. Both - CRIS version and ABI must match. */ + /* Find a candidate among the list of pre-declared architectures. */ for (arches = gdbarch_list_lookup_by_info (arches, &info); arches != NULL; arches = gdbarch_list_lookup_by_info (arches->next, &info)) { if ((gdbarch_tdep (arches->gdbarch)->cris_version == usr_cmd_cris_version) + && (gdbarch_tdep (arches->gdbarch)->cris_mode + == usr_cmd_cris_mode) && (gdbarch_tdep (arches->gdbarch)->cris_dwarf2_cfi == usr_cmd_cris_dwarf2_cfi)) return arches->gdbarch; @@ -4021,6 +4080,7 @@ cris_gdbarch_init (struct gdbarch_info i gdbarch = gdbarch_alloc (&info, tdep); tdep->cris_version = usr_cmd_cris_version; + tdep->cris_mode = usr_cmd_cris_mode; tdep->cris_dwarf2_cfi = usr_cmd_cris_dwarf2_cfi; /* INIT shall ensure that the INFO.BYTE_ORDER is non-zero. */ @@ -4137,7 +4197,10 @@ cris_gdbarch_init (struct gdbarch_info i frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer); } - frame_unwind_append_sniffer (gdbarch, cris_sigtramp_frame_sniffer); + if (tdep->cris_mode != cris_mode_guru) + { + frame_unwind_append_sniffer (gdbarch, cris_sigtramp_frame_sniffer); + } frame_unwind_append_sniffer (gdbarch, cris_frame_sniffer); frame_base_set_default (gdbarch, &cris_frame_base); --------------090307030105050604020308--