1 /* Target-dependent code for the SPARC for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
28 #include "symfile.h" /* for objfiles.h */
29 #include "objfiles.h" /* for find_pc_section */
32 #include <sys/procfs.h>
38 extern int stop_after_trap
;
40 /* We don't store all registers immediately when requested, since they
41 get sent over in large chunks anyway. Instead, we accumulate most
42 of the changes and send them over once. "deferred_stores" keeps
43 track of which sets of registers we have locally-changed copies of,
44 so we only need send the groups that have changed. */
46 int deferred_stores
= 0; /* Cumulates stores we want to do eventually. */
50 Error
, not_branch
, bicc
, bicca
, ba
, baa
, ticc
, ta
53 /* Simulate single-step ptrace call for sun4. Code written by Gary
54 Beihl (beihl@mcc.com). */
56 /* npc4 and next_pc describe the situation at the time that the
57 step-breakpoint was set, not necessary the current value of NPC_REGNUM. */
58 static CORE_ADDR next_pc
, npc4
, target
;
59 static int brknpc4
, brktrg
;
60 typedef char binsn_quantum
[BREAKPOINT_MAX
];
61 static binsn_quantum break_mem
[3];
63 /* Non-zero if we just simulated a single-step ptrace call. This is
64 needed because we cannot remove the breakpoints in the inferior
65 process until after the `wait' in `wait_for_inferior'. Used for
70 /* single_step() is called just before we want to resume the inferior,
71 if we want to single-step it but there is no hardware or kernel single-step
72 support (as on all SPARCs). We find all the possible targets of the
73 coming instruction and breakpoint them.
75 single_step is also called just after the inferior stops. If we had
76 set up a simulated single-step, we undo our damage. */
80 int ignore
; /* pid, but we don't need it */
82 branch_type br
, isannulled();
88 /* Always set breakpoint for NPC. */
89 next_pc
= read_register (NPC_REGNUM
);
90 npc4
= next_pc
+ 4; /* branch not taken */
92 target_insert_breakpoint (next_pc
, break_mem
[0]);
93 /* printf_unfiltered ("set break at %x\n",next_pc); */
95 pc
= read_register (PC_REGNUM
);
96 pc_instruction
= read_memory_integer (pc
, sizeof(pc_instruction
));
97 br
= isannulled (pc_instruction
, pc
, &target
);
102 /* Conditional annulled branch will either end up at
103 npc (if taken) or at npc+4 (if not taken).
106 target_insert_breakpoint (npc4
, break_mem
[1]);
108 else if (br
== baa
&& target
!= next_pc
)
110 /* Unconditional annulled branch will always end up at
113 target_insert_breakpoint (target
, break_mem
[2]);
116 /* We are ready to let it go */
122 /* Remove breakpoints */
123 target_remove_breakpoint (next_pc
, break_mem
[0]);
126 target_remove_breakpoint (npc4
, break_mem
[1]);
129 target_remove_breakpoint (target
, break_mem
[2]);
136 sparc_frame_chain (thisframe
)
139 char buf
[MAX_REGISTER_RAW_SIZE
];
143 addr
= thisframe
->frame
+ FRAME_SAVED_I0
+
144 REGISTER_RAW_SIZE (FP_REGNUM
) * (FP_REGNUM
- I0_REGNUM
);
145 err
= target_read_memory (addr
, buf
, REGISTER_RAW_SIZE (FP_REGNUM
));
148 return extract_address (buf
, REGISTER_RAW_SIZE (FP_REGNUM
));
152 sparc_extract_struct_value_address (regbuf
)
153 char regbuf
[REGISTER_BYTES
];
155 return read_memory_integer (((int *)(regbuf
))[SP_REGNUM
]+(16*4),
156 TARGET_PTR_BIT
/ TARGET_CHAR_BIT
);
159 /* Find the pc saved in frame FRAME. */
162 sparc_frame_saved_pc (frame
)
165 char buf
[MAX_REGISTER_RAW_SIZE
];
168 if (frame
->signal_handler_caller
)
170 /* This is the signal trampoline frame.
171 Get the saved PC from the sigcontext structure. */
173 #ifndef SIGCONTEXT_PC_OFFSET
174 #define SIGCONTEXT_PC_OFFSET 12
177 CORE_ADDR sigcontext_addr
;
178 char scbuf
[TARGET_PTR_BIT
/ HOST_CHAR_BIT
];
179 int saved_pc_offset
= SIGCONTEXT_PC_OFFSET
;
182 /* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
183 as the third parameter. The offset to the saved pc is 12. */
184 find_pc_partial_function (frame
->pc
, &name
,
185 (CORE_ADDR
*)NULL
,(CORE_ADDR
*)NULL
);
186 if (name
&& STREQ (name
, "ucbsigvechandler"))
187 saved_pc_offset
= 12;
189 /* The sigcontext address is contained in register O2. */
190 get_saved_register (buf
, (int *)NULL
, (CORE_ADDR
*)NULL
,
191 frame
, O0_REGNUM
+ 2, (enum lval_type
*)NULL
);
192 sigcontext_addr
= extract_address (buf
, REGISTER_RAW_SIZE (O0_REGNUM
));
194 /* Don't cause a memory_error when accessing sigcontext in case the
195 stack layout has changed or the stack is corrupt. */
196 target_read_memory (sigcontext_addr
+ saved_pc_offset
,
197 scbuf
, sizeof (scbuf
));
198 return extract_address (scbuf
, sizeof (scbuf
));
200 addr
= (frame
->bottom
+ FRAME_SAVED_I0
+
201 REGISTER_RAW_SIZE (I7_REGNUM
) * (I7_REGNUM
- I0_REGNUM
));
202 read_memory (addr
, buf
, REGISTER_RAW_SIZE (I7_REGNUM
));
203 return PC_ADJUST (extract_address (buf
, REGISTER_RAW_SIZE (I7_REGNUM
)));
207 * Since an individual frame in the frame cache is defined by two
208 * arguments (a frame pointer and a stack pointer), we need two
209 * arguments to get info for an arbitrary stack frame. This routine
210 * takes two arguments and makes the cached frames look as if these
211 * two arguments defined a frame on the cache. This allows the rest
212 * of info frame to extract the important arguments without
216 setup_arbitrary_frame (argc
, argv
)
223 error ("Sparc frame specifications require two arguments: fp and sp");
225 fid
= create_new_frame (argv
[0], 0);
228 fatal ("internal: create_new_frame returned invalid frame id");
230 fid
->bottom
= argv
[1];
231 fid
->pc
= FRAME_SAVED_PC (fid
);
235 /* Given a pc value, skip it forward past the function prologue by
236 disassembling instructions that appear to be a prologue.
238 If FRAMELESS_P is set, we are only testing to see if the function
239 is frameless. This allows a quicker answer.
241 This routine should be more specific in its actions; making sure
242 that it uses the same register in the initial prologue section. */
244 skip_prologue (start_pc
, frameless_p
)
250 unsigned long int code
;
256 unsigned int imm22
:22;
265 unsigned int simm13
:13;
270 CORE_ADDR pc
= start_pc
;
272 x
.i
= read_memory_integer (pc
, 4);
274 /* Recognize the `sethi' insn and record its destination. */
275 if (x
.sethi
.op
== 0 && x
.sethi
.op2
== 4)
279 x
.i
= read_memory_integer (pc
, 4);
282 /* Recognize an add immediate value to register to either %g1 or
283 the destination register recorded above. Actually, this might
284 well recognize several different arithmetic operations.
285 It doesn't check that rs1 == rd because in theory "sub %g0, 5, %g1"
286 followed by "save %sp, %g1, %sp" is a valid prologue (Not that
287 I imagine any compiler really does that, however). */
288 if (x
.add
.op
== 2 && x
.add
.i
&& (x
.add
.rd
== 1 || x
.add
.rd
== dest
))
291 x
.i
= read_memory_integer (pc
, 4);
294 /* This recognizes any SAVE insn. But why do the XOR and then
295 the compare? That's identical to comparing against 60 (as long
296 as there isn't any sign extension). */
297 if (x
.add
.op
== 2 && (x
.add
.op3
^ 32) == 28)
300 if (frameless_p
) /* If the save is all we care about, */
301 return pc
; /* return before doing more work */
302 x
.i
= read_memory_integer (pc
, 4);
306 /* Without a save instruction, it's not a prologue. */
310 /* Now we need to recognize stores into the frame from the input
311 registers. This recognizes all non alternate stores of input
312 register, into a location offset from the frame pointer. */
314 && (x
.add
.op3
& 0x3c) == 4 /* Store, non-alternate. */
315 && (x
.add
.rd
& 0x18) == 0x18 /* Input register. */
316 && x
.add
.i
/* Immediate mode. */
317 && x
.add
.rs1
== 30 /* Off of frame pointer. */
318 /* Into reserved stack space. */
319 && x
.add
.simm13
>= 0x44
320 && x
.add
.simm13
< 0x5b)
323 x
.i
= read_memory_integer (pc
, 4);
328 /* Check instruction at ADDR to see if it is an annulled branch.
329 All other instructions will go to NPC or will trap.
330 Set *TARGET if we find a canidate branch; set to zero if not. */
333 isannulled (instruction
, addr
, target
)
335 CORE_ADDR addr
, *target
;
337 branch_type val
= not_branch
;
338 long int offset
; /* Must be signed for sign-extend. */
341 unsigned long int code
;
348 unsigned int disp22
:22;
353 insn
.code
= instruction
;
356 && (insn
.b
.op2
== 2 || insn
.b
.op2
== 6 || insn
.b
.op2
== 7))
358 if (insn
.b
.cond
== 8)
359 val
= insn
.b
.a
? baa
: ba
;
361 val
= insn
.b
.a
? bicca
: bicc
;
362 offset
= 4 * ((int) (insn
.b
.disp22
<< 10) >> 10);
363 *target
= addr
+ offset
;
369 /* sparc_frame_find_saved_regs ()
371 Stores, into a struct frame_saved_regs,
372 the addresses of the saved registers of frame described by FRAME_INFO.
373 This includes special registers such as pc and fp saved in special
374 ways in the stack frame. sp is even more special:
375 the address we return for it IS the sp for the next frame.
377 Note that on register window machines, we are currently making the
378 assumption that window registers are being saved somewhere in the
379 frame in which they are being used. If they are stored in an
380 inferior frame, find_saved_register will break.
382 On the Sun 4, the only time all registers are saved is when
383 a dummy frame is involved. Otherwise, the only saved registers
384 are the LOCAL and IN registers which are saved as a result
385 of the "save/restore" opcodes. This condition is determined
386 by address rather than by value.
388 The "pc" is not stored in a frame on the SPARC. (What is stored
389 is a return address minus 8.) sparc_pop_frame knows how to
390 deal with that. Other routines might or might not.
392 See tm-sparc.h (PUSH_FRAME and friends) for CRITICAL information
393 about how this works. */
396 sparc_frame_find_saved_regs (fi
, saved_regs_addr
)
397 struct frame_info
*fi
;
398 struct frame_saved_regs
*saved_regs_addr
;
401 FRAME_ADDR frame
= FRAME_FP(fi
);
402 FRAME fid
= FRAME_INFO_ID (fi
);
405 fatal ("Bad frame info struct in FRAME_FIND_SAVED_REGS");
407 memset (saved_regs_addr
, 0, sizeof (*saved_regs_addr
));
409 if (fi
->pc
>= (fi
->bottom
? fi
->bottom
:
410 read_register (SP_REGNUM
))
411 && fi
->pc
<= FRAME_FP(fi
))
413 /* Dummy frame. All but the window regs are in there somewhere. */
414 for (regnum
= G1_REGNUM
; regnum
< G1_REGNUM
+7; regnum
++)
415 saved_regs_addr
->regs
[regnum
] =
416 frame
+ (regnum
- G0_REGNUM
) * 4 - 0xa0;
417 for (regnum
= I0_REGNUM
; regnum
< I0_REGNUM
+8; regnum
++)
418 saved_regs_addr
->regs
[regnum
] =
419 frame
+ (regnum
- I0_REGNUM
) * 4 - 0xc0;
420 for (regnum
= FP0_REGNUM
; regnum
< FP0_REGNUM
+ 32; regnum
++)
421 saved_regs_addr
->regs
[regnum
] =
422 frame
+ (regnum
- FP0_REGNUM
) * 4 - 0x80;
423 for (regnum
= Y_REGNUM
; regnum
< NUM_REGS
; regnum
++)
424 saved_regs_addr
->regs
[regnum
] =
425 frame
+ (regnum
- Y_REGNUM
) * 4 - 0xe0;
427 fi
->bottom
: read_register (SP_REGNUM
);
431 /* Normal frame. Just Local and In registers */
433 fi
->bottom
: read_register (SP_REGNUM
);
434 for (regnum
= L0_REGNUM
; regnum
< L0_REGNUM
+16; regnum
++)
435 saved_regs_addr
->regs
[regnum
] = frame
+ (regnum
-L0_REGNUM
) * 4;
439 /* Pull off either the next frame pointer or the stack pointer */
440 FRAME_ADDR next_next_frame
=
443 read_register (SP_REGNUM
));
444 for (regnum
= O0_REGNUM
; regnum
< O0_REGNUM
+8; regnum
++)
445 saved_regs_addr
->regs
[regnum
] = next_next_frame
+ regnum
* 4;
447 /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
448 saved_regs_addr
->regs
[SP_REGNUM
] = FRAME_FP (fi
);
451 /* Push an empty stack frame, and record in it the current PC, regs, etc.
453 We save the non-windowed registers and the ins. The locals and outs
454 are new; they don't need to be saved. The i's and l's of
455 the last frame were already saved on the stack. */
457 /* Definitely see tm-sparc.h for more doc of the frame format here. */
460 sparc_push_dummy_frame ()
462 CORE_ADDR sp
, old_sp
;
463 char register_temp
[0x140];
465 old_sp
= sp
= read_register (SP_REGNUM
);
467 /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
468 read_register_bytes (REGISTER_BYTE (Y_REGNUM
), ®ister_temp
[0],
469 REGISTER_RAW_SIZE (Y_REGNUM
) * 8);
471 read_register_bytes (REGISTER_BYTE (O0_REGNUM
), ®ister_temp
[8 * 4],
472 REGISTER_RAW_SIZE (O0_REGNUM
) * 8);
474 read_register_bytes (REGISTER_BYTE (G0_REGNUM
), ®ister_temp
[16 * 4],
475 REGISTER_RAW_SIZE (G0_REGNUM
) * 8);
477 read_register_bytes (REGISTER_BYTE (FP0_REGNUM
), ®ister_temp
[24 * 4],
478 REGISTER_RAW_SIZE (FP0_REGNUM
) * 32);
482 write_register (SP_REGNUM
, sp
);
484 write_memory (sp
+ 0x60, ®ister_temp
[0], (8 + 8 + 8 + 32) * 4);
486 write_register (FP_REGNUM
, old_sp
);
488 /* Set return address register for the call dummy to the current PC. */
489 write_register (I7_REGNUM
, read_pc() - 8);
492 /* Discard from the stack the innermost frame, restoring all saved registers.
494 Note that the values stored in fsr by get_frame_saved_regs are *in
495 the context of the called frame*. What this means is that the i
496 regs of fsr must be restored into the o regs of the (calling) frame that
497 we pop into. We don't care about the output regs of the calling frame,
498 since unless it's a dummy frame, it won't have any output regs in it.
500 We never have to bother with %l (local) regs, since the called routine's
501 locals get tossed, and the calling routine's locals are already saved
504 /* Definitely see tm-sparc.h for more doc of the frame format here. */
509 register FRAME frame
= get_current_frame ();
510 register CORE_ADDR pc
;
511 struct frame_saved_regs fsr
;
512 struct frame_info
*fi
;
513 char raw_buffer
[REGISTER_BYTES
];
515 fi
= get_frame_info (frame
);
516 get_frame_saved_regs (fi
, &fsr
);
517 if (fsr
.regs
[FP0_REGNUM
])
519 read_memory (fsr
.regs
[FP0_REGNUM
], raw_buffer
, 32 * 4);
520 write_register_bytes (REGISTER_BYTE (FP0_REGNUM
), raw_buffer
, 32 * 4);
522 if (fsr
.regs
[FPS_REGNUM
])
524 read_memory (fsr
.regs
[FPS_REGNUM
], raw_buffer
, 4);
525 write_register_bytes (REGISTER_BYTE (FPS_REGNUM
), raw_buffer
, 4);
527 if (fsr
.regs
[CPS_REGNUM
])
529 read_memory (fsr
.regs
[CPS_REGNUM
], raw_buffer
, 4);
530 write_register_bytes (REGISTER_BYTE (CPS_REGNUM
), raw_buffer
, 4);
532 if (fsr
.regs
[G1_REGNUM
])
534 read_memory (fsr
.regs
[G1_REGNUM
], raw_buffer
, 7 * 4);
535 write_register_bytes (REGISTER_BYTE (G1_REGNUM
), raw_buffer
, 7 * 4);
537 if (fsr
.regs
[I0_REGNUM
])
541 char reg_temp
[REGISTER_BYTES
];
543 read_memory (fsr
.regs
[I0_REGNUM
], raw_buffer
, 8 * 4);
545 /* Get the ins and locals which we are about to restore. Just
546 moving the stack pointer is all that is really needed, except
547 store_inferior_registers is then going to write the ins and
548 locals from the registers array, so we need to muck with the
550 sp
= fsr
.regs
[SP_REGNUM
];
551 read_memory (sp
, reg_temp
, REGISTER_RAW_SIZE (L0_REGNUM
) * 16);
553 /* Restore the out registers.
554 Among other things this writes the new stack pointer. */
555 write_register_bytes (REGISTER_BYTE (O0_REGNUM
), raw_buffer
,
556 REGISTER_RAW_SIZE (O0_REGNUM
) * 8);
558 write_register_bytes (REGISTER_BYTE (L0_REGNUM
), reg_temp
,
559 REGISTER_RAW_SIZE (L0_REGNUM
) * 16);
561 if (fsr
.regs
[PS_REGNUM
])
562 write_register (PS_REGNUM
, read_memory_integer (fsr
.regs
[PS_REGNUM
], 4));
563 if (fsr
.regs
[Y_REGNUM
])
564 write_register (Y_REGNUM
, read_memory_integer (fsr
.regs
[Y_REGNUM
], 4));
565 if (fsr
.regs
[PC_REGNUM
])
567 /* Explicitly specified PC (and maybe NPC) -- just restore them. */
568 write_register (PC_REGNUM
, read_memory_integer (fsr
.regs
[PC_REGNUM
], 4));
569 if (fsr
.regs
[NPC_REGNUM
])
570 write_register (NPC_REGNUM
,
571 read_memory_integer (fsr
.regs
[NPC_REGNUM
], 4));
573 else if (fsr
.regs
[I7_REGNUM
])
575 /* Return address in %i7 -- adjust it, then restore PC and NPC from it */
576 pc
= PC_ADJUST (read_memory_integer (fsr
.regs
[I7_REGNUM
], 4));
577 write_register (PC_REGNUM
, pc
);
578 write_register (NPC_REGNUM
, pc
+ 4);
580 flush_cached_frames ();
581 set_current_frame ( create_new_frame (read_register (FP_REGNUM
),
585 /* On the Sun 4 under SunOS, the compile will leave a fake insn which
586 encodes the structure size being returned. If we detect such
587 a fake insn, step past it. */
597 err
= target_read_memory (pc
+ 8, buf
, sizeof(long));
598 insn
= extract_unsigned_integer (buf
, 4);
599 if ((err
== 0) && (insn
& 0xfffffe00) == 0)
605 #ifdef USE_PROC_FS /* Target dependent support for /proc */
607 /* The /proc interface divides the target machine's register set up into
608 two different sets, the general register set (gregset) and the floating
609 point register set (fpregset). For each set, there is an ioctl to get
610 the current register set and another ioctl to set the current values.
612 The actual structure passed through the ioctl interface is, of course,
613 naturally machine dependent, and is different for each set of registers.
614 For the sparc for example, the general register set is typically defined
617 typedef int gregset_t[38];
623 and the floating point set by:
625 typedef struct prfpregset {
633 u_char pr_q_entrysize;
638 These routines provide the packing and unpacking of gregset_t and
639 fpregset_t formatted data.
644 /* Given a pointer to a general register set in /proc format (gregset_t *),
645 unpack the register contents and supply them as gdb's idea of the current
649 supply_gregset (gregsetp
)
650 prgregset_t
*gregsetp
;
653 register prgreg_t
*regp
= (prgreg_t
*) gregsetp
;
655 /* GDB register numbers for Gn, On, Ln, In all match /proc reg numbers. */
656 for (regi
= G0_REGNUM
; regi
<= I7_REGNUM
; regi
++)
658 supply_register (regi
, (char *) (regp
+ regi
));
661 /* These require a bit more care. */
662 supply_register (PS_REGNUM
, (char *) (regp
+ R_PS
));
663 supply_register (PC_REGNUM
, (char *) (regp
+ R_PC
));
664 supply_register (NPC_REGNUM
,(char *) (regp
+ R_nPC
));
665 supply_register (Y_REGNUM
, (char *) (regp
+ R_Y
));
669 fill_gregset (gregsetp
, regno
)
670 prgregset_t
*gregsetp
;
674 register prgreg_t
*regp
= (prgreg_t
*) gregsetp
;
675 extern char registers
[];
677 for (regi
= 0 ; regi
<= R_I7
; regi
++)
679 if ((regno
== -1) || (regno
== regi
))
681 *(regp
+ regi
) = *(int *) ®isters
[REGISTER_BYTE (regi
)];
684 if ((regno
== -1) || (regno
== PS_REGNUM
))
686 *(regp
+ R_PS
) = *(int *) ®isters
[REGISTER_BYTE (PS_REGNUM
)];
688 if ((regno
== -1) || (regno
== PC_REGNUM
))
690 *(regp
+ R_PC
) = *(int *) ®isters
[REGISTER_BYTE (PC_REGNUM
)];
692 if ((regno
== -1) || (regno
== NPC_REGNUM
))
694 *(regp
+ R_nPC
) = *(int *) ®isters
[REGISTER_BYTE (NPC_REGNUM
)];
696 if ((regno
== -1) || (regno
== Y_REGNUM
))
698 *(regp
+ R_Y
) = *(int *) ®isters
[REGISTER_BYTE (Y_REGNUM
)];
702 #if defined (FP0_REGNUM)
704 /* Given a pointer to a floating point register set in /proc format
705 (fpregset_t *), unpack the register contents and supply them as gdb's
706 idea of the current floating point register values. */
709 supply_fpregset (fpregsetp
)
710 prfpregset_t
*fpregsetp
;
715 for (regi
= FP0_REGNUM
; regi
< FP0_REGNUM
+32 ; regi
++)
717 from
= (char *) &fpregsetp
->pr_fr
.pr_regs
[regi
-FP0_REGNUM
];
718 supply_register (regi
, from
);
720 supply_register (FPS_REGNUM
, (char *) &(fpregsetp
->pr_fsr
));
723 /* Given a pointer to a floating point register set in /proc format
724 (fpregset_t *), update the register specified by REGNO from gdb's idea
725 of the current floating point register set. If REGNO is -1, update
729 fill_fpregset (fpregsetp
, regno
)
730 prfpregset_t
*fpregsetp
;
736 extern char registers
[];
738 for (regi
= FP0_REGNUM
; regi
< FP0_REGNUM
+32 ; regi
++)
740 if ((regno
== -1) || (regno
== regi
))
742 from
= (char *) ®isters
[REGISTER_BYTE (regi
)];
743 to
= (char *) &fpregsetp
->pr_fr
.pr_regs
[regi
-FP0_REGNUM
];
744 memcpy (to
, from
, REGISTER_RAW_SIZE (regi
));
747 if ((regno
== -1) || (regno
== FPS_REGNUM
))
749 fpregsetp
->pr_fsr
= *(int *) ®isters
[REGISTER_BYTE (FPS_REGNUM
)];
753 #endif /* defined (FP0_REGNUM) */
755 #endif /* USE_PROC_FS */
758 #ifdef GET_LONGJMP_TARGET
760 /* Figure out where the longjmp will land. We expect that we have just entered
761 longjmp and haven't yet setup the stack frame, so the args are still in the
762 output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
763 extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
764 This routine returns true on success */
767 get_longjmp_target(pc
)
771 #define LONGJMP_TARGET_SIZE 4
772 char buf
[LONGJMP_TARGET_SIZE
];
774 jb_addr
= read_register(O0_REGNUM
);
776 if (target_read_memory(jb_addr
+ JB_PC
* JB_ELEMENT_SIZE
, buf
,
777 LONGJMP_TARGET_SIZE
))
780 *pc
= extract_address (buf
, LONGJMP_TARGET_SIZE
);
784 #endif /* GET_LONGJMP_TARGET */
786 /* So far used only for sparc solaris. In sparc solaris, we recognize
787 a trampoline by it's section name. That is, if the pc is in a
788 section named ".plt" then we are in a trampline. */
791 in_solib_trampoline(pc
, name
)
795 struct obj_section
*s
;
798 s
= find_pc_section(pc
);
801 && s
->the_bfd_section
->name
!= NULL
802 && STREQ (s
->the_bfd_section
->name
, ".plt"));