1 /* Target-dependent code for the MIPS architecture, for GDB, the GNU Debugger.
2 Copyright 1988, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU
4 and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
33 #include "opcode/mips.h"
35 #define VM_MIN_ADDRESS (unsigned)0x400000
37 static int mips_in_lenient_prologue PARAMS ((CORE_ADDR, CORE_ADDR));
39 /* Some MIPS boards don't support floating point, so we permit the
40 user to turn it off. */
43 /* Heuristic_proc_start may hunt through the text section for a long
44 time across a 2400 baud serial line. Allows the user to limit this
46 static unsigned int heuristic_fence_post = 0;
48 #define PROC_LOW_ADDR(proc) ((proc)->pdr.adr) /* least address */
49 #define PROC_HIGH_ADDR(proc) ((proc)->pdr.iline) /* upper address bound */
50 #define PROC_FRAME_OFFSET(proc) ((proc)->pdr.frameoffset)
51 #define PROC_FRAME_REG(proc) ((proc)->pdr.framereg)
52 #define PROC_REG_MASK(proc) ((proc)->pdr.regmask)
53 #define PROC_FREG_MASK(proc) ((proc)->pdr.fregmask)
54 #define PROC_REG_OFFSET(proc) ((proc)->pdr.regoffset)
55 #define PROC_FREG_OFFSET(proc) ((proc)->pdr.fregoffset)
56 #define PROC_PC_REG(proc) ((proc)->pdr.pcreg)
57 #define PROC_SYMBOL(proc) (*(struct symbol**)&(proc)->pdr.isym)
58 #define _PROC_MAGIC_ 0x0F0F0F0F
59 #define PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym == _PROC_MAGIC_)
60 #define SET_PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym = _PROC_MAGIC_)
62 struct linked_proc_info
64 struct mips_extra_func_info info;
65 struct linked_proc_info *next;
66 } *linked_proc_desc_table = NULL;
69 #define READ_FRAME_REG(fi, regno) read_next_frame_reg((fi)->next, regno)
72 read_next_frame_reg(fi, regno)
76 /* If it is the frame for sigtramp we have a complete sigcontext
77 immediately below the frame and we get the saved registers from there.
78 If the stack layout for sigtramp changes we might have to change these
79 constants and the companion fixup_sigtramp in mipsread.c */
81 #define SIGFRAME_BASE 0x12c /* sizeof(sigcontext) */
82 #define SIGFRAME_PC_OFF (-SIGFRAME_BASE + 2 * 4)
83 #define SIGFRAME_REGSAVE_OFF (-SIGFRAME_BASE + 3 * 4)
85 for (; fi; fi = fi->next)
86 if (in_sigtramp(fi->pc, 0)) {
88 if (regno == PC_REGNUM) offset = SIGFRAME_PC_OFF;
89 else if (regno < 32) offset = SIGFRAME_REGSAVE_OFF + regno * 4;
91 return read_memory_integer(fi->frame + offset, 4);
93 else if (regno == SP_REGNUM) return fi->frame;
94 else if (fi->saved_regs->regs[regno])
95 return read_memory_integer(fi->saved_regs->regs[regno], 4);
96 return read_register(regno);
100 mips_frame_saved_pc(frame)
103 mips_extra_func_info_t proc_desc = frame->proc_desc;
104 int pcreg = proc_desc ? PROC_PC_REG(proc_desc) : RA_REGNUM;
106 if (proc_desc && PROC_DESC_IS_DUMMY(proc_desc))
107 return read_memory_integer(frame->frame - 4, 4);
109 return read_next_frame_reg(frame, pcreg);
112 static struct mips_extra_func_info temp_proc_desc;
113 static struct frame_saved_regs temp_saved_regs;
115 /* This fencepost looks highly suspicious to me. Removing it also
116 seems suspicious as it could affect remote debugging across serial
120 heuristic_proc_start(pc)
123 CORE_ADDR start_pc = pc;
124 CORE_ADDR fence = start_pc - heuristic_fence_post;
126 if (start_pc == 0) return 0;
128 if (heuristic_fence_post == UINT_MAX
129 || fence < VM_MIN_ADDRESS)
130 fence = VM_MIN_ADDRESS;
132 /* search back for previous return */
133 for (start_pc -= 4; ; start_pc -= 4)
134 if (start_pc < fence)
136 /* It's not clear to me why we reach this point when
137 stop_soon_quietly, but with this test, at least we
138 don't print out warnings for every child forked (eg, on
139 decstation). 22apr93 rich@cygnus.com. */
140 if (!stop_soon_quietly)
142 if (fence == VM_MIN_ADDRESS)
143 warning("Hit beginning of text section without finding");
145 warning("Hit heuristic-fence-post without finding");
147 warning("enclosing function for pc 0x%x", pc);
152 else if (ABOUT_TO_RETURN(start_pc))
155 start_pc += 8; /* skip return, and its delay slot */
157 /* skip nops (usually 1) 0 - is this */
158 while (start_pc < pc && read_memory_integer (start_pc, 4) == 0)
164 static mips_extra_func_info_t
165 heuristic_proc_desc(start_pc, limit_pc, next_frame)
166 CORE_ADDR start_pc, limit_pc;
169 CORE_ADDR sp = next_frame ? next_frame->frame : read_register (SP_REGNUM);
172 int has_frame_reg = 0;
173 int reg30; /* Value of $r30. Used by gcc for frame-pointer */
174 unsigned long reg_mask = 0;
176 if (start_pc == 0) return NULL;
177 bzero(&temp_proc_desc, sizeof(temp_proc_desc));
178 bzero(&temp_saved_regs, sizeof(struct frame_saved_regs));
179 PROC_LOW_ADDR(&temp_proc_desc) = start_pc;
181 if (start_pc + 200 < limit_pc) limit_pc = start_pc + 200;
184 for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4) {
189 status = read_memory_nobpt (cur_pc, buf, 4);
190 if (status) memory_error (status, cur_pc);
191 word = extract_unsigned_integer (buf, 4);
193 if ((word & 0xFFFF0000) == 0x27bd0000) /* addiu $sp,$sp,-i */
194 frame_size += (-word) & 0xFFFF;
195 else if ((word & 0xFFFF0000) == 0x23bd0000) /* addu $sp,$sp,-i */
196 frame_size += (-word) & 0xFFFF;
197 else if ((word & 0xFFE00000) == 0xafa00000) { /* sw reg,offset($sp) */
198 int reg = (word & 0x001F0000) >> 16;
199 reg_mask |= 1 << reg;
200 temp_saved_regs.regs[reg] = sp + (short)word;
202 else if ((word & 0xFFFF0000) == 0x27be0000) { /* addiu $30,$sp,size */
203 if ((unsigned short)word != frame_size)
204 reg30 = sp + (unsigned short)word;
205 else if (!has_frame_reg) {
208 reg30 = read_next_frame_reg(next_frame, 30);
209 alloca_adjust = reg30 - (sp + (unsigned short)word);
210 if (alloca_adjust > 0) {
211 /* FP > SP + frame_size. This may be because
212 /* of an alloca or somethings similar.
213 * Fix sp to "pre-alloca" value, and try again.
220 else if ((word & 0xFFE00000) == 0xafc00000) { /* sw reg,offset($30) */
221 int reg = (word & 0x001F0000) >> 16;
222 reg_mask |= 1 << reg;
223 temp_saved_regs.regs[reg] = reg30 + (short)word;
227 PROC_FRAME_REG(&temp_proc_desc) = 30;
228 PROC_FRAME_OFFSET(&temp_proc_desc) = 0;
231 PROC_FRAME_REG(&temp_proc_desc) = SP_REGNUM;
232 PROC_FRAME_OFFSET(&temp_proc_desc) = frame_size;
234 PROC_REG_MASK(&temp_proc_desc) = reg_mask;
235 PROC_PC_REG(&temp_proc_desc) = RA_REGNUM;
236 return &temp_proc_desc;
239 static mips_extra_func_info_t
240 find_proc_desc(pc, next_frame)
244 mips_extra_func_info_t proc_desc;
245 struct block *b = block_for_pc(pc);
247 b ? lookup_symbol(MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 0, NULL) : NULL;
251 /* IF this is the topmost frame AND
252 * (this proc does not have debugging information OR
253 * the PC is in the procedure prologue)
254 * THEN create a "heuristic" proc_desc (by analyzing
255 * the actual code) to replace the "official" proc_desc.
257 proc_desc = (mips_extra_func_info_t)SYMBOL_VALUE(sym);
258 if (next_frame == NULL) {
259 struct symtab_and_line val;
260 struct symbol *proc_symbol =
261 PROC_DESC_IS_DUMMY(proc_desc) ? 0 : PROC_SYMBOL(proc_desc);
264 val = find_pc_line (BLOCK_START
265 (SYMBOL_BLOCK_VALUE(proc_symbol)),
267 val.pc = val.end ? val.end : pc;
269 if (!proc_symbol || pc < val.pc) {
270 mips_extra_func_info_t found_heuristic =
271 heuristic_proc_desc(PROC_LOW_ADDR(proc_desc),
273 if (found_heuristic) proc_desc = found_heuristic;
279 /* Is linked_proc_desc_table really necessary? It only seems to be used
280 by procedure call dummys. However, the procedures being called ought
281 to have their own proc_descs, and even if they don't,
282 heuristic_proc_desc knows how to create them! */
284 register struct linked_proc_info *link;
285 for (link = linked_proc_desc_table; link; link = link->next)
286 if (PROC_LOW_ADDR(&link->info) <= pc
287 && PROC_HIGH_ADDR(&link->info) > pc)
290 heuristic_proc_desc(heuristic_proc_start(pc), pc, next_frame);
295 mips_extra_func_info_t cached_proc_desc;
298 mips_frame_chain(frame)
301 mips_extra_func_info_t proc_desc;
302 CORE_ADDR saved_pc = FRAME_SAVED_PC(frame);
304 if (saved_pc == 0 || inside_entry_file (saved_pc))
307 proc_desc = find_proc_desc(saved_pc, frame);
311 cached_proc_desc = proc_desc;
312 return read_next_frame_reg(frame, PROC_FRAME_REG(proc_desc))
313 + PROC_FRAME_OFFSET(proc_desc);
317 init_extra_frame_info(fci)
318 struct frame_info *fci;
320 extern struct obstack frame_cache_obstack;
321 /* Use proc_desc calculated in frame_chain */
322 mips_extra_func_info_t proc_desc =
323 fci->next ? cached_proc_desc : find_proc_desc(fci->pc, fci->next);
325 fci->saved_regs = (struct frame_saved_regs*)
326 obstack_alloc (&frame_cache_obstack, sizeof(struct frame_saved_regs));
327 memset (fci->saved_regs, 0, sizeof (struct frame_saved_regs));
329 proc_desc == &temp_proc_desc ? 0 : proc_desc;
333 CORE_ADDR reg_position;
335 /* r0 bit means kernel trap */
336 int kernel_trap = PROC_REG_MASK(proc_desc) & 1;
338 /* Fixup frame-pointer - only needed for top frame */
339 /* This may not be quite right, if proc has a real frame register */
340 if (fci->pc == PROC_LOW_ADDR(proc_desc) && !PROC_DESC_IS_DUMMY(proc_desc))
341 fci->frame = read_register (SP_REGNUM);
343 fci->frame = READ_FRAME_REG(fci, PROC_FRAME_REG(proc_desc))
344 + PROC_FRAME_OFFSET(proc_desc);
346 /* If this is the innermost frame, and we are still in the
347 prologue (loosely defined), then the registers may not have
348 been saved yet. But they haven't been clobbered either, so
349 it's fine to say they have not been saved. */
350 if (fci->next == NULL
351 && mips_in_lenient_prologue (PROC_LOW_ADDR (proc_desc), fci->pc))
352 /* We already zeroed the saved regs. */
354 else if (proc_desc == &temp_proc_desc)
355 *fci->saved_regs = temp_saved_regs;
358 /* find which general-purpose registers were saved */
359 reg_position = fci->frame + PROC_REG_OFFSET(proc_desc);
360 mask = kernel_trap ? 0xFFFFFFFF : PROC_REG_MASK(proc_desc);
361 for (ireg= 31; mask; --ireg, mask <<= 1)
362 if (mask & 0x80000000)
364 fci->saved_regs->regs[ireg] = reg_position;
367 /* find which floating-point registers were saved */
368 reg_position = fci->frame + PROC_FREG_OFFSET(proc_desc);
370 /* The freg_offset points to where the first *double* register
371 is saved. So skip to the high-order word. */
373 mask = kernel_trap ? 0xFFFFFFFF : PROC_FREG_MASK(proc_desc);
374 for (ireg = 31; mask; --ireg, mask <<= 1)
375 if (mask & 0x80000000)
377 fci->saved_regs->regs[FP0_REGNUM+ireg] = reg_position;
382 /* hack: if argument regs are saved, guess these contain args */
383 if ((PROC_REG_MASK(proc_desc) & 0xF0) == 0) fci->num_args = -1;
384 else if ((PROC_REG_MASK(proc_desc) & 0x80) == 0) fci->num_args = 4;
385 else if ((PROC_REG_MASK(proc_desc) & 0x40) == 0) fci->num_args = 3;
386 else if ((PROC_REG_MASK(proc_desc) & 0x20) == 0) fci->num_args = 2;
387 else if ((PROC_REG_MASK(proc_desc) & 0x10) == 0) fci->num_args = 1;
389 fci->saved_regs->regs[PC_REGNUM] = fci->saved_regs->regs[RA_REGNUM];
393 /* MIPS stack frames are almost impenetrable. When execution stops,
394 we basically have to look at symbol information for the function
395 that we stopped in, which tells us *which* register (if any) is
396 the base of the frame pointer, and what offset from that register
397 the frame itself is at.
399 This presents a problem when trying to examine a stack in memory
400 (that isn't executing at the moment), using the "frame" command. We
401 don't have a PC, nor do we have any registers except SP.
403 This routine takes two arguments, SP and PC, and tries to make the
404 cached frames look as if these two arguments defined a frame on the
405 cache. This allows the rest of info frame to extract the important
406 arguments without difficulty. */
409 setup_arbitrary_frame (argc, argv)
414 error ("MIPS frame specifications require two arguments: sp and pc");
416 return create_new_frame (argv[0], argv[1]);
421 mips_push_arguments(nargs, args, sp, struct_return, struct_addr)
426 CORE_ADDR struct_addr;
430 int accumulate_size = struct_return ? 4 : 0;
431 struct mips_arg { char *contents; int len; int offset; };
432 struct mips_arg *mips_args =
433 (struct mips_arg*)alloca(nargs * sizeof(struct mips_arg));
434 register struct mips_arg *m_arg;
435 for (i = 0, m_arg = mips_args; i < nargs; i++, m_arg++) {
436 extern value value_arg_coerce();
437 value arg = value_arg_coerce (args[i]);
438 m_arg->len = TYPE_LENGTH (VALUE_TYPE (arg));
439 /* This entire mips-specific routine is because doubles must be aligned
440 * on 8-byte boundaries. It still isn't quite right, because MIPS decided
441 * to align 'struct {int a, b}' on 4-byte boundaries (even though this
442 * breaks their varargs implementation...). A correct solution
443 * requires an simulation of gcc's 'alignof' (and use of 'alignof'
444 * in stdarg.h/varargs.h).
446 if (m_arg->len > 4) accumulate_size = (accumulate_size + 7) & -8;
447 m_arg->offset = accumulate_size;
448 accumulate_size = (accumulate_size + m_arg->len + 3) & -4;
449 m_arg->contents = VALUE_CONTENTS(arg);
451 accumulate_size = (accumulate_size + 7) & (-8);
452 if (accumulate_size < 16) accumulate_size = 16;
453 sp -= accumulate_size;
454 for (i = nargs; m_arg--, --i >= 0; )
455 write_memory(sp + m_arg->offset, m_arg->contents, m_arg->len);
458 write_memory(sp, (char *)&buf, sizeof(CORE_ADDR));
463 /* MASK(i,j) == (1<<i) + (1<<(i+1)) + ... + (1<<j)). Assume i<=j<31. */
464 #define MASK(i,j) ((1 << (j)+1)-1 ^ (1 << (i))-1)
467 mips_push_dummy_frame()
470 struct linked_proc_info *link = (struct linked_proc_info*)
471 xmalloc(sizeof(struct linked_proc_info));
472 mips_extra_func_info_t proc_desc = &link->info;
473 CORE_ADDR sp = read_register (SP_REGNUM);
474 CORE_ADDR save_address;
475 REGISTER_TYPE buffer;
476 link->next = linked_proc_desc_table;
477 linked_proc_desc_table = link;
478 #define PUSH_FP_REGNUM 16 /* must be a register preserved across calls */
479 #define GEN_REG_SAVE_MASK MASK(1,16)|MASK(24,28)|(1<<31)
480 #define GEN_REG_SAVE_COUNT 22
481 #define FLOAT_REG_SAVE_MASK MASK(0,19)
482 #define FLOAT_REG_SAVE_COUNT 20
483 #define SPECIAL_REG_SAVE_COUNT 4
485 * The registers we must save are all those not preserved across
486 * procedure calls. Dest_Reg (see tm-mips.h) must also be saved.
487 * In addition, we must save the PC, and PUSH_FP_REGNUM.
488 * (Ideally, we should also save MDLO/-HI and FP Control/Status reg.)
490 * Dummy frame layout:
493 * Saved MMHI, MMLO, FPC_CSR
498 * Saved D18 (i.e. F19, F18)
500 * Saved D0 (i.e. F1, F0)
501 * CALL_DUMMY (subroutine stub; see tm-mips.h)
502 * Parameter build area (not yet implemented)
505 PROC_REG_MASK(proc_desc) = GEN_REG_SAVE_MASK;
506 PROC_FREG_MASK(proc_desc) = mips_fpu ? FLOAT_REG_SAVE_MASK : 0;
507 PROC_REG_OFFSET(proc_desc) = /* offset of (Saved R31) from FP */
508 -sizeof(long) - 4 * SPECIAL_REG_SAVE_COUNT;
509 PROC_FREG_OFFSET(proc_desc) = /* offset of (Saved D18) from FP */
510 -sizeof(double) - 4 * (SPECIAL_REG_SAVE_COUNT + GEN_REG_SAVE_COUNT);
511 /* save general registers */
512 save_address = sp + PROC_REG_OFFSET(proc_desc);
513 for (ireg = 32; --ireg >= 0; )
514 if (PROC_REG_MASK(proc_desc) & (1 << ireg))
516 buffer = read_register (ireg);
517 write_memory (save_address, (char *)&buffer, sizeof(REGISTER_TYPE));
520 /* save floating-points registers starting with high order word */
521 save_address = sp + PROC_FREG_OFFSET(proc_desc) + 4;
522 for (ireg = 32; --ireg >= 0; )
523 if (PROC_FREG_MASK(proc_desc) & (1 << ireg))
525 buffer = read_register (ireg + FP0_REGNUM);
526 write_memory (save_address, (char *)&buffer, 4);
529 write_register (PUSH_FP_REGNUM, sp);
530 PROC_FRAME_REG(proc_desc) = PUSH_FP_REGNUM;
531 PROC_FRAME_OFFSET(proc_desc) = 0;
532 buffer = read_register (PC_REGNUM);
533 write_memory (sp - 4, (char *)&buffer, sizeof(REGISTER_TYPE));
534 buffer = read_register (HI_REGNUM);
535 write_memory (sp - 8, (char *)&buffer, sizeof(REGISTER_TYPE));
536 buffer = read_register (LO_REGNUM);
537 write_memory (sp - 12, (char *)&buffer, sizeof(REGISTER_TYPE));
538 buffer = read_register (mips_fpu ? FCRCS_REGNUM : ZERO_REGNUM);
539 write_memory (sp - 16, (char *)&buffer, sizeof(REGISTER_TYPE));
540 sp -= 4 * (GEN_REG_SAVE_COUNT
541 + (mips_fpu ? FLOAT_REG_SAVE_COUNT : 0)
542 + SPECIAL_REG_SAVE_COUNT);
543 write_register (SP_REGNUM, sp);
544 PROC_LOW_ADDR(proc_desc) = sp - CALL_DUMMY_SIZE + CALL_DUMMY_START_OFFSET;
545 PROC_HIGH_ADDR(proc_desc) = sp;
546 SET_PROC_DESC_IS_DUMMY(proc_desc);
547 PROC_PC_REG(proc_desc) = RA_REGNUM;
554 FRAME frame = get_current_frame ();
555 CORE_ADDR new_sp = frame->frame;
557 mips_extra_func_info_t proc_desc = frame->proc_desc;
559 write_register (PC_REGNUM, FRAME_SAVED_PC(frame));
562 for (regnum = 32; --regnum >= 0; )
563 if (PROC_REG_MASK(proc_desc) & (1 << regnum))
564 write_register (regnum,
565 read_memory_integer (frame->saved_regs->regs[regnum],
567 for (regnum = 32; --regnum >= 0; )
568 if (PROC_FREG_MASK(proc_desc) & (1 << regnum))
569 write_register (regnum + FP0_REGNUM,
570 read_memory_integer (frame->saved_regs->regs[regnum + FP0_REGNUM], 4));
572 write_register (SP_REGNUM, new_sp);
573 flush_cached_frames ();
574 /* We let mips_init_extra_frame_info figure out the frame pointer */
575 set_current_frame (create_new_frame (0, read_pc ()));
577 if (PROC_DESC_IS_DUMMY(proc_desc))
579 struct linked_proc_info *pi_ptr, *prev_ptr;
581 for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL;
583 prev_ptr = pi_ptr, pi_ptr = pi_ptr->next)
585 if (&pi_ptr->info == proc_desc)
590 error ("Can't locate dummy extra frame info\n");
592 if (prev_ptr != NULL)
593 prev_ptr->next = pi_ptr->next;
595 linked_proc_desc_table = pi_ptr->next;
599 write_register (HI_REGNUM, read_memory_integer(new_sp - 8, 4));
600 write_register (LO_REGNUM, read_memory_integer(new_sp - 12, 4));
602 write_register (FCRCS_REGNUM, read_memory_integer(new_sp - 16, 4));
607 mips_print_register (regnum, all)
610 unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
613 /* Get the data in raw format. */
614 if (read_relative_register_raw_bytes (regnum, raw_buffer))
616 printf_filtered ("%s: [Invalid]", reg_names[regnum]);
620 /* If an even floating pointer register, also print as double. */
621 if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM+32
622 && !((regnum-FP0_REGNUM) & 1)) {
623 char dbuffer[MAX_REGISTER_RAW_SIZE];
625 read_relative_register_raw_bytes (regnum, dbuffer);
626 read_relative_register_raw_bytes (regnum+1, dbuffer+4);
627 #ifdef REGISTER_CONVERT_TO_TYPE
628 REGISTER_CONVERT_TO_TYPE(regnum, builtin_type_double, dbuffer);
630 printf_filtered ("(d%d: ", regnum-FP0_REGNUM);
631 val_print (builtin_type_double, dbuffer, 0,
632 stdout, 0, 1, 0, Val_pretty_default);
633 printf_filtered ("); ");
635 fputs_filtered (reg_names[regnum], stdout);
636 #ifndef NUMERIC_REG_NAMES
638 printf_filtered ("(r%d): ", regnum);
641 printf_filtered (": ");
643 /* If virtual format is floating, print it that way. */
644 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (regnum)) == TYPE_CODE_FLT
645 && ! INVALID_FLOAT (raw_buffer, REGISTER_VIRTUAL_SIZE(regnum))) {
646 val_print (REGISTER_VIRTUAL_TYPE (regnum), raw_buffer, 0,
647 stdout, 0, 1, 0, Val_pretty_default);
649 /* Else print as integer in hex. */
654 val = extract_signed_integer (raw_buffer,
655 REGISTER_RAW_SIZE (regnum));
658 printf_filtered ("0");
660 printf_filtered (local_hex_format(), val);
662 printf_filtered ("%s=%d", local_hex_string(val), val);
666 /* Replacement for generic do_registers_info. */
668 mips_do_registers_info (regnum, fpregs)
673 mips_print_register (regnum, 0);
674 printf_filtered ("\n");
677 for (regnum = 0; regnum < NUM_REGS; ) {
678 if ((!fpregs) && regnum >= FP0_REGNUM && regnum <= FCRIR_REGNUM) {
682 mips_print_register (regnum, 1);
684 if ((regnum & 3) == 0 || regnum == NUM_REGS)
685 printf_filtered (";\n");
687 printf_filtered ("; ");
691 /* Return number of args passed to a frame. described by FIP.
692 Can return -1, meaning no way to tell. */
695 mips_frame_num_args(fip)
699 struct chain_info_t *p;
701 p = mips_find_cached_frame(FRAME_FP(fip));
703 return p->the_info.numargs;
708 /* Does this instruction involve use of a delay slot? */
714 for (i = 0; i < NUMOPCODES; ++i)
715 if (mips_opcodes[i].pinfo != INSN_MACRO
716 && (insn & mips_opcodes[i].mask) == mips_opcodes[i].match)
718 return i < NUMOPCODES && (mips_opcodes[i].pinfo & ANY_DELAY);
721 /* To skip prologues, I use this predicate. Returns either PC itself
722 if the code at PC does not look like a function prologue; otherwise
723 returns an address that (if we're lucky) follows the prologue. If
724 LENIENT, then we must skip everything which is involved in setting
725 up the frame (it's OK to skip more, just so long as we don't skip
726 anything which might clobber the registers which are being saved.
727 We must skip more in the case where part of the prologue is in the
728 delay slot of a non-prologue instruction). */
731 mips_skip_prologue (pc, lenient)
739 int seen_sp_adjust = 0;
741 /* Skip the typical prologue instructions. These are the stack adjustment
742 instruction and the instructions that save registers on the stack
743 or in the gcc frame. */
744 for (offset = 0; offset < 100; offset += 4)
749 status = read_memory_nobpt (pc + offset, buf, 4);
751 memory_error (status, pc + offset);
752 inst = extract_unsigned_integer (buf, 4);
754 if (lenient && is_delayed (inst))
757 if ((inst & 0xffff0000) == 0x27bd0000) /* addiu $sp,$sp,offset */
759 else if ((inst & 0xFFE00000) == 0xAFA00000 && (inst & 0x001F0000))
760 continue; /* sw reg,n($sp) */
762 else if ((inst & 0xFFE00000) == 0xE7A00000) /* swc1 freg,n($sp) */
764 else if ((inst & 0xF3E00000) == 0xA3C00000 && (inst & 0x001F0000))
766 continue; /* reg != $zero */
767 else if (inst == 0x03A0F021) /* move $s8,$sp */
769 else if ((inst & 0xFF9F07FF) == 0x00800021) /* move reg,$a0-$a3 */
776 /* FIXME schauer. The following code seems no longer necessary if we
777 always skip the typical prologue instructions. */
783 /* Well, it looks like a frameless. Let's make sure.
784 Note that we are not called on the current PC,
785 but on the function`s start PC, and I have definitely
786 seen optimized code that adjusts the SP quite later */
787 b = block_for_pc(pc);
790 f = lookup_symbol(MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 0, NULL);
792 /* Ideally, I would like to use the adjusted info
793 from mips_frame_info(), but for all practical
794 purposes it will not matter (and it would require
795 a different definition of SKIP_PROLOGUE())
797 Actually, it would not hurt to skip the storing
798 of arguments on the stack as well. */
799 if (((mips_extra_func_info_t)SYMBOL_VALUE(f))->pdr.frameoffset)
806 /* Is address PC in the prologue (loosely defined) for function at
810 mips_in_lenient_prologue (startaddr, pc)
814 CORE_ADDR end_prologue = mips_skip_prologue (startaddr, 1);
815 return pc >= startaddr && pc < end_prologue;
818 /* Given a return value in `regbuf' with a type `valtype',
819 extract and copy its value into `valbuf'. */
821 mips_extract_return_value (valtype, regbuf, valbuf)
822 struct type *valtype;
823 char regbuf[REGISTER_BYTES];
828 regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
830 memcpy (valbuf, regbuf + REGISTER_BYTE (regnum), TYPE_LENGTH (valtype));
831 #ifdef REGISTER_CONVERT_TO_TYPE
832 REGISTER_CONVERT_TO_TYPE(regnum, valtype, valbuf);
836 /* Given a return value in `regbuf' with a type `valtype',
837 write it's value into the appropriate register. */
839 mips_store_return_value (valtype, valbuf)
840 struct type *valtype;
844 char raw_buffer[MAX_REGISTER_RAW_SIZE];
846 regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2;
847 memcpy(raw_buffer, valbuf, TYPE_LENGTH (valtype));
849 #ifdef REGISTER_CONVERT_FROM_TYPE
850 REGISTER_CONVERT_FROM_TYPE(regnum, valtype, raw_buffer);
853 write_register_bytes(REGISTER_BYTE (regnum), raw_buffer, TYPE_LENGTH (valtype));
856 /* Let the user turn off floating point and set the fence post for
857 heuristic_proc_start. */
860 _initialize_mips_tdep ()
863 (add_set_cmd ("mipsfpu", class_support, var_boolean,
865 "Set use of floating point coprocessor.\n\
866 Turn off to avoid using floating point instructions when calling functions\n\
867 or dealing with return values.", &setlist),
871 (add_set_cmd ("heuristic-fence-post", class_support, var_uinteger,
872 (char *) &heuristic_fence_post,
873 "Set the distance searched for the start of a function.\n\
874 Set number of bytes to be searched backward to find the beginning of a\n\
875 function without symbols.", &setlist),