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