OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [sh64-tdep.c] - Blame information for rev 816

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Target-dependent code for Renesas Super-H, for GDB.
2
 
3
   Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
4
   2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
/*
22
   Contributed by Steve Chamberlain
23
   sac@cygnus.com
24
 */
25
 
26
#include "defs.h"
27
#include "frame.h"
28
#include "frame-base.h"
29
#include "frame-unwind.h"
30
#include "dwarf2-frame.h"
31
#include "symtab.h"
32
#include "gdbtypes.h"
33
#include "gdbcmd.h"
34
#include "gdbcore.h"
35
#include "value.h"
36
#include "dis-asm.h"
37
#include "inferior.h"
38
#include "gdb_string.h"
39
#include "gdb_assert.h"
40
#include "arch-utils.h"
41
#include "regcache.h"
42
#include "osabi.h"
43
#include "valprint.h"
44
 
45
#include "elf-bfd.h"
46
 
47
/* sh flags */
48
#include "elf/sh.h"
49
/* registers numbers shared with the simulator */
50
#include "gdb/sim-sh.h"
51
#include "language.h"
52
 
53
/* Information that is dependent on the processor variant.  */
54
enum sh_abi
55
  {
56
    SH_ABI_UNKNOWN,
57
    SH_ABI_32,
58
    SH_ABI_64
59
  };
60
 
61
struct gdbarch_tdep
62
  {
63
    enum sh_abi sh_abi;
64
  };
65
 
66
struct sh64_frame_cache
67
{
68
  /* Base address.  */
69
  CORE_ADDR base;
70
  LONGEST sp_offset;
71
  CORE_ADDR pc;
72
 
73
  /* Flag showing that a frame has been created in the prologue code. */
74
  int uses_fp;
75
 
76
  int media_mode;
77
 
78
  /* Saved registers.  */
79
  CORE_ADDR saved_regs[SIM_SH64_NR_REGS];
80
  CORE_ADDR saved_sp;
81
};
82
 
83
/* Registers of SH5 */
84
enum
85
  {
86
    R0_REGNUM = 0,
87
    DEFAULT_RETURN_REGNUM = 2,
88
    STRUCT_RETURN_REGNUM = 2,
89
    ARG0_REGNUM = 2,
90
    ARGLAST_REGNUM = 9,
91
    FLOAT_ARGLAST_REGNUM = 11,
92
    MEDIA_FP_REGNUM = 14,
93
    PR_REGNUM = 18,
94
    SR_REGNUM = 65,
95
    DR0_REGNUM = 141,
96
    DR_LAST_REGNUM = 172,
97
    /* FPP stands for Floating Point Pair, to avoid confusion with
98
       GDB's gdbarch_fp0_regnum, which is the number of the first Floating
99
       point register. Unfortunately on the sh5, the floating point
100
       registers are called FR, and the floating point pairs are called FP.  */
101
    FPP0_REGNUM = 173,
102
    FPP_LAST_REGNUM = 204,
103
    FV0_REGNUM = 205,
104
    FV_LAST_REGNUM = 220,
105
    R0_C_REGNUM = 221,
106
    R_LAST_C_REGNUM = 236,
107
    PC_C_REGNUM = 237,
108
    GBR_C_REGNUM = 238,
109
    MACH_C_REGNUM = 239,
110
    MACL_C_REGNUM = 240,
111
    PR_C_REGNUM = 241,
112
    T_C_REGNUM = 242,
113
    FPSCR_C_REGNUM = 243,
114
    FPUL_C_REGNUM = 244,
115
    FP0_C_REGNUM = 245,
116
    FP_LAST_C_REGNUM = 260,
117
    DR0_C_REGNUM = 261,
118
    DR_LAST_C_REGNUM = 268,
119
    FV0_C_REGNUM = 269,
120
    FV_LAST_C_REGNUM = 272,
121
    FPSCR_REGNUM = SIM_SH64_FPCSR_REGNUM,
122
    SSR_REGNUM = SIM_SH64_SSR_REGNUM,
123
    SPC_REGNUM = SIM_SH64_SPC_REGNUM,
124
    TR7_REGNUM = SIM_SH64_TR0_REGNUM + 7,
125
    FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1
126
  };
127
 
128
static const char *
129
sh64_register_name (struct gdbarch *gdbarch, int reg_nr)
130
{
131
  static char *register_names[] =
132
  {
133
    /* SH MEDIA MODE (ISA 32) */
134
    /* general registers (64-bit) 0-63 */
135
    "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
136
    "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
137
    "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
138
    "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
139
    "r32",  "r33",  "r34",  "r35",  "r36",  "r37",  "r38",  "r39",
140
    "r40",  "r41",  "r42",  "r43",  "r44",  "r45",  "r46",  "r47",
141
    "r48",  "r49",  "r50",  "r51",  "r52",  "r53",  "r54",  "r55",
142
    "r56",  "r57",  "r58",  "r59",  "r60",  "r61",  "r62",  "r63",
143
 
144
    /* pc (64-bit) 64 */
145
    "pc",
146
 
147
    /* status reg., saved status reg., saved pc reg. (64-bit) 65-67 */
148
    "sr",  "ssr",  "spc",
149
 
150
    /* target registers (64-bit) 68-75*/
151
    "tr0",  "tr1",  "tr2",  "tr3",  "tr4",  "tr5",  "tr6",  "tr7",
152
 
153
    /* floating point state control register (32-bit) 76 */
154
    "fpscr",
155
 
156
    /* single precision floating point registers (32-bit) 77-140*/
157
    "fr0",  "fr1",  "fr2",  "fr3",  "fr4",  "fr5",  "fr6",  "fr7",
158
    "fr8",  "fr9",  "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
159
    "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
160
    "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",
161
    "fr32", "fr33", "fr34", "fr35", "fr36", "fr37", "fr38", "fr39",
162
    "fr40", "fr41", "fr42", "fr43", "fr44", "fr45", "fr46", "fr47",
163
    "fr48", "fr49", "fr50", "fr51", "fr52", "fr53", "fr54", "fr55",
164
    "fr56", "fr57", "fr58", "fr59", "fr60", "fr61", "fr62", "fr63",
165
 
166
    /* double precision registers (pseudo) 141-172 */
167
    "dr0",  "dr2",  "dr4",  "dr6",  "dr8",  "dr10", "dr12", "dr14",
168
    "dr16", "dr18", "dr20", "dr22", "dr24", "dr26", "dr28", "dr30",
169
    "dr32", "dr34", "dr36", "dr38", "dr40", "dr42", "dr44", "dr46",
170
    "dr48", "dr50", "dr52", "dr54", "dr56", "dr58", "dr60", "dr62",
171
 
172
    /* floating point pairs (pseudo) 173-204*/
173
    "fp0",  "fp2",  "fp4",  "fp6",  "fp8",  "fp10", "fp12", "fp14",
174
    "fp16", "fp18", "fp20", "fp22", "fp24", "fp26", "fp28", "fp30",
175
    "fp32", "fp34", "fp36", "fp38", "fp40", "fp42", "fp44", "fp46",
176
    "fp48", "fp50", "fp52", "fp54", "fp56", "fp58", "fp60", "fp62",
177
 
178
    /* floating point vectors (4 floating point regs) (pseudo) 205-220*/
179
    "fv0",  "fv4",  "fv8",  "fv12", "fv16", "fv20", "fv24", "fv28",
180
    "fv32", "fv36", "fv40", "fv44", "fv48", "fv52", "fv56", "fv60",
181
 
182
    /* SH COMPACT MODE (ISA 16) (all pseudo) 221-272*/
183
    "r0_c", "r1_c", "r2_c",  "r3_c",  "r4_c",  "r5_c",  "r6_c",  "r7_c",
184
    "r8_c", "r9_c", "r10_c", "r11_c", "r12_c", "r13_c", "r14_c", "r15_c",
185
    "pc_c",
186
    "gbr_c", "mach_c", "macl_c", "pr_c", "t_c",
187
    "fpscr_c", "fpul_c",
188
    "fr0_c", "fr1_c", "fr2_c",  "fr3_c",  "fr4_c",  "fr5_c",  "fr6_c",  "fr7_c",
189
    "fr8_c", "fr9_c", "fr10_c", "fr11_c", "fr12_c", "fr13_c", "fr14_c", "fr15_c",
190
    "dr0_c", "dr2_c", "dr4_c",  "dr6_c",  "dr8_c",  "dr10_c", "dr12_c", "dr14_c",
191
    "fv0_c", "fv4_c", "fv8_c",  "fv12_c",
192
    /* FIXME!!!! XF0 XF15, XD0 XD14 ?????*/
193
  };
194
 
195
  if (reg_nr < 0)
196
    return NULL;
197
  if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
198
    return NULL;
199
  return register_names[reg_nr];
200
}
201
 
202
#define NUM_PSEUDO_REGS_SH_MEDIA 80
203
#define NUM_PSEUDO_REGS_SH_COMPACT 51
204
 
205
/* Macros and functions for setting and testing a bit in a minimal
206
   symbol that marks it as 32-bit function.  The MSB of the minimal
207
   symbol's "info" field is used for this purpose.
208
 
209
   gdbarch_elf_make_msymbol_special tests whether an ELF symbol is "special",
210
   i.e. refers to a 32-bit function, and sets a "special" bit in a
211
   minimal symbol to mark it as a 32-bit function
212
   MSYMBOL_IS_SPECIAL   tests the "special" bit in a minimal symbol  */
213
 
214
#define MSYMBOL_IS_SPECIAL(msym) \
215
  MSYMBOL_TARGET_FLAG_1 (msym)
216
 
217
static void
218
sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
219
{
220
  if (msym == NULL)
221
    return;
222
 
223
  if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
224
    {
225
      MSYMBOL_TARGET_FLAG_1 (msym) = 1;
226
      SYMBOL_VALUE_ADDRESS (msym) |= 1;
227
    }
228
}
229
 
230
/* ISA32 (shmedia) function addresses are odd (bit 0 is set).  Here
231
   are some macros to test, set, or clear bit 0 of addresses.  */
232
#define IS_ISA32_ADDR(addr)      ((addr) & 1)
233
#define MAKE_ISA32_ADDR(addr)    ((addr) | 1)
234
#define UNMAKE_ISA32_ADDR(addr)  ((addr) & ~1)
235
 
236
static int
237
pc_is_isa32 (bfd_vma memaddr)
238
{
239
  struct minimal_symbol *sym;
240
 
241
  /* If bit 0 of the address is set, assume this is a
242
     ISA32 (shmedia) address.  */
243
  if (IS_ISA32_ADDR (memaddr))
244
    return 1;
245
 
246
  /* A flag indicating that this is a ISA32 function is stored by elfread.c in
247
     the high bit of the info field.  Use this to decide if the function is
248
     ISA16 or ISA32.  */
249
  sym = lookup_minimal_symbol_by_pc (memaddr);
250
  if (sym)
251
    return MSYMBOL_IS_SPECIAL (sym);
252
  else
253
    return 0;
254
}
255
 
256
static const unsigned char *
257
sh64_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
258
{
259
  /* The BRK instruction for shmedia is
260
     01101111 11110101 11111111 11110000
261
     which translates in big endian mode to 0x6f, 0xf5, 0xff, 0xf0
262
     and in little endian mode to 0xf0, 0xff, 0xf5, 0x6f */
263
 
264
  /* The BRK instruction for shcompact is
265
     00000000 00111011
266
     which translates in big endian mode to 0x0, 0x3b
267
     and in little endian mode to 0x3b, 0x0*/
268
 
269
  if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
270
    {
271
      if (pc_is_isa32 (*pcptr))
272
        {
273
          static unsigned char big_breakpoint_media[] = {0x6f, 0xf5, 0xff, 0xf0};
274
          *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
275
          *lenptr = sizeof (big_breakpoint_media);
276
          return big_breakpoint_media;
277
        }
278
      else
279
        {
280
          static unsigned char big_breakpoint_compact[] = {0x0, 0x3b};
281
          *lenptr = sizeof (big_breakpoint_compact);
282
          return big_breakpoint_compact;
283
        }
284
    }
285
  else
286
    {
287
      if (pc_is_isa32 (*pcptr))
288
        {
289
          static unsigned char little_breakpoint_media[] = {0xf0, 0xff, 0xf5, 0x6f};
290
          *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
291
          *lenptr = sizeof (little_breakpoint_media);
292
          return little_breakpoint_media;
293
        }
294
      else
295
        {
296
          static unsigned char little_breakpoint_compact[] = {0x3b, 0x0};
297
          *lenptr = sizeof (little_breakpoint_compact);
298
          return little_breakpoint_compact;
299
        }
300
    }
301
}
302
 
303
/* Prologue looks like
304
   [mov.l       <regs>,@-r15]...
305
   [sts.l       pr,@-r15]
306
   [mov.l       r14,@-r15]
307
   [mov         r15,r14]
308
 
309
   Actually it can be more complicated than this.  For instance, with
310
   newer gcc's:
311
 
312
   mov.l   r14,@-r15
313
   add     #-12,r15
314
   mov     r15,r14
315
   mov     r4,r1
316
   mov     r5,r2
317
   mov.l   r6,@(4,r14)
318
   mov.l   r7,@(8,r14)
319
   mov.b   r1,@r14
320
   mov     r14,r1
321
   mov     r14,r1
322
   add     #2,r1
323
   mov.w   r2,@r1
324
 
325
 */
