sun386 host/target/native separation
[deliverable/binutils-gdb.git] / gdb / rs6000-tdep.c
1 /* Target-dependent code for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
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.
10
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.
15
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. */
19
20 #include "defs.h"
21 #include "frame.h"
22 #include "inferior.h"
23 #include "symtab.h"
24 #include "target.h"
25
26 #include <sys/param.h>
27 #include <sys/dir.h>
28 #include <sys/user.h>
29 #include <signal.h>
30 #include <sys/ioctl.h>
31 #include <fcntl.h>
32
33 #include <a.out.h>
34 #include <sys/file.h>
35 #include <sys/stat.h>
36 #include <sys/core.h>
37 #include <sys/ldr.h>
38
39
40 extern struct obstack frame_cache_obstack;
41
42 extern int errno;
43
44 /* Nonzero if we just simulated a single step break. */
45 int one_stepped;
46
47 /* Breakpoint shadows for the single step instructions will be kept here. */
48
49 static struct sstep_breaks {
50 int address;
51 int data;
52 } stepBreaks[2];
53
54 /* Static function prototypes */
55
56 static void
57 add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
58
59 static CORE_ADDR
60 find_toc_address PARAMS ((CORE_ADDR pc));
61
62 static CORE_ADDR
63 branch_dest PARAMS ((int opcode, int instr, CORE_ADDR pc, CORE_ADDR safety));
64
65 static void
66 frame_get_cache_fsr PARAMS ((struct frame_info *fi,
67 struct aix_framedata *fdatap));
68
69 /*
70 * Calculate the destination of a branch/jump. Return -1 if not a branch.
71 */
72 static CORE_ADDR
73 branch_dest (opcode, instr, pc, safety)
74 int opcode;
75 int instr;
76 CORE_ADDR pc;
77 CORE_ADDR safety;
78 {
79 register long offset;
80 CORE_ADDR dest;
81 int immediate;
82 int absolute;
83 int ext_op;
84
85 absolute = (int) ((instr >> 1) & 1);
86
87 switch (opcode) {
88 case 18 :
89 immediate = ((instr & ~3) << 6) >> 6; /* br unconditional */
90
91 case 16 :
92 if (opcode != 18) /* br conditional */
93 immediate = ((instr & ~3) << 16) >> 16;
94 if (absolute)
95 dest = immediate;
96 else
97 dest = pc + immediate;
98 break;
99
100 case 19 :
101 ext_op = (instr>>1) & 0x3ff;
102
103 if (ext_op == 16) /* br conditional register */
104 dest = read_register (LR_REGNUM) & ~3;
105
106 else if (ext_op == 528) /* br cond to count reg */
107 dest = read_register (CTR_REGNUM) & ~3;
108
109 else return -1;
110 break;
111
112 default: return -1;
113 }
114 return (dest < TEXT_SEGMENT_BASE) ? safety : dest;
115 }
116
117
118
119 /* AIX does not support PT_STEP. Simulate it. */
120
121 void
122 single_step (signal)
123 int signal;
124 {
125 #define INSNLEN(OPCODE) 4
126
127 static char breakp[] = BREAKPOINT;
128 int ii, insn, ret, loc;
129 int breaks[2], opcode;
130
131 if (!one_stepped) {
132 loc = read_pc ();
133
134 ret = read_memory (loc, &insn, sizeof (int));
135 if (ret)
136 printf ("Error in single_step()!!\n");
137
138 breaks[0] = loc + INSNLEN(insn);
139 opcode = insn >> 26;
140 breaks[1] = branch_dest (opcode, insn, loc, breaks[0]);
141
142 /* Don't put two breakpoints on the same address. */
143 if (breaks[1] == breaks[0])
144 breaks[1] = -1;
145
146 stepBreaks[1].address = -1;
147
148 for (ii=0; ii < 2; ++ii) {
149
150 /* ignore invalid breakpoint. */
151 if ( breaks[ii] == -1)
152 continue;
153
154 read_memory (breaks[ii], &(stepBreaks[ii].data), sizeof(int));
155
156 ret = write_memory (breaks[ii], breakp, sizeof(int));
157 stepBreaks[ii].address = breaks[ii];
158 }
159
160 one_stepped = 1;
161 } else {
162
163 /* remove step breakpoints. */
164 for (ii=0; ii < 2; ++ii)
165 if (stepBreaks[ii].address != -1)
166 write_memory
167 (stepBreaks[ii].address, &(stepBreaks[ii].data), sizeof(int));
168
169 one_stepped = 0;
170 }
171 errno = 0; /* FIXME, don't ignore errors! */
172 }
173
174
175 /* return pc value after skipping a function prologue. */
176
177 skip_prologue (pc)
178 CORE_ADDR pc;
179 {
180 unsigned int tmp;
181 unsigned int op; /* FIXME, assumes instruction size matches host int!!! */
182
183 if (target_read_memory (pc, (char *)&op, sizeof (op)))
184 return pc; /* Can't access it -- assume no prologue. */
185 SWAP_TARGET_AND_HOST (&op, sizeof (op));
186
187 /* Assume that subsequent fetches can fail with low probability. */
188
189 if (op == 0x7c0802a6) { /* mflr r0 */
190 pc += 4;
191 op = read_memory_integer (pc, 4);
192 }
193
194 if ((op & 0xfc00003e) == 0x7c000026) { /* mfcr Rx */
195 pc += 4;
196 op = read_memory_integer (pc, 4);
197 }
198
199 if ((op & 0xfc000000) == 0x48000000) { /* bl foo, to save fprs??? */
200 pc += 4;
201 op = read_memory_integer (pc, 4);
202
203 /* At this point, make sure this is not a trampoline function
204 (a function that simply calls another functions, and nothing else).
205 If the next is not a nop, this branch was part of the function
206 prologue. */
207
208 if (op == 0x4def7b82 || /* crorc 15, 15, 15 */
209 op == 0x0)
210 return pc - 4; /* don't skip over this branch */
211 }
212
213 if ((op & 0xfc1f0000) == 0xbc010000) { /* stm Rx, NUM(r1) */
214 pc += 4;
215 op = read_memory_integer (pc, 4);
216 }
217
218 while (((tmp = op >> 16) == 0x9001) || /* st r0, NUM(r1) */
219 (tmp == 0x9421) || /* stu r1, NUM(r1) */
220 (op == 0x93e1fffc)) /* st r31,-4(r1) */
221 {
222 pc += 4;
223 op = read_memory_integer (pc, 4);
224 }
225
226 while ((tmp = (op >> 22)) == 0x20f) { /* l r31, ... or */
227 pc += 4; /* l r30, ... */
228 op = read_memory_integer (pc, 4);
229 }
230
231 /* store parameters into stack */
232 while(
233 (op & 0xfc1f0000) == 0xd8010000 || /* stfd Rx,NUM(r1) */
234 (op & 0xfc1f0000) == 0x90010000 || /* st r?, NUM(r1) */
235 (op & 0xfc000000) == 0xfc000000 || /* frsp, fp?, .. */
236 (op & 0xd0000000) == 0xd0000000) /* stfs, fp?, .. */
237 {
238 pc += 4; /* store fpr double */
239 op = read_memory_integer (pc, 4);
240 }
241
242 if (op == 0x603f0000) { /* oril r31, r1, 0x0 */
243 pc += 4; /* this happens if r31 is used as */
244 op = read_memory_integer (pc, 4); /* frame ptr. (gcc does that) */
245
246 tmp = 0;
247 while ((op >> 16) == (0x907f + tmp)) { /* st r3, NUM(r31) */
248 pc += 4; /* st r4, NUM(r31), ... */
249 op = read_memory_integer (pc, 4);
250 tmp += 0x20;
251 }
252 }
253 #if 0
254 /* I have problems with skipping over __main() that I need to address
255 * sometime. Previously, I used to use misc_function_vector which
256 * didn't work as well as I wanted to be. -MGO */
257
258 /* If the first thing after skipping a prolog is a branch to a function,
259 this might be a call to an initializer in main(), introduced by gcc2.
260 We'd like to skip over it as well. Fortunately, xlc does some extra
261 work before calling a function right after a prologue, thus we can
262 single out such gcc2 behaviour. */
263
264
265 if ((op & 0xfc000001) == 0x48000001) { /* bl foo, an initializer function? */
266 op = read_memory_integer (pc+4, 4);
267
268 if (op == 0x4def7b82) { /* cror 0xf, 0xf, 0xf (nop) */
269
270 /* check and see if we are in main. If so, skip over this initializer
271 function as well. */
272
273 tmp = find_pc_misc_function (pc);
274 if (tmp >= 0 && !strcmp (misc_function_vector [tmp].name, "main"))
275 return pc + 8;
276 }
277 }
278 #endif /* 0 */
279
280 return pc;
281 }
282
283
284 /*************************************************************************
285 Support for creating pushind a dummy frame into the stack, and popping
286 frames, etc.
287 *************************************************************************/
288
289 /* The total size of dummy frame is 436, which is;
290
291 32 gpr's - 128 bytes
292 32 fpr's - 256 "
293 7 the rest - 28 "
294 and 24 extra bytes for the callee's link area. The last 24 bytes
295 for the link area might not be necessary, since it will be taken
296 care of by push_arguments(). */
297
298 #define DUMMY_FRAME_SIZE 436
299
300 #define DUMMY_FRAME_ADDR_SIZE 10
301
302 /* Make sure you initialize these in somewhere, in case gdb gives up what it
303 was debugging and starts debugging something else. FIXMEibm */
304
305 static int dummy_frame_count = 0;
306 static int dummy_frame_size = 0;
307 static CORE_ADDR *dummy_frame_addr = 0;
308
309 extern int stop_stack_dummy;
310
311 /* push a dummy frame into stack, save all register. Currently we are saving
312 only gpr's and fpr's, which is not good enough! FIXMEmgo */
313
314 void
315 push_dummy_frame ()
316 {
317 int sp, pc; /* stack pointer and link register */
318 int ii;
319
320 target_fetch_registers (-1);
321
322 if (dummy_frame_count >= dummy_frame_size) {
323 dummy_frame_size += DUMMY_FRAME_ADDR_SIZE;
324 if (dummy_frame_addr)
325 dummy_frame_addr = (CORE_ADDR*) xrealloc
326 (dummy_frame_addr, sizeof(CORE_ADDR) * (dummy_frame_size));
327 else
328 dummy_frame_addr = (CORE_ADDR*)
329 xmalloc (sizeof(CORE_ADDR) * (dummy_frame_size));
330 }
331
332 sp = read_register(SP_REGNUM);
333 pc = read_register(PC_REGNUM);
334
335 dummy_frame_addr [dummy_frame_count++] = sp;
336
337 /* Be careful! If the stack pointer is not decremented first, then kernel
338 thinks he is free to use the space underneath it. And kernel actually
339 uses that area for IPC purposes when executing ptrace(2) calls. So
340 before writing register values into the new frame, decrement and update
341 %sp first in order to secure your frame. */
342
343 write_register (SP_REGNUM, sp-DUMMY_FRAME_SIZE);
344
345 /* gdb relies on the state of current_frame. We'd better update it,
346 otherwise things like do_registers_info() wouldn't work properly! */
347
348 flush_cached_frames ();
349 set_current_frame (create_new_frame (sp-DUMMY_FRAME_SIZE, pc));
350
351 /* save program counter in link register's space. */
352 write_memory (sp+8, &pc, 4);
353
354 /* save all floating point and general purpose registers here. */
355
356 /* fpr's, f0..f31 */
357 for (ii = 0; ii < 32; ++ii)
358 write_memory (sp-8-(ii*8), &registers[REGISTER_BYTE (31-ii+FP0_REGNUM)], 8);
359
360 /* gpr's r0..r31 */
361 for (ii=1; ii <=32; ++ii)
362 write_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
363
364 /* so far, 32*2 + 32 words = 384 bytes have been written.
365 7 extra registers in our register set: pc, ps, cnd, lr, cnt, xer, mq */
366
367 for (ii=1; ii <= (LAST_SP_REGNUM-FIRST_SP_REGNUM+1); ++ii) {
368 write_memory (sp-384-(ii*4),
369 &registers[REGISTER_BYTE (FPLAST_REGNUM + ii)], 4);
370 }
371
372 /* Save sp or so called back chain right here. */
373 write_memory (sp-DUMMY_FRAME_SIZE, &sp, 4);
374 sp -= DUMMY_FRAME_SIZE;
375
376 /* And finally, this is the back chain. */
377 write_memory (sp+8, &pc, 4);
378 }
379
380
381 /* Pop a dummy frame.
382
383 In rs6000 when we push a dummy frame, we save all of the registers. This
384 is usually done before user calls a function explicitly.
385
386 After a dummy frame is pushed, some instructions are copied into stack,
387 and stack pointer is decremented even more. Since we don't have a frame
388 pointer to get back to the parent frame of the dummy, we start having
389 trouble poping it. Therefore, we keep a dummy frame stack, keeping
390 addresses of dummy frames as such. When poping happens and when we
391 detect that was a dummy frame, we pop it back to its parent by using
392 dummy frame stack (`dummy_frame_addr' array).
393
394 FIXME: This whole concept is broken. You should be able to detect
395 a dummy stack frame *on the user's stack itself*. When you do,
396 then you know the format of that stack frame -- including its
397 saved SP register! There should *not* be a separate stack in the
398 GDB process that keeps track of these dummy frames! -- gnu@cygnus.com Aug92
399 */
400
401 pop_dummy_frame ()
402 {
403 CORE_ADDR sp, pc;
404 int ii;
405 sp = dummy_frame_addr [--dummy_frame_count];
406
407 /* restore all fpr's. */
408 for (ii = 1; ii <= 32; ++ii)
409 read_memory (sp-(ii*8), &registers[REGISTER_BYTE (32-ii+FP0_REGNUM)], 8);
410
411 /* restore all gpr's */
412 for (ii=1; ii <= 32; ++ii) {
413 read_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
414 }
415
416 /* restore the rest of the registers. */
417 for (ii=1; ii <=(LAST_SP_REGNUM-FIRST_SP_REGNUM+1); ++ii)
418 read_memory (sp-384-(ii*4),
419 &registers[REGISTER_BYTE (FPLAST_REGNUM + ii)], 4);
420
421 read_memory (sp-(DUMMY_FRAME_SIZE-8),
422 &registers [REGISTER_BYTE(PC_REGNUM)], 4);
423
424 /* when a dummy frame was being pushed, we had to decrement %sp first, in
425 order to secure astack space. Thus, saved %sp (or %r1) value, is not the
426 one we should restore. Change it with the one we need. */
427
428 *(int*)&registers [REGISTER_BYTE(FP_REGNUM)] = sp;
429
430 /* Now we can restore all registers. */
431
432 target_store_registers (-1);
433 pc = read_pc ();
434 flush_cached_frames ();
435 set_current_frame (create_new_frame (sp, pc));
436 }
437
438
439 /* pop the innermost frame, go back to the caller. */
440
441 void
442 pop_frame ()
443 {
444 int pc, lr, sp, prev_sp; /* %pc, %lr, %sp */
445 struct aix_framedata fdata;
446 FRAME fr = get_current_frame ();
447 int addr, ii;
448
449 pc = read_pc ();
450 sp = FRAME_FP (fr);
451
452 if (stop_stack_dummy && dummy_frame_count) {
453 pop_dummy_frame ();
454 return;
455 }
456
457 /* figure out previous %pc value. If the function is frameless, it is
458 still in the link register, otherwise walk the frames and retrieve the
459 saved %pc value in the previous frame. */
460
461 addr = get_pc_function_start (fr->pc) + FUNCTION_START_OFFSET;
462 function_frame_info (addr, &fdata);
463
464 read_memory (sp, &prev_sp, 4);
465 if (fdata.frameless)
466 lr = read_register (LR_REGNUM);
467 else
468 read_memory (prev_sp+8, &lr, 4);
469
470 /* reset %pc value. */
471 write_register (PC_REGNUM, lr);
472
473 /* reset register values if any was saved earlier. */
474 addr = prev_sp - fdata.offset;
475
476 if (fdata.saved_gpr != -1)
477 for (ii=fdata.saved_gpr; ii <= 31; ++ii) {
478 read_memory (addr, &registers [REGISTER_BYTE (ii)], 4);
479 addr += sizeof (int);
480 }
481
482 if (fdata.saved_fpr != -1)
483 for (ii=fdata.saved_fpr; ii <= 31; ++ii) {
484 read_memory (addr, &registers [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
485 addr += 8;
486 }
487
488 write_register (SP_REGNUM, prev_sp);
489 target_store_registers (-1);
490 flush_cached_frames ();
491 set_current_frame (create_new_frame (prev_sp, lr));
492 }
493
494
495 /* fixup the call sequence of a dummy function, with the real function address.
496 its argumets will be passed by gdb. */
497
498 void
499 fix_call_dummy(dummyname, pc, fun, nargs, type)
500 char *dummyname;
501 CORE_ADDR pc;
502 CORE_ADDR fun;
503 int nargs; /* not used */
504 int type; /* not used */
505 {
506 #define TOC_ADDR_OFFSET 20
507 #define TARGET_ADDR_OFFSET 28
508
509 int ii;
510 CORE_ADDR target_addr;
511 CORE_ADDR tocvalue;
512
513 target_addr = fun;
514 tocvalue = find_toc_address (target_addr);
515
516 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET);
517 ii = (ii & 0xffff0000) | (tocvalue >> 16);
518 *(int*)((char*)dummyname + TOC_ADDR_OFFSET) = ii;
519
520 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4);
521 ii = (ii & 0xffff0000) | (tocvalue & 0x0000ffff);
522 *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4) = ii;
523
524 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET);
525 ii = (ii & 0xffff0000) | (target_addr >> 16);
526 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET) = ii;
527
528 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4);
529 ii = (ii & 0xffff0000) | (target_addr & 0x0000ffff);
530 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4) = ii;
531 }
532
533
534 /* return information about a function frame.
535 in struct aix_frameinfo fdata:
536 - frameless is TRUE, if function does not save %pc value in its frame.
537 - offset is the number of bytes used in the frame to save registers.
538 - saved_gpr is the number of the first saved gpr.
539 - saved_fpr is the number of the first saved fpr.
540 - alloca_reg is the number of the register used for alloca() handling.
541 Otherwise -1.
542 */
543 void
544 function_frame_info (pc, fdata)
545 CORE_ADDR pc;
546 struct aix_framedata *fdata;
547 {
548 unsigned int tmp;
549 register unsigned int op;
550
551 fdata->offset = 0;
552 fdata->saved_gpr = fdata->saved_fpr = fdata->alloca_reg = -1;
553
554 op = read_memory_integer (pc, 4);
555 if (op == 0x7c0802a6) { /* mflr r0 */
556 pc += 4;
557 op = read_memory_integer (pc, 4);
558 fdata->frameless = 0;
559 }
560 else /* else, this is a frameless invocation */
561 fdata->frameless = 1;
562
563
564 if ((op & 0xfc00003e) == 0x7c000026) { /* mfcr Rx */
565 pc += 4;
566 op = read_memory_integer (pc, 4);
567 }
568
569 if ((op & 0xfc000000) == 0x48000000) { /* bl foo, to save fprs??? */
570 pc += 4;
571 op = read_memory_integer (pc, 4);
572 /* At this point, make sure this is not a trampoline function
573 (a function that simply calls another functions, and nothing else).
574 If the next is not a nop, this branch was part of the function
575 prologue. */
576
577 if (op == 0x4def7b82 || /* crorc 15, 15, 15 */
578 op == 0x0)
579 return; /* prologue is over */
580 }
581
582 if ((op & 0xfc1f0000) == 0xd8010000) { /* stfd Rx,NUM(r1) */
583 pc += 4; /* store floating register double */
584 op = read_memory_integer (pc, 4);
585 }
586
587 if ((op & 0xfc1f0000) == 0xbc010000) { /* stm Rx, NUM(r1) */
588 int tmp2;
589 fdata->saved_gpr = (op >> 21) & 0x1f;
590 tmp2 = op & 0xffff;
591 if (tmp2 > 0x7fff)
592 tmp2 = 0xffff0000 | tmp2;
593
594 if (tmp2 < 0) {
595 tmp2 = tmp2 * -1;
596 fdata->saved_fpr = (tmp2 - ((32 - fdata->saved_gpr) * 4)) / 8;
597 if ( fdata->saved_fpr > 0)
598 fdata->saved_fpr = 32 - fdata->saved_fpr;
599 else
600 fdata->saved_fpr = -1;
601 }
602 fdata->offset = tmp2;
603 pc += 4;
604 op = read_memory_integer (pc, 4);
605 }
606
607 while (((tmp = op >> 16) == 0x9001) || /* st r0, NUM(r1) */
608 (tmp == 0x9421) || /* stu r1, NUM(r1) */
609 (op == 0x93e1fffc)) /* st r31,-4(r1) */
610 {
611 /* gcc takes a short cut and uses this instruction to save r31 only. */
612
613 if (op == 0x93e1fffc) {
614 if (fdata->offset)
615 /* fatal ("Unrecognized prolog."); */
616 printf ("Unrecognized prolog!\n");
617
618 fdata->saved_gpr = 31;
619 fdata->offset = 4;
620 }
621 pc += 4;
622 op = read_memory_integer (pc, 4);
623 }
624
625 while ((tmp = (op >> 22)) == 0x20f) { /* l r31, ... or */
626 pc += 4; /* l r30, ... */
627 op = read_memory_integer (pc, 4);
628 }
629
630 /* store parameters into stack */
631 while(
632 (op & 0xfc1f0000) == 0xd8010000 || /* stfd Rx,NUM(r1) */
633 (op & 0xfc1f0000) == 0x90010000 || /* st r?, NUM(r1) */
634 (op & 0xfc000000) == 0xfc000000 || /* frsp, fp?, .. */
635 (op & 0xd0000000) == 0xd0000000) /* stfs, fp?, .. */
636 {
637 pc += 4; /* store fpr double */
638 op = read_memory_integer (pc, 4);
639 }
640
641 if (op == 0x603f0000) /* oril r31, r1, 0x0 */
642 fdata->alloca_reg = 31;
643 }
644
645
646 /* Pass the arguments in either registers, or in the stack. In RS6000, the first
647 eight words of the argument list (that might be less than eight parameters if
648 some parameters occupy more than one word) are passed in r3..r11 registers.
649 float and double parameters are passed in fpr's, in addition to that. Rest of
650 the parameters if any are passed in user stack. There might be cases in which
651 half of the parameter is copied into registers, the other half is pushed into
652 stack.
653
654 If the function is returning a structure, then the return address is passed
655 in r3, then the first 7 words of the parametes can be passed in registers,
656 starting from r4. */
657
658 CORE_ADDR
659 push_arguments (nargs, args, sp, struct_return, struct_addr)
660 int nargs;
661 value *args;
662 CORE_ADDR sp;
663 int struct_return;
664 CORE_ADDR struct_addr;
665 {
666 int ii, len;
667 int argno; /* current argument number */
668 int argbytes; /* current argument byte */
669 char tmp_buffer [50];
670 value arg;
671 int f_argno = 0; /* current floating point argno */
672
673 CORE_ADDR saved_sp, pc;
674
675 if ( dummy_frame_count <= 0)
676 printf ("FATAL ERROR -push_arguments()! frame not found!!\n");
677
678 /* The first eight words of ther arguments are passed in registers. Copy
679 them appropriately.
680
681 If the function is returning a `struct', then the first word (which
682 will be passed in r3) is used for struct return address. In that
683 case we should advance one word and start from r4 register to copy
684 parameters. */
685
686 ii = struct_return ? 1 : 0;
687
688 for (argno=0, argbytes=0; argno < nargs && ii<8; ++ii) {
689
690 arg = value_arg_coerce (args[argno]);
691 len = TYPE_LENGTH (VALUE_TYPE (arg));
692
693 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT) {
694
695 /* floating point arguments are passed in fpr's, as well as gpr's.
696 There are 13 fpr's reserved for passing parameters. At this point
697 there is no way we would run out of them. */
698
699 if (len > 8)
700 printf (
701 "Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
702
703 bcopy (VALUE_CONTENTS (arg),
704 &registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], len);
705 ++f_argno;
706 }
707
708 if (len > 4) {
709
710 /* Argument takes more than one register. */
711 while (argbytes < len) {
712
713 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
714 bcopy ( ((char*)VALUE_CONTENTS (arg))+argbytes,
715 &registers[REGISTER_BYTE(ii+3)],
716 (len - argbytes) > 4 ? 4 : len - argbytes);
717 ++ii, argbytes += 4;
718
719 if (ii >= 8)
720 goto ran_out_of_registers_for_arguments;
721 }
722 argbytes = 0;
723 --ii;
724 }
725 else { /* Argument can fit in one register. No problem. */
726 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
727 bcopy (VALUE_CONTENTS (arg), &registers[REGISTER_BYTE(ii+3)], len);
728 }
729 ++argno;
730 }
731
732 ran_out_of_registers_for_arguments:
733
734 /* location for 8 parameters are always reserved. */
735 sp -= 4 * 8;
736
737 /* another six words for back chain, TOC register, link register, etc. */
738 sp -= 24;
739
740 /* if there are more arguments, allocate space for them in
741 the stack, then push them starting from the ninth one. */
742
743 if ((argno < nargs) || argbytes) {
744 int space = 0, jj;
745 value val;
746
747 if (argbytes) {
748 space += ((len - argbytes + 3) & -4);
749 jj = argno + 1;
750 }
751 else
752 jj = argno;
753
754 for (; jj < nargs; ++jj) {
755 val = value_arg_coerce (args[jj]);
756 space += ((TYPE_LENGTH (VALUE_TYPE (val))) + 3) & -4;
757 }
758
759 /* add location required for the rest of the parameters */
760 space = (space + 7) & -8;
761 sp -= space;
762
763 /* This is another instance we need to be concerned about securing our
764 stack space. If we write anything underneath %sp (r1), we might conflict
765 with the kernel who thinks he is free to use this area. So, update %sp
766 first before doing anything else. */
767
768 write_register (SP_REGNUM, sp);
769
770 /* if the last argument copied into the registers didn't fit there
771 completely, push the rest of it into stack. */
772
773 if (argbytes) {
774 write_memory (
775 sp+24+(ii*4), ((char*)VALUE_CONTENTS (arg))+argbytes, len - argbytes);
776 ++argno;
777 ii += ((len - argbytes + 3) & -4) / 4;
778 }
779
780 /* push the rest of the arguments into stack. */
781 for (; argno < nargs; ++argno) {
782
783 arg = value_arg_coerce (args[argno]);
784 len = TYPE_LENGTH (VALUE_TYPE (arg));
785
786
787 /* float types should be passed in fpr's, as well as in the stack. */
788 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT && f_argno < 13) {
789
790 if (len > 8)
791 printf (
792 "Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
793
794 bcopy (VALUE_CONTENTS (arg),
795 &registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], len);
796 ++f_argno;
797 }
798
799 write_memory (sp+24+(ii*4), VALUE_CONTENTS (arg), len);
800 ii += ((len + 3) & -4) / 4;
801 }
802 }
803 else
804 /* Secure stack areas first, before doing anything else. */
805 write_register (SP_REGNUM, sp);
806
807 saved_sp = dummy_frame_addr [dummy_frame_count - 1];
808 read_memory (saved_sp, tmp_buffer, 24);
809 write_memory (sp, tmp_buffer, 24);
810
811 write_memory (sp, &saved_sp, 4); /* set back chain properly */
812
813 target_store_registers (-1);
814 return sp;
815 }
816
817 /* a given return value in `regbuf' with a type `valtype', extract and copy its
818 value into `valbuf' */
819
820 void
821 extract_return_value (valtype, regbuf, valbuf)
822 struct type *valtype;
823 char regbuf[REGISTER_BYTES];
824 char *valbuf;
825 {
826
827 if (TYPE_CODE (valtype) == TYPE_CODE_FLT) {
828
829 double dd; float ff;
830 /* floats and doubles are returned in fpr1. fpr's have a size of 8 bytes.
831 We need to truncate the return value into float size (4 byte) if
832 necessary. */
833
834 if (TYPE_LENGTH (valtype) > 4) /* this is a double */
835 bcopy (&regbuf[REGISTER_BYTE (FP0_REGNUM + 1)], valbuf,
836 TYPE_LENGTH (valtype));
837 else { /* float */
838 bcopy (&regbuf[REGISTER_BYTE (FP0_REGNUM + 1)], &dd, 8);
839 ff = (float)dd;
840 bcopy (&ff, valbuf, sizeof(float));
841 }
842 }
843 else
844 /* return value is copied starting from r3. */
845 bcopy (&regbuf[REGISTER_BYTE (3)], valbuf, TYPE_LENGTH (valtype));
846 }
847
848
849 /* keep structure return address in this variable.
850 FIXME: This is a horrid kludge which should not be allowed to continue
851 living. This only allows a single nested call to a structure-returning
852 function. Come on, guys! -- gnu@cygnus.com, Aug 92 */
853
854 CORE_ADDR rs6000_struct_return_address;
855
856
857 /* Throw away this debugging code. FIXMEmgo. */
858 void
859 print_frame(fram)
860 int fram;
861 {
862 int ii, val;
863 for (ii=0; ii<40; ++ii) {
864 if ((ii % 4) == 0)
865 printf ("\n");
866 val = read_memory_integer (fram + ii * 4, 4);
867 printf ("0x%08x\t", val);
868 }
869 printf ("\n");
870 }
871
872
873
874 /* Indirect function calls use a piece of trampoline code to do context
875 switching, i.e. to set the new TOC table. Skip such code if we are on
876 its first instruction (as when we have single-stepped to here).
877 Result is desired PC to step until, or NULL if we are not in
878 trampoline code. */
879
880 CORE_ADDR
881 skip_trampoline_code (pc)
882 CORE_ADDR pc;
883 {
884 register unsigned int ii, op;
885
886 static unsigned trampoline_code[] = {
887 0x800b0000, /* l r0,0x0(r11) */
888 0x90410014, /* st r2,0x14(r1) */
889 0x7c0903a6, /* mtctr r0 */
890 0x804b0004, /* l r2,0x4(r11) */
891 0x816b0008, /* l r11,0x8(r11) */
892 0x4e800420, /* bctr */
893 0x4e800020, /* br */
894 0
895 };
896
897 for (ii=0; trampoline_code[ii]; ++ii) {
898 op = read_memory_integer (pc + (ii*4), 4);
899 if (op != trampoline_code [ii])
900 return NULL;
901 }
902 ii = read_register (11); /* r11 holds destination addr */
903 pc = read_memory_integer (ii, 4); /* (r11) value */
904 return pc;
905 }
906
907
908 /* Determines whether the function FI has a frame on the stack or not.
909 Called from the FRAMELESS_FUNCTION_INVOCATION macro in tm.h. */
910
911 int
912 frameless_function_invocation (fi)
913 struct frame_info *fi;
914 {
915 CORE_ADDR func_start;
916 struct aix_framedata fdata;
917
918 func_start = get_pc_function_start (fi->pc) + FUNCTION_START_OFFSET;
919
920 /* If we failed to find the start of the function, it is a mistake
921 to inspect the instructions. */
922
923 if (!func_start)
924 return 0;
925
926 function_frame_info (func_start, &fdata);
927 return fdata.frameless;
928 }
929
930
931 /* If saved registers of frame FI are not known yet, read and cache them.
932 &FDATAP contains aix_framedata; TDATAP can be NULL,
933 in which case the framedata are read. */
934
935 static void
936 frame_get_cache_fsr (fi, fdatap)
937 struct frame_info *fi;
938 struct aix_framedata *fdatap;
939 {
940 int ii;
941 CORE_ADDR frame_addr;
942 struct aix_framedata work_fdata;
943
944 if (fi->cache_fsr)
945 return;
946
947 if (fdatap == NULL) {
948 fdatap = &work_fdata;
949 function_frame_info (get_pc_function_start (fi->pc), fdatap);
950 }
951
952 fi->cache_fsr = (struct frame_saved_regs *)
953 obstack_alloc (&frame_cache_obstack, sizeof (struct frame_saved_regs));
954 bzero (fi->cache_fsr, sizeof (struct frame_saved_regs));
955
956 if (fi->prev && fi->prev->frame)
957 frame_addr = fi->prev->frame;
958 else
959 frame_addr = read_memory_integer (fi->frame, 4);
960
961 /* if != -1, fdatap->saved_fpr is the smallest number of saved_fpr.
962 All fpr's from saved_fpr to fp31 are saved right underneath caller
963 stack pointer, starting from fp31 first. */
964
965 if (fdatap->saved_fpr >= 0) {
966 for (ii=31; ii >= fdatap->saved_fpr; --ii)
967 fi->cache_fsr->regs [FP0_REGNUM + ii] = frame_addr - ((32 - ii) * 8);
968 frame_addr -= (32 - fdatap->saved_fpr) * 8;
969 }
970
971 /* if != -1, fdatap->saved_gpr is the smallest number of saved_gpr.
972 All gpr's from saved_gpr to gpr31 are saved right under saved fprs,
973 starting from r31 first. */
974
975 if (fdatap->saved_gpr >= 0)
976 for (ii=31; ii >= fdatap->saved_gpr; --ii)
977 fi->cache_fsr->regs [ii] = frame_addr - ((32 - ii) * 4);
978 }
979
980 /* Return the address of a frame. This is the inital %sp value when the frame
981 was first allocated. For functions calling alloca(), it might be saved in
982 an alloca register. */
983
984 CORE_ADDR
985 frame_initial_stack_address (fi)
986 struct frame_info *fi;
987 {
988 CORE_ADDR tmpaddr;
989 struct aix_framedata fdata;
990 struct frame_info *callee_fi;
991
992 /* if the initial stack pointer (frame address) of this frame is known,
993 just return it. */
994
995 if (fi->initial_sp)
996 return fi->initial_sp;
997
998 /* find out if this function is using an alloca register.. */
999
1000 function_frame_info (get_pc_function_start (fi->pc), &fdata);
1001
1002 /* if saved registers of this frame are not known yet, read and cache them. */
1003
1004 if (!fi->cache_fsr)
1005 frame_get_cache_fsr (fi, &fdata);
1006
1007 /* If no alloca register used, then fi->frame is the value of the %sp for
1008 this frame, and it is good enough. */
1009
1010 if (fdata.alloca_reg < 0) {
1011 fi->initial_sp = fi->frame;
1012 return fi->initial_sp;
1013 }
1014
1015 /* This function has an alloca register. If this is the top-most frame
1016 (with the lowest address), the value in alloca register is good. */
1017
1018 if (!fi->next)
1019 return fi->initial_sp = read_register (fdata.alloca_reg);
1020
1021 /* Otherwise, this is a caller frame. Callee has usually already saved
1022 registers, but there are exceptions (such as when the callee
1023 has no parameters). Find the address in which caller's alloca
1024 register is saved. */
1025
1026 for (callee_fi = fi->next; callee_fi; callee_fi = callee_fi->next) {
1027
1028 if (!callee_fi->cache_fsr)
1029 frame_get_cache_fsr (fi, NULL);
1030
1031 /* this is the address in which alloca register is saved. */
1032
1033 tmpaddr = callee_fi->cache_fsr->regs [fdata.alloca_reg];
1034 if (tmpaddr) {
1035 fi->initial_sp = read_memory_integer (tmpaddr, 4);
1036 return fi->initial_sp;
1037 }
1038
1039 /* Go look into deeper levels of the frame chain to see if any one of
1040 the callees has saved alloca register. */
1041 }
1042
1043 /* If alloca register was not saved, by the callee (or any of its callees)
1044 then the value in the register is still good. */
1045
1046 return fi->initial_sp = read_register (fdata.alloca_reg);
1047 }
1048
1049 /* xcoff_relocate_symtab - hook for symbol table relocation.
1050 also reads shared libraries.. */
1051
1052 xcoff_relocate_symtab (pid)
1053 unsigned int pid;
1054 {
1055 #define MAX_LOAD_SEGS 64 /* maximum number of load segments */
1056
1057 struct ld_info *ldi;
1058 int temp;
1059
1060 ldi = (void *) alloca(MAX_LOAD_SEGS * sizeof (*ldi));
1061
1062 /* According to my humble theory, AIX has some timing problems and
1063 when the user stack grows, kernel doesn't update stack info in time
1064 and ptrace calls step on user stack. That is why we sleep here a little,
1065 and give kernel to update its internals. */
1066
1067 usleep (36000);
1068
1069 errno = 0;
1070 ptrace(PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
1071 MAX_LOAD_SEGS * sizeof(*ldi), ldi);
1072 if (errno) {
1073 perror_with_name ("ptrace ldinfo");
1074 return 0;
1075 }
1076
1077 vmap_ldinfo(ldi);
1078
1079 do {
1080 add_text_to_loadinfo (ldi->ldinfo_textorg, ldi->ldinfo_dataorg);
1081 } while (ldi->ldinfo_next
1082 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
1083
1084 #if 0
1085 /* Now that we've jumbled things around, re-sort them. */
1086 sort_minimal_symbols ();
1087 #endif
1088
1089 /* relocate the exec and core sections as well. */
1090 vmap_exec ();
1091 }
1092 \f
1093 /* Keep an array of load segment information and their TOC table addresses.
1094 This info will be useful when calling a shared library function by hand. */
1095
1096 struct loadinfo {
1097 CORE_ADDR textorg, dataorg;
1098 unsigned long toc_offset;
1099 };
1100
1101 #define LOADINFOLEN 10
1102
1103 /* FIXME Warning -- loadinfotextindex is used for a nefarious purpose by
1104 tm-rs6000.h. */
1105
1106 static struct loadinfo *loadinfo = NULL;
1107 static int loadinfolen = 0;
1108 static int loadinfotocindex = 0;
1109 int loadinfotextindex = 0;
1110
1111
1112 void
1113 xcoff_init_loadinfo ()
1114 {
1115 loadinfotocindex = 0;
1116 loadinfotextindex = 0;
1117
1118 if (loadinfolen == 0) {
1119 loadinfo = (struct loadinfo *)
1120 xmalloc (sizeof (struct loadinfo) * LOADINFOLEN);
1121 loadinfolen = LOADINFOLEN;
1122 }
1123 }
1124
1125
1126 /* FIXME -- this is never called! */
1127 void
1128 free_loadinfo ()
1129 {
1130 if (loadinfo)
1131 free (loadinfo);
1132 loadinfo = NULL;
1133 loadinfolen = 0;
1134 loadinfotocindex = 0;
1135 loadinfotextindex = 0;
1136 }
1137
1138 /* this is called from xcoffread.c */
1139
1140 void
1141 xcoff_add_toc_to_loadinfo (unsigned long tocoff)
1142 {
1143 while (loadinfotocindex >= loadinfolen) {
1144 loadinfolen += LOADINFOLEN;
1145 loadinfo = (struct loadinfo *)
1146 xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
1147 }
1148 loadinfo [loadinfotocindex++].toc_offset = tocoff;
1149 }
1150
1151
1152 static void
1153 add_text_to_loadinfo (textaddr, dataaddr)
1154 CORE_ADDR textaddr;
1155 CORE_ADDR dataaddr;
1156 {
1157 while (loadinfotextindex >= loadinfolen) {
1158 loadinfolen += LOADINFOLEN;
1159 loadinfo = (struct loadinfo *)
1160 xrealloc (loadinfo, sizeof(struct loadinfo) * loadinfolen);
1161 }
1162 loadinfo [loadinfotextindex].textorg = textaddr;
1163 loadinfo [loadinfotextindex].dataorg = dataaddr;
1164 ++loadinfotextindex;
1165 }
1166
1167
1168 /* FIXME: This assumes that the "textorg" and "dataorg" elements
1169 of a member of this array are correlated with the "toc_offset"
1170 element of the same member. But they are sequentially assigned in wildly
1171 different places, and probably there is no correlation. FIXME! */
1172
1173 static CORE_ADDR
1174 find_toc_address (pc)
1175 CORE_ADDR pc;
1176 {
1177 int ii, toc_entry, tocbase = 0;
1178
1179 for (ii=0; ii < loadinfotextindex; ++ii)
1180 if (pc > loadinfo[ii].textorg && loadinfo[ii].textorg > tocbase) {
1181 toc_entry = ii;
1182 tocbase = loadinfo[ii].textorg;
1183 }
1184
1185 return loadinfo[toc_entry].dataorg + loadinfo[toc_entry].toc_offset;
1186 }
This page took 0.054272 seconds and 4 git commands to generate.