* cp-valprint.c (static_field_print): New variable, controls
[deliverable/binutils-gdb.git] / gdb / sparc-tdep.c
CommitLineData
f9e3b3cc 1/* Target-dependent code for the SPARC for GDB, the GNU debugger.
94d4b713
JK
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
bd5635a1
RP
4
5This file is part of GDB.
6
5259796b 7This program is free software; you can redistribute it and/or modify
bd5635a1 8it under the terms of the GNU General Public License as published by
5259796b
JG
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
bd5635a1 11
5259796b 12This program is distributed in the hope that it will be useful,
bd5635a1
RP
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
5259796b
JG
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
bd5635a1 20
bd5635a1 21#include "defs.h"
bd5635a1
RP
22#include "frame.h"
23#include "inferior.h"
24#include "obstack.h"
bd5635a1 25#include "target.h"
48792545 26#include "value.h"
4365c36c
JK
27
28#include "symfile.h" /* for objfiles.h */
29#include "objfiles.h" /* for find_pc_section */
bd5635a1 30
8f86a4e4
JG
31#ifdef USE_PROC_FS
32#include <sys/procfs.h>
8f86a4e4 33#endif
bd5635a1 34
bd5635a1
RP
35#include "gdbcore.h"
36
37/* From infrun.c */
38extern int stop_after_trap;
39
b38f304c
JG
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. */
45
46int deferred_stores = 0; /* Cumulates stores we want to do eventually. */
47
bd5635a1
RP
48typedef enum
49{
f9e3b3cc 50 Error, not_branch, bicc, bicca, ba, baa, ticc, ta
bd5635a1
RP
51} branch_type;
52
53/* Simulate single-step ptrace call for sun4. Code written by Gary
54 Beihl (beihl@mcc.com). */
55
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. */
58static CORE_ADDR next_pc, npc4, target;
59static int brknpc4, brktrg;
60typedef char binsn_quantum[BREAKPOINT_MAX];
61static binsn_quantum break_mem[3];
62
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
66 sun4. */
67
68int one_stepped;
69
d11c44f1
JG
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.
74
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. */
77
bd5635a1 78void
8f86a4e4
JG
79single_step (ignore)
80 int ignore; /* pid, but we don't need it */
bd5635a1
RP
81{
82 branch_type br, isannulled();
83 CORE_ADDR pc;
84 long pc_instruction;
85
86 if (!one_stepped)
87 {
88 /* Always set breakpoint for NPC. */
89 next_pc = read_register (NPC_REGNUM);
90 npc4 = next_pc + 4; /* branch not taken */
91
92 target_insert_breakpoint (next_pc, break_mem[0]);
f1de67d3 93 /* printf_unfiltered ("set break at %x\n",next_pc); */
bd5635a1
RP
94
95 pc = read_register (PC_REGNUM);
96 pc_instruction = read_memory_integer (pc, sizeof(pc_instruction));
97 br = isannulled (pc_instruction, pc, &target);
98 brknpc4 = brktrg = 0;
99
100 if (br == bicca)
101 {
102 /* Conditional annulled branch will either end up at
103 npc (if taken) or at npc+4 (if not taken).
104 Trap npc+4. */
105 brknpc4 = 1;
106 target_insert_breakpoint (npc4, break_mem[1]);
107 }
108 else if (br == baa && target != next_pc)
109 {
110 /* Unconditional annulled branch will always end up at
111 the target. */
112 brktrg = 1;
113 target_insert_breakpoint (target, break_mem[2]);
114 }
115
d11c44f1 116 /* We are ready to let it go */
bd5635a1
RP
117 one_stepped = 1;
118 return;
119 }
120 else
121 {
122 /* Remove breakpoints */
123 target_remove_breakpoint (next_pc, break_mem[0]);
124
125 if (brknpc4)
126 target_remove_breakpoint (npc4, break_mem[1]);
127
128 if (brktrg)
129 target_remove_breakpoint (target, break_mem[2]);
130
131 one_stepped = 0;
132 }
133}
134\f
d11c44f1
JG
135CORE_ADDR
136sparc_frame_chain (thisframe)
137 FRAME thisframe;
138{
f1de67d3 139 char buf[MAX_REGISTER_RAW_SIZE];
5259796b 140 int err;
f9e3b3cc
JG
141 CORE_ADDR addr;
142
143 addr = thisframe->frame + FRAME_SAVED_I0 +
6ac06390 144 REGISTER_RAW_SIZE (FP_REGNUM) * (FP_REGNUM - I0_REGNUM);
f1de67d3 145 err = target_read_memory (addr, buf, REGISTER_RAW_SIZE (FP_REGNUM));
5259796b
JG
146 if (err)
147 return 0;
f1de67d3 148 return extract_address (buf, REGISTER_RAW_SIZE (FP_REGNUM));
d11c44f1
JG
149}
150
151CORE_ADDR
152sparc_extract_struct_value_address (regbuf)
153 char regbuf[REGISTER_BYTES];
154{
f9e3b3cc 155 return read_memory_integer (((int *)(regbuf))[SP_REGNUM]+(16*4),
f1de67d3 156 TARGET_PTR_BIT / TARGET_CHAR_BIT);
d11c44f1
JG
157}
158
f9e3b3cc
JG
159/* Find the pc saved in frame FRAME. */
160
bd5635a1 161CORE_ADDR
8bf94f44 162sparc_frame_saved_pc (frame)
bd5635a1
RP
163 FRAME frame;
164{
f1de67d3 165 char buf[MAX_REGISTER_RAW_SIZE];
34df79fc 166 CORE_ADDR addr;
f9e3b3cc 167
48792545
JK
168 if (frame->signal_handler_caller)
169 {
170 /* This is the signal trampoline frame.
171 Get the saved PC from the sigcontext structure. */
172
173#ifndef SIGCONTEXT_PC_OFFSET
174#define SIGCONTEXT_PC_OFFSET 12
175#endif
176
177 CORE_ADDR sigcontext_addr;
178 char scbuf[TARGET_PTR_BIT / HOST_CHAR_BIT];
94d4b713
JK
179 int saved_pc_offset = SIGCONTEXT_PC_OFFSET;
180 char *name = NULL;
181
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;
48792545
JK
188
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));
193
194 /* Don't cause a memory_error when accessing sigcontext in case the
195 stack layout has changed or the stack is corrupt. */
94d4b713 196 target_read_memory (sigcontext_addr + saved_pc_offset,
48792545
JK
197 scbuf, sizeof (scbuf));
198 return extract_address (scbuf, sizeof (scbuf));
199 }
6ac06390
DE
200 addr = (frame->bottom + FRAME_SAVED_I0 +
201 REGISTER_RAW_SIZE (I7_REGNUM) * (I7_REGNUM - I0_REGNUM));
f1de67d3
PS
202 read_memory (addr, buf, REGISTER_RAW_SIZE (I7_REGNUM));
203 return PC_ADJUST (extract_address (buf, REGISTER_RAW_SIZE (I7_REGNUM)));
bd5635a1
RP
204}
205
206/*
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
213 * difficulty.
214 */
215FRAME
2093fe68
RP
216setup_arbitrary_frame (argc, argv)
217 int argc;
218 FRAME_ADDR *argv;
bd5635a1 219{
2093fe68
RP
220 FRAME fid;
221
222 if (argc != 2)
223 error ("Sparc frame specifications require two arguments: fp and sp");
224
225 fid = create_new_frame (argv[0], 0);
bd5635a1
RP
226
227 if (!fid)
228 fatal ("internal: create_new_frame returned invalid frame id");
229
2093fe68 230 fid->bottom = argv[1];
5259796b 231 fid->pc = FRAME_SAVED_PC (fid);
bd5635a1
RP
232 return fid;
233}
234
5259796b
JG
235/* Given a pc value, skip it forward past the function prologue by
236 disassembling instructions that appear to be a prologue.
237
238 If FRAMELESS_P is set, we are only testing to see if the function
239 is frameless. This allows a quicker answer.
240
241 This routine should be more specific in its actions; making sure
192cbba9 242 that it uses the same register in the initial prologue section. */
bd5635a1 243CORE_ADDR
5259796b 244skip_prologue (start_pc, frameless_p)
192cbba9 245 CORE_ADDR start_pc;
5259796b 246 int frameless_p;
bd5635a1
RP
247{
248 union
249 {
250 unsigned long int code;
251 struct
252 {
253 unsigned int op:2;
254 unsigned int rd:5;
255 unsigned int op2:3;
256 unsigned int imm22:22;
257 } sethi;
258 struct
259 {
260 unsigned int op:2;
261 unsigned int rd:5;
262 unsigned int op3:6;
263 unsigned int rs1:5;
264 unsigned int i:1;
265 unsigned int simm13:13;
266 } add;
267 int i;
268 } x;
269 int dest = -1;
192cbba9 270 CORE_ADDR pc = start_pc;
bd5635a1
RP
271
272 x.i = read_memory_integer (pc, 4);
273
274 /* Recognize the `sethi' insn and record its destination. */
275 if (x.sethi.op == 0 && x.sethi.op2 == 4)
276 {
277 dest = x.sethi.rd;
278 pc += 4;
279 x.i = read_memory_integer (pc, 4);
280 }
281
282 /* Recognize an add immediate value to register to either %g1 or
283 the destination register recorded above. Actually, this might
192cbba9
JK
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). */
bd5635a1
RP
288 if (x.add.op == 2 && x.add.i && (x.add.rd == 1 || x.add.rd == dest))
289 {
290 pc += 4;
291 x.i = read_memory_integer (pc, 4);
292 }
293
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)
298 {
299 pc += 4;
5259796b
JG
300 if (frameless_p) /* If the save is all we care about, */
301 return pc; /* return before doing more work */
bd5635a1
RP
302 x.i = read_memory_integer (pc, 4);
303 }
5259796b
JG
304 else
305 {
306 /* Without a save instruction, it's not a prologue. */
307 return start_pc;
308 }
bd5635a1
RP
309
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. */
313 while (x.add.op == 3
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)
321 {
322 pc += 4;
323 x.i = read_memory_integer (pc, 4);
324 }
5259796b 325 return pc;
bd5635a1
RP
326}
327
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. */
331
332branch_type
333isannulled (instruction, addr, target)
334 long instruction;
335 CORE_ADDR addr, *target;
336{
337 branch_type val = not_branch;
338 long int offset; /* Must be signed for sign-extend. */
339 union
340 {
341 unsigned long int code;
342 struct
343 {
344 unsigned int op:2;
345 unsigned int a:1;
346 unsigned int cond:4;
347 unsigned int op2:3;
348 unsigned int disp22:22;
349 } b;
350 } insn;
351
352 *target = 0;
353 insn.code = instruction;
354
355 if (insn.b.op == 0
356 && (insn.b.op2 == 2 || insn.b.op2 == 6 || insn.b.op2 == 7))
357 {
358 if (insn.b.cond == 8)
359 val = insn.b.a ? baa : ba;
360 else
361 val = insn.b.a ? bicca : bicc;
362 offset = 4 * ((int) (insn.b.disp22 << 10) >> 10);
363 *target = addr + offset;
364 }
365
366 return val;
367}
368
369/* sparc_frame_find_saved_regs ()
370
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.
376
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.
381
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.
387
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.
391
392 See tm-sparc.h (PUSH_FRAME and friends) for CRITICAL information
393 about how this works. */
394
395void
396sparc_frame_find_saved_regs (fi, saved_regs_addr)
397 struct frame_info *fi;
398 struct frame_saved_regs *saved_regs_addr;
399{
400 register int regnum;
f1de67d3 401 FRAME_ADDR frame = FRAME_FP(fi);
bd5635a1
RP
402 FRAME fid = FRAME_INFO_ID (fi);
403
404 if (!fid)
405 fatal ("Bad frame info struct in FRAME_FIND_SAVED_REGS");
406
b38f304c 407 memset (saved_regs_addr, 0, sizeof (*saved_regs_addr));
bd5635a1 408
bd5635a1
RP
409 if (fi->pc >= (fi->bottom ? fi->bottom :
410 read_register (SP_REGNUM))
411 && fi->pc <= FRAME_FP(fi))
412 {
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;
426 frame = fi->bottom ?
427 fi->bottom : read_register (SP_REGNUM);
428 }
429 else
430 {
431 /* Normal frame. Just Local and In registers */
432 frame = fi->bottom ?
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;
436 }
437 if (fi->next)
438 {
439 /* Pull off either the next frame pointer or the stack pointer */
440 FRAME_ADDR next_next_frame =
441 (fi->next->bottom ?
442 fi->next->bottom :
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;
446 }
447 /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
448 saved_regs_addr->regs[SP_REGNUM] = FRAME_FP (fi);
449}
450
451/* Push an empty stack frame, and record in it the current PC, regs, etc.
452
dd99f8e4 453 We save the non-windowed registers and the ins. The locals and outs
bd5635a1 454 are new; they don't need to be saved. The i's and l's of
f1de67d3 455 the last frame were already saved on the stack. */
bd5635a1
RP
456
457/* Definitely see tm-sparc.h for more doc of the frame format here. */
458
459void
460sparc_push_dummy_frame ()
461{
f1de67d3
PS
462 CORE_ADDR sp, old_sp;
463 char register_temp[0x140];
bd5635a1 464
f1de67d3 465 old_sp = sp = read_register (SP_REGNUM);
bd5635a1 466
f1de67d3
PS
467 /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
468 read_register_bytes (REGISTER_BYTE (Y_REGNUM), &register_temp[0],
469 REGISTER_RAW_SIZE (Y_REGNUM) * 8);
bd5635a1 470
f1de67d3
PS
471 read_register_bytes (REGISTER_BYTE (O0_REGNUM), &register_temp[8 * 4],
472 REGISTER_RAW_SIZE (O0_REGNUM) * 8);
473
474 read_register_bytes (REGISTER_BYTE (G0_REGNUM), &register_temp[16 * 4],
dd99f8e4 475 REGISTER_RAW_SIZE (G0_REGNUM) * 8);
bd5635a1 476
f1de67d3
PS
477 read_register_bytes (REGISTER_BYTE (FP0_REGNUM), &register_temp[24 * 4],
478 REGISTER_RAW_SIZE (FP0_REGNUM) * 32);
bd5635a1 479
f1de67d3
PS
480 sp -= 0x140;
481
482 write_register (SP_REGNUM, sp);
483
484 write_memory (sp + 0x60, &register_temp[0], (8 + 8 + 8 + 32) * 4);
485
486 write_register (FP_REGNUM, old_sp);
487
488 /* Set return address register for the call dummy to the current PC. */
489 write_register (I7_REGNUM, read_pc() - 8);
bd5635a1
RP
490}
491
492/* Discard from the stack the innermost frame, restoring all saved registers.
493
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.
499
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
502 on its stack. */
503
504/* Definitely see tm-sparc.h for more doc of the frame format here. */
505
506void
507sparc_pop_frame ()
508{
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];
514
515 fi = get_frame_info (frame);
516 get_frame_saved_regs (fi, &fsr);
bd5635a1
RP
517 if (fsr.regs[FP0_REGNUM])
518 {
519 read_memory (fsr.regs[FP0_REGNUM], raw_buffer, 32 * 4);
520 write_register_bytes (REGISTER_BYTE (FP0_REGNUM), raw_buffer, 32 * 4);
521 }
f1de67d3
PS
522 if (fsr.regs[FPS_REGNUM])
523 {
524 read_memory (fsr.regs[FPS_REGNUM], raw_buffer, 4);
525 write_register_bytes (REGISTER_BYTE (FPS_REGNUM), raw_buffer, 4);
526 }
527 if (fsr.regs[CPS_REGNUM])
528 {
529 read_memory (fsr.regs[CPS_REGNUM], raw_buffer, 4);
530 write_register_bytes (REGISTER_BYTE (CPS_REGNUM), raw_buffer, 4);
531 }
bd5635a1
RP
532 if (fsr.regs[G1_REGNUM])
533 {
534 read_memory (fsr.regs[G1_REGNUM], raw_buffer, 7 * 4);
535 write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer, 7 * 4);
536 }
537 if (fsr.regs[I0_REGNUM])
538 {
dd99f8e4
JK
539 CORE_ADDR sp;
540
541 char reg_temp[REGISTER_BYTES];
542
bd5635a1 543 read_memory (fsr.regs[I0_REGNUM], raw_buffer, 8 * 4);
dd99f8e4
JK
544
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
549 registers array. */
550 sp = fsr.regs[SP_REGNUM];
551 read_memory (sp, reg_temp, REGISTER_RAW_SIZE (L0_REGNUM) * 16);
552
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);
557
558 write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
559 REGISTER_RAW_SIZE (L0_REGNUM) * 16);
bd5635a1
RP
560 }
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])
566 {
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));
572 }
573 else if (fsr.regs[I7_REGNUM])
574 {
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);
579 }
580 flush_cached_frames ();
581 set_current_frame ( create_new_frame (read_register (FP_REGNUM),
582 read_pc ()));
583}
584
5e5215eb
JG
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. */
588
589CORE_ADDR
590sparc_pc_adjust(pc)
591 CORE_ADDR pc;
592{
34df79fc
JK
593 unsigned long insn;
594 char buf[4];
5e5215eb
JG
595 int err;
596
34df79fc
JK
597 err = target_read_memory (pc + 8, buf, sizeof(long));
598 insn = extract_unsigned_integer (buf, 4);
5e5215eb
JG
599 if ((err == 0) && (insn & 0xfffffe00) == 0)
600 return pc+12;
601 else
602 return pc+8;
603}
8f86a4e4
JG
604\f
605#ifdef USE_PROC_FS /* Target dependent support for /proc */
606
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.
611
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
615 by:
616
617 typedef int gregset_t[38];
618
619 #define R_G0 0
620 ...
621 #define R_TBR 37
622
623 and the floating point set by:
624
625 typedef struct prfpregset {
626 union {
627 u_long pr_regs[32];
628 double pr_dregs[16];
629 } pr_fr;
630 void * pr_filler;
631 u_long pr_fsr;
632 u_char pr_qcnt;
633 u_char pr_q_entrysize;
634 u_char pr_en;
635 u_long pr_q[64];
636 } prfpregset_t;
637
638 These routines provide the packing and unpacking of gregset_t and
639 fpregset_t formatted data.
640
641 */
642
643
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
646 register values. */
647
648void
649supply_gregset (gregsetp)
650prgregset_t *gregsetp;
651{
b38f304c 652 register int regi;
8f86a4e4
JG
653 register prgreg_t *regp = (prgreg_t *) gregsetp;
654
655 /* GDB register numbers for Gn, On, Ln, In all match /proc reg numbers. */
b38f304c 656 for (regi = G0_REGNUM ; regi <= I7_REGNUM ; regi++)
8f86a4e4 657 {
b38f304c 658 supply_register (regi, (char *) (regp + regi));
8f86a4e4
JG
659 }
660
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));
666}
667
668void
669fill_gregset (gregsetp, regno)
670prgregset_t *gregsetp;
671int regno;
672{
673 int regi;
674 register prgreg_t *regp = (prgreg_t *) gregsetp;
675 extern char registers[];
676
677 for (regi = 0 ; regi <= R_I7 ; regi++)
678 {
679 if ((regno == -1) || (regno == regi))
680 {
b38f304c 681 *(regp + regi) = *(int *) &registers[REGISTER_BYTE (regi)];
8f86a4e4
JG
682 }
683 }
684 if ((regno == -1) || (regno == PS_REGNUM))
685 {
686 *(regp + R_PS) = *(int *) &registers[REGISTER_BYTE (PS_REGNUM)];
687 }
688 if ((regno == -1) || (regno == PC_REGNUM))
689 {
690 *(regp + R_PC) = *(int *) &registers[REGISTER_BYTE (PC_REGNUM)];
691 }
692 if ((regno == -1) || (regno == NPC_REGNUM))
693 {
694 *(regp + R_nPC) = *(int *) &registers[REGISTER_BYTE (NPC_REGNUM)];
695 }
696 if ((regno == -1) || (regno == Y_REGNUM))
697 {
698 *(regp + R_Y) = *(int *) &registers[REGISTER_BYTE (Y_REGNUM)];
699 }
700}
701
702#if defined (FP0_REGNUM)
703
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. */
707
708void
709supply_fpregset (fpregsetp)
710prfpregset_t *fpregsetp;
711{
712 register int regi;
713 char *from;
714
715 for (regi = FP0_REGNUM ; regi < FP0_REGNUM+32 ; regi++)
716 {
717 from = (char *) &fpregsetp->pr_fr.pr_regs[regi-FP0_REGNUM];
718 supply_register (regi, from);
719 }
720 supply_register (FPS_REGNUM, (char *) &(fpregsetp->pr_fsr));
721}
722
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
726 them all. */
727
728void
729fill_fpregset (fpregsetp, regno)
730prfpregset_t *fpregsetp;
731int regno;
732{
733 int regi;
734 char *to;
735 char *from;
736 extern char registers[];
737
738 for (regi = FP0_REGNUM ; regi < FP0_REGNUM+32 ; regi++)
739 {
740 if ((regno == -1) || (regno == regi))
741 {
742 from = (char *) &registers[REGISTER_BYTE (regi)];
743 to = (char *) &fpregsetp->pr_fr.pr_regs[regi-FP0_REGNUM];
b38f304c 744 memcpy (to, from, REGISTER_RAW_SIZE (regi));
8f86a4e4
JG
745 }
746 }
747 if ((regno == -1) || (regno == FPS_REGNUM))
748 {
749 fpregsetp->pr_fsr = *(int *) &registers[REGISTER_BYTE (FPS_REGNUM)];
750 }
751}
752
753#endif /* defined (FP0_REGNUM) */
754
755#endif /* USE_PROC_FS */
756
757
758#ifdef GET_LONGJMP_TARGET
f9e3b3cc
JG
759
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 */
765
766int
767get_longjmp_target(pc)
768 CORE_ADDR *pc;
769{
770 CORE_ADDR jb_addr;
34df79fc
JK
771#define LONGJMP_TARGET_SIZE 4
772 char buf[LONGJMP_TARGET_SIZE];
f9e3b3cc
JG
773
774 jb_addr = read_register(O0_REGNUM);
775
34df79fc
JK
776 if (target_read_memory(jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
777 LONGJMP_TARGET_SIZE))
f9e3b3cc
JG
778 return 0;
779
34df79fc 780 *pc = extract_address (buf, LONGJMP_TARGET_SIZE);
f9e3b3cc
JG
781
782 return 1;
783}
8f86a4e4 784#endif /* GET_LONGJMP_TARGET */
2093fe68
RP
785
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
4365c36c 788 section named ".plt" then we are in a trampline. */
2093fe68
RP
789
790int
791in_solib_trampoline(pc, name)
792 CORE_ADDR pc;
793 char *name;
794{
6ac06390 795 struct obj_section *s;
2093fe68
RP
796 int retval = 0;
797
798 s = find_pc_section(pc);
799
800 retval = (s != NULL
94d4b713
JK
801 && s->the_bfd_section->name != NULL
802 && STREQ (s->the_bfd_section->name, ".plt"));
2093fe68
RP
803 return(retval);
804}
805
This page took 0.22462 seconds and 4 git commands to generate.