326
 
327
/* PTABS/L Rn, TRa       0110101111110001nnnnnnl00aaa0000
328
   with l=1 and n = 18   0110101111110001010010100aaa0000 */
329
#define IS_PTABSL_R18(x)  (((x) & 0xffffff8f) == 0x6bf14a00)
330
 
331
/* STS.L PR,@-r0   0100000000100010
332
   r0-4-->r0, PR-->(r0) */
333
#define IS_STS_R0(x)            ((x) == 0x4022)
334
 
335
/* STS PR, Rm      0000mmmm00101010
336
   PR-->Rm */
337
#define IS_STS_PR(x)            (((x) & 0xf0ff) == 0x2a)
338
 
339
/* MOV.L Rm,@(disp,r15)  00011111mmmmdddd
340
   Rm-->(dispx4+r15) */
341
#define IS_MOV_TO_R15(x)              (((x) & 0xff00) == 0x1f00)
342
 
343
/* MOV.L R14,@(disp,r15)  000111111110dddd
344
   R14-->(dispx4+r15) */
345
#define IS_MOV_R14(x)              (((x) & 0xfff0) == 0x1fe0)
346
 
347
/* ST.Q R14, disp, R18    101011001110dddddddddd0100100000
348
   R18-->(dispx8+R14) */
349
#define IS_STQ_R18_R14(x)          (((x) & 0xfff003ff) == 0xace00120)
350
 
351
/* ST.Q R15, disp, R18    101011001111dddddddddd0100100000
352
   R18-->(dispx8+R15) */
353
#define IS_STQ_R18_R15(x)          (((x) & 0xfff003ff) == 0xacf00120)
354
 
355
/* ST.L R15, disp, R18    101010001111dddddddddd0100100000
356
   R18-->(dispx4+R15) */
357
#define IS_STL_R18_R15(x)          (((x) & 0xfff003ff) == 0xa8f00120)
358
 
359
/* ST.Q R15, disp, R14    1010 1100 1111 dddd dddd dd00 1110 0000
360
   R14-->(dispx8+R15) */
361
#define IS_STQ_R14_R15(x)          (((x) & 0xfff003ff) == 0xacf000e0)
362
 
363
/* ST.L R15, disp, R14    1010 1000 1111 dddd dddd dd00 1110 0000
364
   R14-->(dispx4+R15) */
365
#define IS_STL_R14_R15(x)          (((x) & 0xfff003ff) == 0xa8f000e0)
366
 
367
/* ADDI.L R15,imm,R15     1101 0100 1111 ssss ssss ss00 1111 0000
368
   R15 + imm --> R15 */
369
#define IS_ADDIL_SP_MEDIA(x)         (((x) & 0xfff003ff) == 0xd4f000f0)
370
 
371
/* ADDI R15,imm,R15     1101 0000 1111 ssss ssss ss00 1111 0000
372
   R15 + imm --> R15 */
373
#define IS_ADDI_SP_MEDIA(x)         (((x) & 0xfff003ff) == 0xd0f000f0)
374
 
375
/* ADD.L R15,R63,R14    0000 0000 1111 1000 1111 1100 1110 0000
376
   R15 + R63 --> R14 */
377
#define IS_ADDL_SP_FP_MEDIA(x)          ((x) == 0x00f8fce0)
378
 
379
/* ADD R15,R63,R14    0000 0000 1111 1001 1111 1100 1110 0000
380
   R15 + R63 --> R14 */
381
#define IS_ADD_SP_FP_MEDIA(x)   ((x) == 0x00f9fce0)
382
 
383
#define IS_MOV_SP_FP_MEDIA(x)   (IS_ADDL_SP_FP_MEDIA(x) || IS_ADD_SP_FP_MEDIA(x))
384
 
385
/* MOV #imm, R0    1110 0000 ssss ssss
386
   #imm-->R0 */
387
#define IS_MOV_R0(x)            (((x) & 0xff00) == 0xe000)
388
 
389
/* MOV.L @(disp,PC), R0    1101 0000 iiii iiii  */
390
#define IS_MOVL_R0(x)           (((x) & 0xff00) == 0xd000)
391
 
392
/* ADD r15,r0      0011 0000 1111 1100
393
   r15+r0-->r0 */
394
#define IS_ADD_SP_R0(x)         ((x) == 0x30fc)
395
 
396
/* MOV.L R14 @-R0  0010 0000 1110 0110
397
   R14-->(R0-4), R0-4-->R0 */
398
#define IS_MOV_R14_R0(x)        ((x) == 0x20e6)
399
 
400
/* ADD Rm,R63,Rn  Rm+R63-->Rn  0000 00mm mmmm 1001 1111 11nn nnnn 0000
401
   where Rm is one of r2-r9 which are the argument registers.  */
402
/* FIXME: Recognize the float and double register moves too! */
403
#define IS_MEDIA_IND_ARG_MOV(x) \
404
((((x) & 0xfc0ffc0f) == 0x0009fc00) && (((x) & 0x03f00000) >= 0x00200000 && ((x) & 0x03f00000) <= 0x00900000))
405
 
406
/* ST.Q Rn,0,Rm  Rm-->Rn+0  1010 11nn nnnn 0000 0000 00mm mmmm 0000
407
   or ST.L Rn,0,Rm  Rm-->Rn+0  1010 10nn nnnn 0000 0000 00mm mmmm 0000
408
   where Rm is one of r2-r9 which are the argument registers.  */
409
#define IS_MEDIA_ARG_MOV(x) \
410
(((((x) & 0xfc0ffc0f) == 0xac000000) || (((x) & 0xfc0ffc0f) == 0xa8000000)) \
411
   && (((x) & 0x000003f0) >= 0x00000020 && ((x) & 0x000003f0) <= 0x00000090))
412
 
413
/* ST.B R14,0,Rn     Rn-->(R14+0) 1010 0000 1110 0000 0000 00nn nnnn 0000*/
414
/* ST.W R14,0,Rn     Rn-->(R14+0) 1010 0100 1110 0000 0000 00nn nnnn 0000*/
415
/* ST.L R14,0,Rn     Rn-->(R14+0) 1010 1000 1110 0000 0000 00nn nnnn 0000*/
416
/* FST.S R14,0,FRn   Rn-->(R14+0) 1011 0100 1110 0000 0000 00nn nnnn 0000*/
417
/* FST.D R14,0,DRn   Rn-->(R14+0) 1011 1100 1110 0000 0000 00nn nnnn 0000*/
418
#define IS_MEDIA_MOV_TO_R14(x)  \
419
((((x) & 0xfffffc0f) == 0xa0e00000) \
420
|| (((x) & 0xfffffc0f) == 0xa4e00000) \
421
|| (((x) & 0xfffffc0f) == 0xa8e00000) \
422
|| (((x) & 0xfffffc0f) == 0xb4e00000) \
423
|| (((x) & 0xfffffc0f) == 0xbce00000))
424
 
425
/* MOV Rm, Rn  Rm-->Rn 0110 nnnn mmmm 0011
426
   where Rm is r2-r9 */
427
#define IS_COMPACT_IND_ARG_MOV(x) \
428
((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0020) && (((x) & 0x00f0) <= 0x0090))
429
 
430
/* compact direct arg move!
431
   MOV.L Rn, @r14     0010 1110 mmmm 0010 */
432
#define IS_COMPACT_ARG_MOV(x) \
433
(((((x) & 0xff0f) == 0x2e02) && (((x) & 0x00f0) >= 0x0020) && ((x) & 0x00f0) <= 0x0090))
434
 
435
/* MOV.B Rm, @R14     0010 1110 mmmm 0000
436
   MOV.W Rm, @R14     0010 1110 mmmm 0001 */
437
#define IS_COMPACT_MOV_TO_R14(x) \
438
((((x) & 0xff0f) == 0x2e00) || (((x) & 0xff0f) == 0x2e01))
439
 
440
#define IS_JSR_R0(x)           ((x) == 0x400b)
441
#define IS_NOP(x)              ((x) == 0x0009)
442
 
443
 
444
/* MOV r15,r14     0110111011110011
445
   r15-->r14  */
446
#define IS_MOV_SP_FP(x)         ((x) == 0x6ef3)
447
 
448
/* ADD #imm,r15    01111111iiiiiiii
449
   r15+imm-->r15 */
450
#define IS_ADD_SP(x)            (((x) & 0xff00) == 0x7f00)
451
 
452
/* Skip any prologue before the guts of a function */
453
 
454
/* Skip the prologue using the debug information.  If this fails we'll
455
   fall back on the 'guess' method below.  */
456
static CORE_ADDR
457
after_prologue (CORE_ADDR pc)
458
{
459
  struct symtab_and_line sal;
460
  CORE_ADDR func_addr, func_end;
461
 
462
  /* If we can not find the symbol in the partial symbol table, then
463
     there is no hope we can determine the function's start address
464
     with this code.  */
465
  if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
466
    return 0;
467
 
468
 
469
  /* Get the line associated with FUNC_ADDR.  */
470
  sal = find_pc_line (func_addr, 0);
471
 
472
  /* There are only two cases to consider.  First, the end of the source line
473
     is within the function bounds.  In that case we return the end of the
474
     source line.  Second is the end of the source line extends beyond the
475
     bounds of the current function.  We need to use the slow code to
476
     examine instructions in that case.  */
477
  if (sal.end < func_end)
478
    return sal.end;
479
  else
480
    return 0;
481
}
482
 
483
static CORE_ADDR
484
look_for_args_moves (struct gdbarch *gdbarch,
485
                     CORE_ADDR start_pc, int media_mode)
486
{
487
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
488
  CORE_ADDR here, end;
489
  int w;
490
  int insn_size = (media_mode ? 4 : 2);
491
 
492
  for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
493
    {
494
      if (media_mode)
495
        {
496
          w = read_memory_integer (UNMAKE_ISA32_ADDR (here),
497
                                   insn_size, byte_order);
498
          here += insn_size;
499
          if (IS_MEDIA_IND_ARG_MOV (w))
500
            {
501
              /* This must be followed by a store to r14, so the argument
502
                 is where the debug info says it is. This can happen after
503
                 the SP has been saved, unfortunately.  */
504
 
505
              int next_insn = read_memory_integer (UNMAKE_ISA32_ADDR (here),
506
                                                   insn_size, byte_order);
507
              here += insn_size;
508
              if (IS_MEDIA_MOV_TO_R14 (next_insn))
509
                start_pc = here;
510
            }
511
          else if (IS_MEDIA_ARG_MOV (w))
512
            {
513
              /* These instructions store directly the argument in r14.  */
514
              start_pc = here;
515
            }
516
          else
517
            break;
518
        }
519
      else
520
        {
521
          w = read_memory_integer (here, insn_size, byte_order);
522
          w = w & 0xffff;
523
          here += insn_size;
524
          if (IS_COMPACT_IND_ARG_MOV (w))
525
            {
526
              /* This must be followed by a store to r14, so the argument
527
                 is where the debug info says it is. This can happen after
528
                 the SP has been saved, unfortunately.  */
529
 
530
              int next_insn = 0xffff & read_memory_integer (here, insn_size,
531
                                                            byte_order);
532
              here += insn_size;
533
              if (IS_COMPACT_MOV_TO_R14 (next_insn))
534
                start_pc = here;
535
            }
536
          else if (IS_COMPACT_ARG_MOV (w))
537
            {
538
              /* These instructions store directly the argument in r14.  */
539
              start_pc = here;
540
            }
541
          else if (IS_MOVL_R0 (w))
542
            {
543
              /* There is a function that gcc calls to get the arguments
544
                 passed correctly to the function. Only after this
545
                 function call the arguments will be found at the place
546
                 where they are supposed to be. This happens in case the
547
                 argument has to be stored into a 64-bit register (for
548
                 instance doubles, long longs).  SHcompact doesn't have
549
                 access to the full 64-bits, so we store the register in
550
                 stack slot and store the address of the stack slot in
551
                 the register, then do a call through a wrapper that
552
                 loads the memory value into the register.  A SHcompact
553
                 callee calls an argument decoder
554
                 (GCC_shcompact_incoming_args) that stores the 64-bit
555
                 value in a stack slot and stores the address of the
556
                 stack slot in the register.  GCC thinks the argument is
557
                 just passed by transparent reference, but this is only
558
                 true after the argument decoder is called. Such a call
559
                 needs to be considered part of the prologue.  */
560
 
561
              /* This must be followed by a JSR @r0 instruction and by
562
                 a NOP instruction. After these, the prologue is over!  */
563
 
564
              int next_insn = 0xffff & read_memory_integer (here, insn_size,
565
                                                            byte_order);
566
              here += insn_size;
567
              if (IS_JSR_R0 (next_insn))
568
                {
569
                  next_insn = 0xffff & read_memory_integer (here, insn_size,
570
                                                            byte_order);
571
                  here += insn_size;
572
 
573
                  if (IS_NOP (next_insn))
574
                    start_pc = here;
575
                }
576
            }
577
          else
578
            break;
579
        }
580
    }
581
 
582
  return start_pc;
583
}
584
 
