Fri Aug 21 18:13:28 EDT 1998 Jim Lemke <jlemke@cygnus.com>
[deliverable/binutils-gdb.git] / gdb / mips-tdep.c
CommitLineData
7d9884b9 1/* Target-dependent code for the MIPS architecture, for GDB, the GNU Debugger.
a00dfa36 2 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
0434c1a0 3 Free Software Foundation, Inc.
bd5635a1
RP
4 Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
5 and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
6
7This file is part of GDB.
8
361bf6ee 9This program is free software; you can redistribute it and/or modify
bd5635a1 10it under the terms of the GNU General Public License as published by
361bf6ee
JG
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
bd5635a1 13
361bf6ee 14This program is distributed in the hope that it will be useful,
bd5635a1
RP
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
361bf6ee 20along with this program; if not, write to the Free Software
09af5868 21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
bd5635a1 22
bd5635a1 23#include "defs.h"
09af5868 24#include "gdb_string.h"
bd5635a1
RP
25#include "frame.h"
26#include "inferior.h"
27#include "symtab.h"
28#include "value.h"
29#include "gdbcmd.h"
ef08856f 30#include "language.h"
bd5635a1 31#include "gdbcore.h"
62a469e1
SG
32#include "symfile.h"
33#include "objfiles.h"
3fed1c4a 34#include "gdbtypes.h"
28444bf3 35#include "target.h"
bd5635a1 36
ee5fb959
JK
37#include "opcode/mips.h"
38
28444bf3 39#define VM_MIN_ADDRESS (CORE_ADDR)0x400000
70126bf9 40
a00dfa36
MS
41/* Do not use "TARGET_IS_MIPS64" to test the size of floating point registers */
42#define FP_REGISTER_DOUBLE (REGISTER_VIRTUAL_SIZE(FP0_REGNUM) == 8)
43
70126bf9
KH
44/* FIXME: Put this declaration in frame.h. */
45extern struct obstack frame_cache_obstack;
28444bf3 46
002a422b 47#if 0
ee5fb959 48static int mips_in_lenient_prologue PARAMS ((CORE_ADDR, CORE_ADDR));
002a422b 49#endif
ee5fb959 50
912e805f 51int gdb_print_insn_mips PARAMS ((bfd_vma, disassemble_info *));
28444bf3 52
f2bf454e
FF
53static void mips_print_register PARAMS ((int, int));
54
55static mips_extra_func_info_t
56heuristic_proc_desc PARAMS ((CORE_ADDR, CORE_ADDR, struct frame_info *));
57
58static CORE_ADDR heuristic_proc_start PARAMS ((CORE_ADDR));
59
28444bf3 60static CORE_ADDR read_next_frame_reg PARAMS ((struct frame_info *, int));
f2bf454e 61
e4dbd248
PS
62static void mips_set_fpu_command PARAMS ((char *, int,
63 struct cmd_list_element *));
64
65static void mips_show_fpu_command PARAMS ((char *, int,
66 struct cmd_list_element *));
67
9f9f94aa
SS
68void mips_set_processor_type_command PARAMS ((char *, int));
69
1d9489c1
JK
70int mips_set_processor_type PARAMS ((char *));
71
72static void mips_show_processor_type_command PARAMS ((char *, int));
73
9f9f94aa
SS
74static void reinit_frame_cache_sfunc PARAMS ((char *, int,
75 struct cmd_list_element *));
76
f2bf454e
FF
77static mips_extra_func_info_t
78 find_proc_desc PARAMS ((CORE_ADDR pc, struct frame_info *next_frame));
79
80static CORE_ADDR after_prologue PARAMS ((CORE_ADDR pc,
81 mips_extra_func_info_t proc_desc));
82
9f9f94aa
SS
83/* This value is the model of MIPS in use. It is derived from the value
84 of the PrID register. */
85
86char *mips_processor_type;
87
88char *tmp_mips_processor_type;
89
c2a0f1cb
ILT
90/* Some MIPS boards don't support floating point, so we permit the
91 user to turn it off. */
9f9f94aa 92
e4dbd248
PS
93enum mips_fpu_type mips_fpu;
94
95static char *mips_fpu_string;
c2a0f1cb 96
9f9f94aa
SS
97/* A set of original names, to be used when restoring back to generic
98 registers from a specific set. */
99
100char *mips_generic_reg_names[] = REGISTER_NAMES;
101
102/* Names of IDT R3041 registers. */
103
104char *mips_r3041_reg_names[] = {
105 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
106 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
107 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
108 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
109 "sr", "lo", "hi", "bad", "cause","pc",
110 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
111 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
112 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
113 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
114 "fsr", "fir", "fp", "",
115 "", "", "bus", "ccfg", "", "", "", "",
116 "", "", "port", "cmp", "", "", "epc", "prid",
117};
118
119/* Names of IDT R3051 registers. */
120
121char *mips_r3051_reg_names[] = {
122 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
123 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
124 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
125 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
126 "sr", "lo", "hi", "bad", "cause","pc",
127 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
128 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
129 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
130 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
131 "fsr", "fir", "fp", "",
132 "inx", "rand", "elo", "", "ctxt", "", "", "",
133 "", "", "ehi", "", "", "", "epc", "prid",
134};
135
136/* Names of IDT R3081 registers. */
137
138char *mips_r3081_reg_names[] = {
139 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
140 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
141 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
142 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
143 "sr", "lo", "hi", "bad", "cause","pc",
144 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
145 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
146 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
147 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
148 "fsr", "fir", "fp", "",
149 "inx", "rand", "elo", "cfg", "ctxt", "", "", "",
150 "", "", "ehi", "", "", "", "epc", "prid",
151};
152
e4dbd248
PS
153/* Names of LSI 33k registers. */
154
155char *mips_lsi33k_reg_names[] = {
156 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
157 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
158 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
159 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
160 "epc", "hi", "lo", "sr", "cause","badvaddr",
161 "dcic", "bpc", "bda", "", "", "", "", "",
162 "", "", "", "", "", "", "", "",
163 "", "", "", "", "", "", "", "",
164 "", "", "", "", "", "", "", "",
165 "", "", "", "",
166 "", "", "", "", "", "", "", "",
167 "", "", "", "", "", "", "", "",
168};
169
9f9f94aa
SS
170struct {
171 char *name;
172 char **regnames;
173} mips_processor_type_table[] = {
174 { "generic", mips_generic_reg_names },
175 { "r3041", mips_r3041_reg_names },
176 { "r3051", mips_r3051_reg_names },
177 { "r3071", mips_r3081_reg_names },
178 { "r3081", mips_r3081_reg_names },
e4dbd248 179 { "lsi33k", mips_lsi33k_reg_names },
9f9f94aa
SS
180 { NULL, NULL }
181};
182
f9f8c14b
MA
183/* Table to translate MIPS16 register field to actual register number. */
184static int mips16_to_32_reg[8] = { 16, 17, 2, 3, 4, 5, 6, 7 };
185
3127785a
RP
186/* Heuristic_proc_start may hunt through the text section for a long
187 time across a 2400 baud serial line. Allows the user to limit this
188 search. */
9f9f94aa 189
3127785a
RP
190static unsigned int heuristic_fence_post = 0;
191
0f552c5f 192#define PROC_LOW_ADDR(proc) ((proc)->pdr.adr) /* least address */
28444bf3 193#define PROC_HIGH_ADDR(proc) ((proc)->high_addr) /* upper address bound */
0f552c5f
JG
194#define PROC_FRAME_OFFSET(proc) ((proc)->pdr.frameoffset)
195#define PROC_FRAME_REG(proc) ((proc)->pdr.framereg)
af774411 196#define PROC_FRAME_ADJUST(proc) ((proc)->frame_adjust)
0f552c5f
JG
197#define PROC_REG_MASK(proc) ((proc)->pdr.regmask)
198#define PROC_FREG_MASK(proc) ((proc)->pdr.fregmask)
199#define PROC_REG_OFFSET(proc) ((proc)->pdr.regoffset)
200#define PROC_FREG_OFFSET(proc) ((proc)->pdr.fregoffset)
201#define PROC_PC_REG(proc) ((proc)->pdr.pcreg)
202#define PROC_SYMBOL(proc) (*(struct symbol**)&(proc)->pdr.isym)
bd5635a1 203#define _PROC_MAGIC_ 0x0F0F0F0F
0f552c5f
JG
204#define PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym == _PROC_MAGIC_)
205#define SET_PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym = _PROC_MAGIC_)
bd5635a1
RP
206
207struct linked_proc_info
208{
209 struct mips_extra_func_info info;
210 struct linked_proc_info *next;
dac4929a 211} *linked_proc_desc_table = NULL;
bd5635a1 212
f2bf454e 213
98760eab
AC
214/* Should the upper word of 64-bit addresses be zeroed? */
215static int mask_address_p = 1;
216
217/* Should call_function allocate stack space for a struct return? */
218int
219mips_use_struct_convention (gcc_p, type)
220 int gcc_p;
221 struct type *type;
222{
223 if (MIPS_EABI)
224 return (TYPE_LENGTH (type) > 2 * MIPS_REGSIZE);
225 else
226 return 1; /* Structures are returned by ref in extra arg0 */
227}
228
899c4021
MA
229/* Tell if the program counter value in MEMADDR is in a MIPS16 function. */
230
231static int
232pc_is_mips16 (bfd_vma memaddr)
233{
234 struct minimal_symbol *sym;
235
236 /* If bit 0 of the address is set, assume this is a MIPS16 address. */
237 if (IS_MIPS16_ADDR (memaddr))
238 return 1;
239
240 /* A flag indicating that this is a MIPS16 function is stored by elfread.c in
241 the high bit of the info field. Use this to decide if the function is
242 MIPS16 or normal MIPS. */
243 sym = lookup_minimal_symbol_by_pc (memaddr);
244 if (sym)
245 return MSYMBOL_IS_SPECIAL (sym);
246 else
247 return 0;
248}
249
250
f2bf454e
FF
251/* This returns the PC of the first inst after the prologue. If we can't
252 find the prologue, then return 0. */
253
254static CORE_ADDR
255after_prologue (pc, proc_desc)
256 CORE_ADDR pc;
257 mips_extra_func_info_t proc_desc;
258{
259 struct symtab_and_line sal;
260 CORE_ADDR func_addr, func_end;
261
262 if (!proc_desc)
263 proc_desc = find_proc_desc (pc, NULL);
264
265 if (proc_desc)
266 {
267 /* If function is frameless, then we need to do it the hard way. I
268 strongly suspect that frameless always means prologueless... */
269 if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
270 && PROC_FRAME_OFFSET (proc_desc) == 0)
271 return 0;
272 }
273
274 if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
275 return 0; /* Unknown */
276
277 sal = find_pc_line (func_addr, 0);
278
279 if (sal.end < func_end)
280 return sal.end;
281
282 /* The line after the prologue is after the end of the function. In this
283 case, tell the caller to find the prologue the hard way. */
284
285 return 0;
286}
287
f9f8c14b
MA
288/* Decode a MIPS32 instruction that saves a register in the stack, and
289 set the appropriate bit in the general register mask or float register mask
290 to indicate which register is saved. This is a helper function
291 for mips_find_saved_regs. */
292
293static void
294mips32_decode_reg_save (inst, gen_mask, float_mask)
295 t_inst inst;
296 unsigned long *gen_mask;
297 unsigned long *float_mask;
298{
299 int reg;
300
301 if ((inst & 0xffe00000) == 0xafa00000 /* sw reg,n($sp) */
302 || (inst & 0xffe00000) == 0xafc00000 /* sw reg,n($r30) */
a00dfa36
MS
303 /* start-sanitize-r5900 */
304 || (inst & 0xffe00000) == 0x7fa00000 /* sq reg,n($sp) */
305 /* end-sanitize-r5900 */
f9f8c14b
MA
306 || (inst & 0xffe00000) == 0xffa00000) /* sd reg,n($sp) */
307 {
308 /* It might be possible to use the instruction to
309 find the offset, rather than the code below which
310 is based on things being in a certain order in the
311 frame, but figuring out what the instruction's offset
312 is relative to might be a little tricky. */
313 reg = (inst & 0x001f0000) >> 16;
314 *gen_mask |= (1 << reg);
315 }
316 else if ((inst & 0xffe00000) == 0xe7a00000 /* swc1 freg,n($sp) */
317 || (inst & 0xffe00000) == 0xe7c00000 /* swc1 freg,n($r30) */
318 || (inst & 0xffe00000) == 0xf7a00000)/* sdc1 freg,n($sp) */
319
320 {
321 reg = ((inst & 0x001f0000) >> 16);
322 *float_mask |= (1 << reg);
323 }
324}
325
326/* Decode a MIPS16 instruction that saves a register in the stack, and
327 set the appropriate bit in the general register or float register mask
328 to indicate which register is saved. This is a helper function
329 for mips_find_saved_regs. */
330
331static void
332mips16_decode_reg_save (inst, gen_mask)
333 t_inst inst;
334 unsigned long *gen_mask;
335{
b348b9fd 336 if ((inst & 0xf800) == 0xd000) /* sw reg,n($sp) */
f9f8c14b 337 {
b348b9fd
MA
338 int reg = mips16_to_32_reg[(inst & 0x700) >> 8];
339 *gen_mask |= (1 << reg);
340 }
341 else if ((inst & 0xff00) == 0xf900) /* sd reg,n($sp) */
342 {
343 int reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
f9f8c14b
MA
344 *gen_mask |= (1 << reg);
345 }
346 else if ((inst & 0xff00) == 0x6200 /* sw $ra,n($sp) */
347 || (inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */
af774411 348 *gen_mask |= (1 << RA_REGNUM);
f9f8c14b
MA
349}
350
c81a76b3
MA
351
352/* Fetch and return instruction from the specified location. If the PC
353 is odd, assume it's a MIPS16 instruction; otherwise MIPS32. */
354
355static t_inst
356mips_fetch_instruction (addr)
357 CORE_ADDR addr;
358{
359 char buf[MIPS_INSTLEN];
360 int instlen;
361 int status;
362
899c4021 363 if (pc_is_mips16 (addr))
c81a76b3
MA
364 {
365 instlen = MIPS16_INSTLEN;
366 addr = UNMAKE_MIPS16_ADDR (addr);
367 }
368 else
369 instlen = MIPS_INSTLEN;
370 status = read_memory_nobpt (addr, buf, instlen);
371 if (status)
372 memory_error (status, addr);
373 return extract_unsigned_integer (buf, instlen);
374}
375
376
88ff9e06
FCE
377/* These the fields of 32 bit mips instructions */
378#define mips32_op(x) (x >> 25)
379#define itype_op(x) (x >> 25)
380#define itype_rs(x) ((x >> 21)& 0x1f)
381#define itype_rt(x) ((x >> 16) & 0x1f)
382#define itype_immediate(x) ( x & 0xffff)
383
384#define jtype_op(x) (x >> 25)
385#define jtype_target(x) ( x & 0x03fffff)
386
387#define rtype_op(x) (x >>25)
388#define rtype_rs(x) ((x>>21) & 0x1f)
389#define rtype_rt(x) ((x>>16) & 0x1f)
390#define rtype_rd(x) ((x>>11) & 0x1f)
391#define rtype_shamt(x) ((x>>6) & 0x1f)
392#define rtype_funct(x) (x & 0x3f )
393
394static CORE_ADDR
395mips32_relative_offset(unsigned long inst)
396{ long x ;
397 x = itype_immediate(inst) ;
398 if (x & 0x8000) /* sign bit set */
399 {
400 x |= 0xffff0000 ; /* sign extension */
401 }
402 x = x << 2 ;
403 return x ;
404}
405
406/* Determine whate to set a single step breakpoint while considering
407 branch prediction */
408CORE_ADDR
409mips32_next_pc(CORE_ADDR pc)
410{
411 unsigned long inst ;
412 int op ;
413 inst = mips_fetch_instruction(pc) ;
414 if ((inst & 0xe0000000) != 0) /* Not a special, junp or branch instruction */
415 { if ((inst >> 27) == 5) /* BEQL BNEZ BLEZL BGTZE , bits 0101xx */
416 { op = ((inst >> 25) & 0x03) ;
417 switch (op)
418 {
419 case 0 : goto equal_branch ; /* BEQL */
420 case 1 : goto neq_branch ; /* BNEZ */
421 case 2 : goto less_branch ; /* BLEZ */
422 case 3 : goto greater_branch ; /* BGTZ */
423 default : pc += 4 ;
424 }
425 }
426 else pc += 4 ; /* Not a branch, next instruction is easy */
427 }
428 else
429 { /* This gets way messy */
430
431 /* Further subdivide into SPECIAL, REGIMM and other */
432 switch (op = ((inst >> 26) & 0x07)) /* extract bits 28,27,26 */
433 {
434 case 0 : /* SPECIAL */
435 op = rtype_funct(inst) ;
436 switch (op)
437 {
438 case 8 : /* JR */
439 case 9 : /* JALR */
440 pc = read_register(rtype_rs(inst)) ; /* Set PC to that address */
441 break ;
442 default: pc += 4 ;
443 }
444
445 break ; /* end special */
446 case 1 : /* REGIMM */
447 {
448 op = jtype_op(inst) ; /* branch condition */
449 switch (jtype_op(inst))
450 {
451 case 0 : /* BLTZ */
452 case 2 : /* BLTXL */
453 case 16 : /* BLTZALL */
454 case 18 : /* BLTZALL */
455 less_branch:
456 if (read_register(itype_rs(inst)) < 0)
457 pc += mips32_relative_offset(inst) + 4 ;
458 else pc += 8 ; /* after the delay slot */
459 break ;
460 case 1 : /* GEZ */
461 case 3 : /* BGEZL */
462 case 17 : /* BGEZAL */
463 case 19 : /* BGEZALL */
464 greater_equal_branch:
465 if (read_register(itype_rs(inst)) >= 0)
466 pc += mips32_relative_offset(inst) + 4 ;
467 else pc += 8 ; /* after the delay slot */
468 break ;
469 /* All of the other intructions in the REGIMM catagory */
470 default: pc += 4 ;
471 }
472 }
473 break ; /* end REGIMM */
474 case 2 : /* J */
475 case 3 : /* JAL */
476 { unsigned long reg ;
477 reg = jtype_target(inst) << 2 ;
478 pc = reg + ((pc+4) & 0xf0000000) ;
479 /* Whats this mysterious 0xf000000 adjustment ??? */
480 }
481 break ;
482 /* FIXME case JALX :*/
483 { unsigned long reg ;
484 reg = jtype_target(inst) << 2 ;
485 pc = reg + ((pc+4) & 0xf0000000) + 1 ; /* yes, +1 */
486 /* Add 1 to indicate 16 bit mode - Invert ISA mode */
487 }
488 break ; /* The new PC will be alternate mode */
489 case 4 : /* BEQ , BEQL */
490 equal_branch :
491 if (read_register(itype_rs(inst)) ==
492 read_register(itype_rt(inst)))
493 pc += mips32_relative_offset(inst) + 4 ;
494 else pc += 8 ;
495 break ;
496 case 5 : /* BNE , BNEL */
497 neq_branch :
498 if (read_register(itype_rs(inst)) !=
499 read_register(itype_rs(inst)))
500 pc += mips32_relative_offset(inst) + 4 ;
501 else pc += 8 ;
502 break ;
503 case 6 : /* BLEZ , BLEZL */
504 less_zero_branch:
505 if (read_register(itype_rs(inst) <= 0))
506 pc += mips32_relative_offset(inst) + 4 ;
507 else pc += 8 ;
508 break ;
509 case 7 :
510 greater_branch : /* BGTZ BGTZL */
511 if (read_register(itype_rs(inst) > 0))
512 pc += mips32_relative_offset(inst) + 4 ;
513 else pc += 8 ;
514 break ;
515 default : pc += 8 ;
516 } /* switch */
517 } /* else */
518 return pc ;
519} /* mips32_next_pc */
520
521/* Decoding the next place to set a breakpoint is irregular for the
522 mips 16 variant, but fortunatly, there fewer instructions. We have to cope
523 ith extensions for 16 bit instructions and a pair of actual 32 bit instructions.
524 We dont want to set a single step instruction on the extend instruction
525 either.
526 */
527
528/* Lots of mips16 instruction formats */
529/* Predicting jumps requires itype,ritype,i8type
530 and their extensions extItype,extritype,extI8type
531 */
532enum mips16_inst_fmts
533{
534 itype, /* 0 immediate 5,10 */
535 ritype, /* 1 5,3,8 */
536 rrtype, /* 2 5,3,3,5 */
537 rritype, /* 3 5,3,3,5 */
538 rrrtype, /* 4 5,3,3,3,2 */
539 rriatype, /* 5 5,3,3,1,4 */
540 shifttype, /* 6 5,3,3,3,2 */
541 i8type, /* 7 5,3,8 */
542 i8movtype, /* 8 5,3,3,5 */
543 i8mov32rtype, /* 9 5,3,5,3 */
544 i64type, /* 10 5,3,8 */
545 ri64type, /* 11 5,3,3,5 */
546 jalxtype, /* 12 5,1,5,5,16 - a 32 bit instruction */
547 exiItype, /* 13 5,6,5,5,1,1,1,1,1,1,5 */
548 extRitype, /* 14 5,6,5,5,3,1,1,1,5 */
549 extRRItype, /* 15 5,5,5,5,3,3,5 */
550 extRRIAtype, /* 16 5,7,4,5,3,3,1,4 */
551 EXTshifttype, /* 17 5,5,1,1,1,1,1,1,5,3,3,1,1,1,2 */
552 extI8type, /* 18 5,6,5,5,3,1,1,1,5 */
553 extI64type, /* 19 5,6,5,5,3,1,1,1,5 */
554 extRi64type, /* 20 5,6,5,5,3,3,5 */
555 extshift64type /* 21 5,5,1,1,1,1,1,1,5,1,1,1,3,5 */
556} ;
557/* I am heaping all the fields of the formats into one structure and then,
558 only the fields which are involved in instruction extension */
559struct upk_mips16
560{
561 unsigned short inst ;
562 enum mips16_inst_fmts fmt ;
563 unsigned long offset ;
564 unsigned int regx ; /* Function in i8 type */
565 unsigned int regy ;
566} ;
567
568
569
570static void print_unpack(char * comment,
571 struct upk_mips16 * u)
572{
573 printf("%s %04x ,f(%d) off(%08x) (x(%x) y(%x)\n",
574 comment,u->inst,u->fmt,u->offset,u->regx,u->regy) ;
575}
576
577/* The EXT-I, EXT-ri nad EXT-I8 instructions all have the same
578 format for the bits which make up the immediatate extension.
579 */
580static unsigned long
581extended_offset(unsigned long extension)
582{
583 unsigned long value ;
584 value = (extension >> 21) & 0x3f ; /* * extract 15:11 */
585 value = value << 6 ;
586 value |= (extension >> 16) & 0x1f ; /* extrace 10:5 */
587 value = value << 5 ;
588 value |= extension & 0x01f ; /* extract 4:0 */
589 return value ;
590}
591
592/* Only call this function if you know that this is an extendable
593 instruction, It wont malfunction, but why make excess remote memory references?
594 If the immediate operands get sign extended or somthing, do it after
595 the extension is performed.
596 */
597/* FIXME: Every one of these cases needs to worry about sign extension
598 when the offset is to be used in relative addressing */
599
600
601static unsigned short fetch_mips_16(CORE_ADDR pc)
602{
603 char buf[8] ;
604 pc &= 0xfffffffe ; /* clear the low order bit */
605 target_read_memory(pc,buf,2) ;
606 return extract_unsigned_integer(buf,2) ;
607}
608
609static void
610unpack_mips16(CORE_ADDR pc,
611 struct upk_mips16 * upk)
612{
613 CORE_ADDR extpc ;
614 unsigned long extension ;
615 int extended ;
616 extpc = (pc - 4) & ~0x01 ; /* Extensions are 32 bit instructions */
617 /* Decrement to previous address and loose the 16bit mode flag */
618 /* return if the instruction was extendable, but not actually extended */
619 extended = ((mips32_op(extension) == 30) ? 1 : 0) ;
620 if (extended) { extension = mips_fetch_instruction(extpc) ;}
621 switch (upk->fmt)
622 {
623 case itype :
624 {
625 unsigned long value ;
626 if (extended)
627 { value = extended_offset(extension) ;
628 value = value << 11 ; /* rom for the original value */
629 value |= upk->inst & 0x7ff ; /* eleven bits from instruction */
630 }
631 else
632 { value = upk->inst & 0x7ff ;
633 /* FIXME : Consider sign extension */
634 }
635 upk->offset = value ;
636 }
637 break ;
638 case ritype :
639 case i8type :
640 { /* A register identifier and an offset */
641 /* Most of the fields are the same as I type but the
642 immediate value is of a different length */
643 unsigned long value ;
644 if (extended)
645 {
646 value = extended_offset(extension) ;
647 value = value << 8 ; /* from the original instruction */
648 value |= upk->inst & 0xff ; /* eleven bits from instruction */
649 upk->regx = (extension >> 8) & 0x07 ; /* or i8 funct */
650 if (value & 0x4000) /* test the sign bit , bit 26 */
651 { value &= ~ 0x3fff ; /* remove the sign bit */
652 value = -value ;
653 }
654 }
655 else {
656 value = upk->inst & 0xff ; /* 8 bits */
657 upk->regx = (upk->inst >> 8) & 0x07 ; /* or i8 funct */
658 /* FIXME: Do sign extension , this format needs it */
659 if (value & 0x80) /* THIS CONFUSES ME */
660 { value &= 0xef ; /* remove the sign bit */
661 value = -value ;
662 }
663
664 }
665 upk->offset = value ;
666 break ;
667 }
668 case jalxtype :
669 {
670 unsigned long value ;
671 unsigned short nexthalf ;
672 value = ((upk->inst & 0x1f) << 5) | ((upk->inst >> 5) & 0x1f) ;
673 value = value << 16 ;
674 nexthalf = mips_fetch_instruction(pc+2) ; /* low bit still set */
675 value |= nexthalf ;
676 upk->offset = value ;
677 break ;
678 }
679 default:
680 printf_filtered("Decoding unimplemented instruction format type\n") ;
681 break ;
682 }
683 /* print_unpack("UPK",upk) ; */
684}
685
686
687#define mips16_op(x) (x >> 11)
688
689/* This is a map of the opcodes which ae known to perform branches */
690static unsigned char map16[32] =
691{ 0,0,1,1,1,1,0,0,
692 0,0,0,0,1,0,0,0,
693 0,0,0,0,0,0,0,0,
694 0,0,0,0,0,1,1,0
695} ;
696
697static CORE_ADDR add_offset_16(CORE_ADDR pc, int offset)
698{
699 return ((offset << 2) | ((pc + 2) & (0xf0000000))) ;
700
701}
702
703
704
705static struct upk_mips16 upk ;
706
707CORE_ADDR mips16_next_pc(CORE_ADDR pc)
708{
709 int op ;
710 t_inst inst ;
711 /* inst = mips_fetch_instruction(pc) ; - This doesnt always work */
712 inst = fetch_mips_16(pc) ;
713 upk.inst = inst ;
714 op = mips16_op(upk.inst) ;
715 if (map16[op])
716 {
717 int reg ;
718 switch (op)
719 {
720 case 2 : /* Branch */
721 upk.fmt = itype ;
722 unpack_mips16(pc,&upk) ;
723 { long offset ;
724 offset = upk.offset ;
725 if (offset & 0x800)
726 { offset &= 0xeff ;
727 offset = - offset ;
728 }
729 pc += (offset << 1) + 2 ;
730 }
731 break ;
732 case 3 : /* JAL , JALX - Watch out, these are 32 bit instruction*/
733 upk.fmt = jalxtype ;
734 unpack_mips16(pc,&upk) ;
735 pc = add_offset_16(pc,upk.offset) ;
736 if ((upk.inst >> 10) & 0x01) /* Exchange mode */
737 pc = pc & ~ 0x01 ; /* Clear low bit, indicate 32 bit mode */
738 else pc |= 0x01 ;
739 break ;
740 case 4 : /* beqz */
741 upk.fmt = ritype ;
742 unpack_mips16(pc,&upk) ;
743 reg = read_register(upk.regx) ;
744 if (reg == 0)
745 pc += (upk.offset << 1) + 2 ;
746 else pc += 2 ;
747 break ;
748 case 5 : /* bnez */
749 upk.fmt = ritype ;
750 unpack_mips16(pc,&upk) ;
751 reg = read_register(upk.regx) ;
752 if (reg != 0)
753 pc += (upk.offset << 1) + 2 ;
754 else pc += 2 ;
755 break ;
756 case 12 : /* I8 Formats btez btnez */
757 upk.fmt = i8type ;
758 unpack_mips16(pc,&upk) ;
759 /* upk.regx contains the opcode */
760 reg = read_register(24) ; /* Test register is 24 */
761 if (((upk.regx == 0) && (reg == 0)) /* BTEZ */
762 || ((upk.regx == 1 ) && (reg != 0))) /* BTNEZ */
763 /* pc = add_offset_16(pc,upk.offset) ; */
764 pc += (upk.offset << 1) + 2 ;
765 else pc += 2 ;
766 break ;
767 case 29 : /* RR Formats JR, JALR, JALR-RA */
768 upk.fmt = rrtype ;
769 op = upk.inst & 0x1f ;
770 if (op == 0)
771 {
772 upk.regx = (upk.inst >> 8) & 0x07 ;
773 upk.regy = (upk.inst >> 5) & 0x07 ;
774 switch (upk.regy)
775 {
776 case 0 : reg = upk.regx ; break ;
777 case 1 : reg = 31 ; break ; /* Function return instruction*/
778 case 2 : reg = upk.regx ; break ;
779 default: reg = 31 ; break ; /* BOGUS Guess */
780 }
781 pc = read_register(reg) ;
782 }
783 else pc += 2 ;
784 break ;
785 case 30 : /* This is an extend instruction */
786 pc += 4 ; /* Dont be setting breakpints on the second half */
787 break ;
788 default :
789 printf("Filtered - next PC probably incorrrect due to jump inst\n");
790 pc += 2 ;
791 break ;
792 }
793 }
794 else pc+= 2 ; /* just a good old instruction */
795 /* See if we CAN actually break on the next instruction */
796 /* printf("NXTm16PC %08x\n",(unsigned long)pc) ; */
797 return pc ;
798} /* mips16_next_pc */
799
800/* The mips_next_pc function supports single_tep when the remote target monitor or
801 stub is not developed enough to so a single_step.
802 It works by decoding the current instruction and predicting where a branch
803 will go. This isnt hard because all the data is available.
804 The MIPS32 and MIPS16 variants are quite different
805 */
806CORE_ADDR mips_next_pc(CORE_ADDR pc)
807{
808 t_inst inst ;
809 /* inst = mips_fetch_instruction(pc) ; */
810 /* if (pc_is_mips16) <----- This is failing */
811 if (pc & 0x01)
812 return mips16_next_pc(pc) ;
813 else return mips32_next_pc(pc) ;
814} /* mips_next_pc */
815
70126bf9
KH
816/* Guaranteed to set fci->saved_regs to some values (it never leaves it
817 NULL). */
818
819void
820mips_find_saved_regs (fci)
9f9f94aa 821 struct frame_info *fci;
70126bf9
KH
822{
823 int ireg;
824 CORE_ADDR reg_position;
825 /* r0 bit means kernel trap */
826 int kernel_trap;
827 /* What registers have been saved? Bitmasks. */
828 unsigned long gen_mask, float_mask;
829 mips_extra_func_info_t proc_desc;
c81a76b3 830 t_inst inst;
70126bf9
KH
831
832 fci->saved_regs = (struct frame_saved_regs *)
833 obstack_alloc (&frame_cache_obstack, sizeof(struct frame_saved_regs));
834 memset (fci->saved_regs, 0, sizeof (struct frame_saved_regs));
835
e4dbd248
PS
836 /* If it is the frame for sigtramp, the saved registers are located
837 in a sigcontext structure somewhere on the stack.
838 If the stack layout for sigtramp changes we might have to change these
839 constants and the companion fixup_sigtramp in mdebugread.c */
840#ifndef SIGFRAME_BASE
841/* To satisfy alignment restrictions, sigcontext is located 4 bytes
842 above the sigtramp frame. */
28444bf3
DP
843#define SIGFRAME_BASE MIPS_REGSIZE
844/* FIXME! Are these correct?? */
845#define SIGFRAME_PC_OFF (SIGFRAME_BASE + 2 * MIPS_REGSIZE)
846#define SIGFRAME_REGSAVE_OFF (SIGFRAME_BASE + 3 * MIPS_REGSIZE)
847#define SIGFRAME_FPREGSAVE_OFF \
848 (SIGFRAME_REGSAVE_OFF + MIPS_NUMREGS * MIPS_REGSIZE + 3 * MIPS_REGSIZE)
e4dbd248
PS
849#endif
850#ifndef SIGFRAME_REG_SIZE
28444bf3
DP
851/* FIXME! Is this correct?? */
852#define SIGFRAME_REG_SIZE MIPS_REGSIZE
e4dbd248
PS
853#endif
854 if (fci->signal_handler_caller)
855 {
28444bf3 856 for (ireg = 0; ireg < MIPS_NUMREGS; ireg++)
e4dbd248
PS
857 {
858 reg_position = fci->frame + SIGFRAME_REGSAVE_OFF
859 + ireg * SIGFRAME_REG_SIZE;
860 fci->saved_regs->regs[ireg] = reg_position;
861 }
28444bf3 862 for (ireg = 0; ireg < MIPS_NUMREGS; ireg++)
e4dbd248
PS
863 {
864 reg_position = fci->frame + SIGFRAME_FPREGSAVE_OFF
865 + ireg * SIGFRAME_REG_SIZE;
866 fci->saved_regs->regs[FP0_REGNUM + ireg] = reg_position;
867 }
868 fci->saved_regs->regs[PC_REGNUM] = fci->frame + SIGFRAME_PC_OFF;
869 return;
870 }
871
70126bf9
KH
872 proc_desc = fci->proc_desc;
873 if (proc_desc == NULL)
874 /* I'm not sure how/whether this can happen. Normally when we can't
875 find a proc_desc, we "synthesize" one using heuristic_proc_desc
876 and set the saved_regs right away. */
877 return;
878
879 kernel_trap = PROC_REG_MASK(proc_desc) & 1;
880 gen_mask = kernel_trap ? 0xFFFFFFFF : PROC_REG_MASK(proc_desc);
881 float_mask = kernel_trap ? 0xFFFFFFFF : PROC_FREG_MASK(proc_desc);
882
f9f8c14b
MA
883 if (/* In any frame other than the innermost or a frame interrupted by
884 a signal, we assume that all registers have been saved.
885 This assumes that all register saves in a function happen before
886 the first function call. */
887 (fci->next == NULL || fci->next->signal_handler_caller)
70126bf9
KH
888
889 /* In a dummy frame we know exactly where things are saved. */
890 && !PROC_DESC_IS_DUMMY (proc_desc)
891
f2bf454e
FF
892 /* Don't bother unless we are inside a function prologue. Outside the
893 prologue, we know where everything is. */
894
895 && in_prologue (fci->pc, PROC_LOW_ADDR (proc_desc))
896
70126bf9
KH
897 /* Not sure exactly what kernel_trap means, but if it means
898 the kernel saves the registers without a prologue doing it,
899 we better not examine the prologue to see whether registers
900 have been saved yet. */
901 && !kernel_trap)
902 {
903 /* We need to figure out whether the registers that the proc_desc
904 claims are saved have been saved yet. */
905
906 CORE_ADDR addr;
70126bf9
KH
907
908 /* Bitmasks; set if we have found a save for the register. */
909 unsigned long gen_save_found = 0;
910 unsigned long float_save_found = 0;
c81a76b3 911 int instlen;
70126bf9 912
c1fc0935
MA
913 /* If the address is odd, assume this is MIPS16 code. */
914 addr = PROC_LOW_ADDR (proc_desc);
899c4021 915 instlen = pc_is_mips16 (addr) ? MIPS16_INSTLEN : MIPS_INSTLEN;
f9f8c14b 916
20fa0902
MA
917 /* Scan through this function's instructions preceding the current
918 PC, and look for those that save registers. */
f9f8c14b
MA
919 while (addr < fci->pc)
920 {
c81a76b3 921 inst = mips_fetch_instruction (addr);
899c4021 922 if (pc_is_mips16 (addr))
f9f8c14b
MA
923 mips16_decode_reg_save (inst, &gen_save_found);
924 else
925 mips32_decode_reg_save (inst, &gen_save_found, &float_save_found);
926 addr += instlen;
70126bf9
KH
927 }
928 gen_mask = gen_save_found;
929 float_mask = float_save_found;
930 }
931
932 /* Fill in the offsets for the registers which gen_mask says
933 were saved. */
934 reg_position = fci->frame + PROC_REG_OFFSET (proc_desc);
28444bf3 935 for (ireg= MIPS_NUMREGS-1; gen_mask; --ireg, gen_mask <<= 1)
70126bf9
KH
936 if (gen_mask & 0x80000000)
937 {
938 fci->saved_regs->regs[ireg] = reg_position;
939 reg_position -= MIPS_REGSIZE;
a00dfa36
MS
940 /* start-sanitize-r5900 */
941#ifdef R5900_128BIT_GPR_HACK
942 /* Gross. The r5900 has 128bit wide registers, but MIPS_REGSIZE is
943 still 64bits. See the comments in tm.h for a discussion of the
944 various problems this causes. */
945 if (ireg <= RA_REGNUM)
946 reg_position -= MIPS_REGSIZE;
947#endif
948 /* end-sanitize-r5900 */
70126bf9 949 }
c81a76b3
MA
950
951 /* The MIPS16 entry instruction saves $s0 and $s1 in the reverse order
952 of that normally used by gcc. Therefore, we have to fetch the first
953 instruction of the function, and if it's an entry instruction that
954 saves $s0 or $s1, correct their saved addresses. */
899c4021 955 if (pc_is_mips16 (PROC_LOW_ADDR (proc_desc)))
c81a76b3
MA
956 {
957 inst = mips_fetch_instruction (PROC_LOW_ADDR (proc_desc));
958 if ((inst & 0xf81f) == 0xe809 && (inst & 0x700) != 0x700) /* entry */
959 {
960 int reg;
961 int sreg_count = (inst >> 6) & 3;
962
963 /* Check if the ra register was pushed on the stack. */
964 reg_position = fci->frame + PROC_REG_OFFSET (proc_desc);
965 if (inst & 0x20)
966 reg_position -= MIPS_REGSIZE;
967
968 /* Check if the s0 and s1 registers were pushed on the stack. */
969 for (reg = 16; reg < sreg_count+16; reg++)
970 {
971 fci->saved_regs->regs[reg] = reg_position;
972 reg_position -= MIPS_REGSIZE;
973 }
974 }
975 }
976
70126bf9
KH
977 /* Fill in the offsets for the registers which float_mask says
978 were saved. */
979 reg_position = fci->frame + PROC_FREG_OFFSET (proc_desc);
980
981 /* The freg_offset points to where the first *double* register
982 is saved. So skip to the high-order word. */
28444bf3 983 if (! GDB_TARGET_IS_MIPS64)
c81a76b3 984 reg_position += MIPS_REGSIZE;
28444bf3 985
20fa0902
MA
986 /* Fill in the offsets for the float registers which float_mask says
987 were saved. */
28444bf3 988 for (ireg = MIPS_NUMREGS-1; float_mask; --ireg, float_mask <<= 1)
70126bf9
KH
989 if (float_mask & 0x80000000)
990 {
991 fci->saved_regs->regs[FP0_REGNUM+ireg] = reg_position;
992 reg_position -= MIPS_REGSIZE;
993 }
994
995 fci->saved_regs->regs[PC_REGNUM] = fci->saved_regs->regs[RA_REGNUM];
996}
bd5635a1 997
28444bf3 998static CORE_ADDR
bd5635a1 999read_next_frame_reg(fi, regno)
9f9f94aa 1000 struct frame_info *fi;
bd5635a1
RP
1001 int regno;
1002{
bd5635a1 1003 for (; fi; fi = fi->next)
70126bf9 1004 {
e4dbd248
PS
1005 /* We have to get the saved sp from the sigcontext
1006 if it is a signal handler frame. */
1007 if (regno == SP_REGNUM && !fi->signal_handler_caller)
1008 return fi->frame;
70126bf9
KH
1009 else
1010 {
1011 if (fi->saved_regs == NULL)
1012 mips_find_saved_regs (fi);
1013 if (fi->saved_regs->regs[regno])
1014 return read_memory_integer(fi->saved_regs->regs[regno], MIPS_REGSIZE);
1015 }
1016 }
1017 return read_register (regno);
bd5635a1
RP
1018}
1019
96431497
MA
1020/* mips_addr_bits_remove - remove useless address bits */
1021
1022CORE_ADDR
1023mips_addr_bits_remove (addr)
1024 CORE_ADDR addr;
1025{
97e091b2 1026#if GDB_TARGET_IS_MIPS64
98760eab 1027 if (mask_address_p && (addr >> 32 == (CORE_ADDR)0xffffffff))
96431497
MA
1028 {
1029 /* This hack is a work-around for existing boards using PMON,
1030 the simulator, and any other 64-bit targets that doesn't have
1031 true 64-bit addressing. On these targets, the upper 32 bits
1032 of addresses are ignored by the hardware. Thus, the PC or SP
1033 are likely to have been sign extended to all 1s by instruction
1034 sequences that load 32-bit addresses. For example, a typical
1035 piece of code that loads an address is this:
1036 lui $r2, <upper 16 bits>
1037 ori $r2, <lower 16 bits>
1038 But the lui sign-extends the value such that the upper 32 bits
1039 may be all 1s. The workaround is simply to mask off these bits.
1040 In the future, gcc may be changed to support true 64-bit
1041 addressing, and this masking will have to be disabled. */
1042 addr &= (CORE_ADDR)0xffffffff;
1043 }
f9f8c14b
MA
1044#else
1045 /* Even when GDB is configured for some 32-bit targets (e.g. mips-elf),
1046 BFD is configured to handle 64-bit targets, so CORE_ADDR is 64 bits.
1047 So we still have to mask off useless bits from addresses. */
1048 addr &= (CORE_ADDR)0xffffffff;
97e091b2 1049#endif
96431497
MA
1050
1051 return addr;
1052}
1053
f781fe93
MA
1054void
1055mips_init_frame_pc_first (fromleaf, prev)
1056 int fromleaf;
1057 struct frame_info *prev;
1058{
1059 CORE_ADDR pc, tmp;
1060
1061 pc = ((fromleaf) ? SAVED_PC_AFTER_CALL (prev->next) :
1062 prev->next ? FRAME_SAVED_PC (prev->next) : read_pc ());
1063 tmp = mips_skip_stub (pc);
1064 prev->pc = tmp ? tmp : pc;
1065}
1066
1067
28444bf3 1068CORE_ADDR
bd5635a1 1069mips_frame_saved_pc(frame)
9f9f94aa 1070 struct frame_info *frame;
bd5635a1 1071{
28444bf3 1072 CORE_ADDR saved_pc;
0f552c5f 1073 mips_extra_func_info_t proc_desc = frame->proc_desc;
0434c1a0
PS
1074 /* We have to get the saved pc from the sigcontext
1075 if it is a signal handler frame. */
1076 int pcreg = frame->signal_handler_caller ? PC_REGNUM
1077 : (proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM);
0f552c5f 1078
bd5635a1 1079 if (proc_desc && PROC_DESC_IS_DUMMY(proc_desc))
28444bf3
DP
1080 saved_pc = read_memory_integer(frame->frame - MIPS_REGSIZE, MIPS_REGSIZE);
1081 else
1082 saved_pc = read_next_frame_reg(frame, pcreg);
0f552c5f 1083
96431497 1084 return ADDR_BITS_REMOVE (saved_pc);
bd5635a1
RP
1085}
1086
1087static struct mips_extra_func_info temp_proc_desc;
1088static struct frame_saved_regs temp_saved_regs;
1089
639c8612
MA
1090/* Set a register's saved stack address in temp_saved_regs. If an address
1091 has already been set for this register, do nothing; this way we will
1092 only recognize the first save of a given register in a function prologue.
1093 This is a helper function for mips{16,32}_heuristic_proc_desc. */
1094
1095static void
1096set_reg_offset (regno, offset)
1097 int regno;
1098 CORE_ADDR offset;
1099{
1100 if (temp_saved_regs.regs[regno] == 0)
1101 temp_saved_regs.regs[regno] = offset;
1102}
1103
1104
9ddf9aa9
AC
1105/* Test whether the PC points to the return instruction at the
1106 end of a function. */
1107
1108static int
1109mips_about_to_return (pc)
1110 CORE_ADDR pc;
1111{
1112 if (pc_is_mips16 (pc))
1113 /* This mips16 case isn't necessarily reliable. Sometimes the compiler
1114 generates a "jr $ra"; other times it generates code to load
1115 the return address from the stack to an accessible register (such
1116 as $a3), then a "jr" using that register. This second case
1117 is almost impossible to distinguish from an indirect jump
1118 used for switch statements, so we don't even try. */
1119 return mips_fetch_instruction (pc) == 0xe820; /* jr $ra */
1120 else
1121 return mips_fetch_instruction (pc) == 0x3e00008; /* jr $ra */
1122}
1123
1124
a8172eea
RP
1125/* This fencepost looks highly suspicious to me. Removing it also
1126 seems suspicious as it could affect remote debugging across serial
3127785a 1127 lines. */
a8172eea 1128
0f552c5f 1129static CORE_ADDR
9ddf9aa9 1130heuristic_proc_start (pc)
bd5635a1
RP
1131 CORE_ADDR pc;
1132{
32dab603
MA
1133 CORE_ADDR start_pc;
1134 CORE_ADDR fence;
20fa0902 1135 int instlen;
b348b9fd 1136 int seen_adjsp = 0;
0f552c5f 1137
32dab603
MA
1138 pc = ADDR_BITS_REMOVE (pc);
1139 start_pc = pc;
1140 fence = start_pc - heuristic_fence_post;
0f552c5f 1141 if (start_pc == 0) return 0;
3127785a
RP
1142
1143 if (heuristic_fence_post == UINT_MAX
1144 || fence < VM_MIN_ADDRESS)
1145 fence = VM_MIN_ADDRESS;
0f552c5f 1146
899c4021 1147 instlen = pc_is_mips16 (pc) ? MIPS16_INSTLEN : MIPS_INSTLEN;
20fa0902 1148
bd5635a1 1149 /* search back for previous return */
20fa0902 1150 for (start_pc -= instlen; ; start_pc -= instlen)
a8172eea
RP
1151 if (start_pc < fence)
1152 {
3127785a
RP
1153 /* It's not clear to me why we reach this point when
1154 stop_soon_quietly, but with this test, at least we
1155 don't print out warnings for every child forked (eg, on
1156 decstation). 22apr93 rich@cygnus.com. */
1157 if (!stop_soon_quietly)
1158 {
23d35572
JK
1159 static int blurb_printed = 0;
1160
3127785a
RP
1161 if (fence == VM_MIN_ADDRESS)
1162 warning("Hit beginning of text section without finding");
1163 else
1164 warning("Hit heuristic-fence-post without finding");
1165
f781fe93 1166 warning("enclosing function for address 0x%s", paddr_nz (pc));
23d35572
JK
1167 if (!blurb_printed)
1168 {
1169 printf_filtered ("\
1170This warning occurs if you are debugging a function without any symbols\n\
1171(for example, in a stripped executable). In that case, you may wish to\n\
1172increase the size of the search with the `set heuristic-fence-post' command.\n\
1173\n\
1174Otherwise, you told GDB there was a function where there isn't one, or\n\
1175(more likely) you have encountered a bug in GDB.\n");
1176 blurb_printed = 1;
1177 }
3127785a
RP
1178 }
1179
a8172eea
RP
1180 return 0;
1181 }
899c4021 1182 else if (pc_is_mips16 (start_pc))
20fa0902 1183 {
c1fc0935
MA
1184 unsigned short inst;
1185
b348b9fd
MA
1186 /* On MIPS16, any one of the following is likely to be the
1187 start of a function:
1188 entry
1189 addiu sp,-n
1190 daddiu sp,-n
1191 extend -n followed by 'addiu sp,+n' or 'daddiu sp,+n' */
c81a76b3 1192 inst = mips_fetch_instruction (start_pc);
b348b9fd
MA
1193 if (((inst & 0xf81f) == 0xe809 && (inst & 0x700) != 0x700) /* entry */
1194 || (inst & 0xff80) == 0x6380 /* addiu sp,-n */
1195 || (inst & 0xff80) == 0xfb80 /* daddiu sp,-n */
1196 || ((inst & 0xf810) == 0xf010 && seen_adjsp)) /* extend -n */
1197 break;
1198 else if ((inst & 0xff00) == 0x6300 /* addiu sp */
1199 || (inst & 0xff00) == 0xfb00) /* daddiu sp */
1200 seen_adjsp = 1;
1201 else
1202 seen_adjsp = 0;
20fa0902 1203 }
9ddf9aa9 1204 else if (mips_about_to_return (start_pc))
20fa0902
MA
1205 {
1206 start_pc += 2 * MIPS_INSTLEN; /* skip return, and its delay slot */
bd5635a1 1207 break;
20fa0902 1208 }
bd5635a1 1209
bd5635a1
RP
1210#if 0
1211 /* skip nops (usually 1) 0 - is this */
28444bf3
DP
1212 while (start_pc < pc && read_memory_integer (start_pc, MIPS_INSTLEN) == 0)
1213 start_pc += MIPS_INSTLEN;
bd5635a1
RP
1214#endif
1215 return start_pc;
1216}
1217
c81a76b3 1218/* Fetch the immediate value from a MIPS16 instruction.
b348b9fd
MA
1219 If the previous instruction was an EXTEND, use it to extend
1220 the upper bits of the immediate value. This is a helper function
1221 for mips16_heuristic_proc_desc. */
1222
1223static int
1224mips16_get_imm (prev_inst, inst, nbits, scale, is_signed)
1225 unsigned short prev_inst; /* previous instruction */
af774411 1226 unsigned short inst; /* current instruction */
b348b9fd
MA
1227 int nbits; /* number of bits in imm field */
1228 int scale; /* scale factor to be applied to imm */
1229 int is_signed; /* is the imm field signed? */
1230{
1231 int offset;
1232
1233 if ((prev_inst & 0xf800) == 0xf000) /* prev instruction was EXTEND? */
1234 {
7d9e8fac 1235 offset = ((prev_inst & 0x1f) << 11) | (prev_inst & 0x7e0);
b348b9fd
MA
1236 if (offset & 0x8000) /* check for negative extend */
1237 offset = 0 - (0x10000 - (offset & 0xffff));
1238 return offset | (inst & 0x1f);
1239 }
1240 else
1241 {
1242 int max_imm = 1 << nbits;
1243 int mask = max_imm - 1;
1244 int sign_bit = max_imm >> 1;
1245
1246 offset = inst & mask;
1247 if (is_signed && (offset & sign_bit))
1248 offset = 0 - (max_imm - offset);
1249 return offset * scale;
1250 }
1251}
1252
1253
1254/* Fill in values in temp_proc_desc based on the MIPS16 instruction
1255 stream from start_pc to limit_pc. */
1256
1257static void
1258mips16_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp)
bd5635a1 1259 CORE_ADDR start_pc, limit_pc;
9f9f94aa 1260 struct frame_info *next_frame;
b348b9fd 1261 CORE_ADDR sp;
bd5635a1 1262{
b348b9fd
MA
1263 CORE_ADDR cur_pc;
1264 CORE_ADDR frame_addr = 0; /* Value of $r17, used as frame pointer */
1265 unsigned short prev_inst = 0; /* saved copy of previous instruction */
1266 unsigned inst = 0; /* current instruction */
639c8612
MA
1267 unsigned entry_inst = 0; /* the entry instruction */
1268 int reg, offset;
bd5635a1 1269
af774411
MA
1270 PROC_FRAME_OFFSET(&temp_proc_desc) = 0; /* size of stack frame */
1271 PROC_FRAME_ADJUST(&temp_proc_desc) = 0; /* offset of FP from SP */
34df79fc 1272
b348b9fd
MA
1273 for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += MIPS16_INSTLEN)
1274 {
b348b9fd
MA
1275 /* Save the previous instruction. If it's an EXTEND, we'll extract
1276 the immediate offset extension from it in mips16_get_imm. */
1277 prev_inst = inst;
1278
c81a76b3
MA
1279 /* Fetch and decode the instruction. */
1280 inst = (unsigned short) mips_fetch_instruction (cur_pc);
b348b9fd
MA
1281 if ((inst & 0xff00) == 0x6300 /* addiu sp */
1282 || (inst & 0xff00) == 0xfb00) /* daddiu sp */
1283 {
1284 offset = mips16_get_imm (prev_inst, inst, 8, 8, 1);
1285 if (offset < 0) /* negative stack adjustment? */
1286 PROC_FRAME_OFFSET(&temp_proc_desc) -= offset;
1287 else
1288 /* Exit loop if a positive stack adjustment is found, which
1289 usually means that the stack cleanup code in the function
1290 epilogue is reached. */
1291 break;
1292 }
1293 else if ((inst & 0xf800) == 0xd000) /* sw reg,n($sp) */
1294 {
1295 offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
1296 reg = mips16_to_32_reg[(inst & 0x700) >> 8];
1297 PROC_REG_MASK(&temp_proc_desc) |= (1 << reg);
639c8612 1298 set_reg_offset (reg, sp + offset);
b348b9fd
MA
1299 }
1300 else if ((inst & 0xff00) == 0xf900) /* sd reg,n($sp) */
1301 {
1302 offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
1303 reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
1304 PROC_REG_MASK(&temp_proc_desc) |= (1 << reg);
639c8612 1305 set_reg_offset (reg, sp + offset);
b348b9fd
MA
1306 }
1307 else if ((inst & 0xff00) == 0x6200) /* sw $ra,n($sp) */
1308 {
1309 offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
af774411 1310 PROC_REG_MASK(&temp_proc_desc) |= (1 << RA_REGNUM);
639c8612 1311 set_reg_offset (RA_REGNUM, sp + offset);
97e091b2 1312 }
b348b9fd
MA
1313 else if ((inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */
1314 {
1315 offset = mips16_get_imm (prev_inst, inst, 8, 8, 0);
af774411 1316 PROC_REG_MASK(&temp_proc_desc) |= (1 << RA_REGNUM);
639c8612 1317 set_reg_offset (RA_REGNUM, sp + offset);
bd5635a1 1318 }
b348b9fd
MA
1319 else if (inst == 0x673d) /* move $s1, $sp */
1320 {
639c8612 1321 frame_addr = sp;
b348b9fd 1322 PROC_FRAME_REG (&temp_proc_desc) = 17;
97e091b2 1323 }
32dab603
MA
1324 else if ((inst & 0xff00) == 0x0100) /* addiu $s1,sp,n */
1325 {
1326 offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
1327 frame_addr = sp + offset;
1328 PROC_FRAME_REG (&temp_proc_desc) = 17;
af774411 1329 PROC_FRAME_ADJUST (&temp_proc_desc) = offset;
32dab603 1330 }
b348b9fd
MA
1331 else if ((inst & 0xFF00) == 0xd900) /* sw reg,offset($s1) */
1332 {
1333 offset = mips16_get_imm (prev_inst, inst, 5, 4, 0);
1334 reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
1335 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
639c8612 1336 set_reg_offset (reg, frame_addr + offset);
b348b9fd
MA
1337 }
1338 else if ((inst & 0xFF00) == 0x7900) /* sd reg,offset($s1) */
1339 {
1340 offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
1341 reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
1342 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
639c8612 1343 set_reg_offset (reg, frame_addr + offset);
b348b9fd
MA
1344 }
1345 else if ((inst & 0xf81f) == 0xe809 && (inst & 0x700) != 0x700) /* entry */
639c8612
MA
1346 entry_inst = inst; /* save for later processing */
1347 else if ((inst & 0xf800) == 0x1800) /* jal(x) */
1348 cur_pc += MIPS16_INSTLEN; /* 32-bit instruction */
1349 }
b348b9fd 1350
639c8612
MA
1351 /* The entry instruction is typically the first instruction in a function,
1352 and it stores registers at offsets relative to the value of the old SP
1353 (before the prologue). But the value of the sp parameter to this
1354 function is the new SP (after the prologue has been executed). So we
1355 can't calculate those offsets until we've seen the entire prologue,
1356 and can calculate what the old SP must have been. */
1357 if (entry_inst != 0)
1358 {
1359 int areg_count = (entry_inst >> 8) & 7;
1360 int sreg_count = (entry_inst >> 6) & 3;
b348b9fd 1361
639c8612
MA
1362 /* The entry instruction always subtracts 32 from the SP. */
1363 PROC_FRAME_OFFSET(&temp_proc_desc) += 32;
b348b9fd 1364
639c8612
MA
1365 /* Now we can calculate what the SP must have been at the
1366 start of the function prologue. */
1367 sp += PROC_FRAME_OFFSET(&temp_proc_desc);
b348b9fd 1368
639c8612
MA
1369 /* Check if a0-a3 were saved in the caller's argument save area. */
1370 for (reg = 4, offset = 0; reg < areg_count+4; reg++)
1371 {
1372 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
1373 set_reg_offset (reg, sp + offset);
1374 offset += MIPS_REGSIZE;
1375 }
1376
1377 /* Check if the ra register was pushed on the stack. */
1378 offset = -4;
1379 if (entry_inst & 0x20)
1380 {
1381 PROC_REG_MASK(&temp_proc_desc) |= 1 << RA_REGNUM;
1382 set_reg_offset (RA_REGNUM, sp + offset);
1383 offset -= MIPS_REGSIZE;
1384 }
1385
1386 /* Check if the s0 and s1 registers were pushed on the stack. */
1387 for (reg = 16; reg < sreg_count+16; reg++)
1388 {
1389 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
1390 set_reg_offset (reg, sp + offset);
1391 offset -= MIPS_REGSIZE;
1392 }
1393 }
b348b9fd
MA
1394}
1395
1396static void
1397mips32_heuristic_proc_desc(start_pc, limit_pc, next_frame, sp)
1398 CORE_ADDR start_pc, limit_pc;
1399 struct frame_info *next_frame;
1400 CORE_ADDR sp;
1401{
1402 CORE_ADDR cur_pc;
1403 CORE_ADDR frame_addr = 0; /* Value of $r30. Used by gcc for frame-pointer */
1404restart:
1405 PROC_FRAME_OFFSET(&temp_proc_desc) = 0;
639c8612 1406 PROC_FRAME_ADJUST (&temp_proc_desc) = 0; /* offset of FP from SP */
b348b9fd
MA
1407 for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += MIPS_INSTLEN)
1408 {
b348b9fd 1409 unsigned long inst, high_word, low_word;
c81a76b3 1410 int reg;
b348b9fd
MA
1411
1412 /* Fetch the instruction. */
c81a76b3 1413 inst = (unsigned long) mips_fetch_instruction (cur_pc);
b348b9fd
MA
1414
1415 /* Save some code by pre-extracting some useful fields. */
1416 high_word = (inst >> 16) & 0xffff;
1417 low_word = inst & 0xffff;
1418 reg = high_word & 0x1f;
1419
1420 if (high_word == 0x27bd /* addiu $sp,$sp,-i */
1421 || high_word == 0x23bd /* addi $sp,$sp,-i */
1422 || high_word == 0x67bd) /* daddiu $sp,$sp,-i */
1423 {
1424 if (low_word & 0x8000) /* negative stack adjustment? */
1425 PROC_FRAME_OFFSET(&temp_proc_desc) += 0x10000 - low_word;
1426 else
1427 /* Exit loop if a positive stack adjustment is found, which
1428 usually means that the stack cleanup code in the function
1429 epilogue is reached. */
1430 break;
1431 }
1432 else if ((high_word & 0xFFE0) == 0xafa0) /* sw reg,offset($sp) */
1433 {
1434 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
639c8612 1435 set_reg_offset (reg, sp + low_word);
b348b9fd
MA
1436 }
1437 else if ((high_word & 0xFFE0) == 0xffa0) /* sd reg,offset($sp) */
1438 {
1439 /* Irix 6.2 N32 ABI uses sd instructions for saving $gp and $ra,
1440 but the register size used is only 32 bits. Make the address
1441 for the saved register point to the lower 32 bits. */
1442 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
639c8612 1443 set_reg_offset (reg, sp + low_word + 8 - MIPS_REGSIZE);
b348b9fd 1444 }
a00dfa36
MS
1445 /* start-sanitize-r5900 */
1446 else if ((high_word & 0xFFE0) == 0x7fa0) /* sq reg,offset($sp) */
1447 {
1448 /* I don't think we have to worry about the Irix 6.2 N32 ABI
1449 issue noted int he sd reg, offset($sp) case above. */
1450 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
1451 set_reg_offset (reg, sp + low_word);
1452 }
1453 /* end-sanitize-r5900 */
b348b9fd
MA
1454 else if (high_word == 0x27be) /* addiu $30,$sp,size */
1455 {
1456 /* Old gcc frame, r30 is virtual frame pointer. */
32dab603 1457 if ((long)low_word != PROC_FRAME_OFFSET(&temp_proc_desc))
b348b9fd
MA
1458 frame_addr = sp + low_word;
1459 else if (PROC_FRAME_REG (&temp_proc_desc) == SP_REGNUM)
1460 {
1461 unsigned alloca_adjust;
1462 PROC_FRAME_REG (&temp_proc_desc) = 30;
1463 frame_addr = read_next_frame_reg(next_frame, 30);
1464 alloca_adjust = (unsigned)(frame_addr - (sp + low_word));
1465 if (alloca_adjust > 0)
1466 {
1467 /* FP > SP + frame_size. This may be because
1468 * of an alloca or somethings similar.
1469 * Fix sp to "pre-alloca" value, and try again.
1470 */
1471 sp += alloca_adjust;
1472 goto restart;
bd5635a1
RP
1473 }
1474 }
1475 }
b348b9fd
MA
1476 /* move $30,$sp. With different versions of gas this will be either
1477 `addu $30,$sp,$zero' or `or $30,$sp,$zero' or `daddu 30,sp,$0'.
1478 Accept any one of these. */
1479 else if (inst == 0x03A0F021 || inst == 0x03a0f025 || inst == 0x03a0f02d)
1480 {
1481 /* New gcc frame, virtual frame pointer is at r30 + frame_size. */
1482 if (PROC_FRAME_REG (&temp_proc_desc) == SP_REGNUM)
1483 {
1484 unsigned alloca_adjust;
1485 PROC_FRAME_REG (&temp_proc_desc) = 30;
1486 frame_addr = read_next_frame_reg(next_frame, 30);
1487 alloca_adjust = (unsigned)(frame_addr - sp);
1488 if (alloca_adjust > 0)
1489 {
1490 /* FP > SP + frame_size. This may be because
1491 * of an alloca or somethings similar.
1492 * Fix sp to "pre-alloca" value, and try again.
1493 */
1494 sp += alloca_adjust;
1495 goto restart;
97e091b2
MA
1496 }
1497 }
1498 }
b348b9fd
MA
1499 else if ((high_word & 0xFFE0) == 0xafc0) /* sw reg,offset($30) */
1500 {
1501 PROC_REG_MASK(&temp_proc_desc) |= 1 << reg;
639c8612 1502 set_reg_offset (reg, frame_addr + low_word);
bd5635a1
RP
1503 }
1504 }
b348b9fd
MA
1505}
1506
1507static mips_extra_func_info_t
1508heuristic_proc_desc(start_pc, limit_pc, next_frame)
1509 CORE_ADDR start_pc, limit_pc;
1510 struct frame_info *next_frame;
1511{
1512 CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM);
1513
1514 if (start_pc == 0) return NULL;
1515 memset (&temp_proc_desc, '\0', sizeof(temp_proc_desc));
1516 memset (&temp_saved_regs, '\0', sizeof(struct frame_saved_regs));
1517 PROC_LOW_ADDR (&temp_proc_desc) = start_pc;
1518 PROC_FRAME_REG (&temp_proc_desc) = SP_REGNUM;
1519 PROC_PC_REG (&temp_proc_desc) = RA_REGNUM;
1520
1521 if (start_pc + 200 < limit_pc)
1522 limit_pc = start_pc + 200;
899c4021 1523 if (pc_is_mips16 (start_pc))
b348b9fd
MA
1524 mips16_heuristic_proc_desc (start_pc, limit_pc, next_frame, sp);
1525 else
1526 mips32_heuristic_proc_desc (start_pc, limit_pc, next_frame, sp);
1527 return &temp_proc_desc;
bd5635a1
RP
1528}
1529
0f552c5f 1530static mips_extra_func_info_t
c1fc0935 1531non_heuristic_proc_desc (pc, addrptr)
9f9f94aa 1532 CORE_ADDR pc;
c1fc0935 1533 CORE_ADDR *addrptr;
bd5635a1 1534{
c1fc0935 1535 CORE_ADDR startaddr;
bd5635a1 1536 mips_extra_func_info_t proc_desc;
0f552c5f 1537 struct block *b = block_for_pc(pc);
48be4c35 1538 struct symbol *sym;
48be4c35
JK
1539
1540 find_pc_partial_function (pc, NULL, &startaddr, NULL);
c1fc0935
MA
1541 if (addrptr)
1542 *addrptr = startaddr;
97e091b2 1543 if (b == NULL || PC_IN_CALL_DUMMY (pc, 0, 0))
48be4c35
JK
1544 sym = NULL;
1545 else
1546 {
1547 if (startaddr > BLOCK_START (b))
1548 /* This is the "pathological" case referred to in a comment in
1549 print_frame_info. It might be better to move this check into
1550 symbol reading. */
1551 sym = NULL;
1552 else
c1fc0935 1553 sym = lookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 0, NULL);
48be4c35 1554 }
0f552c5f 1555
e4dbd248
PS
1556 /* If we never found a PDR for this function in symbol reading, then
1557 examine prologues to find the information. */
0f552c5f 1558 if (sym)
bd5635a1 1559 {
c1fc0935
MA
1560 proc_desc = (mips_extra_func_info_t) SYMBOL_VALUE (sym);
1561 if (PROC_FRAME_REG (proc_desc) == -1)
1562 return NULL;
1563 else
1564 return proc_desc;
1565 }
1566 else
1567 return NULL;
1568}
1569
1570
1571static mips_extra_func_info_t
1572find_proc_desc (pc, next_frame)
1573 CORE_ADDR pc;
1574 struct frame_info *next_frame;
1575{
1576 mips_extra_func_info_t proc_desc;
1577 CORE_ADDR startaddr;
1578
1579 proc_desc = non_heuristic_proc_desc (pc, &startaddr);
1580
1581 if (proc_desc)
1582 {
1583 /* IF this is the topmost frame AND
1584 * (this proc does not have debugging information OR
1585 * the PC is in the procedure prologue)
1586 * THEN create a "heuristic" proc_desc (by analyzing
1587 * the actual code) to replace the "official" proc_desc.
1588 */
1589 if (next_frame == NULL)
1590 {
1591 struct symtab_and_line val;
1592 struct symbol *proc_symbol =
1593 PROC_DESC_IS_DUMMY(proc_desc) ? 0 : PROC_SYMBOL(proc_desc);
1594
1595 if (proc_symbol)
1596 {
1597 val = find_pc_line (BLOCK_START
1598 (SYMBOL_BLOCK_VALUE(proc_symbol)),
1599 0);
1600 val.pc = val.end ? val.end : pc;
bd5635a1 1601 }
c1fc0935
MA
1602 if (!proc_symbol || pc < val.pc)
1603 {
1604 mips_extra_func_info_t found_heuristic =
1605 heuristic_proc_desc (PROC_LOW_ADDR (proc_desc),
1606 pc, next_frame);
1607 if (found_heuristic)
1608 proc_desc = found_heuristic;
bd5635a1
RP
1609 }
1610 }
1611 }
1612 else
1613 {
0f552c5f
JG
1614 /* Is linked_proc_desc_table really necessary? It only seems to be used
1615 by procedure call dummys. However, the procedures being called ought
1616 to have their own proc_descs, and even if they don't,
1617 heuristic_proc_desc knows how to create them! */
1618
bd5635a1 1619 register struct linked_proc_info *link;
9f9f94aa 1620
bd5635a1 1621 for (link = linked_proc_desc_table; link; link = link->next)
9f9f94aa
SS
1622 if (PROC_LOW_ADDR(&link->info) <= pc
1623 && PROC_HIGH_ADDR(&link->info) > pc)
1624 return &link->info;
23d35572 1625
48be4c35
JK
1626 if (startaddr == 0)
1627 startaddr = heuristic_proc_start (pc);
1628
bd5635a1 1629 proc_desc =
48be4c35 1630 heuristic_proc_desc (startaddr, pc, next_frame);
bd5635a1
RP
1631 }
1632 return proc_desc;
1633}
1634
96431497
MA
1635static CORE_ADDR
1636get_frame_pointer(frame, proc_desc)
1637 struct frame_info *frame;
1638 mips_extra_func_info_t proc_desc;
1639{
af774411
MA
1640 return ADDR_BITS_REMOVE (
1641 read_next_frame_reg (frame, PROC_FRAME_REG (proc_desc)) +
1642 PROC_FRAME_OFFSET (proc_desc) - PROC_FRAME_ADJUST (proc_desc));
96431497
MA
1643}
1644
bd5635a1
RP
1645mips_extra_func_info_t cached_proc_desc;
1646
9f9f94aa 1647CORE_ADDR
0f552c5f 1648mips_frame_chain(frame)
9f9f94aa 1649 struct frame_info *frame;
bd5635a1 1650{
f781fe93
MA
1651 mips_extra_func_info_t proc_desc;
1652 CORE_ADDR tmp;
1653 CORE_ADDR saved_pc = FRAME_SAVED_PC(frame);
1654
1655 if (saved_pc == 0 || inside_entry_file (saved_pc))
1656 return 0;
1657
1658 /* Check if the PC is inside a call stub. If it is, fetch the
1659 PC of the caller of that stub. */
1660 if ((tmp = mips_skip_stub (saved_pc)) != 0)
1661 saved_pc = tmp;
1662
1663 /* Look up the procedure descriptor for this PC. */
1664 proc_desc = find_proc_desc(saved_pc, frame);
1665 if (!proc_desc)
1666 return 0;
1667
1668 cached_proc_desc = proc_desc;
1669
1670 /* If no frame pointer and frame size is zero, we must be at end
1671 of stack (or otherwise hosed). If we don't check frame size,
1672 we loop forever if we see a zero size frame. */
1673 if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
1674 && PROC_FRAME_OFFSET (proc_desc) == 0
1675 /* The previous frame from a sigtramp frame might be frameless
1676 and have frame size zero. */
1677 && !frame->signal_handler_caller)
1678 return 0;
1679 else
1680 return get_frame_pointer (frame, proc_desc);
bd5635a1
RP
1681}
1682
1683void
1684init_extra_frame_info(fci)
1685 struct frame_info *fci;
1686{
96431497
MA
1687 int regnum;
1688
bd5635a1 1689 /* Use proc_desc calculated in frame_chain */
ee5fb959
JK
1690 mips_extra_func_info_t proc_desc =
1691 fci->next ? cached_proc_desc : find_proc_desc(fci->pc, fci->next);
0f552c5f 1692
70126bf9 1693 fci->saved_regs = NULL;
bd5635a1 1694 fci->proc_desc =
ee5fb959 1695 proc_desc == &temp_proc_desc ? 0 : proc_desc;
bd5635a1
RP
1696 if (proc_desc)
1697 {
c2a0f1cb 1698 /* Fixup frame-pointer - only needed for top frame */
5efd597b
PS
1699 /* This may not be quite right, if proc has a real frame register.
1700 Get the value of the frame relative sp, procedure might have been
1701 interrupted by a signal at it's very start. */
70126bf9
KH
1702 if (fci->pc == PROC_LOW_ADDR (proc_desc)
1703 && !PROC_DESC_IS_DUMMY (proc_desc))
1704 fci->frame = read_next_frame_reg (fci->next, SP_REGNUM);
c2a0f1cb 1705 else
96431497 1706 fci->frame = get_frame_pointer (fci->next, proc_desc);
bd5635a1 1707
48be4c35 1708 if (proc_desc == &temp_proc_desc)
ee5fb959 1709 {
09af5868
PS
1710 char *name;
1711
1712 /* Do not set the saved registers for a sigtramp frame,
1713 mips_find_saved_registers will do that for us.
1714 We can't use fci->signal_handler_caller, it is not yet set. */
1715 find_pc_partial_function (fci->pc, &name,
1716 (CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
1717 if (!IN_SIGTRAMP (fci->pc, name))
1718 {
1719 fci->saved_regs = (struct frame_saved_regs*)
1720 obstack_alloc (&frame_cache_obstack,
1721 sizeof (struct frame_saved_regs));
1722 *fci->saved_regs = temp_saved_regs;
1723 fci->saved_regs->regs[PC_REGNUM]
1724 = fci->saved_regs->regs[RA_REGNUM];
1725 }
ee5fb959 1726 }
bd5635a1
RP
1727
1728 /* hack: if argument regs are saved, guess these contain args */
96431497
MA
1729 fci->num_args = -1; /* assume we can't tell how many args for now */
1730 for (regnum = MIPS_LAST_ARG_REGNUM; regnum >= A0_REGNUM; regnum--)
1731 {
1732 if (PROC_REG_MASK(proc_desc) & (1 << regnum))
1733 {
1734 fci->num_args = regnum - A0_REGNUM + 1;
1735 break;
1736 }
1737 }
bd5635a1 1738 }
bd5635a1
RP
1739}
1740
a70dc898
RP
1741/* MIPS stack frames are almost impenetrable. When execution stops,
1742 we basically have to look at symbol information for the function
1743 that we stopped in, which tells us *which* register (if any) is
1744 the base of the frame pointer, and what offset from that register
1745 the frame itself is at.
1746
1747 This presents a problem when trying to examine a stack in memory
1748 (that isn't executing at the moment), using the "frame" command. We
1749 don't have a PC, nor do we have any registers except SP.
1750
1751 This routine takes two arguments, SP and PC, and tries to make the
1752 cached frames look as if these two arguments defined a frame on the
1753 cache. This allows the rest of info frame to extract the important
1754 arguments without difficulty. */
1755
9f9f94aa 1756struct frame_info *
c2a0f1cb
ILT
1757setup_arbitrary_frame (argc, argv)
1758 int argc;
9f9f94aa 1759 CORE_ADDR *argv;
a70dc898 1760{
c2a0f1cb
ILT
1761 if (argc != 2)
1762 error ("MIPS frame specifications require two arguments: sp and pc");
1763
1764 return create_new_frame (argv[0], argv[1]);
a70dc898
RP
1765}
1766
a00dfa36
MS
1767/*
1768 * STACK_ARGSIZE -- how many bytes does a pushed function arg take up on the stack?
1769 *
1770 * For n32 ABI, eight.
1771 * For all others, he same as the size of a general register.
1772 */
1773#if defined (_MIPS_SIM_NABI32) && _MIPS_SIM == _MIPS_SIM_NABI32
1774#define MIPS_NABI32 1
1775#define STACK_ARGSIZE 8
1776#else
1777#define MIPS_NABI32 0
1778#define STACK_ARGSIZE MIPS_REGSIZE
1779#endif
1780
0f552c5f
JG
1781CORE_ADDR
1782mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
97e091b2
MA
1783 int nargs;
1784 value_ptr *args;
1785 CORE_ADDR sp;
1786 int struct_return;
1787 CORE_ADDR struct_addr;
bd5635a1 1788{
97e091b2
MA
1789 int argreg;
1790 int float_argreg;
1791 int argnum;
1792 int len = 0;
781a59b2 1793 int stack_offset = 0;
97e091b2
MA
1794
1795 /* Macros to round N up or down to the next A boundary; A must be
1796 a power of two. */
1797#define ROUND_DOWN(n,a) ((n) & ~((a)-1))
1798#define ROUND_UP(n,a) (((n)+(a)-1) & ~((a)-1))
28444bf3
DP
1799
1800 /* First ensure that the stack and structure return address (if any)
98760eab
AC
1801 are properly aligned. The stack has to be at least 64-bit aligned
1802 even on 32-bit machines, because doubles must be 64-bit aligned.
1803 On at least one MIPS variant, stack frames need to be 128-bit
1804 aligned, so we round to this widest known alignment. */
1805 sp = ROUND_DOWN (sp, 16);
97e091b2 1806 struct_addr = ROUND_DOWN (struct_addr, MIPS_REGSIZE);
28444bf3 1807
97e091b2
MA
1808 /* Now make space on the stack for the args. We allocate more
1809 than necessary for EABI, because the first few arguments are
1810 passed in registers, but that's OK. */
1811 for (argnum = 0; argnum < nargs; argnum++)
1812 len += ROUND_UP (TYPE_LENGTH(VALUE_TYPE(args[argnum])), MIPS_REGSIZE);
98760eab 1813 sp -= ROUND_UP (len, 16);
97e091b2
MA
1814
1815 /* Initialize the integer and float register pointers. */
1816 argreg = A0_REGNUM;
1817 float_argreg = FPA0_REGNUM;
1818
1819 /* the struct_return pointer occupies the first parameter-passing reg */
5efd597b 1820 if (struct_return)
97e091b2
MA
1821 write_register (argreg++, struct_addr);
1822
97e091b2
MA
1823 /* Now load as many as possible of the first arguments into
1824 registers, and push the rest onto the stack. Loop thru args
1825 from first to last. */
1826 for (argnum = 0; argnum < nargs; argnum++)
5efd597b 1827 {
97e091b2 1828 char *val;
912e805f 1829 char valbuf[MAX_REGISTER_RAW_SIZE];
97e091b2
MA
1830 value_ptr arg = args[argnum];
1831 struct type *arg_type = check_typedef (VALUE_TYPE (arg));
1832 int len = TYPE_LENGTH (arg_type);
1833 enum type_code typecode = TYPE_CODE (arg_type);
1834
61d2d19a
PS
1835 /* The EABI passes structures that do not fit in a register by
1836 reference. In all other cases, pass the structure by value. */
781a59b2
MS
1837 if (MIPS_EABI && len > MIPS_REGSIZE &&
1838 (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION))
97e091b2
MA
1839 {
1840 store_address (valbuf, MIPS_REGSIZE, VALUE_ADDRESS (arg));
08d8f995 1841 typecode = TYPE_CODE_PTR;
97e091b2
MA
1842 len = MIPS_REGSIZE;
1843 val = valbuf;
1844 }
1845 else
1846 val = (char *)VALUE_CONTENTS (arg);
1847
1848 /* 32-bit ABIs always start floating point arguments in an
1849 even-numbered floating point register. */
a00dfa36 1850 if (!FP_REGISTER_DOUBLE && typecode == TYPE_CODE_FLT
97e091b2
MA
1851 && (float_argreg & 1))
1852 float_argreg++;
1853
1854 /* Floating point arguments passed in registers have to be
1855 treated specially. On 32-bit architectures, doubles
1856 are passed in register pairs; the even register gets
c81a76b3
MA
1857 the low word, and the odd register gets the high word.
1858 On non-EABI processors, the first two floating point arguments are
1859 also copied to general registers, because MIPS16 functions
1860 don't use float registers for arguments. This duplication of
1861 arguments in general registers can't hurt non-MIPS16 functions
1862 because those registers are normally skipped. */
97e091b2
MA
1863 if (typecode == TYPE_CODE_FLT
1864 && float_argreg <= MIPS_LAST_FP_ARG_REGNUM
1865 && mips_fpu != MIPS_FPU_NONE)
1866 {
a00dfa36 1867 if (!FP_REGISTER_DOUBLE && len == 8)
97e091b2
MA
1868 {
1869 int low_offset = TARGET_BYTE_ORDER == BIG_ENDIAN ? 4 : 0;
1870 unsigned long regval;
1871
c81a76b3 1872 /* Write the low word of the double to the even register(s). */
97e091b2 1873 regval = extract_unsigned_integer (val+low_offset, 4);
c81a76b3
MA
1874 write_register (float_argreg++, regval);
1875 if (!MIPS_EABI)
1876 write_register (argreg+1, regval);
1877
1878 /* Write the high word of the double to the odd register(s). */
97e091b2 1879 regval = extract_unsigned_integer (val+4-low_offset, 4);
c81a76b3
MA
1880 write_register (float_argreg++, regval);
1881 if (!MIPS_EABI)
1882 {
1883 write_register (argreg, regval);
1884 argreg += 2;
1885 }
97e091b2
MA
1886
1887 }
1888 else
1889 {
c81a76b3
MA
1890 /* This is a floating point value that fits entirely
1891 in a single register. */
97e091b2
MA
1892 CORE_ADDR regval = extract_address (val, len);
1893 write_register (float_argreg++, regval);
c81a76b3
MA
1894 if (!MIPS_EABI)
1895 {
1896 write_register (argreg, regval);
a00dfa36 1897 argreg += FP_REGISTER_DOUBLE ? 1 : 2;
c81a76b3 1898 }
97e091b2 1899 }
97e091b2
MA
1900 }
1901 else
1902 {
1903 /* Copy the argument to general registers or the stack in
1904 register-sized pieces. Large arguments are split between
1905 registers and stack. */
781a59b2
MS
1906 /* Note: structs whose size is not a multiple of MIPS_REGSIZE
1907 are treated specially: Irix cc passes them in registers
1908 where gcc sometimes puts them on the stack. For maximum
1909 compatibility, we will put them in both places. */
1910
1911 int odd_sized_struct = ((len > MIPS_REGSIZE) &&
1912 (len % MIPS_REGSIZE != 0));
97e091b2
MA
1913 while (len > 0)
1914 {
1915 int partial_len = len < MIPS_REGSIZE ? len : MIPS_REGSIZE;
61d2d19a 1916
781a59b2
MS
1917 if (argreg > MIPS_LAST_ARG_REGNUM || odd_sized_struct)
1918 {
1919 /* Write this portion of the argument to the stack. */
912e805f
AC
1920 /* Should shorter than int integer values be
1921 promoted to int before being stored? */
781a59b2 1922
912e805f 1923 int longword_offset = 0;
781a59b2 1924 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
a00dfa36 1925 if (STACK_ARGSIZE == 8 &&
781a59b2
MS
1926 (typecode == TYPE_CODE_INT ||
1927 typecode == TYPE_CODE_PTR ||
1928 typecode == TYPE_CODE_FLT) && len <= 4)
a00dfa36 1929 longword_offset = STACK_ARGSIZE - len;
781a59b2
MS
1930 else if ((typecode == TYPE_CODE_STRUCT ||
1931 typecode == TYPE_CODE_UNION) &&
a00dfa36
MS
1932 TYPE_LENGTH (arg_type) < STACK_ARGSIZE)
1933 longword_offset = STACK_ARGSIZE - len;
781a59b2
MS
1934
1935 write_memory (sp + stack_offset + longword_offset,
1936 val, partial_len);
1937 }
1938
1939 /* Note!!! This is NOT an else clause.
1940 Odd sized structs may go thru BOTH paths. */
97e091b2
MA
1941 if (argreg <= MIPS_LAST_ARG_REGNUM)
1942 {
61d2d19a
PS
1943 CORE_ADDR regval = extract_address (val, partial_len);
1944
c430260c
MS
1945 /* A non-floating-point argument being passed in a
1946 general register. If a struct or union, and if
91ee2779
JL
1947 the remaining length is smaller than the register
1948 size, we have to adjust the register value on
1949 big endian targets.
158bda58 1950
c430260c
MS
1951 It does not seem to be necessary to do the
1952 same for integral types.
158bda58 1953
c430260c 1954 Also don't do this adjustment on EABI targets. */
158bda58
MS
1955
1956 if (!MIPS_EABI &&
91ee2779
JL
1957 TARGET_BYTE_ORDER == BIG_ENDIAN &&
1958 partial_len < MIPS_REGSIZE &&
c430260c 1959 (typecode == TYPE_CODE_STRUCT ||
158bda58
MS
1960 typecode == TYPE_CODE_UNION))
1961 regval <<= ((MIPS_REGSIZE - partial_len) *
1962 TARGET_CHAR_BIT);
1963
97e091b2
MA
1964 write_register (argreg, regval);
1965 argreg++;
1966
1967 /* If this is the old ABI, prevent subsequent floating
1968 point arguments from being passed in floating point
1969 registers. */
1970 if (!MIPS_EABI)
1971 float_argreg = MIPS_LAST_FP_ARG_REGNUM + 1;
1972 }
97e091b2
MA
1973
1974 len -= partial_len;
1975 val += partial_len;
781a59b2
MS
1976
1977 /* The offset onto the stack at which we will start
1978 copying parameters (after the registers are used up)
1979 begins at (4 * MIPS_REGSIZE) in the old ABI. This
1980 leaves room for the "home" area for register parameters.
1981
a00dfa36
MS
1982 In the new EABI (and the NABI32), the 8 register parameters
1983 do not have "home" stack space reserved for them, so the
781a59b2
MS
1984 stack offset does not get incremented until after
1985 we have used up the 8 parameter registers. */
a00dfa36
MS
1986
1987 if (!(MIPS_EABI || MIPS_NABI32) ||
1988 argnum >= 8)
1989 stack_offset += ROUND_UP (partial_len, STACK_ARGSIZE);
97e091b2
MA
1990 }
1991 }
5efd597b 1992 }
97e091b2
MA
1993
1994 /* Set the return address register to point to the entry
1995 point of the program, where a breakpoint lies in wait. */
1996 write_register (RA_REGNUM, CALL_DUMMY_ADDRESS());
1997
1998 /* Return adjusted stack pointer. */
bd5635a1
RP
1999 return sp;
2000}
2001
c81a76b3 2002static void
28444bf3
DP
2003mips_push_register(CORE_ADDR *sp, int regno)
2004{
2005 char buffer[MAX_REGISTER_RAW_SIZE];
2006 int regsize = REGISTER_RAW_SIZE (regno);
2007
2008 *sp -= regsize;
2009 read_register_gen (regno, buffer);
2010 write_memory (*sp, buffer, regsize);
2011}
2012
2013/* MASK(i,j) == (1<<i) + (1<<(i+1)) + ... + (1<<j)). Assume i<=j<(MIPS_NUMREGS-1). */
e03c0cc6 2014#define MASK(i,j) (((1 << ((j)+1))-1) ^ ((1 << (i))-1))
bd5635a1
RP
2015
2016void
2017mips_push_dummy_frame()
2018{
2019 int ireg;
2020 struct linked_proc_info *link = (struct linked_proc_info*)
2021 xmalloc(sizeof(struct linked_proc_info));
2022 mips_extra_func_info_t proc_desc = &link->info;
96431497 2023 CORE_ADDR sp = ADDR_BITS_REMOVE (read_register (SP_REGNUM));
28444bf3 2024 CORE_ADDR old_sp = sp;
bd5635a1
RP
2025 link->next = linked_proc_desc_table;
2026 linked_proc_desc_table = link;
28444bf3
DP
2027
2028/* FIXME! are these correct ? */
bd5635a1 2029#define PUSH_FP_REGNUM 16 /* must be a register preserved across calls */
28444bf3 2030#define GEN_REG_SAVE_MASK MASK(1,16)|MASK(24,28)|(1<<(MIPS_NUMREGS-1))
bd5635a1 2031#define FLOAT_REG_SAVE_MASK MASK(0,19)
e4dbd248
PS
2032#define FLOAT_SINGLE_REG_SAVE_MASK \
2033 ((1<<18)|(1<<16)|(1<<14)|(1<<12)|(1<<10)|(1<<8)|(1<<6)|(1<<4)|(1<<2)|(1<<0))
bd5635a1
RP
2034 /*
2035 * The registers we must save are all those not preserved across
2036 * procedure calls. Dest_Reg (see tm-mips.h) must also be saved.
28444bf3
DP
2037 * In addition, we must save the PC, PUSH_FP_REGNUM, MMLO/-HI
2038 * and FP Control/Status registers.
2039 *
bd5635a1
RP
2040 *
2041 * Dummy frame layout:
2042 * (high memory)
2043 * Saved PC
2044 * Saved MMHI, MMLO, FPC_CSR
2045 * Saved R31
2046 * Saved R28
2047 * ...
2048 * Saved R1
2049 * Saved D18 (i.e. F19, F18)
2050 * ...
2051 * Saved D0 (i.e. F1, F0)
f9f8c14b 2052 * Argument build area and stack arguments written via mips_push_arguments
bd5635a1
RP
2053 * (low memory)
2054 */
28444bf3
DP
2055
2056 /* Save special registers (PC, MMHI, MMLO, FPC_CSR) */
28444bf3
DP
2057 PROC_FRAME_REG(proc_desc) = PUSH_FP_REGNUM;
2058 PROC_FRAME_OFFSET(proc_desc) = 0;
639c8612 2059 PROC_FRAME_ADJUST(proc_desc) = 0;
28444bf3
DP
2060 mips_push_register (&sp, PC_REGNUM);
2061 mips_push_register (&sp, HI_REGNUM);
2062 mips_push_register (&sp, LO_REGNUM);
2063 mips_push_register (&sp, mips_fpu == MIPS_FPU_NONE ? 0 : FCRCS_REGNUM);
2064
2065 /* Save general CPU registers */
bd5635a1 2066 PROC_REG_MASK(proc_desc) = GEN_REG_SAVE_MASK;
a00dfa36
MS
2067 /* PROC_REG_OFFSET is the offset of the first saved register from FP. */
2068 PROC_REG_OFFSET(proc_desc) = sp - old_sp - MIPS_REGSIZE;
bd5635a1
RP
2069 for (ireg = 32; --ireg >= 0; )
2070 if (PROC_REG_MASK(proc_desc) & (1 << ireg))
28444bf3 2071 mips_push_register (&sp, ireg);
3fed1c4a 2072
28444bf3
DP
2073 /* Save floating point registers starting with high order word */
2074 PROC_FREG_MASK(proc_desc) =
2075 mips_fpu == MIPS_FPU_DOUBLE ? FLOAT_REG_SAVE_MASK
2076 : mips_fpu == MIPS_FPU_SINGLE ? FLOAT_SINGLE_REG_SAVE_MASK : 0;
a00dfa36
MS
2077 /* PROC_FREG_OFFSET is the offset of the first saved *double* register
2078 from FP. */
2079 PROC_FREG_OFFSET(proc_desc) = sp - old_sp - 8;
bd5635a1
RP
2080 for (ireg = 32; --ireg >= 0; )
2081 if (PROC_FREG_MASK(proc_desc) & (1 << ireg))
28444bf3 2082 mips_push_register (&sp, ireg + FP0_REGNUM);
3fed1c4a 2083
f9f8c14b
MA
2084 /* Update the frame pointer for the call dummy and the stack pointer.
2085 Set the procedure's starting and ending addresses to point to the
2086 call dummy address at the entry point. */
2087 write_register (PUSH_FP_REGNUM, old_sp);
bd5635a1 2088 write_register (SP_REGNUM, sp);
97e091b2
MA
2089 PROC_LOW_ADDR(proc_desc) = CALL_DUMMY_ADDRESS();
2090 PROC_HIGH_ADDR(proc_desc) = CALL_DUMMY_ADDRESS() + 4;
bd5635a1
RP
2091 SET_PROC_DESC_IS_DUMMY(proc_desc);
2092 PROC_PC_REG(proc_desc) = RA_REGNUM;
2093}
2094
2095void
2096mips_pop_frame()
dac4929a
SG
2097{
2098 register int regnum;
9f9f94aa
SS
2099 struct frame_info *frame = get_current_frame ();
2100 CORE_ADDR new_sp = FRAME_FP (frame);
dac4929a 2101
a70dc898 2102 mips_extra_func_info_t proc_desc = frame->proc_desc;
dac4929a
SG
2103
2104 write_register (PC_REGNUM, FRAME_SAVED_PC(frame));
70126bf9
KH
2105 if (frame->saved_regs == NULL)
2106 mips_find_saved_regs (frame);
61d2d19a 2107 for (regnum = 0; regnum < NUM_REGS; regnum++)
dac4929a 2108 {
61d2d19a
PS
2109 if (regnum != SP_REGNUM && regnum != PC_REGNUM
2110 && frame->saved_regs->regs[regnum])
2111 write_register (regnum,
2112 read_memory_integer (frame->saved_regs->regs[regnum],
2113 MIPS_REGSIZE));
dac4929a
SG
2114 }
2115 write_register (SP_REGNUM, new_sp);
2116 flush_cached_frames ();
dac4929a 2117
199b2450 2118 if (proc_desc && PROC_DESC_IS_DUMMY(proc_desc))
bd5635a1 2119 {
dac4929a
SG
2120 struct linked_proc_info *pi_ptr, *prev_ptr;
2121
2122 for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL;
2123 pi_ptr != NULL;
2124 prev_ptr = pi_ptr, pi_ptr = pi_ptr->next)
2125 {
2126 if (&pi_ptr->info == proc_desc)
2127 break;
2128 }
2129
2130 if (pi_ptr == NULL)
2131 error ("Can't locate dummy extra frame info\n");
2132
2133 if (prev_ptr != NULL)
2134 prev_ptr->next = pi_ptr->next;
2135 else
2136 linked_proc_desc_table = pi_ptr->next;
2137
2138 free (pi_ptr);
2139
28444bf3
DP
2140 write_register (HI_REGNUM,
2141 read_memory_integer (new_sp - 2*MIPS_REGSIZE, MIPS_REGSIZE));
2142 write_register (LO_REGNUM,
2143 read_memory_integer (new_sp - 3*MIPS_REGSIZE, MIPS_REGSIZE));
e4dbd248 2144 if (mips_fpu != MIPS_FPU_NONE)
28444bf3
DP
2145 write_register (FCRCS_REGNUM,
2146 read_memory_integer (new_sp - 4*MIPS_REGSIZE, MIPS_REGSIZE));
bd5635a1 2147 }
bd5635a1
RP
2148}
2149
0f552c5f 2150static void
a70dc898 2151mips_print_register (regnum, all)
bd5635a1
RP
2152 int regnum, all;
2153{
e4dbd248 2154 char raw_buffer[MAX_REGISTER_RAW_SIZE];
bd5635a1 2155
48be4c35
JK
2156 /* Get the data in raw format. */
2157 if (read_relative_register_raw_bytes (regnum, raw_buffer))
2158 {
9ddf9aa9 2159 printf_filtered ("%s: [Invalid]", REGISTER_NAME (regnum));
48be4c35
JK
2160 return;
2161 }
2162
781a59b2 2163 /* If an even floating point register, also print as double. */
899c4021 2164 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT
e4dbd248 2165 && !((regnum-FP0_REGNUM) & 1))
a00dfa36 2166 if (REGISTER_RAW_SIZE(regnum) == 4) /* this would be silly on MIPS64 or N32 (Irix 6) */
899c4021
MA
2167 {
2168 char dbuffer[2 * MAX_REGISTER_RAW_SIZE];
48be4c35 2169
899c4021
MA
2170 read_relative_register_raw_bytes (regnum, dbuffer);
2171 read_relative_register_raw_bytes (regnum+1, dbuffer+MIPS_REGSIZE);
2172 REGISTER_CONVERT_TO_TYPE (regnum, builtin_type_double, dbuffer);
c81a76b3 2173
899c4021
MA
2174 printf_filtered ("(d%d: ", regnum-FP0_REGNUM);
2175 val_print (builtin_type_double, dbuffer, 0,
2176 gdb_stdout, 0, 1, 0, Val_pretty_default);
2177 printf_filtered ("); ");
2178 }
9ddf9aa9 2179 fputs_filtered (REGISTER_NAME (regnum), gdb_stdout);
48be4c35
JK
2180
2181 /* The problem with printing numeric register names (r26, etc.) is that
2182 the user can't use them on input. Probably the best solution is to
2183 fix it so that either the numeric or the funky (a2, etc.) names
2184 are accepted on input. */
28444bf3 2185 if (regnum < MIPS_NUMREGS)
48be4c35
JK
2186 printf_filtered ("(r%d): ", regnum);
2187 else
2188 printf_filtered (": ");
bd5635a1 2189
48be4c35 2190 /* If virtual format is floating, print it that way. */
ac57e5ad 2191 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
a00dfa36 2192 if (FP_REGISTER_DOUBLE)
899c4021
MA
2193 { /* show 8-byte floats as float AND double: */
2194 int offset = 4 * (TARGET_BYTE_ORDER == BIG_ENDIAN);
2195
2196 printf_filtered (" (float) ");
2197 val_print (builtin_type_float, raw_buffer + offset, 0,
2198 gdb_stdout, 0, 1, 0, Val_pretty_default);
2199 printf_filtered (", (double) ");
2200 val_print (builtin_type_double, raw_buffer, 0,
2201 gdb_stdout, 0, 1, 0, Val_pretty_default);
2202 }
2203 else
2204 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0,
2205 gdb_stdout, 0, 1, 0, Val_pretty_default);
48be4c35
JK
2206 /* Else print as integer in hex. */
2207 else
ac57e5ad
SS
2208 print_scalar_formatted (raw_buffer, REGISTER_VIRTUAL_TYPE (regnum),
2209 'x', 0, gdb_stdout);
bd5635a1
RP
2210}
2211
899c4021
MA
2212/* Replacement for generic do_registers_info.
2213 Print regs in pretty columns. */
2214
2215static int
2216do_fp_register_row (regnum)
2217 int regnum;
2218{ /* do values for FP (float) regs */
cf93a3aa
ILT
2219 char *raw_buffer[2];
2220 char *dbl_buffer;
899c4021
MA
2221 /* use HI and LO to control the order of combining two flt regs */
2222 int HI = (TARGET_BYTE_ORDER == BIG_ENDIAN);
2223 int LO = (TARGET_BYTE_ORDER != BIG_ENDIAN);
2224 double doub, flt1, flt2; /* doubles extracted from raw hex data */
2225 int inv1, inv2, inv3;
2226
cf93a3aa
ILT
2227 raw_buffer[0] = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
2228 raw_buffer[1] = (char *) alloca (REGISTER_RAW_SIZE (FP0_REGNUM));
2229 dbl_buffer = (char *) alloca (2 * REGISTER_RAW_SIZE (FP0_REGNUM));
2230
899c4021
MA
2231 /* Get the data in raw format. */
2232 if (read_relative_register_raw_bytes (regnum, raw_buffer[HI]))
9ddf9aa9 2233 error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
899c4021
MA
2234 if (REGISTER_RAW_SIZE(regnum) == 4)
2235 {
2236 /* 4-byte registers: we can fit two registers per row. */
2237 /* Also print every pair of 4-byte regs as an 8-byte double. */
2238 if (read_relative_register_raw_bytes (regnum + 1, raw_buffer[LO]))
2239 error ("can't read register %d (%s)",
9ddf9aa9 2240 regnum + 1, REGISTER_NAME (regnum + 1));
899c4021
MA
2241
2242 /* copy the two floats into one double, and unpack both */
2243 memcpy (dbl_buffer, raw_buffer, sizeof(dbl_buffer));
2244 flt1 = unpack_double (builtin_type_float, raw_buffer[HI], &inv1);
2245 flt2 = unpack_double (builtin_type_float, raw_buffer[LO], &inv2);
2246 doub = unpack_double (builtin_type_double, dbl_buffer, &inv3);
2247
2248 printf_filtered (inv1 ? " %-5s: <invalid float>" :
9ddf9aa9 2249 " %-5s%-17.9g", REGISTER_NAME (regnum), flt1);
899c4021 2250 printf_filtered (inv2 ? " %-5s: <invalid float>" :
9ddf9aa9 2251 " %-5s%-17.9g", REGISTER_NAME (regnum + 1), flt2);
899c4021
MA
2252 printf_filtered (inv3 ? " dbl: <invalid double>\n" :
2253 " dbl: %-24.17g\n", doub);
2254 /* may want to do hex display here (future enhancement) */
2255 regnum +=2;
2256 }
2257 else
2258 { /* eight byte registers: print each one as float AND as double. */
2259 int offset = 4 * (TARGET_BYTE_ORDER == BIG_ENDIAN);
2260
2261 memcpy (dbl_buffer, raw_buffer[HI], sizeof(dbl_buffer));
2262 flt1 = unpack_double (builtin_type_float,
2263 &raw_buffer[HI][offset], &inv1);
2264 doub = unpack_double (builtin_type_double, dbl_buffer, &inv3);
2265
2266 printf_filtered (inv1 ? " %-5s: <invalid float>" :
9ddf9aa9 2267 " %-5s flt: %-17.9g", REGISTER_NAME (regnum), flt1);
899c4021
MA
2268 printf_filtered (inv3 ? " dbl: <invalid double>\n" :
2269 " dbl: %-24.17g\n", doub);
2270 /* may want to do hex display here (future enhancement) */
2271 regnum++;
2272 }
2273 return regnum;
2274}
2275
2276/* Print a row's worth of GP (int) registers, with name labels above */
2277
2278static int
2279do_gp_register_row (regnum)
2280 int regnum;
912e805f
AC
2281{
2282 /* do values for GP (int) regs */
2283 char raw_buffer[MAX_REGISTER_RAW_SIZE];
2284 int ncols = (MIPS_REGSIZE == 8 ? 4 : 8); /* display cols per row */
2285 int col, byte;
2286 int start_regnum = regnum;
2287 int numregs = NUM_REGS;
2288
2289/* start-sanitize-sky */
98760eab
AC
2290#ifdef NUM_CORE_REGS
2291 numregs = NUM_CORE_REGS;
912e805f
AC
2292#endif
2293/* end-sanitize-sky */
899c4021
MA
2294
2295 /* For GP registers, we print a separate row of names above the vals */
2296 printf_filtered (" ");
912e805f 2297 for (col = 0; col < ncols && regnum < numregs; regnum++)
899c4021 2298 {
9ddf9aa9 2299 if (*REGISTER_NAME (regnum) == '\0')
899c4021
MA
2300 continue; /* unused register */
2301 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
2302 break; /* end the row: reached FP register */
2303 printf_filtered (MIPS_REGSIZE == 8 ? "%17s" : "%9s",
9ddf9aa9 2304 REGISTER_NAME (regnum));
899c4021
MA
2305 col++;
2306 }
2307 printf_filtered (start_regnum < MIPS_NUMREGS ? "\n R%-4d" : "\n ",
2308 start_regnum); /* print the R0 to R31 names */
2309
2310 regnum = start_regnum; /* go back to start of row */
2311 /* now print the values in hex, 4 or 8 to the row */
912e805f 2312 for (col = 0; col < ncols && regnum < numregs; regnum++)
899c4021 2313 {
9ddf9aa9 2314 if (*REGISTER_NAME (regnum) == '\0')
899c4021
MA
2315 continue; /* unused register */
2316 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
2317 break; /* end row: reached FP register */
2318 /* OK: get the data in raw format. */
2319 if (read_relative_register_raw_bytes (regnum, raw_buffer))
9ddf9aa9 2320 error ("can't read register %d (%s)", regnum, REGISTER_NAME (regnum));
912e805f
AC
2321 /* pad small registers */
2322 for (byte = 0; byte < (MIPS_REGSIZE - REGISTER_RAW_SIZE (regnum)); byte++)
2323 printf_filtered (" ");
899c4021
MA
2324 /* Now print the register value in hex, endian order. */
2325 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2326 for (byte = 0; byte < REGISTER_RAW_SIZE (regnum); byte++)
2327 printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
2328 else
2329 for (byte = REGISTER_RAW_SIZE (regnum) - 1; byte >= 0; byte--)
2330 printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
2331 printf_filtered (" ");
2332 col++;
2333 }
2334 if (col > 0) /* ie. if we actually printed anything... */
2335 printf_filtered ("\n");
2336
2337 return regnum;
2338}
2339
2340/* MIPS_DO_REGISTERS_INFO(): called by "info register" command */
9f9f94aa 2341
0f552c5f 2342void
361bf6ee 2343mips_do_registers_info (regnum, fpregs)
bd5635a1 2344 int regnum;
361bf6ee 2345 int fpregs;
bd5635a1 2346{
899c4021 2347 if (regnum != -1) /* do one specified register */
9f9f94aa 2348 {
9ddf9aa9 2349 if (*(REGISTER_NAME (regnum)) == '\0')
9f9f94aa
SS
2350 error ("Not a valid register for the current processor type");
2351
bd5635a1
RP
2352 mips_print_register (regnum, 0);
2353 printf_filtered ("\n");
9f9f94aa 2354 }
899c4021 2355 else /* do all (or most) registers */
9f9f94aa 2356 {
899c4021
MA
2357 regnum = 0;
2358 while (regnum < NUM_REGS)
912e805f
AC
2359 {
2360 if (TYPE_CODE(REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT)
2361 if (fpregs) /* true for "INFO ALL-REGISTERS" command */
2362 regnum = do_fp_register_row (regnum); /* FP regs */
2363 else
2364 regnum += MIPS_NUMREGS; /* skip floating point regs */
899c4021 2365 else
912e805f
AC
2366 regnum = do_gp_register_row (regnum); /* GP (int) regs */
2367/* start-sanitize-sky */
98760eab 2368#ifdef NUM_CORE_REGS
912e805f
AC
2369 /* For the sky project, NUM_REGS includes the vector slaves,
2370 which are handled elsewhere */
98760eab 2371 if (regnum >= NUM_CORE_REGS)
912e805f
AC
2372 break;
2373#endif
2374/* end-sanitize-sky */
2375 }
9f9f94aa 2376 }
bd5635a1 2377}
9f9f94aa 2378
bd5635a1
RP
2379/* Return number of args passed to a frame. described by FIP.
2380 Can return -1, meaning no way to tell. */
2381
0f552c5f 2382int
9f9f94aa
SS
2383mips_frame_num_args (frame)
2384 struct frame_info *frame;
bd5635a1 2385{
9f9f94aa
SS
2386#if 0 /* FIXME Use or lose this! */
2387 struct chain_info_t *p;
bd5635a1 2388
9f9f94aa
SS
2389 p = mips_find_cached_frame (FRAME_FP (frame));
2390 if (p->valid)
2391 return p->the_info.numargs;
bd5635a1 2392#endif
9f9f94aa 2393 return -1;
bd5635a1 2394}
96431497 2395
427fec5d 2396/* Is this a branch with a delay slot? */
9f9f94aa 2397
b5aff268
JK
2398static int is_delayed PARAMS ((unsigned long));
2399
ee5fb959
JK
2400static int
2401is_delayed (insn)
2402 unsigned long insn;
2403{
2404 int i;
2405 for (i = 0; i < NUMOPCODES; ++i)
2406 if (mips_opcodes[i].pinfo != INSN_MACRO
2407 && (insn & mips_opcodes[i].mask) == mips_opcodes[i].match)
2408 break;
427fec5d
JK
2409 return (i < NUMOPCODES
2410 && (mips_opcodes[i].pinfo & (INSN_UNCOND_BRANCH_DELAY
2411 | INSN_COND_BRANCH_DELAY
2412 | INSN_COND_BRANCH_LIKELY)));
ee5fb959 2413}
b5aff268
JK
2414
2415int
2416mips_step_skips_delay (pc)
2417 CORE_ADDR pc;
2418{
96431497 2419 char buf[MIPS_INSTLEN];
b5aff268 2420
f9f8c14b 2421 /* There is no branch delay slot on MIPS16. */
899c4021 2422 if (pc_is_mips16 (pc))
f9f8c14b
MA
2423 return 0;
2424
96431497 2425 if (target_read_memory (pc, buf, MIPS_INSTLEN) != 0)
b5aff268
JK
2426 /* If error reading memory, guess that it is not a delayed branch. */
2427 return 0;
96431497 2428 return is_delayed ((unsigned long)extract_unsigned_integer (buf, MIPS_INSTLEN));
b5aff268 2429}
ee5fb959 2430
bd5635a1 2431
20fa0902
MA
2432/* Skip the PC past function prologue instructions (32-bit version).
2433 This is a helper function for mips_skip_prologue. */
2434
2435static CORE_ADDR
2436mips32_skip_prologue (pc, lenient)
2437 CORE_ADDR pc; /* starting PC to search from */
ee5fb959 2438 int lenient;
bd5635a1 2439{
28444bf3 2440 t_inst inst;
20fa0902 2441 CORE_ADDR end_pc;
0b0d6c3f 2442 int seen_sp_adjust = 0;
ac57e5ad 2443 int load_immediate_bytes = 0;
bd5635a1 2444
e157305c
PS
2445 /* Skip the typical prologue instructions. These are the stack adjustment
2446 instruction and the instructions that save registers on the stack
2447 or in the gcc frame. */
20fa0902 2448 for (end_pc = pc + 100; pc < end_pc; pc += MIPS_INSTLEN)
ee5fb959 2449 {
b348b9fd 2450 unsigned long high_word;
ee5fb959 2451
c81a76b3 2452 inst = mips_fetch_instruction (pc);
b348b9fd 2453 high_word = (inst >> 16) & 0xffff;
ee5fb959 2454
002a422b 2455#if 0
ee5fb959
JK
2456 if (lenient && is_delayed (inst))
2457 continue;
002a422b 2458#endif
ee5fb959 2459
b348b9fd
MA
2460 if (high_word == 0x27bd /* addiu $sp,$sp,offset */
2461 || high_word == 0x67bd) /* daddiu $sp,$sp,offset */
0b0d6c3f 2462 seen_sp_adjust = 1;
ac57e5ad
SS
2463 else if (inst == 0x03a1e823 || /* subu $sp,$sp,$at */
2464 inst == 0x03a8e823) /* subu $sp,$sp,$t0 */
2465 seen_sp_adjust = 1;
97e091b2 2466 else if (((inst & 0xFFE00000) == 0xAFA00000 /* sw reg,n($sp) */
a00dfa36
MS
2467 /* start-sanitize-r5900 */
2468 || (inst & 0xFFE00000) == 0x7FA00000 /* sq reg,n($sp) */
2469 /* end-sanitize-r5900 */
97e091b2
MA
2470 || (inst & 0xFFE00000) == 0xFFA00000) /* sd reg,n($sp) */
2471 && (inst & 0x001F0000)) /* reg != $zero */
2472 continue;
2473
e157305c
PS
2474 else if ((inst & 0xFFE00000) == 0xE7A00000) /* swc1 freg,n($sp) */
2475 continue;
2476 else if ((inst & 0xF3E00000) == 0xA3C00000 && (inst & 0x001F0000))
2477 /* sx reg,n($s8) */
2478 continue; /* reg != $zero */
1d9489c1
JK
2479
2480 /* move $s8,$sp. With different versions of gas this will be either
20fa0902
MA
2481 `addu $s8,$sp,$zero' or `or $s8,$sp,$zero' or `daddu s8,sp,$0'.
2482 Accept any one of these. */
2483 else if (inst == 0x03A0F021 || inst == 0x03a0f025 || inst == 0x03a0f02d)
0b0d6c3f 2484 continue;
1d9489c1 2485
1b71de8e
PS
2486 else if ((inst & 0xFF9F07FF) == 0x00800021) /* move reg,$a0-$a3 */
2487 continue;
b348b9fd 2488 else if (high_word == 0x3c1c) /* lui $gp,n */
e03c0cc6 2489 continue;
b348b9fd 2490 else if (high_word == 0x279c) /* addiu $gp,$gp,n */
e03c0cc6
ILT
2491 continue;
2492 else if (inst == 0x0399e021 /* addu $gp,$gp,$t9 */
2493 || inst == 0x033ce021) /* addu $gp,$t9,$gp */
2494 continue;
ac57e5ad
SS
2495 /* The following instructions load $at or $t0 with an immediate
2496 value in preparation for a stack adjustment via
2497 subu $sp,$sp,[$at,$t0]. These instructions could also initialize
2498 a local variable, so we accept them only before a stack adjustment
2499 instruction was seen. */
2500 else if (!seen_sp_adjust)
2501 {
b348b9fd
MA
2502 if (high_word == 0x3c01 || /* lui $at,n */
2503 high_word == 0x3c08) /* lui $t0,n */
ac57e5ad 2504 {
28444bf3 2505 load_immediate_bytes += MIPS_INSTLEN; /* FIXME!! */
ac57e5ad
SS
2506 continue;
2507 }
b348b9fd
MA
2508 else if (high_word == 0x3421 || /* ori $at,$at,n */
2509 high_word == 0x3508 || /* ori $t0,$t0,n */
2510 high_word == 0x3401 || /* ori $at,$zero,n */
2511 high_word == 0x3408) /* ori $t0,$zero,n */
ac57e5ad 2512 {
28444bf3 2513 load_immediate_bytes += MIPS_INSTLEN; /* FIXME!! */
ac57e5ad
SS
2514 continue;
2515 }
2516 else
2517 break;
2518 }
0b0d6c3f 2519 else
ac57e5ad 2520 break;
d747e0af 2521 }
e157305c 2522
ac57e5ad
SS
2523 /* In a frameless function, we might have incorrectly
2524 skipped some load immediate instructions. Undo the skipping
2525 if the load immediate was not followed by a stack adjustment. */
2526 if (load_immediate_bytes && !seen_sp_adjust)
20fa0902
MA
2527 pc -= load_immediate_bytes;
2528 return pc;
2529}
2530
2531/* Skip the PC past function prologue instructions (16-bit version).
2532 This is a helper function for mips_skip_prologue. */
2533
2534static CORE_ADDR
2535mips16_skip_prologue (pc, lenient)
2536 CORE_ADDR pc; /* starting PC to search from */
2537 int lenient;
2538{
2539 CORE_ADDR end_pc;
c81a76b3
MA
2540 int extend_bytes = 0;
2541 int prev_extend_bytes;
20fa0902
MA
2542
2543 /* Table of instructions likely to be found in a function prologue. */
2544 static struct
2545 {
2546 unsigned short inst;
2547 unsigned short mask;
2548 } table[] =
2549 {
2550 { 0x6300, 0xff00 }, /* addiu $sp,offset */
2551 { 0xfb00, 0xff00 }, /* daddiu $sp,offset */
2552 { 0xd000, 0xf800 }, /* sw reg,n($sp) */
2553 { 0xf900, 0xff00 }, /* sd reg,n($sp) */
2554 { 0x6200, 0xff00 }, /* sw $ra,n($sp) */
2555 { 0xfa00, 0xff00 }, /* sd $ra,n($sp) */
2556 { 0x673d, 0xffff }, /* move $s1,sp */
2557 { 0xd980, 0xff80 }, /* sw $a0-$a3,n($s1) */
2558 { 0x6704, 0xff1c }, /* move reg,$a0-$a3 */
2559 { 0xe809, 0xf81f }, /* entry pseudo-op */
32dab603 2560 { 0x0100, 0xff00 }, /* addiu $s1,$sp,n */
20fa0902
MA
2561 { 0, 0 } /* end of table marker */
2562 };
2563
2564 /* Skip the typical prologue instructions. These are the stack adjustment
2565 instruction and the instructions that save registers on the stack
2566 or in the gcc frame. */
2567 for (end_pc = pc + 100; pc < end_pc; pc += MIPS16_INSTLEN)
2568 {
20fa0902 2569 unsigned short inst;
20fa0902
MA
2570 int i;
2571
c81a76b3 2572 inst = mips_fetch_instruction (pc);
20fa0902
MA
2573
2574 /* Normally we ignore an extend instruction. However, if it is
2575 not followed by a valid prologue instruction, we must adjust
2576 the pc back over the extend so that it won't be considered
2577 part of the prologue. */
2578 if ((inst & 0xf800) == 0xf000) /* extend */
2579 {
2580 extend_bytes = MIPS16_INSTLEN;
2581 continue;
2582 }
2583 prev_extend_bytes = extend_bytes;
2584 extend_bytes = 0;
2585
2586 /* Check for other valid prologue instructions besides extend. */
2587 for (i = 0; table[i].mask != 0; i++)
2588 if ((inst & table[i].mask) == table[i].inst) /* found, get out */
2589 break;
2590 if (table[i].mask != 0) /* it was in table? */
32dab603 2591 continue; /* ignore it */
20fa0902
MA
2592 else /* non-prologue */
2593 {
2594 /* Return the current pc, adjusted backwards by 2 if
2595 the previous instruction was an extend. */
2596 return pc - prev_extend_bytes;
2597 }
2598 }
32dab603 2599 return pc;
20fa0902
MA
2600}
2601
2602/* To skip prologues, I use this predicate. Returns either PC itself
2603 if the code at PC does not look like a function prologue; otherwise
2604 returns an address that (if we're lucky) follows the prologue. If
2605 LENIENT, then we must skip everything which is involved in setting
2606 up the frame (it's OK to skip more, just so long as we don't skip
2607 anything which might clobber the registers which are being saved.
2608 We must skip more in the case where part of the prologue is in the
2609 delay slot of a non-prologue instruction). */
2610
2611CORE_ADDR
2612mips_skip_prologue (pc, lenient)
2613 CORE_ADDR pc;
2614 int lenient;
2615{
2616 /* See if we can determine the end of the prologue via the symbol table.
2617 If so, then return either PC, or the PC after the prologue, whichever
2618 is greater. */
2619
2620 CORE_ADDR post_prologue_pc = after_prologue (pc, NULL);
2621
2622 if (post_prologue_pc != 0)
2623 return max (pc, post_prologue_pc);
2624
2625 /* Can't determine prologue from the symbol table, need to examine
2626 instructions. */
2627
899c4021 2628 if (pc_is_mips16 (pc))
20fa0902
MA
2629 return mips16_skip_prologue (pc, lenient);
2630 else
2631 return mips32_skip_prologue (pc, lenient);
bd5635a1 2632}
c2a0f1cb 2633
002a422b 2634#if 0
20fa0902 2635/* The lenient prologue stuff should be superseded by the code in
002a422b
JK
2636 init_extra_frame_info which looks to see whether the stores mentioned
2637 in the proc_desc have actually taken place. */
2638
ee5fb959
JK
2639/* Is address PC in the prologue (loosely defined) for function at
2640 STARTADDR? */
2641
2642static int
2643mips_in_lenient_prologue (startaddr, pc)
2644 CORE_ADDR startaddr;
2645 CORE_ADDR pc;
2646{
2647 CORE_ADDR end_prologue = mips_skip_prologue (startaddr, 1);
2648 return pc >= startaddr && pc < end_prologue;
2649}
002a422b 2650#endif
ee5fb959 2651
ac8cf67d
PS
2652/* Given a return value in `regbuf' with a type `valtype',
2653 extract and copy its value into `valbuf'. */
2654void
2655mips_extract_return_value (valtype, regbuf, valbuf)
2656 struct type *valtype;
2657 char regbuf[REGISTER_BYTES];
2658 char *valbuf;
2659{
2660 int regnum;
92a6d600 2661 int offset = 0;
c81a76b3 2662 int len = TYPE_LENGTH (valtype);
ac8cf67d 2663
e4dbd248
PS
2664 regnum = 2;
2665 if (TYPE_CODE (valtype) == TYPE_CODE_FLT
0af60e03 2666 && (mips_fpu == MIPS_FPU_DOUBLE
912e805f 2667 || (mips_fpu == MIPS_FPU_SINGLE && len <= MIPS_FPU_SINGLE_REGSIZE)))
f781fe93 2668 regnum = FP0_REGNUM;
ac8cf67d 2669
0af60e03
MS
2670 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2671 { /* "un-left-justify" the value from the register */
87910097 2672 if (len < REGISTER_RAW_SIZE (regnum))
0af60e03
MS
2673 offset = REGISTER_RAW_SIZE (regnum) - len;
2674 if (len > REGISTER_RAW_SIZE (regnum) && /* odd-size structs */
2675 len < REGISTER_RAW_SIZE (regnum) * 2 &&
2676 (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
2677 TYPE_CODE (valtype) == TYPE_CODE_UNION))
2678 offset = 2 * REGISTER_RAW_SIZE (regnum) - len;
2679 }
c81a76b3 2680 memcpy (valbuf, regbuf + REGISTER_BYTE (regnum) + offset, len);
f781fe93 2681 REGISTER_CONVERT_TO_TYPE (regnum, valtype, valbuf);
ac8cf67d
PS
2682}
2683
2684/* Given a return value in `regbuf' with a type `valtype',
2685 write it's value into the appropriate register. */
2686void
2687mips_store_return_value (valtype, valbuf)
2688 struct type *valtype;
2689 char *valbuf;
2690{
2691 int regnum;
0af60e03
MS
2692 int offset = 0;
2693 int len = TYPE_LENGTH (valtype);
ac8cf67d
PS
2694 char raw_buffer[MAX_REGISTER_RAW_SIZE];
2695
e4dbd248
PS
2696 regnum = 2;
2697 if (TYPE_CODE (valtype) == TYPE_CODE_FLT
0af60e03
MS
2698 && (mips_fpu == MIPS_FPU_DOUBLE
2699 || (mips_fpu == MIPS_FPU_SINGLE && len <= MIPS_REGSIZE)))
e4dbd248
PS
2700 regnum = FP0_REGNUM;
2701
0af60e03
MS
2702 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2703 { /* "left-justify" the value in the register */
2704 if (len < REGISTER_RAW_SIZE (regnum))
2705 offset = REGISTER_RAW_SIZE (regnum) - len;
2706 if (len > REGISTER_RAW_SIZE (regnum) && /* odd-size structs */
2707 len < REGISTER_RAW_SIZE (regnum) * 2 &&
2708 (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
2709 TYPE_CODE (valtype) == TYPE_CODE_UNION))
2710 offset = 2 * REGISTER_RAW_SIZE (regnum) - len;
2711 }
2712 memcpy(raw_buffer + offset, valbuf, len);
ac8cf67d 2713 REGISTER_CONVERT_FROM_TYPE(regnum, valtype, raw_buffer);
0af60e03
MS
2714 write_register_bytes(REGISTER_BYTE (regnum), raw_buffer,
2715 len > REGISTER_RAW_SIZE (regnum) ?
2716 len : REGISTER_RAW_SIZE (regnum));
ac8cf67d
PS
2717}
2718
e03c0cc6
ILT
2719/* Exported procedure: Is PC in the signal trampoline code */
2720
2721int
2722in_sigtramp (pc, ignore)
2723 CORE_ADDR pc;
2724 char *ignore; /* function name */
2725{
2726 if (sigtramp_address == 0)
2727 fixup_sigtramp ();
2728 return (pc >= sigtramp_address && pc < sigtramp_end);
2729}
2730
e4dbd248
PS
2731/* Command to set FPU type. mips_fpu_string will have been set to the
2732 user's argument. Set mips_fpu based on mips_fpu_string, and then
2733 canonicalize mips_fpu_string. */
2734
2735/*ARGSUSED*/
2736static void
2737mips_set_fpu_command (args, from_tty, c)
2738 char *args;
2739 int from_tty;
2740 struct cmd_list_element *c;
2741{
2742 char *err = NULL;
2743
2744 if (mips_fpu_string == NULL || *mips_fpu_string == '\0')
2745 mips_fpu = MIPS_FPU_DOUBLE;
2746 else if (strcasecmp (mips_fpu_string, "double") == 0
2747 || strcasecmp (mips_fpu_string, "on") == 0
2748 || strcasecmp (mips_fpu_string, "1") == 0
2749 || strcasecmp (mips_fpu_string, "yes") == 0)
2750 mips_fpu = MIPS_FPU_DOUBLE;
2751 else if (strcasecmp (mips_fpu_string, "none") == 0
2752 || strcasecmp (mips_fpu_string, "off") == 0
2753 || strcasecmp (mips_fpu_string, "0") == 0
2754 || strcasecmp (mips_fpu_string, "no") == 0)
2755 mips_fpu = MIPS_FPU_NONE;
2756 else if (strcasecmp (mips_fpu_string, "single") == 0)
2757 mips_fpu = MIPS_FPU_SINGLE;
2758 else
2759 err = strsave (mips_fpu_string);
2760
2761 if (mips_fpu_string != NULL)
2762 free (mips_fpu_string);
2763
2764 switch (mips_fpu)
2765 {
2766 case MIPS_FPU_DOUBLE:
2767 mips_fpu_string = strsave ("double");
2768 break;
2769 case MIPS_FPU_SINGLE:
2770 mips_fpu_string = strsave ("single");
2771 break;
2772 case MIPS_FPU_NONE:
2773 mips_fpu_string = strsave ("none");
2774 break;
2775 }
2776
2777 if (err != NULL)
2778 {
2779 struct cleanup *cleanups = make_cleanup (free, err);
2780 error ("Unknown FPU type `%s'. Use `double', `none', or `single'.",
2781 err);
2782 do_cleanups (cleanups);
2783 }
2784}
2785
2786static void
2787mips_show_fpu_command (args, from_tty, c)
2788 char *args;
2789 int from_tty;
2790 struct cmd_list_element *c;
2791{
2792}
2793
9f9f94aa
SS
2794/* Command to set the processor type. */
2795
2796void
2797mips_set_processor_type_command (args, from_tty)
2798 char *args;
2799 int from_tty;
2800{
2801 int i;
2802
2803 if (tmp_mips_processor_type == NULL || *tmp_mips_processor_type == '\0')
2804 {
2805 printf_unfiltered ("The known MIPS processor types are as follows:\n\n");
2806 for (i = 0; mips_processor_type_table[i].name != NULL; ++i)
2807 printf_unfiltered ("%s\n", mips_processor_type_table[i].name);
2808
2809 /* Restore the value. */
2810 tmp_mips_processor_type = strsave (mips_processor_type);
2811
2812 return;
2813 }
2814
2815 if (!mips_set_processor_type (tmp_mips_processor_type))
2816 {
2817 error ("Unknown processor type `%s'.", tmp_mips_processor_type);
2818 /* Restore its value. */
2819 tmp_mips_processor_type = strsave (mips_processor_type);
2820 }
2821}
2822
2823static void
2824mips_show_processor_type_command (args, from_tty)
2825 char *args;
2826 int from_tty;
2827{
2828}
2829
2830/* Modify the actual processor type. */
2831
2832int
2833mips_set_processor_type (str)
2834 char *str;
2835{
2836 int i, j;
2837
2838 if (str == NULL)
1d9489c1 2839 return 0;
9f9f94aa
SS
2840
2841 for (i = 0; mips_processor_type_table[i].name != NULL; ++i)
2842 {
2843 if (strcasecmp (str, mips_processor_type_table[i].name) == 0)
2844 {
2845 mips_processor_type = str;
2846
2847 for (j = 0; j < NUM_REGS; ++j)
9ddf9aa9
AC
2848 /* FIXME - MIPS should be defining REGISTER_NAME() instead */
2849 gdb_register_names[j] = mips_processor_type_table[i].regnames[j];
9f9f94aa
SS
2850
2851 return 1;
2852
2853 /* FIXME tweak fpu flag too */
2854 }
2855 }
2856
2857 return 0;
2858}
2859
2860/* Attempt to identify the particular processor model by reading the
2861 processor id. */
2862
2863char *
2864mips_read_processor_type ()
2865{
28444bf3 2866 CORE_ADDR prid;
9f9f94aa
SS
2867
2868 prid = read_register (PRID_REGNUM);
2869
80e0e92a 2870 if ((prid & ~0xf) == 0x700)
9f9f94aa
SS
2871 return savestring ("r3041", strlen("r3041"));
2872
2873 return NULL;
2874}
427fec5d
JK
2875
2876/* Just like reinit_frame_cache, but with the right arguments to be
2877 callable as an sfunc. */
9f9f94aa 2878
427fec5d
JK
2879static void
2880reinit_frame_cache_sfunc (args, from_tty, c)
2881 char *args;
2882 int from_tty;
2883 struct cmd_list_element *c;
2884{
2885 reinit_frame_cache ();
2886}
c2a0f1cb 2887
912e805f 2888int
18b46e7c
SS
2889gdb_print_insn_mips (memaddr, info)
2890 bfd_vma memaddr;
2891 disassemble_info *info;
2892{
f9f8c14b
MA
2893 mips_extra_func_info_t proc_desc;
2894
2895 /* Search for the function containing this address. Set the low bit
2896 of the address when searching, in case we were given an even address
2897 that is the start of a 16-bit function. If we didn't do this,
2898 the search would fail because the symbol table says the function
2899 starts at an odd address, i.e. 1 byte past the given address. */
c1fc0935
MA
2900 memaddr = ADDR_BITS_REMOVE (memaddr);
2901 proc_desc = non_heuristic_proc_desc (MAKE_MIPS16_ADDR (memaddr), NULL);
f9f8c14b
MA
2902
2903 /* Make an attempt to determine if this is a 16-bit function. If
2904 the procedure descriptor exists and the address therein is odd,
2905 it's definitely a 16-bit function. Otherwise, we have to just
2906 guess that if the address passed in is odd, it's 16-bits. */
2907 if (proc_desc)
88ff9e06 2908 info->mach = pc_is_mips16 (PROC_LOW_ADDR (proc_desc)) ? 16 : TM_PRINT_INSN_MACH;
f9f8c14b 2909 else
88ff9e06 2910 info->mach = pc_is_mips16 (memaddr) ? 16 : TM_PRINT_INSN_MACH;
f9f8c14b 2911
c1fc0935 2912 /* Round down the instruction address to the appropriate boundary. */
f9f8c14b
MA
2913 memaddr &= (info->mach == 16 ? ~1 : ~3);
2914
2915 /* Call the appropriate disassembler based on the target endian-ness. */
18b46e7c
SS
2916 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2917 return print_insn_big_mips (memaddr, info);
2918 else
2919 return print_insn_little_mips (memaddr, info);
2920}
2921
9ddf9aa9
AC
2922/* Old-style breakpoint macros.
2923 The IDT board uses an unusual breakpoint value, and sometimes gets
2924 confused when it sees the usual MIPS breakpoint instruction. */
2925
2926#define BIG_BREAKPOINT {0, 0x5, 0, 0xd}
2927#define LITTLE_BREAKPOINT {0xd, 0, 0x5, 0}
2928#define PMON_BIG_BREAKPOINT {0, 0, 0, 0xd}
2929#define PMON_LITTLE_BREAKPOINT {0xd, 0, 0, 0}
2930#define IDT_BIG_BREAKPOINT {0, 0, 0x0a, 0xd}
2931#define IDT_LITTLE_BREAKPOINT {0xd, 0x0a, 0, 0}
2932#define MIPS16_BIG_BREAKPOINT {0xe8, 0xa5}
2933#define MIPS16_LITTLE_BREAKPOINT {0xa5, 0xe8}
2934
f9f8c14b
MA
2935/* This function implements the BREAKPOINT_FROM_PC macro. It uses the program
2936 counter value to determine whether a 16- or 32-bit breakpoint should be
2937 used. It returns a pointer to a string of bytes that encode a breakpoint
2938 instruction, stores the length of the string to *lenptr, and adjusts pc
2939 (if necessary) to point to the actual memory location where the
2940 breakpoint should be inserted. */
2941
2942unsigned char *mips_breakpoint_from_pc (pcptr, lenptr)
2943 CORE_ADDR *pcptr;
2944 int *lenptr;
2945{
2946 if (TARGET_BYTE_ORDER == BIG_ENDIAN)
2947 {
899c4021 2948 if (pc_is_mips16 (*pcptr))
f9f8c14b
MA
2949 {
2950 static char mips16_big_breakpoint[] = MIPS16_BIG_BREAKPOINT;
c1fc0935 2951 *pcptr = UNMAKE_MIPS16_ADDR (*pcptr);
f9f8c14b
MA
2952 *lenptr = sizeof(mips16_big_breakpoint);
2953 return mips16_big_breakpoint;
2954 }
2955 else
2956 {
2957 static char big_breakpoint[] = BIG_BREAKPOINT;
f781fe93
MA
2958 static char pmon_big_breakpoint[] = PMON_BIG_BREAKPOINT;
2959 static char idt_big_breakpoint[] = IDT_BIG_BREAKPOINT;
2960
f9f8c14b 2961 *lenptr = sizeof(big_breakpoint);
f781fe93
MA
2962
2963 if (strcmp (target_shortname, "mips") == 0)
2964 return idt_big_breakpoint;
2965 else if (strcmp (target_shortname, "ddb") == 0
2966 || strcmp (target_shortname, "pmon") == 0
2967 || strcmp (target_shortname, "lsi") == 0)
2968 return pmon_big_breakpoint;
2969 else
2970 return big_breakpoint;
f9f8c14b
MA
2971 }
2972 }
2973 else
2974 {
899c4021 2975 if (pc_is_mips16 (*pcptr))
f9f8c14b
MA
2976 {
2977 static char mips16_little_breakpoint[] = MIPS16_LITTLE_BREAKPOINT;
c1fc0935 2978 *pcptr = UNMAKE_MIPS16_ADDR (*pcptr);
f9f8c14b
MA
2979 *lenptr = sizeof(mips16_little_breakpoint);
2980 return mips16_little_breakpoint;
2981 }
2982 else
2983 {
2984 static char little_breakpoint[] = LITTLE_BREAKPOINT;
f781fe93
MA
2985 static char pmon_little_breakpoint[] = PMON_LITTLE_BREAKPOINT;
2986 static char idt_little_breakpoint[] = IDT_LITTLE_BREAKPOINT;
2987
f9f8c14b 2988 *lenptr = sizeof(little_breakpoint);
f781fe93
MA
2989
2990 if (strcmp (target_shortname, "mips") == 0)
2991 return idt_little_breakpoint;
2992 else if (strcmp (target_shortname, "ddb") == 0
2993 || strcmp (target_shortname, "pmon") == 0
2994 || strcmp (target_shortname, "lsi") == 0)
2995 return pmon_little_breakpoint;
2996 else
2997 return little_breakpoint;
f9f8c14b
MA
2998 }
2999 }
3000}
3001
f781fe93
MA
3002/* If PC is in a mips16 call or return stub, return the address of the target
3003 PC, which is either the callee or the caller. There are several
3004 cases which must be handled:
3005
3006 * If the PC is in __mips16_ret_{d,s}f, this is a return stub and the
3007 target PC is in $31 ($ra).
3008 * If the PC is in __mips16_call_stub_{1..10}, this is a call stub
3009 and the target PC is in $2.
3010 * If the PC at the start of __mips16_call_stub_{s,d}f_{0..10}, i.e.
3011 before the jal instruction, this is effectively a call stub
3012 and the the target PC is in $2. Otherwise this is effectively
3013 a return stub and the target PC is in $18.
3014
3015 See the source code for the stubs in gcc/config/mips/mips16.S for
3016 gory details.
3017
3018 This function implements the SKIP_TRAMPOLINE_CODE macro.
3019*/
3020
3021CORE_ADDR
3022mips_skip_stub (pc)
3023 CORE_ADDR pc;
3024{
3025 char *name;
3026 CORE_ADDR start_addr;
3027
3028 /* Find the starting address and name of the function containing the PC. */
3029 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
3030 return 0;
3031
3032 /* If the PC is in __mips16_ret_{d,s}f, this is a return stub and the
3033 target PC is in $31 ($ra). */
3034 if (strcmp (name, "__mips16_ret_sf") == 0
3035 || strcmp (name, "__mips16_ret_df") == 0)
3036 return read_register (RA_REGNUM);
3037
3038 if (strncmp (name, "__mips16_call_stub_", 19) == 0)
3039 {
3040 /* If the PC is in __mips16_call_stub_{1..10}, this is a call stub
3041 and the target PC is in $2. */
3042 if (name[19] >= '0' && name[19] <= '9')
3043 return read_register (2);
3044
3045 /* If the PC at the start of __mips16_call_stub_{s,d}f_{0..10}, i.e.
3046 before the jal instruction, this is effectively a call stub
3047 and the the target PC is in $2. Otherwise this is effectively
3048 a return stub and the target PC is in $18. */
3049 else if (name[19] == 's' || name[19] == 'd')
3050 {
3051 if (pc == start_addr)
3052 {
3053 /* Check if the target of the stub is a compiler-generated
3054 stub. Such a stub for a function bar might have a name
3055 like __fn_stub_bar, and might look like this:
3056 mfc1 $4,$f13
3057 mfc1 $5,$f12
3058 mfc1 $6,$f15
3059 mfc1 $7,$f14
3060 la $1,bar (becomes a lui/addiu pair)
3061 jr $1
3062 So scan down to the lui/addi and extract the target
3063 address from those two instructions. */
3064
3065 CORE_ADDR target_pc = read_register (2);
3066 t_inst inst;
3067 int i;
3068
3069 /* See if the name of the target function is __fn_stub_*. */
3070 if (find_pc_partial_function (target_pc, &name, NULL, NULL) == 0)
3071 return target_pc;
3072 if (strncmp (name, "__fn_stub_", 10) != 0
3073 && strcmp (name, "etext") != 0
3074 && strcmp (name, "_etext") != 0)
3075 return target_pc;
3076
3077 /* Scan through this _fn_stub_ code for the lui/addiu pair.
3078 The limit on the search is arbitrarily set to 20
3079 instructions. FIXME. */
3080 for (i = 0, pc = 0; i < 20; i++, target_pc += MIPS_INSTLEN)
3081 {
3082 inst = mips_fetch_instruction (target_pc);
3083 if ((inst & 0xffff0000) == 0x3c010000) /* lui $at */
3084 pc = (inst << 16) & 0xffff0000; /* high word */
3085 else if ((inst & 0xffff0000) == 0x24210000) /* addiu $at */
3086 return pc | (inst & 0xffff); /* low word */
3087 }
3088
3089 /* Couldn't find the lui/addui pair, so return stub address. */
3090 return target_pc;
3091 }
3092 else
3093 /* This is the 'return' part of a call stub. The return
3094 address is in $r18. */
3095 return read_register (18);
3096 }
3097 }
3098 return 0; /* not a stub */
3099}
3100
3101
3102/* Return non-zero if the PC is inside a call thunk (aka stub or trampoline).
3103 This implements the IN_SOLIB_CALL_TRAMPOLINE macro. */
3104
3105int
3106mips_in_call_stub (pc, name)
3107 CORE_ADDR pc;
3108 char *name;
3109{
3110 CORE_ADDR start_addr;
3111
3112 /* Find the starting address of the function containing the PC. If the
3113 caller didn't give us a name, look it up at the same time. */
3114 if (find_pc_partial_function (pc, name ? NULL : &name, &start_addr, NULL) == 0)
3115 return 0;
3116
3117 if (strncmp (name, "__mips16_call_stub_", 19) == 0)
3118 {
3119 /* If the PC is in __mips16_call_stub_{1..10}, this is a call stub. */
3120 if (name[19] >= '0' && name[19] <= '9')
3121 return 1;
3122 /* If the PC at the start of __mips16_call_stub_{s,d}f_{0..10}, i.e.
3123 before the jal instruction, this is effectively a call stub. */
3124 else if (name[19] == 's' || name[19] == 'd')
3125 return pc == start_addr;
3126 }
3127
3128 return 0; /* not a stub */
3129}
3130
3131
3132/* Return non-zero if the PC is inside a return thunk (aka stub or trampoline).
3133 This implements the IN_SOLIB_RETURN_TRAMPOLINE macro. */
3134
3135int
3136mips_in_return_stub (pc, name)
3137 CORE_ADDR pc;
3138 char *name;
3139{
3140 CORE_ADDR start_addr;
3141
3142 /* Find the starting address of the function containing the PC. */
3143 if (find_pc_partial_function (pc, NULL, &start_addr, NULL) == 0)
3144 return 0;
3145
3146 /* If the PC is in __mips16_ret_{d,s}f, this is a return stub. */
3147 if (strcmp (name, "__mips16_ret_sf") == 0
3148 || strcmp (name, "__mips16_ret_df") == 0)
3149 return 1;
3150
3151 /* If the PC is in __mips16_call_stub_{s,d}f_{0..10} but not at the start,
3152 i.e. after the jal instruction, this is effectively a return stub. */
3153 if (strncmp (name, "__mips16_call_stub_", 19) == 0
3154 && (name[19] == 's' || name[19] == 'd')
3155 && pc != start_addr)
3156 return 1;
3157
3158 return 0; /* not a stub */
3159}
3160
3161
3162/* Return non-zero if the PC is in a library helper function that should
3163 be ignored. This implements the IGNORE_HELPER_CALL macro. */
3164
3165int
3166mips_ignore_helper (pc)
3167 CORE_ADDR pc;
3168{
3169 char *name;
3170
3171 /* Find the starting address and name of the function containing the PC. */
3172 if (find_pc_partial_function (pc, &name, NULL, NULL) == 0)
3173 return 0;
3174
3175 /* If the PC is in __mips16_ret_{d,s}f, this is a library helper function
3176 that we want to ignore. */
3177 return (strcmp (name, "__mips16_ret_sf") == 0
3178 || strcmp (name, "__mips16_ret_df") == 0);
3179}
3180
3181
98760eab
AC
3182/* Return a location where we can set a breakpoint that will be hit
3183 when an inferior function call returns. This is normally the
3184 program's entry point. Executables that don't have an entry
3185 point (e.g. programs in ROM) should define a symbol __CALL_DUMMY_ADDRESS
3186 whose address is the location where the breakpoint should be placed. */
3187
3188CORE_ADDR
3189mips_call_dummy_address ()
3190{
3191 struct minimal_symbol *sym;
3192
3193 sym = lookup_minimal_symbol ("__CALL_DUMMY_ADDRESS", NULL, NULL);
3194 if (sym)
3195 return SYMBOL_VALUE_ADDRESS (sym);
3196 else
3197 return entry_point_address ();
3198}
3199
c2a0f1cb
ILT
3200void
3201_initialize_mips_tdep ()
3202{
427fec5d
JK
3203 struct cmd_list_element *c;
3204
912e805f
AC
3205 if (!tm_print_insn) /* Someone may have already set it */
3206 tm_print_insn = gdb_print_insn_mips;
18b46e7c 3207
427fec5d
JK
3208 /* Let the user turn off floating point and set the fence post for
3209 heuristic_proc_start. */
3210
e4dbd248
PS
3211 c = add_set_cmd ("mipsfpu", class_support, var_string_noescape,
3212 (char *) &mips_fpu_string,
3213 "Set use of floating point coprocessor.\n\
3214Set to `none' to avoid using floating point instructions when calling\n\
3215functions or dealing with return values. Set to `single' to use only\n\
3216single precision floating point as on the R4650. Set to `double' for\n\
3217normal floating point support.",
3218 &setlist);
3219 c->function.sfunc = mips_set_fpu_command;
3220 c = add_show_from_set (c, &showlist);
3221 c->function.sfunc = mips_show_fpu_command;
3222
91ee2779 3223#ifndef MIPS_DEFAULT_FPU_TYPE
e4dbd248
PS
3224 mips_fpu = MIPS_FPU_DOUBLE;
3225 mips_fpu_string = strsave ("double");
91ee2779
JL
3226#else
3227 mips_fpu = MIPS_DEFAULT_FPU_TYPE;
3228 switch (mips_fpu)
3229 {
3230 case MIPS_FPU_DOUBLE: mips_fpu_string = strsave ("double"); break;
3231 case MIPS_FPU_SINGLE: mips_fpu_string = strsave ("single"); break;
3232 case MIPS_FPU_NONE: mips_fpu_string = strsave ("none"); break;
3233 }
3234#endif
3127785a 3235
9f9f94aa
SS
3236 c = add_set_cmd ("processor", class_support, var_string_noescape,
3237 (char *) &tmp_mips_processor_type,
3238 "Set the type of MIPS processor in use.\n\
3239Set this to be able to access processor-type-specific registers.\n\
3240",
3241 &setlist);
3242 c->function.cfunc = mips_set_processor_type_command;
3243 c = add_show_from_set (c, &showlist);
3244 c->function.cfunc = mips_show_processor_type_command;
3245
3246 tmp_mips_processor_type = strsave (DEFAULT_MIPS_TYPE);
3247 mips_set_processor_type_command (strsave (DEFAULT_MIPS_TYPE), 0);
3248
bdef72d2
JK
3249 /* We really would like to have both "0" and "unlimited" work, but
3250 command.c doesn't deal with that. So make it a var_zinteger
3251 because the user can always use "999999" or some such for unlimited. */
3252 c = add_set_cmd ("heuristic-fence-post", class_support, var_zinteger,
427fec5d
JK
3253 (char *) &heuristic_fence_post,
3254 "\
23d35572
JK
3255Set the distance searched for the start of a function.\n\
3256If you are debugging a stripped executable, GDB needs to search through the\n\
3257program for the start of a function. This command sets the distance of the\n\
3258search. The only need to set it is when debugging a stripped executable.",
427fec5d
JK
3259 &setlist);
3260 /* We need to throw away the frame cache when we set this, since it
3261 might change our ability to get backtraces. */
3262 c->function.sfunc = reinit_frame_cache_sfunc;
3263 add_show_from_set (c, &showlist);
98760eab
AC
3264
3265 /* Allow the user to control whether the upper bits of 64-bit
3266 addresses should be zeroed. */
3267 add_show_from_set
3268 (add_set_cmd ("mask-address", no_class, var_boolean, (char *)&mask_address_p,
3269 "Set zeroing of upper 32 bits of 64-bit addresses.\n\
3270Use \"on\" to enable the masking, and \"off\" to disable it.\n\
3271Without an argument, zeroing of upper address bits is enabled.", &setlist),
3272 &showlist);
c2a0f1cb 3273}
This page took 0.502388 seconds and 4 git commands to generate.