* rs6000-pinsn.c, rs6000-tdep.c, rs6000-xdep.c, tm-rs6000.h,
[deliverable/binutils-gdb.git] / gdb / rs6000-tdep.c
1 /* Target-dependent code for GDB, the GNU debugger.
2 Copyright (C) 1986, 1987, 1989, 1991 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 <stdio.h>
21
22 #include "defs.h"
23 #include "param.h"
24 #include "frame.h"
25 #include "inferior.h"
26 #include "symtab.h"
27 #include "target.h"
28
29 #include <sys/param.h>
30 #include <sys/dir.h>
31 #include <sys/user.h>
32 #include <signal.h>
33 #include <sys/ioctl.h>
34 #include <fcntl.h>
35
36 #include <sys/ptrace.h>
37 #include <sys/reg.h>
38
39 #include <a.out.h>
40 #include <sys/file.h>
41 #include <sys/stat.h>
42 #include <sys/core.h>
43
44 extern int errno;
45 extern int attach_flag;
46
47 /* Nonzero if we just simulated a single step break. */
48 int one_stepped;
49
50 #if 0
51
52 /* This is Damon's implementation of single step simulation. It suffers the
53 following program:
54
55 1 main () {
56 2 char buf[10];
57 3 puts ("test");
58 4 strcmp (buf, "test"); puts ("test");
59 5 exit (0);
60 6 }
61
62 You cannot `next' on line 4 in the above program. gdb puts a breakpoint
63 to the return address of `strcmp', and when execution arrives that point,
64 it is still in the line range and gdb attemps to resume it with single
65 steps. At that point the breakpoint at step_resume_break_address (return
66 address of strcmp) and single step's breakpoint mixes up and we end up
67 with a breakpoint which its shadow and itself are identical.
68
69 Fix that problem and use this version. FIXMEmgo.
70 */
71
72
73 static struct sstep_breaks {
74 int address;
75 int data;
76 } tbreak[2];
77
78
79 /*
80 * branch_dest - calculate all places the current instruction may go
81 */
82 static
83 branch_dest(tb)
84 register struct sstep_breaks *tb;
85 {
86 register ulong opcode, iar;
87 long instr;
88 int immediate, absolute;;
89
90 iar = read_pc(); /* current IAR */
91 target_read_memory(iar, &instr, sizeof (instr)); /* current inst */
92
93 opcode = instr >> 26;
94 absolute = instr & 2;
95
96 tb[1].address = -1;
97
98 switch (opcode) {
99 case 0x10: /* branch conditional */
100 immediate = ((instr & ~3) << 16) >> 16;
101
102 /*
103 * two possible locations for next instruction
104 */
105 tb[0].address = iar + 4;
106 tb[1].address = immediate + (absolute ? 0 : iar);
107
108 break;
109
110 case 0x12: /* branch unconditional */
111 immediate = ((instr & ~3) << 6) >> 6;
112
113 /*
114 * only one possible location for next instr
115 */
116 tb[0].address = immediate + (absolute ? 0 : iar);
117
118 break;
119
120 case 0x13: /* branch conditional register */
121 /*
122 * WE NEED TO CHECK THE CR HERE, TO SEE IF THIS IS
123 * REALLY UNCONDITIONAL.
124 */
125 tb++->address = iar + 4;
126
127 switch ((instr >> 1) & 0x3ff) {
128 case 0x10: /* branch conditional register */
129 tb->address = read_register(LR_REGNUM) & ~3;
130 sigtramp_chk(tb); /* return from sig handler? */
131 break;
132
133 case 0x210: /* branch cond to CTR */
134 tb->address = read_register(CTR_REGNUM) & ~3;
135 sigtramp_chk(tb); /* return from sig handler? */
136 break;
137
138 default:
139 /*
140 * not a branch.
141 */
142 tb->address = iar + 4;
143 break;
144 }
145 break;
146
147 default:
148 /*
149 * not a branch, flow proceeds normally
150 */
151 tb->address = iar + 4;
152 break;
153 }
154 }
155
156 /*
157 * sigtramp_chk - heuristic check to see if we think we are returning
158 * from a signal handler.
159 *
160 * Input:
161 * tb - ^ to a single step branch location
162 *
163 * Note:
164 * When we are at the "br" instruction returning to a signal handler,
165 * we return in user mode to an address in the kernel. If the
166 * segment of the branch target is 0, we may very well be in a
167 * signal handler. From scrounging through this code, we note that
168 * register 29 has the signal context pointer, from which we can
169 * determine where we will end up next.
170 */
171 sigtramp_chk(tb)
172 register struct sstep_breaks *tb; {
173 struct sigcontext sc;
174
175 if (tb->address & 0xf0000000)
176 return; /* can't have been sigtramp */
177
178 if (target_read_memory(read_register(GPR29), &sc, sizeof (sc)))
179 return; /* read fails, heuristic fails */
180
181 if ((sc.sc_jmpbuf.jmp_context.iar & 0xf0000000) == 0x10000000) {
182 /*
183 * looks like it might be ok.....
184 */
185 tb->address = sc.sc_jmpbuf.jmp_context.iar;
186 }
187 }
188
189
190 /*
191 * single_step - no trace mode harware support, or software support.
192 * sigh.
193 */
194 single_step(signal) {
195 register i;
196
197 if (!one_stepped) {
198 /*
199 * need to set breakpoints for single step.
200 * figure out all places the current instruction could go.
201 */
202 branch_dest(&tbreak[0]);
203
204 /*
205 * always at least one place to go to
206 */
207 target_insert_breakpoint(tbreak[0].address, &tbreak[0].data);
208
209 /*
210 * if there is another possible location, set a breakpoint there
211 * as well.
212 */
213 if (tbreak[1].address != -1)
214 target_insert_breakpoint(tbreak[1].address, &tbreak[1].data);
215
216 one_stepped = 1;
217 ptrace(PT_CONTINUE, inferior_pid, 1, signal, 0);
218 } else {
219 /*
220 * need to clear the breakpoints.
221 */
222 for (i = 0; i < 2; ++i)
223 if (tbreak[i].address != -1)
224 target_remove_breakpoint(tbreak[i].address, &tbreak[i].data);
225
226 one_stepped = 0;
227 }
228
229 return 1;
230 }
231
232 #else /* !DAMON'S VERSION */
233
234 /* Breakpoint shadows for the single step instructions will be kept here. */
235
236 static struct sstep_breaks {
237 int address;
238 int data;
239 } stepBreaks[2];
240
241
242 /*
243 * Calculate the destination of a branch/jump. Return -1 if not a branch.
244 */
245 static int
246 branch_dest (opcode, instr, pc, safety)
247 int opcode, instr, pc, safety;
248 {
249 register long offset;
250 unsigned dest;
251 int immediate;
252 int absolute;
253 int ext_op;
254
255 absolute = (int) ((instr >> 1) & 1);
256
257 switch (opcode) {
258 case 18 :
259 immediate = ((instr & ~3) << 6) >> 6; /* br unconditionl */
260
261 case 16 :
262 if (opcode != 18) /* br conditional */
263 immediate = ((instr & ~3) << 16) >> 16;
264 if (absolute)
265 dest = immediate;
266 else
267 dest = pc + immediate;
268 break;
269
270 case 19 :
271 ext_op = (instr>>1) & 0x3ff;
272
273 if (ext_op == 16) /* br conditional register */
274 dest = read_register (LR_REGNUM) & ~3;
275
276 else if (ext_op == 528) /* br cond to count reg */
277 dest = read_register (CTR_REGNUM) & ~3;
278
279 else return -1;
280 break;
281
282 default: return -1;
283 }
284 return (dest < 0x10000000) ? safety : dest;
285 }
286
287
288
289 /* AIX does not support PT_STEP. Simulate it. */
290
291 int
292 single_step (signal)
293 int signal;
294 {
295 #define INSNLEN(OPCODE) 4
296
297 static char breakp[] = BREAKPOINT;
298 int ii, insn, ret, loc;
299 int breaks[2], opcode;
300
301 if (!one_stepped) {
302 extern CORE_ADDR text_start;
303 loc = read_pc ();
304
305 ret = read_memory (loc, &insn, sizeof (int));
306 if (ret)
307 printf ("Error in single_step()!!\n");
308
309 breaks[0] = loc + INSNLEN(insn);
310 opcode = insn >> 26;
311 breaks[1] = branch_dest (opcode, insn, loc, breaks[0]);
312
313 stepBreaks[1].address = -1;
314
315 for (ii=0; ii < 2; ++ii) {
316
317 /* ignore invalid breakpoint. */
318 if ( breaks[ii] == -1)
319 continue;
320
321 read_memory (breaks[ii], &(stepBreaks[ii].data), sizeof(int));
322
323 ret = write_memory (breaks[ii], breakp, sizeof(int));
324 stepBreaks[ii].address = breaks[ii];
325 }
326
327 one_stepped = 1;
328 ptrace (PT_CONTINUE, inferior_pid, 1, signal);
329 }
330 else {
331
332 /* remove step breakpoints. */
333 for (ii=0; ii < 2; ++ii)
334 if (stepBreaks[ii].address != -1)
335 write_memory
336 (stepBreaks[ii].address, &(stepBreaks[ii].data), sizeof(int));
337
338 one_stepped = 0;
339 }
340 return 1;
341 }
342 #endif /* !DAMON's version of single step. */
343
344
345
346 /* return pc value after skipping a function prologue. */
347
348 skip_prologue (pc)
349 int pc;
350 {
351 unsigned int tmp;
352 unsigned int op;
353
354 if (target_read_memory (pc, (char *)&op, sizeof (op)))
355 return pc; /* Can't access it -- assume no prologue. */
356 SWAP_TARGET_AND_HOST (&op, sizeof (op));
357
358 /* Assume that subsequent fetches can fail with low probability. */
359
360 if (op == 0x7c0802a6) { /* mflr r0 */
361 pc += 4;
362 op = read_memory_integer (pc, 4);
363 }
364 else /* else, this is a frameless invocation */
365 return pc;
366
367 if ((op & 0xfc00003e) == 0x7c000026) { /* mfcr Rx */
368 pc += 4;
369 op = read_memory_integer (pc, 4);
370 }
371
372 if ((op & 0xfc000000) == 0x48000000) { /* bl foo, to save fprs??? */
373 pc += 4;
374 op = read_memory_integer (pc, 4);
375 }
376
377 if ((op & 0xfc1f0000) == 0xd8010000) { /* stfd Rx,NUM(r1) */
378 pc += 4; /* store floating register double */
379 op = read_memory_integer (pc, 4);
380 }
381
382 if ((op & 0xfc1f0000) == 0xbc010000) { /* stm Rx, NUM(r1) */
383 pc += 4;
384 op = read_memory_integer (pc, 4);
385 }
386
387 while (((tmp = op >> 16) == 0x9001) || /* st r0, NUM(r1) */
388 (tmp == 0x9421) || /* stu r1, NUM(r1) */
389 (op == 0x93e1fffc)) /* st r31,-4(r1) */
390 {
391 pc += 4;
392 op = read_memory_integer (pc, 4);
393 }
394
395 while ((tmp = (op >> 22)) == 0x20f) { /* l r31, ... or */
396 pc += 4; /* l r30, ... */
397 op = read_memory_integer (pc, 4);
398 }
399
400 while ((op & 0xfc1f0000) == 0x90010000) { /* st r?, NUM(r1) */
401 pc += 4;
402 op = read_memory_integer (pc, 4);
403 }
404
405 if (op == 0x603f0000) { /* oril r31, r1, 0x0 */
406 pc += 4; /* this happens if r31 is used as */
407 op = read_memory_integer (pc, 4); /* frame ptr. (gcc does that) */
408
409 if ((op >> 16) == 0x907f) { /* st r3, NUM(r31) */
410 pc += 4;
411 op = read_memory_integer (pc, 4);
412 }
413 }
414 return pc;
415 }
416
417 /* text start and end addresses in virtual memory. */
418
419 CORE_ADDR text_start;
420 CORE_ADDR text_end;
421
422
423 /*************************************************************************
424 Support for creating pushind a dummy frame into the stack, and popping
425 frames, etc.
426 *************************************************************************/
427
428 #define DUMMY_FRAME_ADDR_SIZE 10
429
430 /* Make sure you initialize these in somewhere, in case gdb gives up what it
431 was debugging and starts debugging something else. FIXMEmgo */
432
433 static int dummy_frame_count = 0;
434 static int dummy_frame_size = 0;
435 static CORE_ADDR *dummy_frame_addr = 0;
436
437 extern int stop_stack_dummy;
438
439 /* push a dummy frame into stack, save all register. Currently we are saving
440 only gpr's and fpr's, which is not good enough! FIXMEmgo */
441
442 push_dummy_frame ()
443 {
444 int sp, pc; /* stack pointer and link register */
445 int ii;
446
447 if (dummy_frame_count >= dummy_frame_size) {
448 dummy_frame_size += DUMMY_FRAME_ADDR_SIZE;
449 if (dummy_frame_addr)
450 dummy_frame_addr = (CORE_ADDR*) xrealloc
451 (dummy_frame_addr, sizeof(CORE_ADDR) * (dummy_frame_size));
452 else
453 dummy_frame_addr = (CORE_ADDR*)
454 xmalloc (sizeof(CORE_ADDR) * (dummy_frame_size));
455 }
456
457 sp = read_register(SP_REGNUM);
458 pc = read_register(PC_REGNUM);
459
460 dummy_frame_addr [dummy_frame_count++] = sp;
461
462 /* Be careful! If the stack pointer is not decremented first, then kernel
463 thinks he is free to use the sapce underneath it. And kernel actually
464 uses that area for IPC purposes when executing ptrace(2) calls. So
465 before writing register values into the new frame, decrement and update
466 %sp first in order to secure your frame. */
467
468 write_register (SP_REGNUM, sp-408);
469
470 #if 1
471 /* gdb relies on the state of current_frame. We'd better update it,
472 otherwise things like do_registers_info() wouldn't work properly! */
473
474 flush_cached_frames ();
475 set_current_frame (create_new_frame (sp-408, pc));
476 #endif /* 0 */
477
478 /* save program counter in link register's space. */
479 write_memory (sp+8, &pc, 4);
480
481 /* save full floating point registers here. They will be from F14..F31
482 for know. I am not sure if we need to save everything here! */
483
484 /* fpr's, f0..f31 */
485 for (ii = 0; ii < 32; ++ii)
486 write_memory (sp-8-(ii*8), &registers[REGISTER_BYTE (31-ii+FP0_REGNUM)], 8);
487
488 /* gpr's r0..r31 */
489 for (ii=1; ii <=32; ++ii)
490 write_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
491
492 /* so far, 32*2 + 32 words = 384 bytes have been written. We need 6 words
493 (24 bytes) for the rest of the registers. It brings the total to 408
494 bytes.
495 save sp or so call back chain right here. */
496 write_memory (sp-408, &sp, 4);
497 sp -= 408;
498
499 /* And finally, this is the back chain. */
500 write_memory (sp+8, &pc, 4);
501 }
502
503
504 /* Pop a dummy frame.
505
506 In rs6000 when we push a dummy frame, we save all of the registers. This
507 is usually done before user calls a function explicitly.
508
509 After a dummy frame is pushed, some instructions are copied into stack, and
510 stack pointer is decremented even more. Since we don't have a frame pointer to
511 get back to the parent frame of the dummy, we start having trouble poping it.
512 Therefore, we keep a dummy frame stack, keeping addresses of dummy frames as
513 such. When poping happens and when we detect that was a dummy frame, we pop
514 it back to its parent by using dummy frame stack (`dummy_frame_addr' array).
515 */
516
517 pop_dummy_frame ()
518 {
519 CORE_ADDR sp, pc;
520 int ii;
521 sp = dummy_frame_addr [--dummy_frame_count];
522
523 /* restore all fpr's. */
524 for (ii = 1; ii <= 32; ++ii)
525 read_memory (sp-(ii*8), &registers[REGISTER_BYTE (32-ii+FP0_REGNUM)], 8);
526
527 /* restore all gpr's */
528 for (ii=1; ii <= 32; ++ii) {
529 read_memory (sp-256-(ii*4), &registers[REGISTER_BYTE (32-ii)], 4);
530 }
531
532 read_memory (sp-400, &registers [REGISTER_BYTE(PC_REGNUM)], 4);
533
534 /* when a dummy frame was being pushed, we had to decrement %sp first, in
535 order to secure astack space. Thus, saved %sp (or %r1) value, is not the
536 one we should restore. Change it with the one we need. */
537
538 *(int*)&registers [REGISTER_BYTE(FP_REGNUM)] = sp;
539
540 /* Now we can restore all registers. */
541
542 store_inferior_registers (-1);
543 pc = read_pc ();
544 flush_cached_frames ();
545 set_current_frame (create_new_frame (sp, pc));
546 }
547
548
549 /* pop the innermost frame, go back to the caller. */
550
551 pop_frame ()
552 {
553 int pc, lr, sp, prev_sp; /* %pc, %lr, %sp */
554 FRAME fr = get_current_frame ();
555 int offset = 0;
556 int frameless = 0; /* TRUE if function is frameless */
557 int addr, ii;
558 int saved_gpr, saved_fpr; /* # of saved gpr's and fpr's */
559
560 pc = read_pc ();
561 sp = FRAME_FP (fr);
562
563 if (stop_stack_dummy && dummy_frame_count) {
564 pop_dummy_frame ();
565 return;
566 }
567
568 /* figure out previous %pc value. If the function is frameless, it is
569 still in the link register, otherwise walk the frames and retrieve the
570 saved %pc value in the previous frame. */
571
572 addr = get_pc_function_start (fr->pc) + FUNCTION_START_OFFSET;
573 function_frame_info (addr, &frameless, &offset, &saved_gpr, &saved_fpr);
574
575 read_memory (sp, &prev_sp, 4);
576 if (frameless)
577 lr = read_register (LR_REGNUM);
578 else
579 read_memory (prev_sp+8, &lr, 4);
580
581 /* reset %pc value. */
582 write_register (PC_REGNUM, lr);
583
584 /* reset register values if any was saved earlier. */
585 addr = prev_sp - offset;
586
587 if (saved_gpr != -1)
588 for (ii=saved_gpr; ii <= 31; ++ii) {
589 read_memory (addr, &registers [REGISTER_BYTE (ii)], 4);
590 addr += sizeof (int);
591 }
592
593 if (saved_fpr != -1)
594 for (ii=saved_fpr; ii <= 31; ++ii) {
595 read_memory (addr, &registers [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
596 addr += 8;
597 }
598
599 write_register (SP_REGNUM, prev_sp);
600 store_inferior_registers (-1);
601 flush_cached_frames ();
602 set_current_frame (create_new_frame (prev_sp, lr));
603 }
604
605
606 /* fixup the call sequence of a dummy function, with the real function address.
607 its argumets will be passed by gdb. */
608
609 fix_call_dummy(dummyname, pc, fun, nargs, type)
610 char *dummyname;
611 int pc;
612 int fun;
613 int nargs; /* not used */
614 int type; /* not used */
615
616 {
617 #define TOC_ADDR_OFFSET 20
618 #define TARGET_ADDR_OFFSET 28
619
620 int ii;
621 unsigned long target_addr;
622 unsigned long tocvalue;
623
624 target_addr = fun;
625 tocvalue = find_toc_address (target_addr);
626
627 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET);
628 ii = (ii & 0xffff0000) | (tocvalue >> 16);
629 *(int*)((char*)dummyname + TOC_ADDR_OFFSET) = ii;
630
631 ii = *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4);
632 ii = (ii & 0xffff0000) | (tocvalue & 0x0000ffff);
633 *(int*)((char*)dummyname + TOC_ADDR_OFFSET+4) = ii;
634
635 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET);
636 ii = (ii & 0xffff0000) | (target_addr >> 16);
637 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET) = ii;
638
639 ii = *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4);
640 ii = (ii & 0xffff0000) | (target_addr & 0x0000ffff);
641 *(int*)((char*)dummyname + TARGET_ADDR_OFFSET+4) = ii;
642 }
643
644
645
646 /* return information about a function frame.
647 - frameless is TRUE, if function does not save %pc value in its frame.
648 - offset is the number of bytes used in the frame to save registers.
649 - saved_gpr is the number of the first saved gpr.
650 - saved_fpr is the number of the first saved fpr.
651 */
652 function_frame_info (pc, frameless, offset, saved_gpr, saved_fpr)
653 int pc;
654 int *frameless, *offset, *saved_gpr, *saved_fpr;
655 {
656 unsigned int tmp;
657 register unsigned int op;
658
659 *offset = 0;
660 *saved_gpr = *saved_fpr = -1;
661
662 if (!inferior_pid)
663 return;
664
665 op = read_memory_integer (pc, 4);
666 if (op == 0x7c0802a6) { /* mflr r0 */
667 pc += 4;
668 op = read_memory_integer (pc, 4);
669 *frameless = 0;
670 }
671 else /* else, this is a frameless invocation */
672 *frameless = 1;
673
674
675 if ((op & 0xfc00003e) == 0x7c000026) { /* mfcr Rx */
676 pc += 4;
677 op = read_memory_integer (pc, 4);
678 }
679
680 if ((op & 0xfc000000) == 0x48000000) { /* bl foo, to save fprs??? */
681 pc += 4;
682 op = read_memory_integer (pc, 4);
683 }
684
685 if ((op & 0xfc1f0000) == 0xd8010000) { /* stfd Rx,NUM(r1) */
686 pc += 4; /* store floating register double */
687 op = read_memory_integer (pc, 4);
688 }
689
690 if ((op & 0xfc1f0000) == 0xbc010000) { /* stm Rx, NUM(r1) */
691 int tmp2;
692 *saved_gpr = (op >> 21) & 0x1f;
693 tmp2 = op & 0xffff;
694 if (tmp2 > 0x7fff)
695 tmp2 = 0xffff0000 | tmp2;
696
697 if (tmp2 < 0) {
698 tmp2 = tmp2 * -1;
699 *saved_fpr = (tmp2 - ((32 - *saved_gpr) * 4)) / 8;
700 if ( *saved_fpr > 0)
701 *saved_fpr = 32 - *saved_fpr;
702 else
703 *saved_fpr = -1;
704 }
705 *offset = tmp2;
706 }
707 }
708
709
710 /* Pass the arguments in either registers, or in the stack. In RS6000, the first
711 eight words of the argument list (that might be less than eight parameters if
712 some parameters occupy more than one word) are passed in r3..r11 registers.
713 float and double parameters are passed in fpr's, in addition to that. Rest of
714 the parameters if any are passed in user stack. There might be cases in which
715 half of the parameter is copied into registers, the other half is pushed into
716 stack.
717
718 If the function is returning a structure, then the return address is passed
719 in r3, then the first 7 words of the parametes can be passed in registers,
720 starting from r4. */
721
722 CORE_ADDR
723 push_arguments (nargs, args, sp, struct_return, struct_addr)
724 int nargs;
725 value *args;
726 CORE_ADDR sp;
727 int struct_return;
728 CORE_ADDR struct_addr;
729 {
730 int ii, len;
731 int argno; /* current argument number */
732 int argbytes; /* current argument byte */
733 char tmp_buffer [50];
734 value arg;
735 int f_argno = 0; /* current floating point argno */
736
737 CORE_ADDR saved_sp, pc;
738
739 if ( dummy_frame_count <= 0)
740 printf ("FATAL ERROR -push_arguments()! frame not found!!\n");
741
742 /* The first eight words of ther arguments are passed in registers. Copy
743 them appropriately.
744
745 If the function is returning a `struct', then the first word (which
746 will be passed in r3) is used for struct return address. In that
747 case we should advance one word and start from r4 register to copy
748 parameters. */
749
750 ii = struct_return ? 1 : 0;
751
752 for (argno=0, argbytes=0; argno < nargs && ii<8; ++ii) {
753
754 arg = value_arg_coerce (args[argno]);
755 len = TYPE_LENGTH (VALUE_TYPE (arg));
756
757 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT) {
758
759 /* floating point arguments are passed in fpr's, as well as gpr's.
760 There are 13 fpr's reserved for passing parameters. At this point
761 there is no way we would run out of them. */
762
763 if (len > 8)
764 printf (
765 "Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
766
767 bcopy (VALUE_CONTENTS (arg),
768 &registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], len);
769 ++f_argno;
770 }
771
772 if (len > 4) {
773
774 /* Argument takes more than one register. */
775 while (argbytes < len) {
776
777 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
778 bcopy ( ((char*)VALUE_CONTENTS (arg))+argbytes,
779 &registers[REGISTER_BYTE(ii+3)],
780 (len - argbytes) > 4 ? 4 : len - argbytes);
781 ++ii, argbytes += 4;
782
783 if (ii >= 8)
784 goto ran_out_of_registers_for_arguments;
785 }
786 argbytes = 0;
787 --ii;
788 }
789 else { /* Argument can fit in one register. No problem. */
790 *(int*)&registers[REGISTER_BYTE(ii+3)] = 0;
791 bcopy (VALUE_CONTENTS (arg), &registers[REGISTER_BYTE(ii+3)], len);
792 }
793 ++argno;
794 }
795
796 ran_out_of_registers_for_arguments:
797
798 /* location for 8 parameters are always reserved. */
799 sp -= 4 * 8;
800
801 /* another six words for back chain, TOC register, link register, etc. */
802 sp -= 24;
803
804 /* if there are more arguments, allocate space for them in
805 the stack, then push them starting from the ninth one. */
806
807 if ((argno < nargs) || argbytes) {
808 int space = 0, jj;
809 value val;
810
811 if (argbytes) {
812 space += ((len - argbytes + 3) & -4);
813 jj = argno + 1;
814 }
815 else
816 jj = argno;
817
818 for (; jj < nargs; ++jj) {
819 val = value_arg_coerce (args[jj]);
820 space += ((TYPE_LENGTH (VALUE_TYPE (val))) + 3) & -4;
821 }
822
823 /* add location required for the rest of the parameters */
824 space = (space + 7) & -8;
825 sp -= space;
826
827 /* This is another instance we need to be concerned about securing our
828 stack space. If we write anything underneath %sp (r1), we might conflict
829 with the kernel who thinks he is free to use this area. So, update %sp
830 first before doing anything else. */
831
832 write_register (SP_REGNUM, sp);
833
834 #if 0
835 pc = read_pc ();
836 flush_cached_frames ();
837 set_current_frame (create_new_frame (sp, pc));
838 #endif
839
840 /* if the last argument copied into the registers didn't fit there
841 completely, push the rest of it into stack. */
842
843 if (argbytes) {
844 write_memory (
845 sp+24+(ii*4), ((char*)VALUE_CONTENTS (arg))+argbytes, len - argbytes);
846 ++argno;
847 ii += ((len - argbytes + 3) & -4) / 4;
848 }
849
850 /* push the rest of the arguments into stack. */
851 for (; argno < nargs; ++argno) {
852
853 arg = value_arg_coerce (args[argno]);
854 len = TYPE_LENGTH (VALUE_TYPE (arg));
855
856
857 /* float types should be passed in fpr's, as well as in the stack. */
858 if (TYPE_CODE (VALUE_TYPE (arg)) == TYPE_CODE_FLT && f_argno < 13) {
859
860 if (len > 8)
861 printf (
862 "Fatal Error: a floating point parameter #%d with a size > 8 is found!\n", argno);
863
864 bcopy (VALUE_CONTENTS (arg),
865 &registers[REGISTER_BYTE(FP0_REGNUM + 1 + f_argno)], len);
866 ++f_argno;
867 }
868
869 write_memory (sp+24+(ii*4), VALUE_CONTENTS (arg), len);
870 ii += ((len + 3) & -4) / 4;
871 }
872 }
873 else {
874
875 /* Secure stack areas first, before doing anything else. */
876 write_register (SP_REGNUM, sp);
877
878 #if 0
879 pc = read_pc ();
880 flush_cached_frames ();
881 set_current_frame (create_new_frame (sp, pc));
882 #endif
883 }
884
885 saved_sp = dummy_frame_addr [dummy_frame_count - 1];
886 read_memory (saved_sp, tmp_buffer, 24);
887 write_memory (sp, tmp_buffer, 24);
888
889 write_memory (sp, &saved_sp, 4); /* set back chain properly */
890
891 store_inferior_registers (-1);
892 return sp;
893 }
894
895 /* a given return value in `regbuf' with a type `valtype', extract and copy its
896 value into `valbuf' */
897
898 extract_return_value (valtype, regbuf, valbuf)
899 struct type *valtype;
900 char regbuf[REGISTER_BYTES];
901 char *valbuf;
902 {
903
904 if (TYPE_CODE (valtype) == TYPE_CODE_FLT) {
905
906 double dd; float ff;
907 /* floats and doubles are returned in fpr1. fpr's have a size of 8 bytes.
908 We need to truncate the return value into float size (4 byte) if
909 necessary. */
910
911 if (TYPE_LENGTH (valtype) > 4) /* this is a double */
912 bcopy (&regbuf[REGISTER_BYTE (FP0_REGNUM + 1)], valbuf,
913 TYPE_LENGTH (valtype));
914 else { /* float */
915 bcopy (&regbuf[REGISTER_BYTE (FP0_REGNUM + 1)], &dd, 8);
916 ff = (float)dd;
917 bcopy (&ff, valbuf, sizeof(float));
918 }
919 }
920 else
921 /* return value is copied starting from r3. */
922 bcopy (&regbuf[REGISTER_BYTE (3)], valbuf, TYPE_LENGTH (valtype));
923 }
924
925
926 /* keep keep structure return address in this variable. */
927
928 CORE_ADDR rs6000_struct_return_address;
929
930
931 /* Throw away this debugging code. FIXMEmgo. */
932 print_frame(fram)
933 int fram;
934 {
935 int ii, val;
936 for (ii=0; ii<40; ++ii) {
937 if ((ii % 4) == 0)
938 printf ("\n");
939 val = read_memory_integer (fram + ii * 4, 4);
940 printf ("0x%08x\t", val);
941 }
942 printf ("\n");
943 }
944
945
946
947 /* Indirect function calls use a piece of trampoline code do co context switching,
948 i.e. to set the new TOC table. Skip such code if exists. */
949
950 skip_trampoline_code (pc)
951 int pc;
952 {
953 register unsigned int ii, op;
954
955 static unsigned trampoline_code[] = {
956 0x800b0000, /* l r0,0x0(r11) */
957 0x90410014, /* st r2,0x14(r1) */
958 0x7c0903a6, /* mtctr r0 */
959 0x804b0004, /* l r2,0x4(r11) */
960 0x816b0008, /* l r11,0x8(r11) */
961 0x4e800420, /* bctr */
962 0x4e800020, /* br */
963 0
964 };
965
966 for (ii=0; trampoline_code[ii]; ++ii) {
967 op = read_memory_integer (pc + (ii*4), 4);
968 if (op != trampoline_code [ii])
969 return NULL;
970 }
971 ii = read_register (11); /* r11 holds destination addr */
972 pc = read_memory_integer (ii, 4); /* (r11) value */
973 return pc;
974 }
975
This page took 0.050231 seconds and 4 git commands to generate.