585
static CORE_ADDR
586
sh64_skip_prologue_hard_way (struct gdbarch *gdbarch, CORE_ADDR start_pc)
587
{
588
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
589
  CORE_ADDR here, end;
590
  int updated_fp = 0;
591
  int insn_size = 4;
592
  int media_mode = 1;
593
 
594
  if (!start_pc)
595
    return 0;
596
 
597
  if (pc_is_isa32 (start_pc) == 0)
598
    {
599
      insn_size = 2;
600
      media_mode = 0;
601
    }
602
 
603
  for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
604
    {
605
 
606
      if (media_mode)
607
        {
608
          int w = read_memory_integer (UNMAKE_ISA32_ADDR (here),
609
                                       insn_size, byte_order);
610
          here += insn_size;
611
          if (IS_STQ_R18_R14 (w) || IS_STQ_R18_R15 (w) || IS_STQ_R14_R15 (w)
612
              || IS_STL_R14_R15 (w) || IS_STL_R18_R15 (w)
613
              || IS_ADDIL_SP_MEDIA (w) || IS_ADDI_SP_MEDIA (w) || IS_PTABSL_R18 (w))
614
            {
615
              start_pc = here;
616
            }
617
          else if (IS_MOV_SP_FP (w) || IS_MOV_SP_FP_MEDIA(w))
618
            {
619
              start_pc = here;
620
              updated_fp = 1;
621
            }
622
          else
623
            if (updated_fp)
624
              {
625
                /* Don't bail out yet, we may have arguments stored in
626
                   registers here, according to the debug info, so that
627
                   gdb can print the frames correctly.  */
628
                start_pc = look_for_args_moves (gdbarch,
629
                                                here - insn_size, media_mode);
630
                break;
631
              }
632
        }
633
      else
634
        {
635
          int w = 0xffff & read_memory_integer (here, insn_size, byte_order);
636
          here += insn_size;
637
 
638
          if (IS_STS_R0 (w) || IS_STS_PR (w)
639
              || IS_MOV_TO_R15 (w) || IS_MOV_R14 (w)
640
              || IS_MOV_R0 (w) || IS_ADD_SP_R0 (w) || IS_MOV_R14_R0 (w))
641
            {
642
              start_pc = here;
643
            }
644
          else if (IS_MOV_SP_FP (w))
645
            {
646
              start_pc = here;
647
              updated_fp = 1;
648
            }
649
          else
650
            if (updated_fp)
651
              {
652
                /* Don't bail out yet, we may have arguments stored in
653
                   registers here, according to the debug info, so that
654
                   gdb can print the frames correctly.  */
655
                start_pc = look_for_args_moves (gdbarch,
656
                                                here - insn_size, media_mode);
657
                break;
658
              }
659
        }
660
    }
661
 
662
  return start_pc;
663
}
664
 
665
static CORE_ADDR
666
sh64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
667
{
668
  CORE_ADDR post_prologue_pc;
669
 
670
  /* See if we can determine the end of the prologue via the symbol table.
671
     If so, then return either PC, or the PC after the prologue, whichever
672
     is greater.  */
673
  post_prologue_pc = after_prologue (pc);
674
 
675
  /* If after_prologue returned a useful address, then use it.  Else
676
     fall back on the instruction skipping code.  */
677
  if (post_prologue_pc != 0)
678
    return max (pc, post_prologue_pc);
679
  else
680
    return sh64_skip_prologue_hard_way (gdbarch, pc);
681
}
682
 
683
/* Should call_function allocate stack space for a struct return?  */
684
static int
685
sh64_use_struct_convention (struct type *type)
686
{
687
  return (TYPE_LENGTH (type) > 8);
688
}
689
 
690
/* For vectors of 4 floating point registers.  */
691
static int
692
sh64_fv_reg_base_num (struct gdbarch *gdbarch, int fv_regnum)
693
{
694
  int fp_regnum;
695
 
696
  fp_regnum = gdbarch_fp0_regnum (gdbarch) + (fv_regnum - FV0_REGNUM) * 4;
697
  return fp_regnum;
698
}
699
 
700
/* For double precision floating point registers, i.e 2 fp regs.*/
701
static int
702
sh64_dr_reg_base_num (struct gdbarch *gdbarch, int dr_regnum)
703
{
704
  int fp_regnum;
705
 
706
  fp_regnum = gdbarch_fp0_regnum (gdbarch) + (dr_regnum - DR0_REGNUM) * 2;
707
  return fp_regnum;
708
}
709
 
710
/* For pairs of floating point registers */
711
static int
712
sh64_fpp_reg_base_num (struct gdbarch *gdbarch, int fpp_regnum)
713
{
714
  int fp_regnum;
715
 
716
  fp_regnum = gdbarch_fp0_regnum (gdbarch) + (fpp_regnum - FPP0_REGNUM) * 2;
717
  return fp_regnum;
718
}
719
 
720
/* *INDENT-OFF* */
721
/*
722
    SH COMPACT MODE (ISA 16) (all pseudo) 221-272
723
       GDB_REGNUM  BASE_REGNUM
724
 r0_c       221      0
725
 r1_c       222      1
726
 r2_c       223      2
727
 r3_c       224      3
728
 r4_c       225      4
729
 r5_c       226      5
730
 r6_c       227      6
731
 r7_c       228      7
732
 r8_c       229      8
733
 r9_c       230      9
734
 r10_c      231      10
735
 r11_c      232      11
736
 r12_c      233      12
737
 r13_c      234      13
738
 r14_c      235      14
739
 r15_c      236      15
740
 
741
 pc_c       237      64
742
 gbr_c      238      16
743
 mach_c     239      17
744
 macl_c     240      17
745
 pr_c       241      18
746
 t_c        242      19
747
 fpscr_c    243      76
748
 fpul_c     244      109
749
 
750
 fr0_c      245      77
751
 fr1_c      246      78
752
 fr2_c      247      79
753
 fr3_c      248      80
754
 fr4_c      249      81
755
 fr5_c      250      82
756
 fr6_c      251      83
757
 fr7_c      252      84
758
 fr8_c      253      85
759
 fr9_c      254      86
760
 fr10_c     255      87
761
 fr11_c     256      88
762
 fr12_c     257      89
763
 fr13_c     258      90
764
 fr14_c     259      91
765
 fr15_c     260      92
766
 
767
 dr0_c      261      77
768
 dr2_c      262      79
769
 dr4_c      263      81
770
 dr6_c      264      83
771
 dr8_c      265      85
772
 dr10_c     266      87
773
 dr12_c     267      89
774
 dr14_c     268      91
775
 
776
 fv0_c      269      77
777
 fv4_c      270      81
778
 fv8_c      271      85
779
 fv12_c     272      91
780
*/
781
/* *INDENT-ON* */
782
static int
783
sh64_compact_reg_base_num (struct gdbarch *gdbarch, int reg_nr)
784
{
785
  int base_regnum = reg_nr;
786
 
787
  /* general register N maps to general register N */
788
  if (reg_nr >= R0_C_REGNUM
789
      && reg_nr <= R_LAST_C_REGNUM)
790
    base_regnum = reg_nr - R0_C_REGNUM;
791
 
792
  /* floating point register N maps to floating point register N */
793
  else if (reg_nr >= FP0_C_REGNUM
794
            && reg_nr <= FP_LAST_C_REGNUM)
795
    base_regnum = reg_nr - FP0_C_REGNUM + gdbarch_fp0_regnum (gdbarch);
796
 
797
  /* double prec register N maps to base regnum for double prec register N */
798
  else if (reg_nr >= DR0_C_REGNUM
799
            && reg_nr <= DR_LAST_C_REGNUM)
800
    base_regnum = sh64_dr_reg_base_num (gdbarch,
801
                                        DR0_REGNUM + reg_nr - DR0_C_REGNUM);
802
 
803
  /* vector N maps to base regnum for vector register N */
804
  else if (reg_nr >= FV0_C_REGNUM
805
            && reg_nr <= FV_LAST_C_REGNUM)
806
    base_regnum = sh64_fv_reg_base_num (gdbarch,
807
                                        FV0_REGNUM + reg_nr - FV0_C_REGNUM);
808
 
809
  else if (reg_nr == PC_C_REGNUM)
810
    base_regnum = gdbarch_pc_regnum (gdbarch);
811
 
812
  else if (reg_nr == GBR_C_REGNUM)
813
    base_regnum = 16;
814
 
815
  else if (reg_nr == MACH_C_REGNUM
816
           || reg_nr == MACL_C_REGNUM)
817
    base_regnum = 17;
818
 
819
  else if (reg_nr == PR_C_REGNUM)
820
    base_regnum = PR_REGNUM;
821
 
822
  else if (reg_nr == T_C_REGNUM)
823
    base_regnum = 19;
824
 
825
  else if (reg_nr == FPSCR_C_REGNUM)
826
    base_regnum = FPSCR_REGNUM; /*???? this register is a mess.  */
827
 
828
  else if (reg_nr == FPUL_C_REGNUM)
829
    base_regnum = gdbarch_fp0_regnum (gdbarch) + 32;
830
 
831
  return base_regnum;
832
}
833
 
834
static int
835
sign_extend (int value, int bits)
836
{
837
  value = value & ((1 << bits) - 1);
838
  return (value & (1 << (bits - 1))
839
          ? value | (~((1 << bits) - 1))
840
          : value);
841
}
842
 
843
static void
844
sh64_analyze_prologue (struct gdbarch *gdbarch,
845
                       struct sh64_frame_cache *cache,
846
                       CORE_ADDR func_pc,
847
                       CORE_ADDR current_pc)
848
{
849
  int reg_nr;
850
  int pc;
851
  int opc;
852
  int insn;
853
  int r0_val = 0;
854
  int insn_size;
855
  int gdb_register_number;
856
  int register_number;
857
  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
858
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
859
 
860
  cache->sp_offset = 0;
861
 
862
  /* Loop around examining the prologue insns until we find something
863
     that does not appear to be part of the prologue.  But give up
864
     after 20 of them, since we're getting silly then.  */
865
 
866
  pc = func_pc;
867
 
868
  if (cache->media_mode)
869
    insn_size = 4;
870
  else
871
    insn_size = 2;
872
 
873
  opc = pc + (insn_size * 28);
874
  if (opc > current_pc)
875
    opc = current_pc;
876
  for ( ; pc <= opc; pc += insn_size)
877
    {
878
      insn = read_memory_integer (cache->media_mode ? UNMAKE_ISA32_ADDR (pc)
879
                                                    : pc,
880
                                  insn_size, byte_order);
881
 
882
      if (!cache->media_mode)
883
        {
884
          if (IS_STS_PR (insn))
885
            {
886
              int next_insn = read_memory_integer (pc + insn_size,
887
                                                   insn_size, byte_order);
888
              if (IS_MOV_TO_R15 (next_insn))
889
                {
890
                  cache->saved_regs[PR_REGNUM] =
891
                    cache->sp_offset - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2);
892
                  pc += insn_size;
893
                }
894
            }
895
 
896
          else if (IS_MOV_R14 (insn))
897
            cache->saved_regs[MEDIA_FP_REGNUM] =
898
              cache->sp_offset - ((((insn & 0xf) ^ 0x8) - 0x8) << 2);
899
 
900
          else if (IS_MOV_R0 (insn))
901
            {
902
              /* Put in R0 the offset from SP at which to store some
903
                 registers. We are interested in this value, because it
904
                 will tell us where the given registers are stored within
905
                 the frame.  */
906
              r0_val = ((insn & 0xff) ^ 0x80) - 0x80;
907
            }
908
 
909
          else if (IS_ADD_SP_R0 (insn))
910
            {
911
              /* This instruction still prepares r0, but we don't care.
912
                 We already have the offset in r0_val.  */
913
            }
914
 
915
          else if (IS_STS_R0 (insn))
916
            {
917
              /* Store PR at r0_val-4 from SP. Decrement r0 by 4*/
918
              cache->saved_regs[PR_REGNUM] = cache->sp_offset - (r0_val - 4);
919
              r0_val -= 4;
920
            }
921
 
922
          else if (IS_MOV_R14_R0 (insn))
923
            {
924
              /* Store R14 at r0_val-4 from SP. Decrement r0 by 4 */
925
              cache->saved_regs[MEDIA_FP_REGNUM] = cache->sp_offset
926
                                                   - (r0_val - 4);
927
              r0_val -= 4;
928
            }
929
 
930
          else if (IS_ADD_SP (insn))
931
            cache->sp_offset -= ((insn & 0xff) ^ 0x80) - 0x80;
932
 
933
          else if (IS_MOV_SP_FP (insn))
934
            break;
935
        }
936
      else
937
        {
938
          if (IS_ADDIL_SP_MEDIA (insn) || IS_ADDI_SP_MEDIA (insn))
939
            cache->sp_offset -=
940
              sign_extend ((((insn & 0xffc00) ^ 0x80000) - 0x80000) >> 10, 9);
941
 
942
          else if (IS_STQ_R18_R15 (insn))
943
            cache->saved_regs[PR_REGNUM] =
944
              cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
945
 
946
          else if (IS_STL_R18_R15 (insn))
947
            cache->saved_regs[PR_REGNUM] =
948
              cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
949
 
950
          else if (IS_STQ_R14_R15 (insn))
951
            cache->saved_regs[MEDIA_FP_REGNUM] =
952
              cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
953
 
954
          else if (IS_STL_R14_R15 (insn))
955
            cache->saved_regs[MEDIA_FP_REGNUM] =
956
              cache->sp_offset - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
957
 
958
          else if (IS_MOV_SP_FP_MEDIA (insn))
959
            break;
960
        }
961
    }
