Home | History | Annotate | Line # | Download | only in gdb
cris-tdep.c revision 1.1
      1  1.1  christos /* Target dependent code for CRIS, for GDB, the GNU debugger.
      2  1.1  christos 
      3  1.1  christos    Copyright (C) 2001-2014 Free Software Foundation, Inc.
      4  1.1  christos 
      5  1.1  christos    Contributed by Axis Communications AB.
      6  1.1  christos    Written by Hendrik Ruijter, Stefan Andersson, and Orjan Friberg.
      7  1.1  christos 
      8  1.1  christos    This file is part of GDB.
      9  1.1  christos 
     10  1.1  christos    This program is free software; you can redistribute it and/or modify
     11  1.1  christos    it under the terms of the GNU General Public License as published by
     12  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     13  1.1  christos    (at your option) any later version.
     14  1.1  christos 
     15  1.1  christos    This program is distributed in the hope that it will be useful,
     16  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  1.1  christos    GNU General Public License for more details.
     19  1.1  christos 
     20  1.1  christos    You should have received a copy of the GNU General Public License
     21  1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     22  1.1  christos 
     23  1.1  christos #include "defs.h"
     24  1.1  christos #include "frame.h"
     25  1.1  christos #include "frame-unwind.h"
     26  1.1  christos #include "frame-base.h"
     27  1.1  christos #include "trad-frame.h"
     28  1.1  christos #include "dwarf2-frame.h"
     29  1.1  christos #include "symtab.h"
     30  1.1  christos #include "inferior.h"
     31  1.1  christos #include "gdbtypes.h"
     32  1.1  christos #include "gdbcore.h"
     33  1.1  christos #include "gdbcmd.h"
     34  1.1  christos #include "target.h"
     35  1.1  christos #include "value.h"
     36  1.1  christos #include "opcode/cris.h"
     37  1.1  christos #include "osabi.h"
     38  1.1  christos #include "arch-utils.h"
     39  1.1  christos #include "regcache.h"
     40  1.1  christos #include "gdb_assert.h"
     41  1.1  christos 
     42  1.1  christos #include "objfiles.h"
     43  1.1  christos 
     44  1.1  christos #include "solib.h"              /* Support for shared libraries.  */
     45  1.1  christos #include "solib-svr4.h"
     46  1.1  christos #include <string.h>
     47  1.1  christos #include "dis-asm.h"
     48  1.1  christos 
     49  1.1  christos #include "cris-tdep.h"
     50  1.1  christos 
     51  1.1  christos enum cris_num_regs
     52  1.1  christos {
     53  1.1  christos   /* There are no floating point registers.  Used in gdbserver low-linux.c.  */
     54  1.1  christos   NUM_FREGS = 0,
     55  1.1  christos 
     56  1.1  christos   /* There are 16 general registers.  */
     57  1.1  christos   NUM_GENREGS = 16,
     58  1.1  christos 
     59  1.1  christos   /* There are 16 special registers.  */
     60  1.1  christos   NUM_SPECREGS = 16,
     61  1.1  christos 
     62  1.1  christos   /* CRISv32 has a pseudo PC register, not noted here.  */
     63  1.1  christos 
     64  1.1  christos   /* CRISv32 has 16 support registers.  */
     65  1.1  christos   NUM_SUPPREGS = 16
     66  1.1  christos };
     67  1.1  christos 
     68  1.1  christos /* Register numbers of various important registers.
     69  1.1  christos    CRIS_FP_REGNUM   Contains address of executing stack frame.
     70  1.1  christos    STR_REGNUM  Contains the address of structure return values.
     71  1.1  christos    RET_REGNUM  Contains the return value when shorter than or equal to 32 bits
     72  1.1  christos    ARG1_REGNUM Contains the first parameter to a function.
     73  1.1  christos    ARG2_REGNUM Contains the second parameter to a function.
     74  1.1  christos    ARG3_REGNUM Contains the third parameter to a function.
     75  1.1  christos    ARG4_REGNUM Contains the fourth parameter to a function.  Rest on stack.
     76  1.1  christos    gdbarch_sp_regnum Contains address of top of stack.
     77  1.1  christos    gdbarch_pc_regnum Contains address of next instruction.
     78  1.1  christos    SRP_REGNUM  Subroutine return pointer register.
     79  1.1  christos    BRP_REGNUM  Breakpoint return pointer register.  */
     80  1.1  christos 
     81  1.1  christos enum cris_regnums
     82  1.1  christos {
     83  1.1  christos   /* Enums with respect to the general registers, valid for all
     84  1.1  christos      CRIS versions.  The frame pointer is always in R8.  */
     85  1.1  christos   CRIS_FP_REGNUM = 8,
     86  1.1  christos   /* ABI related registers.  */
     87  1.1  christos   STR_REGNUM  = 9,
     88  1.1  christos   RET_REGNUM  = 10,
     89  1.1  christos   ARG1_REGNUM = 10,
     90  1.1  christos   ARG2_REGNUM = 11,
     91  1.1  christos   ARG3_REGNUM = 12,
     92  1.1  christos   ARG4_REGNUM = 13,
     93  1.1  christos 
     94  1.1  christos   /* Registers which happen to be common.  */
     95  1.1  christos   VR_REGNUM   = 17,
     96  1.1  christos   MOF_REGNUM  = 23,
     97  1.1  christos   SRP_REGNUM  = 27,
     98  1.1  christos 
     99  1.1  christos   /* CRISv10 et al. specific registers.  */
    100  1.1  christos   P0_REGNUM   = 16,
    101  1.1  christos   P4_REGNUM   = 20,
    102  1.1  christos   CCR_REGNUM  = 21,
    103  1.1  christos   P8_REGNUM   = 24,
    104  1.1  christos   IBR_REGNUM  = 25,
    105  1.1  christos   IRP_REGNUM  = 26,
    106  1.1  christos   BAR_REGNUM  = 28,
    107  1.1  christos   DCCR_REGNUM = 29,
    108  1.1  christos   BRP_REGNUM  = 30,
    109  1.1  christos   USP_REGNUM  = 31,
    110  1.1  christos 
    111  1.1  christos   /* CRISv32 specific registers.  */
    112  1.1  christos   ACR_REGNUM  = 15,
    113  1.1  christos   BZ_REGNUM   = 16,
    114  1.1  christos   PID_REGNUM  = 18,
    115  1.1  christos   SRS_REGNUM  = 19,
    116  1.1  christos   WZ_REGNUM   = 20,
    117  1.1  christos   EXS_REGNUM  = 21,
    118  1.1  christos   EDA_REGNUM  = 22,
    119  1.1  christos   DZ_REGNUM   = 24,
    120  1.1  christos   EBP_REGNUM  = 25,
    121  1.1  christos   ERP_REGNUM  = 26,
    122  1.1  christos   NRP_REGNUM  = 28,
    123  1.1  christos   CCS_REGNUM  = 29,
    124  1.1  christos   CRISV32USP_REGNUM  = 30, /* Shares name but not number with CRISv10.  */
    125  1.1  christos   SPC_REGNUM  = 31,
    126  1.1  christos   CRISV32PC_REGNUM   = 32, /* Shares name but not number with CRISv10.  */
    127  1.1  christos 
    128  1.1  christos   S0_REGNUM = 33,
    129  1.1  christos   S1_REGNUM = 34,
    130  1.1  christos   S2_REGNUM = 35,
    131  1.1  christos   S3_REGNUM = 36,
    132  1.1  christos   S4_REGNUM = 37,
    133  1.1  christos   S5_REGNUM = 38,
    134  1.1  christos   S6_REGNUM = 39,
    135  1.1  christos   S7_REGNUM = 40,
    136  1.1  christos   S8_REGNUM = 41,
    137  1.1  christos   S9_REGNUM = 42,
    138  1.1  christos   S10_REGNUM = 43,
    139  1.1  christos   S11_REGNUM = 44,
    140  1.1  christos   S12_REGNUM = 45,
    141  1.1  christos   S13_REGNUM = 46,
    142  1.1  christos   S14_REGNUM = 47,
    143  1.1  christos   S15_REGNUM = 48,
    144  1.1  christos };
    145  1.1  christos 
    146  1.1  christos extern const struct cris_spec_reg cris_spec_regs[];
    147  1.1  christos 
    148  1.1  christos /* CRIS version, set via the user command 'set cris-version'.  Affects
    149  1.1  christos    register names and sizes.  */
    150  1.1  christos static unsigned int usr_cmd_cris_version;
    151  1.1  christos 
    152  1.1  christos /* Indicates whether to trust the above variable.  */
    153  1.1  christos static int usr_cmd_cris_version_valid = 0;
    154  1.1  christos 
    155  1.1  christos static const char cris_mode_normal[] = "normal";
    156  1.1  christos static const char cris_mode_guru[] = "guru";
    157  1.1  christos static const char *const cris_modes[] = {
    158  1.1  christos   cris_mode_normal,
    159  1.1  christos   cris_mode_guru,
    160  1.1  christos   0
    161  1.1  christos };
    162  1.1  christos 
    163  1.1  christos /* CRIS mode, set via the user command 'set cris-mode'.  Affects
    164  1.1  christos    type of break instruction among other things.  */
    165  1.1  christos static const char *usr_cmd_cris_mode = cris_mode_normal;
    166  1.1  christos 
    167  1.1  christos /* Whether to make use of Dwarf-2 CFI (default on).  */
    168  1.1  christos static int usr_cmd_cris_dwarf2_cfi = 1;
    169  1.1  christos 
    170  1.1  christos /* Sigtramp identification code copied from i386-linux-tdep.c.  */
    171  1.1  christos 
    172  1.1  christos #define SIGTRAMP_INSN0    0x9c5f  /* movu.w 0xXX, $r9 */
    173  1.1  christos #define SIGTRAMP_OFFSET0  0
    174  1.1  christos #define SIGTRAMP_INSN1    0xe93d  /* break 13 */
    175  1.1  christos #define SIGTRAMP_OFFSET1  4
    176  1.1  christos 
    177  1.1  christos static const unsigned short sigtramp_code[] =
    178  1.1  christos {
    179  1.1  christos   SIGTRAMP_INSN0, 0x0077,  /* movu.w $0x77, $r9 */
    180  1.1  christos   SIGTRAMP_INSN1           /* break 13 */
    181  1.1  christos };
    182  1.1  christos 
    183  1.1  christos #define SIGTRAMP_LEN (sizeof sigtramp_code)
    184  1.1  christos 
    185  1.1  christos /* Note: same length as normal sigtramp code.  */
    186  1.1  christos 
    187  1.1  christos static const unsigned short rt_sigtramp_code[] =
    188  1.1  christos {
    189  1.1  christos   SIGTRAMP_INSN0, 0x00ad,  /* movu.w $0xad, $r9 */
    190  1.1  christos   SIGTRAMP_INSN1           /* break 13 */
    191  1.1  christos };
    192  1.1  christos 
    193  1.1  christos /* If PC is in a sigtramp routine, return the address of the start of
    194  1.1  christos    the routine.  Otherwise, return 0.  */
    195  1.1  christos 
    196  1.1  christos static CORE_ADDR
    197  1.1  christos cris_sigtramp_start (struct frame_info *this_frame)
    198  1.1  christos {
    199  1.1  christos   CORE_ADDR pc = get_frame_pc (this_frame);
    200  1.1  christos   gdb_byte buf[SIGTRAMP_LEN];
    201  1.1  christos 
    202  1.1  christos   if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
    203  1.1  christos     return 0;
    204  1.1  christos 
    205  1.1  christos   if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN0)
    206  1.1  christos     {
    207  1.1  christos       if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN1)
    208  1.1  christos 	return 0;
    209  1.1  christos 
    210  1.1  christos       pc -= SIGTRAMP_OFFSET1;
    211  1.1  christos       if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
    212  1.1  christos 	return 0;
    213  1.1  christos     }
    214  1.1  christos 
    215  1.1  christos   if (memcmp (buf, sigtramp_code, SIGTRAMP_LEN) != 0)
    216  1.1  christos     return 0;
    217  1.1  christos 
    218  1.1  christos   return pc;
    219  1.1  christos }
    220  1.1  christos 
    221  1.1  christos /* If PC is in a RT sigtramp routine, return the address of the start of
    222  1.1  christos    the routine.  Otherwise, return 0.  */
    223  1.1  christos 
    224  1.1  christos static CORE_ADDR
    225  1.1  christos cris_rt_sigtramp_start (struct frame_info *this_frame)
    226  1.1  christos {
    227  1.1  christos   CORE_ADDR pc = get_frame_pc (this_frame);
    228  1.1  christos   gdb_byte buf[SIGTRAMP_LEN];
    229  1.1  christos 
    230  1.1  christos   if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
    231  1.1  christos     return 0;
    232  1.1  christos 
    233  1.1  christos   if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN0)
    234  1.1  christos     {
    235  1.1  christos       if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN1)
    236  1.1  christos 	return 0;
    237  1.1  christos 
    238  1.1  christos       pc -= SIGTRAMP_OFFSET1;
    239  1.1  christos       if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
    240  1.1  christos 	return 0;
    241  1.1  christos     }
    242  1.1  christos 
    243  1.1  christos   if (memcmp (buf, rt_sigtramp_code, SIGTRAMP_LEN) != 0)
    244  1.1  christos     return 0;
    245  1.1  christos 
    246  1.1  christos   return pc;
    247  1.1  christos }
    248  1.1  christos 
    249  1.1  christos /* Assuming THIS_FRAME is a frame for a GNU/Linux sigtramp routine,
    250  1.1  christos    return the address of the associated sigcontext structure.  */
    251  1.1  christos 
    252  1.1  christos static CORE_ADDR
    253  1.1  christos cris_sigcontext_addr (struct frame_info *this_frame)
    254  1.1  christos {
    255  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    256  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    257  1.1  christos   CORE_ADDR pc;
    258  1.1  christos   CORE_ADDR sp;
    259  1.1  christos   gdb_byte buf[4];
    260  1.1  christos 
    261  1.1  christos   get_frame_register (this_frame, gdbarch_sp_regnum (gdbarch), buf);
    262  1.1  christos   sp = extract_unsigned_integer (buf, 4, byte_order);
    263  1.1  christos 
    264  1.1  christos   /* Look for normal sigtramp frame first.  */
    265  1.1  christos   pc = cris_sigtramp_start (this_frame);
    266  1.1  christos   if (pc)
    267  1.1  christos     {
    268  1.1  christos       /* struct signal_frame (arch/cris/kernel/signal.c) contains
    269  1.1  christos 	 struct sigcontext as its first member, meaning the SP points to
    270  1.1  christos 	 it already.  */
    271  1.1  christos       return sp;
    272  1.1  christos     }
    273  1.1  christos 
    274  1.1  christos   pc = cris_rt_sigtramp_start (this_frame);
    275  1.1  christos   if (pc)
    276  1.1  christos     {
    277  1.1  christos       /* struct rt_signal_frame (arch/cris/kernel/signal.c) contains
    278  1.1  christos 	 a struct ucontext, which in turn contains a struct sigcontext.
    279  1.1  christos 	 Magic digging:
    280  1.1  christos 	 4 + 4 + 128 to struct ucontext, then
    281  1.1  christos 	 4 + 4 + 12 to struct sigcontext.  */
    282  1.1  christos       return (sp + 156);
    283  1.1  christos     }
    284  1.1  christos 
    285  1.1  christos   error (_("Couldn't recognize signal trampoline."));
    286  1.1  christos   return 0;
    287  1.1  christos }
    288  1.1  christos 
    289  1.1  christos struct cris_unwind_cache
    290  1.1  christos {
    291  1.1  christos   /* The previous frame's inner most stack address.  Used as this
    292  1.1  christos      frame ID's stack_addr.  */
    293  1.1  christos   CORE_ADDR prev_sp;
    294  1.1  christos   /* The frame's base, optionally used by the high-level debug info.  */
    295  1.1  christos   CORE_ADDR base;
    296  1.1  christos   int size;
    297  1.1  christos   /* How far the SP and r8 (FP) have been offset from the start of
    298  1.1  christos      the stack frame (as defined by the previous frame's stack
    299  1.1  christos      pointer).  */
    300  1.1  christos   LONGEST sp_offset;
    301  1.1  christos   LONGEST r8_offset;
    302  1.1  christos   int uses_frame;
    303  1.1  christos 
    304  1.1  christos   /* From old frame_extra_info struct.  */
    305  1.1  christos   CORE_ADDR return_pc;
    306  1.1  christos   int leaf_function;
    307  1.1  christos 
    308  1.1  christos   /* Table indicating the location of each and every register.  */
    309  1.1  christos   struct trad_frame_saved_reg *saved_regs;
    310  1.1  christos };
    311  1.1  christos 
    312  1.1  christos static struct cris_unwind_cache *
    313  1.1  christos cris_sigtramp_frame_unwind_cache (struct frame_info *this_frame,
    314  1.1  christos 				  void **this_cache)
    315  1.1  christos {
    316  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    317  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
    318  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    319  1.1  christos   struct cris_unwind_cache *info;
    320  1.1  christos   CORE_ADDR addr;
    321  1.1  christos   gdb_byte buf[4];
    322  1.1  christos   int i;
    323  1.1  christos 
    324  1.1  christos   if ((*this_cache))
    325  1.1  christos     return (*this_cache);
    326  1.1  christos 
    327  1.1  christos   info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache);
    328  1.1  christos   (*this_cache) = info;
    329  1.1  christos   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
    330  1.1  christos 
    331  1.1  christos   /* Zero all fields.  */
    332  1.1  christos   info->prev_sp = 0;
    333  1.1  christos   info->base = 0;
    334  1.1  christos   info->size = 0;
    335  1.1  christos   info->sp_offset = 0;
    336  1.1  christos   info->r8_offset = 0;
    337  1.1  christos   info->uses_frame = 0;
    338  1.1  christos   info->return_pc = 0;
    339  1.1  christos   info->leaf_function = 0;
    340  1.1  christos 
    341  1.1  christos   get_frame_register (this_frame, gdbarch_sp_regnum (gdbarch), buf);
    342  1.1  christos   info->base = extract_unsigned_integer (buf, 4, byte_order);
    343  1.1  christos 
    344  1.1  christos   addr = cris_sigcontext_addr (this_frame);
    345  1.1  christos 
    346  1.1  christos   /* Layout of the sigcontext struct:
    347  1.1  christos      struct sigcontext {
    348  1.1  christos 	struct pt_regs regs;
    349  1.1  christos 	unsigned long oldmask;
    350  1.1  christos 	unsigned long usp;
    351  1.1  christos      }; */
    352  1.1  christos 
    353  1.1  christos   if (tdep->cris_version == 10)
    354  1.1  christos     {
    355  1.1  christos       /* R0 to R13 are stored in reverse order at offset (2 * 4) in
    356  1.1  christos 	 struct pt_regs.  */
    357  1.1  christos       for (i = 0; i <= 13; i++)
    358  1.1  christos 	info->saved_regs[i].addr = addr + ((15 - i) * 4);
    359  1.1  christos 
    360  1.1  christos       info->saved_regs[MOF_REGNUM].addr = addr + (16 * 4);
    361  1.1  christos       info->saved_regs[DCCR_REGNUM].addr = addr + (17 * 4);
    362  1.1  christos       info->saved_regs[SRP_REGNUM].addr = addr + (18 * 4);
    363  1.1  christos       /* Note: IRP is off by 2 at this point.  There's no point in correcting
    364  1.1  christos 	 it though since that will mean that the backtrace will show a PC
    365  1.1  christos 	 different from what is shown when stopped.  */
    366  1.1  christos       info->saved_regs[IRP_REGNUM].addr = addr + (19 * 4);
    367  1.1  christos       info->saved_regs[gdbarch_pc_regnum (gdbarch)]
    368  1.1  christos 	= info->saved_regs[IRP_REGNUM];
    369  1.1  christos       info->saved_regs[gdbarch_sp_regnum (gdbarch)].addr = addr + (24 * 4);
    370  1.1  christos     }
    371  1.1  christos   else
    372  1.1  christos     {
    373  1.1  christos       /* CRISv32.  */
    374  1.1  christos       /* R0 to R13 are stored in order at offset (1 * 4) in
    375  1.1  christos 	 struct pt_regs.  */
    376  1.1  christos       for (i = 0; i <= 13; i++)
    377  1.1  christos 	info->saved_regs[i].addr = addr + ((i + 1) * 4);
    378  1.1  christos 
    379  1.1  christos       info->saved_regs[ACR_REGNUM].addr = addr + (15 * 4);
    380  1.1  christos       info->saved_regs[SRS_REGNUM].addr = addr + (16 * 4);
    381  1.1  christos       info->saved_regs[MOF_REGNUM].addr = addr + (17 * 4);
    382  1.1  christos       info->saved_regs[SPC_REGNUM].addr = addr + (18 * 4);
    383  1.1  christos       info->saved_regs[CCS_REGNUM].addr = addr + (19 * 4);
    384  1.1  christos       info->saved_regs[SRP_REGNUM].addr = addr + (20 * 4);
    385  1.1  christos       info->saved_regs[ERP_REGNUM].addr = addr + (21 * 4);
    386  1.1  christos       info->saved_regs[EXS_REGNUM].addr = addr + (22 * 4);
    387  1.1  christos       info->saved_regs[EDA_REGNUM].addr = addr + (23 * 4);
    388  1.1  christos 
    389  1.1  christos       /* FIXME: If ERP is in a delay slot at this point then the PC will
    390  1.1  christos 	 be wrong at this point.  This problem manifests itself in the
    391  1.1  christos 	 sigaltstack.exp test case, which occasionally generates FAILs when
    392  1.1  christos 	 the signal is received while in a delay slot.
    393  1.1  christos 
    394  1.1  christos 	 This could be solved by a couple of read_memory_unsigned_integer and a
    395  1.1  christos 	 trad_frame_set_value.  */
    396  1.1  christos       info->saved_regs[gdbarch_pc_regnum (gdbarch)]
    397  1.1  christos 	= info->saved_regs[ERP_REGNUM];
    398  1.1  christos 
    399  1.1  christos       info->saved_regs[gdbarch_sp_regnum (gdbarch)].addr
    400  1.1  christos 	= addr + (25 * 4);
    401  1.1  christos     }
    402  1.1  christos 
    403  1.1  christos   return info;
    404  1.1  christos }
    405  1.1  christos 
    406  1.1  christos static void
    407  1.1  christos cris_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
    408  1.1  christos                              struct frame_id *this_id)
    409  1.1  christos {
    410  1.1  christos   struct cris_unwind_cache *cache =
    411  1.1  christos     cris_sigtramp_frame_unwind_cache (this_frame, this_cache);
    412  1.1  christos   (*this_id) = frame_id_build (cache->base, get_frame_pc (this_frame));
    413  1.1  christos }
    414  1.1  christos 
    415  1.1  christos /* Forward declaration.  */
    416  1.1  christos 
    417  1.1  christos static struct value *cris_frame_prev_register (struct frame_info *this_frame,
    418  1.1  christos 					       void **this_cache, int regnum);
    419  1.1  christos static struct value *
    420  1.1  christos cris_sigtramp_frame_prev_register (struct frame_info *this_frame,
    421  1.1  christos                                    void **this_cache, int regnum)
    422  1.1  christos {
    423  1.1  christos   /* Make sure we've initialized the cache.  */
    424  1.1  christos   cris_sigtramp_frame_unwind_cache (this_frame, this_cache);
    425  1.1  christos   return cris_frame_prev_register (this_frame, this_cache, regnum);
    426  1.1  christos }
    427  1.1  christos 
    428  1.1  christos static int
    429  1.1  christos cris_sigtramp_frame_sniffer (const struct frame_unwind *self,
    430  1.1  christos 			     struct frame_info *this_frame,
    431  1.1  christos 			     void **this_cache)
    432  1.1  christos {
    433  1.1  christos   if (cris_sigtramp_start (this_frame)
    434  1.1  christos       || cris_rt_sigtramp_start (this_frame))
    435  1.1  christos     return 1;
    436  1.1  christos 
    437  1.1  christos   return 0;
    438  1.1  christos }
    439  1.1  christos 
    440  1.1  christos static const struct frame_unwind cris_sigtramp_frame_unwind =
    441  1.1  christos {
    442  1.1  christos   SIGTRAMP_FRAME,
    443  1.1  christos   default_frame_unwind_stop_reason,
    444  1.1  christos   cris_sigtramp_frame_this_id,
    445  1.1  christos   cris_sigtramp_frame_prev_register,
    446  1.1  christos   NULL,
    447  1.1  christos   cris_sigtramp_frame_sniffer
    448  1.1  christos };
    449  1.1  christos 
    450  1.1  christos static int
    451  1.1  christos crisv32_single_step_through_delay (struct gdbarch *gdbarch,
    452  1.1  christos 				   struct frame_info *this_frame)
    453  1.1  christos {
    454  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
    455  1.1  christos   ULONGEST erp;
    456  1.1  christos   int ret = 0;
    457  1.1  christos 
    458  1.1  christos   if (tdep->cris_mode == cris_mode_guru)
    459  1.1  christos     erp = get_frame_register_unsigned (this_frame, NRP_REGNUM);
    460  1.1  christos   else
    461  1.1  christos     erp = get_frame_register_unsigned (this_frame, ERP_REGNUM);
    462  1.1  christos 
    463  1.1  christos   if (erp & 0x1)
    464  1.1  christos     {
    465  1.1  christos       /* In delay slot - check if there's a breakpoint at the preceding
    466  1.1  christos 	 instruction.  */
    467  1.1  christos       if (breakpoint_here_p (get_frame_address_space (this_frame), erp & ~0x1))
    468  1.1  christos 	ret = 1;
    469  1.1  christos     }
    470  1.1  christos   return ret;
    471  1.1  christos }
    472  1.1  christos 
    473  1.1  christos /* The instruction environment needed to find single-step breakpoints.  */
    474  1.1  christos 
    475  1.1  christos typedef
    476  1.1  christos struct instruction_environment
    477  1.1  christos {
    478  1.1  christos   unsigned long reg[NUM_GENREGS];
    479  1.1  christos   unsigned long preg[NUM_SPECREGS];
    480  1.1  christos   unsigned long branch_break_address;
    481  1.1  christos   unsigned long delay_slot_pc;
    482  1.1  christos   unsigned long prefix_value;
    483  1.1  christos   int   branch_found;
    484  1.1  christos   int   prefix_found;
    485  1.1  christos   int   invalid;
    486  1.1  christos   int   slot_needed;
    487  1.1  christos   int   delay_slot_pc_active;
    488  1.1  christos   int   xflag_found;
    489  1.1  christos   int   disable_interrupt;
    490  1.1  christos   int   byte_order;
    491  1.1  christos } inst_env_type;
    492  1.1  christos 
    493  1.1  christos /* Machine-dependencies in CRIS for opcodes.  */
    494  1.1  christos 
    495  1.1  christos /* Instruction sizes.  */
    496  1.1  christos enum cris_instruction_sizes
    497  1.1  christos {
    498  1.1  christos   INST_BYTE_SIZE  = 0,
    499  1.1  christos   INST_WORD_SIZE  = 1,
    500  1.1  christos   INST_DWORD_SIZE = 2
    501  1.1  christos };
    502  1.1  christos 
    503  1.1  christos /* Addressing modes.  */
    504  1.1  christos enum cris_addressing_modes
    505  1.1  christos {
    506  1.1  christos   REGISTER_MODE = 1,
    507  1.1  christos   INDIRECT_MODE = 2,
    508  1.1  christos   AUTOINC_MODE  = 3
    509  1.1  christos };
    510  1.1  christos 
    511  1.1  christos /* Prefix addressing modes.  */
    512  1.1  christos enum cris_prefix_addressing_modes
    513  1.1  christos {
    514  1.1  christos   PREFIX_INDEX_MODE  = 2,
    515  1.1  christos   PREFIX_ASSIGN_MODE = 3,
    516  1.1  christos 
    517  1.1  christos   /* Handle immediate byte offset addressing mode prefix format.  */
    518  1.1  christos   PREFIX_OFFSET_MODE = 2
    519  1.1  christos };
    520  1.1  christos 
    521  1.1  christos /* Masks for opcodes.  */
    522  1.1  christos enum cris_opcode_masks
    523  1.1  christos {
    524  1.1  christos   BRANCH_SIGNED_SHORT_OFFSET_MASK = 0x1,
    525  1.1  christos   SIGNED_EXTEND_BIT_MASK          = 0x2,
    526  1.1  christos   SIGNED_BYTE_MASK                = 0x80,
    527  1.1  christos   SIGNED_BYTE_EXTEND_MASK         = 0xFFFFFF00,
    528  1.1  christos   SIGNED_WORD_MASK                = 0x8000,
    529  1.1  christos   SIGNED_WORD_EXTEND_MASK         = 0xFFFF0000,
    530  1.1  christos   SIGNED_DWORD_MASK               = 0x80000000,
    531  1.1  christos   SIGNED_QUICK_VALUE_MASK         = 0x20,
    532  1.1  christos   SIGNED_QUICK_VALUE_EXTEND_MASK  = 0xFFFFFFC0
    533  1.1  christos };
    534  1.1  christos 
    535  1.1  christos /* Functions for opcodes.  The general form of the ETRAX 16-bit instruction:
    536  1.1  christos    Bit 15 - 12   Operand2
    537  1.1  christos        11 - 10   Mode
    538  1.1  christos         9 -  6   Opcode
    539  1.1  christos         5 -  4   Size
    540  1.1  christos         3 -  0   Operand1  */
    541  1.1  christos 
    542  1.1  christos static int
    543  1.1  christos cris_get_operand2 (unsigned short insn)
    544  1.1  christos {
    545  1.1  christos   return ((insn & 0xF000) >> 12);
    546  1.1  christos }
    547  1.1  christos 
    548  1.1  christos static int
    549  1.1  christos cris_get_mode (unsigned short insn)
    550  1.1  christos {
    551  1.1  christos   return ((insn & 0x0C00) >> 10);
    552  1.1  christos }
    553  1.1  christos 
    554  1.1  christos static int
    555  1.1  christos cris_get_opcode (unsigned short insn)
    556  1.1  christos {
    557  1.1  christos   return ((insn & 0x03C0) >> 6);
    558  1.1  christos }
    559  1.1  christos 
    560  1.1  christos static int
    561  1.1  christos cris_get_size (unsigned short insn)
    562  1.1  christos {
    563  1.1  christos   return ((insn & 0x0030) >> 4);
    564  1.1  christos }
    565  1.1  christos 
    566  1.1  christos static int
    567  1.1  christos cris_get_operand1 (unsigned short insn)
    568  1.1  christos {
    569  1.1  christos   return (insn & 0x000F);
    570  1.1  christos }
    571  1.1  christos 
    572  1.1  christos /* Additional functions in order to handle opcodes.  */
    573  1.1  christos 
    574  1.1  christos static int
    575  1.1  christos cris_get_quick_value (unsigned short insn)
    576  1.1  christos {
    577  1.1  christos   return (insn & 0x003F);
    578  1.1  christos }
    579  1.1  christos 
    580  1.1  christos static int
    581  1.1  christos cris_get_bdap_quick_offset (unsigned short insn)
    582  1.1  christos {
    583  1.1  christos   return (insn & 0x00FF);
    584  1.1  christos }
    585  1.1  christos 
    586  1.1  christos static int
    587  1.1  christos cris_get_branch_short_offset (unsigned short insn)
    588  1.1  christos {
    589  1.1  christos   return (insn & 0x00FF);
    590  1.1  christos }
    591  1.1  christos 
    592  1.1  christos static int
    593  1.1  christos cris_get_asr_shift_steps (unsigned long value)
    594  1.1  christos {
    595  1.1  christos   return (value & 0x3F);
    596  1.1  christos }
    597  1.1  christos 
    598  1.1  christos static int
    599  1.1  christos cris_get_clear_size (unsigned short insn)
    600  1.1  christos {
    601  1.1  christos   return ((insn) & 0xC000);
    602  1.1  christos }
    603  1.1  christos 
    604  1.1  christos static int
    605  1.1  christos cris_is_signed_extend_bit_on (unsigned short insn)
    606  1.1  christos {
    607  1.1  christos   return (((insn) & 0x20) == 0x20);
    608  1.1  christos }
    609  1.1  christos 
    610  1.1  christos static int
    611  1.1  christos cris_is_xflag_bit_on (unsigned short insn)
    612  1.1  christos {
    613  1.1  christos   return (((insn) & 0x1000) == 0x1000);
    614  1.1  christos }
    615  1.1  christos 
    616  1.1  christos static void
    617  1.1  christos cris_set_size_to_dword (unsigned short *insn)
    618  1.1  christos {
    619  1.1  christos   *insn &= 0xFFCF;
    620  1.1  christos   *insn |= 0x20;
    621  1.1  christos }
    622  1.1  christos 
    623  1.1  christos static signed char
    624  1.1  christos cris_get_signed_offset (unsigned short insn)
    625  1.1  christos {
    626  1.1  christos   return ((signed char) (insn & 0x00FF));
    627  1.1  christos }
    628  1.1  christos 
    629  1.1  christos /* Calls an op function given the op-type, working on the insn and the
    630  1.1  christos    inst_env.  */
    631  1.1  christos static void cris_gdb_func (struct gdbarch *, enum cris_op_type, unsigned short,
    632  1.1  christos 			   inst_env_type *);
    633  1.1  christos 
    634  1.1  christos static struct gdbarch *cris_gdbarch_init (struct gdbarch_info,
    635  1.1  christos                                           struct gdbarch_list *);
    636  1.1  christos 
    637  1.1  christos static void cris_dump_tdep (struct gdbarch *, struct ui_file *);
    638  1.1  christos 
    639  1.1  christos static void set_cris_version (char *ignore_args, int from_tty,
    640  1.1  christos 			      struct cmd_list_element *c);
    641  1.1  christos 
    642  1.1  christos static void set_cris_mode (char *ignore_args, int from_tty,
    643  1.1  christos 			   struct cmd_list_element *c);
    644  1.1  christos 
    645  1.1  christos static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty,
    646  1.1  christos 				 struct cmd_list_element *c);
    647  1.1  christos 
    648  1.1  christos static CORE_ADDR cris_scan_prologue (CORE_ADDR pc,
    649  1.1  christos 				     struct frame_info *this_frame,
    650  1.1  christos 				     struct cris_unwind_cache *info);
    651  1.1  christos 
    652  1.1  christos static CORE_ADDR crisv32_scan_prologue (CORE_ADDR pc,
    653  1.1  christos 					struct frame_info *this_frame,
    654  1.1  christos 					struct cris_unwind_cache *info);
    655  1.1  christos 
    656  1.1  christos static CORE_ADDR cris_unwind_pc (struct gdbarch *gdbarch,
    657  1.1  christos 				 struct frame_info *next_frame);
    658  1.1  christos 
    659  1.1  christos static CORE_ADDR cris_unwind_sp (struct gdbarch *gdbarch,
    660  1.1  christos 				 struct frame_info *next_frame);
    661  1.1  christos 
    662  1.1  christos /* When arguments must be pushed onto the stack, they go on in reverse
    663  1.1  christos    order.  The below implements a FILO (stack) to do this.
    664  1.1  christos    Copied from d10v-tdep.c.  */
    665  1.1  christos 
    666  1.1  christos struct stack_item
    667  1.1  christos {
    668  1.1  christos   int len;
    669  1.1  christos   struct stack_item *prev;
    670  1.1  christos   void *data;
    671  1.1  christos };
    672  1.1  christos 
    673  1.1  christos static struct stack_item *
    674  1.1  christos push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
    675  1.1  christos {
    676  1.1  christos   struct stack_item *si;
    677  1.1  christos   si = xmalloc (sizeof (struct stack_item));
    678  1.1  christos   si->data = xmalloc (len);
    679  1.1  christos   si->len = len;
    680  1.1  christos   si->prev = prev;
    681  1.1  christos   memcpy (si->data, contents, len);
    682  1.1  christos   return si;
    683  1.1  christos }
    684  1.1  christos 
    685  1.1  christos static struct stack_item *
    686  1.1  christos pop_stack_item (struct stack_item *si)
    687  1.1  christos {
    688  1.1  christos   struct stack_item *dead = si;
    689  1.1  christos   si = si->prev;
    690  1.1  christos   xfree (dead->data);
    691  1.1  christos   xfree (dead);
    692  1.1  christos   return si;
    693  1.1  christos }
    694  1.1  christos 
    695  1.1  christos /* Put here the code to store, into fi->saved_regs, the addresses of
    696  1.1  christos    the saved registers of frame described by FRAME_INFO.  This
    697  1.1  christos    includes special registers such as pc and fp saved in special ways
    698  1.1  christos    in the stack frame.  sp is even more special: the address we return
    699  1.1  christos    for it IS the sp for the next frame.  */
    700  1.1  christos 
    701  1.1  christos static struct cris_unwind_cache *
    702  1.1  christos cris_frame_unwind_cache (struct frame_info *this_frame,
    703  1.1  christos 			 void **this_prologue_cache)
    704  1.1  christos {
    705  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    706  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
    707  1.1  christos   struct cris_unwind_cache *info;
    708  1.1  christos 
    709  1.1  christos   if ((*this_prologue_cache))
    710  1.1  christos     return (*this_prologue_cache);
    711  1.1  christos 
    712  1.1  christos   info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache);
    713  1.1  christos   (*this_prologue_cache) = info;
    714  1.1  christos   info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
    715  1.1  christos 
    716  1.1  christos   /* Zero all fields.  */
    717  1.1  christos   info->prev_sp = 0;
    718  1.1  christos   info->base = 0;
    719  1.1  christos   info->size = 0;
    720  1.1  christos   info->sp_offset = 0;
    721  1.1  christos   info->r8_offset = 0;
    722  1.1  christos   info->uses_frame = 0;
    723  1.1  christos   info->return_pc = 0;
    724  1.1  christos   info->leaf_function = 0;
    725  1.1  christos 
    726  1.1  christos   /* Prologue analysis does the rest...  */
    727  1.1  christos   if (tdep->cris_version == 32)
    728  1.1  christos     crisv32_scan_prologue (get_frame_func (this_frame), this_frame, info);
    729  1.1  christos   else
    730  1.1  christos     cris_scan_prologue (get_frame_func (this_frame), this_frame, info);
    731  1.1  christos 
    732  1.1  christos   return info;
    733  1.1  christos }
    734  1.1  christos 
    735  1.1  christos /* Given a GDB frame, determine the address of the calling function's
    736  1.1  christos    frame.  This will be used to create a new GDB frame struct.  */
    737  1.1  christos 
    738  1.1  christos static void
    739  1.1  christos cris_frame_this_id (struct frame_info *this_frame,
    740  1.1  christos 		    void **this_prologue_cache,
    741  1.1  christos 		    struct frame_id *this_id)
    742  1.1  christos {
    743  1.1  christos   struct cris_unwind_cache *info
    744  1.1  christos     = cris_frame_unwind_cache (this_frame, this_prologue_cache);
    745  1.1  christos   CORE_ADDR base;
    746  1.1  christos   CORE_ADDR func;
    747  1.1  christos   struct frame_id id;
    748  1.1  christos 
    749  1.1  christos   /* The FUNC is easy.  */
    750  1.1  christos   func = get_frame_func (this_frame);
    751  1.1  christos 
    752  1.1  christos   /* Hopefully the prologue analysis either correctly determined the
    753  1.1  christos      frame's base (which is the SP from the previous frame), or set
    754  1.1  christos      that base to "NULL".  */
    755  1.1  christos   base = info->prev_sp;
    756  1.1  christos   if (base == 0)
    757  1.1  christos     return;
    758  1.1  christos 
    759  1.1  christos   id = frame_id_build (base, func);
    760  1.1  christos 
    761  1.1  christos   (*this_id) = id;
    762  1.1  christos }
    763  1.1  christos 
    764  1.1  christos static struct value *
    765  1.1  christos cris_frame_prev_register (struct frame_info *this_frame,
    766  1.1  christos 			  void **this_prologue_cache, int regnum)
    767  1.1  christos {
    768  1.1  christos   struct cris_unwind_cache *info
    769  1.1  christos     = cris_frame_unwind_cache (this_frame, this_prologue_cache);
    770  1.1  christos   return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
    771  1.1  christos }
    772  1.1  christos 
    773  1.1  christos /* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
    774  1.1  christos    frame.  The frame ID's base needs to match the TOS value saved by
    775  1.1  christos    save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint.  */
    776  1.1  christos 
    777  1.1  christos static struct frame_id
    778  1.1  christos cris_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
    779  1.1  christos {
    780  1.1  christos   CORE_ADDR sp;
    781  1.1  christos   sp = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
    782  1.1  christos   return frame_id_build (sp, get_frame_pc (this_frame));
    783  1.1  christos }
    784  1.1  christos 
    785  1.1  christos static CORE_ADDR
    786  1.1  christos cris_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
    787  1.1  christos {
    788  1.1  christos   /* Align to the size of an instruction (so that they can safely be
    789  1.1  christos      pushed onto the stack).  */
    790  1.1  christos   return sp & ~3;
    791  1.1  christos }
    792  1.1  christos 
    793  1.1  christos static CORE_ADDR
    794  1.1  christos cris_push_dummy_code (struct gdbarch *gdbarch,
    795  1.1  christos                       CORE_ADDR sp, CORE_ADDR funaddr,
    796  1.1  christos                       struct value **args, int nargs,
    797  1.1  christos                       struct type *value_type,
    798  1.1  christos                       CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
    799  1.1  christos 		      struct regcache *regcache)
    800  1.1  christos {
    801  1.1  christos   /* Allocate space sufficient for a breakpoint.  */
    802  1.1  christos   sp = (sp - 4) & ~3;
    803  1.1  christos   /* Store the address of that breakpoint */
    804  1.1  christos   *bp_addr = sp;
    805  1.1  christos   /* CRIS always starts the call at the callee's entry point.  */
    806  1.1  christos   *real_pc = funaddr;
    807  1.1  christos   return sp;
    808  1.1  christos }
    809  1.1  christos 
    810  1.1  christos static CORE_ADDR
    811  1.1  christos cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
    812  1.1  christos 		      struct regcache *regcache, CORE_ADDR bp_addr,
    813  1.1  christos 		      int nargs, struct value **args, CORE_ADDR sp,
    814  1.1  christos 		      int struct_return, CORE_ADDR struct_addr)
    815  1.1  christos {
    816  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    817  1.1  christos   int stack_offset;
    818  1.1  christos   int argreg;
    819  1.1  christos   int argnum;
    820  1.1  christos 
    821  1.1  christos   /* The function's arguments and memory allocated by gdb for the arguments to
    822  1.1  christos      point at reside in separate areas on the stack.
    823  1.1  christos      Both frame pointers grow toward higher addresses.  */
    824  1.1  christos   CORE_ADDR fp_arg;
    825  1.1  christos   CORE_ADDR fp_mem;
    826  1.1  christos 
    827  1.1  christos   struct stack_item *si = NULL;
    828  1.1  christos 
    829  1.1  christos   /* Push the return address.  */
    830  1.1  christos   regcache_cooked_write_unsigned (regcache, SRP_REGNUM, bp_addr);
    831  1.1  christos 
    832  1.1  christos   /* Are we returning a value using a structure return or a normal value
    833  1.1  christos      return?  struct_addr is the address of the reserved space for the return
    834  1.1  christos      structure to be written on the stack.  */
    835  1.1  christos   if (struct_return)
    836  1.1  christos     {
    837  1.1  christos       regcache_cooked_write_unsigned (regcache, STR_REGNUM, struct_addr);
    838  1.1  christos     }
    839  1.1  christos 
    840  1.1  christos   /* Now load as many as possible of the first arguments into registers,
    841  1.1  christos      and push the rest onto the stack.  */
    842  1.1  christos   argreg = ARG1_REGNUM;
    843  1.1  christos   stack_offset = 0;
    844  1.1  christos 
    845  1.1  christos   for (argnum = 0; argnum < nargs; argnum++)
    846  1.1  christos     {
    847  1.1  christos       int len;
    848  1.1  christos       const gdb_byte *val;
    849  1.1  christos       int reg_demand;
    850  1.1  christos       int i;
    851  1.1  christos 
    852  1.1  christos       len = TYPE_LENGTH (value_type (args[argnum]));
    853  1.1  christos       val = value_contents (args[argnum]);
    854  1.1  christos 
    855  1.1  christos       /* How may registers worth of storage do we need for this argument?  */
    856  1.1  christos       reg_demand = (len / 4) + (len % 4 != 0 ? 1 : 0);
    857  1.1  christos 
    858  1.1  christos       if (len <= (2 * 4) && (argreg + reg_demand - 1 <= ARG4_REGNUM))
    859  1.1  christos         {
    860  1.1  christos           /* Data passed by value.  Fits in available register(s).  */
    861  1.1  christos           for (i = 0; i < reg_demand; i++)
    862  1.1  christos             {
    863  1.1  christos               regcache_cooked_write (regcache, argreg, val);
    864  1.1  christos               argreg++;
    865  1.1  christos               val += 4;
    866  1.1  christos             }
    867  1.1  christos         }
    868  1.1  christos       else if (len <= (2 * 4) && argreg <= ARG4_REGNUM)
    869  1.1  christos         {
    870  1.1  christos           /* Data passed by value. Does not fit in available register(s).
    871  1.1  christos              Use the register(s) first, then the stack.  */
    872  1.1  christos           for (i = 0; i < reg_demand; i++)
    873  1.1  christos             {
    874  1.1  christos               if (argreg <= ARG4_REGNUM)
    875  1.1  christos                 {
    876  1.1  christos 		  regcache_cooked_write (regcache, argreg, val);
    877  1.1  christos                   argreg++;
    878  1.1  christos                   val += 4;
    879  1.1  christos                 }
    880  1.1  christos               else
    881  1.1  christos                 {
    882  1.1  christos 		  /* Push item for later so that pushed arguments
    883  1.1  christos 		     come in the right order.  */
    884  1.1  christos 		  si = push_stack_item (si, val, 4);
    885  1.1  christos                   val += 4;
    886  1.1  christos                 }
    887  1.1  christos             }
    888  1.1  christos         }
    889  1.1  christos       else if (len > (2 * 4))
    890  1.1  christos         {
    891  1.1  christos 	  /* Data passed by reference.  Push copy of data onto stack
    892  1.1  christos 	     and pass pointer to this copy as argument.  */
    893  1.1  christos 	  sp = (sp - len) & ~3;
    894  1.1  christos 	  write_memory (sp, val, len);
    895  1.1  christos 
    896  1.1  christos 	  if (argreg <= ARG4_REGNUM)
    897  1.1  christos 	    {
    898  1.1  christos 	      regcache_cooked_write_unsigned (regcache, argreg, sp);
    899  1.1  christos 	      argreg++;
    900  1.1  christos 	    }
    901  1.1  christos 	  else
    902  1.1  christos 	    {
    903  1.1  christos 	      gdb_byte buf[4];
    904  1.1  christos 	      store_unsigned_integer (buf, 4, byte_order, sp);
    905  1.1  christos 	      si = push_stack_item (si, buf, 4);
    906  1.1  christos 	    }
    907  1.1  christos         }
    908  1.1  christos       else
    909  1.1  christos         {
    910  1.1  christos           /* Data passed by value.  No available registers.  Put it on
    911  1.1  christos              the stack.  */
    912  1.1  christos 	   si = push_stack_item (si, val, len);
    913  1.1  christos         }
    914  1.1  christos     }
    915  1.1  christos 
    916  1.1  christos   while (si)
    917  1.1  christos     {
    918  1.1  christos       /* fp_arg must be word-aligned (i.e., don't += len) to match
    919  1.1  christos 	 the function prologue.  */
    920  1.1  christos       sp = (sp - si->len) & ~3;
    921  1.1  christos       write_memory (sp, si->data, si->len);
    922  1.1  christos       si = pop_stack_item (si);
    923  1.1  christos     }
    924  1.1  christos 
    925  1.1  christos   /* Finally, update the SP register.  */
    926  1.1  christos   regcache_cooked_write_unsigned (regcache, gdbarch_sp_regnum (gdbarch), sp);
    927  1.1  christos 
    928  1.1  christos   return sp;
    929  1.1  christos }
    930  1.1  christos 
    931  1.1  christos static const struct frame_unwind cris_frame_unwind =
    932  1.1  christos {
    933  1.1  christos   NORMAL_FRAME,
    934  1.1  christos   default_frame_unwind_stop_reason,
    935  1.1  christos   cris_frame_this_id,
    936  1.1  christos   cris_frame_prev_register,
    937  1.1  christos   NULL,
    938  1.1  christos   default_frame_sniffer
    939  1.1  christos };
    940  1.1  christos 
    941  1.1  christos static CORE_ADDR
    942  1.1  christos cris_frame_base_address (struct frame_info *this_frame, void **this_cache)
    943  1.1  christos {
    944  1.1  christos   struct cris_unwind_cache *info
    945  1.1  christos     = cris_frame_unwind_cache (this_frame, this_cache);
    946  1.1  christos   return info->base;
    947  1.1  christos }
    948  1.1  christos 
    949  1.1  christos static const struct frame_base cris_frame_base =
    950  1.1  christos {
    951  1.1  christos   &cris_frame_unwind,
    952  1.1  christos   cris_frame_base_address,
    953  1.1  christos   cris_frame_base_address,
    954  1.1  christos   cris_frame_base_address
    955  1.1  christos };
    956  1.1  christos 
    957  1.1  christos /* Frames information. The definition of the struct frame_info is
    958  1.1  christos 
    959  1.1  christos    CORE_ADDR frame
    960  1.1  christos    CORE_ADDR pc
    961  1.1  christos    enum frame_type type;
    962  1.1  christos    CORE_ADDR return_pc
    963  1.1  christos    int leaf_function
    964  1.1  christos 
    965  1.1  christos    If the compilation option -fno-omit-frame-pointer is present the
    966  1.1  christos    variable frame will be set to the content of R8 which is the frame
    967  1.1  christos    pointer register.
    968  1.1  christos 
    969  1.1  christos    The variable pc contains the address where execution is performed
    970  1.1  christos    in the present frame.  The innermost frame contains the current content
    971  1.1  christos    of the register PC.  All other frames contain the content of the
    972  1.1  christos    register PC in the next frame.
    973  1.1  christos 
    974  1.1  christos    The variable `type' indicates the frame's type: normal, SIGTRAMP
    975  1.1  christos    (associated with a signal handler), dummy (associated with a dummy
    976  1.1  christos    frame).
    977  1.1  christos 
    978  1.1  christos    The variable return_pc contains the address where execution should be
    979  1.1  christos    resumed when the present frame has finished, the return address.
    980  1.1  christos 
    981  1.1  christos    The variable leaf_function is 1 if the return address is in the register
    982  1.1  christos    SRP, and 0 if it is on the stack.
    983  1.1  christos 
    984  1.1  christos    Prologue instructions C-code.
    985  1.1  christos    The prologue may consist of (-fno-omit-frame-pointer)
    986  1.1  christos    1)                2)
    987  1.1  christos    push   srp
    988  1.1  christos    push   r8         push   r8
    989  1.1  christos    move.d sp,r8      move.d sp,r8
    990  1.1  christos    subq   X,sp       subq   X,sp
    991  1.1  christos    movem  rY,[sp]    movem  rY,[sp]
    992  1.1  christos    move.S rZ,[r8-U]  move.S rZ,[r8-U]
    993  1.1  christos 
    994  1.1  christos    where 1 is a non-terminal function, and 2 is a leaf-function.
    995  1.1  christos 
    996  1.1  christos    Note that this assumption is extremely brittle, and will break at the
    997  1.1  christos    slightest change in GCC's prologue.
    998  1.1  christos 
    999  1.1  christos    If local variables are declared or register contents are saved on stack
   1000  1.1  christos    the subq-instruction will be present with X as the number of bytes
   1001  1.1  christos    needed for storage.  The reshuffle with respect to r8 may be performed
   1002  1.1  christos    with any size S (b, w, d) and any of the general registers Z={0..13}.
   1003  1.1  christos    The offset U should be representable by a signed 8-bit value in all cases.
   1004  1.1  christos    Thus, the prefix word is assumed to be immediate byte offset mode followed
   1005  1.1  christos    by another word containing the instruction.
   1006  1.1  christos 
   1007  1.1  christos    Degenerate cases:
   1008  1.1  christos    3)
   1009  1.1  christos    push   r8
   1010  1.1  christos    move.d sp,r8
   1011  1.1  christos    move.d r8,sp
   1012  1.1  christos    pop    r8
   1013  1.1  christos 
   1014  1.1  christos    Prologue instructions C++-code.
   1015  1.1  christos    Case 1) and 2) in the C-code may be followed by
   1016  1.1  christos 
   1017  1.1  christos    move.d r10,rS    ; this
   1018  1.1  christos    move.d r11,rT    ; P1
   1019  1.1  christos    move.d r12,rU    ; P2
   1020  1.1  christos    move.d r13,rV    ; P3
   1021  1.1  christos    move.S [r8+U],rZ ; P4
   1022  1.1  christos 
   1023  1.1  christos    if any of the call parameters are stored.  The host expects these
   1024  1.1  christos    instructions to be executed in order to get the call parameters right.  */
   1025  1.1  christos 
   1026  1.1  christos /* Examine the prologue of a function.  The variable ip is the address of
   1027  1.1  christos    the first instruction of the prologue.  The variable limit is the address
   1028  1.1  christos    of the first instruction after the prologue.  The variable fi contains the
   1029  1.1  christos    information in struct frame_info.  The variable frameless_p controls whether
   1030  1.1  christos    the entire prologue is examined (0) or just enough instructions to
   1031  1.1  christos    determine that it is a prologue (1).  */
   1032  1.1  christos 
   1033  1.1  christos static CORE_ADDR
   1034  1.1  christos cris_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
   1035  1.1  christos 		    struct cris_unwind_cache *info)
   1036  1.1  christos {
   1037  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   1038  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1039  1.1  christos 
   1040  1.1  christos   /* Present instruction.  */
   1041  1.1  christos   unsigned short insn;
   1042  1.1  christos 
   1043  1.1  christos   /* Next instruction, lookahead.  */
   1044  1.1  christos   unsigned short insn_next;
   1045  1.1  christos   int regno;
   1046  1.1  christos 
   1047  1.1  christos   /* Is there a push fp?  */
   1048  1.1  christos   int have_fp;
   1049  1.1  christos 
   1050  1.1  christos   /* Number of byte on stack used for local variables and movem.  */
   1051  1.1  christos   int val;
   1052  1.1  christos 
   1053  1.1  christos   /* Highest register number in a movem.  */
   1054  1.1  christos   int regsave;
   1055  1.1  christos 
   1056  1.1  christos   /* move.d r<source_register>,rS */
   1057  1.1  christos   short source_register;
   1058  1.1  christos 
   1059  1.1  christos   /* Scan limit.  */
   1060  1.1  christos   int limit;
   1061  1.1  christos 
   1062  1.1  christos   /* This frame is with respect to a leaf until a push srp is found.  */
   1063  1.1  christos   if (info)
   1064  1.1  christos     {
   1065  1.1  christos       info->leaf_function = 1;
   1066  1.1  christos     }
   1067  1.1  christos 
   1068  1.1  christos   /* Assume nothing on stack.  */
   1069  1.1  christos   val = 0;
   1070  1.1  christos   regsave = -1;
   1071  1.1  christos 
   1072  1.1  christos   /* If we were called without a this_frame, that means we were called
   1073  1.1  christos      from cris_skip_prologue which already tried to find the end of the
   1074  1.1  christos      prologue through the symbol information.  64 instructions past current
   1075  1.1  christos      pc is arbitrarily chosen, but at least it means we'll stop eventually.  */
   1076  1.1  christos   limit = this_frame ? get_frame_pc (this_frame) : pc + 64;
   1077  1.1  christos 
   1078  1.1  christos   /* Find the prologue instructions.  */
   1079  1.1  christos   while (pc > 0 && pc < limit)
   1080  1.1  christos     {
   1081  1.1  christos       insn = read_memory_unsigned_integer (pc, 2, byte_order);
   1082  1.1  christos       pc += 2;
   1083  1.1  christos       if (insn == 0xE1FC)
   1084  1.1  christos         {
   1085  1.1  christos           /* push <reg> 32 bit instruction.  */
   1086  1.1  christos           insn_next = read_memory_unsigned_integer (pc, 2, byte_order);
   1087  1.1  christos           pc += 2;
   1088  1.1  christos           regno = cris_get_operand2 (insn_next);
   1089  1.1  christos 	  if (info)
   1090  1.1  christos 	    {
   1091  1.1  christos 	      info->sp_offset += 4;
   1092  1.1  christos 	    }
   1093  1.1  christos           /* This check, meant to recognize srp, used to be regno ==
   1094  1.1  christos              (SRP_REGNUM - NUM_GENREGS), but that covers r11 also.  */
   1095  1.1  christos           if (insn_next == 0xBE7E)
   1096  1.1  christos             {
   1097  1.1  christos 	      if (info)
   1098  1.1  christos 		{
   1099  1.1  christos 		  info->leaf_function = 0;
   1100  1.1  christos 		}
   1101  1.1  christos             }
   1102  1.1  christos 	  else if (insn_next == 0x8FEE)
   1103  1.1  christos             {
   1104  1.1  christos 	      /* push $r8 */
   1105  1.1  christos 	      if (info)
   1106  1.1  christos 		{
   1107  1.1  christos 		  info->r8_offset = info->sp_offset;
   1108  1.1  christos 		}
   1109  1.1  christos             }
   1110  1.1  christos         }
   1111  1.1  christos       else if (insn == 0x866E)
   1112  1.1  christos         {
   1113  1.1  christos           /* move.d sp,r8 */
   1114  1.1  christos 	  if (info)
   1115  1.1  christos 	    {
   1116  1.1  christos 	      info->uses_frame = 1;
   1117  1.1  christos 	    }
   1118  1.1  christos           continue;
   1119  1.1  christos         }
   1120  1.1  christos       else if (cris_get_operand2 (insn) == gdbarch_sp_regnum (gdbarch)
   1121  1.1  christos                && cris_get_mode (insn) == 0x0000
   1122  1.1  christos                && cris_get_opcode (insn) == 0x000A)
   1123  1.1  christos         {
   1124  1.1  christos           /* subq <val>,sp */
   1125  1.1  christos 	  if (info)
   1126  1.1  christos 	    {
   1127  1.1  christos 	      info->sp_offset += cris_get_quick_value (insn);
   1128  1.1  christos 	    }
   1129  1.1  christos         }
   1130  1.1  christos       else if (cris_get_mode (insn) == 0x0002
   1131  1.1  christos                && cris_get_opcode (insn) == 0x000F
   1132  1.1  christos                && cris_get_size (insn) == 0x0003
   1133  1.1  christos                && cris_get_operand1 (insn) == gdbarch_sp_regnum (gdbarch))
   1134  1.1  christos         {
   1135  1.1  christos           /* movem r<regsave>,[sp] */
   1136  1.1  christos           regsave = cris_get_operand2 (insn);
   1137  1.1  christos         }
   1138  1.1  christos       else if (cris_get_operand2 (insn) == gdbarch_sp_regnum (gdbarch)
   1139  1.1  christos                && ((insn & 0x0F00) >> 8) == 0x0001
   1140  1.1  christos                && (cris_get_signed_offset (insn) < 0))
   1141  1.1  christos         {
   1142  1.1  christos           /* Immediate byte offset addressing prefix word with sp as base
   1143  1.1  christos              register.  Used for CRIS v8 i.e. ETRAX 100 and newer if <val>
   1144  1.1  christos              is between 64 and 128.
   1145  1.1  christos              movem r<regsave>,[sp=sp-<val>] */
   1146  1.1  christos 	  if (info)
   1147  1.1  christos 	    {
   1148  1.1  christos 	      info->sp_offset += -cris_get_signed_offset (insn);
   1149  1.1  christos 	    }
   1150  1.1  christos 	  insn_next = read_memory_unsigned_integer (pc, 2, byte_order);
   1151  1.1  christos           pc += 2;
   1152  1.1  christos           if (cris_get_mode (insn_next) == PREFIX_ASSIGN_MODE
   1153  1.1  christos               && cris_get_opcode (insn_next) == 0x000F
   1154  1.1  christos               && cris_get_size (insn_next) == 0x0003
   1155  1.1  christos               && cris_get_operand1 (insn_next) == gdbarch_sp_regnum
   1156  1.1  christos 						  (gdbarch))
   1157  1.1  christos             {
   1158  1.1  christos               regsave = cris_get_operand2 (insn_next);
   1159  1.1  christos             }
   1160  1.1  christos           else
   1161  1.1  christos             {
   1162  1.1  christos               /* The prologue ended before the limit was reached.  */
   1163  1.1  christos               pc -= 4;
   1164  1.1  christos               break;
   1165  1.1  christos             }
   1166  1.1  christos         }
   1167  1.1  christos       else if (cris_get_mode (insn) == 0x0001
   1168  1.1  christos                && cris_get_opcode (insn) == 0x0009
   1169  1.1  christos                && cris_get_size (insn) == 0x0002)
   1170  1.1  christos         {
   1171  1.1  christos           /* move.d r<10..13>,r<0..15> */
   1172  1.1  christos           source_register = cris_get_operand1 (insn);
   1173  1.1  christos 
   1174  1.1  christos           /* FIXME?  In the glibc solibs, the prologue might contain something
   1175  1.1  christos              like (this example taken from relocate_doit):
   1176  1.1  christos              move.d $pc,$r0
   1177  1.1  christos              sub.d 0xfffef426,$r0
   1178  1.1  christos              which isn't covered by the source_register check below.  Question
   1179  1.1  christos              is whether to add a check for this combo, or make better use of
   1180  1.1  christos              the limit variable instead.  */
   1181  1.1  christos           if (source_register < ARG1_REGNUM || source_register > ARG4_REGNUM)
   1182  1.1  christos             {
   1183  1.1  christos               /* The prologue ended before the limit was reached.  */
   1184  1.1  christos               pc -= 2;
   1185  1.1  christos               break;
   1186  1.1  christos             }
   1187  1.1  christos         }
   1188  1.1  christos       else if (cris_get_operand2 (insn) == CRIS_FP_REGNUM
   1189  1.1  christos                /* The size is a fixed-size.  */
   1190  1.1  christos                && ((insn & 0x0F00) >> 8) == 0x0001
   1191  1.1  christos                /* A negative offset.  */
   1192  1.1  christos                && (cris_get_signed_offset (insn) < 0))
   1193  1.1  christos         {
   1194  1.1  christos           /* move.S rZ,[r8-U] (?) */
   1195  1.1  christos           insn_next = read_memory_unsigned_integer (pc, 2, byte_order);
   1196  1.1  christos           pc += 2;
   1197  1.1  christos           regno = cris_get_operand2 (insn_next);
   1198  1.1  christos           if ((regno >= 0 && regno < gdbarch_sp_regnum (gdbarch))
   1199  1.1  christos               && cris_get_mode (insn_next) == PREFIX_OFFSET_MODE
   1200  1.1  christos               && cris_get_opcode (insn_next) == 0x000F)
   1201  1.1  christos             {
   1202  1.1  christos               /* move.S rZ,[r8-U] */
   1203  1.1  christos               continue;
   1204  1.1  christos             }
   1205  1.1  christos           else
   1206  1.1  christos             {
   1207  1.1  christos               /* The prologue ended before the limit was reached.  */
   1208  1.1  christos               pc -= 4;
   1209  1.1  christos               break;
   1210  1.1  christos             }
   1211  1.1  christos         }
   1212  1.1  christos       else if (cris_get_operand2 (insn) == CRIS_FP_REGNUM
   1213  1.1  christos                /* The size is a fixed-size.  */
   1214  1.1  christos                && ((insn & 0x0F00) >> 8) == 0x0001
   1215  1.1  christos                /* A positive offset.  */
   1216  1.1  christos                && (cris_get_signed_offset (insn) > 0))
   1217  1.1  christos         {
   1218  1.1  christos           /* move.S [r8+U],rZ (?) */
   1219  1.1  christos 	  insn_next = read_memory_unsigned_integer (pc, 2, byte_order);
   1220  1.1  christos           pc += 2;
   1221  1.1  christos           regno = cris_get_operand2 (insn_next);
   1222  1.1  christos           if ((regno >= 0 && regno < gdbarch_sp_regnum (gdbarch))
   1223  1.1  christos               && cris_get_mode (insn_next) == PREFIX_OFFSET_MODE
   1224  1.1  christos               && cris_get_opcode (insn_next) == 0x0009
   1225  1.1  christos               && cris_get_operand1 (insn_next) == regno)
   1226  1.1  christos             {
   1227  1.1  christos               /* move.S [r8+U],rZ */
   1228  1.1  christos               continue;
   1229  1.1  christos             }
   1230  1.1  christos           else
   1231  1.1  christos             {
   1232  1.1  christos               /* The prologue ended before the limit was reached.  */
   1233  1.1  christos               pc -= 4;
   1234  1.1  christos               break;
   1235  1.1  christos             }
   1236  1.1  christos         }
   1237  1.1  christos       else
   1238  1.1  christos         {
   1239  1.1  christos           /* The prologue ended before the limit was reached.  */
   1240  1.1  christos           pc -= 2;
   1241  1.1  christos           break;
   1242  1.1  christos         }
   1243  1.1  christos     }
   1244  1.1  christos 
   1245  1.1  christos   /* We only want to know the end of the prologue when this_frame and info
   1246  1.1  christos      are NULL (called from cris_skip_prologue i.e.).  */
   1247  1.1  christos   if (this_frame == NULL && info == NULL)
   1248  1.1  christos     {
   1249  1.1  christos       return pc;
   1250  1.1  christos     }
   1251  1.1  christos 
   1252  1.1  christos   info->size = info->sp_offset;
   1253  1.1  christos 
   1254  1.1  christos   /* Compute the previous frame's stack pointer (which is also the
   1255  1.1  christos      frame's ID's stack address), and this frame's base pointer.  */
   1256  1.1  christos   if (info->uses_frame)
   1257  1.1  christos     {
   1258  1.1  christos       ULONGEST this_base;
   1259  1.1  christos       /* The SP was moved to the FP.  This indicates that a new frame
   1260  1.1  christos          was created.  Get THIS frame's FP value by unwinding it from
   1261  1.1  christos          the next frame.  */
   1262  1.1  christos       this_base = get_frame_register_unsigned (this_frame, CRIS_FP_REGNUM);
   1263  1.1  christos       info->base = this_base;
   1264  1.1  christos       info->saved_regs[CRIS_FP_REGNUM].addr = info->base;
   1265  1.1  christos 
   1266  1.1  christos       /* The FP points at the last saved register.  Adjust the FP back
   1267  1.1  christos          to before the first saved register giving the SP.  */
   1268  1.1  christos       info->prev_sp = info->base + info->r8_offset;
   1269  1.1  christos     }
   1270  1.1  christos   else
   1271  1.1  christos     {
   1272  1.1  christos       ULONGEST this_base;
   1273  1.1  christos       /* Assume that the FP is this frame's SP but with that pushed
   1274  1.1  christos          stack space added back.  */
   1275  1.1  christos       this_base = get_frame_register_unsigned (this_frame,
   1276  1.1  christos 					       gdbarch_sp_regnum (gdbarch));
   1277  1.1  christos       info->base = this_base;
   1278  1.1  christos       info->prev_sp = info->base + info->size;
   1279  1.1  christos     }
   1280  1.1  christos 
   1281  1.1  christos   /* Calculate the addresses for the saved registers on the stack.  */
   1282  1.1  christos   /* FIXME: The address calculation should really be done on the fly while
   1283  1.1  christos      we're analyzing the prologue (we only hold one regsave value as it is
   1284  1.1  christos      now).  */
   1285  1.1  christos   val = info->sp_offset;
   1286  1.1  christos 
   1287  1.1  christos   for (regno = regsave; regno >= 0; regno--)
   1288  1.1  christos     {
   1289  1.1  christos       info->saved_regs[regno].addr = info->base + info->r8_offset - val;
   1290  1.1  christos       val -= 4;
   1291  1.1  christos     }
   1292  1.1  christos 
   1293  1.1  christos   /* The previous frame's SP needed to be computed.  Save the computed
   1294  1.1  christos      value.  */
   1295  1.1  christos   trad_frame_set_value (info->saved_regs,
   1296  1.1  christos 			gdbarch_sp_regnum (gdbarch), info->prev_sp);
   1297  1.1  christos 
   1298  1.1  christos   if (!info->leaf_function)
   1299  1.1  christos     {
   1300  1.1  christos       /* SRP saved on the stack.  But where?  */
   1301  1.1  christos       if (info->r8_offset == 0)
   1302  1.1  christos 	{
   1303  1.1  christos 	  /* R8 not pushed yet.  */
   1304  1.1  christos 	  info->saved_regs[SRP_REGNUM].addr = info->base;
   1305  1.1  christos 	}
   1306  1.1  christos       else
   1307  1.1  christos 	{
   1308  1.1  christos 	  /* R8 pushed, but SP may or may not be moved to R8 yet.  */
   1309  1.1  christos 	  info->saved_regs[SRP_REGNUM].addr = info->base + 4;
   1310  1.1  christos 	}
   1311  1.1  christos     }
   1312  1.1  christos 
   1313  1.1  christos   /* The PC is found in SRP (the actual register or located on the stack).  */
   1314  1.1  christos   info->saved_regs[gdbarch_pc_regnum (gdbarch)]
   1315  1.1  christos     = info->saved_regs[SRP_REGNUM];
   1316  1.1  christos 
   1317  1.1  christos   return pc;
   1318  1.1  christos }
   1319  1.1  christos 
   1320  1.1  christos static CORE_ADDR
   1321  1.1  christos crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
   1322  1.1  christos 		    struct cris_unwind_cache *info)
   1323  1.1  christos {
   1324  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   1325  1.1  christos   ULONGEST this_base;
   1326  1.1  christos 
   1327  1.1  christos   /* Unlike the CRISv10 prologue scanner (cris_scan_prologue), this is not
   1328  1.1  christos      meant to be a full-fledged prologue scanner.  It is only needed for
   1329  1.1  christos      the cases where we end up in code always lacking DWARF-2 CFI, notably:
   1330  1.1  christos 
   1331  1.1  christos        * PLT stubs (library calls)
   1332  1.1  christos        * call dummys
   1333  1.1  christos        * signal trampolines
   1334  1.1  christos 
   1335  1.1  christos      For those cases, it is assumed that there is no actual prologue; that
   1336  1.1  christos      the stack pointer is not adjusted, and (as a consequence) the return
   1337  1.1  christos      address is not pushed onto the stack.  */
   1338  1.1  christos 
   1339  1.1  christos   /* We only want to know the end of the prologue when this_frame and info
   1340  1.1  christos      are NULL (called from cris_skip_prologue i.e.).  */
   1341  1.1  christos   if (this_frame == NULL && info == NULL)
   1342  1.1  christos     {
   1343  1.1  christos       return pc;
   1344  1.1  christos     }
   1345  1.1  christos 
   1346  1.1  christos   /* The SP is assumed to be unaltered.  */
   1347  1.1  christos   this_base = get_frame_register_unsigned (this_frame,
   1348  1.1  christos 					   gdbarch_sp_regnum (gdbarch));
   1349  1.1  christos   info->base = this_base;
   1350  1.1  christos   info->prev_sp = this_base;
   1351  1.1  christos 
   1352  1.1  christos   /* The PC is assumed to be found in SRP.  */
   1353  1.1  christos   info->saved_regs[gdbarch_pc_regnum (gdbarch)]
   1354  1.1  christos     = info->saved_regs[SRP_REGNUM];
   1355  1.1  christos 
   1356  1.1  christos   return pc;
   1357  1.1  christos }
   1358  1.1  christos 
   1359  1.1  christos /* Advance pc beyond any function entry prologue instructions at pc
   1360  1.1  christos    to reach some "real" code.  */
   1361  1.1  christos 
   1362  1.1  christos /* Given a PC value corresponding to the start of a function, return the PC
   1363  1.1  christos    of the first instruction after the function prologue.  */
   1364  1.1  christos 
   1365  1.1  christos static CORE_ADDR
   1366  1.1  christos cris_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
   1367  1.1  christos {
   1368  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   1369  1.1  christos   CORE_ADDR func_addr, func_end;
   1370  1.1  christos   struct symtab_and_line sal;
   1371  1.1  christos   CORE_ADDR pc_after_prologue;
   1372  1.1  christos 
   1373  1.1  christos   /* If we have line debugging information, then the end of the prologue
   1374  1.1  christos      should the first assembly instruction of the first source line.  */
   1375  1.1  christos   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
   1376  1.1  christos     {
   1377  1.1  christos       sal = find_pc_line (func_addr, 0);
   1378  1.1  christos       if (sal.end > 0 && sal.end < func_end)
   1379  1.1  christos 	return sal.end;
   1380  1.1  christos     }
   1381  1.1  christos 
   1382  1.1  christos   if (tdep->cris_version == 32)
   1383  1.1  christos     pc_after_prologue = crisv32_scan_prologue (pc, NULL, NULL);
   1384  1.1  christos   else
   1385  1.1  christos     pc_after_prologue = cris_scan_prologue (pc, NULL, NULL);
   1386  1.1  christos 
   1387  1.1  christos   return pc_after_prologue;
   1388  1.1  christos }
   1389  1.1  christos 
   1390  1.1  christos static CORE_ADDR
   1391  1.1  christos cris_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
   1392  1.1  christos {
   1393  1.1  christos   ULONGEST pc;
   1394  1.1  christos   pc = frame_unwind_register_unsigned (next_frame,
   1395  1.1  christos 				       gdbarch_pc_regnum (gdbarch));
   1396  1.1  christos   return pc;
   1397  1.1  christos }
   1398  1.1  christos 
   1399  1.1  christos static CORE_ADDR
   1400  1.1  christos cris_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
   1401  1.1  christos {
   1402  1.1  christos   ULONGEST sp;
   1403  1.1  christos   sp = frame_unwind_register_unsigned (next_frame,
   1404  1.1  christos 				       gdbarch_sp_regnum (gdbarch));
   1405  1.1  christos   return sp;
   1406  1.1  christos }
   1407  1.1  christos 
   1408  1.1  christos /* Use the program counter to determine the contents and size of a breakpoint
   1409  1.1  christos    instruction.  It returns a pointer to a string of bytes that encode a
   1410  1.1  christos    breakpoint instruction, stores the length of the string to *lenptr, and
   1411  1.1  christos    adjusts pcptr (if necessary) to point to the actual memory location where
   1412  1.1  christos    the breakpoint should be inserted.  */
   1413  1.1  christos 
   1414  1.1  christos static const unsigned char *
   1415  1.1  christos cris_breakpoint_from_pc (struct gdbarch *gdbarch,
   1416  1.1  christos 			 CORE_ADDR *pcptr, int *lenptr)
   1417  1.1  christos {
   1418  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   1419  1.1  christos   static unsigned char break8_insn[] = {0x38, 0xe9};
   1420  1.1  christos   static unsigned char break15_insn[] = {0x3f, 0xe9};
   1421  1.1  christos   *lenptr = 2;
   1422  1.1  christos 
   1423  1.1  christos   if (tdep->cris_mode == cris_mode_guru)
   1424  1.1  christos     return break15_insn;
   1425  1.1  christos   else
   1426  1.1  christos     return break8_insn;
   1427  1.1  christos }
   1428  1.1  christos 
   1429  1.1  christos /* Returns 1 if spec_reg is applicable to the current gdbarch's CRIS version,
   1430  1.1  christos    0 otherwise.  */
   1431  1.1  christos 
   1432  1.1  christos static int
   1433  1.1  christos cris_spec_reg_applicable (struct gdbarch *gdbarch,
   1434  1.1  christos 			  struct cris_spec_reg spec_reg)
   1435  1.1  christos {
   1436  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   1437  1.1  christos   unsigned int version = tdep->cris_version;
   1438  1.1  christos 
   1439  1.1  christos   switch (spec_reg.applicable_version)
   1440  1.1  christos     {
   1441  1.1  christos     case cris_ver_version_all:
   1442  1.1  christos       return 1;
   1443  1.1  christos     case cris_ver_warning:
   1444  1.1  christos       /* Indeterminate/obsolete.  */
   1445  1.1  christos       return 0;
   1446  1.1  christos     case cris_ver_v0_3:
   1447  1.1  christos       return (version >= 0 && version <= 3);
   1448  1.1  christos     case cris_ver_v3p:
   1449  1.1  christos       return (version >= 3);
   1450  1.1  christos     case cris_ver_v8:
   1451  1.1  christos       return (version == 8 || version == 9);
   1452  1.1  christos     case cris_ver_v8p:
   1453  1.1  christos       return (version >= 8);
   1454  1.1  christos     case cris_ver_v0_10:
   1455  1.1  christos       return (version >= 0 && version <= 10);
   1456  1.1  christos     case cris_ver_v3_10:
   1457  1.1  christos       return (version >= 3 && version <= 10);
   1458  1.1  christos     case cris_ver_v8_10:
   1459  1.1  christos       return (version >= 8 && version <= 10);
   1460  1.1  christos     case cris_ver_v10:
   1461  1.1  christos       return (version == 10);
   1462  1.1  christos     case cris_ver_v10p:
   1463  1.1  christos       return (version >= 10);
   1464  1.1  christos     case cris_ver_v32p:
   1465  1.1  christos       return (version >= 32);
   1466  1.1  christos     default:
   1467  1.1  christos       /* Invalid cris version.  */
   1468  1.1  christos       return 0;
   1469  1.1  christos     }
   1470  1.1  christos }
   1471  1.1  christos 
   1472  1.1  christos /* Returns the register size in unit byte.  Returns 0 for an unimplemented
   1473  1.1  christos    register, -1 for an invalid register.  */
   1474  1.1  christos 
   1475  1.1  christos static int
   1476  1.1  christos cris_register_size (struct gdbarch *gdbarch, int regno)
   1477  1.1  christos {
   1478  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   1479  1.1  christos   int i;
   1480  1.1  christos   int spec_regno;
   1481  1.1  christos 
   1482  1.1  christos   if (regno >= 0 && regno < NUM_GENREGS)
   1483  1.1  christos     {
   1484  1.1  christos       /* General registers (R0 - R15) are 32 bits.  */
   1485  1.1  christos       return 4;
   1486  1.1  christos     }
   1487  1.1  christos   else if (regno >= NUM_GENREGS && regno < (NUM_GENREGS + NUM_SPECREGS))
   1488  1.1  christos     {
   1489  1.1  christos       /* Special register (R16 - R31).  cris_spec_regs is zero-based.
   1490  1.1  christos          Adjust regno accordingly.  */
   1491  1.1  christos       spec_regno = regno - NUM_GENREGS;
   1492  1.1  christos 
   1493  1.1  christos       for (i = 0; cris_spec_regs[i].name != NULL; i++)
   1494  1.1  christos         {
   1495  1.1  christos           if (cris_spec_regs[i].number == spec_regno
   1496  1.1  christos               && cris_spec_reg_applicable (gdbarch, cris_spec_regs[i]))
   1497  1.1  christos             /* Go with the first applicable register.  */
   1498  1.1  christos             return cris_spec_regs[i].reg_size;
   1499  1.1  christos         }
   1500  1.1  christos       /* Special register not applicable to this CRIS version.  */
   1501  1.1  christos       return 0;
   1502  1.1  christos     }
   1503  1.1  christos   else if (regno >= gdbarch_pc_regnum (gdbarch)
   1504  1.1  christos 	   && regno < gdbarch_num_regs (gdbarch))
   1505  1.1  christos     {
   1506  1.1  christos       /* This will apply to CRISv32 only where there are additional registers
   1507  1.1  christos 	 after the special registers (pseudo PC and support registers).  */
   1508  1.1  christos       return 4;
   1509  1.1  christos     }
   1510  1.1  christos 
   1511  1.1  christos 
   1512  1.1  christos   return -1;
   1513  1.1  christos }
   1514  1.1  christos 
   1515  1.1  christos /* Nonzero if regno should not be fetched from the target.  This is the case
   1516  1.1  christos    for unimplemented (size 0) and non-existant registers.  */
   1517  1.1  christos 
   1518  1.1  christos static int
   1519  1.1  christos cris_cannot_fetch_register (struct gdbarch *gdbarch, int regno)
   1520  1.1  christos {
   1521  1.1  christos   return ((regno < 0 || regno >= gdbarch_num_regs (gdbarch))
   1522  1.1  christos           || (cris_register_size (gdbarch, regno) == 0));
   1523  1.1  christos }
   1524  1.1  christos 
   1525  1.1  christos /* Nonzero if regno should not be written to the target, for various
   1526  1.1  christos    reasons.  */
   1527  1.1  christos 
   1528  1.1  christos static int
   1529  1.1  christos cris_cannot_store_register (struct gdbarch *gdbarch, int regno)
   1530  1.1  christos {
   1531  1.1  christos   /* There are three kinds of registers we refuse to write to.
   1532  1.1  christos      1. Those that not implemented.
   1533  1.1  christos      2. Those that are read-only (depends on the processor mode).
   1534  1.1  christos      3. Those registers to which a write has no effect.  */
   1535  1.1  christos 
   1536  1.1  christos   if (regno < 0
   1537  1.1  christos       || regno >= gdbarch_num_regs (gdbarch)
   1538  1.1  christos       || cris_register_size (gdbarch, regno) == 0)
   1539  1.1  christos     /* Not implemented.  */
   1540  1.1  christos     return 1;
   1541  1.1  christos 
   1542  1.1  christos   else if  (regno == VR_REGNUM)
   1543  1.1  christos     /* Read-only.  */
   1544  1.1  christos     return 1;
   1545  1.1  christos 
   1546  1.1  christos   else if  (regno == P0_REGNUM || regno == P4_REGNUM || regno == P8_REGNUM)
   1547  1.1  christos     /* Writing has no effect.  */
   1548  1.1  christos     return 1;
   1549  1.1  christos 
   1550  1.1  christos   /* IBR, BAR, BRP and IRP are read-only in user mode.  Let the debug
   1551  1.1  christos      agent decide whether they are writable.  */
   1552  1.1  christos 
   1553  1.1  christos   return 0;
   1554  1.1  christos }
   1555  1.1  christos 
   1556  1.1  christos /* Nonzero if regno should not be fetched from the target.  This is the case
   1557  1.1  christos    for unimplemented (size 0) and non-existant registers.  */
   1558  1.1  christos 
   1559  1.1  christos static int
   1560  1.1  christos crisv32_cannot_fetch_register (struct gdbarch *gdbarch, int regno)
   1561  1.1  christos {
   1562  1.1  christos   return ((regno < 0 || regno >= gdbarch_num_regs (gdbarch))
   1563  1.1  christos           || (cris_register_size (gdbarch, regno) == 0));
   1564  1.1  christos }
   1565  1.1  christos 
   1566  1.1  christos /* Nonzero if regno should not be written to the target, for various
   1567  1.1  christos    reasons.  */
   1568  1.1  christos 
   1569  1.1  christos static int
   1570  1.1  christos crisv32_cannot_store_register (struct gdbarch *gdbarch, int regno)
   1571  1.1  christos {
   1572  1.1  christos   /* There are three kinds of registers we refuse to write to.
   1573  1.1  christos      1. Those that not implemented.
   1574  1.1  christos      2. Those that are read-only (depends on the processor mode).
   1575  1.1  christos      3. Those registers to which a write has no effect.  */
   1576  1.1  christos 
   1577  1.1  christos   if (regno < 0
   1578  1.1  christos       || regno >= gdbarch_num_regs (gdbarch)
   1579  1.1  christos       || cris_register_size (gdbarch, regno) == 0)
   1580  1.1  christos     /* Not implemented.  */
   1581  1.1  christos     return 1;
   1582  1.1  christos 
   1583  1.1  christos   else if  (regno == VR_REGNUM)
   1584  1.1  christos     /* Read-only.  */
   1585  1.1  christos     return 1;
   1586  1.1  christos 
   1587  1.1  christos   else if  (regno == BZ_REGNUM || regno == WZ_REGNUM || regno == DZ_REGNUM)
   1588  1.1  christos     /* Writing has no effect.  */
   1589  1.1  christos     return 1;
   1590  1.1  christos 
   1591  1.1  christos   /* Many special registers are read-only in user mode.  Let the debug
   1592  1.1  christos      agent decide whether they are writable.  */
   1593  1.1  christos 
   1594  1.1  christos   return 0;
   1595  1.1  christos }
   1596  1.1  christos 
   1597  1.1  christos /* Return the GDB type (defined in gdbtypes.c) for the "standard" data type
   1598  1.1  christos    of data in register regno.  */
   1599  1.1  christos 
   1600  1.1  christos static struct type *
   1601  1.1  christos cris_register_type (struct gdbarch *gdbarch, int regno)
   1602  1.1  christos {
   1603  1.1  christos   if (regno == gdbarch_pc_regnum (gdbarch))
   1604  1.1  christos     return builtin_type (gdbarch)->builtin_func_ptr;
   1605  1.1  christos   else if (regno == gdbarch_sp_regnum (gdbarch)
   1606  1.1  christos 	   || regno == CRIS_FP_REGNUM)
   1607  1.1  christos     return builtin_type (gdbarch)->builtin_data_ptr;
   1608  1.1  christos   else if ((regno >= 0 && regno < gdbarch_sp_regnum (gdbarch))
   1609  1.1  christos 	   || (regno >= MOF_REGNUM && regno <= USP_REGNUM))
   1610  1.1  christos     /* Note: R8 taken care of previous clause.  */
   1611  1.1  christos     return builtin_type (gdbarch)->builtin_uint32;
   1612  1.1  christos   else if (regno >= P4_REGNUM && regno <= CCR_REGNUM)
   1613  1.1  christos       return builtin_type (gdbarch)->builtin_uint16;
   1614  1.1  christos   else if (regno >= P0_REGNUM && regno <= VR_REGNUM)
   1615  1.1  christos       return builtin_type (gdbarch)->builtin_uint8;
   1616  1.1  christos   else
   1617  1.1  christos       /* Invalid (unimplemented) register.  */
   1618  1.1  christos       return builtin_type (gdbarch)->builtin_int0;
   1619  1.1  christos }
   1620  1.1  christos 
   1621  1.1  christos static struct type *
   1622  1.1  christos crisv32_register_type (struct gdbarch *gdbarch, int regno)
   1623  1.1  christos {
   1624  1.1  christos   if (regno == gdbarch_pc_regnum (gdbarch))
   1625  1.1  christos     return builtin_type (gdbarch)->builtin_func_ptr;
   1626  1.1  christos   else if (regno == gdbarch_sp_regnum (gdbarch)
   1627  1.1  christos 	   || regno == CRIS_FP_REGNUM)
   1628  1.1  christos     return builtin_type (gdbarch)->builtin_data_ptr;
   1629  1.1  christos   else if ((regno >= 0 && regno <= ACR_REGNUM)
   1630  1.1  christos 	   || (regno >= EXS_REGNUM && regno <= SPC_REGNUM)
   1631  1.1  christos 	   || (regno == PID_REGNUM)
   1632  1.1  christos 	   || (regno >= S0_REGNUM && regno <= S15_REGNUM))
   1633  1.1  christos     /* Note: R8 and SP taken care of by previous clause.  */
   1634  1.1  christos     return builtin_type (gdbarch)->builtin_uint32;
   1635  1.1  christos   else if (regno == WZ_REGNUM)
   1636  1.1  christos       return builtin_type (gdbarch)->builtin_uint16;
   1637  1.1  christos   else if (regno == BZ_REGNUM || regno == VR_REGNUM || regno == SRS_REGNUM)
   1638  1.1  christos       return builtin_type (gdbarch)->builtin_uint8;
   1639  1.1  christos   else
   1640  1.1  christos     {
   1641  1.1  christos       /* Invalid (unimplemented) register.  Should not happen as there are
   1642  1.1  christos 	 no unimplemented CRISv32 registers.  */
   1643  1.1  christos       warning (_("crisv32_register_type: unknown regno %d"), regno);
   1644  1.1  christos       return builtin_type (gdbarch)->builtin_int0;
   1645  1.1  christos     }
   1646  1.1  christos }
   1647  1.1  christos 
   1648  1.1  christos /* Stores a function return value of type type, where valbuf is the address
   1649  1.1  christos    of the value to be stored.  */
   1650  1.1  christos 
   1651  1.1  christos /* In the CRIS ABI, R10 and R11 are used to store return values.  */
   1652  1.1  christos 
   1653  1.1  christos static void
   1654  1.1  christos cris_store_return_value (struct type *type, struct regcache *regcache,
   1655  1.1  christos 			 const gdb_byte *valbuf)
   1656  1.1  christos {
   1657  1.1  christos   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   1658  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1659  1.1  christos   ULONGEST val;
   1660  1.1  christos   int len = TYPE_LENGTH (type);
   1661  1.1  christos 
   1662  1.1  christos   if (len <= 4)
   1663  1.1  christos     {
   1664  1.1  christos       /* Put the return value in R10.  */
   1665  1.1  christos       val = extract_unsigned_integer (valbuf, len, byte_order);
   1666  1.1  christos       regcache_cooked_write_unsigned (regcache, ARG1_REGNUM, val);
   1667  1.1  christos     }
   1668  1.1  christos   else if (len <= 8)
   1669  1.1  christos     {
   1670  1.1  christos       /* Put the return value in R10 and R11.  */
   1671  1.1  christos       val = extract_unsigned_integer (valbuf, 4, byte_order);
   1672  1.1  christos       regcache_cooked_write_unsigned (regcache, ARG1_REGNUM, val);
   1673  1.1  christos       val = extract_unsigned_integer (valbuf + 4, len - 4, byte_order);
   1674  1.1  christos       regcache_cooked_write_unsigned (regcache, ARG2_REGNUM, val);
   1675  1.1  christos     }
   1676  1.1  christos   else
   1677  1.1  christos     error (_("cris_store_return_value: type length too large."));
   1678  1.1  christos }
   1679  1.1  christos 
   1680  1.1  christos /* Return the name of register regno as a string.  Return NULL for an
   1681  1.1  christos    invalid or unimplemented register.  */
   1682  1.1  christos 
   1683  1.1  christos static const char *
   1684  1.1  christos cris_special_register_name (struct gdbarch *gdbarch, int regno)
   1685  1.1  christos {
   1686  1.1  christos   int spec_regno;
   1687  1.1  christos   int i;
   1688  1.1  christos 
   1689  1.1  christos   /* Special register (R16 - R31).  cris_spec_regs is zero-based.
   1690  1.1  christos      Adjust regno accordingly.  */
   1691  1.1  christos   spec_regno = regno - NUM_GENREGS;
   1692  1.1  christos 
   1693  1.1  christos   /* Assume nothing about the layout of the cris_spec_regs struct
   1694  1.1  christos      when searching.  */
   1695  1.1  christos   for (i = 0; cris_spec_regs[i].name != NULL; i++)
   1696  1.1  christos     {
   1697  1.1  christos       if (cris_spec_regs[i].number == spec_regno
   1698  1.1  christos 	  && cris_spec_reg_applicable (gdbarch, cris_spec_regs[i]))
   1699  1.1  christos 	/* Go with the first applicable register.  */
   1700  1.1  christos 	return cris_spec_regs[i].name;
   1701  1.1  christos     }
   1702  1.1  christos   /* Special register not applicable to this CRIS version.  */
   1703  1.1  christos   return NULL;
   1704  1.1  christos }
   1705  1.1  christos 
   1706  1.1  christos static const char *
   1707  1.1  christos cris_register_name (struct gdbarch *gdbarch, int regno)
   1708  1.1  christos {
   1709  1.1  christos   static char *cris_genreg_names[] =
   1710  1.1  christos   { "r0",  "r1",  "r2",  "r3", \
   1711  1.1  christos     "r4",  "r5",  "r6",  "r7", \
   1712  1.1  christos     "r8",  "r9",  "r10", "r11", \
   1713  1.1  christos     "r12", "r13", "sp",  "pc" };
   1714  1.1  christos 
   1715  1.1  christos   if (regno >= 0 && regno < NUM_GENREGS)
   1716  1.1  christos     {
   1717  1.1  christos       /* General register.  */
   1718  1.1  christos       return cris_genreg_names[regno];
   1719  1.1  christos     }
   1720  1.1  christos   else if (regno >= NUM_GENREGS && regno < gdbarch_num_regs (gdbarch))
   1721  1.1  christos     {
   1722  1.1  christos       return cris_special_register_name (gdbarch, regno);
   1723  1.1  christos     }
   1724  1.1  christos   else
   1725  1.1  christos     {
   1726  1.1  christos       /* Invalid register.  */
   1727  1.1  christos       return NULL;
   1728  1.1  christos     }
   1729  1.1  christos }
   1730  1.1  christos 
   1731  1.1  christos static const char *
   1732  1.1  christos crisv32_register_name (struct gdbarch *gdbarch, int regno)
   1733  1.1  christos {
   1734  1.1  christos   static char *crisv32_genreg_names[] =
   1735  1.1  christos     { "r0",  "r1",  "r2",  "r3", \
   1736  1.1  christos       "r4",  "r5",  "r6",  "r7", \
   1737  1.1  christos       "r8",  "r9",  "r10", "r11", \
   1738  1.1  christos       "r12", "r13", "sp",  "acr"
   1739  1.1  christos     };
   1740  1.1  christos 
   1741  1.1  christos   static char *crisv32_sreg_names[] =
   1742  1.1  christos     { "s0",  "s1",  "s2",  "s3", \
   1743  1.1  christos       "s4",  "s5",  "s6",  "s7", \
   1744  1.1  christos       "s8",  "s9",  "s10", "s11", \
   1745  1.1  christos       "s12", "s13", "s14",  "s15"
   1746  1.1  christos     };
   1747  1.1  christos 
   1748  1.1  christos   if (regno >= 0 && regno < NUM_GENREGS)
   1749  1.1  christos     {
   1750  1.1  christos       /* General register.  */
   1751  1.1  christos       return crisv32_genreg_names[regno];
   1752  1.1  christos     }
   1753  1.1  christos   else if (regno >= NUM_GENREGS && regno < (NUM_GENREGS + NUM_SPECREGS))
   1754  1.1  christos     {
   1755  1.1  christos       return cris_special_register_name (gdbarch, regno);
   1756  1.1  christos     }
   1757  1.1  christos   else if (regno == gdbarch_pc_regnum (gdbarch))
   1758  1.1  christos     {
   1759  1.1  christos       return "pc";
   1760  1.1  christos     }
   1761  1.1  christos   else if (regno >= S0_REGNUM && regno <= S15_REGNUM)
   1762  1.1  christos     {
   1763  1.1  christos       return crisv32_sreg_names[regno - S0_REGNUM];
   1764  1.1  christos     }
   1765  1.1  christos   else
   1766  1.1  christos     {
   1767  1.1  christos       /* Invalid register.  */
   1768  1.1  christos       return NULL;
   1769  1.1  christos     }
   1770  1.1  christos }
   1771  1.1  christos 
   1772  1.1  christos /* Convert DWARF register number REG to the appropriate register
   1773  1.1  christos    number used by GDB.  */
   1774  1.1  christos 
   1775  1.1  christos static int
   1776  1.1  christos cris_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg)
   1777  1.1  christos {
   1778  1.1  christos   /* We need to re-map a couple of registers (SRP is 16 in Dwarf-2 register
   1779  1.1  christos      numbering, MOF is 18).
   1780  1.1  christos      Adapted from gcc/config/cris/cris.h.  */
   1781  1.1  christos   static int cris_dwarf_regmap[] = {
   1782  1.1  christos     0,  1,  2,  3,
   1783  1.1  christos     4,  5,  6,  7,
   1784  1.1  christos     8,  9,  10, 11,
   1785  1.1  christos     12, 13, 14, 15,
   1786  1.1  christos     27, -1, -1, -1,
   1787  1.1  christos     -1, -1, -1, 23,
   1788  1.1  christos     -1, -1, -1, 27,
   1789  1.1  christos     -1, -1, -1, -1
   1790  1.1  christos   };
   1791  1.1  christos   int regnum = -1;
   1792  1.1  christos 
   1793  1.1  christos   if (reg >= 0 && reg < ARRAY_SIZE (cris_dwarf_regmap))
   1794  1.1  christos     regnum = cris_dwarf_regmap[reg];
   1795  1.1  christos 
   1796  1.1  christos   if (regnum == -1)
   1797  1.1  christos     warning (_("Unmapped DWARF Register #%d encountered."), reg);
   1798  1.1  christos 
   1799  1.1  christos   return regnum;
   1800  1.1  christos }
   1801  1.1  christos 
   1802  1.1  christos /* DWARF-2 frame support.  */
   1803  1.1  christos 
   1804  1.1  christos static void
   1805  1.1  christos cris_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
   1806  1.1  christos                             struct dwarf2_frame_state_reg *reg,
   1807  1.1  christos 			    struct frame_info *this_frame)
   1808  1.1  christos {
   1809  1.1  christos   /* The return address column.  */
   1810  1.1  christos   if (regnum == gdbarch_pc_regnum (gdbarch))
   1811  1.1  christos     reg->how = DWARF2_FRAME_REG_RA;
   1812  1.1  christos 
   1813  1.1  christos   /* The call frame address.  */
   1814  1.1  christos   else if (regnum == gdbarch_sp_regnum (gdbarch))
   1815  1.1  christos     reg->how = DWARF2_FRAME_REG_CFA;
   1816  1.1  christos }
   1817  1.1  christos 
   1818  1.1  christos /* Extract from an array regbuf containing the raw register state a function
   1819  1.1  christos    return value of type type, and copy that, in virtual format, into
   1820  1.1  christos    valbuf.  */
   1821  1.1  christos 
   1822  1.1  christos /* In the CRIS ABI, R10 and R11 are used to store return values.  */
   1823  1.1  christos 
   1824  1.1  christos static void
   1825  1.1  christos cris_extract_return_value (struct type *type, struct regcache *regcache,
   1826  1.1  christos 			   gdb_byte *valbuf)
   1827  1.1  christos {
   1828  1.1  christos   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   1829  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1830  1.1  christos   ULONGEST val;
   1831  1.1  christos   int len = TYPE_LENGTH (type);
   1832  1.1  christos 
   1833  1.1  christos   if (len <= 4)
   1834  1.1  christos     {
   1835  1.1  christos       /* Get the return value from R10.  */
   1836  1.1  christos       regcache_cooked_read_unsigned (regcache, ARG1_REGNUM, &val);
   1837  1.1  christos       store_unsigned_integer (valbuf, len, byte_order, val);
   1838  1.1  christos     }
   1839  1.1  christos   else if (len <= 8)
   1840  1.1  christos     {
   1841  1.1  christos       /* Get the return value from R10 and R11.  */
   1842  1.1  christos       regcache_cooked_read_unsigned (regcache, ARG1_REGNUM, &val);
   1843  1.1  christos       store_unsigned_integer (valbuf, 4, byte_order, val);
   1844  1.1  christos       regcache_cooked_read_unsigned (regcache, ARG2_REGNUM, &val);
   1845  1.1  christos       store_unsigned_integer (valbuf + 4, len - 4, byte_order, val);
   1846  1.1  christos     }
   1847  1.1  christos   else
   1848  1.1  christos     error (_("cris_extract_return_value: type length too large"));
   1849  1.1  christos }
   1850  1.1  christos 
   1851  1.1  christos /* Handle the CRIS return value convention.  */
   1852  1.1  christos 
   1853  1.1  christos static enum return_value_convention
   1854  1.1  christos cris_return_value (struct gdbarch *gdbarch, struct value *function,
   1855  1.1  christos 		   struct type *type, struct regcache *regcache,
   1856  1.1  christos 		   gdb_byte *readbuf, const gdb_byte *writebuf)
   1857  1.1  christos {
   1858  1.1  christos   if (TYPE_CODE (type) == TYPE_CODE_STRUCT
   1859  1.1  christos       || TYPE_CODE (type) == TYPE_CODE_UNION
   1860  1.1  christos       || TYPE_LENGTH (type) > 8)
   1861  1.1  christos     /* Structs, unions, and anything larger than 8 bytes (2 registers)
   1862  1.1  christos        goes on the stack.  */
   1863  1.1  christos     return RETURN_VALUE_STRUCT_CONVENTION;
   1864  1.1  christos 
   1865  1.1  christos   if (readbuf)
   1866  1.1  christos     cris_extract_return_value (type, regcache, readbuf);
   1867  1.1  christos   if (writebuf)
   1868  1.1  christos     cris_store_return_value (type, regcache, writebuf);
   1869  1.1  christos 
   1870  1.1  christos   return RETURN_VALUE_REGISTER_CONVENTION;
   1871  1.1  christos }
   1872  1.1  christos 
   1873  1.1  christos /* Calculates a value that measures how good inst_args constraints an
   1874  1.1  christos    instruction.  It stems from cris_constraint, found in cris-dis.c.  */
   1875  1.1  christos 
   1876  1.1  christos static int
   1877  1.1  christos constraint (unsigned int insn, const char *inst_args,
   1878  1.1  christos             inst_env_type *inst_env)
   1879  1.1  christos {
   1880  1.1  christos   int retval = 0;
   1881  1.1  christos   int tmp, i;
   1882  1.1  christos 
   1883  1.1  christos   const gdb_byte *s = (const gdb_byte *) inst_args;
   1884  1.1  christos 
   1885  1.1  christos   for (; *s; s++)
   1886  1.1  christos     switch (*s)
   1887  1.1  christos       {
   1888  1.1  christos       case 'm':
   1889  1.1  christos         if ((insn & 0x30) == 0x30)
   1890  1.1  christos           return -1;
   1891  1.1  christos         break;
   1892  1.1  christos 
   1893  1.1  christos       case 'S':
   1894  1.1  christos         /* A prefix operand.  */
   1895  1.1  christos         if (inst_env->prefix_found)
   1896  1.1  christos           break;
   1897  1.1  christos         else
   1898  1.1  christos           return -1;
   1899  1.1  christos 
   1900  1.1  christos       case 'B':
   1901  1.1  christos         /* A "push" prefix.  (This check was REMOVED by san 970921.)  Check for
   1902  1.1  christos            valid "push" size.  In case of special register, it may be != 4.  */
   1903  1.1  christos         if (inst_env->prefix_found)
   1904  1.1  christos           break;
   1905  1.1  christos         else
   1906  1.1  christos           return -1;
   1907  1.1  christos 
   1908  1.1  christos       case 'D':
   1909  1.1  christos         retval = (((insn >> 0xC) & 0xF) == (insn & 0xF));
   1910  1.1  christos         if (!retval)
   1911  1.1  christos           return -1;
   1912  1.1  christos         else
   1913  1.1  christos           retval += 4;
   1914  1.1  christos         break;
   1915  1.1  christos 
   1916  1.1  christos       case 'P':
   1917  1.1  christos         tmp = (insn >> 0xC) & 0xF;
   1918  1.1  christos 
   1919  1.1  christos         for (i = 0; cris_spec_regs[i].name != NULL; i++)
   1920  1.1  christos           {
   1921  1.1  christos             /* Since we match four bits, we will give a value of
   1922  1.1  christos                4 - 1 = 3 in a match.  If there is a corresponding
   1923  1.1  christos                exact match of a special register in another pattern, it
   1924  1.1  christos                will get a value of 4, which will be higher.  This should
   1925  1.1  christos                be correct in that an exact pattern would match better that
   1926  1.1  christos                a general pattern.
   1927  1.1  christos                Note that there is a reason for not returning zero; the
   1928  1.1  christos                pattern for "clear" is partly  matched in the bit-pattern
   1929  1.1  christos                (the two lower bits must be zero), while the bit-pattern
   1930  1.1  christos                for a move from a special register is matched in the
   1931  1.1  christos                register constraint.
   1932  1.1  christos                This also means we will will have a race condition if
   1933  1.1  christos                there is a partly match in three bits in the bit pattern.  */
   1934  1.1  christos             if (tmp == cris_spec_regs[i].number)
   1935  1.1  christos               {
   1936  1.1  christos                 retval += 3;
   1937  1.1  christos                 break;
   1938  1.1  christos               }
   1939  1.1  christos           }
   1940  1.1  christos 
   1941  1.1  christos         if (cris_spec_regs[i].name == NULL)
   1942  1.1  christos           return -1;
   1943  1.1  christos         break;
   1944  1.1  christos       }
   1945  1.1  christos   return retval;
   1946  1.1  christos }
   1947  1.1  christos 
   1948  1.1  christos /* Returns the number of bits set in the variable value.  */
   1949  1.1  christos 
   1950  1.1  christos static int
   1951  1.1  christos number_of_bits (unsigned int value)
   1952  1.1  christos {
   1953  1.1  christos   int number_of_bits = 0;
   1954  1.1  christos 
   1955  1.1  christos   while (value != 0)
   1956  1.1  christos     {
   1957  1.1  christos       number_of_bits += 1;
   1958  1.1  christos       value &= (value - 1);
   1959  1.1  christos     }
   1960  1.1  christos   return number_of_bits;
   1961  1.1  christos }
   1962  1.1  christos 
   1963  1.1  christos /* Finds the address that should contain the single step breakpoint(s).
   1964  1.1  christos    It stems from code in cris-dis.c.  */
   1965  1.1  christos 
   1966  1.1  christos static int
   1967  1.1  christos find_cris_op (unsigned short insn, inst_env_type *inst_env)
   1968  1.1  christos {
   1969  1.1  christos   int i;
   1970  1.1  christos   int max_level_of_match = -1;
   1971  1.1  christos   int max_matched = -1;
   1972  1.1  christos   int level_of_match;
   1973  1.1  christos 
   1974  1.1  christos   for (i = 0; cris_opcodes[i].name != NULL; i++)
   1975  1.1  christos     {
   1976  1.1  christos       if (((cris_opcodes[i].match & insn) == cris_opcodes[i].match)
   1977  1.1  christos           && ((cris_opcodes[i].lose & insn) == 0)
   1978  1.1  christos 	  /* Only CRISv10 instructions, please.  */
   1979  1.1  christos 	  && (cris_opcodes[i].applicable_version != cris_ver_v32p))
   1980  1.1  christos         {
   1981  1.1  christos           level_of_match = constraint (insn, cris_opcodes[i].args, inst_env);
   1982  1.1  christos           if (level_of_match >= 0)
   1983  1.1  christos             {
   1984  1.1  christos               level_of_match +=
   1985  1.1  christos                 number_of_bits (cris_opcodes[i].match | cris_opcodes[i].lose);
   1986  1.1  christos               if (level_of_match > max_level_of_match)
   1987  1.1  christos                 {
   1988  1.1  christos                   max_matched = i;
   1989  1.1  christos                   max_level_of_match = level_of_match;
   1990  1.1  christos                   if (level_of_match == 16)
   1991  1.1  christos                     {
   1992  1.1  christos                       /* All bits matched, cannot find better.  */
   1993  1.1  christos                       break;
   1994  1.1  christos                     }
   1995  1.1  christos                 }
   1996  1.1  christos             }
   1997  1.1  christos         }
   1998  1.1  christos     }
   1999  1.1  christos   return max_matched;
   2000  1.1  christos }
   2001  1.1  christos 
   2002  1.1  christos /* Attempts to find single-step breakpoints.  Returns -1 on failure which is
   2003  1.1  christos    actually an internal error.  */
   2004  1.1  christos 
   2005  1.1  christos static int
   2006  1.1  christos find_step_target (struct frame_info *frame, inst_env_type *inst_env)
   2007  1.1  christos {
   2008  1.1  christos   int i;
   2009  1.1  christos   int offset;
   2010  1.1  christos   unsigned short insn;
   2011  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
   2012  1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   2013  1.1  christos 
   2014  1.1  christos   /* Create a local register image and set the initial state.  */
   2015  1.1  christos   for (i = 0; i < NUM_GENREGS; i++)
   2016  1.1  christos     {
   2017  1.1  christos       inst_env->reg[i] =
   2018  1.1  christos 	(unsigned long) get_frame_register_unsigned (frame, i);
   2019  1.1  christos     }
   2020  1.1  christos   offset = NUM_GENREGS;
   2021  1.1  christos   for (i = 0; i < NUM_SPECREGS; i++)
   2022  1.1  christos     {
   2023  1.1  christos       inst_env->preg[i] =
   2024  1.1  christos 	(unsigned long) get_frame_register_unsigned (frame, offset + i);
   2025  1.1  christos     }
   2026  1.1  christos   inst_env->branch_found = 0;
   2027  1.1  christos   inst_env->slot_needed = 0;
   2028  1.1  christos   inst_env->delay_slot_pc_active = 0;
   2029  1.1  christos   inst_env->prefix_found = 0;
   2030  1.1  christos   inst_env->invalid = 0;
   2031  1.1  christos   inst_env->xflag_found = 0;
   2032  1.1  christos   inst_env->disable_interrupt = 0;
   2033  1.1  christos   inst_env->byte_order = byte_order;
   2034  1.1  christos 
   2035  1.1  christos   /* Look for a step target.  */
   2036  1.1  christos   do
   2037  1.1  christos     {
   2038  1.1  christos       /* Read an instruction from the client.  */
   2039  1.1  christos       insn = read_memory_unsigned_integer
   2040  1.1  christos 	     (inst_env->reg[gdbarch_pc_regnum (gdbarch)], 2, byte_order);
   2041  1.1  christos 
   2042  1.1  christos       /* If the instruction is not in a delay slot the new content of the
   2043  1.1  christos          PC is [PC] + 2.  If the instruction is in a delay slot it is not
   2044  1.1  christos          that simple.  Since a instruction in a delay slot cannot change
   2045  1.1  christos          the content of the PC, it does not matter what value PC will have.
   2046  1.1  christos          Just make sure it is a valid instruction.  */
   2047  1.1  christos       if (!inst_env->delay_slot_pc_active)
   2048  1.1  christos         {
   2049  1.1  christos           inst_env->reg[gdbarch_pc_regnum (gdbarch)] += 2;
   2050  1.1  christos         }
   2051  1.1  christos       else
   2052  1.1  christos         {
   2053  1.1  christos           inst_env->delay_slot_pc_active = 0;
   2054  1.1  christos           inst_env->reg[gdbarch_pc_regnum (gdbarch)]
   2055  1.1  christos 	    = inst_env->delay_slot_pc;
   2056  1.1  christos         }
   2057  1.1  christos       /* Analyse the present instruction.  */
   2058  1.1  christos       i = find_cris_op (insn, inst_env);
   2059  1.1  christos       if (i == -1)
   2060  1.1  christos         {
   2061  1.1  christos           inst_env->invalid = 1;
   2062  1.1  christos         }
   2063  1.1  christos       else
   2064  1.1  christos         {
   2065  1.1  christos           cris_gdb_func (gdbarch, cris_opcodes[i].op, insn, inst_env);
   2066  1.1  christos         }
   2067  1.1  christos     } while (!inst_env->invalid
   2068  1.1  christos              && (inst_env->prefix_found || inst_env->xflag_found
   2069  1.1  christos                  || inst_env->slot_needed));
   2070  1.1  christos   return i;
   2071  1.1  christos }
   2072  1.1  christos 
   2073  1.1  christos /* There is no hardware single-step support.  The function find_step_target
   2074  1.1  christos    digs through the opcodes in order to find all possible targets.
   2075  1.1  christos    Either one ordinary target or two targets for branches may be found.  */
   2076  1.1  christos 
   2077  1.1  christos static int
   2078  1.1  christos cris_software_single_step (struct frame_info *frame)
   2079  1.1  christos {
   2080  1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
   2081  1.1  christos   struct address_space *aspace = get_frame_address_space (frame);
   2082  1.1  christos   inst_env_type inst_env;
   2083  1.1  christos 
   2084  1.1  christos   /* Analyse the present instruction environment and insert
   2085  1.1  christos      breakpoints.  */
   2086  1.1  christos   int status = find_step_target (frame, &inst_env);
   2087  1.1  christos   if (status == -1)
   2088  1.1  christos     {
   2089  1.1  christos       /* Could not find a target.  Things are likely to go downhill
   2090  1.1  christos 	 from here.  */
   2091  1.1  christos       warning (_("CRIS software single step could not find a step target."));
   2092  1.1  christos     }
   2093  1.1  christos   else
   2094  1.1  christos     {
   2095  1.1  christos       /* Insert at most two breakpoints.  One for the next PC content
   2096  1.1  christos          and possibly another one for a branch, jump, etc.  */
   2097  1.1  christos       CORE_ADDR next_pc
   2098  1.1  christos 	= (CORE_ADDR) inst_env.reg[gdbarch_pc_regnum (gdbarch)];
   2099  1.1  christos       insert_single_step_breakpoint (gdbarch, aspace, next_pc);
   2100  1.1  christos       if (inst_env.branch_found
   2101  1.1  christos 	  && (CORE_ADDR) inst_env.branch_break_address != next_pc)
   2102  1.1  christos 	{
   2103  1.1  christos 	  CORE_ADDR branch_target_address
   2104  1.1  christos 		= (CORE_ADDR) inst_env.branch_break_address;
   2105  1.1  christos 	  insert_single_step_breakpoint (gdbarch,
   2106  1.1  christos 					 aspace, branch_target_address);
   2107  1.1  christos 	}
   2108  1.1  christos     }
   2109  1.1  christos 
   2110  1.1  christos   return 1;
   2111  1.1  christos }
   2112  1.1  christos 
   2113  1.1  christos /* Calculates the prefix value for quick offset addressing mode.  */
   2114  1.1  christos 
   2115  1.1  christos static void
   2116  1.1  christos quick_mode_bdap_prefix (unsigned short inst, inst_env_type *inst_env)
   2117  1.1  christos {
   2118  1.1  christos   /* It's invalid to be in a delay slot.  You can't have a prefix to this
   2119  1.1  christos      instruction (not 100% sure).  */
   2120  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2121  1.1  christos     {
   2122  1.1  christos       inst_env->invalid = 1;
   2123  1.1  christos       return;
   2124  1.1  christos     }
   2125  1.1  christos 
   2126  1.1  christos   inst_env->prefix_value = inst_env->reg[cris_get_operand2 (inst)];
   2127  1.1  christos   inst_env->prefix_value += cris_get_bdap_quick_offset (inst);
   2128  1.1  christos 
   2129  1.1  christos   /* A prefix doesn't change the xflag_found.  But the rest of the flags
   2130  1.1  christos      need updating.  */
   2131  1.1  christos   inst_env->slot_needed = 0;
   2132  1.1  christos   inst_env->prefix_found = 1;
   2133  1.1  christos }
   2134  1.1  christos 
   2135  1.1  christos /* Updates the autoincrement register.  The size of the increment is derived
   2136  1.1  christos    from the size of the operation.  The PC is always kept aligned on even
   2137  1.1  christos    word addresses.  */
   2138  1.1  christos 
   2139  1.1  christos static void
   2140  1.1  christos process_autoincrement (int size, unsigned short inst, inst_env_type *inst_env)
   2141  1.1  christos {
   2142  1.1  christos   if (size == INST_BYTE_SIZE)
   2143  1.1  christos     {
   2144  1.1  christos       inst_env->reg[cris_get_operand1 (inst)] += 1;
   2145  1.1  christos 
   2146  1.1  christos       /* The PC must be word aligned, so increase the PC with one
   2147  1.1  christos          word even if the size is byte.  */
   2148  1.1  christos       if (cris_get_operand1 (inst) == REG_PC)
   2149  1.1  christos         {
   2150  1.1  christos           inst_env->reg[REG_PC] += 1;
   2151  1.1  christos         }
   2152  1.1  christos     }
   2153  1.1  christos   else if (size == INST_WORD_SIZE)
   2154  1.1  christos     {
   2155  1.1  christos       inst_env->reg[cris_get_operand1 (inst)] += 2;
   2156  1.1  christos     }
   2157  1.1  christos   else if (size == INST_DWORD_SIZE)
   2158  1.1  christos     {
   2159  1.1  christos       inst_env->reg[cris_get_operand1 (inst)] += 4;
   2160  1.1  christos     }
   2161  1.1  christos   else
   2162  1.1  christos     {
   2163  1.1  christos       /* Invalid size.  */
   2164  1.1  christos       inst_env->invalid = 1;
   2165  1.1  christos     }
   2166  1.1  christos }
   2167  1.1  christos 
   2168  1.1  christos /* Just a forward declaration.  */
   2169  1.1  christos 
   2170  1.1  christos static unsigned long get_data_from_address (unsigned short *inst,
   2171  1.1  christos 					    CORE_ADDR address,
   2172  1.1  christos 					    enum bfd_endian byte_order);
   2173  1.1  christos 
   2174  1.1  christos /* Calculates the prefix value for the general case of offset addressing
   2175  1.1  christos    mode.  */
   2176  1.1  christos 
   2177  1.1  christos static void
   2178  1.1  christos bdap_prefix (unsigned short inst, inst_env_type *inst_env)
   2179  1.1  christos {
   2180  1.1  christos   /* It's invalid to be in a delay slot.  */
   2181  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2182  1.1  christos     {
   2183  1.1  christos       inst_env->invalid = 1;
   2184  1.1  christos       return;
   2185  1.1  christos     }
   2186  1.1  christos 
   2187  1.1  christos   /* The calculation of prefix_value used to be after process_autoincrement,
   2188  1.1  christos      but that fails for an instruction such as jsr [$r0+12] which is encoded
   2189  1.1  christos      as 5f0d 0c00 30b9 when compiled with -fpic.  Since PC is operand1 it
   2190  1.1  christos      mustn't be incremented until we have read it and what it points at.  */
   2191  1.1  christos   inst_env->prefix_value = inst_env->reg[cris_get_operand2 (inst)];
   2192  1.1  christos 
   2193  1.1  christos   /* The offset is an indirection of the contents of the operand1 register.  */
   2194  1.1  christos   inst_env->prefix_value +=
   2195  1.1  christos     get_data_from_address (&inst, inst_env->reg[cris_get_operand1 (inst)],
   2196  1.1  christos 			   inst_env->byte_order);
   2197  1.1  christos 
   2198  1.1  christos   if (cris_get_mode (inst) == AUTOINC_MODE)
   2199  1.1  christos     {
   2200  1.1  christos       process_autoincrement (cris_get_size (inst), inst, inst_env);
   2201  1.1  christos     }
   2202  1.1  christos 
   2203  1.1  christos   /* A prefix doesn't change the xflag_found.  But the rest of the flags
   2204  1.1  christos      need updating.  */
   2205  1.1  christos   inst_env->slot_needed = 0;
   2206  1.1  christos   inst_env->prefix_found = 1;
   2207  1.1  christos }
   2208  1.1  christos 
   2209  1.1  christos /* Calculates the prefix value for the index addressing mode.  */
   2210  1.1  christos 
   2211  1.1  christos static void
   2212  1.1  christos biap_prefix (unsigned short inst, inst_env_type *inst_env)
   2213  1.1  christos {
   2214  1.1  christos   /* It's invalid to be in a delay slot.  I can't see that it's possible to
   2215  1.1  christos      have a prefix to this instruction.  So I will treat this as invalid.  */
   2216  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2217  1.1  christos     {
   2218  1.1  christos       inst_env->invalid = 1;
   2219  1.1  christos       return;
   2220  1.1  christos     }
   2221  1.1  christos 
   2222  1.1  christos   inst_env->prefix_value = inst_env->reg[cris_get_operand1 (inst)];
   2223  1.1  christos 
   2224  1.1  christos   /* The offset is the operand2 value shifted the size of the instruction
   2225  1.1  christos      to the left.  */
   2226  1.1  christos   inst_env->prefix_value +=
   2227  1.1  christos     inst_env->reg[cris_get_operand2 (inst)] << cris_get_size (inst);
   2228  1.1  christos 
   2229  1.1  christos   /* If the PC is operand1 (base) the address used is the address after
   2230  1.1  christos      the main instruction, i.e. address + 2 (the PC is already compensated
   2231  1.1  christos      for the prefix operation).  */
   2232  1.1  christos   if (cris_get_operand1 (inst) == REG_PC)
   2233  1.1  christos     {
   2234  1.1  christos       inst_env->prefix_value += 2;
   2235  1.1  christos     }
   2236  1.1  christos 
   2237  1.1  christos   /* A prefix doesn't change the xflag_found.  But the rest of the flags
   2238  1.1  christos      need updating.  */
   2239  1.1  christos   inst_env->slot_needed = 0;
   2240  1.1  christos   inst_env->xflag_found = 0;
   2241  1.1  christos   inst_env->prefix_found = 1;
   2242  1.1  christos }
   2243  1.1  christos 
   2244  1.1  christos /* Calculates the prefix value for the double indirect addressing mode.  */
   2245  1.1  christos 
   2246  1.1  christos static void
   2247  1.1  christos dip_prefix (unsigned short inst, inst_env_type *inst_env)
   2248  1.1  christos {
   2249  1.1  christos 
   2250  1.1  christos   CORE_ADDR address;
   2251  1.1  christos 
   2252  1.1  christos   /* It's invalid to be in a delay slot.  */
   2253  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2254  1.1  christos     {
   2255  1.1  christos       inst_env->invalid = 1;
   2256  1.1  christos       return;
   2257  1.1  christos     }
   2258  1.1  christos 
   2259  1.1  christos   /* The prefix value is one dereference of the contents of the operand1
   2260  1.1  christos      register.  */
   2261  1.1  christos   address = (CORE_ADDR) inst_env->reg[cris_get_operand1 (inst)];
   2262  1.1  christos   inst_env->prefix_value
   2263  1.1  christos     = read_memory_unsigned_integer (address, 4, inst_env->byte_order);
   2264  1.1  christos 
   2265  1.1  christos   /* Check if the mode is autoincrement.  */
   2266  1.1  christos   if (cris_get_mode (inst) == AUTOINC_MODE)
   2267  1.1  christos     {
   2268  1.1  christos       inst_env->reg[cris_get_operand1 (inst)] += 4;
   2269  1.1  christos     }
   2270  1.1  christos 
   2271  1.1  christos   /* A prefix doesn't change the xflag_found.  But the rest of the flags
   2272  1.1  christos      need updating.  */
   2273  1.1  christos   inst_env->slot_needed = 0;
   2274  1.1  christos   inst_env->xflag_found = 0;
   2275  1.1  christos   inst_env->prefix_found = 1;
   2276  1.1  christos }
   2277  1.1  christos 
   2278  1.1  christos /* Finds the destination for a branch with 8-bits offset.  */
   2279  1.1  christos 
   2280  1.1  christos static void
   2281  1.1  christos eight_bit_offset_branch_op (unsigned short inst, inst_env_type *inst_env)
   2282  1.1  christos {
   2283  1.1  christos 
   2284  1.1  christos   short offset;
   2285  1.1  christos 
   2286  1.1  christos   /* If we have a prefix or are in a delay slot it's bad.  */
   2287  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2288  1.1  christos     {
   2289  1.1  christos       inst_env->invalid = 1;
   2290  1.1  christos       return;
   2291  1.1  christos     }
   2292  1.1  christos 
   2293  1.1  christos   /* We have a branch, find out where the branch will land.  */
   2294  1.1  christos   offset = cris_get_branch_short_offset (inst);
   2295  1.1  christos 
   2296  1.1  christos   /* Check if the offset is signed.  */
   2297  1.1  christos   if (offset & BRANCH_SIGNED_SHORT_OFFSET_MASK)
   2298  1.1  christos     {
   2299  1.1  christos       offset |= 0xFF00;
   2300  1.1  christos     }
   2301  1.1  christos 
   2302  1.1  christos   /* The offset ends with the sign bit, set it to zero.  The address
   2303  1.1  christos      should always be word aligned.  */
   2304  1.1  christos   offset &= ~BRANCH_SIGNED_SHORT_OFFSET_MASK;
   2305  1.1  christos 
   2306  1.1  christos   inst_env->branch_found = 1;
   2307  1.1  christos   inst_env->branch_break_address = inst_env->reg[REG_PC] + offset;
   2308  1.1  christos 
   2309  1.1  christos   inst_env->slot_needed = 1;
   2310  1.1  christos   inst_env->prefix_found = 0;
   2311  1.1  christos   inst_env->xflag_found = 0;
   2312  1.1  christos   inst_env->disable_interrupt = 1;
   2313  1.1  christos }
   2314  1.1  christos 
   2315  1.1  christos /* Finds the destination for a branch with 16-bits offset.  */
   2316  1.1  christos 
   2317  1.1  christos static void
   2318  1.1  christos sixteen_bit_offset_branch_op (unsigned short inst, inst_env_type *inst_env)
   2319  1.1  christos {
   2320  1.1  christos   short offset;
   2321  1.1  christos 
   2322  1.1  christos   /* If we have a prefix or is in a delay slot it's bad.  */
   2323  1.1  christos   if (inst_env->slot_needed || inst_env->prefix_found)
   2324  1.1  christos     {
   2325  1.1  christos       inst_env->invalid = 1;
   2326  1.1  christos       return;
   2327  1.1  christos     }
   2328  1.1  christos 
   2329  1.1  christos   /* We have a branch, find out the offset for the branch.  */
   2330  1.1  christos   offset = read_memory_integer (inst_env->reg[REG_PC], 2,
   2331  1.1  christos 				inst_env->byte_order);
   2332  1.1  christos 
   2333  1.1  christos   /* The instruction is one word longer than normal, so add one word
   2334  1.1  christos      to the PC.  */
   2335  1.1  christos   inst_env->reg[REG_PC] += 2;
   2336  1.1  christos 
   2337  1.1  christos   inst_env->branch_found = 1;
   2338  1.1  christos   inst_env->branch_break_address = inst_env->reg[REG_PC] + offset;
   2339  1.1  christos 
   2340  1.1  christos 
   2341  1.1  christos   inst_env->slot_needed = 1;
   2342  1.1  christos   inst_env->prefix_found = 0;
   2343  1.1  christos   inst_env->xflag_found = 0;
   2344  1.1  christos   inst_env->disable_interrupt = 1;
   2345  1.1  christos }
   2346  1.1  christos 
   2347  1.1  christos /* Handles the ABS instruction.  */
   2348  1.1  christos 
   2349  1.1  christos static void
   2350  1.1  christos abs_op (unsigned short inst, inst_env_type *inst_env)
   2351  1.1  christos {
   2352  1.1  christos 
   2353  1.1  christos   long value;
   2354  1.1  christos 
   2355  1.1  christos   /* ABS can't have a prefix, so it's bad if it does.  */
   2356  1.1  christos   if (inst_env->prefix_found)
   2357  1.1  christos     {
   2358  1.1  christos       inst_env->invalid = 1;
   2359  1.1  christos       return;
   2360  1.1  christos     }
   2361  1.1  christos 
   2362  1.1  christos   /* Check if the operation affects the PC.  */
   2363  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   2364  1.1  christos     {
   2365  1.1  christos 
   2366  1.1  christos       /* It's invalid to change to the PC if we are in a delay slot.  */
   2367  1.1  christos       if (inst_env->slot_needed)
   2368  1.1  christos         {
   2369  1.1  christos           inst_env->invalid = 1;
   2370  1.1  christos           return;
   2371  1.1  christos         }
   2372  1.1  christos 
   2373  1.1  christos       value = (long) inst_env->reg[REG_PC];
   2374  1.1  christos 
   2375  1.1  christos       /* The value of abs (SIGNED_DWORD_MASK) is SIGNED_DWORD_MASK.  */
   2376  1.1  christos       if (value != SIGNED_DWORD_MASK)
   2377  1.1  christos         {
   2378  1.1  christos           value = -value;
   2379  1.1  christos           inst_env->reg[REG_PC] = (long) value;
   2380  1.1  christos         }
   2381  1.1  christos     }
   2382  1.1  christos 
   2383  1.1  christos   inst_env->slot_needed = 0;
   2384  1.1  christos   inst_env->prefix_found = 0;
   2385  1.1  christos   inst_env->xflag_found = 0;
   2386  1.1  christos   inst_env->disable_interrupt = 0;
   2387  1.1  christos }
   2388  1.1  christos 
   2389  1.1  christos /* Handles the ADDI instruction.  */
   2390  1.1  christos 
   2391  1.1  christos static void
   2392  1.1  christos addi_op (unsigned short inst, inst_env_type *inst_env)
   2393  1.1  christos {
   2394  1.1  christos   /* It's invalid to have the PC as base register.  And ADDI can't have
   2395  1.1  christos      a prefix.  */
   2396  1.1  christos   if (inst_env->prefix_found || (cris_get_operand1 (inst) == REG_PC))
   2397  1.1  christos     {
   2398  1.1  christos       inst_env->invalid = 1;
   2399  1.1  christos       return;
   2400  1.1  christos     }
   2401  1.1  christos 
   2402  1.1  christos   inst_env->slot_needed = 0;
   2403  1.1  christos   inst_env->prefix_found = 0;
   2404  1.1  christos   inst_env->xflag_found = 0;
   2405  1.1  christos   inst_env->disable_interrupt = 0;
   2406  1.1  christos }
   2407  1.1  christos 
   2408  1.1  christos /* Handles the ASR instruction.  */
   2409  1.1  christos 
   2410  1.1  christos static void
   2411  1.1  christos asr_op (unsigned short inst, inst_env_type *inst_env)
   2412  1.1  christos {
   2413  1.1  christos   int shift_steps;
   2414  1.1  christos   unsigned long value;
   2415  1.1  christos   unsigned long signed_extend_mask = 0;
   2416  1.1  christos 
   2417  1.1  christos   /* ASR can't have a prefix, so check that it doesn't.  */
   2418  1.1  christos   if (inst_env->prefix_found)
   2419  1.1  christos     {
   2420  1.1  christos       inst_env->invalid = 1;
   2421  1.1  christos       return;
   2422  1.1  christos     }
   2423  1.1  christos 
   2424  1.1  christos   /* Check if the PC is the target register.  */
   2425  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   2426  1.1  christos     {
   2427  1.1  christos       /* It's invalid to change the PC in a delay slot.  */
   2428  1.1  christos       if (inst_env->slot_needed)
   2429  1.1  christos         {
   2430  1.1  christos           inst_env->invalid = 1;
   2431  1.1  christos           return;
   2432  1.1  christos         }
   2433  1.1  christos       /* Get the number of bits to shift.  */
   2434  1.1  christos       shift_steps
   2435  1.1  christos 	= cris_get_asr_shift_steps (inst_env->reg[cris_get_operand1 (inst)]);
   2436  1.1  christos       value = inst_env->reg[REG_PC];
   2437  1.1  christos 
   2438  1.1  christos       /* Find out how many bits the operation should apply to.  */
   2439  1.1  christos       if (cris_get_size (inst) == INST_BYTE_SIZE)
   2440  1.1  christos         {
   2441  1.1  christos           if (value & SIGNED_BYTE_MASK)
   2442  1.1  christos             {
   2443  1.1  christos               signed_extend_mask = 0xFF;
   2444  1.1  christos               signed_extend_mask = signed_extend_mask >> shift_steps;
   2445  1.1  christos               signed_extend_mask = ~signed_extend_mask;
   2446  1.1  christos             }
   2447  1.1  christos           value = value >> shift_steps;
   2448  1.1  christos           value |= signed_extend_mask;
   2449  1.1  christos           value &= 0xFF;
   2450  1.1  christos           inst_env->reg[REG_PC] &= 0xFFFFFF00;
   2451  1.1  christos           inst_env->reg[REG_PC] |= value;
   2452  1.1  christos         }
   2453  1.1  christos       else if (cris_get_size (inst) == INST_WORD_SIZE)
   2454  1.1  christos         {
   2455  1.1  christos           if (value & SIGNED_WORD_MASK)
   2456  1.1  christos             {
   2457  1.1  christos               signed_extend_mask = 0xFFFF;
   2458  1.1  christos               signed_extend_mask = signed_extend_mask >> shift_steps;
   2459  1.1  christos               signed_extend_mask = ~signed_extend_mask;
   2460  1.1  christos             }
   2461  1.1  christos           value = value >> shift_steps;
   2462  1.1  christos           value |= signed_extend_mask;
   2463  1.1  christos           value &= 0xFFFF;
   2464  1.1  christos           inst_env->reg[REG_PC] &= 0xFFFF0000;
   2465  1.1  christos           inst_env->reg[REG_PC] |= value;
   2466  1.1  christos         }
   2467  1.1  christos       else if (cris_get_size (inst) == INST_DWORD_SIZE)
   2468  1.1  christos         {
   2469  1.1  christos           if (value & SIGNED_DWORD_MASK)
   2470  1.1  christos             {
   2471  1.1  christos               signed_extend_mask = 0xFFFFFFFF;
   2472  1.1  christos               signed_extend_mask = signed_extend_mask >> shift_steps;
   2473  1.1  christos               signed_extend_mask = ~signed_extend_mask;
   2474  1.1  christos             }
   2475  1.1  christos           value = value >> shift_steps;
   2476  1.1  christos           value |= signed_extend_mask;
   2477  1.1  christos           inst_env->reg[REG_PC]  = value;
   2478  1.1  christos         }
   2479  1.1  christos     }
   2480  1.1  christos   inst_env->slot_needed = 0;
   2481  1.1  christos   inst_env->prefix_found = 0;
   2482  1.1  christos   inst_env->xflag_found = 0;
   2483  1.1  christos   inst_env->disable_interrupt = 0;
   2484  1.1  christos }
   2485  1.1  christos 
   2486  1.1  christos /* Handles the ASRQ instruction.  */
   2487  1.1  christos 
   2488  1.1  christos static void
   2489  1.1  christos asrq_op (unsigned short inst, inst_env_type *inst_env)
   2490  1.1  christos {
   2491  1.1  christos 
   2492  1.1  christos   int shift_steps;
   2493  1.1  christos   unsigned long value;
   2494  1.1  christos   unsigned long signed_extend_mask = 0;
   2495  1.1  christos 
   2496  1.1  christos   /* ASRQ can't have a prefix, so check that it doesn't.  */
   2497  1.1  christos   if (inst_env->prefix_found)
   2498  1.1  christos     {
   2499  1.1  christos       inst_env->invalid = 1;
   2500  1.1  christos       return;
   2501  1.1  christos     }
   2502  1.1  christos 
   2503  1.1  christos   /* Check if the PC is the target register.  */
   2504  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   2505  1.1  christos     {
   2506  1.1  christos 
   2507  1.1  christos       /* It's invalid to change the PC in a delay slot.  */
   2508  1.1  christos       if (inst_env->slot_needed)
   2509  1.1  christos         {
   2510  1.1  christos           inst_env->invalid = 1;
   2511  1.1  christos           return;
   2512  1.1  christos         }
   2513  1.1  christos       /* The shift size is given as a 5 bit quick value, i.e. we don't
   2514  1.1  christos          want the sign bit of the quick value.  */
   2515  1.1  christos       shift_steps = cris_get_asr_shift_steps (inst);
   2516  1.1  christos       value = inst_env->reg[REG_PC];
   2517  1.1  christos       if (value & SIGNED_DWORD_MASK)
   2518  1.1  christos         {
   2519  1.1  christos           signed_extend_mask = 0xFFFFFFFF;
   2520  1.1  christos           signed_extend_mask = signed_extend_mask >> shift_steps;
   2521  1.1  christos           signed_extend_mask = ~signed_extend_mask;
   2522  1.1  christos         }
   2523  1.1  christos       value = value >> shift_steps;
   2524  1.1  christos       value |= signed_extend_mask;
   2525  1.1  christos       inst_env->reg[REG_PC]  = value;
   2526  1.1  christos     }
   2527  1.1  christos   inst_env->slot_needed = 0;
   2528  1.1  christos   inst_env->prefix_found = 0;
   2529  1.1  christos   inst_env->xflag_found = 0;
   2530  1.1  christos   inst_env->disable_interrupt = 0;
   2531  1.1  christos }
   2532  1.1  christos 
   2533  1.1  christos /* Handles the AX, EI and SETF instruction.  */
   2534  1.1  christos 
   2535  1.1  christos static void
   2536  1.1  christos ax_ei_setf_op (unsigned short inst, inst_env_type *inst_env)
   2537  1.1  christos {
   2538  1.1  christos   if (inst_env->prefix_found)
   2539  1.1  christos     {
   2540  1.1  christos       inst_env->invalid = 1;
   2541  1.1  christos       return;
   2542  1.1  christos     }
   2543  1.1  christos   /* Check if the instruction is setting the X flag.  */
   2544  1.1  christos   if (cris_is_xflag_bit_on (inst))
   2545  1.1  christos     {
   2546  1.1  christos       inst_env->xflag_found = 1;
   2547  1.1  christos     }
   2548  1.1  christos   else
   2549  1.1  christos     {
   2550  1.1  christos       inst_env->xflag_found = 0;
   2551  1.1  christos     }
   2552  1.1  christos   inst_env->slot_needed = 0;
   2553  1.1  christos   inst_env->prefix_found = 0;
   2554  1.1  christos   inst_env->disable_interrupt = 1;
   2555  1.1  christos }
   2556  1.1  christos 
   2557  1.1  christos /* Checks if the instruction is in assign mode.  If so, it updates the assign
   2558  1.1  christos    register.  Note that check_assign assumes that the caller has checked that
   2559  1.1  christos    there is a prefix to this instruction.  The mode check depends on this.  */
   2560  1.1  christos 
   2561  1.1  christos static void
   2562  1.1  christos check_assign (unsigned short inst, inst_env_type *inst_env)
   2563  1.1  christos {
   2564  1.1  christos   /* Check if it's an assign addressing mode.  */
   2565  1.1  christos   if (cris_get_mode (inst) == PREFIX_ASSIGN_MODE)
   2566  1.1  christos     {
   2567  1.1  christos       /* Assign the prefix value to operand 1.  */
   2568  1.1  christos       inst_env->reg[cris_get_operand1 (inst)] = inst_env->prefix_value;
   2569  1.1  christos     }
   2570  1.1  christos }
   2571  1.1  christos 
   2572  1.1  christos /* Handles the 2-operand BOUND instruction.  */
   2573  1.1  christos 
   2574  1.1  christos static void
   2575  1.1  christos two_operand_bound_op (unsigned short inst, inst_env_type *inst_env)
   2576  1.1  christos {
   2577  1.1  christos   /* It's invalid to have the PC as the index operand.  */
   2578  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   2579  1.1  christos     {
   2580  1.1  christos       inst_env->invalid = 1;
   2581  1.1  christos       return;
   2582  1.1  christos     }
   2583  1.1  christos   /* Check if we have a prefix.  */
   2584  1.1  christos   if (inst_env->prefix_found)
   2585  1.1  christos     {
   2586  1.1  christos       check_assign (inst, inst_env);
   2587  1.1  christos     }
   2588  1.1  christos   /* Check if this is an autoincrement mode.  */
   2589  1.1  christos   else if (cris_get_mode (inst) == AUTOINC_MODE)
   2590  1.1  christos     {
   2591  1.1  christos       /* It's invalid to change the PC in a delay slot.  */
   2592  1.1  christos       if (inst_env->slot_needed)
   2593  1.1  christos         {
   2594  1.1  christos           inst_env->invalid = 1;
   2595  1.1  christos           return;
   2596  1.1  christos         }
   2597  1.1  christos       process_autoincrement (cris_get_size (inst), inst, inst_env);
   2598  1.1  christos     }
   2599  1.1  christos   inst_env->slot_needed = 0;
   2600  1.1  christos   inst_env->prefix_found = 0;
   2601  1.1  christos   inst_env->xflag_found = 0;
   2602  1.1  christos   inst_env->disable_interrupt = 0;
   2603  1.1  christos }
   2604  1.1  christos 
   2605  1.1  christos /* Handles the 3-operand BOUND instruction.  */
   2606  1.1  christos 
   2607  1.1  christos static void
   2608  1.1  christos three_operand_bound_op (unsigned short inst, inst_env_type *inst_env)
   2609  1.1  christos {
   2610  1.1  christos   /* It's an error if we haven't got a prefix.  And it's also an error
   2611  1.1  christos      if the PC is the destination register.  */
   2612  1.1  christos   if ((!inst_env->prefix_found) || (cris_get_operand1 (inst) == REG_PC))
   2613  1.1  christos     {
   2614  1.1  christos       inst_env->invalid = 1;
   2615  1.1  christos       return;
   2616  1.1  christos     }
   2617  1.1  christos   inst_env->slot_needed = 0;
   2618  1.1  christos   inst_env->prefix_found = 0;
   2619  1.1  christos   inst_env->xflag_found = 0;
   2620  1.1  christos   inst_env->disable_interrupt = 0;
   2621  1.1  christos }
   2622  1.1  christos 
   2623  1.1  christos /* Clears the status flags in inst_env.  */
   2624  1.1  christos 
   2625  1.1  christos static void
   2626  1.1  christos btst_nop_op (unsigned short inst, inst_env_type *inst_env)
   2627  1.1  christos {
   2628  1.1  christos   /* It's an error if we have got a prefix.  */
   2629  1.1  christos   if (inst_env->prefix_found)
   2630  1.1  christos     {
   2631  1.1  christos       inst_env->invalid = 1;
   2632  1.1  christos       return;
   2633  1.1  christos     }
   2634  1.1  christos 
   2635  1.1  christos   inst_env->slot_needed = 0;
   2636  1.1  christos   inst_env->prefix_found = 0;
   2637  1.1  christos   inst_env->xflag_found = 0;
   2638  1.1  christos   inst_env->disable_interrupt = 0;
   2639  1.1  christos }
   2640  1.1  christos 
   2641  1.1  christos /* Clears the status flags in inst_env.  */
   2642  1.1  christos 
   2643  1.1  christos static void
   2644  1.1  christos clearf_di_op (unsigned short inst, inst_env_type *inst_env)
   2645  1.1  christos {
   2646  1.1  christos   /* It's an error if we have got a prefix.  */
   2647  1.1  christos   if (inst_env->prefix_found)
   2648  1.1  christos     {
   2649  1.1  christos       inst_env->invalid = 1;
   2650  1.1  christos       return;
   2651  1.1  christos     }
   2652  1.1  christos 
   2653  1.1  christos   inst_env->slot_needed = 0;
   2654  1.1  christos   inst_env->prefix_found = 0;
   2655  1.1  christos   inst_env->xflag_found = 0;
   2656  1.1  christos   inst_env->disable_interrupt = 1;
   2657  1.1  christos }
   2658  1.1  christos 
   2659  1.1  christos /* Handles the CLEAR instruction if it's in register mode.  */
   2660  1.1  christos 
   2661  1.1  christos static void
   2662  1.1  christos reg_mode_clear_op (unsigned short inst, inst_env_type *inst_env)
   2663  1.1  christos {
   2664  1.1  christos   /* Check if the target is the PC.  */
   2665  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   2666  1.1  christos     {
   2667  1.1  christos       /* The instruction will clear the instruction's size bits.  */
   2668  1.1  christos       int clear_size = cris_get_clear_size (inst);
   2669  1.1  christos       if (clear_size == INST_BYTE_SIZE)
   2670  1.1  christos         {
   2671  1.1  christos           inst_env->delay_slot_pc = inst_env->reg[REG_PC] & 0xFFFFFF00;
   2672  1.1  christos         }
   2673  1.1  christos       if (clear_size == INST_WORD_SIZE)
   2674  1.1  christos         {
   2675  1.1  christos           inst_env->delay_slot_pc = inst_env->reg[REG_PC] & 0xFFFF0000;
   2676  1.1  christos         }
   2677  1.1  christos       if (clear_size == INST_DWORD_SIZE)
   2678  1.1  christos         {
   2679  1.1  christos           inst_env->delay_slot_pc = 0x0;
   2680  1.1  christos         }
   2681  1.1  christos       /* The jump will be delayed with one delay slot.  So we need a delay
   2682  1.1  christos          slot.  */
   2683  1.1  christos       inst_env->slot_needed = 1;
   2684  1.1  christos       inst_env->delay_slot_pc_active = 1;
   2685  1.1  christos     }
   2686  1.1  christos   else
   2687  1.1  christos     {
   2688  1.1  christos       /* The PC will not change => no delay slot.  */
   2689  1.1  christos       inst_env->slot_needed = 0;
   2690  1.1  christos     }
   2691  1.1  christos   inst_env->prefix_found = 0;
   2692  1.1  christos   inst_env->xflag_found = 0;
   2693  1.1  christos   inst_env->disable_interrupt = 0;
   2694  1.1  christos }
   2695  1.1  christos 
   2696  1.1  christos /* Handles the TEST instruction if it's in register mode.  */
   2697  1.1  christos 
   2698  1.1  christos static void
   2699  1.1  christos reg_mode_test_op (unsigned short inst, inst_env_type *inst_env)
   2700  1.1  christos {
   2701  1.1  christos   /* It's an error if we have got a prefix.  */
   2702  1.1  christos   if (inst_env->prefix_found)
   2703  1.1  christos     {
   2704  1.1  christos       inst_env->invalid = 1;
   2705  1.1  christos       return;
   2706  1.1  christos     }
   2707  1.1  christos   inst_env->slot_needed = 0;
   2708  1.1  christos   inst_env->prefix_found = 0;
   2709  1.1  christos   inst_env->xflag_found = 0;
   2710  1.1  christos   inst_env->disable_interrupt = 0;
   2711  1.1  christos 
   2712  1.1  christos }
   2713  1.1  christos 
   2714  1.1  christos /* Handles the CLEAR and TEST instruction if the instruction isn't
   2715  1.1  christos    in register mode.  */
   2716  1.1  christos 
   2717  1.1  christos static void
   2718  1.1  christos none_reg_mode_clear_test_op (unsigned short inst, inst_env_type *inst_env)
   2719  1.1  christos {
   2720  1.1  christos   /* Check if we are in a prefix mode.  */
   2721  1.1  christos   if (inst_env->prefix_found)
   2722  1.1  christos     {
   2723  1.1  christos       /* The only way the PC can change is if this instruction is in
   2724  1.1  christos          assign addressing mode.  */
   2725  1.1  christos       check_assign (inst, inst_env);
   2726  1.1  christos     }
   2727  1.1  christos   /* Indirect mode can't change the PC so just check if the mode is
   2728  1.1  christos      autoincrement.  */
   2729  1.1  christos   else if (cris_get_mode (inst) == AUTOINC_MODE)
   2730  1.1  christos     {
   2731  1.1  christos       process_autoincrement (cris_get_size (inst), inst, inst_env);
   2732  1.1  christos     }
   2733  1.1  christos   inst_env->slot_needed = 0;
   2734  1.1  christos   inst_env->prefix_found = 0;
   2735  1.1  christos   inst_env->xflag_found = 0;
   2736  1.1  christos   inst_env->disable_interrupt = 0;
   2737  1.1  christos }
   2738  1.1  christos 
   2739  1.1  christos /* Checks that the PC isn't the destination register or the instructions has
   2740  1.1  christos    a prefix.  */
   2741  1.1  christos 
   2742  1.1  christos static void
   2743  1.1  christos dstep_logshift_mstep_neg_not_op (unsigned short inst, inst_env_type *inst_env)
   2744  1.1  christos {
   2745  1.1  christos   /* It's invalid to have the PC as the destination.  The instruction can't
   2746  1.1  christos      have a prefix.  */
   2747  1.1  christos   if ((cris_get_operand2 (inst) == REG_PC) || inst_env->prefix_found)
   2748  1.1  christos     {
   2749  1.1  christos       inst_env->invalid = 1;
   2750  1.1  christos       return;
   2751  1.1  christos     }
   2752  1.1  christos 
   2753  1.1  christos   inst_env->slot_needed = 0;
   2754  1.1  christos   inst_env->prefix_found = 0;
   2755  1.1  christos   inst_env->xflag_found = 0;
   2756  1.1  christos   inst_env->disable_interrupt = 0;
   2757  1.1  christos }
   2758  1.1  christos 
   2759  1.1  christos /* Checks that the instruction doesn't have a prefix.  */
   2760  1.1  christos 
   2761  1.1  christos static void
   2762  1.1  christos break_op (unsigned short inst, inst_env_type *inst_env)
   2763  1.1  christos {
   2764  1.1  christos   /* The instruction can't have a prefix.  */
   2765  1.1  christos   if (inst_env->prefix_found)
   2766  1.1  christos     {
   2767  1.1  christos       inst_env->invalid = 1;
   2768  1.1  christos       return;
   2769  1.1  christos     }
   2770  1.1  christos 
   2771  1.1  christos   inst_env->slot_needed = 0;
   2772  1.1  christos   inst_env->prefix_found = 0;
   2773  1.1  christos   inst_env->xflag_found = 0;
   2774  1.1  christos   inst_env->disable_interrupt = 1;
   2775  1.1  christos }
   2776  1.1  christos 
   2777  1.1  christos /* Checks that the PC isn't the destination register and that the instruction
   2778  1.1  christos    doesn't have a prefix.  */
   2779  1.1  christos 
   2780  1.1  christos static void
   2781  1.1  christos scc_op (unsigned short inst, inst_env_type *inst_env)
   2782  1.1  christos {
   2783  1.1  christos   /* It's invalid to have the PC as the destination.  The instruction can't
   2784  1.1  christos      have a prefix.  */
   2785  1.1  christos   if ((cris_get_operand2 (inst) == REG_PC) || inst_env->prefix_found)
   2786  1.1  christos     {
   2787  1.1  christos       inst_env->invalid = 1;
   2788  1.1  christos       return;
   2789  1.1  christos     }
   2790  1.1  christos 
   2791  1.1  christos   inst_env->slot_needed = 0;
   2792  1.1  christos   inst_env->prefix_found = 0;
   2793  1.1  christos   inst_env->xflag_found = 0;
   2794  1.1  christos   inst_env->disable_interrupt = 1;
   2795  1.1  christos }
   2796  1.1  christos 
   2797  1.1  christos /* Handles the register mode JUMP instruction.  */
   2798  1.1  christos 
   2799  1.1  christos static void
   2800  1.1  christos reg_mode_jump_op (unsigned short inst, inst_env_type *inst_env)
   2801  1.1  christos {
   2802  1.1  christos   /* It's invalid to do a JUMP in a delay slot.  The mode is register, so
   2803  1.1  christos      you can't have a prefix.  */
   2804  1.1  christos   if ((inst_env->slot_needed) || (inst_env->prefix_found))
   2805  1.1  christos     {
   2806  1.1  christos       inst_env->invalid = 1;
   2807  1.1  christos       return;
   2808  1.1  christos     }
   2809  1.1  christos 
   2810  1.1  christos   /* Just change the PC.  */
   2811  1.1  christos   inst_env->reg[REG_PC] = inst_env->reg[cris_get_operand1 (inst)];
   2812  1.1  christos   inst_env->slot_needed = 0;
   2813  1.1  christos   inst_env->prefix_found = 0;
   2814  1.1  christos   inst_env->xflag_found = 0;
   2815  1.1  christos   inst_env->disable_interrupt = 1;
   2816  1.1  christos }
   2817  1.1  christos 
   2818  1.1  christos /* Handles the JUMP instruction for all modes except register.  */
   2819  1.1  christos 
   2820  1.1  christos static void
   2821  1.1  christos none_reg_mode_jump_op (unsigned short inst, inst_env_type *inst_env)
   2822  1.1  christos {
   2823  1.1  christos   unsigned long newpc;
   2824  1.1  christos   CORE_ADDR address;
   2825  1.1  christos 
   2826  1.1  christos   /* It's invalid to do a JUMP in a delay slot.  */
   2827  1.1  christos   if (inst_env->slot_needed)
   2828  1.1  christos     {
   2829  1.1  christos       inst_env->invalid = 1;
   2830  1.1  christos     }
   2831  1.1  christos   else
   2832  1.1  christos     {
   2833  1.1  christos       /* Check if we have a prefix.  */
   2834  1.1  christos       if (inst_env->prefix_found)
   2835  1.1  christos         {
   2836  1.1  christos           check_assign (inst, inst_env);
   2837  1.1  christos 
   2838  1.1  christos           /* Get the new value for the PC.  */
   2839  1.1  christos           newpc =
   2840  1.1  christos             read_memory_unsigned_integer ((CORE_ADDR) inst_env->prefix_value,
   2841  1.1  christos                                           4, inst_env->byte_order);
   2842  1.1  christos         }
   2843  1.1  christos       else
   2844  1.1  christos         {
   2845  1.1  christos           /* Get the new value for the PC.  */
   2846  1.1  christos           address = (CORE_ADDR) inst_env->reg[cris_get_operand1 (inst)];
   2847  1.1  christos           newpc = read_memory_unsigned_integer (address,
   2848  1.1  christos 						4, inst_env->byte_order);
   2849  1.1  christos 
   2850  1.1  christos           /* Check if we should increment a register.  */
   2851  1.1  christos           if (cris_get_mode (inst) == AUTOINC_MODE)
   2852  1.1  christos             {
   2853  1.1  christos               inst_env->reg[cris_get_operand1 (inst)] += 4;
   2854  1.1  christos             }
   2855  1.1  christos         }
   2856  1.1  christos       inst_env->reg[REG_PC] = newpc;
   2857  1.1  christos     }
   2858  1.1  christos   inst_env->slot_needed = 0;
   2859  1.1  christos   inst_env->prefix_found = 0;
   2860  1.1  christos   inst_env->xflag_found = 0;
   2861  1.1  christos   inst_env->disable_interrupt = 1;
   2862  1.1  christos }
   2863  1.1  christos 
   2864  1.1  christos /* Handles moves to special registers (aka P-register) for all modes.  */
   2865  1.1  christos 
   2866  1.1  christos static void
   2867  1.1  christos move_to_preg_op (struct gdbarch *gdbarch, unsigned short inst,
   2868  1.1  christos 		 inst_env_type *inst_env)
   2869  1.1  christos {
   2870  1.1  christos   if (inst_env->prefix_found)
   2871  1.1  christos     {
   2872  1.1  christos       /* The instruction has a prefix that means we are only interested if
   2873  1.1  christos          the instruction is in assign mode.  */
   2874  1.1  christos       if (cris_get_mode (inst) == PREFIX_ASSIGN_MODE)
   2875  1.1  christos         {
   2876  1.1  christos           /* The prefix handles the problem if we are in a delay slot.  */
   2877  1.1  christos           if (cris_get_operand1 (inst) == REG_PC)
   2878  1.1  christos             {
   2879  1.1  christos               /* Just take care of the assign.  */
   2880  1.1  christos               check_assign (inst, inst_env);
   2881  1.1  christos             }
   2882  1.1  christos         }
   2883  1.1  christos     }
   2884  1.1  christos   else if (cris_get_mode (inst) == AUTOINC_MODE)
   2885  1.1  christos     {
   2886  1.1  christos       /* The instruction doesn't have a prefix, the only case left that we
   2887  1.1  christos          are interested in is the autoincrement mode.  */
   2888  1.1  christos       if (cris_get_operand1 (inst) == REG_PC)
   2889  1.1  christos         {
   2890  1.1  christos           /* If the PC is to be incremented it's invalid to be in a
   2891  1.1  christos              delay slot.  */
   2892  1.1  christos           if (inst_env->slot_needed)
   2893  1.1  christos             {
   2894  1.1  christos               inst_env->invalid = 1;
   2895  1.1  christos               return;
   2896  1.1  christos             }
   2897  1.1  christos 
   2898  1.1  christos           /* The increment depends on the size of the special register.  */
   2899  1.1  christos           if (cris_register_size (gdbarch, cris_get_operand2 (inst)) == 1)
   2900  1.1  christos             {
   2901  1.1  christos               process_autoincrement (INST_BYTE_SIZE, inst, inst_env);
   2902  1.1  christos             }
   2903  1.1  christos           else if (cris_register_size (gdbarch, cris_get_operand2 (inst)) == 2)
   2904  1.1  christos             {
   2905  1.1  christos               process_autoincrement (INST_WORD_SIZE, inst, inst_env);
   2906  1.1  christos             }
   2907  1.1  christos           else
   2908  1.1  christos             {
   2909  1.1  christos               process_autoincrement (INST_DWORD_SIZE, inst, inst_env);
   2910  1.1  christos             }
   2911  1.1  christos         }
   2912  1.1  christos     }
   2913  1.1  christos   inst_env->slot_needed = 0;
   2914  1.1  christos   inst_env->prefix_found = 0;
   2915  1.1  christos   inst_env->xflag_found = 0;
   2916  1.1  christos   inst_env->disable_interrupt = 1;
   2917  1.1  christos }
   2918  1.1  christos 
   2919  1.1  christos /* Handles moves from special registers (aka P-register) for all modes
   2920  1.1  christos    except register.  */
   2921  1.1  christos 
   2922  1.1  christos static void
   2923  1.1  christos none_reg_mode_move_from_preg_op (struct gdbarch *gdbarch, unsigned short inst,
   2924  1.1  christos 				 inst_env_type *inst_env)
   2925  1.1  christos {
   2926  1.1  christos   if (inst_env->prefix_found)
   2927  1.1  christos     {
   2928  1.1  christos       /* The instruction has a prefix that means we are only interested if
   2929  1.1  christos          the instruction is in assign mode.  */
   2930  1.1  christos       if (cris_get_mode (inst) == PREFIX_ASSIGN_MODE)
   2931  1.1  christos         {
   2932  1.1  christos           /* The prefix handles the problem if we are in a delay slot.  */
   2933  1.1  christos           if (cris_get_operand1 (inst) == REG_PC)
   2934  1.1  christos             {
   2935  1.1  christos               /* Just take care of the assign.  */
   2936  1.1  christos               check_assign (inst, inst_env);
   2937  1.1  christos             }
   2938  1.1  christos         }
   2939  1.1  christos     }
   2940  1.1  christos   /* The instruction doesn't have a prefix, the only case left that we
   2941  1.1  christos      are interested in is the autoincrement mode.  */
   2942  1.1  christos   else if (cris_get_mode (inst) == AUTOINC_MODE)
   2943  1.1  christos     {
   2944  1.1  christos       if (cris_get_operand1 (inst) == REG_PC)
   2945  1.1  christos         {
   2946  1.1  christos           /* If the PC is to be incremented it's invalid to be in a
   2947  1.1  christos              delay slot.  */
   2948  1.1  christos           if (inst_env->slot_needed)
   2949  1.1  christos             {
   2950  1.1  christos               inst_env->invalid = 1;
   2951  1.1  christos               return;
   2952  1.1  christos             }
   2953  1.1  christos 
   2954  1.1  christos           /* The increment depends on the size of the special register.  */
   2955  1.1  christos           if (cris_register_size (gdbarch, cris_get_operand2 (inst)) == 1)
   2956  1.1  christos             {
   2957  1.1  christos               process_autoincrement (INST_BYTE_SIZE, inst, inst_env);
   2958  1.1  christos             }
   2959  1.1  christos           else if (cris_register_size (gdbarch, cris_get_operand2 (inst)) == 2)
   2960  1.1  christos             {
   2961  1.1  christos               process_autoincrement (INST_WORD_SIZE, inst, inst_env);
   2962  1.1  christos             }
   2963  1.1  christos           else
   2964  1.1  christos             {
   2965  1.1  christos               process_autoincrement (INST_DWORD_SIZE, inst, inst_env);
   2966  1.1  christos             }
   2967  1.1  christos         }
   2968  1.1  christos     }
   2969  1.1  christos   inst_env->slot_needed = 0;
   2970  1.1  christos   inst_env->prefix_found = 0;
   2971  1.1  christos   inst_env->xflag_found = 0;
   2972  1.1  christos   inst_env->disable_interrupt = 1;
   2973  1.1  christos }
   2974  1.1  christos 
   2975  1.1  christos /* Handles moves from special registers (aka P-register) when the mode
   2976  1.1  christos    is register.  */
   2977  1.1  christos 
   2978  1.1  christos static void
   2979  1.1  christos reg_mode_move_from_preg_op (unsigned short inst, inst_env_type *inst_env)
   2980  1.1  christos {
   2981  1.1  christos   /* Register mode move from special register can't have a prefix.  */
   2982  1.1  christos   if (inst_env->prefix_found)
   2983  1.1  christos     {
   2984  1.1  christos       inst_env->invalid = 1;
   2985  1.1  christos       return;
   2986  1.1  christos     }
   2987  1.1  christos 
   2988  1.1  christos   if (cris_get_operand1 (inst) == REG_PC)
   2989  1.1  christos     {
   2990  1.1  christos       /* It's invalid to change the PC in a delay slot.  */
   2991  1.1  christos       if (inst_env->slot_needed)
   2992  1.1  christos         {
   2993  1.1  christos           inst_env->invalid = 1;
   2994  1.1  christos           return;
   2995  1.1  christos         }
   2996  1.1  christos       /* The destination is the PC, the jump will have a delay slot.  */
   2997  1.1  christos       inst_env->delay_slot_pc = inst_env->preg[cris_get_operand2 (inst)];
   2998  1.1  christos       inst_env->slot_needed = 1;
   2999  1.1  christos       inst_env->delay_slot_pc_active = 1;
   3000  1.1  christos     }
   3001  1.1  christos   else
   3002  1.1  christos     {
   3003  1.1  christos       /* If the destination isn't PC, there will be no jump.  */
   3004  1.1  christos       inst_env->slot_needed = 0;
   3005  1.1  christos     }
   3006  1.1  christos   inst_env->prefix_found = 0;
   3007  1.1  christos   inst_env->xflag_found = 0;
   3008  1.1  christos   inst_env->disable_interrupt = 1;
   3009  1.1  christos }
   3010  1.1  christos 
   3011  1.1  christos /* Handles the MOVEM from memory to general register instruction.  */
   3012  1.1  christos 
   3013  1.1  christos static void
   3014  1.1  christos move_mem_to_reg_movem_op (unsigned short inst, inst_env_type *inst_env)
   3015  1.1  christos {
   3016  1.1  christos   if (inst_env->prefix_found)
   3017  1.1  christos     {
   3018  1.1  christos       /* The prefix handles the problem if we are in a delay slot.  Is the
   3019  1.1  christos          MOVEM instruction going to change the PC?  */
   3020  1.1  christos       if (cris_get_operand2 (inst) >= REG_PC)
   3021  1.1  christos         {
   3022  1.1  christos           inst_env->reg[REG_PC] =
   3023  1.1  christos             read_memory_unsigned_integer (inst_env->prefix_value,
   3024  1.1  christos 					  4, inst_env->byte_order);
   3025  1.1  christos         }
   3026  1.1  christos       /* The assign value is the value after the increment.  Normally, the
   3027  1.1  christos          assign value is the value before the increment.  */
   3028  1.1  christos       if ((cris_get_operand1 (inst) == REG_PC)
   3029  1.1  christos           && (cris_get_mode (inst) == PREFIX_ASSIGN_MODE))
   3030  1.1  christos         {
   3031  1.1  christos           inst_env->reg[REG_PC] = inst_env->prefix_value;
   3032  1.1  christos           inst_env->reg[REG_PC] += 4 * (cris_get_operand2 (inst) + 1);
   3033  1.1  christos         }
   3034  1.1  christos     }
   3035  1.1  christos   else
   3036  1.1  christos     {
   3037  1.1  christos       /* Is the MOVEM instruction going to change the PC?  */
   3038  1.1  christos       if (cris_get_operand2 (inst) == REG_PC)
   3039  1.1  christos         {
   3040  1.1  christos           /* It's invalid to change the PC in a delay slot.  */
   3041  1.1  christos           if (inst_env->slot_needed)
   3042  1.1  christos             {
   3043  1.1  christos               inst_env->invalid = 1;
   3044  1.1  christos               return;
   3045  1.1  christos             }
   3046  1.1  christos           inst_env->reg[REG_PC] =
   3047  1.1  christos             read_memory_unsigned_integer (inst_env->reg[cris_get_operand1 (inst)],
   3048  1.1  christos                                           4, inst_env->byte_order);
   3049  1.1  christos         }
   3050  1.1  christos       /* The increment is not depending on the size, instead it's depending
   3051  1.1  christos          on the number of registers loaded from memory.  */
   3052  1.1  christos       if ((cris_get_operand1 (inst) == REG_PC)
   3053  1.1  christos 	  && (cris_get_mode (inst) == AUTOINC_MODE))
   3054  1.1  christos         {
   3055  1.1  christos           /* It's invalid to change the PC in a delay slot.  */
   3056  1.1  christos           if (inst_env->slot_needed)
   3057  1.1  christos             {
   3058  1.1  christos               inst_env->invalid = 1;
   3059  1.1  christos               return;
   3060  1.1  christos             }
   3061  1.1  christos           inst_env->reg[REG_PC] += 4 * (cris_get_operand2 (inst) + 1);
   3062  1.1  christos         }
   3063  1.1  christos     }
   3064  1.1  christos   inst_env->slot_needed = 0;
   3065  1.1  christos   inst_env->prefix_found = 0;
   3066  1.1  christos   inst_env->xflag_found = 0;
   3067  1.1  christos   inst_env->disable_interrupt = 0;
   3068  1.1  christos }
   3069  1.1  christos 
   3070  1.1  christos /* Handles the MOVEM to memory from general register instruction.  */
   3071  1.1  christos 
   3072  1.1  christos static void
   3073  1.1  christos move_reg_to_mem_movem_op (unsigned short inst, inst_env_type *inst_env)
   3074  1.1  christos {
   3075  1.1  christos   if (inst_env->prefix_found)
   3076  1.1  christos     {
   3077  1.1  christos       /* The assign value is the value after the increment.  Normally, the
   3078  1.1  christos          assign value is the value before the increment.  */
   3079  1.1  christos       if ((cris_get_operand1 (inst) == REG_PC)
   3080  1.1  christos           && (cris_get_mode (inst) == PREFIX_ASSIGN_MODE))
   3081  1.1  christos         {
   3082  1.1  christos           /* The prefix handles the problem if we are in a delay slot.  */
   3083  1.1  christos           inst_env->reg[REG_PC] = inst_env->prefix_value;
   3084  1.1  christos           inst_env->reg[REG_PC] += 4 * (cris_get_operand2 (inst) + 1);
   3085  1.1  christos         }
   3086  1.1  christos     }
   3087  1.1  christos   else
   3088  1.1  christos     {
   3089  1.1  christos       /* The increment is not depending on the size, instead it's depending
   3090  1.1  christos          on the number of registers loaded to memory.  */
   3091  1.1  christos       if ((cris_get_operand1 (inst) == REG_PC)
   3092  1.1  christos 	  && (cris_get_mode (inst) == AUTOINC_MODE))
   3093  1.1  christos         {
   3094  1.1  christos           /* It's invalid to change the PC in a delay slot.  */
   3095  1.1  christos           if (inst_env->slot_needed)
   3096  1.1  christos             {
   3097  1.1  christos               inst_env->invalid = 1;
   3098  1.1  christos               return;
   3099  1.1  christos             }
   3100  1.1  christos           inst_env->reg[REG_PC] += 4 * (cris_get_operand2 (inst) + 1);
   3101  1.1  christos         }
   3102  1.1  christos     }
   3103  1.1  christos   inst_env->slot_needed = 0;
   3104  1.1  christos   inst_env->prefix_found = 0;
   3105  1.1  christos   inst_env->xflag_found = 0;
   3106  1.1  christos   inst_env->disable_interrupt = 0;
   3107  1.1  christos }
   3108  1.1  christos 
   3109  1.1  christos /* Handles the intructions that's not yet implemented, by setting
   3110  1.1  christos    inst_env->invalid to true.  */
   3111  1.1  christos 
   3112  1.1  christos static void
   3113  1.1  christos not_implemented_op (unsigned short inst, inst_env_type *inst_env)
   3114  1.1  christos {
   3115  1.1  christos   inst_env->invalid = 1;
   3116  1.1  christos }
   3117  1.1  christos 
   3118  1.1  christos /* Handles the XOR instruction.  */
   3119  1.1  christos 
   3120  1.1  christos static void
   3121  1.1  christos xor_op (unsigned short inst, inst_env_type *inst_env)
   3122  1.1  christos {
   3123  1.1  christos   /* XOR can't have a prefix.  */
   3124  1.1  christos   if (inst_env->prefix_found)
   3125  1.1  christos     {
   3126  1.1  christos       inst_env->invalid = 1;
   3127  1.1  christos       return;
   3128  1.1  christos     }
   3129  1.1  christos 
   3130  1.1  christos   /* Check if the PC is the target.  */
   3131  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3132  1.1  christos     {
   3133  1.1  christos       /* It's invalid to change the PC in a delay slot.  */
   3134  1.1  christos       if (inst_env->slot_needed)
   3135  1.1  christos         {
   3136  1.1  christos           inst_env->invalid = 1;
   3137  1.1  christos           return;
   3138  1.1  christos         }
   3139  1.1  christos       inst_env->reg[REG_PC] ^= inst_env->reg[cris_get_operand1 (inst)];
   3140  1.1  christos     }
   3141  1.1  christos   inst_env->slot_needed = 0;
   3142  1.1  christos   inst_env->prefix_found = 0;
   3143  1.1  christos   inst_env->xflag_found = 0;
   3144  1.1  christos   inst_env->disable_interrupt = 0;
   3145  1.1  christos }
   3146  1.1  christos 
   3147  1.1  christos /* Handles the MULS instruction.  */
   3148  1.1  christos 
   3149  1.1  christos static void
   3150  1.1  christos muls_op (unsigned short inst, inst_env_type *inst_env)
   3151  1.1  christos {
   3152  1.1  christos   /* MULS/U can't have a prefix.  */
   3153  1.1  christos   if (inst_env->prefix_found)
   3154  1.1  christos     {
   3155  1.1  christos       inst_env->invalid = 1;
   3156  1.1  christos       return;
   3157  1.1  christos     }
   3158  1.1  christos 
   3159  1.1  christos   /* Consider it invalid if the PC is the target.  */
   3160  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3161  1.1  christos     {
   3162  1.1  christos       inst_env->invalid = 1;
   3163  1.1  christos       return;
   3164  1.1  christos     }
   3165  1.1  christos   inst_env->slot_needed = 0;
   3166  1.1  christos   inst_env->prefix_found = 0;
   3167  1.1  christos   inst_env->xflag_found = 0;
   3168  1.1  christos   inst_env->disable_interrupt = 0;
   3169  1.1  christos }
   3170  1.1  christos 
   3171  1.1  christos /* Handles the MULU instruction.  */
   3172  1.1  christos 
   3173  1.1  christos static void
   3174  1.1  christos mulu_op (unsigned short inst, inst_env_type *inst_env)
   3175  1.1  christos {
   3176  1.1  christos   /* MULS/U can't have a prefix.  */
   3177  1.1  christos   if (inst_env->prefix_found)
   3178  1.1  christos     {
   3179  1.1  christos       inst_env->invalid = 1;
   3180  1.1  christos       return;
   3181  1.1  christos     }
   3182  1.1  christos 
   3183  1.1  christos   /* Consider it invalid if the PC is the target.  */
   3184  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3185  1.1  christos     {
   3186  1.1  christos       inst_env->invalid = 1;
   3187  1.1  christos       return;
   3188  1.1  christos     }
   3189  1.1  christos   inst_env->slot_needed = 0;
   3190  1.1  christos   inst_env->prefix_found = 0;
   3191  1.1  christos   inst_env->xflag_found = 0;
   3192  1.1  christos   inst_env->disable_interrupt = 0;
   3193  1.1  christos }
   3194  1.1  christos 
   3195  1.1  christos /* Calculate the result of the instruction for ADD, SUB, CMP AND, OR and MOVE.
   3196  1.1  christos    The MOVE instruction is the move from source to register.  */
   3197  1.1  christos 
   3198  1.1  christos static void
   3199  1.1  christos add_sub_cmp_and_or_move_action (unsigned short inst, inst_env_type *inst_env,
   3200  1.1  christos                                 unsigned long source1, unsigned long source2)
   3201  1.1  christos {
   3202  1.1  christos   unsigned long pc_mask;
   3203  1.1  christos   unsigned long operation_mask;
   3204  1.1  christos 
   3205  1.1  christos   /* Find out how many bits the operation should apply to.  */
   3206  1.1  christos   if (cris_get_size (inst) == INST_BYTE_SIZE)
   3207  1.1  christos     {
   3208  1.1  christos       pc_mask = 0xFFFFFF00;
   3209  1.1  christos       operation_mask = 0xFF;
   3210  1.1  christos     }
   3211  1.1  christos   else if (cris_get_size (inst) == INST_WORD_SIZE)
   3212  1.1  christos     {
   3213  1.1  christos       pc_mask = 0xFFFF0000;
   3214  1.1  christos       operation_mask = 0xFFFF;
   3215  1.1  christos     }
   3216  1.1  christos   else if (cris_get_size (inst) == INST_DWORD_SIZE)
   3217  1.1  christos     {
   3218  1.1  christos       pc_mask = 0x0;
   3219  1.1  christos       operation_mask = 0xFFFFFFFF;
   3220  1.1  christos     }
   3221  1.1  christos   else
   3222  1.1  christos     {
   3223  1.1  christos       /* The size is out of range.  */
   3224  1.1  christos       inst_env->invalid = 1;
   3225  1.1  christos       return;
   3226  1.1  christos     }
   3227  1.1  christos 
   3228  1.1  christos   /* The instruction just works on uw_operation_mask bits.  */
   3229  1.1  christos   source2 &= operation_mask;
   3230  1.1  christos   source1 &= operation_mask;
   3231  1.1  christos 
   3232  1.1  christos   /* Now calculate the result.  The opcode's 3 first bits separates
   3233  1.1  christos      the different actions.  */
   3234  1.1  christos   switch (cris_get_opcode (inst) & 7)
   3235  1.1  christos     {
   3236  1.1  christos     case 0:  /* add */
   3237  1.1  christos       source1 += source2;
   3238  1.1  christos       break;
   3239  1.1  christos 
   3240  1.1  christos     case 1:  /* move */
   3241  1.1  christos       source1 = source2;
   3242  1.1  christos       break;
   3243  1.1  christos 
   3244  1.1  christos     case 2:  /* subtract */
   3245  1.1  christos       source1 -= source2;
   3246  1.1  christos       break;
   3247  1.1  christos 
   3248  1.1  christos     case 3:  /* compare */
   3249  1.1  christos       break;
   3250  1.1  christos 
   3251  1.1  christos     case 4:  /* and */
   3252  1.1  christos       source1 &= source2;
   3253  1.1  christos       break;
   3254  1.1  christos 
   3255  1.1  christos     case 5:  /* or */
   3256  1.1  christos       source1 |= source2;
   3257  1.1  christos       break;
   3258  1.1  christos 
   3259  1.1  christos     default:
   3260  1.1  christos       inst_env->invalid = 1;
   3261  1.1  christos       return;
   3262  1.1  christos 
   3263  1.1  christos       break;
   3264  1.1  christos     }
   3265  1.1  christos 
   3266  1.1  christos   /* Make sure that the result doesn't contain more than the instruction
   3267  1.1  christos      size bits.  */
   3268  1.1  christos   source2 &= operation_mask;
   3269  1.1  christos 
   3270  1.1  christos   /* Calculate the new breakpoint address.  */
   3271  1.1  christos   inst_env->reg[REG_PC] &= pc_mask;
   3272  1.1  christos   inst_env->reg[REG_PC] |= source1;
   3273  1.1  christos 
   3274  1.1  christos }
   3275  1.1  christos 
   3276  1.1  christos /* Extends the value from either byte or word size to a dword.  If the mode
   3277  1.1  christos    is zero extend then the value is extended with zero.  If instead the mode
   3278  1.1  christos    is signed extend the sign bit of the value is taken into consideration.  */
   3279  1.1  christos 
   3280  1.1  christos static unsigned long
   3281  1.1  christos do_sign_or_zero_extend (unsigned long value, unsigned short *inst)
   3282  1.1  christos {
   3283  1.1  christos   /* The size can be either byte or word, check which one it is.
   3284  1.1  christos      Don't check the highest bit, it's indicating if it's a zero
   3285  1.1  christos      or sign extend.  */
   3286  1.1  christos   if (cris_get_size (*inst) & INST_WORD_SIZE)
   3287  1.1  christos     {
   3288  1.1  christos       /* Word size.  */
   3289  1.1  christos       value &= 0xFFFF;
   3290  1.1  christos 
   3291  1.1  christos       /* Check if the instruction is signed extend.  If so, check if value has
   3292  1.1  christos          the sign bit on.  */
   3293  1.1  christos       if (cris_is_signed_extend_bit_on (*inst) && (value & SIGNED_WORD_MASK))
   3294  1.1  christos         {
   3295  1.1  christos           value |= SIGNED_WORD_EXTEND_MASK;
   3296  1.1  christos         }
   3297  1.1  christos     }
   3298  1.1  christos   else
   3299  1.1  christos     {
   3300  1.1  christos       /* Byte size.  */
   3301  1.1  christos       value &= 0xFF;
   3302  1.1  christos 
   3303  1.1  christos       /* Check if the instruction is signed extend.  If so, check if value has
   3304  1.1  christos          the sign bit on.  */
   3305  1.1  christos       if (cris_is_signed_extend_bit_on (*inst) && (value & SIGNED_BYTE_MASK))
   3306  1.1  christos         {
   3307  1.1  christos           value |= SIGNED_BYTE_EXTEND_MASK;
   3308  1.1  christos         }
   3309  1.1  christos     }
   3310  1.1  christos   /* The size should now be dword.  */
   3311  1.1  christos   cris_set_size_to_dword (inst);
   3312  1.1  christos   return value;
   3313  1.1  christos }
   3314  1.1  christos 
   3315  1.1  christos /* Handles the register mode for the ADD, SUB, CMP, AND, OR and MOVE
   3316  1.1  christos    instruction.  The MOVE instruction is the move from source to register.  */
   3317  1.1  christos 
   3318  1.1  christos static void
   3319  1.1  christos reg_mode_add_sub_cmp_and_or_move_op (unsigned short inst,
   3320  1.1  christos                                      inst_env_type *inst_env)
   3321  1.1  christos {
   3322  1.1  christos   unsigned long operand1;
   3323  1.1  christos   unsigned long operand2;
   3324  1.1  christos 
   3325  1.1  christos   /* It's invalid to have a prefix to the instruction.  This is a register
   3326  1.1  christos      mode instruction and can't have a prefix.  */
   3327  1.1  christos   if (inst_env->prefix_found)
   3328  1.1  christos     {
   3329  1.1  christos       inst_env->invalid = 1;
   3330  1.1  christos       return;
   3331  1.1  christos     }
   3332  1.1  christos   /* Check if the instruction has PC as its target.  */
   3333  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3334  1.1  christos     {
   3335  1.1  christos       if (inst_env->slot_needed)
   3336  1.1  christos         {
   3337  1.1  christos           inst_env->invalid = 1;
   3338  1.1  christos           return;
   3339  1.1  christos         }
   3340  1.1  christos       /* The instruction has the PC as its target register.  */
   3341  1.1  christos       operand1 = inst_env->reg[cris_get_operand1 (inst)];
   3342  1.1  christos       operand2 = inst_env->reg[REG_PC];
   3343  1.1  christos 
   3344  1.1  christos       /* Check if it's a extend, signed or zero instruction.  */
   3345  1.1  christos       if (cris_get_opcode (inst) < 4)
   3346  1.1  christos         {
   3347  1.1  christos           operand1 = do_sign_or_zero_extend (operand1, &inst);
   3348  1.1  christos         }
   3349  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3350  1.1  christos          breakpoint should be.  The order of the udw_operands is vital.  */
   3351  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand1);
   3352  1.1  christos     }
   3353  1.1  christos   inst_env->slot_needed = 0;
   3354  1.1  christos   inst_env->prefix_found = 0;
   3355  1.1  christos   inst_env->xflag_found = 0;
   3356  1.1  christos   inst_env->disable_interrupt = 0;
   3357  1.1  christos }
   3358  1.1  christos 
   3359  1.1  christos /* Returns the data contained at address.  The size of the data is derived from
   3360  1.1  christos    the size of the operation.  If the instruction is a zero or signed
   3361  1.1  christos    extend instruction, the size field is changed in instruction.  */
   3362  1.1  christos 
   3363  1.1  christos static unsigned long
   3364  1.1  christos get_data_from_address (unsigned short *inst, CORE_ADDR address,
   3365  1.1  christos 		       enum bfd_endian byte_order)
   3366  1.1  christos {
   3367  1.1  christos   int size = cris_get_size (*inst);
   3368  1.1  christos   unsigned long value;
   3369  1.1  christos 
   3370  1.1  christos   /* If it's an extend instruction we don't want the signed extend bit,
   3371  1.1  christos      because it influences the size.  */
   3372  1.1  christos   if (cris_get_opcode (*inst) < 4)
   3373  1.1  christos     {
   3374  1.1  christos       size &= ~SIGNED_EXTEND_BIT_MASK;
   3375  1.1  christos     }
   3376  1.1  christos   /* Is there a need for checking the size?  Size should contain the number of
   3377  1.1  christos      bytes to read.  */
   3378  1.1  christos   size = 1 << size;
   3379  1.1  christos   value = read_memory_unsigned_integer (address, size, byte_order);
   3380  1.1  christos 
   3381  1.1  christos   /* Check if it's an extend, signed or zero instruction.  */
   3382  1.1  christos   if (cris_get_opcode (*inst) < 4)
   3383  1.1  christos     {
   3384  1.1  christos       value = do_sign_or_zero_extend (value, inst);
   3385  1.1  christos     }
   3386  1.1  christos   return value;
   3387  1.1  christos }
   3388  1.1  christos 
   3389  1.1  christos /* Handles the assign addresing mode for the ADD, SUB, CMP, AND, OR and MOVE
   3390  1.1  christos    instructions.  The MOVE instruction is the move from source to register.  */
   3391  1.1  christos 
   3392  1.1  christos static void
   3393  1.1  christos handle_prefix_assign_mode_for_aritm_op (unsigned short inst,
   3394  1.1  christos                                         inst_env_type *inst_env)
   3395  1.1  christos {
   3396  1.1  christos   unsigned long operand2;
   3397  1.1  christos   unsigned long operand3;
   3398  1.1  christos 
   3399  1.1  christos   check_assign (inst, inst_env);
   3400  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3401  1.1  christos     {
   3402  1.1  christos       operand2 = inst_env->reg[REG_PC];
   3403  1.1  christos 
   3404  1.1  christos       /* Get the value of the third operand.  */
   3405  1.1  christos       operand3 = get_data_from_address (&inst, inst_env->prefix_value,
   3406  1.1  christos 					inst_env->byte_order);
   3407  1.1  christos 
   3408  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3409  1.1  christos          breakpoint should be.  The order of the udw_operands is vital.  */
   3410  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand3);
   3411  1.1  christos     }
   3412  1.1  christos   inst_env->slot_needed = 0;
   3413  1.1  christos   inst_env->prefix_found = 0;
   3414  1.1  christos   inst_env->xflag_found = 0;
   3415  1.1  christos   inst_env->disable_interrupt = 0;
   3416  1.1  christos }
   3417  1.1  christos 
   3418  1.1  christos /* Handles the three-operand addressing mode for the ADD, SUB, CMP, AND and
   3419  1.1  christos    OR instructions.  Note that for this to work as expected, the calling
   3420  1.1  christos    function must have made sure that there is a prefix to this instruction.  */
   3421  1.1  christos 
   3422  1.1  christos static void
   3423  1.1  christos three_operand_add_sub_cmp_and_or_op (unsigned short inst,
   3424  1.1  christos                                      inst_env_type *inst_env)
   3425  1.1  christos {
   3426  1.1  christos   unsigned long operand2;
   3427  1.1  christos   unsigned long operand3;
   3428  1.1  christos 
   3429  1.1  christos   if (cris_get_operand1 (inst) == REG_PC)
   3430  1.1  christos     {
   3431  1.1  christos       /* The PC will be changed by the instruction.  */
   3432  1.1  christos       operand2 = inst_env->reg[cris_get_operand2 (inst)];
   3433  1.1  christos 
   3434  1.1  christos       /* Get the value of the third operand.  */
   3435  1.1  christos       operand3 = get_data_from_address (&inst, inst_env->prefix_value,
   3436  1.1  christos 					inst_env->byte_order);
   3437  1.1  christos 
   3438  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3439  1.1  christos          breakpoint should be.  */
   3440  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand3);
   3441  1.1  christos     }
   3442  1.1  christos   inst_env->slot_needed = 0;
   3443  1.1  christos   inst_env->prefix_found = 0;
   3444  1.1  christos   inst_env->xflag_found = 0;
   3445  1.1  christos   inst_env->disable_interrupt = 0;
   3446  1.1  christos }
   3447  1.1  christos 
   3448  1.1  christos /* Handles the index addresing mode for the ADD, SUB, CMP, AND, OR and MOVE
   3449  1.1  christos    instructions.  The MOVE instruction is the move from source to register.  */
   3450  1.1  christos 
   3451  1.1  christos static void
   3452  1.1  christos handle_prefix_index_mode_for_aritm_op (unsigned short inst,
   3453  1.1  christos                                        inst_env_type *inst_env)
   3454  1.1  christos {
   3455  1.1  christos   if (cris_get_operand1 (inst) != cris_get_operand2 (inst))
   3456  1.1  christos     {
   3457  1.1  christos       /* If the instruction is MOVE it's invalid.  If the instruction is ADD,
   3458  1.1  christos          SUB, AND or OR something weird is going on (if everything works these
   3459  1.1  christos          instructions should end up in the three operand version).  */
   3460  1.1  christos       inst_env->invalid = 1;
   3461  1.1  christos       return;
   3462  1.1  christos     }
   3463  1.1  christos   else
   3464  1.1  christos     {
   3465  1.1  christos       /* three_operand_add_sub_cmp_and_or does the same as we should do here
   3466  1.1  christos          so use it.  */
   3467  1.1  christos       three_operand_add_sub_cmp_and_or_op (inst, inst_env);
   3468  1.1  christos     }
   3469  1.1  christos   inst_env->slot_needed = 0;
   3470  1.1  christos   inst_env->prefix_found = 0;
   3471  1.1  christos   inst_env->xflag_found = 0;
   3472  1.1  christos   inst_env->disable_interrupt = 0;
   3473  1.1  christos }
   3474  1.1  christos 
   3475  1.1  christos /* Handles the autoincrement and indirect addresing mode for the ADD, SUB,
   3476  1.1  christos    CMP, AND OR and MOVE instruction.  The MOVE instruction is the move from
   3477  1.1  christos    source to register.  */
   3478  1.1  christos 
   3479  1.1  christos static void
   3480  1.1  christos handle_inc_and_index_mode_for_aritm_op (unsigned short inst,
   3481  1.1  christos                                         inst_env_type *inst_env)
   3482  1.1  christos {
   3483  1.1  christos   unsigned long operand1;
   3484  1.1  christos   unsigned long operand2;
   3485  1.1  christos   unsigned long operand3;
   3486  1.1  christos   int size;
   3487  1.1  christos 
   3488  1.1  christos   /* The instruction is either an indirect or autoincrement addressing mode.
   3489  1.1  christos      Check if the destination register is the PC.  */
   3490  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3491  1.1  christos     {
   3492  1.1  christos       /* Must be done here, get_data_from_address may change the size
   3493  1.1  christos          field.  */
   3494  1.1  christos       size = cris_get_size (inst);
   3495  1.1  christos       operand2 = inst_env->reg[REG_PC];
   3496  1.1  christos 
   3497  1.1  christos       /* Get the value of the third operand, i.e. the indirect operand.  */
   3498  1.1  christos       operand1 = inst_env->reg[cris_get_operand1 (inst)];
   3499  1.1  christos       operand3 = get_data_from_address (&inst, operand1, inst_env->byte_order);
   3500  1.1  christos 
   3501  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3502  1.1  christos          breakpoint should be.  The order of the udw_operands is vital.  */
   3503  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand3);
   3504  1.1  christos     }
   3505  1.1  christos   /* If this is an autoincrement addressing mode, check if the increment
   3506  1.1  christos      changes the PC.  */
   3507  1.1  christos   if ((cris_get_operand1 (inst) == REG_PC)
   3508  1.1  christos       && (cris_get_mode (inst) == AUTOINC_MODE))
   3509  1.1  christos     {
   3510  1.1  christos       /* Get the size field.  */
   3511  1.1  christos       size = cris_get_size (inst);
   3512  1.1  christos 
   3513  1.1  christos       /* If it's an extend instruction we don't want the signed extend bit,
   3514  1.1  christos          because it influences the size.  */
   3515  1.1  christos       if (cris_get_opcode (inst) < 4)
   3516  1.1  christos         {
   3517  1.1  christos           size &= ~SIGNED_EXTEND_BIT_MASK;
   3518  1.1  christos         }
   3519  1.1  christos       process_autoincrement (size, inst, inst_env);
   3520  1.1  christos     }
   3521  1.1  christos   inst_env->slot_needed = 0;
   3522  1.1  christos   inst_env->prefix_found = 0;
   3523  1.1  christos   inst_env->xflag_found = 0;
   3524  1.1  christos   inst_env->disable_interrupt = 0;
   3525  1.1  christos }
   3526  1.1  christos 
   3527  1.1  christos /* Handles the two-operand addressing mode, all modes except register, for
   3528  1.1  christos    the ADD, SUB CMP, AND and OR instruction.  */
   3529  1.1  christos 
   3530  1.1  christos static void
   3531  1.1  christos none_reg_mode_add_sub_cmp_and_or_move_op (unsigned short inst,
   3532  1.1  christos                                           inst_env_type *inst_env)
   3533  1.1  christos {
   3534  1.1  christos   if (inst_env->prefix_found)
   3535  1.1  christos     {
   3536  1.1  christos       if (cris_get_mode (inst) == PREFIX_INDEX_MODE)
   3537  1.1  christos         {
   3538  1.1  christos           handle_prefix_index_mode_for_aritm_op (inst, inst_env);
   3539  1.1  christos         }
   3540  1.1  christos       else if (cris_get_mode (inst) == PREFIX_ASSIGN_MODE)
   3541  1.1  christos         {
   3542  1.1  christos           handle_prefix_assign_mode_for_aritm_op (inst, inst_env);
   3543  1.1  christos         }
   3544  1.1  christos       else
   3545  1.1  christos         {
   3546  1.1  christos           /* The mode is invalid for a prefixed base instruction.  */
   3547  1.1  christos           inst_env->invalid = 1;
   3548  1.1  christos           return;
   3549  1.1  christos         }
   3550  1.1  christos     }
   3551  1.1  christos   else
   3552  1.1  christos     {
   3553  1.1  christos       handle_inc_and_index_mode_for_aritm_op (inst, inst_env);
   3554  1.1  christos     }
   3555  1.1  christos }
   3556  1.1  christos 
   3557  1.1  christos /* Handles the quick addressing mode for the ADD and SUB instruction.  */
   3558  1.1  christos 
   3559  1.1  christos static void
   3560  1.1  christos quick_mode_add_sub_op (unsigned short inst, inst_env_type *inst_env)
   3561  1.1  christos {
   3562  1.1  christos   unsigned long operand1;
   3563  1.1  christos   unsigned long operand2;
   3564  1.1  christos 
   3565  1.1  christos   /* It's a bad idea to be in a prefix instruction now.  This is a quick mode
   3566  1.1  christos      instruction and can't have a prefix.  */
   3567  1.1  christos   if (inst_env->prefix_found)
   3568  1.1  christos     {
   3569  1.1  christos       inst_env->invalid = 1;
   3570  1.1  christos       return;
   3571  1.1  christos     }
   3572  1.1  christos 
   3573  1.1  christos   /* Check if the instruction has PC as its target.  */
   3574  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3575  1.1  christos     {
   3576  1.1  christos       if (inst_env->slot_needed)
   3577  1.1  christos         {
   3578  1.1  christos           inst_env->invalid = 1;
   3579  1.1  christos           return;
   3580  1.1  christos         }
   3581  1.1  christos       operand1 = cris_get_quick_value (inst);
   3582  1.1  christos       operand2 = inst_env->reg[REG_PC];
   3583  1.1  christos 
   3584  1.1  christos       /* The size should now be dword.  */
   3585  1.1  christos       cris_set_size_to_dword (&inst);
   3586  1.1  christos 
   3587  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3588  1.1  christos          breakpoint should be.  */
   3589  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand1);
   3590  1.1  christos     }
   3591  1.1  christos   inst_env->slot_needed = 0;
   3592  1.1  christos   inst_env->prefix_found = 0;
   3593  1.1  christos   inst_env->xflag_found = 0;
   3594  1.1  christos   inst_env->disable_interrupt = 0;
   3595  1.1  christos }
   3596  1.1  christos 
   3597  1.1  christos /* Handles the quick addressing mode for the CMP, AND and OR instruction.  */
   3598  1.1  christos 
   3599  1.1  christos static void
   3600  1.1  christos quick_mode_and_cmp_move_or_op (unsigned short inst, inst_env_type *inst_env)
   3601  1.1  christos {
   3602  1.1  christos   unsigned long operand1;
   3603  1.1  christos   unsigned long operand2;
   3604  1.1  christos 
   3605  1.1  christos   /* It's a bad idea to be in a prefix instruction now.  This is a quick mode
   3606  1.1  christos      instruction and can't have a prefix.  */
   3607  1.1  christos   if (inst_env->prefix_found)
   3608  1.1  christos     {
   3609  1.1  christos       inst_env->invalid = 1;
   3610  1.1  christos       return;
   3611  1.1  christos     }
   3612  1.1  christos   /* Check if the instruction has PC as its target.  */
   3613  1.1  christos   if (cris_get_operand2 (inst) == REG_PC)
   3614  1.1  christos     {
   3615  1.1  christos       if (inst_env->slot_needed)
   3616  1.1  christos         {
   3617  1.1  christos           inst_env->invalid = 1;
   3618  1.1  christos           return;
   3619  1.1  christos         }
   3620  1.1  christos       /* The instruction has the PC as its target register.  */
   3621  1.1  christos       operand1 = cris_get_quick_value (inst);
   3622  1.1  christos       operand2 = inst_env->reg[REG_PC];
   3623  1.1  christos 
   3624  1.1  christos       /* The quick value is signed, so check if we must do a signed extend.  */
   3625  1.1  christos       if (operand1 & SIGNED_QUICK_VALUE_MASK)
   3626  1.1  christos         {
   3627  1.1  christos           /* sign extend  */
   3628  1.1  christos           operand1 |= SIGNED_QUICK_VALUE_EXTEND_MASK;
   3629  1.1  christos         }
   3630  1.1  christos       /* The size should now be dword.  */
   3631  1.1  christos       cris_set_size_to_dword (&inst);
   3632  1.1  christos 
   3633  1.1  christos       /* Calculate the PC value after the instruction, i.e. where the
   3634  1.1  christos          breakpoint should be.  */
   3635  1.1  christos       add_sub_cmp_and_or_move_action (inst, inst_env, operand2, operand1);
   3636  1.1  christos     }
   3637  1.1  christos   inst_env->slot_needed = 0;
   3638  1.1  christos   inst_env->prefix_found = 0;
   3639  1.1  christos   inst_env->xflag_found = 0;
   3640  1.1  christos   inst_env->disable_interrupt = 0;
   3641  1.1  christos }
   3642  1.1  christos 
   3643  1.1  christos /* Translate op_type to a function and call it.  */
   3644  1.1  christos 
   3645  1.1  christos static void
   3646  1.1  christos cris_gdb_func (struct gdbarch *gdbarch, enum cris_op_type op_type,
   3647  1.1  christos 	       unsigned short inst, inst_env_type *inst_env)
   3648  1.1  christos {
   3649  1.1  christos   switch (op_type)
   3650  1.1  christos     {
   3651  1.1  christos     case cris_not_implemented_op:
   3652  1.1  christos       not_implemented_op (inst, inst_env);
   3653  1.1  christos       break;
   3654  1.1  christos 
   3655  1.1  christos     case cris_abs_op:
   3656  1.1  christos       abs_op (inst, inst_env);
   3657  1.1  christos       break;
   3658  1.1  christos 
   3659  1.1  christos     case cris_addi_op:
   3660  1.1  christos       addi_op (inst, inst_env);
   3661  1.1  christos       break;
   3662  1.1  christos 
   3663  1.1  christos     case cris_asr_op:
   3664  1.1  christos       asr_op (inst, inst_env);
   3665  1.1  christos       break;
   3666  1.1  christos 
   3667  1.1  christos     case cris_asrq_op:
   3668  1.1  christos       asrq_op (inst, inst_env);
   3669  1.1  christos       break;
   3670  1.1  christos 
   3671  1.1  christos     case cris_ax_ei_setf_op:
   3672  1.1  christos       ax_ei_setf_op (inst, inst_env);
   3673  1.1  christos       break;
   3674  1.1  christos 
   3675  1.1  christos     case cris_bdap_prefix:
   3676  1.1  christos       bdap_prefix (inst, inst_env);
   3677  1.1  christos       break;
   3678  1.1  christos 
   3679  1.1  christos     case cris_biap_prefix:
   3680  1.1  christos       biap_prefix (inst, inst_env);
   3681  1.1  christos       break;
   3682  1.1  christos 
   3683  1.1  christos     case cris_break_op:
   3684  1.1  christos       break_op (inst, inst_env);
   3685  1.1  christos       break;
   3686  1.1  christos 
   3687  1.1  christos     case cris_btst_nop_op:
   3688  1.1  christos       btst_nop_op (inst, inst_env);
   3689  1.1  christos       break;
   3690  1.1  christos 
   3691  1.1  christos     case cris_clearf_di_op:
   3692  1.1  christos       clearf_di_op (inst, inst_env);
   3693  1.1  christos       break;
   3694  1.1  christos 
   3695  1.1  christos     case cris_dip_prefix:
   3696  1.1  christos       dip_prefix (inst, inst_env);
   3697  1.1  christos       break;
   3698  1.1  christos 
   3699  1.1  christos     case cris_dstep_logshift_mstep_neg_not_op:
   3700  1.1  christos       dstep_logshift_mstep_neg_not_op (inst, inst_env);
   3701  1.1  christos       break;
   3702  1.1  christos 
   3703  1.1  christos     case cris_eight_bit_offset_branch_op:
   3704  1.1  christos       eight_bit_offset_branch_op (inst, inst_env);
   3705  1.1  christos       break;
   3706  1.1  christos 
   3707  1.1  christos     case cris_move_mem_to_reg_movem_op:
   3708  1.1  christos       move_mem_to_reg_movem_op (inst, inst_env);
   3709  1.1  christos       break;
   3710  1.1  christos 
   3711  1.1  christos     case cris_move_reg_to_mem_movem_op:
   3712  1.1  christos       move_reg_to_mem_movem_op (inst, inst_env);
   3713  1.1  christos       break;
   3714  1.1  christos 
   3715  1.1  christos     case cris_move_to_preg_op:
   3716  1.1  christos       move_to_preg_op (gdbarch, inst, inst_env);
   3717  1.1  christos       break;
   3718  1.1  christos 
   3719  1.1  christos     case cris_muls_op:
   3720  1.1  christos       muls_op (inst, inst_env);
   3721  1.1  christos       break;
   3722  1.1  christos 
   3723  1.1  christos     case cris_mulu_op:
   3724  1.1  christos       mulu_op (inst, inst_env);
   3725  1.1  christos       break;
   3726  1.1  christos 
   3727  1.1  christos     case cris_none_reg_mode_add_sub_cmp_and_or_move_op:
   3728  1.1  christos       none_reg_mode_add_sub_cmp_and_or_move_op (inst, inst_env);
   3729  1.1  christos       break;
   3730  1.1  christos 
   3731  1.1  christos     case cris_none_reg_mode_clear_test_op:
   3732  1.1  christos       none_reg_mode_clear_test_op (inst, inst_env);
   3733  1.1  christos       break;
   3734  1.1  christos 
   3735  1.1  christos     case cris_none_reg_mode_jump_op:
   3736  1.1  christos       none_reg_mode_jump_op (inst, inst_env);
   3737  1.1  christos       break;
   3738  1.1  christos 
   3739  1.1  christos     case cris_none_reg_mode_move_from_preg_op:
   3740  1.1  christos       none_reg_mode_move_from_preg_op (gdbarch, inst, inst_env);
   3741  1.1  christos       break;
   3742  1.1  christos 
   3743  1.1  christos     case cris_quick_mode_add_sub_op:
   3744  1.1  christos       quick_mode_add_sub_op (inst, inst_env);
   3745  1.1  christos       break;
   3746  1.1  christos 
   3747  1.1  christos     case cris_quick_mode_and_cmp_move_or_op:
   3748  1.1  christos       quick_mode_and_cmp_move_or_op (inst, inst_env);
   3749  1.1  christos       break;
   3750  1.1  christos 
   3751  1.1  christos     case cris_quick_mode_bdap_prefix:
   3752  1.1  christos       quick_mode_bdap_prefix (inst, inst_env);
   3753  1.1  christos       break;
   3754  1.1  christos 
   3755  1.1  christos     case cris_reg_mode_add_sub_cmp_and_or_move_op:
   3756  1.1  christos       reg_mode_add_sub_cmp_and_or_move_op (inst, inst_env);
   3757  1.1  christos       break;
   3758  1.1  christos 
   3759  1.1  christos     case cris_reg_mode_clear_op:
   3760  1.1  christos       reg_mode_clear_op (inst, inst_env);
   3761  1.1  christos       break;
   3762  1.1  christos 
   3763  1.1  christos     case cris_reg_mode_jump_op:
   3764  1.1  christos       reg_mode_jump_op (inst, inst_env);
   3765  1.1  christos       break;
   3766  1.1  christos 
   3767  1.1  christos     case cris_reg_mode_move_from_preg_op:
   3768  1.1  christos       reg_mode_move_from_preg_op (inst, inst_env);
   3769  1.1  christos       break;
   3770  1.1  christos 
   3771  1.1  christos     case cris_reg_mode_test_op:
   3772  1.1  christos       reg_mode_test_op (inst, inst_env);
   3773  1.1  christos       break;
   3774  1.1  christos 
   3775  1.1  christos     case cris_scc_op:
   3776  1.1  christos       scc_op (inst, inst_env);
   3777  1.1  christos       break;
   3778  1.1  christos 
   3779  1.1  christos     case cris_sixteen_bit_offset_branch_op:
   3780  1.1  christos       sixteen_bit_offset_branch_op (inst, inst_env);
   3781  1.1  christos       break;
   3782  1.1  christos 
   3783  1.1  christos     case cris_three_operand_add_sub_cmp_and_or_op:
   3784  1.1  christos       three_operand_add_sub_cmp_and_or_op (inst, inst_env);
   3785  1.1  christos       break;
   3786  1.1  christos 
   3787  1.1  christos     case cris_three_operand_bound_op:
   3788  1.1  christos       three_operand_bound_op (inst, inst_env);
   3789  1.1  christos       break;
   3790  1.1  christos 
   3791  1.1  christos     case cris_two_operand_bound_op:
   3792  1.1  christos       two_operand_bound_op (inst, inst_env);
   3793  1.1  christos       break;
   3794  1.1  christos 
   3795  1.1  christos     case cris_xor_op:
   3796  1.1  christos       xor_op (inst, inst_env);
   3797  1.1  christos       break;
   3798  1.1  christos     }
   3799  1.1  christos }
   3800  1.1  christos 
   3801  1.1  christos /* This wrapper is to avoid cris_get_assembler being called before
   3802  1.1  christos    exec_bfd has been set.  */
   3803  1.1  christos 
   3804  1.1  christos static int
   3805  1.1  christos cris_delayed_get_disassembler (bfd_vma addr, struct disassemble_info *info)
   3806  1.1  christos {
   3807  1.1  christos   int (*print_insn) (bfd_vma addr, struct disassemble_info *info);
   3808  1.1  christos   /* FIXME: cagney/2003-08-27: It should be possible to select a CRIS
   3809  1.1  christos      disassembler, even when there is no BFD.  Does something like
   3810  1.1  christos      "gdb; target remote; disassmeble *0x123" work?  */
   3811  1.1  christos   gdb_assert (exec_bfd != NULL);
   3812  1.1  christos   print_insn = cris_get_disassembler (exec_bfd);
   3813  1.1  christos   gdb_assert (print_insn != NULL);
   3814  1.1  christos   return print_insn (addr, info);
   3815  1.1  christos }
   3816  1.1  christos 
   3817  1.1  christos /* Originally from <asm/elf.h>.  */
   3818  1.1  christos typedef unsigned char cris_elf_greg_t[4];
   3819  1.1  christos 
   3820  1.1  christos /* Same as user_regs_struct struct in <asm/user.h>.  */
   3821  1.1  christos #define CRISV10_ELF_NGREG 35
   3822  1.1  christos typedef cris_elf_greg_t cris_elf_gregset_t[CRISV10_ELF_NGREG];
   3823  1.1  christos 
   3824  1.1  christos #define CRISV32_ELF_NGREG 32
   3825  1.1  christos typedef cris_elf_greg_t crisv32_elf_gregset_t[CRISV32_ELF_NGREG];
   3826  1.1  christos 
   3827  1.1  christos /* Unpack a cris_elf_gregset_t into GDB's register cache.  */
   3828  1.1  christos 
   3829  1.1  christos static void
   3830  1.1  christos cris_supply_gregset (struct regcache *regcache, cris_elf_gregset_t *gregsetp)
   3831  1.1  christos {
   3832  1.1  christos   struct gdbarch *gdbarch = get_regcache_arch (regcache);
   3833  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   3834  1.1  christos   int i;
   3835  1.1  christos   cris_elf_greg_t *regp = *gregsetp;
   3836  1.1  christos   static char zerobuf[4] = {0};
   3837  1.1  christos 
   3838  1.1  christos   /* The kernel dumps all 32 registers as unsigned longs, but supply_register
   3839  1.1  christos      knows about the actual size of each register so that's no problem.  */
   3840  1.1  christos   for (i = 0; i < NUM_GENREGS + NUM_SPECREGS; i++)
   3841  1.1  christos     {
   3842  1.1  christos       regcache_raw_supply (regcache, i, (char *)&regp[i]);
   3843  1.1  christos     }
   3844  1.1  christos 
   3845  1.1  christos   if (tdep->cris_version == 32)
   3846  1.1  christos     {
   3847  1.1  christos       /* Needed to set pseudo-register PC for CRISv32.  */
   3848  1.1  christos       /* FIXME: If ERP is in a delay slot at this point then the PC will
   3849  1.1  christos 	 be wrong.  Issue a warning to alert the user.  */
   3850  1.1  christos       regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch),
   3851  1.1  christos 			   (char *)&regp[ERP_REGNUM]);
   3852  1.1  christos 
   3853  1.1  christos       if (*(char *)&regp[ERP_REGNUM] & 0x1)
   3854  1.1  christos 	fprintf_unfiltered (gdb_stderr, "Warning: PC in delay slot\n");
   3855  1.1  christos     }
   3856  1.1  christos }
   3857  1.1  christos 
   3858  1.1  christos /*  Use a local version of this function to get the correct types for
   3859  1.1  christos     regsets, until multi-arch core support is ready.  */
   3860  1.1  christos 
   3861  1.1  christos static void
   3862  1.1  christos fetch_core_registers (struct regcache *regcache,
   3863  1.1  christos 		      char *core_reg_sect, unsigned core_reg_size,
   3864  1.1  christos                       int which, CORE_ADDR reg_addr)
   3865  1.1  christos {
   3866  1.1  christos   cris_elf_gregset_t gregset;
   3867  1.1  christos 
   3868  1.1  christos   switch (which)
   3869  1.1  christos     {
   3870  1.1  christos     case 0:
   3871  1.1  christos       if (core_reg_size != sizeof (cris_elf_gregset_t)
   3872  1.1  christos 	  && core_reg_size != sizeof (crisv32_elf_gregset_t))
   3873  1.1  christos         {
   3874  1.1  christos           warning (_("wrong size gregset struct in core file"));
   3875  1.1  christos         }
   3876  1.1  christos       else
   3877  1.1  christos         {
   3878  1.1  christos           memcpy (&gregset, core_reg_sect, sizeof (gregset));
   3879  1.1  christos           cris_supply_gregset (regcache, &gregset);
   3880  1.1  christos         }
   3881  1.1  christos 
   3882  1.1  christos     default:
   3883  1.1  christos       /* We've covered all the kinds of registers we know about here,
   3884  1.1  christos          so this must be something we wouldn't know what to do with
   3885  1.1  christos          anyway.  Just ignore it.  */
   3886  1.1  christos       break;
   3887  1.1  christos     }
   3888  1.1  christos }
   3889  1.1  christos 
   3890  1.1  christos static struct core_fns cris_elf_core_fns =
   3891  1.1  christos {
   3892  1.1  christos   bfd_target_elf_flavour,               /* core_flavour */
   3893  1.1  christos   default_check_format,                 /* check_format */
   3894  1.1  christos   default_core_sniffer,                 /* core_sniffer */
   3895  1.1  christos   fetch_core_registers,                 /* core_read_registers */
   3896  1.1  christos   NULL                                  /* next */
   3897  1.1  christos };
   3898  1.1  christos 
   3899  1.1  christos extern initialize_file_ftype _initialize_cris_tdep; /* -Wmissing-prototypes */
   3900  1.1  christos 
   3901  1.1  christos void
   3902  1.1  christos _initialize_cris_tdep (void)
   3903  1.1  christos {
   3904  1.1  christos   static struct cmd_list_element *cris_set_cmdlist;
   3905  1.1  christos   static struct cmd_list_element *cris_show_cmdlist;
   3906  1.1  christos 
   3907  1.1  christos   struct cmd_list_element *c;
   3908  1.1  christos 
   3909  1.1  christos   gdbarch_register (bfd_arch_cris, cris_gdbarch_init, cris_dump_tdep);
   3910  1.1  christos 
   3911  1.1  christos   /* CRIS-specific user-commands.  */
   3912  1.1  christos   add_setshow_zuinteger_cmd ("cris-version", class_support,
   3913  1.1  christos 			     &usr_cmd_cris_version,
   3914  1.1  christos 			     _("Set the current CRIS version."),
   3915  1.1  christos 			     _("Show the current CRIS version."),
   3916  1.1  christos 			     _("\
   3917  1.1  christos Set to 10 for CRISv10 or 32 for CRISv32 if autodetection fails.\n\
   3918  1.1  christos Defaults to 10. "),
   3919  1.1  christos 			     set_cris_version,
   3920  1.1  christos 			     NULL, /* FIXME: i18n: Current CRIS version
   3921  1.1  christos 				      is %s.  */
   3922  1.1  christos 			     &setlist, &showlist);
   3923  1.1  christos 
   3924  1.1  christos   add_setshow_enum_cmd ("cris-mode", class_support,
   3925  1.1  christos 			cris_modes, &usr_cmd_cris_mode,
   3926  1.1  christos 			_("Set the current CRIS mode."),
   3927  1.1  christos 			_("Show the current CRIS mode."),
   3928  1.1  christos 			_("\
   3929  1.1  christos Set to CRIS_MODE_GURU when debugging in guru mode.\n\
   3930  1.1  christos Makes GDB use the NRP register instead of the ERP register in certain cases."),
   3931  1.1  christos 			set_cris_mode,
   3932  1.1  christos 			NULL, /* FIXME: i18n: Current CRIS version is %s.  */
   3933  1.1  christos 			&setlist, &showlist);
   3934  1.1  christos 
   3935  1.1  christos   add_setshow_boolean_cmd ("cris-dwarf2-cfi", class_support,
   3936  1.1  christos 			   &usr_cmd_cris_dwarf2_cfi,
   3937  1.1  christos 			   _("Set the usage of Dwarf-2 CFI for CRIS."),
   3938  1.1  christos 			   _("Show the usage of Dwarf-2 CFI for CRIS."),
   3939  1.1  christos 			   _("Set this to \"off\" if using gcc-cris < R59."),
   3940  1.1  christos 			   set_cris_dwarf2_cfi,
   3941  1.1  christos 			   NULL, /* FIXME: i18n: Usage of Dwarf-2 CFI
   3942  1.1  christos 				    for CRIS is %d.  */
   3943  1.1  christos 			   &setlist, &showlist);
   3944  1.1  christos 
   3945  1.1  christos   deprecated_add_core_fns (&cris_elf_core_fns);
   3946  1.1  christos }
   3947  1.1  christos 
   3948  1.1  christos /* Prints out all target specific values.  */
   3949  1.1  christos 
   3950  1.1  christos static void
   3951  1.1  christos cris_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
   3952  1.1  christos {
   3953  1.1  christos   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   3954  1.1  christos   if (tdep != NULL)
   3955  1.1  christos     {
   3956  1.1  christos       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_version = %i\n",
   3957  1.1  christos                           tdep->cris_version);
   3958  1.1  christos       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_mode = %s\n",
   3959  1.1  christos                           tdep->cris_mode);
   3960  1.1  christos       fprintf_unfiltered (file, "cris_dump_tdep: tdep->cris_dwarf2_cfi = %i\n",
   3961  1.1  christos                           tdep->cris_dwarf2_cfi);
   3962  1.1  christos     }
   3963  1.1  christos }
   3964  1.1  christos 
   3965  1.1  christos static void
   3966  1.1  christos set_cris_version (char *ignore_args, int from_tty,
   3967  1.1  christos 		  struct cmd_list_element *c)
   3968  1.1  christos {
   3969  1.1  christos   struct gdbarch_info info;
   3970  1.1  christos 
   3971  1.1  christos   usr_cmd_cris_version_valid = 1;
   3972  1.1  christos 
   3973  1.1  christos   /* Update the current architecture, if needed.  */
   3974  1.1  christos   gdbarch_info_init (&info);
   3975  1.1  christos   if (!gdbarch_update_p (info))
   3976  1.1  christos     internal_error (__FILE__, __LINE__,
   3977  1.1  christos 		    _("cris_gdbarch_update: failed to update architecture."));
   3978  1.1  christos }
   3979  1.1  christos 
   3980  1.1  christos static void
   3981  1.1  christos set_cris_mode (char *ignore_args, int from_tty,
   3982  1.1  christos 	       struct cmd_list_element *c)
   3983  1.1  christos {
   3984  1.1  christos   struct gdbarch_info info;
   3985  1.1  christos 
   3986  1.1  christos   /* Update the current architecture, if needed.  */
   3987  1.1  christos   gdbarch_info_init (&info);
   3988  1.1  christos   if (!gdbarch_update_p (info))
   3989  1.1  christos     internal_error (__FILE__, __LINE__,
   3990  1.1  christos 		    "cris_gdbarch_update: failed to update architecture.");
   3991  1.1  christos }
   3992  1.1  christos 
   3993  1.1  christos static void
   3994  1.1  christos set_cris_dwarf2_cfi (char *ignore_args, int from_tty,
   3995  1.1  christos 		     struct cmd_list_element *c)
   3996  1.1  christos {
   3997  1.1  christos   struct gdbarch_info info;
   3998  1.1  christos 
   3999  1.1  christos   /* Update the current architecture, if needed.  */
   4000  1.1  christos   gdbarch_info_init (&info);
   4001  1.1  christos   if (!gdbarch_update_p (info))
   4002  1.1  christos     internal_error (__FILE__, __LINE__,
   4003  1.1  christos 		    _("cris_gdbarch_update: failed to update architecture."));
   4004  1.1  christos }
   4005  1.1  christos 
   4006  1.1  christos static struct gdbarch *
   4007  1.1  christos cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   4008  1.1  christos {
   4009  1.1  christos   struct gdbarch *gdbarch;
   4010  1.1  christos   struct gdbarch_tdep *tdep;
   4011  1.1  christos   unsigned int cris_version;
   4012  1.1  christos 
   4013  1.1  christos   if (usr_cmd_cris_version_valid)
   4014  1.1  christos     {
   4015  1.1  christos       /* Trust the user's CRIS version setting.  */
   4016  1.1  christos       cris_version = usr_cmd_cris_version;
   4017  1.1  christos     }
   4018  1.1  christos   else if (info.abfd && bfd_get_mach (info.abfd) == bfd_mach_cris_v32)
   4019  1.1  christos     {
   4020  1.1  christos       cris_version = 32;
   4021  1.1  christos     }
   4022  1.1  christos   else
   4023  1.1  christos     {
   4024  1.1  christos       /* Assume it's CRIS version 10.  */
   4025  1.1  christos       cris_version = 10;
   4026  1.1  christos     }
   4027  1.1  christos 
   4028  1.1  christos   /* Make the current settings visible to the user.  */
   4029  1.1  christos   usr_cmd_cris_version = cris_version;
   4030  1.1  christos 
   4031  1.1  christos   /* Find a candidate among the list of pre-declared architectures.  */
   4032  1.1  christos   for (arches = gdbarch_list_lookup_by_info (arches, &info);
   4033  1.1  christos        arches != NULL;
   4034  1.1  christos        arches = gdbarch_list_lookup_by_info (arches->next, &info))
   4035  1.1  christos     {
   4036  1.1  christos       if ((gdbarch_tdep (arches->gdbarch)->cris_version
   4037  1.1  christos 	   == usr_cmd_cris_version)
   4038  1.1  christos 	  && (gdbarch_tdep (arches->gdbarch)->cris_mode
   4039  1.1  christos 	   == usr_cmd_cris_mode)
   4040  1.1  christos 	  && (gdbarch_tdep (arches->gdbarch)->cris_dwarf2_cfi
   4041  1.1  christos 	      == usr_cmd_cris_dwarf2_cfi))
   4042  1.1  christos         return arches->gdbarch;
   4043  1.1  christos     }
   4044  1.1  christos 
   4045  1.1  christos   /* No matching architecture was found.  Create a new one.  */
   4046  1.1  christos   tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
   4047  1.1  christos   gdbarch = gdbarch_alloc (&info, tdep);
   4048  1.1  christos 
   4049  1.1  christos   tdep->cris_version = usr_cmd_cris_version;
   4050  1.1  christos   tdep->cris_mode = usr_cmd_cris_mode;
   4051  1.1  christos   tdep->cris_dwarf2_cfi = usr_cmd_cris_dwarf2_cfi;
   4052  1.1  christos 
   4053  1.1  christos   /* INIT shall ensure that the INFO.BYTE_ORDER is non-zero.  */
   4054  1.1  christos   switch (info.byte_order)
   4055  1.1  christos     {
   4056  1.1  christos     case BFD_ENDIAN_LITTLE:
   4057  1.1  christos       /* Ok.  */
   4058  1.1  christos       break;
   4059  1.1  christos 
   4060  1.1  christos     case BFD_ENDIAN_BIG:
   4061  1.1  christos       internal_error (__FILE__, __LINE__,
   4062  1.1  christos 		      _("cris_gdbarch_init: big endian byte order in info"));
   4063  1.1  christos       break;
   4064  1.1  christos 
   4065  1.1  christos     default:
   4066  1.1  christos       internal_error (__FILE__, __LINE__,
   4067  1.1  christos 		      _("cris_gdbarch_init: unknown byte order in info"));
   4068  1.1  christos     }
   4069  1.1  christos 
   4070  1.1  christos   set_gdbarch_return_value (gdbarch, cris_return_value);
   4071  1.1  christos 
   4072  1.1  christos   set_gdbarch_sp_regnum (gdbarch, 14);
   4073  1.1  christos 
   4074  1.1  christos   /* Length of ordinary registers used in push_word and a few other
   4075  1.1  christos      places.  register_size() is the real way to know how big a
   4076  1.1  christos      register is.  */
   4077  1.1  christos 
   4078  1.1  christos   set_gdbarch_double_bit (gdbarch, 64);
   4079  1.1  christos   /* The default definition of a long double is 2 * gdbarch_double_bit,
   4080  1.1  christos      which means we have to set this explicitly.  */
   4081  1.1  christos   set_gdbarch_long_double_bit (gdbarch, 64);
   4082  1.1  christos 
   4083  1.1  christos   /* The total amount of space needed to store (in an array called registers)
   4084  1.1  christos      GDB's copy of the machine's register state.  Note: We can not use
   4085  1.1  christos      cris_register_size at this point, since it relies on gdbarch
   4086  1.1  christos      being set.  */
   4087  1.1  christos   switch (tdep->cris_version)
   4088  1.1  christos     {
   4089  1.1  christos     case 0:
   4090  1.1  christos     case 1:
   4091  1.1  christos     case 2:
   4092  1.1  christos     case 3:
   4093  1.1  christos     case 8:
   4094  1.1  christos     case 9:
   4095  1.1  christos       /* Old versions; not supported.  */
   4096  1.1  christos       internal_error (__FILE__, __LINE__,
   4097  1.1  christos 		      _("cris_gdbarch_init: unsupported CRIS version"));
   4098  1.1  christos       break;
   4099  1.1  christos 
   4100  1.1  christos     case 10:
   4101  1.1  christos     case 11:
   4102  1.1  christos       /* CRIS v10 and v11, a.k.a. ETRAX 100LX.  In addition to ETRAX 100,
   4103  1.1  christos          P7 (32 bits), and P15 (32 bits) have been implemented.  */
   4104  1.1  christos       set_gdbarch_pc_regnum (gdbarch, 15);
   4105  1.1  christos       set_gdbarch_register_type (gdbarch, cris_register_type);
   4106  1.1  christos       /* There are 32 registers (some of which may not be implemented).  */
   4107  1.1  christos       set_gdbarch_num_regs (gdbarch, 32);
   4108  1.1  christos       set_gdbarch_register_name (gdbarch, cris_register_name);
   4109  1.1  christos       set_gdbarch_cannot_store_register (gdbarch, cris_cannot_store_register);
   4110  1.1  christos       set_gdbarch_cannot_fetch_register (gdbarch, cris_cannot_fetch_register);
   4111  1.1  christos 
   4112  1.1  christos       set_gdbarch_software_single_step (gdbarch, cris_software_single_step);
   4113  1.1  christos       break;
   4114  1.1  christos 
   4115  1.1  christos     case 32:
   4116  1.1  christos       /* CRIS v32.  General registers R0 - R15 (32 bits), special registers
   4117  1.1  christos 	 P0 - P15 (32 bits) except P0, P1, P3 (8 bits) and P4 (16 bits)
   4118  1.1  christos 	 and pseudo-register PC (32 bits).  */
   4119  1.1  christos       set_gdbarch_pc_regnum (gdbarch, 32);
   4120  1.1  christos       set_gdbarch_register_type (gdbarch, crisv32_register_type);
   4121  1.1  christos       /* 32 registers + pseudo-register PC + 16 support registers.  */
   4122  1.1  christos       set_gdbarch_num_regs (gdbarch, 32 + 1 + 16);
   4123  1.1  christos       set_gdbarch_register_name (gdbarch, crisv32_register_name);
   4124  1.1  christos 
   4125  1.1  christos       set_gdbarch_cannot_store_register
   4126  1.1  christos 	(gdbarch, crisv32_cannot_store_register);
   4127  1.1  christos       set_gdbarch_cannot_fetch_register
   4128  1.1  christos 	(gdbarch, crisv32_cannot_fetch_register);
   4129  1.1  christos 
   4130  1.1  christos       set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
   4131  1.1  christos 
   4132  1.1  christos       set_gdbarch_single_step_through_delay
   4133  1.1  christos 	(gdbarch, crisv32_single_step_through_delay);
   4134  1.1  christos 
   4135  1.1  christos       break;
   4136  1.1  christos 
   4137  1.1  christos     default:
   4138  1.1  christos       internal_error (__FILE__, __LINE__,
   4139  1.1  christos 		      _("cris_gdbarch_init: unknown CRIS version"));
   4140  1.1  christos     }
   4141  1.1  christos 
   4142  1.1  christos   /* Dummy frame functions (shared between CRISv10 and CRISv32 since they
   4143  1.1  christos      have the same ABI).  */
   4144  1.1  christos   set_gdbarch_push_dummy_code (gdbarch, cris_push_dummy_code);
   4145  1.1  christos   set_gdbarch_push_dummy_call (gdbarch, cris_push_dummy_call);
   4146  1.1  christos   set_gdbarch_frame_align (gdbarch, cris_frame_align);
   4147  1.1  christos   set_gdbarch_skip_prologue (gdbarch, cris_skip_prologue);
   4148  1.1  christos 
   4149  1.1  christos   /* The stack grows downward.  */
   4150  1.1  christos   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   4151  1.1  christos 
   4152  1.1  christos   set_gdbarch_breakpoint_from_pc (gdbarch, cris_breakpoint_from_pc);
   4153  1.1  christos 
   4154  1.1  christos   set_gdbarch_unwind_pc (gdbarch, cris_unwind_pc);
   4155  1.1  christos   set_gdbarch_unwind_sp (gdbarch, cris_unwind_sp);
   4156  1.1  christos   set_gdbarch_dummy_id (gdbarch, cris_dummy_id);
   4157  1.1  christos 
   4158  1.1  christos   if (tdep->cris_dwarf2_cfi == 1)
   4159  1.1  christos     {
   4160  1.1  christos       /* Hook in the Dwarf-2 frame sniffer.  */
   4161  1.1  christos       set_gdbarch_dwarf2_reg_to_regnum (gdbarch, cris_dwarf2_reg_to_regnum);
   4162  1.1  christos       dwarf2_frame_set_init_reg (gdbarch, cris_dwarf2_frame_init_reg);
   4163  1.1  christos       dwarf2_append_unwinders (gdbarch);
   4164  1.1  christos     }
   4165  1.1  christos 
   4166  1.1  christos   if (tdep->cris_mode != cris_mode_guru)
   4167  1.1  christos     {
   4168  1.1  christos       frame_unwind_append_unwinder (gdbarch, &cris_sigtramp_frame_unwind);
   4169  1.1  christos     }
   4170  1.1  christos 
   4171  1.1  christos   frame_unwind_append_unwinder (gdbarch, &cris_frame_unwind);
   4172  1.1  christos   frame_base_set_default (gdbarch, &cris_frame_base);
   4173  1.1  christos 
   4174  1.1  christos   /* Hook in ABI-specific overrides, if they have been registered.  */
   4175  1.1  christos   gdbarch_init_osabi (info, gdbarch);
   4176  1.1  christos 
   4177  1.1  christos   /* FIXME: cagney/2003-08-27: It should be possible to select a CRIS
   4178  1.1  christos      disassembler, even when there is no BFD.  Does something like
   4179  1.1  christos      "gdb; target remote; disassmeble *0x123" work?  */
   4180  1.1  christos   set_gdbarch_print_insn (gdbarch, cris_delayed_get_disassembler);
   4181  1.1  christos 
   4182  1.1  christos   return gdbarch;
   4183  1.1  christos }
   4184