Fix the year on the following lines:
[deliverable/binutils-gdb.git] / gdb / ppc-linux-tdep.c
CommitLineData
c877c8e6
KB
1/* Target-dependent code for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include "defs.h"
23#include "frame.h"
24#include "inferior.h"
25#include "symtab.h"
26#include "target.h"
27#include "gdbcore.h"
28#include "gdbcmd.h"
29#include "symfile.h"
30#include "objfiles.h"
31
9aa1e687
KB
32#include "ppc-tdep.h"
33
c877c8e6
KB
34/* The following two instructions are used in the signal trampoline
35 code on linux/ppc */
36#define INSTR_LI_R0_0x7777 0x38007777
37#define INSTR_SC 0x44000002
38
39/* Since the *-tdep.c files are platform independent (i.e, they may be
40 used to build cross platform debuggers), we can't include system
41 headers. Therefore, details concerning the sigcontext structure
42 must be painstakingly rerecorded. What's worse, if these details
43 ever change in the header files, they'll have to be changed here
44 as well. */
45
46/* __SIGNAL_FRAMESIZE from <asm/ptrace.h> */
47#define PPC_LINUX_SIGNAL_FRAMESIZE 64
48
49/* From <asm/sigcontext.h>, offsetof(struct sigcontext_struct, regs) == 0x1c */
50#define PPC_LINUX_REGS_PTR_OFFSET (PPC_LINUX_SIGNAL_FRAMESIZE + 0x1c)
51
52/* From <asm/sigcontext.h>,
53 offsetof(struct sigcontext_struct, handler) == 0x14 */
54#define PPC_LINUX_HANDLER_PTR_OFFSET (PPC_LINUX_SIGNAL_FRAMESIZE + 0x14)
55
56/* From <asm/ptrace.h>, values for PT_NIP, PT_R1, and PT_LNK */
57#define PPC_LINUX_PT_R0 0
58#define PPC_LINUX_PT_R1 1
59#define PPC_LINUX_PT_R2 2
60#define PPC_LINUX_PT_R3 3
61#define PPC_LINUX_PT_R4 4
62#define PPC_LINUX_PT_R5 5
63#define PPC_LINUX_PT_R6 6
64#define PPC_LINUX_PT_R7 7
65#define PPC_LINUX_PT_R8 8
66#define PPC_LINUX_PT_R9 9
67#define PPC_LINUX_PT_R10 10
68#define PPC_LINUX_PT_R11 11
69#define PPC_LINUX_PT_R12 12
70#define PPC_LINUX_PT_R13 13
71#define PPC_LINUX_PT_R14 14
72#define PPC_LINUX_PT_R15 15
73#define PPC_LINUX_PT_R16 16
74#define PPC_LINUX_PT_R17 17
75#define PPC_LINUX_PT_R18 18
76#define PPC_LINUX_PT_R19 19
77#define PPC_LINUX_PT_R20 20
78#define PPC_LINUX_PT_R21 21
79#define PPC_LINUX_PT_R22 22
80#define PPC_LINUX_PT_R23 23
81#define PPC_LINUX_PT_R24 24
82#define PPC_LINUX_PT_R25 25
83#define PPC_LINUX_PT_R26 26
84#define PPC_LINUX_PT_R27 27
85#define PPC_LINUX_PT_R28 28
86#define PPC_LINUX_PT_R29 29
87#define PPC_LINUX_PT_R30 30
88#define PPC_LINUX_PT_R31 31
89#define PPC_LINUX_PT_NIP 32
90#define PPC_LINUX_PT_MSR 33
91#define PPC_LINUX_PT_CTR 35
92#define PPC_LINUX_PT_LNK 36
93#define PPC_LINUX_PT_XER 37
94#define PPC_LINUX_PT_CCR 38
95#define PPC_LINUX_PT_MQ 39
96#define PPC_LINUX_PT_FPR0 48 /* each FP reg occupies 2 slots in this space */
97#define PPC_LINUX_PT_FPR31 (PPC_LINUX_PT_FPR0 + 2*31)
98#define PPC_LINUX_PT_FPSCR (PPC_LINUX_PT_FPR0 + 2*32 + 1)
99
9aa1e687 100static int ppc_linux_at_sigtramp_return_path (CORE_ADDR pc);
50c9bd31 101
c877c8e6
KB
102/* Determine if pc is in a signal trampoline...
103
104 Ha! That's not what this does at all. wait_for_inferior in infrun.c
105 calls IN_SIGTRAMP in order to detect entry into a signal trampoline
106 just after delivery of a signal. But on linux, signal trampolines
107 are used for the return path only. The kernel sets things up so that
108 the signal handler is called directly.
109
110 If we use in_sigtramp2() in place of in_sigtramp() (see below)
111 we'll (often) end up with stop_pc in the trampoline and prev_pc in
112 the (now exited) handler. The code there will cause a temporary
113 breakpoint to be set on prev_pc which is not very likely to get hit
114 again.
115
116 If this is confusing, think of it this way... the code in
117 wait_for_inferior() needs to be able to detect entry into a signal
118 trampoline just after a signal is delivered, not after the handler
119 has been run.
120
121 So, we define in_sigtramp() below to return 1 if the following is
122 true:
123
124 1) The previous frame is a real signal trampoline.
125
126 - and -
127
128 2) pc is at the first or second instruction of the corresponding
129 handler.
130
131 Why the second instruction? It seems that wait_for_inferior()
132 never sees the first instruction when single stepping. When a
133 signal is delivered while stepping, the next instruction that
134 would've been stepped over isn't, instead a signal is delivered and
135 the first instruction of the handler is stepped over instead. That
136 puts us on the second instruction. (I added the test for the
137 first instruction long after the fact, just in case the observed
138 behavior is ever fixed.)
139
140 IN_SIGTRAMP is called from blockframe.c as well in order to set
141 the signal_handler_caller flag. Because of our strange definition
142 of in_sigtramp below, we can't rely on signal_handler_caller getting
143 set correctly from within blockframe.c. This is why we take pains
144 to set it in init_extra_frame_info(). */
145
146int
147ppc_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
148{
149 CORE_ADDR lr;
150 CORE_ADDR sp;
151 CORE_ADDR tramp_sp;
152 char buf[4];
153 CORE_ADDR handler;
154
9aa1e687 155 lr = read_register (PPC_LR_REGNUM);
c877c8e6
KB
156 if (!ppc_linux_at_sigtramp_return_path (lr))
157 return 0;
158
159 sp = read_register (SP_REGNUM);
160
161 if (target_read_memory (sp, buf, sizeof (buf)) != 0)
162 return 0;
163
164 tramp_sp = extract_unsigned_integer (buf, 4);
165
166 if (target_read_memory (tramp_sp + PPC_LINUX_HANDLER_PTR_OFFSET, buf,
167 sizeof (buf)) != 0)
168 return 0;
169
170 handler = extract_unsigned_integer (buf, 4);
171
172 return (pc == handler || pc == handler + 4);
173}
174
175/*
176 * The signal handler trampoline is on the stack and consists of exactly
177 * two instructions. The easiest and most accurate way of determining
178 * whether the pc is in one of these trampolines is by inspecting the
179 * instructions. It'd be faster though if we could find a way to do this
180 * via some simple address comparisons.
181 */
9aa1e687 182static int
c877c8e6
KB
183ppc_linux_at_sigtramp_return_path (CORE_ADDR pc)
184{
185 char buf[12];
186 unsigned long pcinsn;
187 if (target_read_memory (pc - 4, buf, sizeof (buf)) != 0)
188 return 0;
189
190 /* extract the instruction at the pc */
191 pcinsn = extract_unsigned_integer (buf + 4, 4);
192
193 return (
194 (pcinsn == INSTR_LI_R0_0x7777
195 && extract_unsigned_integer (buf + 8, 4) == INSTR_SC)
196 ||
197 (pcinsn == INSTR_SC
198 && extract_unsigned_integer (buf, 4) == INSTR_LI_R0_0x7777));
199}
200
201CORE_ADDR
202ppc_linux_skip_trampoline_code (CORE_ADDR pc)
203{
204 char buf[4];
205 struct obj_section *sect;
206 struct objfile *objfile;
207 unsigned long insn;
208 CORE_ADDR plt_start = 0;
209 CORE_ADDR symtab = 0;
210 CORE_ADDR strtab = 0;
211 int num_slots = -1;
212 int reloc_index = -1;
213 CORE_ADDR plt_table;
214 CORE_ADDR reloc;
215 CORE_ADDR sym;
216 long symidx;
217 char symname[1024];
218 struct minimal_symbol *msymbol;
219
220 /* Find the section pc is in; return if not in .plt */
221 sect = find_pc_section (pc);
222 if (!sect || strcmp (sect->the_bfd_section->name, ".plt") != 0)
223 return 0;
224
225 objfile = sect->objfile;
226
227 /* Pick up the instruction at pc. It had better be of the
228 form
229 li r11, IDX
230
231 where IDX is an index into the plt_table. */
232
233 if (target_read_memory (pc, buf, 4) != 0)
234 return 0;
235 insn = extract_unsigned_integer (buf, 4);
236
237 if ((insn & 0xffff0000) != 0x39600000 /* li r11, VAL */ )
238 return 0;
239
240 reloc_index = (insn << 16) >> 16;
241
242 /* Find the objfile that pc is in and obtain the information
243 necessary for finding the symbol name. */
244 for (sect = objfile->sections; sect < objfile->sections_end; ++sect)
245 {
246 const char *secname = sect->the_bfd_section->name;
247 if (strcmp (secname, ".plt") == 0)
248 plt_start = sect->addr;
249 else if (strcmp (secname, ".rela.plt") == 0)
250 num_slots = ((int) sect->endaddr - (int) sect->addr) / 12;
251 else if (strcmp (secname, ".dynsym") == 0)
252 symtab = sect->addr;
253 else if (strcmp (secname, ".dynstr") == 0)
254 strtab = sect->addr;
255 }
256
257 /* Make sure we have all the information we need. */
258 if (plt_start == 0 || num_slots == -1 || symtab == 0 || strtab == 0)
259 return 0;
260
261 /* Compute the value of the plt table */
262 plt_table = plt_start + 72 + 8 * num_slots;
263
264 /* Get address of the relocation entry (Elf32_Rela) */
265 if (target_read_memory (plt_table + reloc_index, buf, 4) != 0)
266 return 0;
267 reloc = extract_address (buf, 4);
268
269 sect = find_pc_section (reloc);
270 if (!sect)
271 return 0;
272
273 if (strcmp (sect->the_bfd_section->name, ".text") == 0)
274 return reloc;
275
276 /* Now get the r_info field which is the relocation type and symbol
277 index. */
278 if (target_read_memory (reloc + 4, buf, 4) != 0)
279 return 0;
280 symidx = extract_unsigned_integer (buf, 4);
281
282 /* Shift out the relocation type leaving just the symbol index */
283 /* symidx = ELF32_R_SYM(symidx); */
284 symidx = symidx >> 8;
285
286 /* compute the address of the symbol */
287 sym = symtab + symidx * 4;
288
289 /* Fetch the string table index */
290 if (target_read_memory (sym, buf, 4) != 0)
291 return 0;
292 symidx = extract_unsigned_integer (buf, 4);
293
294 /* Fetch the string; we don't know how long it is. Is it possible
295 that the following will fail because we're trying to fetch too
296 much? */
297 if (target_read_memory (strtab + symidx, symname, sizeof (symname)) != 0)
298 return 0;
299
300 /* This might not work right if we have multiple symbols with the
301 same name; the only way to really get it right is to perform
302 the same sort of lookup as the dynamic linker. */
303 msymbol = lookup_minimal_symbol_text (symname, NULL, NULL);
304 if (!msymbol)
305 return 0;
306
307 return SYMBOL_VALUE_ADDRESS (msymbol);
308}
309
310/* The rs6000 version of FRAME_SAVED_PC will almost work for us. The
311 signal handler details are different, so we'll handle those here
312 and call the rs6000 version to do the rest. */
9aa1e687 313CORE_ADDR
c877c8e6
KB
314ppc_linux_frame_saved_pc (struct frame_info *fi)
315{
316 if (fi->signal_handler_caller)
317 {
318 CORE_ADDR regs_addr =
50c9bd31 319 read_memory_integer (fi->frame + PPC_LINUX_REGS_PTR_OFFSET, 4);
c877c8e6
KB
320 /* return the NIP in the regs array */
321 return read_memory_integer (regs_addr + 4 * PPC_LINUX_PT_NIP, 4);
322 }
50c9bd31
KB
323 else if (fi->next && fi->next->signal_handler_caller)
324 {
325 CORE_ADDR regs_addr =
326 read_memory_integer (fi->next->frame + PPC_LINUX_REGS_PTR_OFFSET, 4);
327 /* return LNK in the regs array */
328 return read_memory_integer (regs_addr + 4 * PPC_LINUX_PT_LNK, 4);
329 }
330 else
331 return rs6000_frame_saved_pc (fi);
c877c8e6
KB
332}
333
334void
335ppc_linux_init_extra_frame_info (int fromleaf, struct frame_info *fi)
336{
337 rs6000_init_extra_frame_info (fromleaf, fi);
338
339 if (fi->next != 0)
340 {
341 /* We're called from get_prev_frame_info; check to see if
342 this is a signal frame by looking to see if the pc points
343 at trampoline code */
344 if (ppc_linux_at_sigtramp_return_path (fi->pc))
345 fi->signal_handler_caller = 1;
346 else
347 fi->signal_handler_caller = 0;
348 }
349}
350
351int
352ppc_linux_frameless_function_invocation (struct frame_info *fi)
353{
354 /* We'll find the wrong thing if we let
355 rs6000_frameless_function_invocation () search for a signal trampoline */
356 if (ppc_linux_at_sigtramp_return_path (fi->pc))
357 return 0;
358 else
359 return rs6000_frameless_function_invocation (fi);
360}
361
362void
363ppc_linux_frame_init_saved_regs (struct frame_info *fi)
364{
365 if (fi->signal_handler_caller)
366 {
367 CORE_ADDR regs_addr;
368 int i;
369 if (fi->saved_regs)
370 return;
371
372 frame_saved_regs_zalloc (fi);
373
374 regs_addr =
375 read_memory_integer (fi->frame + PPC_LINUX_REGS_PTR_OFFSET, 4);
376 fi->saved_regs[PC_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_NIP;
9aa1e687
KB
377 fi->saved_regs[PPC_PS_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_MSR;
378 fi->saved_regs[PPC_CR_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_CCR;
379 fi->saved_regs[PPC_LR_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_LNK;
380 fi->saved_regs[PPC_CTR_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_CTR;
381 fi->saved_regs[PPC_XER_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_XER;
382 fi->saved_regs[PPC_MQ_REGNUM] = regs_addr + 4 * PPC_LINUX_PT_MQ;
c877c8e6 383 for (i = 0; i < 32; i++)
9aa1e687 384 fi->saved_regs[PPC_GP0_REGNUM + i] = regs_addr + 4 * PPC_LINUX_PT_R0 + 4 * i;
c877c8e6
KB
385 for (i = 0; i < 32; i++)
386 fi->saved_regs[FP0_REGNUM + i] = regs_addr + 4 * PPC_LINUX_PT_FPR0 + 8 * i;
387 }
388 else
389 rs6000_frame_init_saved_regs (fi);
390}
391
392CORE_ADDR
393ppc_linux_frame_chain (struct frame_info *thisframe)
394{
395 /* Kernel properly constructs the frame chain for the handler */
396 if (thisframe->signal_handler_caller)
397 return read_memory_integer ((thisframe)->frame, 4);
398 else
399 return rs6000_frame_chain (thisframe);
400}
401
402/* FIXME: Move the following to rs6000-tdep.c (or some other file where
403 it may be used generically by ports which use either the SysV ABI or
404 the EABI */
405
406/* round2 rounds x up to the nearest multiple of s assuming that s is a
407 power of 2 */
408
409#undef round2
410#define round2(x,s) ((((long) (x) - 1) & ~(long)((s)-1)) + (s))
411
412/* Pass the arguments in either registers, or in the stack. Using the
413 ppc sysv ABI, the first eight words of the argument list (that might
414 be less than eight parameters if some parameters occupy more than one
415 word) are passed in r3..r10 registers. float and double parameters are
416 passed in fpr's, in addition to that. Rest of the parameters if any
417 are passed in user stack.
418
419 If the function is returning a structure, then the return address is passed
420 in r3, then the first 7 words of the parametes can be passed in registers,
421 starting from r4. */
422
423CORE_ADDR
fba45db2
KB
424ppc_sysv_abi_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
425 int struct_return, CORE_ADDR struct_addr)
c877c8e6
KB
426{
427 int argno;
428 int greg, freg;
429 int argstkspace;
430 int structstkspace;
431 int argoffset;
432 int structoffset;
433 value_ptr arg;
434 struct type *type;
435 int len;
436 char old_sp_buf[4];
437 CORE_ADDR saved_sp;
438
439 greg = struct_return ? 4 : 3;
440 freg = 1;
441 argstkspace = 0;
442 structstkspace = 0;
443
444 /* Figure out how much new stack space is required for arguments
445 which don't fit in registers. Unlike the PowerOpen ABI, the
446 SysV ABI doesn't reserve any extra space for parameters which
447 are put in registers. */
448 for (argno = 0; argno < nargs; argno++)
449 {
450 arg = args[argno];
451 type = check_typedef (VALUE_TYPE (arg));
452 len = TYPE_LENGTH (type);
453
454 if (TYPE_CODE (type) == TYPE_CODE_FLT)
455 {
456 if (freg <= 8)
457 freg++;
458 else
459 {
460 /* SysV ABI converts floats to doubles when placed in
461 memory and requires 8 byte alignment */
462 if (argstkspace & 0x4)
463 argstkspace += 4;
464 argstkspace += 8;
465 }
466 }
467 else if (TYPE_CODE (type) == TYPE_CODE_INT && len == 8) /* long long */
468 {
469 if (greg > 9)
470 {
471 greg = 11;
472 if (argstkspace & 0x4)
473 argstkspace += 4;
474 argstkspace += 8;
475 }
476 else
477 {
478 if ((greg & 1) == 0)
479 greg++;
480 greg += 2;
481 }
482 }
483 else
484 {
485 if (len > 4
486 || TYPE_CODE (type) == TYPE_CODE_STRUCT
487 || TYPE_CODE (type) == TYPE_CODE_UNION)
488 {
489 /* Rounding to the nearest multiple of 8 may not be necessary,
490 but it is safe. Particularly since we don't know the
491 field types of the structure */
492 structstkspace += round2 (len, 8);
493 }
494 if (greg <= 10)
495 greg++;
496 else
497 argstkspace += 4;
498 }
499 }
500
501 /* Get current SP location */
502 saved_sp = read_sp ();
503
504 sp -= argstkspace + structstkspace;
505
506 /* Allocate space for backchain and callee's saved lr */
507 sp -= 8;
508
509 /* Make sure that we maintain 16 byte alignment */
510 sp &= ~0x0f;
511
512 /* Update %sp before proceeding any further */
513 write_register (SP_REGNUM, sp);
514
515 /* write the backchain */
516 store_address (old_sp_buf, 4, saved_sp);
517 write_memory (sp, old_sp_buf, 4);
518
519 argoffset = 8;
520 structoffset = argoffset + argstkspace;
521 freg = 1;
522 greg = 3;
482ca3f5
KB
523 /* Fill in r3 with the return structure, if any */
524 if (struct_return)
525 {
526 char val_buf[4];
527 store_address (val_buf, 4, struct_addr);
528 memcpy (&registers[REGISTER_BYTE (greg)], val_buf, 4);
529 greg++;
530 }
c877c8e6
KB
531 /* Now fill in the registers and stack... */
532 for (argno = 0; argno < nargs; argno++)
533 {
534 arg = args[argno];
535 type = check_typedef (VALUE_TYPE (arg));
536 len = TYPE_LENGTH (type);
537
538 if (TYPE_CODE (type) == TYPE_CODE_FLT)
539 {
540 if (freg <= 8)
541 {
542 if (len > 8)
543 printf_unfiltered (
544 "Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
545 memcpy (&registers[REGISTER_BYTE (FP0_REGNUM + freg)],
546 VALUE_CONTENTS (arg), len);
547 freg++;
548 }
549 else
550 {
551 /* SysV ABI converts floats to doubles when placed in
552 memory and requires 8 byte alignment */
553 /* FIXME: Convert floats to doubles */
554 if (argoffset & 0x4)
555 argoffset += 4;
556 write_memory (sp + argoffset, (char *) VALUE_CONTENTS (arg), len);
557 argoffset += 8;
558 }
559 }
560 else if (TYPE_CODE (type) == TYPE_CODE_INT && len == 8) /* long long */
561 {
562 if (greg > 9)
563 {
564 greg = 11;
565 if (argoffset & 0x4)
566 argoffset += 4;
567 write_memory (sp + argoffset, (char *) VALUE_CONTENTS (arg), len);
568 argoffset += 8;
569 }
570 else
571 {
572 if ((greg & 1) == 0)
573 greg++;
574
575 memcpy (&registers[REGISTER_BYTE (greg)],
576 VALUE_CONTENTS (arg), 4);
577 memcpy (&registers[REGISTER_BYTE (greg + 1)],
578 VALUE_CONTENTS (arg) + 4, 4);
579 greg += 2;
580 }
581 }
582 else
583 {
584 char val_buf[4];
585 if (len > 4
586 || TYPE_CODE (type) == TYPE_CODE_STRUCT
587 || TYPE_CODE (type) == TYPE_CODE_UNION)
588 {
589 write_memory (sp + structoffset, VALUE_CONTENTS (arg), len);
590 store_address (val_buf, 4, sp + structoffset);
591 structoffset += round2 (len, 8);
592 }
593 else
594 {
595 memset (val_buf, 0, 4);
596 memcpy (val_buf, VALUE_CONTENTS (arg), len);
597 }
598 if (greg <= 10)
599 {
600 *(int *) &registers[REGISTER_BYTE (greg)] = 0;
601 memcpy (&registers[REGISTER_BYTE (greg)], val_buf, 4);
602 greg++;
603 }
604 else
605 {
606 write_memory (sp + argoffset, val_buf, 4);
607 argoffset += 4;
608 }
609 }
610 }
611
612 target_store_registers (-1);
613 return sp;
614}
482ca3f5 615
122a33de
KB
616/* ppc_linux_memory_remove_breakpoints attempts to remove a breakpoint
617 in much the same fashion as memory_remove_breakpoint in mem-break.c,
618 but is careful not to write back the previous contents if the code
619 in question has changed in between inserting the breakpoint and
620 removing it.
621
622 Here is the problem that we're trying to solve...
623
624 Once upon a time, before introducing this function to remove
625 breakpoints from the inferior, setting a breakpoint on a shared
626 library function prior to running the program would not work
627 properly. In order to understand the problem, it is first
628 necessary to understand a little bit about dynamic linking on
629 this platform.
630
631 A call to a shared library function is accomplished via a bl
632 (branch-and-link) instruction whose branch target is an entry
633 in the procedure linkage table (PLT). The PLT in the object
634 file is uninitialized. To gdb, prior to running the program, the
635 entries in the PLT are all zeros.
636
637 Once the program starts running, the shared libraries are loaded
638 and the procedure linkage table is initialized, but the entries in
639 the table are not (necessarily) resolved. Once a function is
640 actually called, the code in the PLT is hit and the function is
641 resolved. In order to better illustrate this, an example is in
642 order; the following example is from the gdb testsuite.
643
644 We start the program shmain.
645
646 [kev@arroyo testsuite]$ ../gdb gdb.base/shmain
647 [...]
648
649 We place two breakpoints, one on shr1 and the other on main.
650
651 (gdb) b shr1
652 Breakpoint 1 at 0x100409d4
653 (gdb) b main
654 Breakpoint 2 at 0x100006a0: file gdb.base/shmain.c, line 44.
655
656 Examine the instruction (and the immediatly following instruction)
657 upon which the breakpoint was placed. Note that the PLT entry
658 for shr1 contains zeros.
659
660 (gdb) x/2i 0x100409d4
661 0x100409d4 <shr1>: .long 0x0
662 0x100409d8 <shr1+4>: .long 0x0
663
664 Now run 'til main.
665
666 (gdb) r
667 Starting program: gdb.base/shmain
668 Breakpoint 1 at 0xffaf790: file gdb.base/shr1.c, line 19.
669
670 Breakpoint 2, main ()
671 at gdb.base/shmain.c:44
672 44 g = 1;
673
674 Examine the PLT again. Note that the loading of the shared
675 library has initialized the PLT to code which loads a constant
676 (which I think is an index into the GOT) into r11 and then
677 branchs a short distance to the code which actually does the
678 resolving.
679
680 (gdb) x/2i 0x100409d4
681 0x100409d4 <shr1>: li r11,4
682 0x100409d8 <shr1+4>: b 0x10040984 <sg+4>
683 (gdb) c
684 Continuing.
685
686 Breakpoint 1, shr1 (x=1)
687 at gdb.base/shr1.c:19
688 19 l = 1;
689
690 Now we've hit the breakpoint at shr1. (The breakpoint was
691 reset from the PLT entry to the actual shr1 function after the
692 shared library was loaded.) Note that the PLT entry has been
693 resolved to contain a branch that takes us directly to shr1.
694 (The real one, not the PLT entry.)
695
696 (gdb) x/2i 0x100409d4
697 0x100409d4 <shr1>: b 0xffaf76c <shr1>
698 0x100409d8 <shr1+4>: b 0x10040984 <sg+4>
699
700 The thing to note here is that the PLT entry for shr1 has been
701 changed twice.
702
703 Now the problem should be obvious. GDB places a breakpoint (a
704 trap instruction) on the zero value of the PLT entry for shr1.
705 Later on, after the shared library had been loaded and the PLT
706 initialized, GDB gets a signal indicating this fact and attempts
707 (as it always does when it stops) to remove all the breakpoints.
708
709 The breakpoint removal was causing the former contents (a zero
710 word) to be written back to the now initialized PLT entry thus
711 destroying a portion of the initialization that had occurred only a
712 short time ago. When execution continued, the zero word would be
713 executed as an instruction an an illegal instruction trap was
714 generated instead. (0 is not a legal instruction.)
715
716 The fix for this problem was fairly straightforward. The function
717 memory_remove_breakpoint from mem-break.c was copied to this file,
718 modified slightly, and renamed to ppc_linux_memory_remove_breakpoint.
719 In tm-linux.h, MEMORY_REMOVE_BREAKPOINT is defined to call this new
720 function.
721
722 The differences between ppc_linux_memory_remove_breakpoint () and
723 memory_remove_breakpoint () are minor. All that the former does
724 that the latter does not is check to make sure that the breakpoint
725 location actually contains a breakpoint (trap instruction) prior
726 to attempting to write back the old contents. If it does contain
727 a trap instruction, we allow the old contents to be written back.
728 Otherwise, we silently do nothing.
729
730 The big question is whether memory_remove_breakpoint () should be
731 changed to have the same functionality. The downside is that more
732 traffic is generated for remote targets since we'll have an extra
733 fetch of a memory word each time a breakpoint is removed.
734
735 For the time being, we'll leave this self-modifying-code-friendly
736 version in ppc-linux-tdep.c, but it ought to be migrated somewhere
737 else in the event that some other platform has similar needs with
738 regard to removing breakpoints in some potentially self modifying
739 code. */
482ca3f5
KB
740int
741ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
742{
743 unsigned char *bp;
744 int val;
745 int bplen;
746 char old_contents[BREAKPOINT_MAX];
747
748 /* Determine appropriate breakpoint contents and size for this address. */
749 bp = BREAKPOINT_FROM_PC (&addr, &bplen);
750 if (bp == NULL)
751 error ("Software breakpoints not implemented for this target.");
752
753 val = target_read_memory (addr, old_contents, bplen);
754
755 /* If our breakpoint is no longer at the address, this means that the
756 program modified the code on us, so it is wrong to put back the
757 old value */
758 if (val == 0 && memcmp (bp, old_contents, bplen) == 0)
759 val = target_write_memory (addr, contents_cache, bplen);
760
761 return val;
762}
This page took 0.108742 seconds and 4 git commands to generate.