962
 
963
  if (cache->saved_regs[MEDIA_FP_REGNUM] >= 0)
964
    cache->uses_fp = 1;
965
}
966
 
967
static CORE_ADDR
968
sh64_frame_align (struct gdbarch *ignore, CORE_ADDR sp)
969
{
970
  return sp & ~7;
971
}
972
 
973
/* Function: push_dummy_call
974
   Setup the function arguments for calling a function in the inferior.
975
 
976
   On the Renesas SH architecture, there are four registers (R4 to R7)
977
   which are dedicated for passing function arguments.  Up to the first
978
   four arguments (depending on size) may go into these registers.
979
   The rest go on the stack.
980
 
981
   Arguments that are smaller than 4 bytes will still take up a whole
982
   register or a whole 32-bit word on the stack, and will be
983
   right-justified in the register or the stack word.  This includes
984
   chars, shorts, and small aggregate types.
985
 
986
   Arguments that are larger than 4 bytes may be split between two or
987
   more registers.  If there are not enough registers free, an argument
988
   may be passed partly in a register (or registers), and partly on the
989
   stack.  This includes doubles, long longs, and larger aggregates.
990
   As far as I know, there is no upper limit to the size of aggregates
991
   that will be passed in this way; in other words, the convention of
992
   passing a pointer to a large aggregate instead of a copy is not used.
993
 
994
   An exceptional case exists for struct arguments (and possibly other
995
   aggregates such as arrays) if the size is larger than 4 bytes but
996
   not a multiple of 4 bytes.  In this case the argument is never split
997
   between the registers and the stack, but instead is copied in its
998
   entirety onto the stack, AND also copied into as many registers as
999
   there is room for.  In other words, space in registers permitting,
1000
   two copies of the same argument are passed in.  As far as I can tell,
1001
   only the one on the stack is used, although that may be a function
1002
   of the level of compiler optimization.  I suspect this is a compiler
1003
   bug.  Arguments of these odd sizes are left-justified within the
1004
   word (as opposed to arguments smaller than 4 bytes, which are
1005
   right-justified).
1006
 
1007
   If the function is to return an aggregate type such as a struct, it
1008
   is either returned in the normal return value register R0 (if its
1009
   size is no greater than one byte), or else the caller must allocate
1010
   space into which the callee will copy the return value (if the size
1011
   is greater than one byte).  In this case, a pointer to the return
1012
   value location is passed into the callee in register R2, which does
1013
   not displace any of the other arguments passed in via registers R4
1014
   to R7.   */
1015
 
1016
/* R2-R9 for integer types and integer equivalent (char, pointers) and
1017
   non-scalar (struct, union) elements (even if the elements are
1018
   floats).
1019
   FR0-FR11 for single precision floating point (float)
1020
   DR0-DR10 for double precision floating point (double)
1021
 
1022
   If a float is argument number 3 (for instance) and arguments number
1023
   1,2, and 4 are integer, the mapping will be:
1024
   arg1 -->R2, arg2 --> R3, arg3 -->FR0, arg4 --> R5. I.e. R4 is not used.
1025
 
1026
   If a float is argument number 10 (for instance) and arguments number
1027
   1 through 10 are integer, the mapping will be:
1028
   arg1->R2, arg2->R3, arg3->R4, arg4->R5, arg5->R6, arg6->R7, arg7->R8,
1029
   arg8->R9, arg9->(0,SP)stack(8-byte aligned), arg10->FR0, arg11->stack(16,SP).
1030
   I.e. there is hole in the stack.
1031
 
1032
   Different rules apply for variable arguments functions, and for functions
1033
   for which the prototype is not known.  */
1034
 
1035
static CORE_ADDR
1036
sh64_push_dummy_call (struct gdbarch *gdbarch,
1037
                      struct value *function,
1038
                      struct regcache *regcache,
1039
                      CORE_ADDR bp_addr,
1040
                      int nargs, struct value **args,
1041
                      CORE_ADDR sp, int struct_return,
1042
                      CORE_ADDR struct_addr)
1043
{
1044
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1045
  int stack_offset, stack_alloc;
1046
  int int_argreg;
1047
  int float_argreg;
1048
  int double_argreg;
1049
  int float_arg_index = 0;
1050
  int double_arg_index = 0;
1051
  int argnum;
1052
  struct type *type;
1053
  CORE_ADDR regval;
1054
  char *val;
1055
  char valbuf[8];
1056
  char valbuf_tmp[8];
1057
  int len;
1058
  int argreg_size;
1059
  int fp_args[12];
1060
 
1061
  memset (fp_args, 0, sizeof (fp_args));
1062
 
1063
  /* first force sp to a 8-byte alignment */
1064
  sp = sh64_frame_align (gdbarch, sp);
1065
 
1066
  /* The "struct return pointer" pseudo-argument has its own dedicated
1067
     register */
1068
 
1069
  if (struct_return)
1070
    regcache_cooked_write_unsigned (regcache,
1071
                                    STRUCT_RETURN_REGNUM, struct_addr);
1072
 
1073
  /* Now make sure there's space on the stack */
1074
  for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
1075
    stack_alloc += ((TYPE_LENGTH (value_type (args[argnum])) + 7) & ~7);
1076
  sp -= stack_alloc;            /* make room on stack for args */
1077
 
1078
  /* Now load as many as possible of the first arguments into
1079
     registers, and push the rest onto the stack.  There are 64 bytes
1080
     in eight registers available.  Loop thru args from first to last.  */
1081
 
1082
  int_argreg = ARG0_REGNUM;
1083
  float_argreg = gdbarch_fp0_regnum (gdbarch);
1084
  double_argreg = DR0_REGNUM;
1085
 
1086
  for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
1087
    {
1088
      type = value_type (args[argnum]);
1089
      len = TYPE_LENGTH (type);
1090
      memset (valbuf, 0, sizeof (valbuf));
1091
 
1092
      if (TYPE_CODE (type) != TYPE_CODE_FLT)
1093
        {
1094
          argreg_size = register_size (gdbarch, int_argreg);
1095
 
1096
          if (len < argreg_size)
1097
            {
1098
              /* value gets right-justified in the register or stack word */
1099
              if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1100
                memcpy (valbuf + argreg_size - len,
1101
                        (char *) value_contents (args[argnum]), len);
1102
              else
1103
                memcpy (valbuf, (char *) value_contents (args[argnum]), len);
1104
 
1105
              val = valbuf;
1106
            }
1107
          else
1108
            val = (char *) value_contents (args[argnum]);
1109
 
1110
          while (len > 0)
1111
            {
1112
              if (int_argreg > ARGLAST_REGNUM)
1113
                {
1114
                  /* must go on the stack */
1115
                  write_memory (sp + stack_offset, (const bfd_byte *) val,
1116
                                argreg_size);
1117
                  stack_offset += 8;/*argreg_size;*/
1118
                }
1119
              /* NOTE WELL!!!!!  This is not an "else if" clause!!!
1120
                 That's because some *&^%$ things get passed on the stack
1121
                 AND in the registers!   */
1122
              if (int_argreg <= ARGLAST_REGNUM)
1123
                {
1124
                  /* there's room in a register */
1125
                  regval = extract_unsigned_integer (val, argreg_size,
1126
                                                     byte_order);
1127
                  regcache_cooked_write_unsigned (regcache, int_argreg, regval);
1128
                }
1129
              /* Store the value 8 bytes at a time.  This means that
1130
                 things larger than 8 bytes may go partly in registers
1131
                 and partly on the stack. FIXME: argreg is incremented
1132
                 before we use its size.  */
1133
              len -= argreg_size;
1134
              val += argreg_size;
1135
              int_argreg++;
1136
            }
1137
        }
1138
      else
1139
        {
1140
          val = (char *) value_contents (args[argnum]);
1141
          if (len == 4)
1142
            {
1143
              /* Where is it going to be stored? */
1144
              while (fp_args[float_arg_index])
1145
                float_arg_index ++;
1146
 
1147
              /* Now float_argreg points to the register where it
1148
                 should be stored.  Are we still within the allowed
1149
                 register set? */
1150
              if (float_arg_index <= FLOAT_ARGLAST_REGNUM)
1151
                {
1152
                  /* Goes in FR0...FR11 */
1153
                  regcache_cooked_write (regcache,
1154
                                         gdbarch_fp0_regnum (gdbarch)
1155
                                         + float_arg_index,
1156
                                         val);
1157
                  fp_args[float_arg_index] = 1;
1158
                  /* Skip the corresponding general argument register.  */
1159
                  int_argreg ++;
1160
                }
1161
              else
1162
                ;
1163
                /* Store it as the integers, 8 bytes at the time, if
1164
                   necessary spilling on the stack.  */
1165
 
1166
            }
1167
            else if (len == 8)
1168
              {
1169
                /* Where is it going to be stored? */
1170
                while (fp_args[double_arg_index])
1171
                  double_arg_index += 2;
1172
                /* Now double_argreg points to the register
1173
                   where it should be stored.
1174
                   Are we still within the allowed register set? */
1175
                if (double_arg_index < FLOAT_ARGLAST_REGNUM)
1176
                  {
1177
                    /* Goes in DR0...DR10 */
1178
                    /* The numbering of the DRi registers is consecutive,
1179
                       i.e. includes odd numbers.  */
1180
                    int double_register_offset = double_arg_index / 2;
1181
                    int regnum = DR0_REGNUM + double_register_offset;
1182
                    regcache_cooked_write (regcache, regnum, val);
1183
                    fp_args[double_arg_index] = 1;
1184
                    fp_args[double_arg_index + 1] = 1;
1185
                    /* Skip the corresponding general argument register.  */
1186
                    int_argreg ++;
1187
                  }
1188
                else
1189
                  ;
1190
                  /* Store it as the integers, 8 bytes at the time, if
1191
                     necessary spilling on the stack.  */
1192
              }
1193
        }
1194
    }
1195
  /* Store return address. */
1196
  regcache_cooked_write_unsigned (regcache, PR_REGNUM, bp_addr);
1197
 
1198
  /* Update stack pointer.  */
1199
  regcache_cooked_write_unsigned (regcache,
1200
                                  gdbarch_sp_regnum (gdbarch), sp);
1201
 
1202
  return sp;
1203
}
1204
 
1205
/* Find a function's return value in the appropriate registers (in
1206
   regbuf), and copy it into valbuf.  Extract from an array REGBUF
1207
   containing the (raw) register state a function return value of type
1208
   TYPE, and copy that, in virtual format, into VALBUF.  */
1209
static void
1210
sh64_extract_return_value (struct type *type, struct regcache *regcache,
1211
                           void *valbuf)
1212
{
1213
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
1214
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1215
  int len = TYPE_LENGTH (type);
1216
 
1217
  if (TYPE_CODE (type) == TYPE_CODE_FLT)
1218
    {
1219
      if (len == 4)
1220
        {
1221
          /* Return value stored in gdbarch_fp0_regnum */
1222
          regcache_raw_read (regcache,
1223
                             gdbarch_fp0_regnum (gdbarch), valbuf);
1224
        }
1225
      else if (len == 8)
1226
        {
1227
          /* return value stored in DR0_REGNUM */
1228
          DOUBLEST val;
1229
          gdb_byte buf[8];
1230
 
1231
          regcache_cooked_read (regcache, DR0_REGNUM, buf);
1232
 
1233
          if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1234
            floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
1235
                                     buf, &val);
1236
          else
1237
            floatformat_to_doublest (&floatformat_ieee_double_big,
1238
                                     buf, &val);
1239
          store_typed_floating (valbuf, type, val);
1240
        }
1241
    }
1242
  else
1243
    {
1244
      if (len <= 8)
1245
        {
1246
          int offset;
1247
          char buf[8];
1248
          /* Result is in register 2. If smaller than 8 bytes, it is padded
1249
             at the most significant end.  */
1250
          regcache_raw_read (regcache, DEFAULT_RETURN_REGNUM, buf);
1251
 
1252
          if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1253
            offset = register_size (gdbarch, DEFAULT_RETURN_REGNUM)
1254
                     - len;
1255
          else
1256
            offset = 0;
1257
          memcpy (valbuf, buf + offset, len);
1258
        }
1259
      else
1260
        error ("bad size for return value");
1261
    }
1262
}
1263
 
1264
/* Write into appropriate registers a function return value
1265
   of type TYPE, given in virtual format.
1266
   If the architecture is sh4 or sh3e, store a function's return value
1267
   in the R0 general register or in the FP0 floating point register,
1268
   depending on the type of the return value. In all the other cases
1269
   the result is stored in r0, left-justified.  */
1270
 
1271
static void
1272
sh64_store_return_value (struct type *type, struct regcache *regcache,
1273
                         const void *valbuf)
