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