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