1274
{
1275
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
1276
  char buf[64]; /* more than enough...  */
1277
  int len = TYPE_LENGTH (type);
1278
 
1279
  if (TYPE_CODE (type) == TYPE_CODE_FLT)
1280
    {
1281
      int i, regnum = gdbarch_fp0_regnum (gdbarch);
1282
      for (i = 0; i < len; i += 4)
1283
        if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1284
          regcache_raw_write (regcache, regnum++,
1285
                              (char *) valbuf + len - 4 - i);
1286
        else
1287
          regcache_raw_write (regcache, regnum++, (char *) valbuf + i);
1288
    }
1289
  else
1290
    {
1291
      int return_register = DEFAULT_RETURN_REGNUM;
1292
      int offset = 0;
1293
 
1294
      if (len <= register_size (gdbarch, return_register))
1295
        {
1296
          /* Pad with zeros.  */
1297
          memset (buf, 0, register_size (gdbarch, return_register));
1298
          if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
1299
            offset = 0; /*register_size (gdbarch,
1300
                          return_register) - len;*/
1301
          else
1302
            offset = register_size (gdbarch, return_register) - len;
1303
 
1304
          memcpy (buf + offset, valbuf, len);
1305
          regcache_raw_write (regcache, return_register, buf);
1306
        }
1307
      else
1308
        regcache_raw_write (regcache, return_register, valbuf);
1309
    }
1310
}
1311
 
1312
static enum return_value_convention
1313
sh64_return_value (struct gdbarch *gdbarch, struct type *func_type,
1314
                   struct type *type, struct regcache *regcache,
1315
                   gdb_byte *readbuf, const gdb_byte *writebuf)
1316
{
1317
  if (sh64_use_struct_convention (type))
1318
    return RETURN_VALUE_STRUCT_CONVENTION;
1319
  if (writebuf)
1320
    sh64_store_return_value (type, regcache, writebuf);
1321
  else if (readbuf)
1322
    sh64_extract_return_value (type, regcache, readbuf);
1323
  return RETURN_VALUE_REGISTER_CONVENTION;
1324
}
1325
 
1326
static void
1327
sh64_show_media_regs (struct frame_info *frame)
1328
{
1329
  struct gdbarch *gdbarch = get_frame_arch (frame);
1330
  int i;
1331
 
1332
  printf_filtered
1333
    ("PC=%s SR=%s\n",
1334
     phex (get_frame_register_unsigned (frame,
1335
                                        gdbarch_pc_regnum (gdbarch)), 8),
1336
     phex (get_frame_register_unsigned (frame, SR_REGNUM), 8));
1337
 
1338
  printf_filtered
1339
    ("SSR=%s SPC=%s\n",
1340
     phex (get_frame_register_unsigned (frame, SSR_REGNUM), 8),
1341
     phex (get_frame_register_unsigned (frame, SPC_REGNUM), 8));
1342
  printf_filtered
1343
    ("FPSCR=%s\n ",
1344
     phex (get_frame_register_unsigned (frame, FPSCR_REGNUM), 8));
1345
 
1346
  for (i = 0; i < 64; i = i + 4)
1347
    printf_filtered
1348
      ("\nR%d-R%d  %s %s %s %s\n",
1349
       i, i + 3,
1350
      phex (get_frame_register_unsigned (frame, i + 0), 8),
1351
      phex (get_frame_register_unsigned (frame, i + 1), 8),
1352
      phex (get_frame_register_unsigned (frame, i + 2), 8),
1353
      phex (get_frame_register_unsigned (frame, i + 3), 8));
1354
 
1355
  printf_filtered ("\n");
1356
 
1357
  for (i = 0; i < 64; i = i + 8)
1358
    printf_filtered
1359
      ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
1360
       i, i + 7,
1361
       (long) get_frame_register_unsigned
1362
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 0),
1363
       (long) get_frame_register_unsigned
1364
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 1),
1365
       (long) get_frame_register_unsigned
1366
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 2),
1367
       (long) get_frame_register_unsigned
1368
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 3),
1369
       (long) get_frame_register_unsigned
1370
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 4),
1371
       (long) get_frame_register_unsigned
1372
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 5),
1373
       (long) get_frame_register_unsigned
1374
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 6),
1375
       (long) get_frame_register_unsigned
1376
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 7));
1377
}
1378
 
1379
static void
1380
sh64_show_compact_regs (struct frame_info *frame)
1381
{
1382
  struct gdbarch *gdbarch = get_frame_arch (frame);
1383
  int i;
1384
 
1385
  printf_filtered
1386
    ("PC=%s\n",
1387
     phex (get_frame_register_unsigned (frame, PC_C_REGNUM), 8));
1388
 
1389
  printf_filtered
1390
    ("GBR=%08lx MACH=%08lx MACL=%08lx PR=%08lx T=%08lx\n",
1391
     (long) get_frame_register_unsigned (frame, GBR_C_REGNUM),
1392
     (long) get_frame_register_unsigned (frame, MACH_C_REGNUM),
1393
     (long) get_frame_register_unsigned (frame, MACL_C_REGNUM),
1394
     (long) get_frame_register_unsigned (frame, PR_C_REGNUM),
1395
     (long) get_frame_register_unsigned (frame, T_C_REGNUM));
1396
  printf_filtered
1397
    ("FPSCR=%08lx FPUL=%08lx\n",
1398
     (long) get_frame_register_unsigned (frame, FPSCR_C_REGNUM),
1399
     (long) get_frame_register_unsigned (frame, FPUL_C_REGNUM));
1400
 
1401
  for (i = 0; i < 16; i = i + 4)
1402
    printf_filtered
1403
      ("\nR%d-R%d  %08lx %08lx %08lx %08lx\n",
1404
       i, i + 3,
1405
       (long) get_frame_register_unsigned (frame, i + 0),
1406
       (long) get_frame_register_unsigned (frame, i + 1),
1407
       (long) get_frame_register_unsigned (frame, i + 2),
1408
       (long) get_frame_register_unsigned (frame, i + 3));
1409
 
1410
  printf_filtered ("\n");
1411
 
1412
  for (i = 0; i < 16; i = i + 8)
1413
    printf_filtered
1414
      ("FR%d-FR%d  %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
1415
       i, i + 7,
1416
       (long) get_frame_register_unsigned
1417
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 0),
1418
       (long) get_frame_register_unsigned
1419
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 1),
1420
       (long) get_frame_register_unsigned
1421
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 2),
1422
       (long) get_frame_register_unsigned
1423
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 3),
1424
       (long) get_frame_register_unsigned
1425
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 4),
1426
       (long) get_frame_register_unsigned
1427
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 5),
1428
       (long) get_frame_register_unsigned
1429
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 6),
1430
       (long) get_frame_register_unsigned
1431
                (frame, gdbarch_fp0_regnum (gdbarch) + i + 7));
1432
}
1433
 
1434
/* FIXME!!! This only shows the registers for shmedia, excluding the
1435
   pseudo registers.  */
1436
void
1437
sh64_show_regs (struct frame_info *frame)
1438
{
1439
  if (pc_is_isa32 (get_frame_pc (frame)))
1440
    sh64_show_media_regs (frame);
1441
  else
1442
    sh64_show_compact_regs (frame);
1443
}
1444
 
1445
/* *INDENT-OFF* */
1446
/*
1447
    SH MEDIA MODE (ISA 32)
1448
    general registers (64-bit) 0-63
1449
 
1450
64   r8,   r9,   r10,  r11,  r12,  r13,  r14,  r15,
1451
128  r16,  r17,  r18,  r19,  r20,  r21,  r22,  r23,
1452
192  r24,  r25,  r26,  r27,  r28,  r29,  r30,  r31,
1453
256  r32,  r33,  r34,  r35,  r36,  r37,  r38,  r39,
1454
320  r40,  r41,  r42,  r43,  r44,  r45,  r46,  r47,
1455
384  r48,  r49,  r50,  r51,  r52,  r53,  r54,  r55,
1456
448  r56,  r57,  r58,  r59,  r60,  r61,  r62,  r63,
1457
 
1458
    pc (64-bit) 64
1459
512  pc,
1460
 
1461
    status reg., saved status reg., saved pc reg. (64-bit) 65-67
1462
520  sr,  ssr,  spc,
1463
 
1464
    target registers (64-bit) 68-75
1465
544  tr0,  tr1,  tr2,  tr3,  tr4,  tr5,  tr6,  tr7,
1466
 
1467
    floating point state control register (32-bit) 76
1468
608  fpscr,
1469
 
1470
    single precision floating point registers (32-bit) 77-140
1471
612  fr0,  fr1,  fr2,  fr3,  fr4,  fr5,  fr6,  fr7,
1472
644  fr8,  fr9,  fr10, fr11, fr12, fr13, fr14, fr15,
1473
676  fr16, fr17, fr18, fr19, fr20, fr21, fr22, fr23,
1474
708  fr24, fr25, fr26, fr27, fr28, fr29, fr30, fr31,
1475
740  fr32, fr33, fr34, fr35, fr36, fr37, fr38, fr39,
1476
772  fr40, fr41, fr42, fr43, fr44, fr45, fr46, fr47,
1477
804  fr48, fr49, fr50, fr51, fr52, fr53, fr54, fr55,
1478
836  fr56, fr57, fr58, fr59, fr60, fr61, fr62, fr63,
1479
 
1480
TOTAL SPACE FOR REGISTERS: 868 bytes
1481
 
1482
From here on they are all pseudo registers: no memory allocated.
1483
REGISTER_BYTE returns the register byte for the base register.
1484
 
1485
    double precision registers (pseudo) 141-172
1486
     dr0,  dr2,  dr4,  dr6,  dr8,  dr10, dr12, dr14,
1487
     dr16, dr18, dr20, dr22, dr24, dr26, dr28, dr30,
1488
     dr32, dr34, dr36, dr38, dr40, dr42, dr44, dr46,
1489
     dr48, dr50, dr52, dr54, dr56, dr58, dr60, dr62,
1490
 
1491
    floating point pairs (pseudo) 173-204
1492
     fp0,  fp2,  fp4,  fp6,  fp8,  fp10, fp12, fp14,
1493
     fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30,
1494
     fp32, fp34, fp36, fp38, fp40, fp42, fp44, fp46,
1495
     fp48, fp50, fp52, fp54, fp56, fp58, fp60, fp62,
1496
 
1497
    floating point vectors (4 floating point regs) (pseudo) 205-220
1498
     fv0,  fv4,  fv8,  fv12, fv16, fv20, fv24, fv28,
1499
     fv32, fv36, fv40, fv44, fv48, fv52, fv56, fv60,
1500
 
1501
    SH COMPACT MODE (ISA 16) (all pseudo) 221-272
1502
     r0_c, r1_c, r2_c,  r3_c,  r4_c,  r5_c,  r6_c,  r7_c,
1503
     r8_c, r9_c, r10_c, r11_c, r12_c, r13_c, r14_c, r15_c,
1504
     pc_c,
1505
     gbr_c, mach_c, macl_c, pr_c, t_c,
1506
     fpscr_c, fpul_c,
1507
     fr0_c, fr1_c, fr2_c,  fr3_c,  fr4_c,  fr5_c,  fr6_c,  fr7_c,
1508
     fr8_c, fr9_c, fr10_c, fr11_c, fr12_c, fr13_c, fr14_c, fr15_c
1509
     dr0_c, dr2_c, dr4_c,  dr6_c,  dr8_c,  dr10_c, dr12_c, dr14_c
1510
     fv0_c, fv4_c, fv8_c,  fv12_c
1511
*/
1512
 
1513
static struct type *
1514
sh64_build_float_register_type (struct gdbarch *gdbarch, int high)
1515
{
1516
  return lookup_array_range_type (builtin_type (gdbarch)->builtin_float,
1517
                                  0, high);
1518
}
1519
 
1520
/* Return the GDB type object for the "standard" data type
1521
   of data in register REG_NR.  */
1522
static struct type *
1523
sh64_register_type (struct gdbarch *gdbarch, int reg_nr)
1524
{
1525
  if ((reg_nr >= gdbarch_fp0_regnum (gdbarch)
1526
       && reg_nr <= FP_LAST_REGNUM)
1527
      || (reg_nr >= FP0_C_REGNUM
1528
          && reg_nr <= FP_LAST_C_REGNUM))
1529
    return builtin_type (gdbarch)->builtin_float;
1530
  else if ((reg_nr >= DR0_REGNUM
1531
            && reg_nr <= DR_LAST_REGNUM)
1532
           || (reg_nr >= DR0_C_REGNUM
1533
               && reg_nr <= DR_LAST_C_REGNUM))
1534
    return builtin_type (gdbarch)->builtin_double;
1535
  else if  (reg_nr >= FPP0_REGNUM
1536
            && reg_nr <= FPP_LAST_REGNUM)
1537
    return sh64_build_float_register_type (gdbarch, 1);
1538
  else if ((reg_nr >= FV0_REGNUM
1539
            && reg_nr <= FV_LAST_REGNUM)
1540
           ||(reg_nr >= FV0_C_REGNUM
1541
              && reg_nr <= FV_LAST_C_REGNUM))
1542
    return sh64_build_float_register_type (gdbarch, 3);
1543
  else if (reg_nr == FPSCR_REGNUM)
1544
    return builtin_type (gdbarch)->builtin_int;
1545
  else if (reg_nr >= R0_C_REGNUM
1546
           && reg_nr < FP0_C_REGNUM)
1547
    return builtin_type (gdbarch)->builtin_int;
1548
  else
1549
    return builtin_type (gdbarch)->builtin_long_long;
1550
}
1551
 
