1 /* IBM RS/6000 host-dependent code for GDB, the GNU debugger.
2 Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #include <sys/param.h>
30 #include <sys/ioctl.h>
33 #include <sys/ptrace.h>
41 #include <sys/utsname.h>
44 extern int attach_flag
;
46 /* Conversion from gdb-to-system special purpose register numbers.. */
48 static int special_regs
[] = {
59 /* Nonzero if we just simulated a single step break. */
60 extern int one_stepped
;
62 extern struct obstack frame_cache_obstack
;
66 fetch_inferior_registers (regno
)
70 extern char registers
[];
72 if (regno
< 0) { /* for all registers */
74 /* read 32 general purpose registers. */
76 for (ii
=0; ii
< 32; ++ii
)
77 *(int*)®isters
[REGISTER_BYTE (ii
)] =
78 ptrace (PT_READ_GPR
, inferior_pid
, ii
, 0, 0);
80 /* read general purpose floating point registers. */
82 for (ii
=0; ii
< 32; ++ii
)
83 ptrace (PT_READ_FPR
, inferior_pid
,
84 (int*)®isters
[REGISTER_BYTE (FP0_REGNUM
+ii
)], FPR0
+ii
, 0);
86 /* read special registers. */
87 for (ii
=0; ii
<= LAST_SP_REGNUM
-FIRST_SP_REGNUM
; ++ii
)
88 *(int*)®isters
[REGISTER_BYTE (FIRST_SP_REGNUM
+ii
)] =
89 ptrace (PT_READ_GPR
, inferior_pid
, special_regs
[ii
], 0, 0);
95 /* else an individual register is addressed. */
97 else if (regno
< FP0_REGNUM
) { /* a GPR */
98 *(int*)®isters
[REGISTER_BYTE (regno
)] =
99 ptrace (PT_READ_GPR
, inferior_pid
, regno
, 0, 0);
101 else if (regno
<= FPLAST_REGNUM
) { /* a FPR */
102 ptrace (PT_READ_FPR
, inferior_pid
,
103 (int*)®isters
[REGISTER_BYTE (regno
)], (regno
-FP0_REGNUM
+FPR0
), 0);
105 else if (regno
<= LAST_SP_REGNUM
) { /* a special register */
106 *(int*)®isters
[REGISTER_BYTE (regno
)] =
107 ptrace (PT_READ_GPR
, inferior_pid
,
108 special_regs
[regno
-FIRST_SP_REGNUM
], 0, 0);
111 fprintf (stderr
, "gdb error: register no %d not implemented.\n", regno
);
113 register_valid
[regno
] = 1;
116 /* Store our register values back into the inferior.
117 If REGNO is -1, do this for all registers.
118 Otherwise, REGNO specifies which register (so we can save time). */
121 store_inferior_registers (regno
)
124 extern char registers
[];
128 if (regno
== -1) { /* for all registers.. */
131 /* execute one dummy instruction (which is a breakpoint) in inferior
132 process. So give kernel a chance to do internal house keeping.
133 Otherwise the following ptrace(2) calls will mess up user stack
134 since kernel will get confused about the bottom of the stack (%sp) */
136 exec_one_dummy_insn ();
138 /* write general purpose registers first! */
139 for ( ii
=GPR0
; ii
<=GPR31
; ++ii
) {
140 ptrace (PT_WRITE_GPR
, inferior_pid
, ii
,
141 *(int*)®isters
[REGISTER_BYTE (ii
)], 0);
143 perror ("ptrace write_gpr"); errno
= 0;
147 /* write floating point registers now. */
148 for ( ii
=0; ii
< 32; ++ii
) {
149 ptrace (PT_WRITE_FPR
, inferior_pid
,
150 (int*)®isters
[REGISTER_BYTE (FP0_REGNUM
+ii
)], FPR0
+ii
, 0);
152 perror ("ptrace write_fpr"); errno
= 0;
156 /* write special registers. */
157 for (ii
=0; ii
<= LAST_SP_REGNUM
-FIRST_SP_REGNUM
; ++ii
) {
158 ptrace (PT_WRITE_GPR
, inferior_pid
, special_regs
[ii
],
159 *(int*)®isters
[REGISTER_BYTE (FIRST_SP_REGNUM
+ii
)], 0);
161 perror ("ptrace write_gpr"); errno
= 0;
166 /* else, a specific register number is given... */
168 else if (regno
< FP0_REGNUM
) { /* a GPR */
170 ptrace (PT_WRITE_GPR
, inferior_pid
, regno
,
171 *(int*)®isters
[REGISTER_BYTE (regno
)], 0);
174 else if (regno
<= FPLAST_REGNUM
) { /* a FPR */
175 ptrace (PT_WRITE_FPR
, inferior_pid
,
176 (int*)®isters
[REGISTER_BYTE (regno
)], regno
-FP0_REGNUM
+FPR0
, 0);
179 else if (regno
<= LAST_SP_REGNUM
) { /* a special register */
181 ptrace (PT_WRITE_GPR
, inferior_pid
, special_regs
[regno
-FIRST_SP_REGNUM
],
182 *(int*)®isters
[REGISTER_BYTE (regno
)], 0);
186 fprintf (stderr
, "Gdb error: register no %d not implemented.\n", regno
);
189 perror ("ptrace write"); errno
= 0;
194 fetch_core_registers (core_reg_sect
, core_reg_size
, which
, reg_addr
)
196 unsigned core_reg_size
;
198 unsigned int reg_addr
; /* Unused in this version */
200 /* fetch GPRs and special registers from the first register section
204 /* copy GPRs first. */
205 bcopy (core_reg_sect
, registers
, 32 * 4);
207 /* gdb's internal register template and bfd's register section layout
208 should share a common include file. FIXMEmgo */
209 /* then comes special registes. They are supposed to be in the same
210 order in gdb template and bfd `.reg' section. */
211 core_reg_sect
+= (32 * 4);
212 bcopy (core_reg_sect
, ®isters
[REGISTER_BYTE (FIRST_SP_REGNUM
)],
213 (LAST_SP_REGNUM
- FIRST_SP_REGNUM
+ 1) * 4);
216 /* fetch floating point registers from register section 2 in core bfd. */
218 bcopy (core_reg_sect
, ®isters
[REGISTER_BYTE (FP0_REGNUM
)], 32 * 8);
221 fprintf (stderr
, "Gdb error: unknown parameter to fetch_core_registers().\n");
225 frameless_function_invocation (fi
)
226 struct frame_info
*fi
;
228 CORE_ADDR func_start
;
229 struct aix_framedata fdata
;
231 func_start
= get_pc_function_start (fi
->pc
) + FUNCTION_START_OFFSET
;
233 /* If we failed to find the start of the function, it is a mistake
234 to inspect the instructions. */
239 function_frame_info (func_start
, &fdata
);
240 return fdata
.frameless
;
244 /* If saved registers of frame FI are not known yet, read and cache them.
245 &FDATAP contains aix_framedata; TDATAP can be NULL,
246 in which case the framedata are read.
250 frame_get_cache_fsr (fi
, fdatap
)
251 struct frame_info
*fi
;
252 struct aix_framedata
*fdatap
;
255 CORE_ADDR frame_addr
;
256 struct aix_framedata work_fdata
;
260 if (fdatap
== NULL
) {
261 fdatap
= &work_fdata
;
262 function_frame_info (get_pc_function_start (fi
->pc
), fdatap
);
265 fi
->cache_fsr
= (struct frame_saved_regs
*)
266 obstack_alloc (&frame_cache_obstack
, sizeof (struct frame_saved_regs
));
267 bzero (fi
->cache_fsr
, sizeof (struct frame_saved_regs
));
269 if (fi
->prev
&& fi
->prev
->frame
)
270 frame_addr
= fi
->prev
->frame
;
272 frame_addr
= read_memory_integer (fi
->frame
, 4);
274 /* if != -1, fdatap->saved_fpr is the smallest number of saved_fpr.
275 All fpr's from saved_fpr to fp31 are saved right underneath caller
276 stack pointer, starting from fp31 first. */
278 if (fdatap
->saved_fpr
>= 0) {
279 for (ii
=31; ii
>= fdatap
->saved_fpr
; --ii
)
280 fi
->cache_fsr
->regs
[FP0_REGNUM
+ ii
] = frame_addr
- ((32 - ii
) * 8);
281 frame_addr
-= (32 - fdatap
->saved_fpr
) * 8;
284 /* if != -1, fdatap->saved_gpr is the smallest number of saved_gpr.
285 All gpr's from saved_gpr to gpr31 are saved right under saved fprs,
286 starting from r31 first. */
288 if (fdatap
->saved_gpr
>= 0)
289 for (ii
=31; ii
>= fdatap
->saved_gpr
; --ii
)
290 fi
->cache_fsr
->regs
[ii
] = frame_addr
- ((32 - ii
) * 4);
293 /* Return the address of a frame. This is the inital %sp value when the frame
294 was first allocated. For functions calling alloca(), it might be saved in
295 an alloca register. */
298 frame_initial_stack_address (fi
)
299 struct frame_info
*fi
;
302 struct aix_framedata fdata
;
303 struct frame_info
*callee_fi
;
305 /* if the initial stack pointer (frame address) of this frame is known,
309 return fi
->initial_sp
;
311 /* find out if this function is using an alloca register.. */
313 function_frame_info (get_pc_function_start (fi
->pc
), &fdata
);
315 /* if saved registers of this frame are not known yet, read and cache them. */
318 frame_get_cache_fsr (fi
, &fdata
);
320 /* If no alloca register used, then fi->frame is the value of the %sp for
321 this frame, and it is good enough. */
323 if (fdata
.alloca_reg
< 0) {
324 fi
->initial_sp
= fi
->frame
;
325 return fi
->initial_sp
;
328 /* This function has an alloca register. If this is the top-most frame
329 (with the lowest address), the value in alloca register is good. */
332 return fi
->initial_sp
= read_register (fdata
.alloca_reg
);
334 /* Otherwise, this is a caller frame. Callee has usually already saved
335 registers, but there are exceptions (such as when the callee
336 has no parameters). Find the address in which caller's alloca
337 register is saved. */
339 for (callee_fi
= fi
->next
; callee_fi
; callee_fi
= callee_fi
->next
) {
341 if (!callee_fi
->cache_fsr
)
342 frame_get_cache_fsr (fi
, NULL
);
344 /* this is the address in which alloca register is saved. */
346 tmpaddr
= callee_fi
->cache_fsr
->regs
[fdata
.alloca_reg
];
348 fi
->initial_sp
= read_memory_integer (tmpaddr
, 4);
349 return fi
->initial_sp
;
352 /* Go look into deeper levels of the frame chain to see if any one of
353 the callees has saved alloca register. */
356 /* If alloca register was not saved, by the callee (or any of its callees)
357 then the value in the register is still good. */
359 return fi
->initial_sp
= read_register (fdata
.alloca_reg
);
364 /* aixcoff_relocate_symtab - hook for symbol table relocation.
365 also reads shared libraries.. */
367 aixcoff_relocate_symtab (pid
)
370 #define MAX_LOAD_SEGS 64 /* maximum number of load segments */
375 ldi
= (void *) alloca(MAX_LOAD_SEGS
* sizeof (*ldi
));
377 /* According to my humble theory, aixcoff has some timing problems and
378 when the user stack grows, kernel doesn't update stack info in time
379 and ptrace calls step on user stack. That is why we sleep here a little,
380 and give kernel to update its internals. */
385 ptrace(PT_LDINFO
, pid
, ldi
, MAX_LOAD_SEGS
* sizeof(*ldi
), ldi
);
387 perror_with_name ("ptrace ldinfo");
394 add_text_to_loadinfo (ldi
->ldinfo_textorg
, ldi
->ldinfo_dataorg
);
395 } while (ldi
->ldinfo_next
396 && (ldi
= (void *) (ldi
->ldinfo_next
+ (char *) ldi
)));
399 /* Now that we've jumbled things around, re-sort them. */
400 sort_minimal_symbols ();
403 /* relocate the exec and core sections as well. */
408 /* Keep an array of load segment information and their TOC table addresses.
409 This info will be useful when calling a shared library function by hand. */
412 unsigned long textorg
, dataorg
, toc_offset
;
415 #define LOADINFOLEN 10
417 static LoadInfo
*loadInfo
= NULL
;
418 static int loadInfoLen
= 0;
419 static int loadInfoTocIndex
= 0;
420 int aix_loadInfoTextIndex
= 0;
423 xcoff_init_loadinfo ()
425 loadInfoTocIndex
= 0;
426 aix_loadInfoTextIndex
= 0;
428 if (loadInfoLen
== 0) {
429 loadInfo
= (void*) xmalloc (sizeof (LoadInfo
) * LOADINFOLEN
);
430 loadInfoLen
= LOADINFOLEN
;
441 loadInfoTocIndex
= 0;
442 aix_loadInfoTextIndex
= 0;
446 xcoff_add_toc_to_loadinfo (unsigned long tocaddr
)
448 while (loadInfoTocIndex
>= loadInfoLen
) {
449 loadInfoLen
+= LOADINFOLEN
;
450 loadInfo
= (void*) xrealloc (loadInfo
, sizeof(LoadInfo
) * loadInfoLen
);
452 loadInfo
[loadInfoTocIndex
++].toc_offset
= tocaddr
;
456 add_text_to_loadinfo (unsigned long textaddr
, unsigned long dataaddr
)
458 while (aix_loadInfoTextIndex
>= loadInfoLen
) {
459 loadInfoLen
+= LOADINFOLEN
;
460 loadInfo
= (void*) xrealloc (loadInfo
, sizeof(LoadInfo
) * loadInfoLen
);
462 loadInfo
[aix_loadInfoTextIndex
].textorg
= textaddr
;
463 loadInfo
[aix_loadInfoTextIndex
].dataorg
= dataaddr
;
464 ++aix_loadInfoTextIndex
;
469 find_toc_address (unsigned long pc
)
471 int ii
, toc_entry
, tocbase
= 0;
473 for (ii
=0; ii
< aix_loadInfoTextIndex
; ++ii
)
474 if (pc
> loadInfo
[ii
].textorg
&& loadInfo
[ii
].textorg
> tocbase
) {
476 tocbase
= loadInfo
[ii
].textorg
;
479 return loadInfo
[toc_entry
].dataorg
+ loadInfo
[toc_entry
].toc_offset
;
483 /* execute one dummy breakpoint instruction. This way we give kernel
484 a chance to do some housekeeping and update inferior's internal data,
487 exec_one_dummy_insn ()
489 #define DUMMY_INSN_ADDR (TEXT_SEGMENT_BASE)+0x200
491 unsigned long shadow
;
492 unsigned int status
, pid
;
494 /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that
495 this address will never be executed again by the real code. */
497 target_insert_breakpoint (DUMMY_INSN_ADDR
, &shadow
);
500 ptrace (PT_CONTINUE
, inferior_pid
, DUMMY_INSN_ADDR
, 0, 0);
502 perror ("pt_continue");
505 pid
= wait (&status
);
506 } while (pid
!= inferior_pid
);
508 target_remove_breakpoint (DUMMY_INSN_ADDR
, &shadow
);
514 *** not needed anymore
***
516 /* Return the number of initial trap signals we need to ignore once the inferior
517 process starts running. This will be `2' for aix-3.1, `3' for aix-3.2 */
520 aix_starting_inferior_traps ()
522 struct utsname unamebuf
;
524 if (uname (&unamebuf
) == -1)
525 fatal ("uname(3) failed.");
527 /* Assume the future versions will behave like 3.2 and return '3' for
528 anything other than 3.1x. The extra trap in 3.2 is the "trap after the
529 program is loaded" signal. */
531 if (unamebuf
.version
[0] == '3' && unamebuf
.release
[0] == '1')