2003-01-03 Andrew Cagney <ac131313@redhat.com>
[binutils-gdb.git] / gdb / sh-tdep.c
1 /* Target-dependent code for Hitachi Super-H, for GDB.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 /*
23 Contributed by Steve Chamberlain
24 sac@cygnus.com
25 */
26
27 #include "defs.h"
28 #include "frame.h"
29 #include "symtab.h"
30 #include "symfile.h"
31 #include "gdbtypes.h"
32 #include "gdbcmd.h"
33 #include "gdbcore.h"
34 #include "value.h"
35 #include "dis-asm.h"
36 #include "inferior.h" /* for BEFORE_TEXT_END etc. */
37 #include "gdb_string.h"
38 #include "arch-utils.h"
39 #include "floatformat.h"
40 #include "regcache.h"
41 #include "doublest.h"
42
43 #include "sh-tdep.h"
44
45 #include "elf-bfd.h"
46 #include "solib-svr4.h"
47
48 /* sh64 flags */
49 #include "elf/sh.h"
50 /* registers numbers shared with the simulator */
51 #include "gdb/sim-sh.h"
52
53 void (*sh_show_regs) (void);
54 CORE_ADDR (*skip_prologue_hard_way) (CORE_ADDR);
55 void (*do_pseudo_register) (int);
56
57 #define SH_DEFAULT_NUM_REGS 59
58
59 /* Define other aspects of the stack frame.
60 we keep a copy of the worked out return pc lying around, since it
61 is a useful bit of info */
62
63 struct frame_extra_info
64 {
65 CORE_ADDR return_pc;
66 int leaf_function;
67 int f_offset;
68 };
69
70 static const char *
71 sh_generic_register_name (int reg_nr)
72 {
73 static char *register_names[] =
74 {
75 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
76 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
77 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
78 "fpul", "fpscr",
79 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
80 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
81 "ssr", "spc",
82 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
83 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
84 };
85 if (reg_nr < 0)
86 return NULL;
87 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
88 return NULL;
89 return register_names[reg_nr];
90 }
91
92 static const char *
93 sh_sh_register_name (int reg_nr)
94 {
95 static char *register_names[] =
96 {
97 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
98 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
99 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
100 "", "",
101 "", "", "", "", "", "", "", "",
102 "", "", "", "", "", "", "", "",
103 "", "",
104 "", "", "", "", "", "", "", "",
105 "", "", "", "", "", "", "", "",
106 };
107 if (reg_nr < 0)
108 return NULL;
109 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
110 return NULL;
111 return register_names[reg_nr];
112 }
113
114 static const char *
115 sh_sh3_register_name (int reg_nr)
116 {
117 static char *register_names[] =
118 {
119 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
120 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
121 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
122 "", "",
123 "", "", "", "", "", "", "", "",
124 "", "", "", "", "", "", "", "",
125 "ssr", "spc",
126 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
127 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1"
128 };
129 if (reg_nr < 0)
130 return NULL;
131 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
132 return NULL;
133 return register_names[reg_nr];
134 }
135
136 static const char *
137 sh_sh3e_register_name (int reg_nr)
138 {
139 static char *register_names[] =
140 {
141 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
142 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
143 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
144 "fpul", "fpscr",
145 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
146 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
147 "ssr", "spc",
148 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
149 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
150 };
151 if (reg_nr < 0)
152 return NULL;
153 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
154 return NULL;
155 return register_names[reg_nr];
156 }
157
158 static const char *
159 sh_sh_dsp_register_name (int reg_nr)
160 {
161 static char *register_names[] =
162 {
163 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
164 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
165 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
166 "", "dsr",
167 "a0g", "a0", "a1g", "a1", "m0", "m1", "x0", "x1",
168 "y0", "y1", "", "", "", "", "", "mod",
169 "", "",
170 "rs", "re", "", "", "", "", "", "",
171 "", "", "", "", "", "", "", "",
172 };
173 if (reg_nr < 0)
174 return NULL;
175 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
176 return NULL;
177 return register_names[reg_nr];
178 }
179
180 static const char *
181 sh_sh3_dsp_register_name (int reg_nr)
182 {
183 static char *register_names[] =
184 {
185 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
186 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
187 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
188 "", "dsr",
189 "a0g", "a0", "a1g", "a1", "m0", "m1", "x0", "x1",
190 "y0", "y1", "", "", "", "", "", "mod",
191 "ssr", "spc",
192 "rs", "re", "", "", "", "", "", "",
193 "r0b", "r1b", "r2b", "r3b", "r4b", "r5b", "r6b", "r7b"
194 "", "", "", "", "", "", "", "",
195 };
196 if (reg_nr < 0)
197 return NULL;
198 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
199 return NULL;
200 return register_names[reg_nr];
201 }
202
203 static const char *
204 sh_sh4_register_name (int reg_nr)
205 {
206 static char *register_names[] =
207 {
208 /* general registers 0-15 */
209 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
210 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
211 /* 16 - 22 */
212 "pc", "pr", "gbr", "vbr", "mach", "macl", "sr",
213 /* 23, 24 */
214 "fpul", "fpscr",
215 /* floating point registers 25 - 40 */
216 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
217 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
218 /* 41, 42 */
219 "ssr", "spc",
220 /* bank 0 43 - 50 */
221 "r0b0", "r1b0", "r2b0", "r3b0", "r4b0", "r5b0", "r6b0", "r7b0",
222 /* bank 1 51 - 58 */
223 "r0b1", "r1b1", "r2b1", "r3b1", "r4b1", "r5b1", "r6b1", "r7b1",
224 /* double precision (pseudo) 59 - 66 */
225 "dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14",
226 /* vectors (pseudo) 67 - 70 */
227 "fv0", "fv4", "fv8", "fv12",
228 /* FIXME: missing XF 71 - 86 */
229 /* FIXME: missing XD 87 - 94 */
230 };
231 if (reg_nr < 0)
232 return NULL;
233 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
234 return NULL;
235 return register_names[reg_nr];
236 }
237
238 static const char *
239 sh_sh64_register_name (int reg_nr)
240 {
241 static char *register_names[] =
242 {
243 /* SH MEDIA MODE (ISA 32) */
244 /* general registers (64-bit) 0-63 */
245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
246 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
247 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
248 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
249 "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
250 "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
251 "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
252 "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",
253
254 /* pc (64-bit) 64 */
255 "pc",
256
257 /* status reg., saved status reg., saved pc reg. (64-bit) 65-67 */
258 "sr", "ssr", "spc",
259
260 /* target registers (64-bit) 68-75*/
261 "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7",
262
263 /* floating point state control register (32-bit) 76 */
264 "fpscr",
265
266 /* single precision floating point registers (32-bit) 77-140*/
267 "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
268 "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
269 "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
270 "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31",
271 "fr32", "fr33", "fr34", "fr35", "fr36", "fr37", "fr38", "fr39",
272 "fr40", "fr41", "fr42", "fr43", "fr44", "fr45", "fr46", "fr47",
273 "fr48", "fr49", "fr50", "fr51", "fr52", "fr53", "fr54", "fr55",
274 "fr56", "fr57", "fr58", "fr59", "fr60", "fr61", "fr62", "fr63",
275
276 /* double precision registers (pseudo) 141-172 */
277 "dr0", "dr2", "dr4", "dr6", "dr8", "dr10", "dr12", "dr14",
278 "dr16", "dr18", "dr20", "dr22", "dr24", "dr26", "dr28", "dr30",
279 "dr32", "dr34", "dr36", "dr38", "dr40", "dr42", "dr44", "dr46",
280 "dr48", "dr50", "dr52", "dr54", "dr56", "dr58", "dr60", "dr62",
281
282 /* floating point pairs (pseudo) 173-204*/
283 "fp0", "fp2", "fp4", "fp6", "fp8", "fp10", "fp12", "fp14",
284 "fp16", "fp18", "fp20", "fp22", "fp24", "fp26", "fp28", "fp30",
285 "fp32", "fp34", "fp36", "fp38", "fp40", "fp42", "fp44", "fp46",
286 "fp48", "fp50", "fp52", "fp54", "fp56", "fp58", "fp60", "fp62",
287
288 /* floating point vectors (4 floating point regs) (pseudo) 205-220*/
289 "fv0", "fv4", "fv8", "fv12", "fv16", "fv20", "fv24", "fv28",
290 "fv32", "fv36", "fv40", "fv44", "fv48", "fv52", "fv56", "fv60",
291
292 /* SH COMPACT MODE (ISA 16) (all pseudo) 221-272*/
293 "r0_c", "r1_c", "r2_c", "r3_c", "r4_c", "r5_c", "r6_c", "r7_c",
294 "r8_c", "r9_c", "r10_c", "r11_c", "r12_c", "r13_c", "r14_c", "r15_c",
295 "pc_c",
296 "gbr_c", "mach_c", "macl_c", "pr_c", "t_c",
297 "fpscr_c", "fpul_c",
298 "fr0_c", "fr1_c", "fr2_c", "fr3_c", "fr4_c", "fr5_c", "fr6_c", "fr7_c",
299 "fr8_c", "fr9_c", "fr10_c", "fr11_c", "fr12_c", "fr13_c", "fr14_c", "fr15_c",
300 "dr0_c", "dr2_c", "dr4_c", "dr6_c", "dr8_c", "dr10_c", "dr12_c", "dr14_c",
301 "fv0_c", "fv4_c", "fv8_c", "fv12_c",
302 /* FIXME!!!! XF0 XF15, XD0 XD14 ?????*/
303 };
304
305 if (reg_nr < 0)
306 return NULL;
307 if (reg_nr >= (sizeof (register_names) / sizeof (*register_names)))
308 return NULL;
309 return register_names[reg_nr];
310 }
311
312 #define NUM_PSEUDO_REGS_SH_MEDIA 80
313 #define NUM_PSEUDO_REGS_SH_COMPACT 51
314
315 static const unsigned char *
316 sh_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
317 {
318 /* 0xc3c3 is trapa #c3, and it works in big and little endian modes */
319 static unsigned char breakpoint[] = {0xc3, 0xc3};
320
321 *lenptr = sizeof (breakpoint);
322 return breakpoint;
323 }
324
325 /* Macros and functions for setting and testing a bit in a minimal
326 symbol that marks it as 32-bit function. The MSB of the minimal
327 symbol's "info" field is used for this purpose. This field is
328 already being used to store the symbol size, so the assumption is
329 that the symbol size cannot exceed 2^31.
330
331 ELF_MAKE_MSYMBOL_SPECIAL
332 tests whether an ELF symbol is "special", i.e. refers
333 to a 32-bit function, and sets a "special" bit in a
334 minimal symbol to mark it as a 32-bit function
335 MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol
336 MSYMBOL_SIZE returns the size of the minimal symbol, i.e.
337 the "info" field with the "special" bit masked out */
338
339 #define MSYMBOL_IS_SPECIAL(msym) \
340 (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
341
342 void
343 sh64_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
344 {
345 if (msym == NULL)
346 return;
347
348 if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_SH5_ISA32)
349 {
350 MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000);
351 SYMBOL_VALUE_ADDRESS (msym) |= 1;
352 }
353 }
354
355 /* ISA32 (shmedia) function addresses are odd (bit 0 is set). Here
356 are some macros to test, set, or clear bit 0 of addresses. */
357 #define IS_ISA32_ADDR(addr) ((addr) & 1)
358 #define MAKE_ISA32_ADDR(addr) ((addr) | 1)
359 #define UNMAKE_ISA32_ADDR(addr) ((addr) & ~1)
360
361 static int
362 pc_is_isa32 (bfd_vma memaddr)
363 {
364 struct minimal_symbol *sym;
365
366 /* If bit 0 of the address is set, assume this is a
367 ISA32 (shmedia) address. */
368 if (IS_ISA32_ADDR (memaddr))
369 return 1;
370
371 /* A flag indicating that this is a ISA32 function is stored by elfread.c in
372 the high bit of the info field. Use this to decide if the function is
373 ISA16 or ISA32. */
374 sym = lookup_minimal_symbol_by_pc (memaddr);
375 if (sym)
376 return MSYMBOL_IS_SPECIAL (sym);
377 else
378 return 0;
379 }
380
381 static const unsigned char *
382 sh_sh64_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
383 {
384 /* The BRK instruction for shmedia is
385 01101111 11110101 11111111 11110000
386 which translates in big endian mode to 0x6f, 0xf5, 0xff, 0xf0
387 and in little endian mode to 0xf0, 0xff, 0xf5, 0x6f */
388
389 /* The BRK instruction for shcompact is
390 00000000 00111011
391 which translates in big endian mode to 0x0, 0x3b
392 and in little endian mode to 0x3b, 0x0*/
393
394 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
395 {
396 if (pc_is_isa32 (*pcptr))
397 {
398 static unsigned char big_breakpoint_media[] = {0x6f, 0xf5, 0xff, 0xf0};
399 *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
400 *lenptr = sizeof (big_breakpoint_media);
401 return big_breakpoint_media;
402 }
403 else
404 {
405 static unsigned char big_breakpoint_compact[] = {0x0, 0x3b};
406 *lenptr = sizeof (big_breakpoint_compact);
407 return big_breakpoint_compact;
408 }
409 }
410 else
411 {
412 if (pc_is_isa32 (*pcptr))
413 {
414 static unsigned char little_breakpoint_media[] = {0xf0, 0xff, 0xf5, 0x6f};
415 *pcptr = UNMAKE_ISA32_ADDR (*pcptr);
416 *lenptr = sizeof (little_breakpoint_media);
417 return little_breakpoint_media;
418 }
419 else
420 {
421 static unsigned char little_breakpoint_compact[] = {0x3b, 0x0};
422 *lenptr = sizeof (little_breakpoint_compact);
423 return little_breakpoint_compact;
424 }
425 }
426 }
427
428 /* Prologue looks like
429 [mov.l <regs>,@-r15]...
430 [sts.l pr,@-r15]
431 [mov.l r14,@-r15]
432 [mov r15,r14]
433
434 Actually it can be more complicated than this. For instance, with
435 newer gcc's:
436
437 mov.l r14,@-r15
438 add #-12,r15
439 mov r15,r14
440 mov r4,r1
441 mov r5,r2
442 mov.l r6,@(4,r14)
443 mov.l r7,@(8,r14)
444 mov.b r1,@r14
445 mov r14,r1
446 mov r14,r1
447 add #2,r1
448 mov.w r2,@r1
449
450 */
451
452 /* PTABS/L Rn, TRa 0110101111110001nnnnnnl00aaa0000
453 with l=1 and n = 18 0110101111110001010010100aaa0000 */
454 #define IS_PTABSL_R18(x) (((x) & 0xffffff8f) == 0x6bf14a00)
455
456 /* STS.L PR,@-r0 0100000000100010
457 r0-4-->r0, PR-->(r0) */
458 #define IS_STS_R0(x) ((x) == 0x4022)
459
460 /* STS PR, Rm 0000mmmm00101010
461 PR-->Rm */
462 #define IS_STS_PR(x) (((x) & 0xf0ff) == 0x2a)
463
464 /* MOV.L Rm,@(disp,r15) 00011111mmmmdddd
465 Rm-->(dispx4+r15) */
466 #define IS_MOV_TO_R15(x) (((x) & 0xff00) == 0x1f00)
467
468 /* MOV.L R14,@(disp,r15) 000111111110dddd
469 R14-->(dispx4+r15) */
470 #define IS_MOV_R14(x) (((x) & 0xfff0) == 0x1fe0)
471
472 /* ST.Q R14, disp, R18 101011001110dddddddddd0100100000
473 R18-->(dispx8+R14) */
474 #define IS_STQ_R18_R14(x) (((x) & 0xfff003ff) == 0xace00120)
475
476 /* ST.Q R15, disp, R18 101011001111dddddddddd0100100000
477 R18-->(dispx8+R15) */
478 #define IS_STQ_R18_R15(x) (((x) & 0xfff003ff) == 0xacf00120)
479
480 /* ST.L R15, disp, R18 101010001111dddddddddd0100100000
481 R18-->(dispx4+R15) */
482 #define IS_STL_R18_R15(x) (((x) & 0xfff003ff) == 0xa8f00120)
483
484 /* ST.Q R15, disp, R14 1010 1100 1111 dddd dddd dd00 1110 0000
485 R14-->(dispx8+R15) */
486 #define IS_STQ_R14_R15(x) (((x) & 0xfff003ff) == 0xacf000e0)
487
488 /* ST.L R15, disp, R14 1010 1000 1111 dddd dddd dd00 1110 0000
489 R14-->(dispx4+R15) */
490 #define IS_STL_R14_R15(x) (((x) & 0xfff003ff) == 0xa8f000e0)
491
492 /* ADDI.L R15,imm,R15 1101 0100 1111 ssss ssss ss00 1111 0000
493 R15 + imm --> R15 */
494 #define IS_ADDIL_SP_MEDIA(x) (((x) & 0xfff003ff) == 0xd4f000f0)
495
496 /* ADDI R15,imm,R15 1101 0000 1111 ssss ssss ss00 1111 0000
497 R15 + imm --> R15 */
498 #define IS_ADDI_SP_MEDIA(x) (((x) & 0xfff003ff) == 0xd0f000f0)
499
500 /* ADD.L R15,R63,R14 0000 0000 1111 1000 1111 1100 1110 0000
501 R15 + R63 --> R14 */
502 #define IS_ADDL_SP_FP_MEDIA(x) ((x) == 0x00f8fce0)
503
504 /* ADD R15,R63,R14 0000 0000 1111 1001 1111 1100 1110 0000
505 R15 + R63 --> R14 */
506 #define IS_ADD_SP_FP_MEDIA(x) ((x) == 0x00f9fce0)
507
508 #define IS_MOV_SP_FP_MEDIA(x) (IS_ADDL_SP_FP_MEDIA(x) || IS_ADD_SP_FP_MEDIA(x))
509
510 /* MOV #imm, R0 1110 0000 ssss ssss
511 #imm-->R0 */
512 #define IS_MOV_R0(x) (((x) & 0xff00) == 0xe000)
513
514 /* MOV.L @(disp,PC), R0 1101 0000 iiii iiii */
515 #define IS_MOVL_R0(x) (((x) & 0xff00) == 0xd000)
516
517 /* ADD r15,r0 0011 0000 1111 1100
518 r15+r0-->r0 */
519 #define IS_ADD_SP_R0(x) ((x) == 0x30fc)
520
521 /* MOV.L R14 @-R0 0010 0000 1110 0110
522 R14-->(R0-4), R0-4-->R0 */
523 #define IS_MOV_R14_R0(x) ((x) == 0x20e6)
524
525 /* ADD Rm,R63,Rn Rm+R63-->Rn 0000 00mm mmmm 1001 1111 11nn nnnn 0000
526 where Rm is one of r2-r9 which are the argument registers. */
527 /* FIXME: Recognize the float and double register moves too! */
528 #define IS_MEDIA_IND_ARG_MOV(x) \
529 ((((x) & 0xfc0ffc0f) == 0x0009fc00) && (((x) & 0x03f00000) >= 0x00200000 && ((x) & 0x03f00000) <= 0x00900000))
530
531 /* ST.Q Rn,0,Rm Rm-->Rn+0 1010 11nn nnnn 0000 0000 00mm mmmm 0000
532 or ST.L Rn,0,Rm Rm-->Rn+0 1010 10nn nnnn 0000 0000 00mm mmmm 0000
533 where Rm is one of r2-r9 which are the argument registers. */
534 #define IS_MEDIA_ARG_MOV(x) \
535 (((((x) & 0xfc0ffc0f) == 0xac000000) || (((x) & 0xfc0ffc0f) == 0xa8000000)) \
536 && (((x) & 0x000003f0) >= 0x00000020 && ((x) & 0x000003f0) <= 0x00000090))
537
538 /* ST.B R14,0,Rn Rn-->(R14+0) 1010 0000 1110 0000 0000 00nn nnnn 0000*/
539 /* ST.W R14,0,Rn Rn-->(R14+0) 1010 0100 1110 0000 0000 00nn nnnn 0000*/
540 /* ST.L R14,0,Rn Rn-->(R14+0) 1010 1000 1110 0000 0000 00nn nnnn 0000*/
541 /* FST.S R14,0,FRn Rn-->(R14+0) 1011 0100 1110 0000 0000 00nn nnnn 0000*/
542 /* FST.D R14,0,DRn Rn-->(R14+0) 1011 1100 1110 0000 0000 00nn nnnn 0000*/
543 #define IS_MEDIA_MOV_TO_R14(x) \
544 ((((x) & 0xfffffc0f) == 0xa0e00000) \
545 || (((x) & 0xfffffc0f) == 0xa4e00000) \
546 || (((x) & 0xfffffc0f) == 0xa8e00000) \
547 || (((x) & 0xfffffc0f) == 0xb4e00000) \
548 || (((x) & 0xfffffc0f) == 0xbce00000))
549
550 /* MOV Rm, Rn Rm-->Rn 0110 nnnn mmmm 0011
551 where Rm is r2-r9 */
552 #define IS_COMPACT_IND_ARG_MOV(x) \
553 ((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0020) && (((x) & 0x00f0) <= 0x0090))
554
555 /* compact direct arg move!
556 MOV.L Rn, @r14 0010 1110 mmmm 0010 */
557 #define IS_COMPACT_ARG_MOV(x) \
558 (((((x) & 0xff0f) == 0x2e02) && (((x) & 0x00f0) >= 0x0020) && ((x) & 0x00f0) <= 0x0090))
559
560 /* MOV.B Rm, @R14 0010 1110 mmmm 0000
561 MOV.W Rm, @R14 0010 1110 mmmm 0001 */
562 #define IS_COMPACT_MOV_TO_R14(x) \
563 ((((x) & 0xff0f) == 0x2e00) || (((x) & 0xff0f) == 0x2e01))
564
565 #define IS_JSR_R0(x) ((x) == 0x400b)
566 #define IS_NOP(x) ((x) == 0x0009)
567
568
569 /* STS.L PR,@-r15 0100111100100010
570 r15-4-->r15, PR-->(r15) */
571 #define IS_STS(x) ((x) == 0x4f22)
572
573 /* MOV.L Rm,@-r15 00101111mmmm0110
574 r15-4-->r15, Rm-->(R15) */
575 #define IS_PUSH(x) (((x) & 0xff0f) == 0x2f06)
576
577 #define GET_PUSHED_REG(x) (((x) >> 4) & 0xf)
578
579 /* MOV r15,r14 0110111011110011
580 r15-->r14 */
581 #define IS_MOV_SP_FP(x) ((x) == 0x6ef3)
582
583 /* ADD #imm,r15 01111111iiiiiiii
584 r15+imm-->r15 */
585 #define IS_ADD_SP(x) (((x) & 0xff00) == 0x7f00)
586
587 #define IS_MOV_R3(x) (((x) & 0xff00) == 0x1a00)
588 #define IS_SHLL_R3(x) ((x) == 0x4300)
589
590 /* ADD r3,r15 0011111100111100
591 r15+r3-->r15 */
592 #define IS_ADD_R3SP(x) ((x) == 0x3f3c)
593
594 /* FMOV.S FRm,@-Rn Rn-4-->Rn, FRm-->(Rn) 1111nnnnmmmm1011
595 FMOV DRm,@-Rn Rn-8-->Rn, DRm-->(Rn) 1111nnnnmmm01011
596 FMOV XDm,@-Rn Rn-8-->Rn, XDm-->(Rn) 1111nnnnmmm11011 */
597 #define IS_FMOV(x) (((x) & 0xf00f) == 0xf00b)
598
599 /* MOV Rm,Rn Rm-->Rn 0110nnnnmmmm0011
600 MOV.L Rm,@(disp,Rn) Rm-->(dispx4+Rn) 0001nnnnmmmmdddd
601 MOV.L Rm,@Rn Rm-->(Rn) 0010nnnnmmmm0010
602 where Rm is one of r4,r5,r6,r7 which are the argument registers. */
603 #define IS_ARG_MOV(x) \
604 (((((x) & 0xf00f) == 0x6003) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)) \
605 || ((((x) & 0xf000) == 0x1000) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)) \
606 || ((((x) & 0xf00f) == 0x2002) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070)))
607
608 /* MOV.L Rm,@(disp,r14) 00011110mmmmdddd
609 Rm-->(dispx4+r14) where Rm is one of r4,r5,r6,r7 */
610 #define IS_MOV_TO_R14(x) \
611 ((((x) & 0xff00) == 0x1e) && (((x) & 0x00f0) >= 0x0040 && ((x) & 0x00f0) <= 0x0070))
612
613 #define FPSCR_SZ (1 << 20)
614
615 /* Skip any prologue before the guts of a function */
616
617 /* Skip the prologue using the debug information. If this fails we'll
618 fall back on the 'guess' method below. */
619 static CORE_ADDR
620 after_prologue (CORE_ADDR pc)
621 {
622 struct symtab_and_line sal;
623 CORE_ADDR func_addr, func_end;
624
625 /* If we can not find the symbol in the partial symbol table, then
626 there is no hope we can determine the function's start address
627 with this code. */
628 if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
629 return 0;
630
631 /* Get the line associated with FUNC_ADDR. */
632 sal = find_pc_line (func_addr, 0);
633
634 /* There are only two cases to consider. First, the end of the source line
635 is within the function bounds. In that case we return the end of the
636 source line. Second is the end of the source line extends beyond the
637 bounds of the current function. We need to use the slow code to
638 examine instructions in that case. */
639 if (sal.end < func_end)
640 return sal.end;
641 else
642 return 0;
643 }
644
645 /* Here we look at each instruction in the function, and try to guess
646 where the prologue ends. Unfortunately this is not always
647 accurate. */
648 static CORE_ADDR
649 sh_skip_prologue_hard_way (CORE_ADDR start_pc)
650 {
651 CORE_ADDR here, end;
652 int updated_fp = 0;
653
654 if (!start_pc)
655 return 0;
656
657 for (here = start_pc, end = start_pc + (2 * 28); here < end;)
658 {
659 int w = read_memory_integer (here, 2);
660 here += 2;
661 if (IS_FMOV (w) || IS_PUSH (w) || IS_STS (w) || IS_MOV_R3 (w)
662 || IS_ADD_R3SP (w) || IS_ADD_SP (w) || IS_SHLL_R3 (w)
663 || IS_ARG_MOV (w) || IS_MOV_TO_R14 (w))
664 {
665 start_pc = here;
666 }
667 else if (IS_MOV_SP_FP (w))
668 {
669 start_pc = here;
670 updated_fp = 1;
671 }
672 else
673 /* Don't bail out yet, if we are before the copy of sp. */
674 if (updated_fp)
675 break;
676 }
677
678 return start_pc;
679 }
680
681 static CORE_ADDR
682 look_for_args_moves (CORE_ADDR start_pc, int media_mode)
683 {
684 CORE_ADDR here, end;
685 int w;
686 int insn_size = (media_mode ? 4 : 2);
687
688 for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
689 {
690 if (media_mode)
691 {
692 w = read_memory_integer (UNMAKE_ISA32_ADDR (here), insn_size);
693 here += insn_size;
694 if (IS_MEDIA_IND_ARG_MOV (w))
695 {
696 /* This must be followed by a store to r14, so the argument
697 is where the debug info says it is. This can happen after
698 the SP has been saved, unfortunately. */
699
700 int next_insn = read_memory_integer (UNMAKE_ISA32_ADDR (here),
701 insn_size);
702 here += insn_size;
703 if (IS_MEDIA_MOV_TO_R14 (next_insn))
704 start_pc = here;
705 }
706 else if (IS_MEDIA_ARG_MOV (w))
707 {
708 /* These instructions store directly the argument in r14. */
709 start_pc = here;
710 }
711 else
712 break;
713 }
714 else
715 {
716 w = read_memory_integer (here, insn_size);
717 w = w & 0xffff;
718 here += insn_size;
719 if (IS_COMPACT_IND_ARG_MOV (w))
720 {
721 /* This must be followed by a store to r14, so the argument
722 is where the debug info says it is. This can happen after
723 the SP has been saved, unfortunately. */
724
725 int next_insn = 0xffff & read_memory_integer (here, insn_size);
726 here += insn_size;
727 if (IS_COMPACT_MOV_TO_R14 (next_insn))
728 start_pc = here;
729 }
730 else if (IS_COMPACT_ARG_MOV (w))
731 {
732 /* These instructions store directly the argument in r14. */
733 start_pc = here;
734 }
735 else if (IS_MOVL_R0 (w))
736 {
737 /* There is a function that gcc calls to get the arguments
738 passed correctly to the function. Only after this
739 function call the arguments will be found at the place
740 where they are supposed to be. This happens in case the
741 argument has to be stored into a 64-bit register (for
742 instance doubles, long longs). SHcompact doesn't have
743 access to the full 64-bits, so we store the register in
744 stack slot and store the address of the stack slot in
745 the register, then do a call through a wrapper that
746 loads the memory value into the register. A SHcompact
747 callee calls an argument decoder
748 (GCC_shcompact_incoming_args) that stores the 64-bit
749 value in a stack slot and stores the address of the
750 stack slot in the register. GCC thinks the argument is
751 just passed by transparent reference, but this is only
752 true after the argument decoder is called. Such a call
753 needs to be considered part of the prologue. */
754
755 /* This must be followed by a JSR @r0 instruction and by
756 a NOP instruction. After these, the prologue is over! */
757
758 int next_insn = 0xffff & read_memory_integer (here, insn_size);
759 here += insn_size;
760 if (IS_JSR_R0 (next_insn))
761 {
762 next_insn = 0xffff & read_memory_integer (here, insn_size);
763 here += insn_size;
764
765 if (IS_NOP (next_insn))
766 start_pc = here;
767 }
768 }
769 else
770 break;
771 }
772 }
773
774 return start_pc;
775 }
776
777 static CORE_ADDR
778 sh64_skip_prologue_hard_way (CORE_ADDR start_pc)
779 {
780 CORE_ADDR here, end;
781 int updated_fp = 0;
782 int insn_size = 4;
783 int media_mode = 1;
784
785 if (!start_pc)
786 return 0;
787
788 if (pc_is_isa32 (start_pc) == 0)
789 {
790 insn_size = 2;
791 media_mode = 0;
792 }
793
794 for (here = start_pc, end = start_pc + (insn_size * 28); here < end;)
795 {
796
797 if (media_mode)
798 {
799 int w = read_memory_integer (UNMAKE_ISA32_ADDR (here), insn_size);
800 here += insn_size;
801 if (IS_STQ_R18_R14 (w) || IS_STQ_R18_R15 (w) || IS_STQ_R14_R15 (w)
802 || IS_STL_R14_R15 (w) || IS_STL_R18_R15 (w)
803 || IS_ADDIL_SP_MEDIA (w) || IS_ADDI_SP_MEDIA (w) || IS_PTABSL_R18 (w))
804 {
805 start_pc = here;
806 }
807 else if (IS_MOV_SP_FP (w) || IS_MOV_SP_FP_MEDIA(w))
808 {
809 start_pc = here;
810 updated_fp = 1;
811 }
812 else
813 if (updated_fp)
814 {
815 /* Don't bail out yet, we may have arguments stored in
816 registers here, according to the debug info, so that
817 gdb can print the frames correctly. */
818 start_pc = look_for_args_moves (here - insn_size, media_mode);
819 break;
820 }
821 }
822 else
823 {
824 int w = 0xffff & read_memory_integer (here, insn_size);
825 here += insn_size;
826
827 if (IS_STS_R0 (w) || IS_STS_PR (w)
828 || IS_MOV_TO_R15 (w) || IS_MOV_R14 (w)
829 || IS_MOV_R0 (w) || IS_ADD_SP_R0 (w) || IS_MOV_R14_R0 (w))
830 {
831 start_pc = here;
832 }
833 else if (IS_MOV_SP_FP (w))
834 {
835 start_pc = here;
836 updated_fp = 1;
837 }
838 else
839 if (updated_fp)
840 {
841 /* Don't bail out yet, we may have arguments stored in
842 registers here, according to the debug info, so that
843 gdb can print the frames correctly. */
844 start_pc = look_for_args_moves (here - insn_size, media_mode);
845 break;
846 }
847 }
848 }
849
850 return start_pc;
851 }
852
853 static CORE_ADDR
854 sh_skip_prologue (CORE_ADDR pc)
855 {
856 CORE_ADDR post_prologue_pc;
857
858 /* See if we can determine the end of the prologue via the symbol table.
859 If so, then return either PC, or the PC after the prologue, whichever
860 is greater. */
861 post_prologue_pc = after_prologue (pc);
862
863 /* If after_prologue returned a useful address, then use it. Else
864 fall back on the instruction skipping code. */
865 if (post_prologue_pc != 0)
866 return max (pc, post_prologue_pc);
867 else
868 return (skip_prologue_hard_way (pc));
869 }
870
871 /* Immediately after a function call, return the saved pc.
872 Can't always go through the frames for this because on some machines
873 the new frame is not set up until the new function executes
874 some instructions.
875
876 The return address is the value saved in the PR register + 4 */
877 static CORE_ADDR
878 sh_saved_pc_after_call (struct frame_info *frame)
879 {
880 return (ADDR_BITS_REMOVE (read_register (gdbarch_tdep (current_gdbarch)->PR_REGNUM)));
881 }
882
883 /* Should call_function allocate stack space for a struct return? */
884 static int
885 sh_use_struct_convention (int gcc_p, struct type *type)
886 {
887 #if 0
888 return (TYPE_LENGTH (type) > 1);
889 #else
890 int len = TYPE_LENGTH (type);
891 int nelem = TYPE_NFIELDS (type);
892 return ((len != 1 && len != 2 && len != 4 && len != 8) || nelem != 1) &&
893 (len != 8 || TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)) != 4);
894 #endif
895 }
896
897 static int
898 sh64_use_struct_convention (int gcc_p, struct type *type)
899 {
900 return (TYPE_LENGTH (type) > 8);
901 }
902
903 /* Store the address of the place in which to copy the structure the
904 subroutine will return. This is called from call_function.
905
906 We store structs through a pointer passed in R2 */
907 static void
908 sh_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
909 {
910 write_register (STRUCT_RETURN_REGNUM, (addr));
911 }
912
913 /* Disassemble an instruction. */
914 static int
915 gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info)
916 {
917 info->endian = TARGET_BYTE_ORDER;
918 return print_insn_sh (memaddr, info);
919 }
920
921 /* Given a GDB frame, determine the address of the calling function's
922 frame. This will be used to create a new GDB frame struct, and
923 then INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC will be
924 called for the new frame.
925
926 For us, the frame address is its stack pointer value, so we look up
927 the function prologue to determine the caller's sp value, and return it. */
928 static CORE_ADDR
929 sh_frame_chain (struct frame_info *frame)
930 {
931 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
932 return frame->frame; /* dummy frame same as caller's frame */
933 if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
934 return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, 4);
935 else
936 return 0;
937 }
938
939 /* Given a register number RN as it appears in an assembly
940 instruction, find the corresponding register number in the GDB
941 scheme. */
942 static int
943 translate_insn_rn (int rn, int media_mode)
944 {
945 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
946
947 /* FIXME: this assumes that the number rn is for a not pseudo
948 register only. */
949 if (media_mode)
950 return rn;
951 else
952 {
953 /* These registers don't have a corresponding compact one. */
954 /* FIXME: This is probably not enough. */
955 #if 0
956 if ((rn >= 16 && rn <= 63) || (rn >= 93 && rn <= 140))
957 return rn;
958 #endif
959 if (rn >= 0 && rn <= tdep->R0_C_REGNUM)
960 return tdep->R0_C_REGNUM + rn;
961 else
962 return rn;
963 }
964 }
965
966 static CORE_ADDR
967 sh64_frame_chain (struct frame_info *frame)
968 {
969 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
970 return frame->frame; /* dummy frame same as caller's frame */
971 if (get_frame_pc (frame) && !inside_entry_file (get_frame_pc (frame)))
972 {
973 int media_mode = pc_is_isa32 (get_frame_pc (frame));
974 int size;
975 if (gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32)
976 size = 4;
977 else
978 size = REGISTER_RAW_SIZE (translate_insn_rn (FP_REGNUM, media_mode));
979 return read_memory_integer (get_frame_base (frame) + frame->extra_info->f_offset, size);
980 }
981 else
982 return 0;
983 }
984
985 /* Find REGNUM on the stack. Otherwise, it's in an active register. One thing
986 we might want to do here is to check REGNUM against the clobber mask, and
987 somehow flag it as invalid if it isn't saved on the stack somewhere. This
988 would provide a graceful failure mode when trying to get the value of
989 caller-saves registers for an inner frame. */
990 static CORE_ADDR
991 sh_find_callers_reg (struct frame_info *fi, int regnum)
992 {
993 for (; fi; fi = fi->next)
994 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), fi->frame, fi->frame))
995 /* When the caller requests PR from the dummy frame, we return PC because
996 that's where the previous routine appears to have done a call from. */
997 return deprecated_read_register_dummy (get_frame_pc (fi), fi->frame, regnum);
998 else
999 {
1000 FRAME_INIT_SAVED_REGS (fi);
1001 if (!get_frame_pc (fi))
1002 return 0;
1003 if (get_frame_saved_regs (fi)[regnum] != 0)
1004 return read_memory_integer (get_frame_saved_regs (fi)[regnum],
1005 REGISTER_RAW_SIZE (regnum));
1006 }
1007 return read_register (regnum);
1008 }
1009
1010 static CORE_ADDR
1011 sh64_get_saved_pr (struct frame_info *fi, int pr_regnum)
1012 {
1013 int media_mode = 0;
1014
1015 for (; fi; fi = fi->next)
1016 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), fi->frame, fi->frame))
1017 /* When the caller requests PR from the dummy frame, we return PC because
1018 that's where the previous routine appears to have done a call from. */
1019 return deprecated_read_register_dummy (get_frame_pc (fi), fi->frame, pr_regnum);
1020 else
1021 {
1022 FRAME_INIT_SAVED_REGS (fi);
1023 if (!get_frame_pc (fi))
1024 return 0;
1025
1026 media_mode = pc_is_isa32 (get_frame_pc (fi));
1027
1028 if (get_frame_saved_regs (fi)[pr_regnum] != 0)
1029 {
1030 int gdb_reg_num = translate_insn_rn (pr_regnum, media_mode);
1031 int size = ((gdbarch_tdep (current_gdbarch)->sh_abi == SH_ABI_32)
1032 ? 4
1033 : REGISTER_RAW_SIZE (gdb_reg_num));
1034 return read_memory_integer (get_frame_saved_regs (fi)[pr_regnum], size);
1035 }
1036 }
1037 return read_register (pr_regnum);
1038 }
1039
1040 /* Put here the code to store, into a struct frame_saved_regs, the
1041 addresses of the saved registers of frame described by FRAME_INFO.
1042 This includes special registers such as pc and fp saved in special
1043 ways in the stack frame. sp is even more special: the address we
1044 return for it IS the sp for the next frame. */
1045 static void
1046 sh_nofp_frame_init_saved_regs (struct frame_info *fi)
1047 {
1048 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof(int));
1049 int rn;
1050 int have_fp = 0;
1051 int depth;
1052 int pc;
1053 int opc;
1054 int insn;
1055 int r3_val = 0;
1056 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), fi->frame);
1057
1058 if (get_frame_saved_regs (fi) == NULL)
1059 frame_saved_regs_zalloc (fi);
1060 else
1061 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
1062
1063 if (dummy_regs)
1064 {
1065 /* DANGER! This is ONLY going to work if the char buffer format of
1066 the saved registers is byte-for-byte identical to the
1067 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
1068 memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs));
1069 return;
1070 }
1071
1072 fi->extra_info->leaf_function = 1;
1073 fi->extra_info->f_offset = 0;
1074
1075 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1076 where[rn] = -1;
1077
1078 depth = 0;
1079
1080 /* Loop around examining the prologue insns until we find something
1081 that does not appear to be part of the prologue. But give up
1082 after 20 of them, since we're getting silly then. */
1083
1084 pc = get_pc_function_start (get_frame_pc (fi));
1085 if (!pc)
1086 {
1087 deprecated_update_frame_pc_hack (fi, 0);
1088 return;
1089 }
1090
1091 for (opc = pc + (2 * 28); pc < opc; pc += 2)
1092 {
1093 insn = read_memory_integer (pc, 2);
1094 /* See where the registers will be saved to */
1095 if (IS_PUSH (insn))
1096 {
1097 rn = GET_PUSHED_REG (insn);
1098 where[rn] = depth;
1099 depth += 4;
1100 }
1101 else if (IS_STS (insn))
1102 {
1103 where[gdbarch_tdep (current_gdbarch)->PR_REGNUM] = depth;
1104 /* If we're storing the pr then this isn't a leaf */
1105 fi->extra_info->leaf_function = 0;
1106 depth += 4;
1107 }
1108 else if (IS_MOV_R3 (insn))
1109 {
1110 r3_val = ((insn & 0xff) ^ 0x80) - 0x80;
1111 }
1112 else if (IS_SHLL_R3 (insn))
1113 {
1114 r3_val <<= 1;
1115 }
1116 else if (IS_ADD_R3SP (insn))
1117 {
1118 depth += -r3_val;
1119 }
1120 else if (IS_ADD_SP (insn))
1121 {
1122 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
1123 }
1124 else if (IS_MOV_SP_FP (insn))
1125 break;
1126 #if 0 /* This used to just stop when it found an instruction that
1127 was not considered part of the prologue. Now, we just
1128 keep going looking for likely instructions. */
1129 else
1130 break;
1131 #endif
1132 }
1133
1134 /* Now we know how deep things are, we can work out their addresses */
1135
1136 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1137 {
1138 if (where[rn] >= 0)
1139 {
1140 if (rn == FP_REGNUM)
1141 have_fp = 1;
1142
1143 get_frame_saved_regs (fi)[rn] = fi->frame - where[rn] + depth - 4;
1144 }
1145 else
1146 {
1147 get_frame_saved_regs (fi)[rn] = 0;
1148 }
1149 }
1150
1151 if (have_fp)
1152 {
1153 get_frame_saved_regs (fi)[SP_REGNUM] = read_memory_integer (get_frame_saved_regs (fi)[FP_REGNUM], 4);
1154 }
1155 else
1156 {
1157 get_frame_saved_regs (fi)[SP_REGNUM] = fi->frame - 4;
1158 }
1159
1160 fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4;
1161 /* Work out the return pc - either from the saved pr or the pr
1162 value */
1163 }
1164
1165 /* For vectors of 4 floating point registers. */
1166 static int
1167 fv_reg_base_num (int fv_regnum)
1168 {
1169 int fp_regnum;
1170
1171 fp_regnum = FP0_REGNUM +
1172 (fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_REGNUM) * 4;
1173 return fp_regnum;
1174 }
1175
1176 /* For double precision floating point registers, i.e 2 fp regs.*/
1177 static int
1178 dr_reg_base_num (int dr_regnum)
1179 {
1180 int fp_regnum;
1181
1182 fp_regnum = FP0_REGNUM +
1183 (dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_REGNUM) * 2;
1184 return fp_regnum;
1185 }
1186
1187 /* For pairs of floating point registers */
1188 static int
1189 fpp_reg_base_num (int fpp_regnum)
1190 {
1191 int fp_regnum;
1192
1193 fp_regnum = FP0_REGNUM +
1194 (fpp_regnum - gdbarch_tdep (current_gdbarch)->FPP0_REGNUM) * 2;
1195 return fp_regnum;
1196 }
1197
1198 static int
1199 is_media_pseudo (int rn)
1200 {
1201 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1202
1203 return (rn >= tdep->DR0_REGNUM
1204 && rn <= tdep->FV_LAST_REGNUM);
1205 }
1206
1207 int
1208 sh64_get_gdb_regnum (int gcc_regnum, CORE_ADDR pc)
1209 {
1210 return translate_insn_rn (gcc_regnum, pc_is_isa32 (pc));
1211 }
1212
1213 static int
1214 sh64_media_reg_base_num (int reg_nr)
1215 {
1216 int base_regnum = -1;
1217 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1218
1219 if (reg_nr >= tdep->DR0_REGNUM
1220 && reg_nr <= tdep->DR_LAST_REGNUM)
1221 base_regnum = dr_reg_base_num (reg_nr);
1222
1223 else if (reg_nr >= tdep->FPP0_REGNUM
1224 && reg_nr <= tdep->FPP_LAST_REGNUM)
1225 base_regnum = fpp_reg_base_num (reg_nr);
1226
1227 else if (reg_nr >= tdep->FV0_REGNUM
1228 && reg_nr <= tdep->FV_LAST_REGNUM)
1229 base_regnum = fv_reg_base_num (reg_nr);
1230
1231 return base_regnum;
1232 }
1233
1234 /* *INDENT-OFF* */
1235 /*
1236 SH COMPACT MODE (ISA 16) (all pseudo) 221-272
1237 GDB_REGNUM BASE_REGNUM
1238 r0_c 221 0
1239 r1_c 222 1
1240 r2_c 223 2
1241 r3_c 224 3
1242 r4_c 225 4
1243 r5_c 226 5
1244 r6_c 227 6
1245 r7_c 228 7
1246 r8_c 229 8
1247 r9_c 230 9
1248 r10_c 231 10
1249 r11_c 232 11
1250 r12_c 233 12
1251 r13_c 234 13
1252 r14_c 235 14
1253 r15_c 236 15
1254
1255 pc_c 237 64
1256 gbr_c 238 16
1257 mach_c 239 17
1258 macl_c 240 17
1259 pr_c 241 18
1260 t_c 242 19
1261 fpscr_c 243 76
1262 fpul_c 244 109
1263
1264 fr0_c 245 77
1265 fr1_c 246 78
1266 fr2_c 247 79
1267 fr3_c 248 80
1268 fr4_c 249 81
1269 fr5_c 250 82
1270 fr6_c 251 83
1271 fr7_c 252 84
1272 fr8_c 253 85
1273 fr9_c 254 86
1274 fr10_c 255 87
1275 fr11_c 256 88
1276 fr12_c 257 89
1277 fr13_c 258 90
1278 fr14_c 259 91
1279 fr15_c 260 92
1280
1281 dr0_c 261 77
1282 dr2_c 262 79
1283 dr4_c 263 81
1284 dr6_c 264 83
1285 dr8_c 265 85
1286 dr10_c 266 87
1287 dr12_c 267 89
1288 dr14_c 268 91
1289
1290 fv0_c 269 77
1291 fv4_c 270 81
1292 fv8_c 271 85
1293 fv12_c 272 91
1294 */
1295 /* *INDENT-ON* */
1296 static int
1297 sh64_compact_reg_base_num (int reg_nr)
1298 {
1299 int base_regnum = -1;
1300 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1301
1302 /* general register N maps to general register N */
1303 if (reg_nr >= tdep->R0_C_REGNUM
1304 && reg_nr <= tdep->R_LAST_C_REGNUM)
1305 base_regnum = reg_nr - tdep->R0_C_REGNUM;
1306
1307 /* floating point register N maps to floating point register N */
1308 else if (reg_nr >= tdep->FP0_C_REGNUM
1309 && reg_nr <= tdep->FP_LAST_C_REGNUM)
1310 base_regnum = reg_nr - tdep->FP0_C_REGNUM + FP0_REGNUM;
1311
1312 /* double prec register N maps to base regnum for double prec register N */
1313 else if (reg_nr >= tdep->DR0_C_REGNUM
1314 && reg_nr <= tdep->DR_LAST_C_REGNUM)
1315 base_regnum = dr_reg_base_num (tdep->DR0_REGNUM
1316 + reg_nr - tdep->DR0_C_REGNUM);
1317
1318 /* vector N maps to base regnum for vector register N */
1319 else if (reg_nr >= tdep->FV0_C_REGNUM
1320 && reg_nr <= tdep->FV_LAST_C_REGNUM)
1321 base_regnum = fv_reg_base_num (tdep->FV0_REGNUM
1322 + reg_nr - tdep->FV0_C_REGNUM);
1323
1324 else if (reg_nr == tdep->PC_C_REGNUM)
1325 base_regnum = PC_REGNUM;
1326
1327 else if (reg_nr == tdep->GBR_C_REGNUM)
1328 base_regnum = 16;
1329
1330 else if (reg_nr == tdep->MACH_C_REGNUM
1331 || reg_nr == tdep->MACL_C_REGNUM)
1332 base_regnum = 17;
1333
1334 else if (reg_nr == tdep->PR_C_REGNUM)
1335 base_regnum = 18;
1336
1337 else if (reg_nr == tdep->T_C_REGNUM)
1338 base_regnum = 19;
1339
1340 else if (reg_nr == tdep->FPSCR_C_REGNUM)
1341 base_regnum = tdep->FPSCR_REGNUM; /*???? this register is a mess. */
1342
1343 else if (reg_nr == tdep->FPUL_C_REGNUM)
1344 base_regnum = FP0_REGNUM + 32;
1345
1346 return base_regnum;
1347 }
1348
1349 /* Given a register number RN (according to the gdb scheme) , return
1350 its corresponding architectural register. In media mode, only a
1351 subset of the registers is pseudo registers. For compact mode, all
1352 the registers are pseudo. */
1353 static int
1354 translate_rn_to_arch_reg_num (int rn, int media_mode)
1355 {
1356
1357 if (media_mode)
1358 {
1359 if (!is_media_pseudo (rn))
1360 return rn;
1361 else
1362 return sh64_media_reg_base_num (rn);
1363 }
1364 else
1365 /* All compact registers are pseudo. */
1366 return sh64_compact_reg_base_num (rn);
1367 }
1368
1369 static int
1370 sign_extend (int value, int bits)
1371 {
1372 value = value & ((1 << bits) - 1);
1373 return (value & (1 << (bits - 1))
1374 ? value | (~((1 << bits) - 1))
1375 : value);
1376 }
1377
1378 static void
1379 sh64_nofp_frame_init_saved_regs (struct frame_info *fi)
1380 {
1381 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof (int));
1382 int rn;
1383 int have_fp = 0;
1384 int fp_regnum;
1385 int sp_regnum;
1386 int depth;
1387 int pc;
1388 int opc;
1389 int insn;
1390 int r0_val = 0;
1391 int media_mode = 0;
1392 int insn_size;
1393 int gdb_register_number;
1394 int register_number;
1395 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), fi->frame);
1396 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1397
1398 if (get_frame_saved_regs (fi) == NULL)
1399 frame_saved_regs_zalloc (fi);
1400 else
1401 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
1402
1403 if (dummy_regs)
1404 {
1405 /* DANGER! This is ONLY going to work if the char buffer format of
1406 the saved registers is byte-for-byte identical to the
1407 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
1408 memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs));
1409 return;
1410 }
1411
1412 fi->extra_info->leaf_function = 1;
1413 fi->extra_info->f_offset = 0;
1414
1415 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1416 where[rn] = -1;
1417
1418 depth = 0;
1419
1420 /* Loop around examining the prologue insns until we find something
1421 that does not appear to be part of the prologue. But give up
1422 after 20 of them, since we're getting silly then. */
1423
1424 pc = get_pc_function_start (get_frame_pc (fi));
1425 if (!pc)
1426 {
1427 deprecated_update_frame_pc_hack (fi, 0);
1428 return;
1429 }
1430
1431 if (pc_is_isa32 (pc))
1432 {
1433 media_mode = 1;
1434 insn_size = 4;
1435 }
1436 else
1437 {
1438 media_mode = 0;
1439 insn_size = 2;
1440 }
1441
1442 /* The frame pointer register is general register 14 in shmedia and
1443 shcompact modes. In sh compact it is a pseudo register. Same goes
1444 for the stack pointer register, which is register 15. */
1445 fp_regnum = translate_insn_rn (FP_REGNUM, media_mode);
1446 sp_regnum = translate_insn_rn (SP_REGNUM, media_mode);
1447
1448 for (opc = pc + (insn_size * 28); pc < opc; pc += insn_size)
1449 {
1450 insn = read_memory_integer (media_mode ? UNMAKE_ISA32_ADDR (pc) : pc,
1451 insn_size);
1452
1453 if (media_mode == 0)
1454 {
1455 if (IS_STS_PR (insn))
1456 {
1457 int next_insn = read_memory_integer (pc + insn_size, insn_size);
1458 if (IS_MOV_TO_R15 (next_insn))
1459 {
1460 int reg_nr = tdep->PR_C_REGNUM;
1461
1462 where[reg_nr] = depth - ((((next_insn & 0xf) ^ 0x8) - 0x8) << 2);
1463 fi->extra_info->leaf_function = 0;
1464 pc += insn_size;
1465 }
1466 }
1467 else if (IS_MOV_R14 (insn))
1468 {
1469 where[fp_regnum] = depth - ((((insn & 0xf) ^ 0x8) - 0x8) << 2);
1470 }
1471
1472 else if (IS_MOV_R0 (insn))
1473 {
1474 /* Put in R0 the offset from SP at which to store some
1475 registers. We are interested in this value, because it
1476 will tell us where the given registers are stored within
1477 the frame. */
1478 r0_val = ((insn & 0xff) ^ 0x80) - 0x80;
1479 }
1480 else if (IS_ADD_SP_R0 (insn))
1481 {
1482 /* This instruction still prepares r0, but we don't care.
1483 We already have the offset in r0_val. */
1484 }
1485 else if (IS_STS_R0 (insn))
1486 {
1487 /* Store PR at r0_val-4 from SP. Decrement r0 by 4*/
1488 int reg_nr = tdep->PR_C_REGNUM;
1489 where[reg_nr] = depth - (r0_val - 4);
1490 r0_val -= 4;
1491 fi->extra_info->leaf_function = 0;
1492 }
1493 else if (IS_MOV_R14_R0 (insn))
1494 {
1495 /* Store R14 at r0_val-4 from SP. Decrement r0 by 4 */
1496 where[fp_regnum] = depth - (r0_val - 4);
1497 r0_val -= 4;
1498 }
1499
1500 else if (IS_ADD_SP (insn))
1501 {
1502 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
1503 }
1504 else if (IS_MOV_SP_FP (insn))
1505 break;
1506 }
1507 else
1508 {
1509 if (IS_ADDIL_SP_MEDIA (insn)
1510 || IS_ADDI_SP_MEDIA (insn))
1511 {
1512 depth -= sign_extend ((((insn & 0xffc00) ^ 0x80000) - 0x80000) >> 10, 9);
1513 }
1514
1515 else if (IS_STQ_R18_R15 (insn))
1516 {
1517 where[tdep->PR_REGNUM] =
1518 depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
1519 fi->extra_info->leaf_function = 0;
1520 }
1521
1522 else if (IS_STL_R18_R15 (insn))
1523 {
1524 where[tdep->PR_REGNUM] =
1525 depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
1526 fi->extra_info->leaf_function = 0;
1527 }
1528
1529 else if (IS_STQ_R14_R15 (insn))
1530 {
1531 where[fp_regnum] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 3);
1532 }
1533
1534 else if (IS_STL_R14_R15 (insn))
1535 {
1536 where[fp_regnum] = depth - (sign_extend ((insn & 0xffc00) >> 10, 9) << 2);
1537 }
1538
1539 else if (IS_MOV_SP_FP_MEDIA (insn))
1540 break;
1541 }
1542 }
1543
1544 /* Now we know how deep things are, we can work out their addresses. */
1545 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1546 {
1547 register_number = translate_rn_to_arch_reg_num (rn, media_mode);
1548
1549 if (where[rn] >= 0)
1550 {
1551 if (rn == fp_regnum)
1552 have_fp = 1;
1553
1554 /* Watch out! saved_regs is only for the real registers, and
1555 doesn't include space for the pseudo registers. */
1556 get_frame_saved_regs (fi)[register_number]= fi->frame - where[rn] + depth;
1557
1558 }
1559 else
1560 get_frame_saved_regs (fi)[register_number] = 0;
1561 }
1562
1563 if (have_fp)
1564 {
1565 /* SP_REGNUM is 15. For shmedia 15 is the real register. For
1566 shcompact 15 is the arch register corresponding to the pseudo
1567 register r15 which still is the SP register. */
1568 /* The place on the stack where fp is stored contains the sp of
1569 the caller. */
1570 /* Again, saved_registers contains only space for the real registers,
1571 so we store in FP_REGNUM position. */
1572 int size;
1573 if (tdep->sh_abi == SH_ABI_32)
1574 size = 4;
1575 else
1576 size = REGISTER_RAW_SIZE (fp_regnum);
1577 get_frame_saved_regs (fi)[sp_regnum] = read_memory_integer (get_frame_saved_regs (fi)[fp_regnum], size);
1578 }
1579 else
1580 get_frame_saved_regs (fi)[sp_regnum] = fi->frame;
1581
1582 fi->extra_info->f_offset = depth - where[fp_regnum];
1583 }
1584
1585 static void
1586 sh_fp_frame_init_saved_regs (struct frame_info *fi)
1587 {
1588 int *where = (int *) alloca ((NUM_REGS + NUM_PSEUDO_REGS) * sizeof (int));
1589 int rn;
1590 int have_fp = 0;
1591 int depth;
1592 int pc;
1593 int opc;
1594 int insn;
1595 int r3_val = 0;
1596 char *dummy_regs = deprecated_generic_find_dummy_frame (get_frame_pc (fi), fi->frame);
1597 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1598
1599 if (get_frame_saved_regs (fi) == NULL)
1600 frame_saved_regs_zalloc (fi);
1601 else
1602 memset (get_frame_saved_regs (fi), 0, SIZEOF_FRAME_SAVED_REGS);
1603
1604 if (dummy_regs)
1605 {
1606 /* DANGER! This is ONLY going to work if the char buffer format of
1607 the saved registers is byte-for-byte identical to the
1608 CORE_ADDR regs[NUM_REGS] format used by struct frame_saved_regs! */
1609 memcpy (fi->saved_regs, dummy_regs, sizeof (fi->saved_regs));
1610 return;
1611 }
1612
1613 fi->extra_info->leaf_function = 1;
1614 fi->extra_info->f_offset = 0;
1615
1616 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1617 where[rn] = -1;
1618
1619 depth = 0;
1620
1621 /* Loop around examining the prologue insns until we find something
1622 that does not appear to be part of the prologue. But give up
1623 after 20 of them, since we're getting silly then. */
1624
1625 pc = get_pc_function_start (get_frame_pc (fi));
1626 if (!pc)
1627 {
1628 deprecated_update_frame_pc_hack (fi, 0);
1629 return;
1630 }
1631
1632 for (opc = pc + (2 * 28); pc < opc; pc += 2)
1633 {
1634 insn = read_memory_integer (pc, 2);
1635 /* See where the registers will be saved to */
1636 if (IS_PUSH (insn))
1637 {
1638 rn = GET_PUSHED_REG (insn);
1639 where[rn] = depth;
1640 depth += 4;
1641 }
1642 else if (IS_STS (insn))
1643 {
1644 where[tdep->PR_REGNUM] = depth;
1645 /* If we're storing the pr then this isn't a leaf */
1646 fi->extra_info->leaf_function = 0;
1647 depth += 4;
1648 }
1649 else if (IS_MOV_R3 (insn))
1650 {
1651 r3_val = ((insn & 0xff) ^ 0x80) - 0x80;
1652 }
1653 else if (IS_SHLL_R3 (insn))
1654 {
1655 r3_val <<= 1;
1656 }
1657 else if (IS_ADD_R3SP (insn))
1658 {
1659 depth += -r3_val;
1660 }
1661 else if (IS_ADD_SP (insn))
1662 {
1663 depth -= ((insn & 0xff) ^ 0x80) - 0x80;
1664 }
1665 else if (IS_FMOV (insn))
1666 {
1667 if (read_register (tdep->FPSCR_REGNUM) & FPSCR_SZ)
1668 {
1669 depth += 8;
1670 }
1671 else
1672 {
1673 depth += 4;
1674 }
1675 }
1676 else if (IS_MOV_SP_FP (insn))
1677 break;
1678 #if 0 /* This used to just stop when it found an instruction that
1679 was not considered part of the prologue. Now, we just
1680 keep going looking for likely instructions. */
1681 else
1682 break;
1683 #endif
1684 }
1685
1686 /* Now we know how deep things are, we can work out their addresses */
1687
1688 for (rn = 0; rn < NUM_REGS + NUM_PSEUDO_REGS; rn++)
1689 {
1690 if (where[rn] >= 0)
1691 {
1692 if (rn == FP_REGNUM)
1693 have_fp = 1;
1694
1695 get_frame_saved_regs (fi)[rn] = fi->frame - where[rn] + depth - 4;
1696 }
1697 else
1698 {
1699 get_frame_saved_regs (fi)[rn] = 0;
1700 }
1701 }
1702
1703 if (have_fp)
1704 {
1705 get_frame_saved_regs (fi)[SP_REGNUM] =
1706 read_memory_integer (get_frame_saved_regs (fi)[FP_REGNUM], 4);
1707 }
1708 else
1709 {
1710 get_frame_saved_regs (fi)[SP_REGNUM] = fi->frame - 4;
1711 }
1712
1713 fi->extra_info->f_offset = depth - where[FP_REGNUM] - 4;
1714 /* Work out the return pc - either from the saved pr or the pr
1715 value */
1716 }
1717
1718 /* Initialize the extra info saved in a FRAME */
1719 static void
1720 sh_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1721 {
1722
1723 fi->extra_info = (struct frame_extra_info *)
1724 frame_obstack_alloc (sizeof (struct frame_extra_info));
1725
1726 if (fi->next)
1727 deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (fi->next));
1728
1729 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), fi->frame, fi->frame))
1730 {
1731 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
1732 by assuming it's always FP. */
1733 deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), fi->frame,
1734 SP_REGNUM));
1735 fi->extra_info->return_pc = deprecated_read_register_dummy (get_frame_pc (fi),
1736 fi->frame,
1737 PC_REGNUM);
1738 fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4);
1739 fi->extra_info->leaf_function = 0;
1740 return;
1741 }
1742 else
1743 {
1744 FRAME_INIT_SAVED_REGS (fi);
1745 fi->extra_info->return_pc =
1746 sh_find_callers_reg (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
1747 }
1748 }
1749
1750 static void
1751 sh64_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1752 {
1753 int media_mode = pc_is_isa32 (get_frame_pc (fi));
1754
1755 fi->extra_info = (struct frame_extra_info *)
1756 frame_obstack_alloc (sizeof (struct frame_extra_info));
1757
1758 if (fi->next)
1759 deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (fi->next));
1760
1761 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), fi->frame, fi->frame))
1762 {
1763 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
1764 by assuming it's always FP. */
1765 deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), fi->frame,
1766 SP_REGNUM));
1767 fi->extra_info->return_pc =
1768 deprecated_read_register_dummy (get_frame_pc (fi), fi->frame, PC_REGNUM);
1769 fi->extra_info->f_offset = -(CALL_DUMMY_LENGTH + 4);
1770 fi->extra_info->leaf_function = 0;
1771 return;
1772 }
1773 else
1774 {
1775 FRAME_INIT_SAVED_REGS (fi);
1776 fi->extra_info->return_pc =
1777 sh64_get_saved_pr (fi, gdbarch_tdep (current_gdbarch)->PR_REGNUM);
1778 }
1779 }
1780
1781 void
1782 sh64_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
1783 struct frame_info *frame, int regnum,
1784 enum lval_type *lval)
1785 {
1786 int media_mode;
1787 int live_regnum = regnum;
1788 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1789
1790 if (!target_has_registers)
1791 error ("No registers.");
1792
1793 /* Normal systems don't optimize out things with register numbers. */
1794 if (optimized != NULL)
1795 *optimized = 0;
1796
1797 if (addrp) /* default assumption: not found in memory */
1798 *addrp = 0;
1799
1800 if (raw_buffer)
1801 memset (raw_buffer, 0, sizeof (raw_buffer));
1802
1803 /* We must do this here, before the following while loop changes
1804 frame, and makes it NULL. If this is a media register number,
1805 but we are in compact mode, it will become the corresponding
1806 compact pseudo register. If there is no corresponding compact
1807 pseudo-register what do we do?*/
1808 media_mode = pc_is_isa32 (get_frame_pc (frame));
1809 live_regnum = translate_insn_rn (regnum, media_mode);
1810
1811 /* Note: since the current frame's registers could only have been
1812 saved by frames INTERIOR TO the current frame, we skip examining
1813 the current frame itself: otherwise, we would be getting the
1814 previous frame's registers which were saved by the current frame. */
1815
1816 while (frame && ((frame = frame->next) != NULL))
1817 {
1818 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
1819 {
1820 if (lval) /* found it in a CALL_DUMMY frame */
1821 *lval = not_lval;
1822 if (raw_buffer)
1823 memcpy (raw_buffer,
1824 (deprecated_generic_find_dummy_frame (get_frame_pc (frame), frame->frame)
1825 + REGISTER_BYTE (regnum)),
1826 REGISTER_RAW_SIZE (regnum));
1827 return;
1828 }
1829
1830 FRAME_INIT_SAVED_REGS (frame);
1831 if (get_frame_saved_regs (frame) != NULL
1832 && get_frame_saved_regs (frame)[regnum] != 0)
1833 {
1834 if (lval) /* found it saved on the stack */
1835 *lval = lval_memory;
1836 if (regnum == SP_REGNUM)
1837 {
1838 if (raw_buffer) /* SP register treated specially */
1839 store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
1840 get_frame_saved_regs (frame)[regnum]);
1841 }
1842 else
1843 { /* any other register */
1844
1845 if (addrp)
1846 *addrp = get_frame_saved_regs (frame)[regnum];
1847 if (raw_buffer)
1848 {
1849 int size;
1850 if (tdep->sh_abi == SH_ABI_32
1851 && (live_regnum == FP_REGNUM
1852 || live_regnum == tdep->PR_REGNUM))
1853 size = 4;
1854 else
1855 size = REGISTER_RAW_SIZE (live_regnum);
1856 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
1857 read_memory (get_frame_saved_regs (frame)[regnum], raw_buffer, size);
1858 else
1859 read_memory (get_frame_saved_regs (frame)[regnum],
1860 raw_buffer
1861 + REGISTER_RAW_SIZE (live_regnum)
1862 - size,
1863 size);
1864 }
1865 }
1866 return;
1867 }
1868 }
1869
1870 /* If we get thru the loop to this point, it means the register was
1871 not saved in any frame. Return the actual live-register value. */
1872
1873 if (lval) /* found it in a live register */
1874 *lval = lval_register;
1875 if (addrp)
1876 *addrp = REGISTER_BYTE (live_regnum);
1877 if (raw_buffer)
1878 deprecated_read_register_gen (live_regnum, raw_buffer);
1879 }
1880
1881 /* Extract from an array REGBUF containing the (raw) register state
1882 the address in which a function should return its structure value,
1883 as a CORE_ADDR (or an expression that can be used as one). */
1884 static CORE_ADDR
1885 sh_extract_struct_value_address (char *regbuf)
1886 {
1887 return (extract_address ((regbuf), REGISTER_RAW_SIZE (0)));
1888 }
1889
1890 static CORE_ADDR
1891 sh64_extract_struct_value_address (char *regbuf)
1892 {
1893 return (extract_address ((regbuf + REGISTER_BYTE (STRUCT_RETURN_REGNUM)),
1894 REGISTER_RAW_SIZE (STRUCT_RETURN_REGNUM)));
1895 }
1896
1897 static CORE_ADDR
1898 sh_frame_saved_pc (struct frame_info *frame)
1899 {
1900 return ((frame)->extra_info->return_pc);
1901 }
1902
1903 /* Discard from the stack the innermost frame,
1904 restoring all saved registers. */
1905 static void
1906 sh_pop_frame (void)
1907 {
1908 register struct frame_info *frame = get_current_frame ();
1909 register CORE_ADDR fp;
1910 register int regnum;
1911
1912 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
1913 generic_pop_dummy_frame ();
1914 else
1915 {
1916 fp = get_frame_base (frame);
1917 FRAME_INIT_SAVED_REGS (frame);
1918
1919 /* Copy regs from where they were saved in the frame */
1920 for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
1921 if (get_frame_saved_regs (frame)[regnum])
1922 write_register (regnum,
1923 read_memory_integer (get_frame_saved_regs (frame)[regnum], 4));
1924
1925 write_register (PC_REGNUM, frame->extra_info->return_pc);
1926 write_register (SP_REGNUM, fp + 4);
1927 }
1928 flush_cached_frames ();
1929 }
1930
1931 /* Used in the 'return' command. */
1932 static void
1933 sh64_pop_frame (void)
1934 {
1935 register struct frame_info *frame = get_current_frame ();
1936 register CORE_ADDR fp;
1937 register int regnum;
1938 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1939
1940 int media_mode = pc_is_isa32 (get_frame_pc (frame));
1941
1942 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), frame->frame, frame->frame))
1943 generic_pop_dummy_frame ();
1944 else
1945 {
1946 fp = get_frame_base (frame);
1947 FRAME_INIT_SAVED_REGS (frame);
1948
1949 /* Copy regs from where they were saved in the frame */
1950 for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
1951 if (get_frame_saved_regs (frame)[regnum])
1952 {
1953 int size;
1954 if (tdep->sh_abi == SH_ABI_32
1955 && (regnum == FP_REGNUM
1956 || regnum == tdep->PR_REGNUM))
1957 size = 4;
1958 else
1959 size = REGISTER_RAW_SIZE (translate_insn_rn (regnum,
1960 media_mode));
1961 write_register (regnum,
1962 read_memory_integer (get_frame_saved_regs (frame)[regnum],
1963 size));
1964 }
1965
1966 write_register (PC_REGNUM, frame->extra_info->return_pc);
1967 write_register (SP_REGNUM, fp + 8);
1968 }
1969 flush_cached_frames ();
1970 }
1971
1972 /* Function: push_arguments
1973 Setup the function arguments for calling a function in the inferior.
1974
1975 On the Hitachi SH architecture, there are four registers (R4 to R7)
1976 which are dedicated for passing function arguments. Up to the first
1977 four arguments (depending on size) may go into these registers.
1978 The rest go on the stack.
1979
1980 Arguments that are smaller than 4 bytes will still take up a whole
1981 register or a whole 32-bit word on the stack, and will be
1982 right-justified in the register or the stack word. This includes
1983 chars, shorts, and small aggregate types.
1984
1985 Arguments that are larger than 4 bytes may be split between two or
1986 more registers. If there are not enough registers free, an argument
1987 may be passed partly in a register (or registers), and partly on the
1988 stack. This includes doubles, long longs, and larger aggregates.
1989 As far as I know, there is no upper limit to the size of aggregates
1990 that will be passed in this way; in other words, the convention of
1991 passing a pointer to a large aggregate instead of a copy is not used.
1992
1993 An exceptional case exists for struct arguments (and possibly other
1994 aggregates such as arrays) if the size is larger than 4 bytes but
1995 not a multiple of 4 bytes. In this case the argument is never split
1996 between the registers and the stack, but instead is copied in its
1997 entirety onto the stack, AND also copied into as many registers as
1998 there is room for. In other words, space in registers permitting,
1999 two copies of the same argument are passed in. As far as I can tell,
2000 only the one on the stack is used, although that may be a function
2001 of the level of compiler optimization. I suspect this is a compiler
2002 bug. Arguments of these odd sizes are left-justified within the
2003 word (as opposed to arguments smaller than 4 bytes, which are
2004 right-justified).
2005
2006 If the function is to return an aggregate type such as a struct, it
2007 is either returned in the normal return value register R0 (if its
2008 size is no greater than one byte), or else the caller must allocate
2009 space into which the callee will copy the return value (if the size
2010 is greater than one byte). In this case, a pointer to the return
2011 value location is passed into the callee in register R2, which does
2012 not displace any of the other arguments passed in via registers R4
2013 to R7. */
2014
2015 static CORE_ADDR
2016 sh_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2017 int struct_return, CORE_ADDR struct_addr)
2018 {
2019 int stack_offset, stack_alloc;
2020 int argreg;
2021 int argnum;
2022 struct type *type;
2023 CORE_ADDR regval;
2024 char *val;
2025 char valbuf[4];
2026 int len;
2027 int odd_sized_struct;
2028 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2029
2030 /* first force sp to a 4-byte alignment */
2031 sp = sp & ~3;
2032
2033 /* The "struct return pointer" pseudo-argument has its own dedicated
2034 register */
2035 if (struct_return)
2036 write_register (STRUCT_RETURN_REGNUM, struct_addr);
2037
2038 /* Now make sure there's space on the stack */
2039 for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
2040 stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
2041 sp -= stack_alloc; /* make room on stack for args */
2042
2043 /* Now load as many as possible of the first arguments into
2044 registers, and push the rest onto the stack. There are 16 bytes
2045 in four registers available. Loop thru args from first to last. */
2046
2047 argreg = tdep->ARG0_REGNUM;
2048 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2049 {
2050 type = VALUE_TYPE (args[argnum]);
2051 len = TYPE_LENGTH (type);
2052 memset (valbuf, 0, sizeof (valbuf));
2053 if (len < 4)
2054 {
2055 /* value gets right-justified in the register or stack word */
2056 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2057 memcpy (valbuf + (4 - len),
2058 (char *) VALUE_CONTENTS (args[argnum]), len);
2059 else
2060 memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
2061 val = valbuf;
2062 }
2063 else
2064 val = (char *) VALUE_CONTENTS (args[argnum]);
2065
2066 if (len > 4 && (len & 3) != 0)
2067 odd_sized_struct = 1; /* such structs go entirely on stack */
2068 else
2069 odd_sized_struct = 0;
2070 while (len > 0)
2071 {
2072 if (argreg > tdep->ARGLAST_REGNUM
2073 || odd_sized_struct)
2074 {
2075 /* must go on the stack */
2076 write_memory (sp + stack_offset, val, 4);
2077 stack_offset += 4;
2078 }
2079 /* NOTE WELL!!!!! This is not an "else if" clause!!!
2080 That's because some *&^%$ things get passed on the stack
2081 AND in the registers! */
2082 if (argreg <= tdep->ARGLAST_REGNUM)
2083 {
2084 /* there's room in a register */
2085 regval = extract_address (val, REGISTER_RAW_SIZE (argreg));
2086 write_register (argreg++, regval);
2087 }
2088 /* Store the value 4 bytes at a time. This means that things
2089 larger than 4 bytes may go partly in registers and partly
2090 on the stack. */
2091 len -= REGISTER_RAW_SIZE (argreg);
2092 val += REGISTER_RAW_SIZE (argreg);
2093 }
2094 }
2095 return sp;
2096 }
2097
2098 /* R2-R9 for integer types and integer equivalent (char, pointers) and
2099 non-scalar (struct, union) elements (even if the elements are
2100 floats).
2101 FR0-FR11 for single precision floating point (float)
2102 DR0-DR10 for double precision floating point (double)
2103
2104 If a float is argument number 3 (for instance) and arguments number
2105 1,2, and 4 are integer, the mapping will be:
2106 arg1 -->R2, arg2 --> R3, arg3 -->FR0, arg4 --> R5. I.e. R4 is not used.
2107
2108 If a float is argument number 10 (for instance) and arguments number
2109 1 through 10 are integer, the mapping will be:
2110 arg1->R2, arg2->R3, arg3->R4, arg4->R5, arg5->R6, arg6->R7, arg7->R8,
2111 arg8->R9, arg9->(0,SP)stack(8-byte aligned), arg10->FR0, arg11->stack(16,SP).
2112 I.e. there is hole in the stack.
2113
2114 Different rules apply for variable arguments functions, and for functions
2115 for which the prototype is not known. */
2116
2117 static CORE_ADDR
2118 sh64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2119 int struct_return, CORE_ADDR struct_addr)
2120 {
2121 int stack_offset, stack_alloc;
2122 int int_argreg;
2123 int float_argreg;
2124 int double_argreg;
2125 int float_arg_index = 0;
2126 int double_arg_index = 0;
2127 int argnum;
2128 struct type *type;
2129 CORE_ADDR regval;
2130 char *val;
2131 char valbuf[8];
2132 char valbuf_tmp[8];
2133 int len;
2134 int argreg_size;
2135 int fp_args[12];
2136 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2137
2138 memset (fp_args, 0, sizeof (fp_args));
2139
2140 /* first force sp to a 8-byte alignment */
2141 sp = sp & ~7;
2142
2143 /* The "struct return pointer" pseudo-argument has its own dedicated
2144 register */
2145
2146 if (struct_return)
2147 write_register (STRUCT_RETURN_REGNUM, struct_addr);
2148
2149 /* Now make sure there's space on the stack */
2150 for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
2151 stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 7) & ~7);
2152 sp -= stack_alloc; /* make room on stack for args */
2153
2154 /* Now load as many as possible of the first arguments into
2155 registers, and push the rest onto the stack. There are 64 bytes
2156 in eight registers available. Loop thru args from first to last. */
2157
2158 int_argreg = tdep->ARG0_REGNUM;
2159 float_argreg = FP0_REGNUM;
2160 double_argreg = tdep->DR0_REGNUM;
2161
2162 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
2163 {
2164 type = VALUE_TYPE (args[argnum]);
2165 len = TYPE_LENGTH (type);
2166 memset (valbuf, 0, sizeof (valbuf));
2167
2168 if (TYPE_CODE (type) != TYPE_CODE_FLT)
2169 {
2170 argreg_size = REGISTER_RAW_SIZE (int_argreg);
2171
2172 if (len < argreg_size)
2173 {
2174 /* value gets right-justified in the register or stack word */
2175 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2176 memcpy (valbuf + argreg_size - len,
2177 (char *) VALUE_CONTENTS (args[argnum]), len);
2178 else
2179 memcpy (valbuf, (char *) VALUE_CONTENTS (args[argnum]), len);
2180
2181 val = valbuf;
2182 }
2183 else
2184 val = (char *) VALUE_CONTENTS (args[argnum]);
2185
2186 while (len > 0)
2187 {
2188 if (int_argreg > tdep->ARGLAST_REGNUM)
2189 {
2190 /* must go on the stack */
2191 write_memory (sp + stack_offset, val, argreg_size);
2192 stack_offset += 8;/*argreg_size;*/
2193 }
2194 /* NOTE WELL!!!!! This is not an "else if" clause!!!
2195 That's because some *&^%$ things get passed on the stack
2196 AND in the registers! */
2197 if (int_argreg <= tdep->ARGLAST_REGNUM)
2198 {
2199 /* there's room in a register */
2200 regval = extract_address (val, argreg_size);
2201 write_register (int_argreg, regval);
2202 }
2203 /* Store the value 8 bytes at a time. This means that
2204 things larger than 8 bytes may go partly in registers
2205 and partly on the stack. FIXME: argreg is incremented
2206 before we use its size. */
2207 len -= argreg_size;
2208 val += argreg_size;
2209 int_argreg++;
2210 }
2211 }
2212 else
2213 {
2214 val = (char *) VALUE_CONTENTS (args[argnum]);
2215 if (len == 4)
2216 {
2217 /* Where is it going to be stored? */
2218 while (fp_args[float_arg_index])
2219 float_arg_index ++;
2220
2221 /* Now float_argreg points to the register where it
2222 should be stored. Are we still within the allowed
2223 register set? */
2224 if (float_arg_index <= tdep->FLOAT_ARGLAST_REGNUM)
2225 {
2226 /* Goes in FR0...FR11 */
2227 deprecated_write_register_gen (FP0_REGNUM + float_arg_index,
2228 val);
2229 fp_args[float_arg_index] = 1;
2230 /* Skip the corresponding general argument register. */
2231 int_argreg ++;
2232 }
2233 else
2234 ;
2235 /* Store it as the integers, 8 bytes at the time, if
2236 necessary spilling on the stack. */
2237
2238 }
2239 else if (len == 8)
2240 {
2241 /* Where is it going to be stored? */
2242 while (fp_args[double_arg_index])
2243 double_arg_index += 2;
2244 /* Now double_argreg points to the register
2245 where it should be stored.
2246 Are we still within the allowed register set? */
2247 if (double_arg_index < tdep->FLOAT_ARGLAST_REGNUM)
2248 {
2249 /* Goes in DR0...DR10 */
2250 /* The numbering of the DRi registers is consecutive,
2251 i.e. includes odd numbers. */
2252 int double_register_offset = double_arg_index / 2;
2253 int regnum = tdep->DR0_REGNUM +
2254 double_register_offset;
2255 #if 0
2256 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2257 {
2258 memset (valbuf_tmp, 0, sizeof (valbuf_tmp));
2259 REGISTER_CONVERT_TO_VIRTUAL (regnum,
2260 type, val, valbuf_tmp);
2261 val = valbuf_tmp;
2262 }
2263 #endif
2264 /* Note: must use write_register_gen here instead
2265 of regcache_raw_write, because
2266 regcache_raw_write works only for real
2267 registers, not pseudo. write_register_gen will
2268 call the gdbarch function to do register
2269 writes, and that will properly know how to deal
2270 with pseudoregs. */
2271 deprecated_write_register_gen (regnum, val);
2272 fp_args[double_arg_index] = 1;
2273 fp_args[double_arg_index + 1] = 1;
2274 /* Skip the corresponding general argument register. */
2275 int_argreg ++;
2276 }
2277 else
2278 ;
2279 /* Store it as the integers, 8 bytes at the time, if
2280 necessary spilling on the stack. */
2281 }
2282 }
2283 }
2284 return sp;
2285 }
2286
2287 /* Function: push_return_address (pc)
2288 Set up the return address for the inferior function call.
2289 Needed for targets where we don't actually execute a JSR/BSR instruction */
2290
2291 static CORE_ADDR
2292 sh_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
2293 {
2294 write_register (gdbarch_tdep (current_gdbarch)->PR_REGNUM,
2295 CALL_DUMMY_ADDRESS ());
2296 return sp;
2297 }
2298
2299 /* Function: fix_call_dummy
2300 Poke the callee function's address into the destination part of
2301 the CALL_DUMMY. The address is actually stored in a data word
2302 following the actualy CALL_DUMMY instructions, which will load
2303 it into a register using PC-relative addressing. This function
2304 expects the CALL_DUMMY to look like this:
2305
2306 mov.w @(2,PC), R8
2307 jsr @R8
2308 nop
2309 trap
2310 <destination>
2311 */
2312
2313 #if 0
2314 void
2315 sh_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
2316 struct value **args, struct type *type, int gcc_p)
2317 {
2318 *(unsigned long *) (dummy + 8) = fun;
2319 }
2320 #endif
2321
2322 static int
2323 sh_coerce_float_to_double (struct type *formal, struct type *actual)
2324 {
2325 return 1;
2326 }
2327
2328 /* Find a function's return value in the appropriate registers (in
2329 regbuf), and copy it into valbuf. Extract from an array REGBUF
2330 containing the (raw) register state a function return value of type
2331 TYPE, and copy that, in virtual format, into VALBUF. */
2332 static void
2333 sh_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2334 {
2335 int len = TYPE_LENGTH (type);
2336 int return_register = R0_REGNUM;
2337 int offset;
2338
2339 if (len <= 4)
2340 {
2341 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2342 offset = REGISTER_BYTE (return_register) + 4 - len;
2343 else
2344 offset = REGISTER_BYTE (return_register);
2345 memcpy (valbuf, regbuf + offset, len);
2346 }
2347 else if (len <= 8)
2348 {
2349 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2350 offset = REGISTER_BYTE (return_register) + 8 - len;
2351 else
2352 offset = REGISTER_BYTE (return_register);
2353 memcpy (valbuf, regbuf + offset, len);
2354 }
2355 else
2356 error ("bad size for return value");
2357 }
2358
2359 static void
2360 sh3e_sh4_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2361 {
2362 int return_register;
2363 int offset;
2364 int len = TYPE_LENGTH (type);
2365
2366 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2367 return_register = FP0_REGNUM;
2368 else
2369 return_register = R0_REGNUM;
2370
2371 if (len == 8 && TYPE_CODE (type) == TYPE_CODE_FLT)
2372 {
2373 DOUBLEST val;
2374 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2375 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
2376 (char *) regbuf + REGISTER_BYTE (return_register),
2377 &val);
2378 else
2379 floatformat_to_doublest (&floatformat_ieee_double_big,
2380 (char *) regbuf + REGISTER_BYTE (return_register),
2381 &val);
2382 store_floating (valbuf, len, val);
2383 }
2384 else if (len <= 4)
2385 {
2386 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2387 offset = REGISTER_BYTE (return_register) + 4 - len;
2388 else
2389 offset = REGISTER_BYTE (return_register);
2390 memcpy (valbuf, regbuf + offset, len);
2391 }
2392 else if (len <= 8)
2393 {
2394 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2395 offset = REGISTER_BYTE (return_register) + 8 - len;
2396 else
2397 offset = REGISTER_BYTE (return_register);
2398 memcpy (valbuf, regbuf + offset, len);
2399 }
2400 else
2401 error ("bad size for return value");
2402 }
2403
2404 static void
2405 sh64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2406 {
2407 int offset;
2408 int return_register;
2409 int len = TYPE_LENGTH (type);
2410 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2411
2412 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2413 {
2414 if (len == 4)
2415 {
2416 /* Return value stored in FP0_REGNUM */
2417 return_register = FP0_REGNUM;
2418 offset = REGISTER_BYTE (return_register);
2419 memcpy (valbuf, (char *) regbuf + offset, len);
2420 }
2421 else if (len == 8)
2422 {
2423 /* return value stored in DR0_REGNUM */
2424 DOUBLEST val;
2425
2426 return_register = tdep->DR0_REGNUM;
2427 offset = REGISTER_BYTE (return_register);
2428
2429 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2430 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
2431 (char *) regbuf + offset, &val);
2432 else
2433 floatformat_to_doublest (&floatformat_ieee_double_big,
2434 (char *) regbuf + offset, &val);
2435 store_floating (valbuf, len, val);
2436 }
2437 }
2438 else
2439 {
2440 if (len <= 8)
2441 {
2442 /* Result is in register 2. If smaller than 8 bytes, it is padded
2443 at the most significant end. */
2444 return_register = tdep->RETURN_REGNUM;
2445 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2446 offset = REGISTER_BYTE (return_register) +
2447 REGISTER_RAW_SIZE (return_register) - len;
2448 else
2449 offset = REGISTER_BYTE (return_register);
2450 memcpy (valbuf, (char *) regbuf + offset, len);
2451 }
2452 else
2453 error ("bad size for return value");
2454 }
2455 }
2456
2457 /* Write into appropriate registers a function return value
2458 of type TYPE, given in virtual format.
2459 If the architecture is sh4 or sh3e, store a function's return value
2460 in the R0 general register or in the FP0 floating point register,
2461 depending on the type of the return value. In all the other cases
2462 the result is stored in r0, left-justified. */
2463 static void
2464 sh_default_store_return_value (struct type *type, char *valbuf)
2465 {
2466 char buf[32]; /* more than enough... */
2467
2468 if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (R0_REGNUM))
2469 {
2470 /* Add leading zeros to the value. */
2471 memset (buf, 0, REGISTER_RAW_SIZE (R0_REGNUM));
2472 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2473 memcpy (buf + REGISTER_RAW_SIZE (R0_REGNUM) - TYPE_LENGTH (type),
2474 valbuf, TYPE_LENGTH (type));
2475 else
2476 memcpy (buf, valbuf, TYPE_LENGTH (type));
2477 deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), buf,
2478 REGISTER_RAW_SIZE (R0_REGNUM));
2479 }
2480 else
2481 deprecated_write_register_bytes (REGISTER_BYTE (R0_REGNUM), valbuf,
2482 TYPE_LENGTH (type));
2483 }
2484
2485 static void
2486 sh3e_sh4_store_return_value (struct type *type, char *valbuf)
2487 {
2488 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2489 deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
2490 valbuf, TYPE_LENGTH (type));
2491 else
2492 sh_default_store_return_value (type, valbuf);
2493 }
2494
2495 static void
2496 sh64_store_return_value (struct type *type, char *valbuf)
2497 {
2498 char buf[64]; /* more than enough... */
2499 int len = TYPE_LENGTH (type);
2500
2501 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2502 {
2503 if (len == 4)
2504 {
2505 /* Return value stored in FP0_REGNUM */
2506 deprecated_write_register_gen (FP0_REGNUM, valbuf);
2507 }
2508 if (len == 8)
2509 {
2510 /* return value stored in DR0_REGNUM */
2511 /* FIXME: Implement */
2512 }
2513 }
2514 else
2515 {
2516 int return_register = gdbarch_tdep (current_gdbarch)->RETURN_REGNUM;
2517 int offset = 0;
2518
2519 if (len <= REGISTER_RAW_SIZE (return_register))
2520 {
2521 /* Pad with zeros. */
2522 memset (buf, 0, REGISTER_RAW_SIZE (return_register));
2523 if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
2524 offset = 0; /*REGISTER_RAW_SIZE (return_register) - len;*/
2525 else
2526 offset = REGISTER_RAW_SIZE (return_register) - len;
2527
2528 memcpy (buf + offset, valbuf, len);
2529 deprecated_write_register_gen (return_register, buf);
2530 }
2531 else
2532 deprecated_write_register_gen (return_register, valbuf);
2533 }
2534 }
2535
2536 /* Print the registers in a form similar to the E7000 */
2537
2538 static void
2539 sh_generic_show_regs (void)
2540 {
2541 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2542
2543 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2544 paddr (read_register (PC_REGNUM)),
2545 (long) read_register (tdep->SR_REGNUM),
2546 (long) read_register (tdep->PR_REGNUM),
2547 (long) read_register (MACH_REGNUM),
2548 (long) read_register (MACL_REGNUM));
2549
2550 printf_filtered ("GBR=%08lx VBR=%08lx",
2551 (long) read_register (GBR_REGNUM),
2552 (long) read_register (VBR_REGNUM));
2553
2554 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2555 (long) read_register (0),
2556 (long) read_register (1),
2557 (long) read_register (2),
2558 (long) read_register (3),
2559 (long) read_register (4),
2560 (long) read_register (5),
2561 (long) read_register (6),
2562 (long) read_register (7));
2563 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2564 (long) read_register (8),
2565 (long) read_register (9),
2566 (long) read_register (10),
2567 (long) read_register (11),
2568 (long) read_register (12),
2569 (long) read_register (13),
2570 (long) read_register (14),
2571 (long) read_register (15));
2572 }
2573
2574 static void
2575 sh3_show_regs (void)
2576 {
2577 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2578
2579 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2580 paddr (read_register (PC_REGNUM)),
2581 (long) read_register (tdep->SR_REGNUM),
2582 (long) read_register (tdep->PR_REGNUM),
2583 (long) read_register (MACH_REGNUM),
2584 (long) read_register (MACL_REGNUM));
2585
2586 printf_filtered ("GBR=%08lx VBR=%08lx",
2587 (long) read_register (GBR_REGNUM),
2588 (long) read_register (VBR_REGNUM));
2589 printf_filtered (" SSR=%08lx SPC=%08lx",
2590 (long) read_register (tdep->SSR_REGNUM),
2591 (long) read_register (tdep->SPC_REGNUM));
2592
2593 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2594 (long) read_register (0),
2595 (long) read_register (1),
2596 (long) read_register (2),
2597 (long) read_register (3),
2598 (long) read_register (4),
2599 (long) read_register (5),
2600 (long) read_register (6),
2601 (long) read_register (7));
2602 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2603 (long) read_register (8),
2604 (long) read_register (9),
2605 (long) read_register (10),
2606 (long) read_register (11),
2607 (long) read_register (12),
2608 (long) read_register (13),
2609 (long) read_register (14),
2610 (long) read_register (15));
2611 }
2612
2613
2614 static void
2615 sh3e_show_regs (void)
2616 {
2617 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2618
2619 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2620 paddr (read_register (PC_REGNUM)),
2621 (long) read_register (tdep->SR_REGNUM),
2622 (long) read_register (tdep->PR_REGNUM),
2623 (long) read_register (MACH_REGNUM),
2624 (long) read_register (MACL_REGNUM));
2625
2626 printf_filtered ("GBR=%08lx VBR=%08lx",
2627 (long) read_register (GBR_REGNUM),
2628 (long) read_register (VBR_REGNUM));
2629 printf_filtered (" SSR=%08lx SPC=%08lx",
2630 (long) read_register (tdep->SSR_REGNUM),
2631 (long) read_register (tdep->SPC_REGNUM));
2632 printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2633 (long) read_register (tdep->FPUL_REGNUM),
2634 (long) read_register (tdep->FPSCR_REGNUM));
2635
2636 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2637 (long) read_register (0),
2638 (long) read_register (1),
2639 (long) read_register (2),
2640 (long) read_register (3),
2641 (long) read_register (4),
2642 (long) read_register (5),
2643 (long) read_register (6),
2644 (long) read_register (7));
2645 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2646 (long) read_register (8),
2647 (long) read_register (9),
2648 (long) read_register (10),
2649 (long) read_register (11),
2650 (long) read_register (12),
2651 (long) read_register (13),
2652 (long) read_register (14),
2653 (long) read_register (15));
2654
2655 printf_filtered (("FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2656 (long) read_register (FP0_REGNUM + 0),
2657 (long) read_register (FP0_REGNUM + 1),
2658 (long) read_register (FP0_REGNUM + 2),
2659 (long) read_register (FP0_REGNUM + 3),
2660 (long) read_register (FP0_REGNUM + 4),
2661 (long) read_register (FP0_REGNUM + 5),
2662 (long) read_register (FP0_REGNUM + 6),
2663 (long) read_register (FP0_REGNUM + 7));
2664 printf_filtered (("FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2665 (long) read_register (FP0_REGNUM + 8),
2666 (long) read_register (FP0_REGNUM + 9),
2667 (long) read_register (FP0_REGNUM + 10),
2668 (long) read_register (FP0_REGNUM + 11),
2669 (long) read_register (FP0_REGNUM + 12),
2670 (long) read_register (FP0_REGNUM + 13),
2671 (long) read_register (FP0_REGNUM + 14),
2672 (long) read_register (FP0_REGNUM + 15));
2673 }
2674
2675 static void
2676 sh3_dsp_show_regs (void)
2677 {
2678 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2679
2680 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2681 paddr (read_register (PC_REGNUM)),
2682 (long) read_register (tdep->SR_REGNUM),
2683 (long) read_register (tdep->PR_REGNUM),
2684 (long) read_register (MACH_REGNUM),
2685 (long) read_register (MACL_REGNUM));
2686
2687 printf_filtered ("GBR=%08lx VBR=%08lx",
2688 (long) read_register (GBR_REGNUM),
2689 (long) read_register (VBR_REGNUM));
2690
2691 printf_filtered (" SSR=%08lx SPC=%08lx",
2692 (long) read_register (tdep->SSR_REGNUM),
2693 (long) read_register (tdep->SPC_REGNUM));
2694
2695 printf_filtered (" DSR=%08lx",
2696 (long) read_register (tdep->DSR_REGNUM));
2697
2698 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2699 (long) read_register (0),
2700 (long) read_register (1),
2701 (long) read_register (2),
2702 (long) read_register (3),
2703 (long) read_register (4),
2704 (long) read_register (5),
2705 (long) read_register (6),
2706 (long) read_register (7));
2707 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2708 (long) read_register (8),
2709 (long) read_register (9),
2710 (long) read_register (10),
2711 (long) read_register (11),
2712 (long) read_register (12),
2713 (long) read_register (13),
2714 (long) read_register (14),
2715 (long) read_register (15));
2716
2717 printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
2718 (long) read_register (tdep->A0G_REGNUM) & 0xff,
2719 (long) read_register (tdep->A0_REGNUM),
2720 (long) read_register (tdep->M0_REGNUM),
2721 (long) read_register (tdep->X0_REGNUM),
2722 (long) read_register (tdep->Y0_REGNUM),
2723 (long) read_register (tdep->RS_REGNUM),
2724 (long) read_register (tdep->MOD_REGNUM));
2725 printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
2726 (long) read_register (tdep->A1G_REGNUM) & 0xff,
2727 (long) read_register (tdep->A1_REGNUM),
2728 (long) read_register (tdep->M1_REGNUM),
2729 (long) read_register (tdep->X1_REGNUM),
2730 (long) read_register (tdep->Y1_REGNUM),
2731 (long) read_register (tdep->RE_REGNUM));
2732 }
2733
2734 static void
2735 sh4_show_regs (void)
2736 {
2737 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2738
2739 int pr = read_register (tdep->FPSCR_REGNUM) & 0x80000;
2740 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2741 paddr (read_register (PC_REGNUM)),
2742 (long) read_register (tdep->SR_REGNUM),
2743 (long) read_register (tdep->PR_REGNUM),
2744 (long) read_register (MACH_REGNUM),
2745 (long) read_register (MACL_REGNUM));
2746
2747 printf_filtered ("GBR=%08lx VBR=%08lx",
2748 (long) read_register (GBR_REGNUM),
2749 (long) read_register (VBR_REGNUM));
2750 printf_filtered (" SSR=%08lx SPC=%08lx",
2751 (long) read_register (tdep->SSR_REGNUM),
2752 (long) read_register (tdep->SPC_REGNUM));
2753 printf_filtered (" FPUL=%08lx FPSCR=%08lx",
2754 (long) read_register (tdep->FPUL_REGNUM),
2755 (long) read_register (tdep->FPSCR_REGNUM));
2756
2757 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2758 (long) read_register (0),
2759 (long) read_register (1),
2760 (long) read_register (2),
2761 (long) read_register (3),
2762 (long) read_register (4),
2763 (long) read_register (5),
2764 (long) read_register (6),
2765 (long) read_register (7));
2766 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2767 (long) read_register (8),
2768 (long) read_register (9),
2769 (long) read_register (10),
2770 (long) read_register (11),
2771 (long) read_register (12),
2772 (long) read_register (13),
2773 (long) read_register (14),
2774 (long) read_register (15));
2775
2776 printf_filtered ((pr
2777 ? "DR0-DR6 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2778 : "FP0-FP7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2779 (long) read_register (FP0_REGNUM + 0),
2780 (long) read_register (FP0_REGNUM + 1),
2781 (long) read_register (FP0_REGNUM + 2),
2782 (long) read_register (FP0_REGNUM + 3),
2783 (long) read_register (FP0_REGNUM + 4),
2784 (long) read_register (FP0_REGNUM + 5),
2785 (long) read_register (FP0_REGNUM + 6),
2786 (long) read_register (FP0_REGNUM + 7));
2787 printf_filtered ((pr
2788 ? "DR8-DR14 %08lx%08lx %08lx%08lx %08lx%08lx %08lx%08lx\n"
2789 : "FP8-FP15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"),
2790 (long) read_register (FP0_REGNUM + 8),
2791 (long) read_register (FP0_REGNUM + 9),
2792 (long) read_register (FP0_REGNUM + 10),
2793 (long) read_register (FP0_REGNUM + 11),
2794 (long) read_register (FP0_REGNUM + 12),
2795 (long) read_register (FP0_REGNUM + 13),
2796 (long) read_register (FP0_REGNUM + 14),
2797 (long) read_register (FP0_REGNUM + 15));
2798 }
2799
2800 static void
2801 sh_dsp_show_regs (void)
2802 {
2803 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2804
2805 printf_filtered ("PC=%s SR=%08lx PR=%08lx MACH=%08lx MACHL=%08lx\n",
2806 paddr (read_register (PC_REGNUM)),
2807 (long) read_register (tdep->SR_REGNUM),
2808 (long) read_register (tdep->PR_REGNUM),
2809 (long) read_register (MACH_REGNUM),
2810 (long) read_register (MACL_REGNUM));
2811
2812 printf_filtered ("GBR=%08lx VBR=%08lx",
2813 (long) read_register (GBR_REGNUM),
2814 (long) read_register (VBR_REGNUM));
2815
2816 printf_filtered (" DSR=%08lx",
2817 (long) read_register (tdep->DSR_REGNUM));
2818
2819 printf_filtered ("\nR0-R7 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2820 (long) read_register (0),
2821 (long) read_register (1),
2822 (long) read_register (2),
2823 (long) read_register (3),
2824 (long) read_register (4),
2825 (long) read_register (5),
2826 (long) read_register (6),
2827 (long) read_register (7));
2828 printf_filtered ("R8-R15 %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2829 (long) read_register (8),
2830 (long) read_register (9),
2831 (long) read_register (10),
2832 (long) read_register (11),
2833 (long) read_register (12),
2834 (long) read_register (13),
2835 (long) read_register (14),
2836 (long) read_register (15));
2837
2838 printf_filtered ("A0G=%02lx A0=%08lx M0=%08lx X0=%08lx Y0=%08lx RS=%08lx MOD=%08lx\n",
2839 (long) read_register (tdep->A0G_REGNUM) & 0xff,
2840 (long) read_register (tdep->A0_REGNUM),
2841 (long) read_register (tdep->M0_REGNUM),
2842 (long) read_register (tdep->X0_REGNUM),
2843 (long) read_register (tdep->Y0_REGNUM),
2844 (long) read_register (tdep->RS_REGNUM),
2845 (long) read_register (tdep->MOD_REGNUM));
2846 printf_filtered ("A1G=%02lx A1=%08lx M1=%08lx X1=%08lx Y1=%08lx RE=%08lx\n",
2847 (long) read_register (tdep->A1G_REGNUM) & 0xff,
2848 (long) read_register (tdep->A1_REGNUM),
2849 (long) read_register (tdep->M1_REGNUM),
2850 (long) read_register (tdep->X1_REGNUM),
2851 (long) read_register (tdep->Y1_REGNUM),
2852 (long) read_register (tdep->RE_REGNUM));
2853 }
2854
2855 static void
2856 sh64_show_media_regs (void)
2857 {
2858 int i;
2859 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2860
2861 printf_filtered ("PC=%s SR=%016llx \n",
2862 paddr (read_register (PC_REGNUM)),
2863 (long long) read_register (tdep->SR_REGNUM));
2864
2865 printf_filtered ("SSR=%016llx SPC=%016llx \n",
2866 (long long) read_register (tdep->SSR_REGNUM),
2867 (long long) read_register (tdep->SPC_REGNUM));
2868 printf_filtered ("FPSCR=%016lx\n ",
2869 (long) read_register (tdep->FPSCR_REGNUM));
2870
2871 for (i = 0; i < 64; i = i + 4)
2872 printf_filtered ("\nR%d-R%d %016llx %016llx %016llx %016llx\n",
2873 i, i + 3,
2874 (long long) read_register (i + 0),
2875 (long long) read_register (i + 1),
2876 (long long) read_register (i + 2),
2877 (long long) read_register (i + 3));
2878
2879 printf_filtered ("\n");
2880
2881 for (i = 0; i < 64; i = i + 8)
2882 printf_filtered ("FR%d-FR%d %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2883 i, i + 7,
2884 (long) read_register (FP0_REGNUM + i + 0),
2885 (long) read_register (FP0_REGNUM + i + 1),
2886 (long) read_register (FP0_REGNUM + i + 2),
2887 (long) read_register (FP0_REGNUM + i + 3),
2888 (long) read_register (FP0_REGNUM + i + 4),
2889 (long) read_register (FP0_REGNUM + i + 5),
2890 (long) read_register (FP0_REGNUM + i + 6),
2891 (long) read_register (FP0_REGNUM + i + 7));
2892 }
2893
2894 static void
2895 sh64_show_compact_regs (void)
2896 {
2897 int i;
2898 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2899
2900 printf_filtered ("PC=%s \n",
2901 paddr (read_register (tdep->PC_C_REGNUM)));
2902
2903 printf_filtered ("GBR=%08lx MACH=%08lx MACL=%08lx PR=%08lx T=%08lx\n",
2904 (long) read_register (tdep->GBR_C_REGNUM),
2905 (long) read_register (tdep->MACH_C_REGNUM),
2906 (long) read_register (tdep->MACL_C_REGNUM),
2907 (long) read_register (tdep->PR_C_REGNUM),
2908 (long) read_register (tdep->T_C_REGNUM));
2909 printf_filtered ("FPSCR=%08lx FPUL=%08lx\n",
2910 (long) read_register (tdep->FPSCR_REGNUM),
2911 (long) read_register (tdep->FPUL_REGNUM));
2912
2913 for (i = 0; i < 16; i = i + 4)
2914 printf_filtered ("\nR%d-R%d %08lx %08lx %08lx %08lx\n",
2915 i, i + 3,
2916 (long) read_register (i + 0),
2917 (long) read_register (i + 1),
2918 (long) read_register (i + 2),
2919 (long) read_register (i + 3));
2920
2921 printf_filtered ("\n");
2922
2923 for (i = 0; i < 16; i = i + 8)
2924 printf_filtered ("FR%d-FR%d %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",
2925 i, i + 7,
2926 (long) read_register (FP0_REGNUM + i + 0),
2927 (long) read_register (FP0_REGNUM + i + 1),
2928 (long) read_register (FP0_REGNUM + i + 2),
2929 (long) read_register (FP0_REGNUM + i + 3),
2930 (long) read_register (FP0_REGNUM + i + 4),
2931 (long) read_register (FP0_REGNUM + i + 5),
2932 (long) read_register (FP0_REGNUM + i + 6),
2933 (long) read_register (FP0_REGNUM + i + 7));
2934 }
2935
2936 /*FIXME!!! This only shows the registers for shmedia, excluding the
2937 pseudo registers. */
2938 static void
2939 sh64_show_regs (void)
2940 {
2941 if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
2942 sh64_show_media_regs ();
2943 else
2944 sh64_show_compact_regs ();
2945 }
2946
2947 void sh_show_regs_command (char *args, int from_tty)
2948 {
2949 if (sh_show_regs)
2950 (*sh_show_regs)();
2951 }
2952
2953 /* Index within `registers' of the first byte of the space for
2954 register N. */
2955 static int
2956 sh_default_register_byte (int reg_nr)
2957 {
2958 return (reg_nr * 4);
2959 }
2960
2961 static int
2962 sh_sh4_register_byte (int reg_nr)
2963 {
2964 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
2965
2966 if (reg_nr >= tdep->DR0_REGNUM
2967 && reg_nr <= tdep->DR_LAST_REGNUM)
2968 return (dr_reg_base_num (reg_nr) * 4);
2969 else if (reg_nr >= tdep->FV0_REGNUM
2970 && reg_nr <= tdep->FV_LAST_REGNUM)
2971 return (fv_reg_base_num (reg_nr) * 4);
2972 else
2973 return (reg_nr * 4);
2974 }
2975
2976 /* *INDENT-OFF* */
2977 /*
2978 SH MEDIA MODE (ISA 32)
2979 general registers (64-bit) 0-63
2980 0 r0, r1, r2, r3, r4, r5, r6, r7,
2981 64 r8, r9, r10, r11, r12, r13, r14, r15,
2982 128 r16, r17, r18, r19, r20, r21, r22, r23,
2983 192 r24, r25, r26, r27, r28, r29, r30, r31,
2984 256 r32, r33, r34, r35, r36, r37, r38, r39,
2985 320 r40, r41, r42, r43, r44, r45, r46, r47,
2986 384 r48, r49, r50, r51, r52, r53, r54, r55,
2987 448 r56, r57, r58, r59, r60, r61, r62, r63,
2988
2989 pc (64-bit) 64
2990 512 pc,
2991
2992 status reg., saved status reg., saved pc reg. (64-bit) 65-67
2993 520 sr, ssr, spc,
2994
2995 target registers (64-bit) 68-75
2996 544 tr0, tr1, tr2, tr3, tr4, tr5, tr6, tr7,
2997
2998 floating point state control register (32-bit) 76
2999 608 fpscr,
3000
3001 single precision floating point registers (32-bit) 77-140
3002 612 fr0, fr1, fr2, fr3, fr4, fr5, fr6, fr7,
3003 644 fr8, fr9, fr10, fr11, fr12, fr13, fr14, fr15,
3004 676 fr16, fr17, fr18, fr19, fr20, fr21, fr22, fr23,
3005 708 fr24, fr25, fr26, fr27, fr28, fr29, fr30, fr31,
3006 740 fr32, fr33, fr34, fr35, fr36, fr37, fr38, fr39,
3007 772 fr40, fr41, fr42, fr43, fr44, fr45, fr46, fr47,
3008 804 fr48, fr49, fr50, fr51, fr52, fr53, fr54, fr55,
3009 836 fr56, fr57, fr58, fr59, fr60, fr61, fr62, fr63,
3010
3011 TOTAL SPACE FOR REGISTERS: 868 bytes
3012
3013 From here on they are all pseudo registers: no memory allocated.
3014 REGISTER_BYTE returns the register byte for the base register.
3015
3016 double precision registers (pseudo) 141-172
3017 dr0, dr2, dr4, dr6, dr8, dr10, dr12, dr14,
3018 dr16, dr18, dr20, dr22, dr24, dr26, dr28, dr30,
3019 dr32, dr34, dr36, dr38, dr40, dr42, dr44, dr46,
3020 dr48, dr50, dr52, dr54, dr56, dr58, dr60, dr62,
3021
3022 floating point pairs (pseudo) 173-204
3023 fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14,
3024 fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30,
3025 fp32, fp34, fp36, fp38, fp40, fp42, fp44, fp46,
3026 fp48, fp50, fp52, fp54, fp56, fp58, fp60, fp62,
3027
3028 floating point vectors (4 floating point regs) (pseudo) 205-220
3029 fv0, fv4, fv8, fv12, fv16, fv20, fv24, fv28,
3030 fv32, fv36, fv40, fv44, fv48, fv52, fv56, fv60,
3031
3032 SH COMPACT MODE (ISA 16) (all pseudo) 221-272
3033 r0_c, r1_c, r2_c, r3_c, r4_c, r5_c, r6_c, r7_c,
3034 r8_c, r9_c, r10_c, r11_c, r12_c, r13_c, r14_c, r15_c,
3035 pc_c,
3036 gbr_c, mach_c, macl_c, pr_c, t_c,
3037 fpscr_c, fpul_c,
3038 fr0_c, fr1_c, fr2_c, fr3_c, fr4_c, fr5_c, fr6_c, fr7_c,
3039 fr8_c, fr9_c, fr10_c, fr11_c, fr12_c, fr13_c, fr14_c, fr15_c
3040 dr0_c, dr2_c, dr4_c, dr6_c, dr8_c, dr10_c, dr12_c, dr14_c
3041 fv0_c, fv4_c, fv8_c, fv12_c
3042 */
3043 /* *INDENT-ON* */
3044 static int
3045 sh_sh64_register_byte (int reg_nr)
3046 {
3047 int base_regnum = -1;
3048 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3049
3050 /* If it is a pseudo register, get the number of the first floating
3051 point register that is part of it. */
3052 if (reg_nr >= tdep->DR0_REGNUM
3053 && reg_nr <= tdep->DR_LAST_REGNUM)
3054 base_regnum = dr_reg_base_num (reg_nr);
3055
3056 else if (reg_nr >= tdep->FPP0_REGNUM
3057 && reg_nr <= tdep->FPP_LAST_REGNUM)
3058 base_regnum = fpp_reg_base_num (reg_nr);
3059
3060 else if (reg_nr >= tdep->FV0_REGNUM
3061 && reg_nr <= tdep->FV_LAST_REGNUM)
3062 base_regnum = fv_reg_base_num (reg_nr);
3063
3064 /* sh compact pseudo register. FPSCR is a pathological case, need to
3065 treat it as special. */
3066 else if ((reg_nr >= tdep->R0_C_REGNUM
3067 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3068 && reg_nr != tdep->FPSCR_C_REGNUM)
3069 base_regnum = sh64_compact_reg_base_num (reg_nr);
3070
3071 /* Now return the offset in bytes within the register cache. */
3072 /* sh media pseudo register, i.e. any of DR, FFP, FV registers. */
3073 if (reg_nr >= tdep->DR0_REGNUM
3074 && reg_nr <= tdep->FV_LAST_REGNUM)
3075 return (base_regnum - FP0_REGNUM + 1) * 4
3076 + (tdep->TR7_REGNUM + 1) * 8;
3077
3078 /* sh compact pseudo register: general register */
3079 if ((reg_nr >= tdep->R0_C_REGNUM
3080 && reg_nr <= tdep->R_LAST_C_REGNUM))
3081 return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3082 ? base_regnum * 8 + 4
3083 : base_regnum * 8);
3084
3085 /* sh compact pseudo register: */
3086 if (reg_nr == tdep->PC_C_REGNUM
3087 || reg_nr == tdep->GBR_C_REGNUM
3088 || reg_nr == tdep->MACL_C_REGNUM
3089 || reg_nr == tdep->PR_C_REGNUM)
3090 return (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG
3091 ? base_regnum * 8 + 4
3092 : base_regnum * 8);
3093
3094 if (reg_nr == tdep->MACH_C_REGNUM)
3095 return base_regnum * 8;
3096
3097 if (reg_nr == tdep->T_C_REGNUM)
3098 return base_regnum * 8; /* FIXME??? how do we get bit 0? Do we have to? */
3099
3100 /* sh compact pseudo register: floating point register */
3101 else if (reg_nr >=tdep->FP0_C_REGNUM
3102 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3103 return (base_regnum - FP0_REGNUM) * 4
3104 + (tdep->TR7_REGNUM + 1) * 8 + 4;
3105
3106 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3107 /* This is complicated, for now return the beginning of the
3108 architectural FPSCR register. */
3109 return (tdep->TR7_REGNUM + 1) * 8;
3110
3111 else if (reg_nr == tdep->FPUL_C_REGNUM)
3112 return ((base_regnum - FP0_REGNUM) * 4 +
3113 (tdep->TR7_REGNUM + 1) * 8 + 4);
3114
3115 /* It is not a pseudo register. */
3116 /* It is a 64 bit register. */
3117 else if (reg_nr <= tdep->TR7_REGNUM)
3118 return reg_nr * 8;
3119
3120 /* It is a 32 bit register. */
3121 else
3122 if (reg_nr == tdep->FPSCR_REGNUM)
3123 return (tdep->FPSCR_REGNUM * 8);
3124
3125 /* It is floating point 32-bit register */
3126 else
3127 return ((tdep->TR7_REGNUM + 1) * 8
3128 + (reg_nr - FP0_REGNUM + 1) * 4);
3129 }
3130
3131 /* Number of bytes of storage in the actual machine representation for
3132 register REG_NR. */
3133 static int
3134 sh_default_register_raw_size (int reg_nr)
3135 {
3136 return 4;
3137 }
3138
3139 static int
3140 sh_sh4_register_raw_size (int reg_nr)
3141 {
3142 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3143
3144 if (reg_nr >= tdep->DR0_REGNUM
3145 && reg_nr <= tdep->DR_LAST_REGNUM)
3146 return 8;
3147 else if (reg_nr >= tdep->FV0_REGNUM
3148 && reg_nr <= tdep->FV_LAST_REGNUM)
3149 return 16;
3150 else
3151 return 4;
3152 }
3153
3154 static int
3155 sh_sh64_register_raw_size (int reg_nr)
3156 {
3157 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3158
3159 if ((reg_nr >= tdep->DR0_REGNUM
3160 && reg_nr <= tdep->DR_LAST_REGNUM)
3161 || (reg_nr >= tdep->FPP0_REGNUM
3162 && reg_nr <= tdep->FPP_LAST_REGNUM)
3163 || (reg_nr >= tdep->DR0_C_REGNUM
3164 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3165 || (reg_nr <= tdep->TR7_REGNUM))
3166 return 8;
3167
3168 else if ((reg_nr >= tdep->FV0_REGNUM
3169 && reg_nr <= tdep->FV_LAST_REGNUM)
3170 || (reg_nr >= tdep->FV0_C_REGNUM
3171 && reg_nr <= tdep->FV_LAST_C_REGNUM))
3172 return 16;
3173
3174 else /* this covers also the 32-bit SH compact registers. */
3175 return 4;
3176 }
3177
3178 /* Number of bytes of storage in the program's representation
3179 for register N. */
3180 static int
3181 sh_register_virtual_size (int reg_nr)
3182 {
3183 return 4;
3184 }
3185
3186 /* ??????? FIXME */
3187 static int
3188 sh_sh64_register_virtual_size (int reg_nr)
3189 {
3190 if (reg_nr >= FP0_REGNUM
3191 && reg_nr <= gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM)
3192 return 4;
3193 else
3194 return 8;
3195 }
3196
3197 /* Return the GDB type object for the "standard" data type
3198 of data in register N. */
3199 static struct type *
3200 sh_sh3e_register_virtual_type (int reg_nr)
3201 {
3202 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3203
3204 if ((reg_nr >= FP0_REGNUM
3205 && (reg_nr <= tdep->FP_LAST_REGNUM))
3206 || (reg_nr == tdep->FPUL_REGNUM))
3207 return builtin_type_float;
3208 else
3209 return builtin_type_int;
3210 }
3211
3212 static struct type *
3213 sh_sh4_build_float_register_type (int high)
3214 {
3215 struct type *temp;
3216
3217 temp = create_range_type (NULL, builtin_type_int, 0, high);
3218 return create_array_type (NULL, builtin_type_float, temp);
3219 }
3220
3221 static struct type *
3222 sh_sh4_register_virtual_type (int reg_nr)
3223 {
3224 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3225
3226 if ((reg_nr >= FP0_REGNUM
3227 && (reg_nr <= tdep->FP_LAST_REGNUM))
3228 || (reg_nr == tdep->FPUL_REGNUM))
3229 return builtin_type_float;
3230 else if (reg_nr >= tdep->DR0_REGNUM
3231 && reg_nr <= tdep->DR_LAST_REGNUM)
3232 return builtin_type_double;
3233 else if (reg_nr >= tdep->FV0_REGNUM
3234 && reg_nr <= tdep->FV_LAST_REGNUM)
3235 return sh_sh4_build_float_register_type (3);
3236 else
3237 return builtin_type_int;
3238 }
3239
3240 static struct type *
3241 sh_sh64_register_virtual_type (int reg_nr)
3242 {
3243 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3244
3245 if ((reg_nr >= FP0_REGNUM
3246 && reg_nr <= tdep->FP_LAST_REGNUM)
3247 || (reg_nr >= tdep->FP0_C_REGNUM
3248 && reg_nr <= tdep->FP_LAST_C_REGNUM))
3249 return builtin_type_float;
3250 else if ((reg_nr >= tdep->DR0_REGNUM
3251 && reg_nr <= tdep->DR_LAST_REGNUM)
3252 || (reg_nr >= tdep->DR0_C_REGNUM
3253 && reg_nr <= tdep->DR_LAST_C_REGNUM))
3254 return builtin_type_double;
3255 else if (reg_nr >= tdep->FPP0_REGNUM
3256 && reg_nr <= tdep->FPP_LAST_REGNUM)
3257 return sh_sh4_build_float_register_type (1);
3258 else if ((reg_nr >= tdep->FV0_REGNUM
3259 && reg_nr <= tdep->FV_LAST_REGNUM)
3260 ||(reg_nr >= tdep->FV0_C_REGNUM
3261 && reg_nr <= tdep->FV_LAST_C_REGNUM))
3262 return sh_sh4_build_float_register_type (3);
3263 else if (reg_nr == tdep->FPSCR_REGNUM)
3264 return builtin_type_int;
3265 else if (reg_nr >= tdep->R0_C_REGNUM
3266 && reg_nr < tdep->FP0_C_REGNUM)
3267 return builtin_type_int;
3268 else
3269 return builtin_type_long_long;
3270 }
3271
3272 static struct type *
3273 sh_default_register_virtual_type (int reg_nr)
3274 {
3275 return builtin_type_int;
3276 }
3277
3278 /* On the sh4, the DRi pseudo registers are problematic if the target
3279 is little endian. When the user writes one of those registers, for
3280 instance with 'ser var $dr0=1', we want the double to be stored
3281 like this:
3282 fr0 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f
3283 fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3284
3285 This corresponds to little endian byte order & big endian word
3286 order. However if we let gdb write the register w/o conversion, it
3287 will write fr0 and fr1 this way:
3288 fr0 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3289 fr1 = 0x00 0x00 0x00 0x00 0x00 0xf0 0x3f
3290 because it will consider fr0 and fr1 as a single LE stretch of memory.
3291
3292 To achieve what we want we must force gdb to store things in
3293 floatformat_ieee_double_littlebyte_bigword (which is defined in
3294 include/floatformat.h and libiberty/floatformat.c.
3295
3296 In case the target is big endian, there is no problem, the
3297 raw bytes will look like:
3298 fr0 = 0x3f 0xf0 0x00 0x00 0x00 0x00 0x00
3299 fr1 = 0x00 0x00 0x00 0x00 0x00 0x00 0x00
3300
3301 The other pseudo registers (the FVs) also don't pose a problem
3302 because they are stored as 4 individual FP elements. */
3303
3304 static void
3305 sh_sh4_register_convert_to_virtual (int regnum, struct type *type,
3306 char *from, char *to)
3307 {
3308 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3309
3310 if (regnum >= tdep->DR0_REGNUM
3311 && regnum <= tdep->DR_LAST_REGNUM)
3312 {
3313 DOUBLEST val;
3314 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
3315 store_floating (to, TYPE_LENGTH (type), val);
3316 }
3317 else
3318 error ("sh_register_convert_to_virtual called with non DR register number");
3319 }
3320
3321 void
3322 sh_sh64_register_convert_to_virtual (int regnum, struct type *type,
3323 char *from, char *to)
3324 {
3325 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3326
3327 if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3328 {
3329 /* It is a no-op. */
3330 memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3331 return;
3332 }
3333
3334 if ((regnum >= tdep->DR0_REGNUM
3335 && regnum <= tdep->DR_LAST_REGNUM)
3336 || (regnum >= tdep->DR0_C_REGNUM
3337 && regnum <= tdep->DR_LAST_C_REGNUM))
3338 {
3339 DOUBLEST val;
3340 floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword, from, &val);
3341 store_floating(to, TYPE_LENGTH(type), val);
3342 }
3343 else
3344 error("sh_register_convert_to_virtual called with non DR register number");
3345 }
3346
3347 static void
3348 sh_sh4_register_convert_to_raw (struct type *type, int regnum,
3349 const void *from, void *to)
3350 {
3351 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3352
3353 if (regnum >= tdep->DR0_REGNUM
3354 && regnum <= tdep->DR_LAST_REGNUM)
3355 {
3356 DOUBLEST val = extract_floating (from, TYPE_LENGTH(type));
3357 floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3358 }
3359 else
3360 error("sh_register_convert_to_raw called with non DR register number");
3361 }
3362
3363 void
3364 sh_sh64_register_convert_to_raw (struct type *type, int regnum,
3365 const void *from, void *to)
3366 {
3367 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3368
3369 if (TARGET_BYTE_ORDER != BFD_ENDIAN_LITTLE)
3370 {
3371 /* It is a no-op. */
3372 memcpy (to, from, REGISTER_RAW_SIZE (regnum));
3373 return;
3374 }
3375
3376 if ((regnum >= tdep->DR0_REGNUM
3377 && regnum <= tdep->DR_LAST_REGNUM)
3378 || (regnum >= tdep->DR0_C_REGNUM
3379 && regnum <= tdep->DR_LAST_C_REGNUM))
3380 {
3381 DOUBLEST val = extract_floating (from, TYPE_LENGTH(type));
3382 floatformat_from_doublest (&floatformat_ieee_double_littlebyte_bigword, &val, to);
3383 }
3384 else
3385 error("sh_register_convert_to_raw called with non DR register number");
3386 }
3387
3388 void
3389 sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3390 int reg_nr, void *buffer)
3391 {
3392 int base_regnum, portion;
3393 char *temp_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
3394 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3395
3396 if (reg_nr >= tdep->DR0_REGNUM
3397 && reg_nr <= tdep->DR_LAST_REGNUM)
3398 {
3399 base_regnum = dr_reg_base_num (reg_nr);
3400
3401 /* Build the value in the provided buffer. */
3402 /* Read the real regs for which this one is an alias. */
3403 for (portion = 0; portion < 2; portion++)
3404 regcache_raw_read (regcache, base_regnum + portion,
3405 (temp_buffer
3406 + REGISTER_RAW_SIZE (base_regnum) * portion));
3407 /* We must pay attention to the endiannes. */
3408 sh_sh4_register_convert_to_virtual (reg_nr,
3409 REGISTER_VIRTUAL_TYPE (reg_nr),
3410 temp_buffer, buffer);
3411 }
3412 else if (reg_nr >= tdep->FV0_REGNUM
3413 && reg_nr <= tdep->FV_LAST_REGNUM)
3414 {
3415 base_regnum = fv_reg_base_num (reg_nr);
3416
3417 /* Read the real regs for which this one is an alias. */
3418 for (portion = 0; portion < 4; portion++)
3419 regcache_raw_read (regcache, base_regnum + portion,
3420 ((char *) buffer
3421 + REGISTER_RAW_SIZE (base_regnum) * portion));
3422 }
3423 }
3424
3425 static void
3426 sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
3427 int reg_nr, void *buffer)
3428 {
3429 int base_regnum;
3430 int portion;
3431 int offset = 0;
3432 char *temp_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
3433 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3434
3435 if (reg_nr >= tdep->DR0_REGNUM
3436 && reg_nr <= tdep->DR_LAST_REGNUM)
3437 {
3438 base_regnum = dr_reg_base_num (reg_nr);
3439
3440 /* Build the value in the provided buffer. */
3441 /* DR regs are double precision registers obtained by
3442 concatenating 2 single precision floating point registers. */
3443 for (portion = 0; portion < 2; portion++)
3444 regcache_raw_read (regcache, base_regnum + portion,
3445 (temp_buffer
3446 + REGISTER_RAW_SIZE (base_regnum) * portion));
3447
3448 /* We must pay attention to the endiannes. */
3449 sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3450 temp_buffer, buffer);
3451
3452 }
3453
3454 else if (reg_nr >= tdep->FPP0_REGNUM
3455 && reg_nr <= tdep->FPP_LAST_REGNUM)
3456 {
3457 base_regnum = fpp_reg_base_num (reg_nr);
3458
3459 /* Build the value in the provided buffer. */
3460 /* FPP regs are pairs of single precision registers obtained by
3461 concatenating 2 single precision floating point registers. */
3462 for (portion = 0; portion < 2; portion++)
3463 regcache_raw_read (regcache, base_regnum + portion,
3464 ((char *) buffer
3465 + REGISTER_RAW_SIZE (base_regnum) * portion));
3466 }
3467
3468 else if (reg_nr >= tdep->FV0_REGNUM
3469 && reg_nr <= tdep->FV_LAST_REGNUM)
3470 {
3471 base_regnum = fv_reg_base_num (reg_nr);
3472
3473 /* Build the value in the provided buffer. */
3474 /* FV regs are vectors of single precision registers obtained by
3475 concatenating 4 single precision floating point registers. */
3476 for (portion = 0; portion < 4; portion++)
3477 regcache_raw_read (regcache, base_regnum + portion,
3478 ((char *) buffer
3479 + REGISTER_RAW_SIZE (base_regnum) * portion));
3480 }
3481
3482 /* sh compact pseudo registers. 1-to-1 with a shmedia register */
3483 else if (reg_nr >= tdep->R0_C_REGNUM
3484 && reg_nr <= tdep->T_C_REGNUM)
3485 {
3486 base_regnum = sh64_compact_reg_base_num (reg_nr);
3487
3488 /* Build the value in the provided buffer. */
3489 regcache_raw_read (regcache, base_regnum, temp_buffer);
3490 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3491 offset = 4;
3492 memcpy (buffer, temp_buffer + offset, 4); /* get LOWER 32 bits only????*/
3493 }
3494
3495 else if (reg_nr >= tdep->FP0_C_REGNUM
3496 && reg_nr <= tdep->FP_LAST_C_REGNUM)
3497 {
3498 base_regnum = sh64_compact_reg_base_num (reg_nr);
3499
3500 /* Build the value in the provided buffer. */
3501 /* Floating point registers map 1-1 to the media fp regs,
3502 they have the same size and endienness. */
3503 regcache_raw_read (regcache, base_regnum, buffer);
3504 }
3505
3506 else if (reg_nr >= tdep->DR0_C_REGNUM
3507 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3508 {
3509 base_regnum = sh64_compact_reg_base_num (reg_nr);
3510
3511 /* DR_C regs are double precision registers obtained by
3512 concatenating 2 single precision floating point registers. */
3513 for (portion = 0; portion < 2; portion++)
3514 regcache_raw_read (regcache, base_regnum + portion,
3515 (temp_buffer
3516 + REGISTER_RAW_SIZE (base_regnum) * portion));
3517
3518 /* We must pay attention to the endiannes. */
3519 sh_sh64_register_convert_to_virtual (reg_nr, REGISTER_VIRTUAL_TYPE (reg_nr),
3520 temp_buffer, buffer);
3521 }
3522
3523 else if (reg_nr >= tdep->FV0_C_REGNUM
3524 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3525 {
3526 base_regnum = sh64_compact_reg_base_num (reg_nr);
3527
3528 /* Build the value in the provided buffer. */
3529 /* FV_C regs are vectors of single precision registers obtained by
3530 concatenating 4 single precision floating point registers. */
3531 for (portion = 0; portion < 4; portion++)
3532 regcache_raw_read (regcache, base_regnum + portion,
3533 ((char *) buffer
3534 + REGISTER_RAW_SIZE (base_regnum) * portion));
3535 }
3536
3537 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3538 {
3539 int fpscr_base_regnum;
3540 int sr_base_regnum;
3541 unsigned int fpscr_value;
3542 unsigned int sr_value;
3543 unsigned int fpscr_c_value;
3544 unsigned int fpscr_c_part1_value;
3545 unsigned int fpscr_c_part2_value;
3546
3547 fpscr_base_regnum = tdep->FPSCR_REGNUM;
3548 sr_base_regnum = tdep->SR_REGNUM;
3549
3550 /* Build the value in the provided buffer. */
3551 /* FPSCR_C is a very weird register that contains sparse bits
3552 from the FPSCR and the SR architectural registers.
3553 Specifically: */
3554 /* *INDENT-OFF* */
3555 /*
3556 FPSRC_C bit
3557 0 Bit 0 of FPSCR
3558 1 reserved
3559 2-17 Bit 2-18 of FPSCR
3560 18-20 Bits 12,13,14 of SR
3561 21-31 reserved
3562 */
3563 /* *INDENT-ON* */
3564 /* Get FPSCR into a local buffer */
3565 regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
3566 /* Get value as an int. */
3567 fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3568 /* Get SR into a local buffer */
3569 regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
3570 /* Get value as an int. */
3571 sr_value = extract_unsigned_integer (temp_buffer, 4);
3572 /* Build the new value. */
3573 fpscr_c_part1_value = fpscr_value & 0x3fffd;
3574 fpscr_c_part2_value = (sr_value & 0x7000) << 6;
3575 fpscr_c_value = fpscr_c_part1_value | fpscr_c_part2_value;
3576 /* Store that in out buffer!!! */
3577 store_unsigned_integer (buffer, 4, fpscr_c_value);
3578 /* FIXME There is surely an endianness gotcha here. */
3579 }
3580
3581 else if (reg_nr == tdep->FPUL_C_REGNUM)
3582 {
3583 base_regnum = sh64_compact_reg_base_num (reg_nr);
3584
3585 /* FPUL_C register is floating point register 32,
3586 same size, same endianness. */
3587 regcache_raw_read (regcache, base_regnum, buffer);
3588 }
3589 }
3590
3591 void
3592 sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3593 int reg_nr, const void *buffer)
3594 {
3595 int base_regnum, portion;
3596 char *temp_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
3597 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3598
3599 if (reg_nr >= tdep->DR0_REGNUM
3600 && reg_nr <= tdep->DR_LAST_REGNUM)
3601 {
3602 base_regnum = dr_reg_base_num (reg_nr);
3603
3604 /* We must pay attention to the endiannes. */
3605 sh_sh4_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3606 buffer, temp_buffer);
3607
3608 /* Write the real regs for which this one is an alias. */
3609 for (portion = 0; portion < 2; portion++)
3610 regcache_raw_write (regcache, base_regnum + portion,
3611 (temp_buffer
3612 + REGISTER_RAW_SIZE (base_regnum) * portion));
3613 }
3614 else if (reg_nr >= tdep->FV0_REGNUM
3615 && reg_nr <= tdep->FV_LAST_REGNUM)
3616 {
3617 base_regnum = fv_reg_base_num (reg_nr);
3618
3619 /* Write the real regs for which this one is an alias. */
3620 for (portion = 0; portion < 4; portion++)
3621 regcache_raw_write (regcache, base_regnum + portion,
3622 ((char *) buffer
3623 + REGISTER_RAW_SIZE (base_regnum) * portion));
3624 }
3625 }
3626
3627 void
3628 sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
3629 int reg_nr, const void *buffer)
3630 {
3631 int base_regnum, portion;
3632 int offset;
3633 char *temp_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
3634 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3635
3636 if (reg_nr >= tdep->DR0_REGNUM
3637 && reg_nr <= tdep->DR_LAST_REGNUM)
3638 {
3639 base_regnum = dr_reg_base_num (reg_nr);
3640 /* We must pay attention to the endiannes. */
3641 sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3642 buffer, temp_buffer);
3643
3644
3645 /* Write the real regs for which this one is an alias. */
3646 for (portion = 0; portion < 2; portion++)
3647 regcache_raw_write (regcache, base_regnum + portion,
3648 (temp_buffer
3649 + REGISTER_RAW_SIZE (base_regnum) * portion));
3650 }
3651
3652 else if (reg_nr >= tdep->FPP0_REGNUM
3653 && reg_nr <= tdep->FPP_LAST_REGNUM)
3654 {
3655 base_regnum = fpp_reg_base_num (reg_nr);
3656
3657 /* Write the real regs for which this one is an alias. */
3658 for (portion = 0; portion < 2; portion++)
3659 regcache_raw_write (regcache, base_regnum + portion,
3660 ((char *) buffer
3661 + REGISTER_RAW_SIZE (base_regnum) * portion));
3662 }
3663
3664 else if (reg_nr >= tdep->FV0_REGNUM
3665 && reg_nr <= tdep->FV_LAST_REGNUM)
3666 {
3667 base_regnum = fv_reg_base_num (reg_nr);
3668
3669 /* Write the real regs for which this one is an alias. */
3670 for (portion = 0; portion < 4; portion++)
3671 regcache_raw_write (regcache, base_regnum + portion,
3672 ((char *) buffer
3673 + REGISTER_RAW_SIZE (base_regnum) * portion));
3674 }
3675
3676 /* sh compact general pseudo registers. 1-to-1 with a shmedia
3677 register but only 4 bytes of it. */
3678 else if (reg_nr >= tdep->R0_C_REGNUM
3679 && reg_nr <= tdep->T_C_REGNUM)
3680 {
3681 base_regnum = sh64_compact_reg_base_num (reg_nr);
3682 /* reg_nr is 32 bit here, and base_regnum is 64 bits. */
3683 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
3684 offset = 4;
3685 else
3686 offset = 0;
3687 /* Let's read the value of the base register into a temporary
3688 buffer, so that overwriting the last four bytes with the new
3689 value of the pseudo will leave the upper 4 bytes unchanged. */
3690 regcache_raw_read (regcache, base_regnum, temp_buffer);
3691 /* Write as an 8 byte quantity */
3692 memcpy (temp_buffer + offset, buffer, 4);
3693 regcache_raw_write (regcache, base_regnum, temp_buffer);
3694 }
3695
3696 /* sh floating point compact pseudo registers. 1-to-1 with a shmedia
3697 registers. Both are 4 bytes. */
3698 else if (reg_nr >= tdep->FP0_C_REGNUM
3699 && reg_nr <= tdep->FP_LAST_C_REGNUM)
3700 {
3701 base_regnum = sh64_compact_reg_base_num (reg_nr);
3702 regcache_raw_write (regcache, base_regnum, buffer);
3703 }
3704
3705 else if (reg_nr >= tdep->DR0_C_REGNUM
3706 && reg_nr <= tdep->DR_LAST_C_REGNUM)
3707 {
3708 base_regnum = sh64_compact_reg_base_num (reg_nr);
3709 for (portion = 0; portion < 2; portion++)
3710 {
3711 /* We must pay attention to the endiannes. */
3712 sh_sh64_register_convert_to_raw (REGISTER_VIRTUAL_TYPE (reg_nr), reg_nr,
3713 buffer, temp_buffer);
3714
3715 regcache_raw_write (regcache, base_regnum + portion,
3716 (temp_buffer
3717 + REGISTER_RAW_SIZE (base_regnum) * portion));
3718 }
3719 }
3720
3721 else if (reg_nr >= tdep->FV0_C_REGNUM
3722 && reg_nr <= tdep->FV_LAST_C_REGNUM)
3723 {
3724 base_regnum = sh64_compact_reg_base_num (reg_nr);
3725
3726 for (portion = 0; portion < 4; portion++)
3727 {
3728 regcache_raw_write (regcache, base_regnum + portion,
3729 ((char *) buffer
3730 + REGISTER_RAW_SIZE (base_regnum) * portion));
3731 }
3732 }
3733
3734 else if (reg_nr == tdep->FPSCR_C_REGNUM)
3735 {
3736 int fpscr_base_regnum;
3737 int sr_base_regnum;
3738 unsigned int fpscr_value;
3739 unsigned int sr_value;
3740 unsigned int old_fpscr_value;
3741 unsigned int old_sr_value;
3742 unsigned int fpscr_c_value;
3743 unsigned int fpscr_mask;
3744 unsigned int sr_mask;
3745
3746 fpscr_base_regnum = tdep->FPSCR_REGNUM;
3747 sr_base_regnum = tdep->SR_REGNUM;
3748
3749 /* FPSCR_C is a very weird register that contains sparse bits
3750 from the FPSCR and the SR architectural registers.
3751 Specifically: */
3752 /* *INDENT-OFF* */
3753 /*
3754 FPSRC_C bit
3755 0 Bit 0 of FPSCR
3756 1 reserved
3757 2-17 Bit 2-18 of FPSCR
3758 18-20 Bits 12,13,14 of SR
3759 21-31 reserved
3760 */
3761 /* *INDENT-ON* */
3762 /* Get value as an int. */
3763 fpscr_c_value = extract_unsigned_integer (buffer, 4);
3764
3765 /* Build the new values. */
3766 fpscr_mask = 0x0003fffd;
3767 sr_mask = 0x001c0000;
3768
3769 fpscr_value = fpscr_c_value & fpscr_mask;
3770 sr_value = (fpscr_value & sr_mask) >> 6;
3771
3772 regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer);
3773 old_fpscr_value = extract_unsigned_integer (temp_buffer, 4);
3774 old_fpscr_value &= 0xfffc0002;
3775 fpscr_value |= old_fpscr_value;
3776 store_unsigned_integer (temp_buffer, 4, fpscr_value);
3777 regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer);
3778
3779 regcache_raw_read (regcache, sr_base_regnum, temp_buffer);
3780 old_sr_value = extract_unsigned_integer (temp_buffer, 4);
3781 old_sr_value &= 0xffff8fff;
3782 sr_value |= old_sr_value;
3783 store_unsigned_integer (temp_buffer, 4, sr_value);
3784 regcache_raw_write (regcache, sr_base_regnum, temp_buffer);
3785 }
3786
3787 else if (reg_nr == tdep->FPUL_C_REGNUM)
3788 {
3789 base_regnum = sh64_compact_reg_base_num (reg_nr);
3790 regcache_raw_write (regcache, base_regnum, buffer);
3791 }
3792 }
3793
3794 /* Floating point vector of 4 float registers. */
3795 static void
3796 do_fv_register_info (int fv_regnum)
3797 {
3798 int first_fp_reg_num = fv_reg_base_num (fv_regnum);
3799 printf_filtered ("fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
3800 fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_REGNUM,
3801 (int) read_register (first_fp_reg_num),
3802 (int) read_register (first_fp_reg_num + 1),
3803 (int) read_register (first_fp_reg_num + 2),
3804 (int) read_register (first_fp_reg_num + 3));
3805 }
3806
3807 /* Floating point vector of 4 float registers, compact mode. */
3808 static void
3809 do_fv_c_register_info (int fv_regnum)
3810 {
3811 int first_fp_reg_num = sh64_compact_reg_base_num (fv_regnum);
3812 printf_filtered ("fv%d_c\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n",
3813 fv_regnum - gdbarch_tdep (current_gdbarch)->FV0_C_REGNUM,
3814 (int) read_register (first_fp_reg_num),
3815 (int) read_register (first_fp_reg_num + 1),
3816 (int) read_register (first_fp_reg_num + 2),
3817 (int) read_register (first_fp_reg_num + 3));
3818 }
3819
3820 /* Pairs of single regs. The DR are instead double precision
3821 registers. */
3822 static void
3823 do_fpp_register_info (int fpp_regnum)
3824 {
3825 int first_fp_reg_num = fpp_reg_base_num (fpp_regnum);
3826
3827 printf_filtered ("fpp%d\t0x%08x\t0x%08x\n",
3828 fpp_regnum - gdbarch_tdep (current_gdbarch)->FPP0_REGNUM,
3829 (int) read_register (first_fp_reg_num),
3830 (int) read_register (first_fp_reg_num + 1));
3831 }
3832
3833 /* Double precision registers. */
3834 static void
3835 do_dr_register_info (int dr_regnum)
3836 {
3837 int first_fp_reg_num = dr_reg_base_num (dr_regnum);
3838
3839 printf_filtered ("dr%d\t0x%08x%08x\n",
3840 dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_REGNUM,
3841 (int) read_register (first_fp_reg_num),
3842 (int) read_register (first_fp_reg_num + 1));
3843 }
3844
3845 /* Double precision registers, compact mode. */
3846 static void
3847 do_dr_c_register_info (int dr_regnum)
3848 {
3849 int first_fp_reg_num = sh64_compact_reg_base_num (dr_regnum);
3850
3851 printf_filtered ("dr%d_c\t0x%08x%08x\n",
3852 dr_regnum - gdbarch_tdep (current_gdbarch)->DR0_C_REGNUM,
3853 (int) read_register (first_fp_reg_num),
3854 (int) read_register (first_fp_reg_num +1));
3855 }
3856
3857 /* General register in compact mode. */
3858 static void
3859 do_r_c_register_info (int r_c_regnum)
3860 {
3861 int regnum = sh64_compact_reg_base_num (r_c_regnum);
3862
3863 printf_filtered ("r%d_c\t0x%08x\n",
3864 r_c_regnum - gdbarch_tdep (current_gdbarch)->R0_C_REGNUM,
3865 /*FIXME!!!*/ (int) read_register (regnum));
3866 }
3867
3868 /* FIXME:!! THIS SHOULD TAKE CARE OF GETTING THE RIGHT PORTION OF THE
3869 shmedia REGISTERS. */
3870 /* Control registers, compact mode. */
3871 static void
3872 do_cr_c_register_info (int cr_c_regnum)
3873 {
3874 switch (cr_c_regnum)
3875 {
3876 case 237: printf_filtered ("pc_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3877 break;
3878 case 238: printf_filtered ("gbr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3879 break;
3880 case 239: printf_filtered ("mach_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3881 break;
3882 case 240: printf_filtered ("macl_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3883 break;
3884 case 241: printf_filtered ("pr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3885 break;
3886 case 242: printf_filtered ("t_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3887 break;
3888 case 243: printf_filtered ("fpscr_c\t0x%08x\n", (int) read_register (cr_c_regnum));
3889 break;
3890 case 244: printf_filtered ("fpul_c\t0x%08x\n", (int)read_register (cr_c_regnum));
3891 break;
3892 }
3893 }
3894
3895 static void
3896 sh_do_pseudo_register (int regnum)
3897 {
3898 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3899
3900 if (regnum < NUM_REGS || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
3901 internal_error (__FILE__, __LINE__,
3902 "Invalid pseudo register number %d\n", regnum);
3903 else if (regnum >= tdep->DR0_REGNUM
3904 && regnum < tdep->DR_LAST_REGNUM)
3905 do_dr_register_info (regnum);
3906 else if (regnum >= tdep->FV0_REGNUM
3907 && regnum <= tdep->FV_LAST_REGNUM)
3908 do_fv_register_info (regnum);
3909 }
3910
3911 static void
3912 sh_do_fp_register (int regnum)
3913 { /* do values for FP (float) regs */
3914 char *raw_buffer;
3915 double flt; /* double extracted from raw hex data */
3916 int inv;
3917 int j;
3918
3919 /* Allocate space for the float. */
3920 raw_buffer = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
3921
3922 /* Get the data in raw format. */
3923 if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
3924 error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
3925
3926 /* Get the register as a number */
3927 flt = unpack_double (builtin_type_float, raw_buffer, &inv);
3928
3929 /* Print the name and some spaces. */
3930 fputs_filtered (REGISTER_NAME (regnum), gdb_stdout);
3931 print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), gdb_stdout);
3932
3933 /* Print the value. */
3934 if (inv)
3935 printf_filtered ("<invalid float>");
3936 else
3937 printf_filtered ("%-10.9g", flt);
3938
3939 /* Print the fp register as hex. */
3940 printf_filtered ("\t(raw 0x");
3941 for (j = 0; j < REGISTER_RAW_SIZE (regnum); j++)
3942 {
3943 register int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
3944 : REGISTER_RAW_SIZE (regnum) - 1 - j;
3945 printf_filtered ("%02x", (unsigned char) raw_buffer[idx]);
3946 }
3947 printf_filtered (")");
3948 printf_filtered ("\n");
3949 }
3950
3951 static void
3952 sh64_do_pseudo_register (int regnum)
3953 {
3954 /* All the sh64-compact mode registers are pseudo registers. */
3955 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3956
3957 if (regnum < NUM_REGS
3958 || regnum >= NUM_REGS + NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT)
3959 internal_error (__FILE__, __LINE__,
3960 "Invalid pseudo register number %d\n", regnum);
3961
3962 else if ((regnum >= tdep->DR0_REGNUM
3963 && regnum <= tdep->DR_LAST_REGNUM))
3964 do_dr_register_info (regnum);
3965
3966 else if ((regnum >= tdep->DR0_C_REGNUM
3967 && regnum <= tdep->DR_LAST_C_REGNUM))
3968 do_dr_c_register_info (regnum);
3969
3970 else if ((regnum >= tdep->FV0_REGNUM
3971 && regnum <= tdep->FV_LAST_REGNUM))
3972 do_fv_register_info (regnum);
3973
3974 else if ((regnum >= tdep->FV0_C_REGNUM
3975 && regnum <= tdep->FV_LAST_C_REGNUM))
3976 do_fv_c_register_info (regnum);
3977
3978 else if (regnum >= tdep->FPP0_REGNUM
3979 && regnum <= tdep->FPP_LAST_REGNUM)
3980 do_fpp_register_info (regnum);
3981
3982 else if (regnum >= tdep->R0_C_REGNUM
3983 && regnum <= tdep->R_LAST_C_REGNUM)
3984 do_r_c_register_info (regnum); /* FIXME, this function will not print the right format */
3985
3986 else if (regnum >= tdep->FP0_C_REGNUM
3987 && regnum <= tdep->FP_LAST_C_REGNUM)
3988 sh_do_fp_register (regnum); /* this should work also for pseudoregs */
3989
3990 else if (regnum >= tdep->PC_C_REGNUM
3991 && regnum <= tdep->FPUL_C_REGNUM)
3992 do_cr_c_register_info (regnum);
3993
3994 }
3995
3996 static void
3997 sh_do_register (int regnum)
3998 {
3999 char raw_buffer[MAX_REGISTER_RAW_SIZE];
4000
4001 fputs_filtered (REGISTER_NAME (regnum), gdb_stdout);
4002 print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), gdb_stdout);
4003
4004 /* Get the data in raw format. */
4005 if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
4006 printf_filtered ("*value not available*\n");
4007
4008 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0, 0,
4009 gdb_stdout, 'x', 1, 0, Val_pretty_default);
4010 printf_filtered ("\t");
4011 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0, 0,
4012 gdb_stdout, 0, 1, 0, Val_pretty_default);
4013 printf_filtered ("\n");
4014 }
4015
4016 static void
4017 sh_print_register (int regnum)
4018 {
4019 if (regnum < 0 || regnum >= NUM_REGS + NUM_PSEUDO_REGS)
4020 internal_error (__FILE__, __LINE__,
4021 "Invalid register number %d\n", regnum);
4022
4023 else if (regnum >= 0 && regnum < NUM_REGS)
4024 {
4025 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
4026 sh_do_fp_register (regnum); /* FP regs */
4027 else
4028 sh_do_register (regnum); /* All other regs */
4029 }
4030
4031 else if (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4032 do_pseudo_register (regnum);
4033 }
4034
4035 void
4036 sh_do_registers_info (int regnum, int fpregs)
4037 {
4038 if (regnum != -1) /* do one specified register */
4039 {
4040 if (*(REGISTER_NAME (regnum)) == '\0')
4041 error ("Not a valid register for the current processor type");
4042
4043 sh_print_register (regnum);
4044 }
4045 else
4046 /* do all (or most) registers */
4047 {
4048 regnum = 0;
4049 while (regnum < NUM_REGS)
4050 {
4051 /* If the register name is empty, it is undefined for this
4052 processor, so don't display anything. */
4053 if (REGISTER_NAME (regnum) == NULL
4054 || *(REGISTER_NAME (regnum)) == '\0')
4055 {
4056 regnum++;
4057 continue;
4058 }
4059
4060 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
4061 {
4062 if (fpregs)
4063 {
4064 /* true for "INFO ALL-REGISTERS" command */
4065 sh_do_fp_register (regnum); /* FP regs */
4066 regnum ++;
4067 }
4068 else
4069 regnum += (gdbarch_tdep (current_gdbarch)->FP_LAST_REGNUM - FP0_REGNUM); /* skip FP regs */
4070 }
4071 else
4072 {
4073 sh_do_register (regnum); /* All other regs */
4074 regnum++;
4075 }
4076 }
4077
4078 if (fpregs)
4079 while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4080 {
4081 do_pseudo_register (regnum);
4082 regnum++;
4083 }
4084 }
4085 }
4086
4087 void
4088 sh_compact_do_registers_info (int regnum, int fpregs)
4089 {
4090 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4091 if (regnum != -1) /* do one specified register */
4092 {
4093 if (*(REGISTER_NAME (regnum)) == '\0')
4094 error ("Not a valid register for the current processor type");
4095
4096 if (regnum >= 0 && regnum < tdep->R0_C_REGNUM)
4097 error ("Not a valid register for the current processor mode.");
4098
4099 sh_print_register (regnum);
4100 }
4101 else
4102 /* do all compact registers */
4103 {
4104 regnum = tdep->R0_C_REGNUM;
4105 while (regnum < NUM_REGS + NUM_PSEUDO_REGS)
4106 {
4107 do_pseudo_register (regnum);
4108 regnum++;
4109 }
4110 }
4111 }
4112
4113 void
4114 sh64_do_registers_info (int regnum, int fpregs)
4115 {
4116 if (pc_is_isa32 (get_frame_pc (deprecated_selected_frame)))
4117 sh_do_registers_info (regnum, fpregs);
4118 else
4119 sh_compact_do_registers_info (regnum, fpregs);
4120 }
4121
4122 #ifdef SVR4_SHARED_LIBS
4123
4124 /* Fetch (and possibly build) an appropriate link_map_offsets structure
4125 for native i386 linux targets using the struct offsets defined in
4126 link.h (but without actual reference to that file).
4127
4128 This makes it possible to access i386-linux shared libraries from
4129 a gdb that was not built on an i386-linux host (for cross debugging).
4130 */
4131
4132 struct link_map_offsets *
4133 sh_linux_svr4_fetch_link_map_offsets (void)
4134 {
4135 static struct link_map_offsets lmo;
4136 static struct link_map_offsets *lmp = 0;
4137
4138 if (lmp == 0)
4139 {
4140 lmp = &lmo;
4141
4142 lmo.r_debug_size = 8; /* 20 not actual size but all we need */
4143
4144 lmo.r_map_offset = 4;
4145 lmo.r_map_size = 4;
4146
4147 lmo.link_map_size = 20; /* 552 not actual size but all we need */
4148
4149 lmo.l_addr_offset = 0;
4150 lmo.l_addr_size = 4;
4151
4152 lmo.l_name_offset = 4;
4153 lmo.l_name_size = 4;
4154
4155 lmo.l_next_offset = 12;
4156 lmo.l_next_size = 4;
4157
4158 lmo.l_prev_offset = 16;
4159 lmo.l_prev_size = 4;
4160 }
4161
4162 return lmp;
4163 }
4164 #endif /* SVR4_SHARED_LIBS */
4165
4166 \f
4167 enum
4168 {
4169 DSP_DSR_REGNUM = 24,
4170 DSP_A0G_REGNUM,
4171 DSP_A0_REGNUM,
4172 DSP_A1G_REGNUM,
4173 DSP_A1_REGNUM,
4174 DSP_M0_REGNUM,
4175 DSP_M1_REGNUM,
4176 DSP_X0_REGNUM,
4177 DSP_X1_REGNUM,
4178 DSP_Y0_REGNUM,
4179 DSP_Y1_REGNUM,
4180
4181 DSP_MOD_REGNUM = 40,
4182
4183 DSP_RS_REGNUM = 43,
4184 DSP_RE_REGNUM,
4185
4186 DSP_R0_BANK_REGNUM = 51,
4187 DSP_R7_BANK_REGNUM = DSP_R0_BANK_REGNUM + 7
4188 };
4189
4190 static int
4191 sh_dsp_register_sim_regno (int nr)
4192 {
4193 if (legacy_register_sim_regno (nr) < 0)
4194 return legacy_register_sim_regno (nr);
4195 if (nr >= DSP_DSR_REGNUM && nr < DSP_Y1_REGNUM)
4196 return nr - DSP_DSR_REGNUM + SIM_SH_DSR_REGNUM;
4197 if (nr == DSP_MOD_REGNUM)
4198 return SIM_SH_MOD_REGNUM;
4199 if (nr == DSP_RS_REGNUM)
4200 return SIM_SH_RS_REGNUM;
4201 if (nr == DSP_RE_REGNUM)
4202 return SIM_SH_RE_REGNUM;
4203 if (nr >= DSP_R0_BANK_REGNUM && nr <= DSP_R7_BANK_REGNUM)
4204 return nr - DSP_R0_BANK_REGNUM + SIM_SH_R0_BANK_REGNUM;
4205 return nr;
4206 }
4207 \f
4208 static gdbarch_init_ftype sh_gdbarch_init;
4209
4210 static struct gdbarch *
4211 sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
4212 {
4213 static LONGEST sh_call_dummy_words[] = {0};
4214 struct gdbarch *gdbarch;
4215 struct gdbarch_tdep *tdep;
4216 gdbarch_register_name_ftype *sh_register_name;
4217 gdbarch_deprecated_store_return_value_ftype *sh_store_return_value;
4218 gdbarch_register_virtual_type_ftype *sh_register_virtual_type;
4219 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
4220
4221 /* Try to determine the ABI of the object we are loading. */
4222
4223 if (info.abfd != NULL)
4224 {
4225 osabi = gdbarch_lookup_osabi (info.abfd);
4226 /* If we get "unknown" back, just leave it that way. */
4227 }
4228
4229 /* Find a candidate among the list of pre-declared architectures. */
4230 for (arches = gdbarch_list_lookup_by_info (arches, &info);
4231 arches != NULL;
4232 arches = gdbarch_list_lookup_by_info (arches->next, &info))
4233 {
4234 /* Make sure the ABI selection matches. */
4235 tdep = gdbarch_tdep (arches->gdbarch);
4236 if (tdep && tdep->osabi == osabi)
4237 return arches->gdbarch;
4238 }
4239
4240 /* None found, create a new architecture from the information
4241 provided. */
4242 tdep = XMALLOC (struct gdbarch_tdep);
4243 gdbarch = gdbarch_alloc (&info, tdep);
4244
4245 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
4246 ready to unwind the PC first (see frame.c:get_prev_frame()). */
4247 set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
4248
4249 tdep->osabi = osabi;
4250
4251 /* Initialize the register numbers that are not common to all the
4252 variants to -1, if necessary thse will be overwritten in the case
4253 statement below. */
4254 tdep->FPUL_REGNUM = -1;
4255 tdep->FPSCR_REGNUM = -1;
4256 tdep->PR_REGNUM = 17;
4257 tdep->SR_REGNUM = 22;
4258 tdep->DSR_REGNUM = -1;
4259 tdep->FP_LAST_REGNUM = -1;
4260 tdep->A0G_REGNUM = -1;
4261 tdep->A0_REGNUM = -1;
4262 tdep->A1G_REGNUM = -1;
4263 tdep->A1_REGNUM = -1;
4264 tdep->M0_REGNUM = -1;
4265 tdep->M1_REGNUM = -1;
4266 tdep->X0_REGNUM = -1;
4267 tdep->X1_REGNUM = -1;
4268 tdep->Y0_REGNUM = -1;
4269 tdep->Y1_REGNUM = -1;
4270 tdep->MOD_REGNUM = -1;
4271 tdep->RS_REGNUM = -1;
4272 tdep->RE_REGNUM = -1;
4273 tdep->SSR_REGNUM = -1;
4274 tdep->SPC_REGNUM = -1;
4275 tdep->DR0_REGNUM = -1;
4276 tdep->DR_LAST_REGNUM = -1;
4277 tdep->FV0_REGNUM = -1;
4278 tdep->FV_LAST_REGNUM = -1;
4279 tdep->ARG0_REGNUM = 4;
4280 tdep->ARGLAST_REGNUM = 7;
4281 tdep->RETURN_REGNUM = 0;
4282 tdep->FLOAT_ARGLAST_REGNUM = -1;
4283
4284 tdep->sh_abi = SH_ABI_UNKNOWN;
4285
4286 set_gdbarch_fp0_regnum (gdbarch, -1);
4287 set_gdbarch_num_pseudo_regs (gdbarch, 0);
4288 set_gdbarch_max_register_raw_size (gdbarch, 4);
4289 set_gdbarch_max_register_virtual_size (gdbarch, 4);
4290 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4291 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4292 set_gdbarch_num_regs (gdbarch, SH_DEFAULT_NUM_REGS);
4293 set_gdbarch_sp_regnum (gdbarch, 15);
4294 set_gdbarch_fp_regnum (gdbarch, 14);
4295 set_gdbarch_pc_regnum (gdbarch, 16);
4296 set_gdbarch_register_size (gdbarch, 4);
4297 set_gdbarch_register_bytes (gdbarch, SH_DEFAULT_NUM_REGS * 4);
4298 set_gdbarch_deprecated_do_registers_info (gdbarch, sh_do_registers_info);
4299 set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
4300 set_gdbarch_frame_chain (gdbarch, sh_frame_chain);
4301 set_gdbarch_get_saved_register (gdbarch, deprecated_generic_get_saved_register);
4302 set_gdbarch_init_extra_frame_info (gdbarch, sh_init_extra_frame_info);
4303 set_gdbarch_deprecated_extract_return_value (gdbarch, sh_extract_return_value);
4304 set_gdbarch_push_arguments (gdbarch, sh_push_arguments);
4305 set_gdbarch_store_struct_return (gdbarch, sh_store_struct_return);
4306 set_gdbarch_use_struct_convention (gdbarch, sh_use_struct_convention);
4307 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
4308 set_gdbarch_pop_frame (gdbarch, sh_pop_frame);
4309 set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh);
4310 set_gdbarch_register_sim_regno (gdbarch, legacy_register_sim_regno);
4311 skip_prologue_hard_way = sh_skip_prologue_hard_way;
4312 do_pseudo_register = sh_do_pseudo_register;
4313
4314 switch (info.bfd_arch_info->mach)
4315 {
4316 case bfd_mach_sh:
4317 sh_register_name = sh_sh_register_name;
4318 sh_show_regs = sh_generic_show_regs;
4319 sh_store_return_value = sh_default_store_return_value;
4320 sh_register_virtual_type = sh_default_register_virtual_type;
4321 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4322 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4323 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4324 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4325 break;
4326 case bfd_mach_sh2:
4327 sh_register_name = sh_sh_register_name;
4328 sh_show_regs = sh_generic_show_regs;
4329 sh_store_return_value = sh_default_store_return_value;
4330 sh_register_virtual_type = sh_default_register_virtual_type;
4331 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4332 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4333 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4334 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4335 break;
4336 case bfd_mach_sh_dsp:
4337 sh_register_name = sh_sh_dsp_register_name;
4338 sh_show_regs = sh_dsp_show_regs;
4339 sh_store_return_value = sh_default_store_return_value;
4340 sh_register_virtual_type = sh_default_register_virtual_type;
4341 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4342 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4343 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4344 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4345 set_gdbarch_register_sim_regno (gdbarch, sh_dsp_register_sim_regno);
4346 tdep->DSR_REGNUM = 24;
4347 tdep->A0G_REGNUM = 25;
4348 tdep->A0_REGNUM = 26;
4349 tdep->A1G_REGNUM = 27;
4350 tdep->A1_REGNUM = 28;
4351 tdep->M0_REGNUM = 29;
4352 tdep->M1_REGNUM = 30;
4353 tdep->X0_REGNUM = 31;
4354 tdep->X1_REGNUM = 32;
4355 tdep->Y0_REGNUM = 33;
4356 tdep->Y1_REGNUM = 34;
4357 tdep->MOD_REGNUM = 40;
4358 tdep->RS_REGNUM = 43;
4359 tdep->RE_REGNUM = 44;
4360 break;
4361 case bfd_mach_sh3:
4362 sh_register_name = sh_sh3_register_name;
4363 sh_show_regs = sh3_show_regs;
4364 sh_store_return_value = sh_default_store_return_value;
4365 sh_register_virtual_type = sh_default_register_virtual_type;
4366 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4367 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4368 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4369 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4370 tdep->SSR_REGNUM = 41;
4371 tdep->SPC_REGNUM = 42;
4372 break;
4373 case bfd_mach_sh3e:
4374 sh_register_name = sh_sh3e_register_name;
4375 sh_show_regs = sh3e_show_regs;
4376 sh_store_return_value = sh3e_sh4_store_return_value;
4377 sh_register_virtual_type = sh_sh3e_register_virtual_type;
4378 set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
4379 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4380 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4381 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4382 set_gdbarch_deprecated_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
4383 set_gdbarch_fp0_regnum (gdbarch, 25);
4384 tdep->FPUL_REGNUM = 23;
4385 tdep->FPSCR_REGNUM = 24;
4386 tdep->FP_LAST_REGNUM = 40;
4387 tdep->SSR_REGNUM = 41;
4388 tdep->SPC_REGNUM = 42;
4389 break;
4390 case bfd_mach_sh3_dsp:
4391 sh_register_name = sh_sh3_dsp_register_name;
4392 sh_show_regs = sh3_dsp_show_regs;
4393 sh_store_return_value = sh_default_store_return_value;
4394 sh_register_virtual_type = sh_default_register_virtual_type;
4395 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4396 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4397 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4398 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4399 tdep->DSR_REGNUM = 24;
4400 tdep->A0G_REGNUM = 25;
4401 tdep->A0_REGNUM = 26;
4402 tdep->A1G_REGNUM = 27;
4403 tdep->A1_REGNUM = 28;
4404 tdep->M0_REGNUM = 29;
4405 tdep->M1_REGNUM = 30;
4406 tdep->X0_REGNUM = 31;
4407 tdep->X1_REGNUM = 32;
4408 tdep->Y0_REGNUM = 33;
4409 tdep->Y1_REGNUM = 34;
4410 tdep->MOD_REGNUM = 40;
4411 tdep->RS_REGNUM = 43;
4412 tdep->RE_REGNUM = 44;
4413 tdep->SSR_REGNUM = 41;
4414 tdep->SPC_REGNUM = 42;
4415 break;
4416 case bfd_mach_sh4:
4417 sh_register_name = sh_sh4_register_name;
4418 sh_show_regs = sh4_show_regs;
4419 sh_store_return_value = sh3e_sh4_store_return_value;
4420 sh_register_virtual_type = sh_sh4_register_virtual_type;
4421 set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
4422 set_gdbarch_deprecated_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
4423 set_gdbarch_fp0_regnum (gdbarch, 25);
4424 set_gdbarch_register_raw_size (gdbarch, sh_sh4_register_raw_size);
4425 set_gdbarch_register_virtual_size (gdbarch, sh_sh4_register_raw_size);
4426 set_gdbarch_register_byte (gdbarch, sh_sh4_register_byte);
4427 set_gdbarch_num_pseudo_regs (gdbarch, 12);
4428 set_gdbarch_max_register_raw_size (gdbarch, 4 * 4);
4429 set_gdbarch_max_register_virtual_size (gdbarch, 4 * 4);
4430 set_gdbarch_pseudo_register_read (gdbarch, sh_pseudo_register_read);
4431 set_gdbarch_pseudo_register_write (gdbarch, sh_pseudo_register_write);
4432 tdep->FPUL_REGNUM = 23;
4433 tdep->FPSCR_REGNUM = 24;
4434 tdep->FP_LAST_REGNUM = 40;
4435 tdep->SSR_REGNUM = 41;
4436 tdep->SPC_REGNUM = 42;
4437 tdep->DR0_REGNUM = 59;
4438 tdep->DR_LAST_REGNUM = 66;
4439 tdep->FV0_REGNUM = 67;
4440 tdep->FV_LAST_REGNUM = 70;
4441 break;
4442 case bfd_mach_sh5:
4443 tdep->PR_REGNUM = 18;
4444 tdep->SR_REGNUM = 65;
4445 tdep->FPSCR_REGNUM = SIM_SH64_FPCSR_REGNUM;
4446 tdep->FP_LAST_REGNUM = SIM_SH64_FR0_REGNUM + SIM_SH64_NR_FP_REGS - 1;
4447 tdep->SSR_REGNUM = SIM_SH64_SSR_REGNUM;
4448 tdep->SPC_REGNUM = SIM_SH64_SPC_REGNUM;
4449 tdep->TR7_REGNUM = SIM_SH64_TR0_REGNUM + 7;
4450 tdep->FPP0_REGNUM = 173;
4451 tdep->FPP_LAST_REGNUM = 204;
4452 tdep->DR0_REGNUM = 141;
4453 tdep->DR_LAST_REGNUM = 172;
4454 tdep->FV0_REGNUM = 205;
4455 tdep->FV_LAST_REGNUM = 220;
4456 tdep->R0_C_REGNUM = 221;
4457 tdep->R_LAST_C_REGNUM = 236;
4458 tdep->PC_C_REGNUM = 237;
4459 tdep->GBR_C_REGNUM = 238;
4460 tdep->MACH_C_REGNUM = 239;
4461 tdep->MACL_C_REGNUM = 240;
4462 tdep->PR_C_REGNUM = 241;
4463 tdep->T_C_REGNUM = 242;
4464 tdep->FPSCR_C_REGNUM = 243;
4465 tdep->FPUL_C_REGNUM = 244;
4466 tdep->FP0_C_REGNUM = 245;
4467 tdep->FP_LAST_C_REGNUM = 260;
4468 tdep->DR0_C_REGNUM = 261;
4469 tdep->DR_LAST_C_REGNUM = 268;
4470 tdep->FV0_C_REGNUM = 269;
4471 tdep->FV_LAST_C_REGNUM = 272;
4472 tdep->ARG0_REGNUM = 2;
4473 tdep->ARGLAST_REGNUM = 9;
4474 tdep->RETURN_REGNUM = 2;
4475 tdep->FLOAT_ARGLAST_REGNUM = 11;
4476
4477 set_gdbarch_num_pseudo_regs (gdbarch, NUM_PSEUDO_REGS_SH_MEDIA + NUM_PSEUDO_REGS_SH_COMPACT);
4478 set_gdbarch_fp0_regnum (gdbarch, SIM_SH64_FR0_REGNUM);
4479 set_gdbarch_pc_regnum (gdbarch, 64);
4480
4481 /* Determine the ABI */
4482 if (bfd_get_arch_size (info.abfd) == 64)
4483 {
4484 /* If the ABI is the 64-bit one, it can only be sh-media. */
4485 tdep->sh_abi = SH_ABI_64;
4486 set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4487 set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4488 }
4489 else
4490 {
4491 /* If the ABI is the 32-bit one it could be either media or
4492 compact. */
4493 tdep->sh_abi = SH_ABI_32;
4494 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4495 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4496 }
4497
4498 /* the number of real registers is the same whether we are in
4499 ISA16(compact) or ISA32(media). */
4500 set_gdbarch_num_regs (gdbarch, SIM_SH64_NR_REGS);
4501 set_gdbarch_register_size (gdbarch, 8); /*????*/
4502 set_gdbarch_register_bytes (gdbarch,
4503 ((SIM_SH64_NR_FP_REGS + 1) * 4)
4504 + (SIM_SH64_NR_REGS - SIM_SH64_NR_FP_REGS -1) * 8);
4505
4506 sh_register_name = sh_sh64_register_name;
4507 sh_show_regs = sh64_show_regs;
4508 sh_register_virtual_type = sh_sh64_register_virtual_type;
4509 sh_store_return_value = sh64_store_return_value;
4510 skip_prologue_hard_way = sh64_skip_prologue_hard_way;
4511 do_pseudo_register = sh64_do_pseudo_register;
4512 set_gdbarch_register_raw_size (gdbarch, sh_sh64_register_raw_size);
4513 set_gdbarch_register_virtual_size (gdbarch, sh_sh64_register_raw_size);
4514 set_gdbarch_register_byte (gdbarch, sh_sh64_register_byte);
4515 /* This seems awfully wrong!*/
4516 /*set_gdbarch_max_register_raw_size (gdbarch, 8);*/
4517 /* should include the size of the pseudo regs. */
4518 set_gdbarch_max_register_raw_size (gdbarch, 4 * 4);
4519 /* Or should that go in the virtual_size? */
4520 /*set_gdbarch_max_register_virtual_size (gdbarch, 8);*/
4521 set_gdbarch_max_register_virtual_size (gdbarch, 4 * 4);
4522 set_gdbarch_pseudo_register_read (gdbarch, sh64_pseudo_register_read);
4523 set_gdbarch_pseudo_register_write (gdbarch, sh64_pseudo_register_write);
4524
4525 set_gdbarch_deprecated_do_registers_info (gdbarch, sh64_do_registers_info);
4526 set_gdbarch_frame_init_saved_regs (gdbarch, sh64_nofp_frame_init_saved_regs);
4527 set_gdbarch_breakpoint_from_pc (gdbarch, sh_sh64_breakpoint_from_pc);
4528 set_gdbarch_init_extra_frame_info (gdbarch, sh64_init_extra_frame_info);
4529 set_gdbarch_frame_chain (gdbarch, sh64_frame_chain);
4530 set_gdbarch_get_saved_register (gdbarch, sh64_get_saved_register);
4531 set_gdbarch_deprecated_extract_return_value (gdbarch, sh64_extract_return_value);
4532 set_gdbarch_push_arguments (gdbarch, sh64_push_arguments);
4533 /*set_gdbarch_store_struct_return (gdbarch, sh64_store_struct_return);*/
4534 set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sh64_extract_struct_value_address);
4535 set_gdbarch_use_struct_convention (gdbarch, sh64_use_struct_convention);
4536 set_gdbarch_pop_frame (gdbarch, sh64_pop_frame);
4537 set_gdbarch_elf_make_msymbol_special (gdbarch,
4538 sh64_elf_make_msymbol_special);
4539 break;
4540 default:
4541 sh_register_name = sh_generic_register_name;
4542 sh_show_regs = sh_generic_show_regs;
4543 sh_store_return_value = sh_default_store_return_value;
4544 sh_register_virtual_type = sh_default_register_virtual_type;
4545 set_gdbarch_frame_init_saved_regs (gdbarch, sh_nofp_frame_init_saved_regs);
4546 set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
4547 set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
4548 set_gdbarch_register_byte (gdbarch, sh_default_register_byte);
4549 break;
4550 }
4551
4552 set_gdbarch_read_pc (gdbarch, generic_target_read_pc);
4553 set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
4554 set_gdbarch_read_fp (gdbarch, generic_target_read_fp);
4555 set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
4556 set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
4557
4558 set_gdbarch_register_name (gdbarch, sh_register_name);
4559 set_gdbarch_register_virtual_type (gdbarch, sh_register_virtual_type);
4560
4561 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
4562 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4563 set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4564 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
4565 set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4566 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
4567
4568 set_gdbarch_call_dummy_length (gdbarch, 0);
4569 set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
4570 set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1); /*???*/
4571 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
4572 set_gdbarch_call_dummy_start_offset (gdbarch, 0);
4573 set_gdbarch_call_dummy_words (gdbarch, sh_call_dummy_words);
4574 set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (sh_call_dummy_words));
4575 set_gdbarch_call_dummy_p (gdbarch, 1);
4576 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
4577 set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
4578 set_gdbarch_coerce_float_to_double (gdbarch,
4579 sh_coerce_float_to_double);
4580
4581 set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
4582 set_gdbarch_push_return_address (gdbarch, sh_push_return_address);
4583
4584 set_gdbarch_deprecated_store_return_value (gdbarch, sh_store_return_value);
4585 set_gdbarch_skip_prologue (gdbarch, sh_skip_prologue);
4586 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
4587 set_gdbarch_decr_pc_after_break (gdbarch, 0);
4588 set_gdbarch_function_start_offset (gdbarch, 0);
4589
4590 set_gdbarch_frame_args_skip (gdbarch, 0);
4591 set_gdbarch_frameless_function_invocation (gdbarch, frameless_look_for_prologue);
4592 set_gdbarch_frame_chain_valid (gdbarch, generic_file_frame_chain_valid);
4593 set_gdbarch_frame_saved_pc (gdbarch, sh_frame_saved_pc);
4594 set_gdbarch_saved_pc_after_call (gdbarch, sh_saved_pc_after_call);
4595 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
4596 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
4597
4598 /* Hook in ABI-specific overrides, if they have been registered.
4599
4600 FIXME: if the ABI is unknown, this is probably an embedded target,
4601 so we should not warn about this situation. */
4602 gdbarch_init_osabi (info, gdbarch, osabi);
4603
4604 return gdbarch;
4605 }
4606
4607 static void
4608 sh_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
4609 {
4610 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
4611
4612 if (tdep == NULL)
4613 return;
4614
4615 fprintf_unfiltered (file, "sh_dump_tdep: OS ABI = %s\n",
4616 gdbarch_osabi_name (tdep->osabi));
4617 }
4618
4619 void
4620 _initialize_sh_tdep (void)
4621 {
4622 struct cmd_list_element *c;
4623
4624 gdbarch_register (bfd_arch_sh, sh_gdbarch_init, sh_dump_tdep);
4625
4626 add_com ("regs", class_vars, sh_show_regs_command, "Print all registers");
4627 }