1552
static void
1553
sh64_register_convert_to_virtual (struct gdbarch *gdbarch, int regnum,
1554
                                  struct type *type, char *from, char *to)
1555
{
1556
  if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE)
1557
    {
1558
      /* It is a no-op.  */
1559
      memcpy (to, from, register_size (gdbarch, regnum));
1560
      return;
1561
    }
1562
 
1563
  if ((regnum >= DR0_REGNUM
1564
       && regnum <= DR_LAST_REGNUM)
1565
      || (regnum >= DR0_C_REGNUM
1566
          && regnum <= DR_LAST_C_REGNUM))
1567
    {
1568
      DOUBLEST val;
1569
      floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
1570
                               from, &val);
1571
      store_typed_floating (to, type, val);
1572
    }
1573
  else
1574
    error ("sh64_register_convert_to_virtual called with non DR register number");
1575
}
1576
 
1577
static void
1578
sh64_register_convert_to_raw (struct gdbarch *gdbarch, struct type *type,
1579
                              int regnum, const void *from, void *to)
1580
{
1581
  if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_LITTLE)
1582
    {
1583
      /* It is a no-op.  */
1584
      memcpy (to, from, register_size (gdbarch, regnum));
1585
      return;
1586
    }
1587
 
1588
  if ((regnum >= DR0_REGNUM
1589
       && regnum <= DR_LAST_REGNUM)
1590
      || (regnum >= DR0_C_REGNUM
1591
          && regnum <= DR_LAST_C_REGNUM))
1592
    {
1593
      DOUBLEST val = extract_typed_floating (from, type);
1594
      floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword,
1595
                                 &val, to);
1596
    }
1597
  else
1598
    error ("sh64_register_convert_to_raw called with non DR register number");
1599
}
1600
 
1601
static void
1602
sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
1603
                           int reg_nr, gdb_byte *buffer)
1604
{
1605
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1606
  int base_regnum;
1607
  int portion;
1608
  int offset = 0;
1609
  char temp_buffer[MAX_REGISTER_SIZE];
1610
 
1611
  if (reg_nr >= DR0_REGNUM
1612
      && reg_nr <= DR_LAST_REGNUM)
1613
    {
1614
      base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr);
1615
 
1616
      /* Build the value in the provided buffer.  */
1617
      /* DR regs are double precision registers obtained by
1618
         concatenating 2 single precision floating point registers.  */
1619
      for (portion = 0; portion < 2; portion++)
1620
        regcache_raw_read (regcache, base_regnum + portion,
1621
                           (temp_buffer
1622
                            + register_size (gdbarch, base_regnum) * portion));
1623
 
1624
      /* We must pay attention to the endianness.  */
1625
      sh64_register_convert_to_virtual (gdbarch, reg_nr,
1626
                                        register_type (gdbarch, reg_nr),
1627
                                        temp_buffer, buffer);
1628
 
1629
    }
1630
 
1631
  else if (reg_nr >= FPP0_REGNUM
1632
           && reg_nr <= FPP_LAST_REGNUM)
1633
    {
1634
      base_regnum = sh64_fpp_reg_base_num (gdbarch, reg_nr);
1635
 
1636
      /* Build the value in the provided buffer.  */
1637
      /* FPP regs are pairs of single precision registers obtained by
1638
         concatenating 2 single precision floating point registers.  */
1639
      for (portion = 0; portion < 2; portion++)
1640
        regcache_raw_read (regcache, base_regnum + portion,
1641
                           ((char *) buffer
1642
                            + register_size (gdbarch, base_regnum) * portion));
1643
    }
1644
 
1645
  else if (reg_nr >= FV0_REGNUM
1646
           && reg_nr <= FV_LAST_REGNUM)
1647
    {
1648
      base_regnum = sh64_fv_reg_base_num (gdbarch, reg_nr);
1649
 
1650
      /* Build the value in the provided buffer.  */
1651
      /* FV regs are vectors of single precision registers obtained by
1652
         concatenating 4 single precision floating point registers.  */
1653
      for (portion = 0; portion < 4; portion++)
1654
        regcache_raw_read (regcache, base_regnum + portion,
1655
                           ((char *) buffer
1656
                            + register_size (gdbarch, base_regnum) * portion));
1657
    }
1658
 
1659
  /* sh compact pseudo registers. 1-to-1 with a shmedia register */
1660
  else if (reg_nr >= R0_C_REGNUM
1661
           && reg_nr <= T_C_REGNUM)
1662
    {
1663
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1664
 
1665
      /* Build the value in the provided buffer.  */
1666
      regcache_raw_read (regcache, base_regnum, temp_buffer);
1667
      if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1668
        offset = 4;
1669
      memcpy (buffer, temp_buffer + offset, 4); /* get LOWER 32 bits only????*/
1670
    }
1671
 
1672
  else if (reg_nr >= FP0_C_REGNUM
1673
           && reg_nr <= FP_LAST_C_REGNUM)
1674
    {
1675
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1676
 
1677
      /* Build the value in the provided buffer.  */
1678
      /* Floating point registers map 1-1 to the media fp regs,
1679
         they have the same size and endianness.  */
1680
      regcache_raw_read (regcache, base_regnum, buffer);
1681
    }
1682
 
1683
  else if (reg_nr >= DR0_C_REGNUM
1684
           && reg_nr <= DR_LAST_C_REGNUM)
1685
    {
1686
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1687
 
1688
      /* DR_C regs are double precision registers obtained by
1689
         concatenating 2 single precision floating point registers.  */
1690
      for (portion = 0; portion < 2; portion++)
1691
        regcache_raw_read (regcache, base_regnum + portion,
1692
                           (temp_buffer
1693
                            + register_size (gdbarch, base_regnum) * portion));
1694
 
1695
      /* We must pay attention to the endianness.  */
1696
      sh64_register_convert_to_virtual (gdbarch, reg_nr,
1697
                                        register_type (gdbarch, reg_nr),
1698
                                        temp_buffer, buffer);
1699
    }
1700
 
1701
  else if (reg_nr >= FV0_C_REGNUM
1702
           && reg_nr <= FV_LAST_C_REGNUM)
1703
    {
1704
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1705
 
1706
      /* Build the value in the provided buffer.  */
1707
      /* FV_C regs are vectors of single precision registers obtained by
1708
         concatenating 4 single precision floating point registers.  */
1709
      for (portion = 0; portion < 4; portion++)
1710
        regcache_raw_read (regcache, base_regnum + portion,
1711
                           ((char *) buffer
1712
                            + register_size (gdbarch, base_regnum) * portion));
1713
    }
1714
 
1715
  else if (reg_nr == FPSCR_C_REGNUM)
1716
    {
1717
      int fpscr_base_regnum;
1718
      int sr_base_regnum;
1719
      unsigned int fpscr_value;
1720
      unsigned int sr_value;
1721
      unsigned int fpscr_c_value;
1722
      unsigned int fpscr_c_part1_value;
1723
      unsigned int fpscr_c_part2_value;
1724
 
1725
      fpscr_base_regnum = FPSCR_REGNUM;
1726
      sr_base_regnum = SR_REGNUM;
1727
 
1728
      /* Build the value in the provided buffer.  */
1729
      /* FPSCR_C is a very weird register that contains sparse bits
1730
         from the FPSCR and the SR architectural registers.
1731
         Specifically: */
1732
      /* *INDENT-OFF* */
1733
      /*
1734
         FPSRC_C bit
1735
 
1736
            1         reserved
1737
            2-17      Bit 2-18 of FPSCR
1738
            18-20     Bits 12,13,14 of SR
1739
            21-31     reserved
1740
       */
1741
      /* *INDENT-ON* */
1742
      /* Get FPSCR into a local buffer */
1743
      regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
1744
      /* Get value as an int.  */
1745
      fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1746
      /* Get SR into a local buffer */
1747
      regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
1748
      /* Get value as an int.  */
1749
      sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1750
      /* Build the new value.  */
1751
      fpscr_c_part1_value = fpscr_value & 0x3fffd;
1752
      fpscr_c_part2_value = (sr_value & 0x7000) << 6;
1753
      fpscr_c_value = fpscr_c_part1_value | fpscr_c_part2_value;
1754
      /* Store that in out buffer!!! */
1755
      store_unsigned_integer (buffer, 4, byte_order, fpscr_c_value);
1756
      /* FIXME There is surely an endianness gotcha here.  */
1757
    }
1758
 
1759
  else if (reg_nr == FPUL_C_REGNUM)
1760
    {
1761
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1762
 
1763
      /* FPUL_C register is floating point register 32,
1764
         same size, same endianness.  */
1765
      regcache_raw_read (regcache, base_regnum, buffer);
1766
    }
1767
}
1768
 
1769
static void
1770
sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
1771
                            int reg_nr, const gdb_byte *buffer)
1772
{
1773
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1774
  int base_regnum, portion;
1775
  int offset;
1776
  char temp_buffer[MAX_REGISTER_SIZE];
1777
 
1778
  if (reg_nr >= DR0_REGNUM
1779
      && reg_nr <= DR_LAST_REGNUM)
1780
    {
1781
      base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr);
1782
      /* We must pay attention to the endianness.  */
1783
      sh64_register_convert_to_raw (gdbarch, register_type (gdbarch, reg_nr),
1784
                                    reg_nr,
1785
                                    buffer, temp_buffer);
1786
 
1787
      /* Write the real regs for which this one is an alias.  */
1788
      for (portion = 0; portion < 2; portion++)
1789
        regcache_raw_write (regcache, base_regnum + portion,
1790
                            (temp_buffer
1791
                             + register_size (gdbarch,
1792
                                              base_regnum) * portion));
1793
    }
1794
 
1795
  else if (reg_nr >= FPP0_REGNUM
1796
           && reg_nr <= FPP_LAST_REGNUM)
1797
    {
1798
      base_regnum = sh64_fpp_reg_base_num (gdbarch, reg_nr);
1799
 
1800
      /* Write the real regs for which this one is an alias.  */
1801
      for (portion = 0; portion < 2; portion++)
1802
        regcache_raw_write (regcache, base_regnum + portion,
1803
                            ((char *) buffer
1804
                             + register_size (gdbarch,
1805
                                              base_regnum) * portion));
1806
    }
1807
 
1808
  else if (reg_nr >= FV0_REGNUM
1809
           && reg_nr <= FV_LAST_REGNUM)
1810
    {
1811
      base_regnum = sh64_fv_reg_base_num (gdbarch, reg_nr);
1812
 
1813
      /* Write the real regs for which this one is an alias.  */
1814
      for (portion = 0; portion < 4; portion++)
1815
        regcache_raw_write (regcache, base_regnum + portion,
1816
                            ((char *) buffer
1817
                             + register_size (gdbarch,
1818
                                              base_regnum) * portion));
1819
    }
1820
 
1821
  /* sh compact general pseudo registers. 1-to-1 with a shmedia
1822
     register but only 4 bytes of it.  */
1823
  else if (reg_nr >= R0_C_REGNUM
1824
           && reg_nr <= T_C_REGNUM)
1825
    {
1826
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1827
      /* reg_nr is 32 bit here, and base_regnum is 64 bits.  */
1828
      if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
1829
        offset = 4;
1830
      else
1831
        offset = 0;
1832
      /* Let's read the value of the base register into a temporary
1833
         buffer, so that overwriting the last four bytes with the new
1834
         value of the pseudo will leave the upper 4 bytes unchanged.  */
1835
      regcache_raw_read (regcache, base_regnum, temp_buffer);
1836
      /* Write as an 8 byte quantity */
1837
      memcpy (temp_buffer + offset, buffer, 4);
1838
      regcache_raw_write (regcache, base_regnum, temp_buffer);
1839
    }
1840
 
1841
  /* sh floating point compact pseudo registers. 1-to-1 with a shmedia
1842
     registers. Both are 4 bytes.  */
1843
  else if (reg_nr >= FP0_C_REGNUM
1844
               && reg_nr <= FP_LAST_C_REGNUM)
1845
    {
1846
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1847
      regcache_raw_write (regcache, base_regnum, buffer);
1848
    }
1849
 
1850
  else if (reg_nr >= DR0_C_REGNUM
1851
           && reg_nr <= DR_LAST_C_REGNUM)
1852
    {
1853
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1854
      for (portion = 0; portion < 2; portion++)
1855
        {
1856
          /* We must pay attention to the endianness.  */
1857
          sh64_register_convert_to_raw (gdbarch,
1858
                                        register_type (gdbarch, reg_nr),
1859
                                        reg_nr,
1860
                                        buffer, temp_buffer);
1861
 
1862
          regcache_raw_write (regcache, base_regnum + portion,
1863
                              (temp_buffer
1864
                               + register_size (gdbarch,
1865
                                                base_regnum) * portion));
1866
        }
1867
    }
