sun386 host/target/native separation
[deliverable/binutils-gdb.git] / gdb / rs6000-tdep.c
CommitLineData
41abdfbd 1/* Target-dependent code for GDB, the GNU debugger.
ecf4059f 2 Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
41abdfbd
JG
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
41abdfbd 20#include "defs.h"
41abdfbd
JG
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
41abdfbd
JG
33#include <a.out.h>
34#include <sys/file.h>
35#include <sys/stat.h>
36#include <sys/core.h>
ecf4059f 37#include <sys/ldr.h>
41abdfbd 38
d6434f39
JG
39
40extern struct obstack frame_cache_obstack;
41
41abdfbd 42extern int errno;
41abdfbd
JG
43
44/* Nonzero if we just simulated a single step break. */
45int one_stepped;
46
41abdfbd
JG
47/* Breakpoint shadows for the single step instructions will be kept here. */
48
49static struct sstep_breaks {
50 int address;
51 int data;
52} stepBreaks[2];
53
ecf4059f
JG
54/* Static function prototypes */
55
56static void
57add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
58
59static CORE_ADDR
60find_toc_address PARAMS ((CORE_ADDR pc));
61
62static CORE_ADDR
63branch_dest PARAMS ((int opcode, int instr, CORE_ADDR pc, CORE_ADDR safety));
64
65static void
66frame_get_cache_fsr PARAMS ((struct frame_info *fi,
67 struct aix_framedata *fdatap));
41abdfbd
JG
68
69/*
70 * Calculate the destination of a branch/jump. Return -1 if not a branch.
71 */
ecf4059f 72static CORE_ADDR
41abdfbd 73branch_dest (opcode, instr, pc, safety)
ecf4059f
JG
74 int opcode;
75 int instr;
76 CORE_ADDR pc;
77 CORE_ADDR safety;
41abdfbd
JG
78{
79 register long offset;
ecf4059f 80 CORE_ADDR dest;
41abdfbd
JG
81 int immediate;
82 int absolute;
83 int ext_op;
84
85 absolute = (int) ((instr >> 1) & 1);
86
87 switch (opcode) {
88 case 18 :
ecf4059f 89 immediate = ((instr & ~3) << 6) >> 6; /* br unconditional */
41abdfbd
JG
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 }
818de002 114 return (dest < TEXT_SEGMENT_BASE) ? safety : dest;
41abdfbd
JG
115}
116
117
118
119/* AIX does not support PT_STEP. Simulate it. */
120
997cc2c0 121void
41abdfbd 122single_step (signal)
997cc2c0 123 int signal;
41abdfbd
JG
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) {
41abdfbd
JG
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
818de002
PB
142 /* Don't put two breakpoints on the same address. */
143 if (breaks[1] == breaks[0])
144 breaks[1] = -1;
145
41abdfbd
JG
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;
997cc2c0 161 } else {
41abdfbd
JG
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 }
997cc2c0 171 errno = 0; /* FIXME, don't ignore errors! */
41abdfbd 172}
41abdfbd
JG
173
174
175/* return pc value after skipping a function prologue. */
176
177skip_prologue (pc)
ecf4059f 178CORE_ADDR pc;
41abdfbd
JG
179{
180 unsigned int tmp;
ecf4059f 181 unsigned int op; /* FIXME, assumes instruction size matches host int!!! */
41abdfbd
JG
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 }
41abdfbd
JG
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);
1eeba686
PB
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 */
41abdfbd
JG
211 }
212
41abdfbd
JG
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
507e4004 231 /* store parameters into stack */
818de002
PB
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 }
41abdfbd
JG
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
818de002
PB
246 tmp = 0;
247 while ((op >> 16) == (0x907f + tmp)) { /* st r3, NUM(r31) */
248 pc += 4; /* st r4, NUM(r31), ... */
41abdfbd 249 op = read_memory_integer (pc, 4);
818de002 250 tmp += 0x20;
41abdfbd
JG
251 }
252 }
507e4004
PB
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
41abdfbd
JG
280 return pc;
281}
282
818de002 283
41abdfbd
JG
284/*************************************************************************
285 Support for creating pushind a dummy frame into the stack, and popping
286 frames, etc.
287*************************************************************************/
288
818de002
PB
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
41abdfbd
JG
300#define DUMMY_FRAME_ADDR_SIZE 10
301
302/* Make sure you initialize these in somewhere, in case gdb gives up what it
818de002 303 was debugging and starts debugging something else. FIXMEibm */
41abdfbd
JG
304
305static int dummy_frame_count = 0;
306static int dummy_frame_size = 0;
307static CORE_ADDR *dummy_frame_addr = 0;
308
309extern 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
ecf4059f 314void
41abdfbd
JG
315push_dummy_frame ()
316{
317 int sp, pc; /* stack pointer and link register */
318 int ii;
319
5f1c39ef 320 target_fetch_registers (-1);
6c6afbb9 321
41abdfbd
JG
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
6c6afbb9 338 thinks he is free to use the space underneath it. And kernel actually
41abdfbd
JG
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
818de002 343 write_register (SP_REGNUM, sp-DUMMY_FRAME_SIZE);
41abdfbd 344
41abdfbd
JG
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 ();
818de002 349 set_current_frame (create_new_frame (sp-DUMMY_FRAME_SIZE, pc));
41abdfbd
JG
350
351 /* save program counter in link register's space. */
352 write_memory (sp+8, &pc, 4);
353
6c6afbb9 354 /* save all floating point and general purpose registers here. */
41abdfbd
JG
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
818de002
PB
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;
41abdfbd
JG
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
818de002
PB
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).
ecf4059f
JG
393
394FIXME: This whole concept is broken. You should be able to detect
395a dummy stack frame *on the user's stack itself*. When you do,
396then you know the format of that stack frame -- including its
397saved SP register! There should *not* be a separate stack in the
d6434f39 398GDB process that keeps track of these dummy frames! -- gnu@cygnus.com Aug92
41abdfbd
JG
399 */
400
401pop_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
818de002
PB
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);
41abdfbd
JG
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
5f1c39ef 432 target_store_registers (-1);
41abdfbd
JG
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
ecf4059f 441void
41abdfbd
JG
442pop_frame ()
443{
444 int pc, lr, sp, prev_sp; /* %pc, %lr, %sp */
6c6afbb9 445 struct aix_framedata fdata;
41abdfbd 446 FRAME fr = get_current_frame ();
41abdfbd 447 int addr, ii;
41abdfbd
JG
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;
6c6afbb9 462 function_frame_info (addr, &fdata);
41abdfbd
JG
463
464 read_memory (sp, &prev_sp, 4);
6c6afbb9 465 if (fdata.frameless)
41abdfbd
JG
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. */
6c6afbb9 474 addr = prev_sp - fdata.offset;
41abdfbd 475
6c6afbb9
PB
476 if (fdata.saved_gpr != -1)
477 for (ii=fdata.saved_gpr; ii <= 31; ++ii) {
41abdfbd
JG
478 read_memory (addr, &registers [REGISTER_BYTE (ii)], 4);
479 addr += sizeof (int);
480 }
481
6c6afbb9
PB
482 if (fdata.saved_fpr != -1)
483 for (ii=fdata.saved_fpr; ii <= 31; ++ii) {
41abdfbd
JG
484 read_memory (addr, &registers [REGISTER_BYTE (ii+FP0_REGNUM)], 8);
485 addr += 8;
486 }
487
488 write_register (SP_REGNUM, prev_sp);
5f1c39ef 489 target_store_registers (-1);
41abdfbd
JG
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
ecf4059f 498void
41abdfbd
JG
499fix_call_dummy(dummyname, pc, fun, nargs, type)
500 char *dummyname;
ecf4059f
JG
501 CORE_ADDR pc;
502 CORE_ADDR fun;
41abdfbd
JG
503 int nargs; /* not used */
504 int type; /* not used */
41abdfbd
JG
505{
506#define TOC_ADDR_OFFSET 20
507#define TARGET_ADDR_OFFSET 28
508
509 int ii;
ecf4059f
JG
510 CORE_ADDR target_addr;
511 CORE_ADDR tocvalue;
41abdfbd
JG
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
41abdfbd 534/* return information about a function frame.
6c6afbb9 535 in struct aix_frameinfo fdata:
41abdfbd
JG
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.
6c6afbb9
PB
540 - alloca_reg is the number of the register used for alloca() handling.
541 Otherwise -1.
41abdfbd 542 */
ecf4059f 543void
6c6afbb9 544function_frame_info (pc, fdata)
d6434f39 545 CORE_ADDR pc;
6c6afbb9 546 struct aix_framedata *fdata;
41abdfbd
JG
547{
548 unsigned int tmp;
549 register unsigned int op;
550
6c6afbb9
PB
551 fdata->offset = 0;
552 fdata->saved_gpr = fdata->saved_fpr = fdata->alloca_reg = -1;
41abdfbd 553
41abdfbd
JG
554 op = read_memory_integer (pc, 4);
555 if (op == 0x7c0802a6) { /* mflr r0 */
556 pc += 4;
557 op = read_memory_integer (pc, 4);
6c6afbb9 558 fdata->frameless = 0;
41abdfbd
JG
559 }
560 else /* else, this is a frameless invocation */
6c6afbb9 561 fdata->frameless = 1;
41abdfbd
JG
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);
1eeba686
PB
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 */
41abdfbd
JG
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;
6c6afbb9 589 fdata->saved_gpr = (op >> 21) & 0x1f;
41abdfbd
JG
590 tmp2 = op & 0xffff;
591 if (tmp2 > 0x7fff)
592 tmp2 = 0xffff0000 | tmp2;
593
594 if (tmp2 < 0) {
595 tmp2 = tmp2 * -1;
6c6afbb9
PB
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;
41abdfbd 599 else
6c6afbb9 600 fdata->saved_fpr = -1;
41abdfbd 601 }
6c6afbb9
PB
602 fdata->offset = tmp2;
603 pc += 4;
604 op = read_memory_integer (pc, 4);
41abdfbd 605 }
6c6afbb9
PB
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;
41abdfbd
JG
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
658CORE_ADDR
659push_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
732ran_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
41abdfbd
JG
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 }
6c6afbb9 803 else
41abdfbd
JG
804 /* Secure stack areas first, before doing anything else. */
805 write_register (SP_REGNUM, sp);
806
41abdfbd
JG
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
5f1c39ef 813 target_store_registers (-1);
41abdfbd
JG
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
ecf4059f 820void
41abdfbd
JG
821extract_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
ecf4059f
JG
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 */
41abdfbd
JG
853
854CORE_ADDR rs6000_struct_return_address;
855
856
857/* Throw away this debugging code. FIXMEmgo. */
ecf4059f 858void
41abdfbd
JG
859print_frame(fram)
860int 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
c2e4669f
JG
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. */
41abdfbd 879
ecf4059f 880CORE_ADDR
41abdfbd 881skip_trampoline_code (pc)
ecf4059f 882CORE_ADDR pc;
41abdfbd
JG
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
ecf4059f
JG
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
911int
912frameless_function_invocation (fi)
913struct 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
935static void
936frame_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
984CORE_ADDR
985frame_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
1052xcoff_relocate_symtab (pid)
1053unsigned 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
1096struct 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
1106static struct loadinfo *loadinfo = NULL;
1107static int loadinfolen = 0;
1108static int loadinfotocindex = 0;
1109int loadinfotextindex = 0;
1110
1111
1112void
1113xcoff_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! */
1127void
1128free_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
1140void
1141xcoff_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
1152static void
1153add_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
1173static CORE_ADDR
1174find_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.101785 seconds and 4 git commands to generate.