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