1868
 
1869
  else if (reg_nr >= FV0_C_REGNUM
1870
           && reg_nr <= FV_LAST_C_REGNUM)
1871
    {
1872
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1873
 
1874
      for (portion = 0; portion < 4; portion++)
1875
        {
1876
          regcache_raw_write (regcache, base_regnum + portion,
1877
                              ((char *) buffer
1878
                               + register_size (gdbarch,
1879
                                                base_regnum) * portion));
1880
        }
1881
    }
1882
 
1883
  else if (reg_nr == FPSCR_C_REGNUM)
1884
    {
1885
      int fpscr_base_regnum;
1886
      int sr_base_regnum;
1887
      unsigned int fpscr_value;
1888
      unsigned int sr_value;
1889
      unsigned int old_fpscr_value;
1890
      unsigned int old_sr_value;
1891
      unsigned int fpscr_c_value;
1892
      unsigned int fpscr_mask;
1893
      unsigned int sr_mask;
1894
 
1895
      fpscr_base_regnum = FPSCR_REGNUM;
1896
      sr_base_regnum = SR_REGNUM;
1897
 
1898
      /* FPSCR_C is a very weird register that contains sparse bits
1899
         from the FPSCR and the SR architectural registers.
1900
         Specifically: */
1901
      /* *INDENT-OFF* */
1902
      /*
1903
         FPSRC_C bit
1904
 
1905
            1         reserved
1906
            2-17      Bit 2-18 of FPSCR
1907
            18-20     Bits 12,13,14 of SR
1908
            21-31     reserved
1909
       */
1910
      /* *INDENT-ON* */
1911
      /* Get value as an int.  */
1912
      fpscr_c_value = extract_unsigned_integer (buffer, 4, byte_order);
1913
 
1914
      /* Build the new values.  */
1915
      fpscr_mask = 0x0003fffd;
1916
      sr_mask = 0x001c0000;
1917
 
1918
      fpscr_value = fpscr_c_value & fpscr_mask;
1919
      sr_value = (fpscr_value & sr_mask) >> 6;
1920
 
1921
      regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
1922
      old_fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1923
      old_fpscr_value &= 0xfffc0002;
1924
      fpscr_value |= old_fpscr_value;
1925
      store_unsigned_integer (temp_buffer, 4, byte_order, fpscr_value);
1926
      regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer);
1927
 
1928
      regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
1929
      old_sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order);
1930
      old_sr_value &= 0xffff8fff;
1931
      sr_value |= old_sr_value;
1932
      store_unsigned_integer (temp_buffer, 4, byte_order, sr_value);
1933
      regcache_raw_write (regcache, sr_base_regnum, temp_buffer);
1934
    }
1935
 
1936
  else if (reg_nr == FPUL_C_REGNUM)
1937
    {
1938
      base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr);
1939
      regcache_raw_write (regcache, base_regnum, buffer);
1940
    }
1941
}
1942
 
1943
/* FIXME:!! THIS SHOULD TAKE CARE OF GETTING THE RIGHT PORTION OF THE
1944
   shmedia REGISTERS.  */
1945
/* Control registers, compact mode.  */
1946
static void
1947
sh64_do_cr_c_register_info (struct ui_file *file, struct frame_info *frame,
1948
                            int cr_c_regnum)
