[gdb] Handle vfork in thread with follow-fork-mode child
[external/binutils.git] / gdb / csky-tdep.c
1 /* Target-dependent code for the CSKY architecture, for GDB.
2
3    Copyright (C) 2010-2019 Free Software Foundation, Inc.
4
5    Contributed by C-SKY Microsystems and Mentor Graphics.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 #include "defs.h"
23 #include "common/gdb_assert.h"
24 #include "frame.h"
25 #include "inferior.h"
26 #include "symtab.h"
27 #include "value.h"
28 #include "gdbcmd.h"
29 #include "language.h"
30 #include "gdbcore.h"
31 #include "symfile.h"
32 #include "objfiles.h"
33 #include "gdbtypes.h"
34 #include "target.h"
35 #include "arch-utils.h"
36 #include "regcache.h"
37 #include "osabi.h"
38 #include "block.h"
39 #include "reggroups.h"
40 #include "elf/csky.h"
41 #include "elf-bfd.h"
42 #include "symcat.h"
43 #include "sim-regno.h"
44 #include "dis-asm.h"
45 #include "frame-unwind.h"
46 #include "frame-base.h"
47 #include "trad-frame.h"
48 #include "infcall.h"
49 #include "floatformat.h"
50 #include "remote.h"
51 #include "target-descriptions.h"
52 #include "dwarf2-frame.h"
53 #include "user-regs.h"
54 #include "valprint.h"
55 #include "csky-tdep.h"
56 #include "regset.h"
57 #include "opcode/csky.h"
58 #include <algorithm>
59 #include <vector>
60
61 /* Control debugging information emitted in this file.  */
62 static int csky_debug = 0;
63
64 static struct reggroup *cr_reggroup;
65 static struct reggroup *fr_reggroup;
66 static struct reggroup *vr_reggroup;
67 static struct reggroup *mmu_reggroup;
68 static struct reggroup *prof_reggroup;
69
70 /* Convenience function to print debug messages in prologue analysis.  */
71
72 static void
73 print_savedreg_msg (int regno, int offsets[], bool print_continuing)
74 {
75   fprintf_unfiltered (gdb_stdlog, "csky: r%d saved at offset 0x%x\n",
76                       regno, offsets[regno]);
77   if (print_continuing)
78     fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
79 }
80
81 /*  Check whether the instruction at ADDR is 16-bit or not.  */
82
83 static int
84 csky_pc_is_csky16 (struct gdbarch *gdbarch, CORE_ADDR addr)
85 {
86   gdb_byte target_mem[2];
87   int status;
88   unsigned int insn;
89   int ret = 1;
90   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
91
92   status = target_read_memory (addr, target_mem, 2);
93   /* Assume a 16-bit instruction if we can't read memory.  */
94   if (status)
95     return 1;
96
97   /* Get instruction from memory.  */
98   insn = extract_unsigned_integer (target_mem, 2, byte_order);
99   if ((insn & CSKY_32_INSN_MASK) == CSKY_32_INSN_MASK)
100     ret = 0;
101   else if (insn == CSKY_BKPT_INSN)
102     {
103       /* Check for 32-bit bkpt instruction which is all 0.  */
104       status = target_read_memory (addr + 2, target_mem, 2);
105       if (status)
106         return 1;
107
108       insn = extract_unsigned_integer (target_mem, 2, byte_order);
109       if (insn == CSKY_BKPT_INSN)
110         ret = 0;
111     }
112   return ret;
113 }
114
115 /* Get one instruction at ADDR and store it in INSN.  Return 2 for
116    a 16-bit instruction or 4 for a 32-bit instruction.  */
117
118 static int
119 csky_get_insn (struct gdbarch *gdbarch, CORE_ADDR addr, unsigned int *insn)
120 {
121   gdb_byte target_mem[2];
122   unsigned int insn_type;
123   int status;
124   int insn_len = 2;
125   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
126
127   status = target_read_memory (addr, target_mem, 2);
128   if (status)
129     memory_error (TARGET_XFER_E_IO, addr);
130
131   insn_type = extract_unsigned_integer (target_mem, 2, byte_order);
132   if (CSKY_32_INSN_MASK == (insn_type & CSKY_32_INSN_MASK))
133     {
134       status = target_read_memory (addr + 2, target_mem, 2);
135       if (status)
136         memory_error (TARGET_XFER_E_IO, addr);
137       insn_type = ((insn_type << 16)
138                    | extract_unsigned_integer (target_mem, 2, byte_order));
139       insn_len = 4;
140     }
141   *insn = insn_type;
142   return insn_len;
143 }
144
145 /* Implement the read_pc gdbarch method.  */
146
147 static CORE_ADDR
148 csky_read_pc (readable_regcache *regcache)
149 {
150   ULONGEST pc;
151   regcache->cooked_read (CSKY_PC_REGNUM, &pc);
152   return pc;
153 }
154
155 /* Implement the write_pc gdbarch method.  */
156
157 static void
158 csky_write_pc (regcache *regcache, CORE_ADDR val)
159 {
160   regcache_cooked_write_unsigned (regcache, CSKY_PC_REGNUM, val);
161 }
162
163 /* Implement the unwind_sp gdbarch method.  */
164
165 static CORE_ADDR
166 csky_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
167 {
168   return frame_unwind_register_unsigned (next_frame, CSKY_SP_REGNUM);
169 }
170
171 /* C-Sky ABI register names.  */
172
173 static const char *csky_register_names[] =
174 {
175   /* General registers 0 - 31.  */
176   "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
177   "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
178   "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
179   "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
180
181   /* DSP hilo registers 36 and 37.  */
182   "",      "",    "",     "",     "hi",    "lo",   "",    "",
183
184   /* FPU/VPU general registers 40 - 71.  */
185   "fr0", "fr1", "fr2",  "fr3",  "fr4",  "fr5",  "fr6",  "fr7",
186   "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
187   "vr0", "vr1", "vr2",  "vr3",  "vr4",  "vr5",  "vr6",  "vr7",
188   "vr8", "vr9", "vr10", "vr11", "vr12", "vr13", "vr14", "vr15",
189
190   /* Program counter 72.  */
191   "pc",
192
193   /* Optional registers (ar) 73 - 88.  */
194   "ar0", "ar1", "ar2",  "ar3",  "ar4",  "ar5",  "ar6",  "ar7",
195   "ar8", "ar9", "ar10", "ar11", "ar12", "ar13", "ar14", "ar15",
196
197   /* Control registers (cr) 89 - 119.  */
198   "psr",  "vbr",  "epsr", "fpsr", "epc",  "fpc",  "ss0",  "ss1",
199   "ss2",  "ss3",  "ss4",  "gcr",  "gsr",  "cr13", "cr14", "cr15",
200   "cr16", "cr17", "cr18", "cr19", "cr20", "cr21", "cr22", "cr23",
201   "cr24", "cr25", "cr26", "cr27", "cr28", "cr29", "cr30", "cr31",
202
203   /* FPU/VPU control registers 121 ~ 123.  */
204   /* User sp 127.  */
205   "fid", "fcr", "fesr", "", "", "", "usp",
206
207   /* MMU control registers: 128 - 136.  */
208   "mcr0", "mcr2", "mcr3", "mcr4", "mcr6", "mcr8", "mcr29", "mcr30",
209   "mcr31", "", "", "",
210
211   /* Profiling control registers 140 - 143.  */
212   /* Profiling software general registers 144 - 157.  */
213   "profcr0",  "profcr1",  "profcr2",  "profcr3",  "profsgr0",  "profsgr1",
214   "profsgr2", "profsgr3", "profsgr4", "profsgr5", "profsgr6",  "profsgr7",
215   "profsgr8", "profsgr9", "profsgr10","profsgr11","profsgr12", "profsgr13",
216   "",    "",
217
218   /* Profiling architecture general registers 160 - 174.  */
219   "profagr0", "profagr1", "profagr2", "profagr3", "profagr4", "profagr5",
220   "profagr6", "profagr7", "profagr8", "profagr9", "profagr10","profagr11",
221   "profagr12","profagr13","profagr14", "",
222
223   /* Profiling extension general registers 176 - 188.  */
224   "profxgr0", "profxgr1", "profxgr2", "profxgr3", "profxgr4", "profxgr5",
225   "profxgr6", "profxgr7", "profxgr8", "profxgr9", "profxgr10","profxgr11",
226   "profxgr12",
227
228   /* Control registers in bank1.  */
229   "", "", "", "", "", "", "", "",
230   "", "", "", "", "", "", "", "",
231   "cp1cr16", "cp1cr17", "cp1cr18", "cp1cr19", "cp1cr20", "", "", "",
232   "", "", "", "", "", "", "", "",
233
234   /* Control registers in bank3 (ICE).  */
235   "sepsr", "sevbr", "seepsr", "", "seepc", "", "nsssp", "seusp",
236   "sedcr", "", "", "", "", "", "", "",
237   "", "", "", "", "", "", "", "",
238   "", "", "", "", "", "", "", ""
239 };
240
241 /* Implement the register_name gdbarch method.  */
242
243 static const char *
244 csky_register_name (struct gdbarch *gdbarch, int reg_nr)
245 {
246   if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
247     return tdesc_register_name (gdbarch, reg_nr);
248
249   if (reg_nr < 0)
250     return NULL;
251
252   if (reg_nr >= gdbarch_num_regs (gdbarch))
253     return NULL;
254
255   return csky_register_names[reg_nr];
256 }
257
258 /* Construct vector type for vrx registers.  */
259
260 static struct type *
261 csky_vector_type (struct gdbarch *gdbarch)
262 {
263   const struct builtin_type *bt = builtin_type (gdbarch);
264
265   struct type *t;
266
267   t = arch_composite_type (gdbarch, "__gdb_builtin_type_vec128i",
268                            TYPE_CODE_UNION);
269
270   append_composite_type_field (t, "u32",
271                                init_vector_type (bt->builtin_int32, 4));
272   append_composite_type_field (t, "u16",
273                                init_vector_type (bt->builtin_int16, 8));
274   append_composite_type_field (t, "u8",
275                                init_vector_type (bt->builtin_int8, 16));
276
277   TYPE_VECTOR (t) = 1;
278   TYPE_NAME (t) = "builtin_type_vec128i";
279
280   return t;
281 }
282
283 /* Return the GDB type object for the "standard" data type
284    of data in register N.  */
285
286 static struct type *
287 csky_register_type (struct gdbarch *gdbarch, int reg_nr)
288 {
289   /* PC, EPC, FPC is a text pointer.  */
290   if ((reg_nr == CSKY_PC_REGNUM)  || (reg_nr == CSKY_EPC_REGNUM)
291       || (reg_nr == CSKY_FPC_REGNUM))
292     return builtin_type (gdbarch)->builtin_func_ptr;
293
294   /* VBR is a data pointer.  */
295   if (reg_nr == CSKY_VBR_REGNUM)
296     return builtin_type (gdbarch)->builtin_data_ptr;
297
298   /* Float register has 64 bits, and only in ck810.  */
299   if ((reg_nr >=CSKY_FR0_REGNUM) && (reg_nr <= CSKY_FR0_REGNUM + 15))
300       return arch_float_type (gdbarch, 64, "builtin_type_csky_ext",
301                               floatformats_ieee_double);
302
303   /* Vector register has 128 bits, and only in ck810.  */
304   if ((reg_nr >= CSKY_VR0_REGNUM) && (reg_nr <= CSKY_VR0_REGNUM + 15))
305     return csky_vector_type (gdbarch);
306
307   /* Profiling general register has 48 bits, we use 64bit.  */
308   if ((reg_nr >= CSKY_PROFGR_REGNUM) && (reg_nr <= CSKY_PROFGR_REGNUM + 44))
309     return builtin_type (gdbarch)->builtin_uint64;
310
311   if (reg_nr == CSKY_SP_REGNUM)
312     return builtin_type (gdbarch)->builtin_data_ptr;
313
314   /* Others are 32 bits.  */
315   return builtin_type (gdbarch)->builtin_int32;
316 }
317
318 /* Data structure to marshall items in a dummy stack frame when
319    calling a function in the inferior.  */
320
321 struct stack_item
322 {
323   stack_item (int len_, const gdb_byte *data_)
324   : len (len_), data (data_)
325   {}
326
327   int len;
328   const gdb_byte *data;
329 };
330
331 /* Implement the push_dummy_call gdbarch method.  */
332
333 static CORE_ADDR
334 csky_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
335                       struct regcache *regcache, CORE_ADDR bp_addr,
336                       int nargs, struct value **args, CORE_ADDR sp,
337                       function_call_return_method return_method,
338                       CORE_ADDR struct_addr)
339 {
340   int argnum;
341   int argreg = CSKY_ABI_A0_REGNUM;
342   int last_arg_regnum = CSKY_ABI_LAST_ARG_REGNUM;
343   int need_dummy_stack = 0;
344   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
345   std::vector<stack_item> stack_items;
346
347   /* Set the return address.  For CSKY, the return breakpoint is
348      always at BP_ADDR.  */
349   regcache_cooked_write_unsigned (regcache, CSKY_LR_REGNUM, bp_addr);
350
351   /* The struct_return pointer occupies the first parameter
352      passing register.  */
353   if (return_method == return_method_struct)
354     {
355       if (csky_debug)
356         {
357           fprintf_unfiltered (gdb_stdlog,
358                               "csky: struct return in %s = %s\n",
359                               gdbarch_register_name (gdbarch, argreg),
360                               paddress (gdbarch, struct_addr));
361         }
362       regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
363       argreg++;
364     }
365
366   /* Put parameters into argument registers in REGCACHE.
367      In ABI argument registers are r0 through r3.  */
368   for (argnum = 0; argnum < nargs; argnum++)
369     {
370       int len;
371       struct type *arg_type;
372       const gdb_byte *val;
373
374       arg_type = check_typedef (value_type (args[argnum]));
375       len = TYPE_LENGTH (arg_type);
376       val = value_contents (args[argnum]);
377
378       /* Copy the argument to argument registers or the dummy stack.
379          Large arguments are split between registers and stack.
380
381          If len < 4, there is no need to worry about endianness since
382          the arguments will always be stored in the low address.  */
383       if (len < 4)
384         {
385           CORE_ADDR regval
386             = extract_unsigned_integer (val, len, byte_order);
387           regcache_cooked_write_unsigned (regcache, argreg, regval);
388           argreg++;
389         }
390       else
391         {
392           while (len > 0)
393             {
394               int partial_len = len < 4 ? len : 4;
395               if (argreg <= last_arg_regnum)
396                 {
397                   /* The argument is passed in an argument register.  */
398                   CORE_ADDR regval
399                     = extract_unsigned_integer (val, partial_len,
400                                                 byte_order);
401                   if (byte_order == BFD_ENDIAN_BIG)
402                     regval <<= (4 - partial_len) * 8;
403
404                   /* Put regval into register in REGCACHE.  */
405                   regcache_cooked_write_unsigned (regcache, argreg,
406                                                   regval);
407                   argreg++;
408                 }
409               else
410                 {
411                   /* The argument should be pushed onto the dummy stack.  */
412                   stack_items.emplace_back (4, val);
413                   need_dummy_stack += 4;
414                 }
415               len -= partial_len;
416               val += partial_len;
417             }
418         }
419     }
420
421   /* Transfer the dummy stack frame to the target.  */
422   std::vector<stack_item>::reverse_iterator iter;
423   for (iter = stack_items.rbegin (); iter != stack_items.rend (); ++iter)
424     {
425       sp -= iter->len;
426       write_memory (sp, iter->data, iter->len);
427     }
428
429   /* Finally, update the SP register.  */
430   regcache_cooked_write_unsigned (regcache, CSKY_SP_REGNUM, sp);
431   return sp;
432 }
433
434 /* Implement the return_value gdbarch method.  */
435
436 static enum return_value_convention
437 csky_return_value (struct gdbarch *gdbarch, struct value *function,
438                    struct type *valtype, struct regcache *regcache,
439                    gdb_byte *readbuf, const gdb_byte *writebuf)
440 {
441   CORE_ADDR regval;
442   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
443   int len = TYPE_LENGTH (valtype);
444   unsigned int ret_regnum = CSKY_RET_REGNUM;
445
446   /* Csky abi specifies that return values larger than 8 bytes
447      are put on the stack.  */
448   if (len > 8)
449     return RETURN_VALUE_STRUCT_CONVENTION;
450   else
451     {
452       if (readbuf != NULL)
453         {
454           ULONGEST tmp;
455           /* By using store_unsigned_integer we avoid having to do
456              anything special for small big-endian values.  */
457           regcache->cooked_read (ret_regnum, &tmp);
458           store_unsigned_integer (readbuf, (len > 4 ? 4 : len),
459                                   byte_order, tmp);
460           if (len > 4)
461             {
462               regcache->cooked_read (ret_regnum + 1, &tmp);
463               store_unsigned_integer (readbuf + 4,  4, byte_order, tmp);
464             }
465         }
466       if (writebuf != NULL)
467         {
468           regval = extract_unsigned_integer (writebuf, len > 4 ? 4 : len,
469                                              byte_order);
470           regcache_cooked_write_unsigned (regcache, ret_regnum, regval);
471           if (len > 4)
472             {
473               regval = extract_unsigned_integer ((gdb_byte *) writebuf + 4,
474                                                  4, byte_order);
475               regcache_cooked_write_unsigned (regcache, ret_regnum + 1,
476                                               regval);
477             }
478
479         }
480       return RETURN_VALUE_REGISTER_CONVENTION;
481     }
482 }
483
484 /* Implement the frame_align gdbarch method.
485
486    Adjust the address downward (direction of stack growth) so that it
487    is correctly aligned for a new stack frame.  */
488
489 static CORE_ADDR
490 csky_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
491 {
492   return align_down (addr, 4);
493 }
494
495 /* Unwind cache used for gdbarch fallback unwinder.  */
496
497 struct csky_unwind_cache
498 {
499   /* The stack pointer at the time this frame was created; i.e. the
500      caller's stack pointer when this function was called.  It is used
501      to identify this frame.  */
502   CORE_ADDR prev_sp;
503
504   /* The frame base for this frame is just prev_sp - frame size.
505      FRAMESIZE is the distance from the frame pointer to the
506      initial stack pointer.  */
507   int framesize;
508
509   /* The register used to hold the frame pointer for this frame.  */
510   int framereg;
511
512   /* Saved register offsets.  */
513   struct trad_frame_saved_reg *saved_regs;
514 };
515
516 /* Do prologue analysis, returning the PC of the first instruction
517    after the function prologue.  */
518
519 static CORE_ADDR
520 csky_analyze_prologue (struct gdbarch *gdbarch,
521                        CORE_ADDR start_pc,
522                        CORE_ADDR limit_pc,
523                        CORE_ADDR end_pc,
524                        struct frame_info *this_frame,
525                        struct csky_unwind_cache *this_cache,
526                        lr_type_t lr_type)
527 {
528   CORE_ADDR addr;
529   unsigned int insn, rn;
530   int framesize = 0;
531   int stacksize = 0;
532   int register_offsets[CSKY_NUM_GREGS_SAVED_GREGS];
533   int insn_len;
534   /* For adjusting fp.  */
535   int is_fp_saved = 0;
536   int adjust_fp = 0;
537
538   /* REGISTER_OFFSETS will contain offsets from the top of the frame
539      (NOT the frame pointer) for the various saved registers, or -1
540      if the register is not saved.  */
541   for (rn = 0; rn < CSKY_NUM_GREGS_SAVED_GREGS; rn++)
542     register_offsets[rn] = -1;
543
544   /* Analyze the prologue.  Things we determine from analyzing the
545      prologue include the size of the frame and which registers are
546      saved (and where).  */
547   if (csky_debug)
548     {
549       fprintf_unfiltered (gdb_stdlog,
550                           "csky: Scanning prologue: start_pc = 0x%x,"
551                           "limit_pc = 0x%x\n", (unsigned int) start_pc,
552                           (unsigned int) limit_pc);
553     }
554
555   /* Default to 16 bit instruction.  */
556   insn_len = 2;
557   stacksize = 0;
558   for (addr = start_pc; addr < limit_pc; addr += insn_len)
559     {
560       /* Get next insn.  */
561       insn_len = csky_get_insn (gdbarch, addr, &insn);
562
563       /* Check if 32 bit.  */
564       if (insn_len == 4)
565         {
566           /* subi32 sp,sp oimm12.  */
567           if (CSKY_32_IS_SUBI0 (insn))
568             {
569               /* Got oimm12.  */
570               int offset = CSKY_32_SUBI_IMM (insn);
571               if (csky_debug)
572                 {
573                   fprintf_unfiltered (gdb_stdlog,
574                                       "csky: got subi sp,%d; continuing\n",
575                                       offset);
576                 }
577               stacksize += offset;
578               continue;
579             }
580           /* stm32 ry-rz,(sp).  */
581           else if (CSKY_32_IS_STMx0 (insn))
582             {
583               /* Spill register(s).  */
584               int start_register;
585               int reg_count;
586               int offset;
587
588               /* BIG WARNING! The CKCore ABI does not restrict functions
589                  to taking only one stack allocation.  Therefore, when
590                  we save a register, we record the offset of where it was
591                  saved relative to the current stacksize.  This will
592                  then give an offset from the SP upon entry to our
593                  function.  Remember, stacksize is NOT constant until
594                  we're done scanning the prologue.  */
595               start_register = CSKY_32_STM_VAL_REGNUM (insn);
596               reg_count = CSKY_32_STM_SIZE (insn);
597               if (csky_debug)
598                 {
599                   fprintf_unfiltered (gdb_stdlog,
600                                       "csky: got stm r%d-r%d,(sp)\n",
601                                       start_register,
602                                       start_register + reg_count);
603                 }
604
605               for (rn = start_register, offset = 0;
606                    rn <= start_register + reg_count;
607                    rn++, offset += 4)
608                 {
609                   register_offsets[rn] = stacksize - offset;
610                   if (csky_debug)
611                     {
612                       fprintf_unfiltered (gdb_stdlog,
613                                           "csky: r%d saved at 0x%x"
614                                           " (offset %d)\n",
615                                           rn, register_offsets[rn],
616                                           offset);
617                     }
618                 }
619               if (csky_debug)
620                 fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
621               continue;
622             }
623           /* stw ry,(sp,disp).  */
624           else if (CSKY_32_IS_STWx0 (insn))
625             {
626               /* Spill register: see note for IS_STM above.  */
627               int disp;
628
629               rn = CSKY_32_ST_VAL_REGNUM (insn);
630               disp = CSKY_32_ST_OFFSET (insn);
631               register_offsets[rn] = stacksize - disp;
632               if (csky_debug)
633                 print_savedreg_msg (rn, register_offsets, true);
634               continue;
635             }
636           else if (CSKY_32_IS_MOV_FP_SP (insn))
637             {
638               /* SP is saved to FP reg, means code afer prologue may
639                  modify SP.  */
640               is_fp_saved = 1;
641               adjust_fp = stacksize;
642               continue;
643             }
644           else if (CSKY_32_IS_MFCR_EPSR (insn))
645             {
646               unsigned int insn2;
647               addr += 4;
648               int mfcr_regnum = insn & 0x1f;
649               insn_len = csky_get_insn (gdbarch, addr, &insn2);
650               if (insn_len == 2)
651                 {
652                   int stw_regnum = (insn2 >> 5) & 0x7;
653                   if (CSKY_16_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
654                     {
655                       int offset;
656
657                       /* CSKY_EPSR_REGNUM.  */
658                       rn  = CSKY_NUM_GREGS;
659                       offset = CSKY_16_STWx0_OFFSET (insn2);
660                       register_offsets[rn] = stacksize - offset;
661                       if (csky_debug)
662                         print_savedreg_msg (rn, register_offsets, true);
663                       continue;
664                     }
665                   break;
666                 }
667               else
668                 {
669                   /* INSN_LEN == 4.  */
670                   int stw_regnum = (insn2 >> 21) & 0x1f;
671                   if (CSKY_32_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
672                     {
673                       int offset;
674
675                       /* CSKY_EPSR_REGNUM.  */
676                       rn  = CSKY_NUM_GREGS;
677                       offset = CSKY_32_ST_OFFSET (insn2);
678                       register_offsets[rn] = framesize - offset;
679                       if (csky_debug)
680                         print_savedreg_msg (rn, register_offsets, true);
681                       continue;
682                     }
683                   break;
684                 }
685             }
686           else if (CSKY_32_IS_MFCR_FPSR (insn))
687             {
688               unsigned int insn2;
689               addr += 4;
690               int mfcr_regnum = insn & 0x1f;
691               insn_len = csky_get_insn (gdbarch, addr, &insn2);
692               if (insn_len == 2)
693                 {
694                   int stw_regnum = (insn2 >> 5) & 0x7;
695                   if (CSKY_16_IS_STWx0 (insn2) && (mfcr_regnum
696                                                  == stw_regnum))
697                     {
698                       int offset;
699
700                       /* CSKY_FPSR_REGNUM.  */
701                       rn  = CSKY_NUM_GREGS + 1;
702                       offset = CSKY_16_STWx0_OFFSET (insn2);
703                       register_offsets[rn] = stacksize - offset;
704                       if (csky_debug)
705                         print_savedreg_msg (rn, register_offsets, true);
706                       continue;
707                     }
708                   break;
709                 }
710               else
711                 {
712                   /* INSN_LEN == 4.  */
713                   int stw_regnum = (insn2 >> 21) & 0x1f;
714                   if (CSKY_32_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
715                     {
716                       int offset;
717
718                       /* CSKY_FPSR_REGNUM.  */
719                       rn  = CSKY_NUM_GREGS + 1;
720                       offset = CSKY_32_ST_OFFSET (insn2);
721                       register_offsets[rn] = framesize - offset;
722                       if (csky_debug)
723                         print_savedreg_msg (rn, register_offsets, true);
724                       continue;
725                     }
726                   break;
727                 }
728             }
729           else if (CSKY_32_IS_MFCR_EPC (insn))
730             {
731               unsigned int insn2;
732               addr += 4;
733               int mfcr_regnum = insn & 0x1f;
734               insn_len = csky_get_insn (gdbarch, addr, &insn2);
735               if (insn_len == 2)
736                 {
737                   int stw_regnum = (insn2 >> 5) & 0x7;
738                   if (CSKY_16_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
739                     {
740                       int offset;
741
742                       /* CSKY_EPC_REGNUM.  */
743                       rn  = CSKY_NUM_GREGS + 2;
744                       offset = CSKY_16_STWx0_OFFSET (insn2);
745                       register_offsets[rn] = stacksize - offset;
746                       if (csky_debug)
747                         print_savedreg_msg (rn, register_offsets, true);
748                       continue;
749                     }
750                   break;
751                 }
752               else
753                 {
754                   /* INSN_LEN == 4.  */
755                   int stw_regnum = (insn2 >> 21) & 0x1f;
756                   if (CSKY_32_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
757                     {
758                       int offset;
759
760                       /* CSKY_EPC_REGNUM.  */
761                       rn  = CSKY_NUM_GREGS + 2;
762                       offset = CSKY_32_ST_OFFSET (insn2);
763                       register_offsets[rn] = framesize - offset;
764                       if (csky_debug)
765                         print_savedreg_msg (rn, register_offsets, true);
766                       continue;
767                     }
768                   break;
769                 }
770             }
771           else if (CSKY_32_IS_MFCR_FPC (insn))
772             {
773               unsigned int insn2;
774               addr += 4;
775               int mfcr_regnum = insn & 0x1f;
776               insn_len = csky_get_insn (gdbarch, addr, &insn2);
777               if (insn_len == 2)
778                 {
779                   int stw_regnum = (insn2 >> 5) & 0x7;
780                   if (CSKY_16_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
781                     {
782                       int offset;
783
784                       /* CSKY_FPC_REGNUM.  */
785                       rn  = CSKY_NUM_GREGS + 3;
786                       offset = CSKY_16_STWx0_OFFSET (insn2);
787                       register_offsets[rn] = stacksize - offset;
788                       if (csky_debug)
789                         print_savedreg_msg (rn, register_offsets, true);
790                       continue;
791                     }
792                   break;
793                 }
794               else
795                 {
796                   /* INSN_LEN == 4.  */
797                   int stw_regnum = (insn2 >> 21) & 0x1f;
798                   if (CSKY_32_IS_STWx0 (insn2) && (mfcr_regnum == stw_regnum))
799                     {
800                       int offset;
801
802                       /* CSKY_FPC_REGNUM.  */
803                       rn  = CSKY_NUM_GREGS + 3;
804                       offset = CSKY_32_ST_OFFSET (insn2);
805                       register_offsets[rn] = framesize - offset;
806                       if (csky_debug)
807                         print_savedreg_msg (rn, register_offsets, true);
808                       continue;
809                     }
810                   break;
811                 }
812             }
813           else if (CSKY_32_IS_PUSH (insn))
814             {
815               /* Push for 32_bit.  */
816               int offset = 0;
817               if (CSKY_32_IS_PUSH_R29 (insn))
818                 {
819                   stacksize += 4;
820                   register_offsets[29] = stacksize;
821                   if (csky_debug)
822                     print_savedreg_msg (29, register_offsets, false);
823                   offset += 4;
824                 }
825               if (CSKY_32_PUSH_LIST2 (insn))
826                 {
827                   int num = CSKY_32_PUSH_LIST2 (insn);
828                   int tmp = 0;
829                   stacksize += num * 4;
830                   offset += num * 4;
831                   if (csky_debug)
832                     {
833                       fprintf_unfiltered (gdb_stdlog,
834                                           "csky: push regs_array: r16-r%d\n",
835                                           16 + num - 1);
836                     }
837                   for (rn = 16; rn <= 16 + num - 1; rn++)
838                     {
839                        register_offsets[rn] = stacksize - tmp;
840                        if (csky_debug)
841                          {
842                            fprintf_unfiltered (gdb_stdlog,
843                                                "csky: r%d saved at 0x%x"
844                                                " (offset %d)\n", rn,
845                                                register_offsets[rn], tmp);
846                          }
847                        tmp += 4;
848                     }
849                 }
850               if (CSKY_32_IS_PUSH_R15 (insn))
851                 {
852                   stacksize += 4;
853                   register_offsets[15] = stacksize;
854                   if (csky_debug)
855                     print_savedreg_msg (15, register_offsets, false);
856                   offset += 4;
857                 }
858               if (CSKY_32_PUSH_LIST1 (insn))
859                 {
860                   int num = CSKY_32_PUSH_LIST1 (insn);
861                   int tmp = 0;
862                   stacksize += num * 4;
863                   offset += num * 4;
864                   if (csky_debug)
865                     {
866                       fprintf_unfiltered (gdb_stdlog,
867                                           "csky: push regs_array: r4-r%d\n",
868                                           4 + num - 1);
869                     }
870                   for (rn = 4; rn <= 4 + num - 1; rn++)
871                     {
872                        register_offsets[rn] = stacksize - tmp;
873                        if (csky_debug)
874                          {
875                            fprintf_unfiltered (gdb_stdlog,
876                                                "csky: r%d saved at 0x%x"
877                                                " (offset %d)\n", rn,
878                                                register_offsets[rn], tmp);
879                          }
880                         tmp += 4;
881                     }
882                 }
883
884               framesize = stacksize;
885               if (csky_debug)
886                 fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
887               continue;
888             }
889           else if (CSKY_32_IS_LRW4 (insn) || CSKY_32_IS_MOVI4 (insn)
890                    || CSKY_32_IS_MOVIH4 (insn) || CSKY_32_IS_BMASKI4 (insn))
891             {
892               int adjust = 0;
893               int offset = 0;
894               unsigned int insn2;
895
896               if (csky_debug)
897                 {
898                   fprintf_unfiltered (gdb_stdlog,
899                                       "csky: looking at large frame\n");
900                 }
901               if (CSKY_32_IS_LRW4 (insn))
902                 {
903                   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
904                   int literal_addr = (addr + ((insn & 0xffff) << 2))
905                                      & 0xfffffffc;
906                   adjust = read_memory_unsigned_integer (literal_addr, 4,
907                                                          byte_order);
908                 }
909               else if (CSKY_32_IS_MOVI4 (insn))
910                 adjust = (insn  & 0xffff);
911               else if (CSKY_32_IS_MOVIH4 (insn))
912                 adjust = (insn & 0xffff) << 16;
913               else
914                 {
915                   /* CSKY_32_IS_BMASKI4 (insn).  */
916                   adjust = (1 << (((insn & 0x3e00000) >> 21) + 1)) - 1;
917                 }
918
919               if (csky_debug)
920                 {
921                   fprintf_unfiltered (gdb_stdlog,
922                                       "csky: base stacksize=0x%x\n", adjust);
923
924                   /* May have zero or more insns which modify r4.  */
925                   fprintf_unfiltered (gdb_stdlog,
926                                       "csky: looking for r4 adjusters...\n");
927                 }
928
929               offset = 4;
930               insn_len = csky_get_insn (gdbarch, addr + offset, &insn2);
931               while (CSKY_IS_R4_ADJUSTER (insn2))
932                 {
933                   if (CSKY_32_IS_ADDI4 (insn2))
934                     {
935                       int imm = (insn2 & 0xfff) + 1;
936                       adjust += imm;
937                       if (csky_debug)
938                         {
939                           fprintf_unfiltered (gdb_stdlog,
940                                               "csky: addi r4,%d\n", imm);
941                         }
942                     }
943                   else if (CSKY_32_IS_SUBI4 (insn2))
944                     {
945                       int imm = (insn2 & 0xfff) + 1;
946                       adjust -= imm;
947                       if (csky_debug)
948                         {
949                           fprintf_unfiltered (gdb_stdlog,
950                                               "csky: subi r4,%d\n", imm);
951                         }
952                     }
953                   else if (CSKY_32_IS_NOR4 (insn2))
954                     {
955                       adjust = ~adjust;
956                       if (csky_debug)
957                         {
958                           fprintf_unfiltered (gdb_stdlog,
959                                               "csky: nor r4,r4,r4\n");
960                         }
961                     }
962                   else if (CSKY_32_IS_ROTLI4 (insn2))
963                     {
964                       int imm = ((insn2 >> 21) & 0x1f);
965                       int temp = adjust >> (32 - imm);
966                       adjust <<= imm;
967                       adjust |= temp;
968                       if (csky_debug)
969                         {
970                           fprintf_unfiltered (gdb_stdlog,
971                                               "csky: rotli r4,r4,%d\n", imm);
972                         }
973                     }
974                   else if (CSKY_32_IS_LISI4 (insn2))
975                     {
976                       int imm = ((insn2 >> 21) & 0x1f);
977                       adjust <<= imm;
978                       if (csky_debug)
979                         {
980                           fprintf_unfiltered (gdb_stdlog,
981                                               "csky: lsli r4,r4,%d\n", imm);
982                         }
983                     }
984                   else if (CSKY_32_IS_BSETI4 (insn2))
985                     {
986                       int imm = ((insn2 >> 21) & 0x1f);
987                       adjust |= (1 << imm);
988                       if (csky_debug)
989                         {
990                           fprintf_unfiltered (gdb_stdlog,
991                                               "csky: bseti r4,r4 %d\n", imm);
992                         }
993                     }
994                   else if (CSKY_32_IS_BCLRI4 (insn2))
995                     {
996                       int imm = ((insn2 >> 21) & 0x1f);
997                       adjust &= ~(1 << imm);
998                       if (csky_debug)
999                         {
1000                           fprintf_unfiltered (gdb_stdlog,
1001                                               "csky: bclri r4,r4 %d\n", imm);
1002                         }
1003                     }
1004                   else if (CSKY_32_IS_IXH4 (insn2))
1005                     {
1006                       adjust *= 3;
1007                       if (csky_debug)
1008                         {
1009                           fprintf_unfiltered (gdb_stdlog,
1010                                               "csky: ixh r4,r4,r4\n");
1011                         }
1012                     }
1013                   else if (CSKY_32_IS_IXW4 (insn2))
1014                     {
1015                       adjust *= 5;
1016                       if (csky_debug)
1017                         {
1018                           fprintf_unfiltered (gdb_stdlog,
1019                                               "csky: ixw r4,r4,r4\n");
1020                         }
1021                     }
1022                   else if (CSKY_16_IS_ADDI4 (insn2))
1023                     {
1024                       int imm = (insn2 & 0xff) + 1;
1025                       adjust += imm;
1026                       if (csky_debug)
1027                         {
1028                           fprintf_unfiltered (gdb_stdlog,
1029                                               "csky: addi r4,%d\n", imm);
1030                         }
1031                     }
1032                   else if (CSKY_16_IS_SUBI4 (insn2))
1033                     {
1034                       int imm = (insn2 & 0xff) + 1;
1035                       adjust -= imm;
1036                       if (csky_debug)
1037                         {
1038                           fprintf_unfiltered (gdb_stdlog,
1039                                               "csky: subi r4,%d\n", imm);
1040                         }
1041                     }
1042                   else if (CSKY_16_IS_NOR4 (insn2))
1043                     {
1044                       adjust = ~adjust;
1045                       if (csky_debug)
1046                         {
1047                           fprintf_unfiltered (gdb_stdlog,
1048                                               "csky: nor r4,r4\n");
1049                         }
1050                     }
1051                   else if (CSKY_16_IS_BSETI4 (insn2))
1052                     {
1053                       int imm = (insn2 & 0x1f);
1054                       adjust |= (1 << imm);
1055                       if (csky_debug)
1056                         {
1057                           fprintf_unfiltered (gdb_stdlog,
1058                                               "csky: bseti r4, %d\n", imm);
1059                         }
1060                     }
1061                   else if (CSKY_16_IS_BCLRI4 (insn2))
1062                     {
1063                       int imm = (insn2 & 0x1f);
1064                       adjust &= ~(1 << imm);
1065                       if (csky_debug)
1066                         {
1067                           fprintf_unfiltered (gdb_stdlog,
1068                                               "csky: bclri r4, %d\n", imm);
1069                         }
1070                     }
1071                   else if (CSKY_16_IS_LSLI4 (insn2))
1072                     {
1073                       int imm = (insn2 & 0x1f);
1074                       adjust <<= imm;
1075                       if (csky_debug)
1076                         {
1077                           fprintf_unfiltered (gdb_stdlog,
1078                                               "csky: lsli r4,r4, %d\n", imm);
1079                         }
1080                     }
1081
1082                   offset += insn_len;
1083                   insn_len =  csky_get_insn (gdbarch, addr + offset, &insn2);
1084                 };
1085
1086               if (csky_debug)
1087                 {
1088                   fprintf_unfiltered (gdb_stdlog, "csky: done looking for"
1089                                       " r4 adjusters\n");
1090                 }
1091
1092               /* If the next insn adjusts the stack pointer, we keep
1093                  everything; if not, we scrap it and we've found the
1094                  end of the prologue.  */
1095               if (CSKY_IS_SUBU4 (insn2))
1096                 {
1097                   addr += offset;
1098                   stacksize += adjust;
1099                   if (csky_debug)
1100                     {
1101                       fprintf_unfiltered (gdb_stdlog,
1102                                           "csky: found stack adjustment of"
1103                                           " 0x%x bytes.\n", adjust);
1104                       fprintf_unfiltered (gdb_stdlog,
1105                                           "csky: skipping to new address %s\n",
1106                                           core_addr_to_string_nz (addr));
1107                       fprintf_unfiltered (gdb_stdlog,
1108                                           "csky: continuing\n");
1109                     }
1110                   continue;
1111                 }
1112
1113               /* None of these instructions are prologue, so don't touch
1114                  anything.  */
1115               if (csky_debug)
1116                 {
1117                   fprintf_unfiltered (gdb_stdlog,
1118                                       "csky: no subu sp,sp,r4; NOT altering"
1119                                       " stacksize.\n");
1120                 }
1121               break;
1122             }
1123         }
1124       else
1125         {
1126           /* insn_len != 4.  */
1127
1128           /* subi.sp sp,disp.  */
1129           if (CSKY_16_IS_SUBI0 (insn))
1130             {
1131               int offset = CSKY_16_SUBI_IMM (insn);
1132               if (csky_debug)
1133                 {
1134                   fprintf_unfiltered (gdb_stdlog,
1135                                       "csky: got subi r0,%d; continuing\n",
1136                                       offset);
1137                 }
1138               stacksize += offset;
1139               continue;
1140             }
1141           /* stw.16 rz,(sp,disp).  */
1142           else if (CSKY_16_IS_STWx0 (insn))
1143             {
1144               /* Spill register: see note for IS_STM above.  */
1145               int disp;
1146
1147               rn = CSKY_16_ST_VAL_REGNUM (insn);
1148               disp = CSKY_16_ST_OFFSET (insn);
1149               register_offsets[rn] = stacksize - disp;
1150               if (csky_debug)
1151                 print_savedreg_msg (rn, register_offsets, true);
1152               continue;
1153             }
1154           else if (CSKY_16_IS_MOV_FP_SP (insn))
1155             {
1156               /* SP is saved to FP reg, means prologue may modify SP.  */
1157               is_fp_saved = 1;
1158               adjust_fp = stacksize;
1159               continue;
1160             }
1161           else if (CSKY_16_IS_PUSH (insn))
1162             {
1163               /* Push for 16_bit.  */
1164               int offset = 0;
1165               if (CSKY_16_IS_PUSH_R15 (insn))
1166                 {
1167                   stacksize += 4;
1168                   register_offsets[15] = stacksize;
1169                   if (csky_debug)
1170                     print_savedreg_msg (15, register_offsets, false);
1171                   offset += 4;
1172                  }
1173               if (CSKY_16_PUSH_LIST1 (insn))
1174                 {
1175                   int num = CSKY_16_PUSH_LIST1 (insn);
1176                   int tmp = 0;
1177                   stacksize += num * 4;
1178                   offset += num * 4;
1179                   if (csky_debug)
1180                     {
1181                       fprintf_unfiltered (gdb_stdlog,
1182                                           "csky: push regs_array: r4-r%d\n",
1183                                           4 + num - 1);
1184                     }
1185                   for (rn = 4; rn <= 4 + num - 1; rn++)
1186                     {
1187                        register_offsets[rn] = stacksize - tmp;
1188                        if (csky_debug)
1189                          {
1190                            fprintf_unfiltered (gdb_stdlog,
1191                                                "csky: r%d saved at 0x%x"
1192                                                " (offset %d)\n", rn,
1193                                                register_offsets[rn], offset);
1194                          }
1195                        tmp += 4;
1196                     }
1197                 }
1198
1199               framesize = stacksize;
1200               if (csky_debug)
1201                 fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
1202               continue;
1203             }
1204           else if (CSKY_16_IS_LRW4 (insn) || CSKY_16_IS_MOVI4 (insn))
1205             {
1206               int adjust = 0;
1207               unsigned int insn2;
1208
1209               if (csky_debug)
1210                 {
1211                   fprintf_unfiltered (gdb_stdlog,
1212                                       "csky: looking at large frame\n");
1213                 }
1214               if (CSKY_16_IS_LRW4 (insn))
1215                 {
1216                   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1217                   int offset = ((insn & 0x300) >> 3) | (insn & 0x1f);
1218                   int literal_addr = (addr + ( offset << 2)) & 0xfffffffc;
1219                   adjust = read_memory_unsigned_integer (literal_addr, 4,
1220                                                          byte_order);
1221                 }
1222               else
1223                 {
1224                   /* CSKY_16_IS_MOVI4 (insn).  */
1225                   adjust = (insn  & 0xff);
1226                 }
1227
1228               if (csky_debug)
1229                 {
1230                   fprintf_unfiltered (gdb_stdlog,
1231                                       "csky: base stacksize=0x%x\n", adjust);
1232                 }
1233
1234               /* May have zero or more instructions which modify r4.  */
1235               if (csky_debug)
1236                 {
1237                   fprintf_unfiltered (gdb_stdlog,
1238                                       "csky: looking for r4 adjusters...\n");
1239                 }
1240               int offset = 2;
1241               insn_len = csky_get_insn (gdbarch, addr + offset, &insn2);
1242               while (CSKY_IS_R4_ADJUSTER (insn2))
1243                 {
1244                   if (CSKY_32_IS_ADDI4 (insn2))
1245                     {
1246                       int imm = (insn2 & 0xfff) + 1;
1247                       adjust += imm;
1248                       if (csky_debug)
1249                         {
1250                           fprintf_unfiltered (gdb_stdlog,
1251                                               "csky: addi r4,%d\n", imm);
1252                         }
1253                     }
1254                   else if (CSKY_32_IS_SUBI4 (insn2))
1255                     {
1256                       int imm = (insn2 & 0xfff) + 1;
1257                       adjust -= imm;
1258                       if (csky_debug)
1259                         {
1260                           fprintf_unfiltered (gdb_stdlog,
1261                                               "csky: subi r4,%d\n", imm);
1262                         }
1263                     }
1264                   else if (CSKY_32_IS_NOR4 (insn2))
1265                     {
1266                       adjust = ~adjust;
1267                       if (csky_debug)
1268                         {
1269                           fprintf_unfiltered (gdb_stdlog,
1270                                               "csky: nor r4,r4,r4\n");
1271                         }
1272                     }
1273                   else if (CSKY_32_IS_ROTLI4 (insn2))
1274                     {
1275                       int imm = ((insn2 >> 21) & 0x1f);
1276                       int temp = adjust >> (32 - imm);
1277                       adjust <<= imm;
1278                       adjust |= temp;
1279                       if (csky_debug)
1280                         {
1281                           fprintf_unfiltered (gdb_stdlog,
1282                                               "csky: rotli r4,r4,%d\n", imm);
1283                         }
1284                     }
1285                   else if (CSKY_32_IS_LISI4 (insn2))
1286                     {
1287                       int imm = ((insn2 >> 21) & 0x1f);
1288                       adjust <<= imm;
1289                       if (csky_debug)
1290                         {
1291                           fprintf_unfiltered (gdb_stdlog,
1292                                               "csky: lsli r4,r4,%d\n", imm);
1293                         }
1294                     }
1295                   else if (CSKY_32_IS_BSETI4 (insn2))
1296                     {
1297                       int imm = ((insn2 >> 21) & 0x1f);
1298                       adjust |= (1 << imm);
1299                       if (csky_debug)
1300                         {
1301                           fprintf_unfiltered (gdb_stdlog,
1302                                               "csky: bseti r4,r4 %d\n", imm);
1303                         }
1304                     }
1305                   else if (CSKY_32_IS_BCLRI4 (insn2))
1306                     {
1307                       int imm = ((insn2 >> 21) & 0x1f);
1308                       adjust &= ~(1 << imm);
1309                       if (csky_debug)
1310                         {
1311                           fprintf_unfiltered (gdb_stdlog,
1312                                               "csky: bclri r4,r4 %d\n", imm);
1313                         }
1314                     }
1315                   else if (CSKY_32_IS_IXH4 (insn2))
1316                     {
1317                       adjust *= 3;
1318                       if (csky_debug)
1319                         {
1320                           fprintf_unfiltered (gdb_stdlog,
1321                                               "csky: ixh r4,r4,r4\n");
1322                         }
1323                     }
1324                   else if (CSKY_32_IS_IXW4 (insn2))
1325                     {
1326                       adjust *= 5;
1327                       if (csky_debug)
1328                         {
1329                           fprintf_unfiltered (gdb_stdlog,
1330                                               "csky: ixw r4,r4,r4\n");
1331                         }
1332                     }
1333                   else if (CSKY_16_IS_ADDI4 (insn2))
1334                     {
1335                       int imm = (insn2 & 0xff) + 1;
1336                       adjust += imm;
1337                       if (csky_debug)
1338                         {
1339                           fprintf_unfiltered (gdb_stdlog,
1340                                               "csky: addi r4,%d\n", imm);
1341                         }
1342                     }
1343                   else if (CSKY_16_IS_SUBI4 (insn2))
1344                     {
1345                       int imm = (insn2 & 0xff) + 1;
1346                       adjust -= imm;
1347                       if (csky_debug)
1348                         {
1349                           fprintf_unfiltered (gdb_stdlog,
1350                                               "csky: subi r4,%d\n", imm);
1351                         }
1352                     }
1353                   else if (CSKY_16_IS_NOR4 (insn2))
1354                     {
1355                       adjust = ~adjust;
1356                       if (csky_debug)
1357                         {
1358                           fprintf_unfiltered (gdb_stdlog,
1359                                               "csky: nor r4,r4\n");
1360                         }
1361                     }
1362                   else if (CSKY_16_IS_BSETI4 (insn2))
1363                     {
1364                       int imm = (insn2 & 0x1f);
1365                       adjust |= (1 << imm);
1366                       if (csky_debug)
1367                         {
1368                           fprintf_unfiltered (gdb_stdlog,
1369                                               "csky: bseti r4, %d\n", imm);
1370                         }
1371                     }
1372                   else if (CSKY_16_IS_BCLRI4 (insn2))
1373                     {
1374                       int imm = (insn2 & 0x1f);
1375                       adjust &= ~(1 << imm);
1376                       if (csky_debug)
1377                         {
1378                           fprintf_unfiltered (gdb_stdlog,
1379                                               "csky: bclri r4, %d\n", imm);
1380                         }
1381                     }
1382                   else if (CSKY_16_IS_LSLI4 (insn2))
1383                     {
1384                       int imm = (insn2 & 0x1f);
1385                       adjust <<= imm;
1386                       if (csky_debug)
1387                         {
1388                           fprintf_unfiltered (gdb_stdlog,
1389                                               "csky: lsli r4,r4, %d\n", imm);
1390                         }
1391                     }
1392
1393                   offset += insn_len;
1394                   insn_len = csky_get_insn (gdbarch, addr + offset, &insn2);
1395                 };
1396
1397               if (csky_debug)
1398                 {
1399                   fprintf_unfiltered (gdb_stdlog, "csky: "
1400                                       "done looking for r4 adjusters\n");
1401                 }
1402
1403               /* If the next instruction adjusts the stack pointer, we keep
1404                  everything; if not, we scrap it and we've found the end
1405                  of the prologue.  */
1406               if (CSKY_IS_SUBU4 (insn2))
1407                 {
1408                   addr += offset;
1409                   stacksize += adjust;
1410                   if (csky_debug)
1411                     {
1412                       fprintf_unfiltered (gdb_stdlog, "csky: "
1413                                           "found stack adjustment of 0x%x"
1414                                           " bytes.\n", adjust);
1415                       fprintf_unfiltered (gdb_stdlog, "csky: "
1416                                           "skipping to new address %s\n",
1417                                           core_addr_to_string_nz (addr));
1418                       fprintf_unfiltered (gdb_stdlog, "csky: continuing\n");
1419                     }
1420                   continue;
1421                 }
1422
1423               /* None of these instructions are prologue, so don't touch
1424                  anything.  */
1425               if (csky_debug)
1426                 {
1427                   fprintf_unfiltered (gdb_stdlog, "csky: no subu sp,r4; "
1428                                       "NOT altering stacksize.\n");
1429                 }
1430               break;
1431             }
1432         }
1433
1434       /* This is not a prologue instruction, so stop here.  */
1435       if (csky_debug)
1436         {
1437           fprintf_unfiltered (gdb_stdlog, "csky: insn is not a prologue"
1438                               " insn -- ending scan\n");
1439         }
1440       break;
1441     }
1442
1443   if (this_cache)
1444     {
1445       CORE_ADDR unwound_fp;
1446       enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1447       this_cache->framesize = framesize;
1448
1449       if (is_fp_saved)
1450         {
1451           this_cache->framereg = CSKY_FP_REGNUM;
1452           unwound_fp = get_frame_register_unsigned (this_frame,
1453                                                     this_cache->framereg);
1454           this_cache->prev_sp = unwound_fp + adjust_fp;
1455         }
1456       else
1457         {
1458           this_cache->framereg = CSKY_SP_REGNUM;
1459           unwound_fp = get_frame_register_unsigned (this_frame,
1460                                                     this_cache->framereg);
1461           this_cache->prev_sp = unwound_fp + stacksize;
1462         }
1463
1464       /* Note where saved registers are stored.  The offsets in
1465          REGISTER_OFFSETS are computed relative to the top of the frame.  */
1466       for (rn = 0; rn < CSKY_NUM_GREGS; rn++)
1467         {
1468           if (register_offsets[rn] >= 0)
1469             {
1470               this_cache->saved_regs[rn].addr
1471                 = this_cache->prev_sp - register_offsets[rn];
1472               if (csky_debug)
1473                 {
1474                   CORE_ADDR rn_value = read_memory_unsigned_integer (
1475                     this_cache->saved_regs[rn].addr, 4, byte_order);
1476                   fprintf_unfiltered (gdb_stdlog, "Saved register %s "
1477                                       "stored at 0x%08lx, value=0x%08lx\n",
1478                                       csky_register_names[rn],
1479                                       (unsigned long)
1480                                         this_cache->saved_regs[rn].addr,
1481                                       (unsigned long) rn_value);
1482                 }
1483             }
1484         }
1485       if (lr_type == LR_TYPE_EPC)
1486         {
1487           /* rte || epc .  */
1488           this_cache->saved_regs[CSKY_PC_REGNUM]
1489             = this_cache->saved_regs[CSKY_EPC_REGNUM];
1490         }
1491       else if (lr_type == LR_TYPE_FPC)
1492         {
1493           /* rfi || fpc .  */
1494           this_cache->saved_regs[CSKY_PC_REGNUM]
1495             = this_cache->saved_regs[CSKY_FPC_REGNUM];
1496         }
1497       else
1498         {
1499           this_cache->saved_regs[CSKY_PC_REGNUM]
1500             = this_cache->saved_regs[CSKY_LR_REGNUM];
1501         }
1502     }
1503
1504   return addr;
1505 }
1506
1507 /* Detect whether PC is at a point where the stack frame has been
1508    destroyed.  */
1509
1510 static int
1511 csky_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
1512 {
1513   unsigned int insn;
1514   CORE_ADDR addr;
1515   CORE_ADDR func_start, func_end;
1516
1517   if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
1518     return 0;
1519
1520   bool fp_saved = false;
1521   int insn_len;
1522   for (addr = func_start; addr < func_end; addr += insn_len)
1523     {
1524       /* Get next insn.  */
1525       insn_len = csky_get_insn (gdbarch, addr, &insn);
1526
1527       if (insn_len == 2)
1528         {
1529           /* Is sp is saved to fp.  */
1530           if (CSKY_16_IS_MOV_FP_SP (insn))
1531             fp_saved = true;
1532           /* If sp was saved to fp and now being restored from
1533              fp then it indicates the start of epilog.  */
1534           else if (fp_saved && CSKY_16_IS_MOV_SP_FP (insn))
1535             return pc >= addr;
1536         }
1537     }
1538   return 0;
1539 }
1540
1541 /* Implement the skip_prologue gdbarch hook.  */
1542
1543 static CORE_ADDR
1544 csky_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1545 {
1546   CORE_ADDR func_addr, func_end;
1547   struct symtab_and_line sal;
1548   const int default_search_limit = 128;
1549
1550   /* See if we can find the end of the prologue using the symbol table.  */
1551   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
1552     {
1553       CORE_ADDR post_prologue_pc
1554         = skip_prologue_using_sal (gdbarch, func_addr);
1555
1556       if (post_prologue_pc != 0)
1557         return std::max (pc, post_prologue_pc);
1558     }
1559   else
1560     func_end = pc + default_search_limit;
1561
1562   /* Find the end of prologue.  Default lr_type.  */
1563   return csky_analyze_prologue (gdbarch, pc, func_end, func_end,
1564                                 NULL, NULL, LR_TYPE_R15);
1565 }
1566
1567 /* Implement the breakpoint_kind_from_pc gdbarch method.  */
1568
1569 static int
1570 csky_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
1571 {
1572   if (csky_pc_is_csky16 (gdbarch, *pcptr))
1573     return CSKY_INSN_SIZE16;
1574   else
1575     return CSKY_INSN_SIZE32;
1576 }
1577
1578 /* Implement the sw_breakpoint_from_kind gdbarch method.  */
1579
1580 static const gdb_byte *
1581 csky_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
1582 {
1583   *size = kind;
1584   if (kind == CSKY_INSN_SIZE16)
1585     {
1586       static gdb_byte csky_16_breakpoint[] = { 0, 0 };
1587       return csky_16_breakpoint;
1588     }
1589   else
1590     {
1591       static gdb_byte csky_32_breakpoint[] = { 0, 0, 0, 0 };
1592       return csky_32_breakpoint;
1593     }
1594 }
1595
1596 /* Implement the memory_insert_breakpoint gdbarch method.  */
1597
1598 static int
1599 csky_memory_insert_breakpoint (struct gdbarch *gdbarch,
1600                                struct bp_target_info *bp_tgt)
1601 {
1602   int val;
1603   const unsigned char *bp;
1604   gdb_byte bp_write_record1[] = { 0, 0, 0, 0 };
1605   gdb_byte bp_write_record2[] = { 0, 0, 0, 0 };
1606   gdb_byte bp_record[] = { 0, 0, 0, 0 };
1607
1608   /* Sanity-check bp_address.  */
1609   if (bp_tgt->reqstd_address % 2)
1610     warning (_("Invalid breakpoint address 0x%x is an odd number."),
1611              (unsigned int) bp_tgt->reqstd_address);
1612   scoped_restore restore_memory
1613     = make_scoped_restore_show_memory_breakpoints (1);
1614
1615   /* Determine appropriate breakpoint_kind for this address.  */
1616   bp_tgt->kind = csky_breakpoint_kind_from_pc (gdbarch,
1617                                                &bp_tgt->reqstd_address);
1618
1619   /* Save the memory contents.  */
1620   bp_tgt->shadow_len = bp_tgt->kind;
1621
1622   /* Fill bp_tgt->placed_address.  */
1623   bp_tgt->placed_address = bp_tgt->reqstd_address;
1624
1625   if (bp_tgt->kind == CSKY_INSN_SIZE16)
1626     {
1627       if ((bp_tgt->reqstd_address % 4) == 0)
1628         {
1629           /* Read two bytes.  */
1630           val = target_read_memory (bp_tgt->reqstd_address,
1631                                     bp_tgt->shadow_contents, 2);
1632           if (val)
1633             return val;
1634
1635           /* Read two bytes.  */
1636           val = target_read_memory (bp_tgt->reqstd_address + 2,
1637                                     bp_record, 2);
1638           if (val)
1639             return val;
1640
1641           /* Write the breakpoint.  */
1642           bp_write_record1[2] = bp_record[0];
1643           bp_write_record1[3] = bp_record[1];
1644           bp = bp_write_record1;
1645           val = target_write_raw_memory (bp_tgt->reqstd_address, bp,
1646                                          CSKY_WR_BKPT_MODE);
1647         }
1648       else
1649         {
1650           val = target_read_memory (bp_tgt->reqstd_address,
1651                                     bp_tgt->shadow_contents, 2);
1652           if (val)
1653             return val;
1654
1655           val = target_read_memory (bp_tgt->reqstd_address - 2,
1656                                     bp_record, 2);
1657           if (val)
1658             return val;
1659
1660           /* Write the breakpoint.  */
1661           bp_write_record1[0] = bp_record[0];
1662           bp_write_record1[1] = bp_record[1];
1663           bp = bp_write_record1;
1664           val = target_write_raw_memory (bp_tgt->reqstd_address - 2,
1665                                          bp, CSKY_WR_BKPT_MODE);
1666         }
1667     }
1668   else
1669     {
1670       if (bp_tgt->placed_address % 4 == 0)
1671         {
1672           val = target_read_memory (bp_tgt->reqstd_address,
1673                                     bp_tgt->shadow_contents,
1674                                     CSKY_WR_BKPT_MODE);
1675           if (val)
1676             return val;
1677
1678           /* Write the breakpoint.  */
1679           bp = bp_write_record1;
1680           val = target_write_raw_memory (bp_tgt->reqstd_address,
1681                                          bp, CSKY_WR_BKPT_MODE);
1682         }
1683       else
1684         {
1685           val = target_read_memory (bp_tgt->reqstd_address,
1686                                     bp_tgt->shadow_contents,
1687                                     CSKY_WR_BKPT_MODE);
1688           if (val)
1689             return val;
1690
1691           val = target_read_memory (bp_tgt->reqstd_address - 2,
1692                                     bp_record, 2);
1693           if (val)
1694             return val;
1695
1696           val = target_read_memory (bp_tgt->reqstd_address + 4,
1697                                     bp_record + 2, 2);
1698           if (val)
1699             return val;
1700
1701           bp_write_record1[0] = bp_record[0];
1702           bp_write_record1[1] = bp_record[1];
1703           bp_write_record2[2] = bp_record[2];
1704           bp_write_record2[3] = bp_record[3];
1705
1706           /* Write the breakpoint.  */
1707           bp = bp_write_record1;
1708           val = target_write_raw_memory (bp_tgt->reqstd_address - 2, bp,
1709                                          CSKY_WR_BKPT_MODE);
1710           if (val)
1711             return val;
1712
1713           /* Write the breakpoint.  */
1714           bp = bp_write_record2;
1715           val = target_write_raw_memory (bp_tgt->reqstd_address + 2, bp,
1716                                          CSKY_WR_BKPT_MODE);
1717         }
1718     }
1719   return val;
1720 }
1721
1722 /* Restore the breakpoint shadow_contents to the target.  */
1723
1724 static int
1725 csky_memory_remove_breakpoint (struct gdbarch *gdbarch,
1726                                struct bp_target_info *bp_tgt)
1727 {
1728   int val;
1729   gdb_byte bp_record[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
1730   /* Different for shadow_len 2 or 4.  */
1731   if (bp_tgt->shadow_len == 2)
1732     {
1733       /* Do word-sized writes on word-aligned boundaries and read
1734          padding bytes as necessary.  */
1735       if (bp_tgt->reqstd_address % 4 == 0)
1736         {
1737           val = target_read_memory (bp_tgt->reqstd_address + 2,
1738                                     bp_record + 2, 2);
1739           if (val)
1740             return val;
1741           bp_record[0] = bp_tgt->shadow_contents[0];
1742           bp_record[1] = bp_tgt->shadow_contents[1];
1743           return target_write_raw_memory (bp_tgt->reqstd_address,
1744                                           bp_record, CSKY_WR_BKPT_MODE);
1745         }
1746       else
1747         {
1748           val = target_read_memory (bp_tgt->reqstd_address - 2,
1749                                     bp_record, 2);
1750           if (val)
1751             return val;
1752           bp_record[2] = bp_tgt->shadow_contents[0];
1753           bp_record[3] = bp_tgt->shadow_contents[1];
1754           return target_write_raw_memory (bp_tgt->reqstd_address - 2,
1755                                           bp_record, CSKY_WR_BKPT_MODE);
1756         }
1757     }
1758   else
1759     {
1760       /* Do word-sized writes on word-aligned boundaries and read
1761          padding bytes as necessary.  */
1762       if (bp_tgt->placed_address % 4 == 0)
1763         {
1764           return target_write_raw_memory (bp_tgt->reqstd_address,
1765                                           bp_tgt->shadow_contents,
1766                                           CSKY_WR_BKPT_MODE);
1767         }
1768       else
1769         {
1770           val = target_read_memory (bp_tgt->reqstd_address - 2,
1771                                     bp_record, 2);
1772           if (val)
1773             return val;
1774           val = target_read_memory (bp_tgt->reqstd_address + 4,
1775                                     bp_record+6, 2);
1776           if (val)
1777             return val;
1778
1779           bp_record[2] = bp_tgt->shadow_contents[0];
1780           bp_record[3] = bp_tgt->shadow_contents[1];
1781           bp_record[4] = bp_tgt->shadow_contents[2];
1782           bp_record[5] = bp_tgt->shadow_contents[3];
1783
1784           return target_write_raw_memory (bp_tgt->reqstd_address - 2,
1785                                           bp_record,
1786                                           CSKY_WR_BKPT_MODE * 2);
1787         }
1788     }
1789 }
1790
1791 /* Determine link register type.  */
1792
1793 static lr_type_t
1794 csky_analyze_lr_type (struct gdbarch *gdbarch,
1795                       CORE_ADDR start_pc, CORE_ADDR end_pc)
1796 {
1797   CORE_ADDR addr;
1798   unsigned int insn, insn_len;
1799   insn_len = 2;
1800
1801   for (addr = start_pc; addr < end_pc; addr += insn_len)
1802     {
1803       insn_len = csky_get_insn (gdbarch, addr, &insn);
1804       if (insn_len == 4)
1805         {
1806           if (CSKY_32_IS_MFCR_EPSR (insn) || CSKY_32_IS_MFCR_EPC (insn)
1807               || CSKY_32_IS_RTE (insn))
1808             return LR_TYPE_EPC;
1809         }
1810       else if (CSKY_32_IS_MFCR_FPSR (insn) || CSKY_32_IS_MFCR_FPC (insn)
1811                || CSKY_32_IS_RFI (insn))
1812         return LR_TYPE_FPC;
1813       else if (CSKY_32_IS_JMP (insn) || CSKY_32_IS_BR (insn)
1814                || CSKY_32_IS_JMPIX (insn) || CSKY_32_IS_JMPI (insn))
1815         return LR_TYPE_R15;
1816       else
1817         {
1818           /* 16 bit instruction.  */
1819           if (CSKY_16_IS_JMP (insn) || CSKY_16_IS_BR (insn)
1820               || CSKY_16_IS_JMPIX (insn))
1821             return LR_TYPE_R15;
1822         }
1823     }
1824     return LR_TYPE_R15;
1825 }
1826
1827 /* Heuristic unwinder.  */
1828
1829 static struct csky_unwind_cache *
1830 csky_frame_unwind_cache (struct frame_info *this_frame)
1831 {
1832   CORE_ADDR prologue_start, prologue_end, func_end, prev_pc, block_addr;
1833   struct csky_unwind_cache *cache;
1834   const struct block *bl;
1835   unsigned long func_size = 0;
1836   struct gdbarch *gdbarch = get_frame_arch (this_frame);
1837   unsigned int sp_regnum = CSKY_SP_REGNUM;
1838
1839   /* Default lr type is r15.  */
1840   lr_type_t lr_type = LR_TYPE_R15;
1841
1842   cache = FRAME_OBSTACK_ZALLOC (struct csky_unwind_cache);
1843   cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1844
1845   /* Assume there is no frame until proven otherwise.  */
1846   cache->framereg = sp_regnum;
1847
1848   cache->framesize = 0;
1849
1850   prev_pc = get_frame_pc (this_frame);
1851   block_addr = get_frame_address_in_block (this_frame);
1852   if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1853                                 &func_end) == 0)
1854     /* We couldn't find a function containing block_addr, so bail out
1855        and hope for the best.  */
1856     return cache;
1857
1858   /* Get the (function) symbol matching prologue_start.  */
1859   bl = block_for_pc (prologue_start);
1860   if (bl != NULL)
1861     func_size = bl->endaddr - bl->startaddr;
1862   else
1863     {
1864       struct bound_minimal_symbol msymbol
1865         = lookup_minimal_symbol_by_pc (prologue_start);
1866       if (msymbol.minsym != NULL)
1867         func_size = MSYMBOL_SIZE (msymbol.minsym);
1868     }
1869
1870   /* If FUNC_SIZE is 0 we may have a special-case use of lr
1871      e.g. exception or interrupt.  */
1872   if (func_size == 0)
1873     lr_type = csky_analyze_lr_type (gdbarch, prologue_start, func_end);
1874
1875   prologue_end = std::min (func_end, prev_pc);
1876
1877   /* Analyze the function prologue.  */
1878   csky_analyze_prologue (gdbarch, prologue_start, prologue_end,
1879                             func_end, this_frame, cache, lr_type);
1880
1881   /* gdbarch_sp_regnum contains the value and not the address.  */
1882   trad_frame_set_value (cache->saved_regs, sp_regnum, cache->prev_sp);
1883   return cache;
1884 }
1885
1886 /* Implement the unwind_pc gdbarch method.  */
1887
1888 static CORE_ADDR
1889 csky_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
1890 {
1891   return frame_unwind_register_unsigned (next_frame, CSKY_PC_REGNUM);
1892 }
1893
1894 /* Implement the this_id function for the normal unwinder.  */
1895
1896 static void
1897 csky_frame_this_id (struct frame_info *this_frame,
1898                     void **this_prologue_cache, struct frame_id *this_id)
1899 {
1900   struct csky_unwind_cache *cache;
1901   struct frame_id id;
1902
1903   if (*this_prologue_cache == NULL)
1904     *this_prologue_cache = csky_frame_unwind_cache (this_frame);
1905   cache = (struct csky_unwind_cache *) *this_prologue_cache;
1906
1907   /* This marks the outermost frame.  */
1908   if (cache->prev_sp == 0)
1909     return;
1910
1911   id = frame_id_build (cache->prev_sp, get_frame_func (this_frame));
1912   *this_id = id;
1913 }
1914
1915 /* Implement the prev_register function for the normal unwinder.  */
1916
1917 static struct value *
1918 csky_frame_prev_register (struct frame_info *this_frame,
1919                           void **this_prologue_cache, int regnum)
1920 {
1921   struct csky_unwind_cache *cache;
1922
1923   if (*this_prologue_cache == NULL)
1924     *this_prologue_cache = csky_frame_unwind_cache (this_frame);
1925   cache = (struct csky_unwind_cache *) *this_prologue_cache;
1926
1927   return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1928                                        regnum);
1929 }
1930
1931 /* Data structures for the normal prologue-analysis-based
1932    unwinder.  */
1933
1934 static const struct frame_unwind csky_unwind_cache = {
1935   NORMAL_FRAME,
1936   default_frame_unwind_stop_reason,
1937   csky_frame_this_id,
1938   csky_frame_prev_register,
1939   NULL,
1940   default_frame_sniffer,
1941   NULL,
1942   NULL
1943 };
1944
1945
1946
1947 static int
1948 csky_stub_unwind_sniffer (const struct frame_unwind *self,
1949                          struct frame_info *this_frame,
1950                          void **this_prologue_cache)
1951 {
1952   CORE_ADDR addr_in_block;
1953
1954   addr_in_block = get_frame_address_in_block (this_frame);
1955
1956   if (find_pc_partial_function (addr_in_block, NULL, NULL, NULL) == 0
1957       || in_plt_section (addr_in_block))
1958     return 1;
1959
1960   return 0;
1961 }
1962
1963 static struct csky_unwind_cache *
1964 csky_make_stub_cache (struct frame_info *this_frame)
1965 {
1966   struct csky_unwind_cache *cache;
1967
1968   cache = FRAME_OBSTACK_ZALLOC (struct csky_unwind_cache);
1969   cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1970   cache->prev_sp = get_frame_register_unsigned (this_frame, CSKY_SP_REGNUM);
1971
1972   return cache;
1973 }
1974
1975 static void
1976 csky_stub_this_id (struct frame_info *this_frame,
1977                   void **this_cache,
1978                   struct frame_id *this_id)
1979 {
1980   struct csky_unwind_cache *cache;
1981
1982   if (*this_cache == NULL)
1983     *this_cache = csky_make_stub_cache (this_frame);
1984   cache = (struct csky_unwind_cache *) *this_cache;
1985
1986   /* Our frame ID for a stub frame is the current SP and LR.  */
1987   *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
1988 }
1989
1990 static struct value *
1991 csky_stub_prev_register (struct frame_info *this_frame,
1992                             void **this_cache,
1993                             int prev_regnum)
1994 {
1995   struct csky_unwind_cache *cache;
1996
1997   if (*this_cache == NULL)
1998     *this_cache = csky_make_stub_cache (this_frame);
1999   cache = (struct csky_unwind_cache *) *this_cache;
2000
2001   /* If we are asked to unwind the PC, then return the LR.  */
2002   if (prev_regnum == CSKY_PC_REGNUM)
2003     {
2004       CORE_ADDR lr;
2005
2006       lr = frame_unwind_register_unsigned (this_frame, CSKY_LR_REGNUM);
2007       return frame_unwind_got_constant (this_frame, prev_regnum, lr);
2008     }
2009
2010   if (prev_regnum == CSKY_SP_REGNUM)
2011     return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
2012
2013   return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2014                                        prev_regnum);
2015 }
2016
2017 struct frame_unwind csky_stub_unwind = {
2018   NORMAL_FRAME,
2019   default_frame_unwind_stop_reason,
2020   csky_stub_this_id,
2021   csky_stub_prev_register,
2022   NULL,
2023   csky_stub_unwind_sniffer
2024 };
2025
2026 /* Implement the this_base, this_locals, and this_args hooks
2027    for the normal unwinder.  */
2028
2029 static CORE_ADDR
2030 csky_frame_base_address (struct frame_info *this_frame, void **this_cache)
2031 {
2032   struct csky_unwind_cache *cache;
2033
2034   if (*this_cache == NULL)
2035     *this_cache = csky_frame_unwind_cache (this_frame);
2036   cache = (struct csky_unwind_cache *) *this_cache;
2037
2038   return cache->prev_sp - cache->framesize;
2039 }
2040
2041 static const struct frame_base csky_frame_base = {
2042   &csky_unwind_cache,
2043   csky_frame_base_address,
2044   csky_frame_base_address,
2045   csky_frame_base_address
2046 };
2047
2048 /* Implement the dummy_id gdbarch method.  The frame ID's base
2049    needs to match the TOS value saved by save_dummy_frame_tos,
2050    and the PC should match the dummy frame's breakpoint.  */
2051
2052 static struct frame_id
2053 csky_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
2054 {
2055   unsigned int sp_regnum = CSKY_SP_REGNUM;
2056
2057   CORE_ADDR sp = get_frame_register_unsigned (this_frame, sp_regnum);
2058   return frame_id_build (sp, get_frame_pc (this_frame));
2059 }
2060
2061 /* Initialize register access method.  */
2062
2063 static void
2064 csky_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
2065                             struct dwarf2_frame_state_reg *reg,
2066                             struct frame_info *this_frame)
2067 {
2068   if (regnum == gdbarch_pc_regnum (gdbarch))
2069     reg->how = DWARF2_FRAME_REG_RA;
2070   else if (regnum == gdbarch_sp_regnum (gdbarch))
2071     reg->how = DWARF2_FRAME_REG_CFA;
2072 }
2073
2074 /* Create csky register groups.  */
2075
2076 static void
2077 csky_init_reggroup ()
2078 {
2079   cr_reggroup = reggroup_new ("cr", USER_REGGROUP);
2080   fr_reggroup = reggroup_new ("fr", USER_REGGROUP);
2081   vr_reggroup = reggroup_new ("vr", USER_REGGROUP);
2082   mmu_reggroup = reggroup_new ("mmu", USER_REGGROUP);
2083   prof_reggroup = reggroup_new ("profiling", USER_REGGROUP);
2084 }
2085
2086 /* Add register groups into reggroup list.  */
2087
2088 static void
2089 csky_add_reggroups (struct gdbarch *gdbarch)
2090 {
2091   reggroup_add (gdbarch, all_reggroup);
2092   reggroup_add (gdbarch, general_reggroup);
2093   reggroup_add (gdbarch, cr_reggroup);
2094   reggroup_add (gdbarch, fr_reggroup);
2095   reggroup_add (gdbarch, vr_reggroup);
2096   reggroup_add (gdbarch, mmu_reggroup);
2097   reggroup_add (gdbarch, prof_reggroup);
2098 }
2099
2100 /* Return the groups that a CSKY register can be categorised into.  */
2101
2102 static int
2103 csky_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
2104                           struct reggroup *reggroup)
2105 {
2106   int raw_p;
2107
2108   if (gdbarch_register_name (gdbarch, regnum) == NULL
2109       || gdbarch_register_name (gdbarch, regnum)[0] == '\0')
2110     return 0;
2111
2112   if (reggroup == all_reggroup)
2113     return 1;
2114
2115   raw_p = regnum < gdbarch_num_regs (gdbarch);
2116   if (reggroup == save_reggroup || reggroup == restore_reggroup)
2117     return raw_p;
2118
2119   if (((regnum >= CSKY_R0_REGNUM) && (regnum <= CSKY_R0_REGNUM + 31))
2120       && (reggroup == general_reggroup))
2121     return 1;
2122
2123   if (((regnum == CSKY_PC_REGNUM)
2124        || ((regnum >= CSKY_CR0_REGNUM)
2125            && (regnum <= CSKY_CR0_REGNUM + 30)))
2126       && (reggroup == cr_reggroup))
2127     return 2;
2128
2129   if ((((regnum >= CSKY_VR0_REGNUM) && (regnum <= CSKY_VR0_REGNUM + 15))
2130        || ((regnum >= CSKY_VCR0_REGNUM)
2131            && (regnum <= CSKY_VCR0_REGNUM + 2)))
2132       && (reggroup == vr_reggroup))
2133     return 3;
2134
2135   if (((regnum >= CSKY_MMU_REGNUM) && (regnum <= CSKY_MMU_REGNUM + 8))
2136       && (reggroup == mmu_reggroup))
2137     return 4;
2138
2139   if (((regnum >= CSKY_PROFCR_REGNUM)
2140        && (regnum <= CSKY_PROFCR_REGNUM + 48))
2141       && (reggroup == prof_reggroup))
2142     return 5;
2143
2144   if ((((regnum >= CSKY_FR0_REGNUM) && (regnum <= CSKY_FR0_REGNUM + 15))
2145        || ((regnum >= CSKY_VCR0_REGNUM) && (regnum <= CSKY_VCR0_REGNUM + 2)))
2146       && (reggroup == fr_reggroup))
2147     return 6;
2148
2149   return 0;
2150 }
2151
2152 /* Implement the dwarf2_reg_to_regnum gdbarch method.  */
2153
2154 static int
2155 csky_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int dw_reg)
2156 {
2157   if (dw_reg < 0 || dw_reg >= CSKY_NUM_REGS)
2158     return -1;
2159   return dw_reg;
2160 }
2161
2162 /* Override interface for command: info register.  */
2163
2164 static void
2165 csky_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
2166                            struct frame_info *frame, int regnum, int all)
2167 {
2168   /* Call default print_registers_info function.  */
2169   default_print_registers_info (gdbarch, file, frame, regnum, all);
2170
2171   /* For command: info register.  */
2172   if (regnum == -1 && all == 0)
2173     {
2174       default_print_registers_info (gdbarch, file, frame,
2175                                     CSKY_PC_REGNUM, 0);
2176       default_print_registers_info (gdbarch, file, frame,
2177                                     CSKY_EPC_REGNUM, 0);
2178       default_print_registers_info (gdbarch, file, frame,
2179                                     CSKY_CR0_REGNUM, 0);
2180       default_print_registers_info (gdbarch, file, frame,
2181                                     CSKY_EPSR_REGNUM, 0);
2182     }
2183   return;
2184 }
2185
2186 /* Initialize the current architecture based on INFO.  If possible,
2187    re-use an architecture from ARCHES, which is a list of
2188    architectures already created during this debugging session.
2189
2190    Called at program startup, when reading a core file, and when
2191    reading a binary file.  */
2192
2193 static struct gdbarch *
2194 csky_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2195 {
2196   struct gdbarch *gdbarch;
2197   struct gdbarch_tdep *tdep;
2198
2199   /* Find a candidate among the list of pre-declared architectures.  */
2200   arches = gdbarch_list_lookup_by_info (arches, &info);
2201   if (arches != NULL)
2202     return arches->gdbarch;
2203
2204   /* None found, create a new architecture from the information
2205      provided.  */
2206   tdep = XCNEW (struct gdbarch_tdep);
2207   gdbarch = gdbarch_alloc (&info, tdep);
2208
2209   /* Target data types.  */
2210   set_gdbarch_ptr_bit (gdbarch, 32);
2211   set_gdbarch_addr_bit (gdbarch, 32);
2212   set_gdbarch_short_bit (gdbarch, 16);
2213   set_gdbarch_int_bit (gdbarch, 32);
2214   set_gdbarch_long_bit (gdbarch, 32);
2215   set_gdbarch_long_long_bit (gdbarch, 64);
2216   set_gdbarch_float_bit (gdbarch, 32);
2217   set_gdbarch_double_bit (gdbarch, 64);
2218   set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
2219   set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
2220
2221   /* Information about the target architecture.  */
2222   set_gdbarch_return_value (gdbarch, csky_return_value);
2223   set_gdbarch_breakpoint_kind_from_pc (gdbarch, csky_breakpoint_kind_from_pc);
2224   set_gdbarch_sw_breakpoint_from_kind (gdbarch, csky_sw_breakpoint_from_kind);
2225
2226   /* Register architecture.  */
2227   set_gdbarch_num_regs (gdbarch, CSKY_NUM_REGS);
2228   set_gdbarch_pc_regnum (gdbarch, CSKY_PC_REGNUM);
2229   set_gdbarch_sp_regnum (gdbarch, CSKY_SP_REGNUM);
2230   set_gdbarch_register_name (gdbarch, csky_register_name);
2231   set_gdbarch_register_type (gdbarch, csky_register_type);
2232   set_gdbarch_read_pc (gdbarch, csky_read_pc);
2233   set_gdbarch_write_pc (gdbarch, csky_write_pc);
2234   set_gdbarch_print_registers_info (gdbarch, csky_print_registers_info);
2235   csky_add_reggroups (gdbarch);
2236   set_gdbarch_register_reggroup_p (gdbarch, csky_register_reggroup_p);
2237   set_gdbarch_stab_reg_to_regnum (gdbarch, csky_dwarf_reg_to_regnum);
2238   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, csky_dwarf_reg_to_regnum);
2239   dwarf2_frame_set_init_reg (gdbarch, csky_dwarf2_frame_init_reg);
2240
2241   /* Functions to analyze frames.  */
2242   frame_base_set_default (gdbarch, &csky_frame_base);
2243   set_gdbarch_skip_prologue (gdbarch, csky_skip_prologue);
2244   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2245   set_gdbarch_frame_align (gdbarch, csky_frame_align);
2246   set_gdbarch_stack_frame_destroyed_p (gdbarch, csky_stack_frame_destroyed_p);
2247
2248   /* Functions to access frame data.  */
2249   set_gdbarch_unwind_pc (gdbarch, csky_unwind_pc);
2250   set_gdbarch_unwind_sp (gdbarch, csky_unwind_sp);
2251
2252   /* Functions handling dummy frames.  */
2253   set_gdbarch_push_dummy_call (gdbarch, csky_push_dummy_call);
2254   set_gdbarch_dummy_id (gdbarch, csky_dummy_id);
2255
2256   /* Frame unwinders.  Use DWARF debug info if available,
2257      otherwise use our own unwinder.  */
2258   dwarf2_append_unwinders (gdbarch);
2259   frame_unwind_append_unwinder (gdbarch, &csky_stub_unwind);
2260   frame_unwind_append_unwinder (gdbarch, &csky_unwind_cache);
2261
2262   /* Breakpoints.  */
2263   set_gdbarch_memory_insert_breakpoint (gdbarch,
2264                                         csky_memory_insert_breakpoint);
2265   set_gdbarch_memory_remove_breakpoint (gdbarch,
2266                                         csky_memory_remove_breakpoint);
2267
2268   /* Hook in ABI-specific overrides, if they have been registered.  */
2269   gdbarch_init_osabi (info, gdbarch);
2270
2271   /* Support simple overlay manager.  */
2272   set_gdbarch_overlay_update (gdbarch, simple_overlay_update);
2273   set_gdbarch_char_signed (gdbarch, 0);
2274   return gdbarch;
2275 }
2276
2277 void
2278 _initialize_csky_tdep (void)
2279 {
2280
2281   register_gdbarch_init (bfd_arch_csky, csky_gdbarch_init);
2282
2283   csky_init_reggroup ();
2284
2285   /* Allow debugging this file's internals.  */
2286   add_setshow_boolean_cmd ("csky", class_maintenance, &csky_debug,
2287                            _("Set C-Sky debugging."),
2288                            _("Show C-Sky debugging."),
2289                            _("When on, C-Sky specific debugging is enabled."),
2290                            NULL,
2291                            NULL,
2292                            &setdebuglist, &showdebuglist);
2293 }