1949
{
1950
  switch (cr_c_regnum)
1951
    {
1952
    case PC_C_REGNUM:
1953
      fprintf_filtered (file, "pc_c\t0x%08x\n",
1954
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1955
      break;
1956
    case GBR_C_REGNUM:
1957
      fprintf_filtered (file, "gbr_c\t0x%08x\n",
1958
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1959
      break;
1960
    case MACH_C_REGNUM:
1961
      fprintf_filtered (file, "mach_c\t0x%08x\n",
1962
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1963
      break;
1964
    case MACL_C_REGNUM:
1965
      fprintf_filtered (file, "macl_c\t0x%08x\n",
1966
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1967
      break;
1968
    case PR_C_REGNUM:
1969
      fprintf_filtered (file, "pr_c\t0x%08x\n",
1970
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1971
      break;
1972
    case T_C_REGNUM:
1973
      fprintf_filtered (file, "t_c\t0x%08x\n",
1974
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1975
      break;
1976
    case FPSCR_C_REGNUM:
1977
      fprintf_filtered (file, "fpscr_c\t0x%08x\n",
1978
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1979
      break;
1980
    case FPUL_C_REGNUM:
1981
      fprintf_filtered (file, "fpul_c\t0x%08x\n",
1982
          (int) get_frame_register_unsigned (frame, cr_c_regnum));
1983
      break;
1984
    }
1985
}
1986
 
1987
static void
1988
sh64_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file,
1989
                     struct frame_info *frame, int regnum)
1990
{                               /* do values for FP (float) regs */
1991
  unsigned char *raw_buffer;
1992
  double flt;   /* double extracted from raw hex data */
1993
  int inv;
1994
  int j;
1995
 
1996
  /* Allocate space for the float.  */
1997
  raw_buffer = (unsigned char *) alloca
1998
                                 (register_size (gdbarch,
1999
                                                 gdbarch_fp0_regnum
2000
                                                   (gdbarch)));
2001
 
2002
  /* Get the data in raw format.  */
2003
  if (!frame_register_read (frame, regnum, raw_buffer))
2004
    error ("can't read register %d (%s)",
2005
           regnum, gdbarch_register_name (gdbarch, regnum));
2006
 
2007
  /* Get the register as a number */
2008
  flt = unpack_double (builtin_type (gdbarch)->builtin_float, raw_buffer, &inv);
2009
 
2010
  /* Print the name and some spaces.  */
2011
  fputs_filtered (gdbarch_register_name (gdbarch, regnum), file);
2012
  print_spaces_filtered (15 - strlen (gdbarch_register_name
2013
                                        (gdbarch, regnum)), file);
2014
 
2015
  /* Print the value.  */
2016
  if (inv)
2017
    fprintf_filtered (file, "<invalid float>");
2018
  else
2019
    fprintf_filtered (file, "%-10.9g", flt);
2020
 
2021
  /* Print the fp register as hex.  */
2022
  fprintf_filtered (file, "\t(raw 0x");
2023
  for (j = 0; j < register_size (gdbarch, regnum); j++)
2024
    {
2025
      int idx = gdbarch_byte_order (gdbarch)
2026
                == BFD_ENDIAN_BIG ? j : register_size
2027
                (gdbarch, regnum) - 1 - j;
2028
      fprintf_filtered (file, "%02x", raw_buffer[idx]);
2029
    }
2030
  fprintf_filtered (file, ")");
2031
  fprintf_filtered (file, "\n");
2032
}
2033
 
2034
static void
2035
sh64_do_pseudo_register (struct gdbarch *gdbarch, struct ui_file *file,
2036
                         struct frame_info *frame, int regnum)
2037
{
2038
  /* All the sh64-compact mode registers are pseudo registers.  */
2039
 
2040
  if (regnum < gdbarch_num_regs (gdbarch)
2041
      || regnum >= gdbarch_num_regs (gdbarch)
2042
                   + NUM_PSEUDO_REGS_SH_MEDIA
2043
                   + NUM_PSEUDO_REGS_SH_COMPACT)
2044
    internal_error (__FILE__, __LINE__,
2045
                    _("Invalid pseudo register number %d\n"), regnum);
2046
 
2047
  else if ((regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM))
2048
    {
2049
      int fp_regnum = sh64_dr_reg_base_num (gdbarch, regnum);
2050
      fprintf_filtered (file, "dr%d\t0x%08x%08x\n", regnum - DR0_REGNUM,
2051
          (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2052
          (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2053
    }
2054
 
2055
  else if ((regnum >= DR0_C_REGNUM && regnum <= DR_LAST_C_REGNUM))
2056
    {
2057
      int fp_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2058
      fprintf_filtered (file, "dr%d_c\t0x%08x%08x\n", regnum - DR0_C_REGNUM,
2059
          (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2060
          (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2061
    }
2062
 
2063
  else if ((regnum >= FV0_REGNUM && regnum <= FV_LAST_REGNUM))
2064
    {
2065
      int fp_regnum = sh64_fv_reg_base_num (gdbarch, regnum);
2066
      fprintf_filtered (file, "fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
2067
           regnum - FV0_REGNUM,
2068
           (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2069
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1),
2070
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 2),
2071
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 3));
2072
    }
2073
 
2074
  else if ((regnum >= FV0_C_REGNUM && regnum <= FV_LAST_C_REGNUM))
2075
    {
2076
      int fp_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2077
      fprintf_filtered (file, "fv%d_c\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
2078
           regnum - FV0_C_REGNUM,
2079
           (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2080
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1),
2081
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 2),
2082
           (unsigned) get_frame_register_unsigned (frame, fp_regnum + 3));
2083
    }
2084
 
2085
  else if (regnum >= FPP0_REGNUM && regnum <= FPP_LAST_REGNUM)
2086
    {
2087
      int fp_regnum = sh64_fpp_reg_base_num (gdbarch, regnum);
2088
      fprintf_filtered (file, "fpp%d\t0x%08x\t0x%08x\n", regnum - FPP0_REGNUM,
2089
          (unsigned) get_frame_register_unsigned (frame, fp_regnum),
2090
          (unsigned) get_frame_register_unsigned (frame, fp_regnum + 1));
2091
    }
2092
 
2093
  else if (regnum >= R0_C_REGNUM && regnum <= R_LAST_C_REGNUM)
2094
    {
2095
      int c_regnum = sh64_compact_reg_base_num (gdbarch, regnum);
2096
      fprintf_filtered (file, "r%d_c\t0x%08x\n", regnum - R0_C_REGNUM,
2097
           (unsigned) get_frame_register_unsigned (frame, c_regnum));
2098
    }
2099
  else if (regnum >= FP0_C_REGNUM && regnum <= FP_LAST_C_REGNUM)
2100
    /* This should work also for pseudoregs.  */
2101
    sh64_do_fp_register (gdbarch, file, frame, regnum);
2102
  else if (regnum >= PC_C_REGNUM && regnum <= FPUL_C_REGNUM)
2103
    sh64_do_cr_c_register_info (file, frame, regnum);
2104
}
2105
 
2106
static void
2107
sh64_do_register (struct gdbarch *gdbarch, struct ui_file *file,
2108
                  struct frame_info *frame, int regnum)
2109
{
2110
  unsigned char raw_buffer[MAX_REGISTER_SIZE];
2111
  struct value_print_options opts;
2112
 
2113
  fputs_filtered (gdbarch_register_name (gdbarch, regnum), file);
2114
  print_spaces_filtered (15 - strlen (gdbarch_register_name
2115
                                      (gdbarch, regnum)), file);
2116
 
2117
  /* Get the data in raw format.  */
2118
  if (!frame_register_read (frame, regnum, raw_buffer))
2119
    fprintf_filtered (file, "*value not available*\n");
2120
 
2121
  get_formatted_print_options (&opts, 'x');
2122
  opts.deref_ref = 1;
2123
  val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
2124
             file, 0, NULL, &opts, current_language);
2125
  fprintf_filtered (file, "\t");
2126
  get_formatted_print_options (&opts, 0);
2127
  opts.deref_ref = 1;
2128
  val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0,
2129
             file, 0, NULL, &opts, current_language);
2130
  fprintf_filtered (file, "\n");
2131
}
2132
 
2133
static void
2134
sh64_print_register (struct gdbarch *gdbarch, struct ui_file *file,
2135
                     struct frame_info *frame, int regnum)
2136
{
2137
  if (regnum < 0 || regnum >= gdbarch_num_regs (gdbarch)
2138
                              + gdbarch_num_pseudo_regs (gdbarch))
2139
    internal_error (__FILE__, __LINE__,
2140
                    _("Invalid register number %d\n"), regnum);
2141
 
2142
  else if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch))
2143
    {
2144
      if (TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT)
2145
        sh64_do_fp_register (gdbarch, file, frame, regnum);     /* FP regs */
2146
      else
2147
        sh64_do_register (gdbarch, file, frame, regnum);
2148
    }
2149
 
2150
  else if (regnum < gdbarch_num_regs (gdbarch)
2151
                    + gdbarch_num_pseudo_regs (gdbarch))
2152
    sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2153
}
2154
 
2155
static void
2156
sh64_media_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
2157
                                 struct frame_info *frame, int regnum,
2158
                                 int fpregs)
2159
{
2160
  if (regnum != -1)             /* do one specified register */
2161
    {
2162
      if (*(gdbarch_register_name (gdbarch, regnum)) == '\0')
2163
        error ("Not a valid register for the current processor type");
2164
 
2165
      sh64_print_register (gdbarch, file, frame, regnum);
2166
    }
2167
  else
2168
    /* do all (or most) registers */
2169
    {
2170
      regnum = 0;
2171
      while (regnum < gdbarch_num_regs (gdbarch))
2172
        {
2173
          /* If the register name is empty, it is undefined for this
2174
             processor, so don't display anything.  */
2175
          if (gdbarch_register_name (gdbarch, regnum) == NULL
2176
              || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
2177
            {
2178
              regnum++;
2179
              continue;
2180
            }
2181
 
2182
          if (TYPE_CODE (register_type (gdbarch, regnum))
2183
              == TYPE_CODE_FLT)
2184
            {
2185
              if (fpregs)
2186
                {
2187
                  /* true for "INFO ALL-REGISTERS" command */
2188
                  sh64_do_fp_register (gdbarch, file, frame, regnum);
2189
                  regnum ++;
2190
                }
2191
              else
2192
                regnum += FP_LAST_REGNUM - gdbarch_fp0_regnum (gdbarch);
2193
                /* skip FP regs */
2194
            }
2195
          else
2196
            {
2197
              sh64_do_register (gdbarch, file, frame, regnum);
2198
              regnum++;
2199
            }
2200
        }
2201
 
2202
      if (fpregs)
2203
        while (regnum < gdbarch_num_regs (gdbarch)
2204
                        + gdbarch_num_pseudo_regs (gdbarch))
2205
          {
2206
            sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2207
            regnum++;
2208
          }
2209
    }
2210
}
2211
 
2212
static void
2213
sh64_compact_print_registers_info (struct gdbarch *gdbarch,
2214
                                   struct ui_file *file,
2215
                                   struct frame_info *frame, int regnum,
2216
                                   int fpregs)
2217
{
2218
  if (regnum != -1)             /* do one specified register */
2219
    {
2220
      if (*(gdbarch_register_name (gdbarch, regnum)) == '\0')
2221
        error ("Not a valid register for the current processor type");
2222
 
2223
      if (regnum >= 0 && regnum < R0_C_REGNUM)
2224
        error ("Not a valid register for the current processor mode.");
2225
 
2226
      sh64_print_register (gdbarch, file, frame, regnum);
2227
    }
2228
  else
2229
    /* do all compact registers */
2230
    {
2231
      regnum = R0_C_REGNUM;
2232
      while (regnum < gdbarch_num_regs (gdbarch)
2233
                      + gdbarch_num_pseudo_regs (gdbarch))
2234
        {
2235
          sh64_do_pseudo_register (gdbarch, file, frame, regnum);
2236
          regnum++;
2237
        }
2238
    }
2239
}
2240
 
2241
static void
2242
sh64_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
2243
                           struct frame_info *frame, int regnum, int fpregs)
2244
{
2245
  if (pc_is_isa32 (get_frame_pc (frame)))
2246
    sh64_media_print_registers_info (gdbarch, file, frame, regnum, fpregs);
2247
  else
2248
    sh64_compact_print_registers_info (gdbarch, file, frame, regnum, fpregs);
2249
}
2250
 
2251
static struct sh64_frame_cache *
2252
sh64_alloc_frame_cache (void)
2253
{
2254
  struct sh64_frame_cache *cache;
2255
  int i;
2256
 
2257
  cache = FRAME_OBSTACK_ZALLOC (struct sh64_frame_cache);
2258
 
2259
  /* Base address.  */
2260
  cache->base = 0;
2261
  cache->saved_sp = 0;
2262
  cache->sp_offset = 0;
2263
  cache->pc = 0;
2264
 
2265
  /* Frameless until proven otherwise.  */
2266
  cache->uses_fp = 0;
2267
 
2268
  /* Saved registers.  We initialize these to -1 since zero is a valid
2269
     offset (that's where fp is supposed to be stored).  */
2270
  for (i = 0; i < SIM_SH64_NR_REGS; i++)
2271
    {
2272
      cache->saved_regs[i] = -1;
2273
    }
2274
 
2275
  return cache;
2276
}
2277
 
2278
static struct sh64_frame_cache *
2279
sh64_frame_cache (struct frame_info *this_frame, void **this_cache)
2280
{
2281
  struct gdbarch *gdbarch;
2282
  struct sh64_frame_cache *cache;
2283
  CORE_ADDR current_pc;
2284
  int i;
2285
 
2286
  if (*this_cache)
2287
    return *this_cache;
2288
 
2289
  gdbarch = get_frame_arch (this_frame);
2290
  cache = sh64_alloc_frame_cache ();
2291
  *this_cache = cache;
2292
 
2293
  current_pc = get_frame_pc (this_frame);
2294
  cache->media_mode = pc_is_isa32 (current_pc);
2295
 
2296
  /* In principle, for normal frames, fp holds the frame pointer,
2297
     which holds the base address for the current stack frame.
2298
     However, for functions that don't need it, the frame pointer is
2299
     optional.  For these "frameless" functions the frame pointer is
2300
     actually the frame pointer of the calling frame. */
2301
  cache->base = get_frame_register_unsigned (this_frame, MEDIA_FP_REGNUM);
2302
  if (cache->base == 0)
2303
    return cache;
2304
 
2305
  cache->pc = get_frame_func (this_frame);
2306
  if (cache->pc != 0)
2307
    sh64_analyze_prologue (gdbarch, cache, cache->pc, current_pc);
2308
 
2309
  if (!cache->uses_fp)
2310
    {
2311
      /* We didn't find a valid frame, which means that CACHE->base
2312
         currently holds the frame pointer for our calling frame.  If
2313
         we're at the start of a function, or somewhere half-way its
2314
         prologue, the function's frame probably hasn't been fully
2315
         setup yet.  Try to reconstruct the base address for the stack
2316
         frame by looking at the stack pointer.  For truly "frameless"
2317
         functions this might work too.  */
2318
      cache->base = get_frame_register_unsigned
2319
                    (this_frame, gdbarch_sp_regnum (gdbarch));
2320
    }
2321
 
2322
  /* Now that we have the base address for the stack frame we can
2323
     calculate the value of sp in the calling frame.  */
2324
  cache->saved_sp = cache->base + cache->sp_offset;
2325
 
2326
  /* Adjust all the saved registers such that they contain addresses
2327
     instead of offsets.  */
2328
  for (i = 0; i < SIM_SH64_NR_REGS; i++)
2329
    if (cache->saved_regs[i] != -1)
2330
      cache->saved_regs[i] = cache->saved_sp - cache->saved_regs[i];
2331
 
2332
  return cache;
2333
}
2334
 
2335
static struct value *
2336
sh64_frame_prev_register (struct frame_info *this_frame,
2337
                          void **this_cache, int regnum)
2338
{
2339
  struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2340
  struct gdbarch *gdbarch = get_frame_arch (this_frame);
2341
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2342
 
2343
  gdb_assert (regnum >= 0);
2344
 
2345
  if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
2346
    frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
2347
 
2348
  /* The PC of the previous frame is stored in the PR register of
2349
     the current frame.  Frob regnum so that we pull the value from
2350
     the correct place.  */
2351
  if (regnum == gdbarch_pc_regnum (gdbarch))
2352
    regnum = PR_REGNUM;
2353
 
2354
  if (regnum < SIM_SH64_NR_REGS && cache->saved_regs[regnum] != -1)
2355
    {
2356
      if (gdbarch_tdep (gdbarch)->sh_abi == SH_ABI_32
2357
          && (regnum == MEDIA_FP_REGNUM || regnum == PR_REGNUM))
2358
        {
2359
          CORE_ADDR val;
2360
          val = read_memory_unsigned_integer (cache->saved_regs[regnum],
2361
                                              4, byte_order);
2362
          return frame_unwind_got_constant (this_frame, regnum, val);
2363
        }
2364
 
2365
      return frame_unwind_got_memory (this_frame, regnum,
2366
                                      cache->saved_regs[regnum]);
2367
    }
2368
 
2369
  return frame_unwind_got_register (this_frame, regnum, regnum);
2370
}
2371
 
2372
static void
2373
sh64_frame_this_id (struct frame_info *this_frame, void **this_cache,
2374
                    struct frame_id *this_id)
2375
{
2376
  struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2377
 
2378
  /* This marks the outermost frame.  */
2379
  if (cache->base == 0)
2380
    return;
2381
 
2382
  *this_id = frame_id_build (cache->saved_sp, cache->pc);
2383
}
2384
 
2385
static const struct frame_unwind sh64_frame_unwind = {
2386
  NORMAL_FRAME,
2387
  sh64_frame_this_id,
2388
  sh64_frame_prev_register,
2389
  NULL,
2390
  default_frame_sniffer
2391
};
2392
 
2393
static CORE_ADDR
2394
sh64_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
2395
{
2396
  return frame_unwind_register_unsigned (next_frame,
2397
                                         gdbarch_sp_regnum (gdbarch));
2398
}
2399
 
2400
static CORE_ADDR
2401
sh64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
2402
{
2403
  return frame_unwind_register_unsigned (next_frame,
2404
                                         gdbarch_pc_regnum (gdbarch));
2405
}
2406
 
2407
static struct frame_id
2408
sh64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
2409
{
2410
  CORE_ADDR sp = get_frame_register_unsigned (this_frame,
2411
                                              gdbarch_sp_regnum (gdbarch));
2412
  return frame_id_build (sp, get_frame_pc (this_frame));
2413
}
2414
 
2415
static CORE_ADDR
2416
sh64_frame_base_address (struct frame_info *this_frame, void **this_cache)
2417
{
2418
  struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
2419
 
2420
  return cache->base;
2421
}
2422
 
2423
static const struct frame_base sh64_frame_base = {
2424
  &sh64_frame_unwind,
2425
  sh64_frame_base_address,
2426
  sh64_frame_base_address,
2427
  sh64_frame_base_address
2428
};
2429
 
2430
 
2431
struct gdbarch *
2432
sh64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2433
{
2434
  struct gdbarch *gdbarch;
2435
  struct gdbarch_tdep *tdep;
2436
 
2437
  /* If there is already a candidate, use it.  */
2438
  arches = gdbarch_list_lookup_by_info (arches, &info);
2439
  if (arches != NULL)
2440
    return arches->gdbarch;
2441
 
2442
  /* None found, create a new architecture from the information
2443
     provided.  */
2444
  tdep = XMALLOC (struct gdbarch_tdep);
2445
  gdbarch = gdbarch_alloc (&info, tdep);
2446
 
2447
  /* Determine the ABI */
2448
  if (info.abfd && bfd_get_arch_size (info.abfd) == 64)
2449
    {
2450
      /* If the ABI is the 64-bit one, it can only be sh-media.  */
2451
      tdep->sh_abi = SH_ABI_64;
2452
      set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2453
      set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2454
    }
2455
  else
2456
    {
2457
      /* If the ABI is the 32-bit one it could be either media or
2458
         compact.  */
2459
      tdep->sh_abi = SH_ABI_32;
2460
      set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2461
      set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2462
    }
2463
 
2464
  set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
2465
  set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2466
  set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2467
  set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2468
  set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
2469
  set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2470
  set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
2471
 
2472
  /* The number of real registers is the same whether we are in
2473
     ISA16(compact) or ISA32(media).  */
2474
  set_gdbarch_num_regs (gdbarch, SIM_SH64_NR_REGS);
2475
  set_gdbarch_sp_regnum (gdbarch, 15);
2476
  set_gdbarch_pc_regnum (gdbarch, 64);
2477
  set_gdbarch_fp0_regnum (gdbarch, SIM_SH64_FR0_REGNUM);
2478
  set_gdbarch_num_pseudo_regs (gdbarch, NUM_PSEUDO_REGS_SH_MEDIA
2479
                                        + NUM_PSEUDO_REGS_SH_COMPACT);
2480
 
2481
  set_gdbarch_register_name (gdbarch, sh64_register_name);
2482
  set_gdbarch_register_type (gdbarch, sh64_register_type);
2483
 
2484
  set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read);
2485
  set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write);
2486
 
2487
  set_gdbarch_breakpoint_from_pc (gdbarch, sh64_breakpoint_from_pc);
2488
 
2489
  set_gdbarch_print_insn (gdbarch, print_insn_sh);
2490
  set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno);
2491
 
2492
  set_gdbarch_return_value (gdbarch, sh64_return_value);
2493
 
2494
  set_gdbarch_skip_prologue (gdbarch, sh64_skip_prologue);
2495
  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2496
 
2497
  set_gdbarch_push_dummy_call (gdbarch, sh64_push_dummy_call);
2498
 
2499
  set_gdbarch_believe_pcc_promotion (gdbarch, 1);
2500
 
2501
  set_gdbarch_frame_align (gdbarch, sh64_frame_align);
2502
  set_gdbarch_unwind_sp (gdbarch, sh64_unwind_sp);
2503
  set_gdbarch_unwind_pc (gdbarch, sh64_unwind_pc);
2504
  set_gdbarch_dummy_id (gdbarch, sh64_dummy_id);
2505
  frame_base_set_default (gdbarch, &sh64_frame_base);
2506
 
2507
  set_gdbarch_print_registers_info (gdbarch, sh64_print_registers_info);
2508
 
2509
  set_gdbarch_elf_make_msymbol_special (gdbarch,
2510
                                        sh64_elf_make_msymbol_special);
2511
 
2512
  /* Hook in ABI-specific overrides, if they have been registered.  */
2513
  gdbarch_init_osabi (info, gdbarch);
2514
 
2515
  dwarf2_append_unwinders (gdbarch);
2516
  frame_unwind_append_unwinder (gdbarch, &sh64_frame_unwind);
2517
 
2518
  return gdbarch;
2519
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.