* stabs.texinfo: Document the format for C++ nested types.
[deliverable/binutils-gdb.git] / gdb / am29k-tdep.c
1 /* Target-machine dependent code for the AMD 29000
2 Copyright 1990, 1991 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Jim Kingdon.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include "defs.h"
22 #include "gdbcore.h"
23 #include "frame.h"
24 #include "value.h"
25 /*#include <sys/param.h> */
26 #include "symtab.h"
27 #include "inferior.h"
28 #include "gdbcmd.h"
29
30 extern CORE_ADDR text_start; /* FIXME, kludge... */
31
32 /* The user-settable top of the register stack in virtual memory. We
33 won't attempt to access any stored registers above this address, if set
34 nonzero. */
35
36 static CORE_ADDR rstack_high_address = UINT_MAX;
37
38 /* Structure to hold cached info about function prologues. */
39 struct prologue_info
40 {
41 CORE_ADDR pc; /* First addr after fn prologue */
42 unsigned rsize, msize; /* register stack frame size, mem stack ditto */
43 unsigned mfp_used : 1; /* memory frame pointer used */
44 unsigned rsize_valid : 1; /* Validity bits for the above */
45 unsigned msize_valid : 1;
46 unsigned mfp_valid : 1;
47 };
48
49 /* Examine the prologue of a function which starts at PC. Return
50 the first addess past the prologue. If MSIZE is non-NULL, then
51 set *MSIZE to the memory stack frame size. If RSIZE is non-NULL,
52 then set *RSIZE to the register stack frame size (not including
53 incoming arguments and the return address & frame pointer stored
54 with them). If no prologue is found, *RSIZE is set to zero.
55 If no prologue is found, or a prologue which doesn't involve
56 allocating a memory stack frame, then set *MSIZE to zero.
57
58 Note that both msize and rsize are in bytes. This is not consistent
59 with the _User's Manual_ with respect to rsize, but it is much more
60 convenient.
61
62 If MFP_USED is non-NULL, *MFP_USED is set to nonzero if a memory
63 frame pointer is being used. */
64 CORE_ADDR
65 examine_prologue (pc, rsize, msize, mfp_used)
66 CORE_ADDR pc;
67 unsigned *msize;
68 unsigned *rsize;
69 int *mfp_used;
70 {
71 long insn;
72 CORE_ADDR p = pc;
73 struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
74 struct prologue_info *mi = 0;
75
76 if (msymbol != NULL)
77 mi = (struct prologue_info *) msymbol -> info;
78
79 if (mi != 0)
80 {
81 int valid = 1;
82 if (rsize != NULL)
83 {
84 *rsize = mi->rsize;
85 valid &= mi->rsize_valid;
86 }
87 if (msize != NULL)
88 {
89 *msize = mi->msize;
90 valid &= mi->msize_valid;
91 }
92 if (mfp_used != NULL)
93 {
94 *mfp_used = mi->mfp_used;
95 valid &= mi->mfp_valid;
96 }
97 if (valid)
98 return mi->pc;
99 }
100
101 if (rsize != NULL)
102 *rsize = 0;
103 if (msize != NULL)
104 *msize = 0;
105 if (mfp_used != NULL)
106 *mfp_used = 0;
107
108 /* Prologue must start with subtracting a constant from gr1.
109 Normally this is sub gr1,gr1,<rsize * 4>. */
110 insn = read_memory_integer (p, 4);
111 if ((insn & 0xffffff00) != 0x25010100)
112 {
113 /* If the frame is large, instead of a single instruction it
114 might be a pair of instructions:
115 const <reg>, <rsize * 4>
116 sub gr1,gr1,<reg>
117 */
118 int reg;
119 /* Possible value for rsize. */
120 unsigned int rsize0;
121
122 if ((insn & 0xff000000) != 0x03000000)
123 {
124 p = pc;
125 goto done;
126 }
127 reg = (insn >> 8) & 0xff;
128 rsize0 = (((insn >> 8) & 0xff00) | (insn & 0xff));
129 p += 4;
130 insn = read_memory_integer (p, 4);
131 if ((insn & 0xffffff00) != 0x24010100
132 || (insn & 0xff) != reg)
133 {
134 p = pc;
135 goto done;
136 }
137 if (rsize != NULL)
138 *rsize = rsize0;
139 }
140 else
141 {
142 if (rsize != NULL)
143 *rsize = (insn & 0xff);
144 }
145 p += 4;
146
147 /* Next instruction must be asgeu V_SPILL,gr1,rab.
148 * We don't check the vector number to allow for kernel debugging. The
149 * kernel will use a different trap number.
150 */
151 insn = read_memory_integer (p, 4);
152 if ((insn & 0xff00ffff) != (0x5e000100|RAB_HW_REGNUM))
153 {
154 p = pc;
155 goto done;
156 }
157 p += 4;
158
159 /* Next instruction usually sets the frame pointer (lr1) by adding
160 <size * 4> from gr1. However, this can (and high C does) be
161 deferred until anytime before the first function call. So it is
162 OK if we don't see anything which sets lr1.
163 To allow for alternate register sets (gcc -mkernel-registers) the msp
164 register number is a compile time constant. */
165
166 /* Normally this is just add lr1,gr1,<size * 4>. */
167 insn = read_memory_integer (p, 4);
168 if ((insn & 0xffffff00) == 0x15810100)
169 p += 4;
170 else
171 {
172 /* However, for large frames it can be
173 const <reg>, <size *4>
174 add lr1,gr1,<reg>
175 */
176 int reg;
177 CORE_ADDR q;
178
179 if ((insn & 0xff000000) == 0x03000000)
180 {
181 reg = (insn >> 8) & 0xff;
182 q = p + 4;
183 insn = read_memory_integer (q, 4);
184 if ((insn & 0xffffff00) == 0x14810100
185 && (insn & 0xff) == reg)
186 p = q;
187 }
188 }
189
190 /* Next comes "add lr{<rsize-1>},msp,0", but only if a memory
191 frame pointer is in use. We just check for add lr<anything>,msp,0;
192 we don't check this rsize against the first instruction, and
193 we don't check that the trace-back tag indicates a memory frame pointer
194 is in use.
195 To allow for alternate register sets (gcc -mkernel-registers) the msp
196 register number is a compile time constant.
197
198 The recommended instruction is actually "sll lr<whatever>,msp,0".
199 We check for that, too. Originally Jim Kingdon's code seemed
200 to be looking for a "sub" instruction here, but the mask was set
201 up to lose all the time. */
202 insn = read_memory_integer (p, 4);
203 if (((insn & 0xff80ffff) == (0x15800000|(MSP_HW_REGNUM<<8))) /* add */
204 || ((insn & 0xff80ffff) == (0x81800000|(MSP_HW_REGNUM<<8)))) /* sll */
205 {
206 p += 4;
207 if (mfp_used != NULL)
208 *mfp_used = 1;
209 }
210
211 /* Next comes a subtraction from msp to allocate a memory frame,
212 but only if a memory frame is
213 being used. We don't check msize against the trace-back tag.
214
215 To allow for alternate register sets (gcc -mkernel-registers) the msp
216 register number is a compile time constant.
217
218 Normally this is just
219 sub msp,msp,<msize>
220 */
221 insn = read_memory_integer (p, 4);
222 if ((insn & 0xffffff00) ==
223 (0x25000000|(MSP_HW_REGNUM<<16)|(MSP_HW_REGNUM<<8)))
224 {
225 p += 4;
226 if (msize != NULL)
227 *msize = insn & 0xff;
228 }
229 else
230 {
231 /* For large frames, instead of a single instruction it might
232 be
233
234 const <reg>, <msize>
235 consth <reg>, <msize> ; optional
236 sub msp,msp,<reg>
237 */
238 int reg;
239 unsigned msize0;
240 CORE_ADDR q = p;
241
242 if ((insn & 0xff000000) == 0x03000000)
243 {
244 reg = (insn >> 8) & 0xff;
245 msize0 = ((insn >> 8) & 0xff00) | (insn & 0xff);
246 q += 4;
247 insn = read_memory_integer (q, 4);
248 /* Check for consth. */
249 if ((insn & 0xff000000) == 0x02000000
250 && (insn & 0x0000ff00) == reg)
251 {
252 msize0 |= (insn << 8) & 0xff000000;
253 msize0 |= (insn << 16) & 0x00ff0000;
254 q += 4;
255 insn = read_memory_integer (q, 4);
256 }
257 /* Check for sub msp,msp,<reg>. */
258 if ((insn & 0xffffff00) ==
259 (0x24000000|(MSP_HW_REGNUM<<16)|(MSP_HW_REGNUM<<8))
260 && (insn & 0xff) == reg)
261 {
262 p = q + 4;
263 if (msize != NULL)
264 *msize = msize0;
265 }
266 }
267 }
268
269 done:
270 if (msymbol != NULL)
271 {
272 if (mi == 0)
273 {
274 /* Add a new cache entry. */
275 mi = (struct prologue_info *)xmalloc (sizeof (struct prologue_info));
276 msymbol -> info = (char *)mi;
277 mi->rsize_valid = 0;
278 mi->msize_valid = 0;
279 mi->mfp_valid = 0;
280 }
281 /* else, cache entry exists, but info is incomplete. */
282 mi->pc = p;
283 if (rsize != NULL)
284 {
285 mi->rsize = *rsize;
286 mi->rsize_valid = 1;
287 }
288 if (msize != NULL)
289 {
290 mi->msize = *msize;
291 mi->msize_valid = 1;
292 }
293 if (mfp_used != NULL)
294 {
295 mi->mfp_used = *mfp_used;
296 mi->mfp_valid = 1;
297 }
298 }
299 return p;
300 }
301
302 /* Advance PC across any function entry prologue instructions
303 to reach some "real" code. */
304
305 CORE_ADDR
306 skip_prologue (pc)
307 CORE_ADDR pc;
308 {
309 return examine_prologue (pc, (unsigned *)NULL, (unsigned *)NULL,
310 (int *)NULL);
311 }
312 /*
313 * Examine the one or two word tag at the beginning of a function.
314 * The tag word is expect to be at 'p', if it is not there, we fail
315 * by returning 0. The documentation for the tag word was taken from
316 * page 7-15 of the 29050 User's Manual. We are assuming that the
317 * m bit is in bit 22 of the tag word, which seems to be the agreed upon
318 * convention today (1/15/92).
319 * msize is return in bytes.
320 */
321 static int /* 0/1 - failure/success of finding the tag word */
322 examine_tag(p, is_trans, argcount, msize, mfp_used)
323 CORE_ADDR p;
324 int *is_trans;
325 int *argcount;
326 unsigned *msize;
327 int *mfp_used;
328 {
329 unsigned int tag1, tag2;
330
331 tag1 = read_memory_integer (p, 4);
332 if ((tag1 & 0xff000000) != 0) /* Not a tag word */
333 return 0;
334 if (tag1 & (1<<23)) /* A two word tag */
335 {
336 tag2 = read_memory_integer (p+4, 4);
337 if (msize)
338 *msize = tag2;
339 }
340 else /* A one word tag */
341 {
342 if (msize)
343 *msize = tag1 & 0x7ff;
344 }
345 if (is_trans)
346 *is_trans = ((tag1 & (1<<21)) ? 1 : 0);
347 if (argcount)
348 *argcount = (tag1 >> 16) & 0x1f;
349 if (mfp_used)
350 *mfp_used = ((tag1 & (1<<22)) ? 1 : 0);
351 return(1);
352 }
353
354 /* Initialize the frame. In addition to setting "extra" frame info,
355 we also set ->frame because we use it in a nonstandard way, and ->pc
356 because we need to know it to get the other stuff. See the diagram
357 of stacks and the frame cache in tm-29k.h for more detail. */
358 static void
359 init_frame_info (innermost_frame, fci)
360 int innermost_frame;
361 struct frame_info *fci;
362 {
363 CORE_ADDR p;
364 long insn;
365 unsigned rsize;
366 unsigned msize;
367 int mfp_used, trans;
368 struct symbol *func;
369
370 p = fci->pc;
371
372 if (innermost_frame)
373 fci->frame = read_register (GR1_REGNUM);
374 else
375 fci->frame = fci->next_frame + fci->next->rsize;
376
377 #if CALL_DUMMY_LOCATION == ON_STACK
378 This wont work;
379 #else
380 if (PC_IN_CALL_DUMMY (p, 0, 0))
381 #endif
382 {
383 fci->rsize = DUMMY_FRAME_RSIZE;
384 /* This doesn't matter since we never try to get locals or args
385 from a dummy frame. */
386 fci->msize = 0;
387 /* Dummy frames always use a memory frame pointer. */
388 fci->saved_msp =
389 read_register_stack_integer (fci->frame + DUMMY_FRAME_RSIZE - 4, 4);
390 fci->flags |= (TRANSPARENT|MFP_USED);
391 return;
392 }
393
394 func = find_pc_function (p);
395 if (func != NULL)
396 p = BLOCK_START (SYMBOL_BLOCK_VALUE (func));
397 else
398 {
399 /* Search backward to find the trace-back tag. However,
400 do not trace back beyond the start of the text segment
401 (just as a sanity check to avoid going into never-never land). */
402 while (p >= text_start
403 && ((insn = read_memory_integer (p, 4)) & 0xff000000) != 0)
404 p -= 4;
405
406 if (p < text_start)
407 {
408 /* Couldn't find the trace-back tag.
409 Something strange is going on. */
410 fci->saved_msp = 0;
411 fci->rsize = 0;
412 fci->msize = 0;
413 fci->flags = TRANSPARENT;
414 return;
415 }
416 else
417 /* Advance to the first word of the function, i.e. the word
418 after the trace-back tag. */
419 p += 4;
420 }
421 /* We've found the start of the function.
422 * Try looking for a tag word that indicates whether there is a
423 * memory frame pointer and what the memory stack allocation is.
424 * If one doesn't exist, try using a more exhaustive search of
425 * the prologue. For now we don't care about the argcount or
426 * whether or not the routine is transparent.
427 */
428 if (examine_tag(p-4,&trans,NULL,&msize,&mfp_used)) /* Found a good tag */
429 examine_prologue (p, &rsize, 0, 0);
430 else /* No tag try prologue */
431 examine_prologue (p, &rsize, &msize, &mfp_used);
432
433 fci->rsize = rsize;
434 fci->msize = msize;
435 fci->flags = 0;
436 if (mfp_used)
437 fci->flags |= MFP_USED;
438 if (trans)
439 fci->flags |= TRANSPARENT;
440 if (innermost_frame)
441 {
442 fci->saved_msp = read_register (MSP_REGNUM) + msize;
443 }
444 else
445 {
446 if (mfp_used)
447 fci->saved_msp =
448 read_register_stack_integer (fci->frame + rsize - 4, 4);
449 else
450 fci->saved_msp = fci->next->saved_msp + msize;
451 }
452 }
453
454 void
455 init_extra_frame_info (fci)
456 struct frame_info *fci;
457 {
458 if (fci->next == 0)
459 /* Assume innermost frame. May produce strange results for "info frame"
460 but there isn't any way to tell the difference. */
461 init_frame_info (1, fci);
462 else {
463 /* We're in get_prev_frame_info.
464 Take care of everything in init_frame_pc. */
465 ;
466 }
467 }
468
469 void
470 init_frame_pc (fromleaf, fci)
471 int fromleaf;
472 struct frame_info *fci;
473 {
474 fci->pc = (fromleaf ? SAVED_PC_AFTER_CALL (fci->next) :
475 fci->next ? FRAME_SAVED_PC (fci->next) : read_pc ());
476 init_frame_info (fromleaf, fci);
477 }
478 \f
479 /* Local variables (i.e. LOC_LOCAL) are on the memory stack, with their
480 offsets being relative to the memory stack pointer (high C) or
481 saved_msp (gcc). */
482
483 CORE_ADDR
484 frame_locals_address (fi)
485 struct frame_info *fi;
486 {
487 if (fi->flags & MFP_USED)
488 return fi->saved_msp;
489 else
490 return fi->saved_msp - fi->msize;
491 }
492 \f
493 /* Routines for reading the register stack. The caller gets to treat
494 the register stack as a uniform stack in memory, from address $gr1
495 straight through $rfb and beyond. */
496
497 /* Analogous to read_memory except the length is understood to be 4.
498 Also, myaddr can be NULL (meaning don't bother to read), and
499 if actual_mem_addr is non-NULL, store there the address that it
500 was fetched from (or if from a register the offset within
501 registers). Set *LVAL to lval_memory or lval_register, depending
502 on where it came from. */
503 void
504 read_register_stack (memaddr, myaddr, actual_mem_addr, lval)
505 CORE_ADDR memaddr;
506 char *myaddr;
507 CORE_ADDR *actual_mem_addr;
508 enum lval_type *lval;
509 {
510 long rfb = read_register (RFB_REGNUM);
511 long rsp = read_register (RSP_REGNUM);
512
513 /* If we don't do this 'info register' stops in the middle. */
514 if (memaddr >= rstack_high_address)
515 {
516 int val = -1; /* a bogus value */
517 /* It's in a local register, but off the end of the stack. */
518 int regnum = (memaddr - rsp) / 4 + LR0_REGNUM;
519 if (myaddr != NULL)
520 *(int*)myaddr = val; /* Provide bogusness */
521 supply_register(regnum,&val); /* More bogusness */
522 if (lval != NULL)
523 *lval = lval_register;
524 if (actual_mem_addr != NULL)
525 *actual_mem_addr = REGISTER_BYTE (regnum);
526 }
527 else if (memaddr < rfb)
528 {
529 /* It's in a register. */
530 int regnum = (memaddr - rsp) / 4 + LR0_REGNUM;
531 if (regnum < LR0_REGNUM || regnum > LR0_REGNUM + 127)
532 error ("Attempt to read register stack out of range.");
533 if (myaddr != NULL)
534 read_register_gen (regnum, myaddr);
535 if (lval != NULL)
536 *lval = lval_register;
537 if (actual_mem_addr != NULL)
538 *actual_mem_addr = REGISTER_BYTE (regnum);
539 }
540 else
541 {
542 /* It's in the memory portion of the register stack. */
543 if (myaddr != NULL)
544 read_memory (memaddr, myaddr, 4);
545 if (lval != NULL)
546 *lval = lval_memory;
547 if (actual_mem_addr != NULL)
548 *actual_mem_addr = memaddr;
549 }
550 }
551
552 /* Analogous to read_memory_integer
553 except the length is understood to be 4. */
554 long
555 read_register_stack_integer (memaddr, len)
556 CORE_ADDR memaddr;
557 int len;
558 {
559 long buf;
560 read_register_stack (memaddr, &buf, NULL, NULL);
561 SWAP_TARGET_AND_HOST (&buf, 4);
562 return buf;
563 }
564
565 /* Copy 4 bytes from GDB memory at MYADDR into inferior memory
566 at MEMADDR and put the actual address written into in
567 *ACTUAL_MEM_ADDR. */
568 static void
569 write_register_stack (memaddr, myaddr, actual_mem_addr)
570 CORE_ADDR memaddr;
571 char *myaddr;
572 CORE_ADDR *actual_mem_addr;
573 {
574 long rfb = read_register (RFB_REGNUM);
575 long rsp = read_register (RSP_REGNUM);
576 /* If we don't do this 'info register' stops in the middle. */
577 if (memaddr >= rstack_high_address)
578 {
579 /* It's in a register, but off the end of the stack. */
580 if (actual_mem_addr != NULL)
581 *actual_mem_addr = NULL;
582 }
583 else if (memaddr < rfb)
584 {
585 /* It's in a register. */
586 int regnum = (memaddr - rsp) / 4 + LR0_REGNUM;
587 if (regnum < LR0_REGNUM || regnum > LR0_REGNUM + 127)
588 error ("Attempt to read register stack out of range.");
589 if (myaddr != NULL)
590 write_register (regnum, *(long *)myaddr);
591 if (actual_mem_addr != NULL)
592 *actual_mem_addr = NULL;
593 }
594 else
595 {
596 /* It's in the memory portion of the register stack. */
597 if (myaddr != NULL)
598 write_memory (memaddr, myaddr, 4);
599 if (actual_mem_addr != NULL)
600 *actual_mem_addr = memaddr;
601 }
602 }
603 \f
604 /* Find register number REGNUM relative to FRAME and put its
605 (raw) contents in *RAW_BUFFER. Set *OPTIMIZED if the variable
606 was optimized out (and thus can't be fetched). If the variable
607 was fetched from memory, set *ADDRP to where it was fetched from,
608 otherwise it was fetched from a register.
609
610 The argument RAW_BUFFER must point to aligned memory. */
611 void
612 get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lvalp)
613 char *raw_buffer;
614 int *optimized;
615 CORE_ADDR *addrp;
616 FRAME frame;
617 int regnum;
618 enum lval_type *lvalp;
619 {
620 struct frame_info *fi;
621 CORE_ADDR addr;
622 enum lval_type lval;
623
624 if (frame == 0)
625 return;
626
627 fi = get_frame_info (frame);
628
629 /* Once something has a register number, it doesn't get optimized out. */
630 if (optimized != NULL)
631 *optimized = 0;
632 if (regnum == RSP_REGNUM)
633 {
634 if (raw_buffer != NULL)
635 *(CORE_ADDR *)raw_buffer = fi->frame;
636 if (lvalp != NULL)
637 *lvalp = not_lval;
638 return;
639 }
640 else if (regnum == PC_REGNUM)
641 {
642 if (raw_buffer != NULL)
643 *(CORE_ADDR *)raw_buffer = fi->pc;
644
645 /* Not sure we have to do this. */
646 if (lvalp != NULL)
647 *lvalp = not_lval;
648
649 return;
650 }
651 else if (regnum == MSP_REGNUM)
652 {
653 if (raw_buffer != NULL)
654 {
655 if (fi->next != NULL)
656 *(CORE_ADDR *)raw_buffer = fi->next->saved_msp;
657 else
658 *(CORE_ADDR *)raw_buffer = read_register (MSP_REGNUM);
659 }
660 /* The value may have been computed, not fetched. */
661 if (lvalp != NULL)
662 *lvalp = not_lval;
663 return;
664 }
665 else if (regnum < LR0_REGNUM || regnum >= LR0_REGNUM + 128)
666 {
667 /* These registers are not saved over procedure calls,
668 so just print out the current values. */
669 if (raw_buffer != NULL)
670 *(CORE_ADDR *)raw_buffer = read_register (regnum);
671 if (lvalp != NULL)
672 *lvalp = lval_register;
673 if (addrp != NULL)
674 *addrp = REGISTER_BYTE (regnum);
675 return;
676 }
677
678 addr = fi->frame + (regnum - LR0_REGNUM) * 4;
679 if (raw_buffer != NULL)
680 read_register_stack (addr, raw_buffer, &addr, &lval);
681 if (lvalp != NULL)
682 *lvalp = lval;
683 if (addrp != NULL)
684 *addrp = addr;
685 }
686 \f
687
688 /* Discard from the stack the innermost frame,
689 restoring all saved registers. */
690
691 void
692 pop_frame ()
693 {
694 FRAME frame = get_current_frame ();
695 struct frame_info *fi = get_frame_info (frame);
696 CORE_ADDR rfb = read_register (RFB_REGNUM);
697 CORE_ADDR gr1 = fi->frame + fi->rsize;
698 CORE_ADDR lr1;
699 int i;
700
701 /* If popping a dummy frame, need to restore registers. */
702 if (PC_IN_CALL_DUMMY (read_register (PC_REGNUM),
703 read_register (SP_REGNUM),
704 FRAME_FP (fi)))
705 {
706 int lrnum = LR0_REGNUM + DUMMY_ARG/4;
707 for (i = 0; i < DUMMY_SAVE_SR128; ++i)
708 write_register (SR_REGNUM (i + 128),read_register (lrnum++));
709 for (i = 0; i < DUMMY_SAVE_SR160; ++i)
710 write_register (SR_REGNUM(i+160), read_register (lrnum++));
711 for (i = 0; i < DUMMY_SAVE_GREGS; ++i)
712 write_register (RETURN_REGNUM + i, read_register (lrnum++));
713 /* Restore the PCs. */
714 write_register(PC_REGNUM, read_register (lrnum++));
715 write_register(NPC_REGNUM, read_register (lrnum));
716 }
717
718 /* Restore the memory stack pointer. */
719 write_register (MSP_REGNUM, fi->saved_msp);
720 /* Restore the register stack pointer. */
721 write_register (GR1_REGNUM, gr1);
722 /* Check whether we need to fill registers. */
723 lr1 = read_register (LR0_REGNUM + 1);
724 if (lr1 > rfb)
725 {
726 /* Fill. */
727 int num_bytes = lr1 - rfb;
728 int i;
729 long word;
730 write_register (RAB_REGNUM, read_register (RAB_REGNUM) + num_bytes);
731 write_register (RFB_REGNUM, lr1);
732 for (i = 0; i < num_bytes; i += 4)
733 {
734 /* Note: word is in host byte order. */
735 word = read_memory_integer (rfb + i, 4);
736 write_register (LR0_REGNUM + ((rfb - gr1) % 0x80) + i / 4, word);
737 }
738 }
739 flush_cached_frames ();
740 set_current_frame (create_new_frame (0, read_pc()));
741 }
742
743 /* Push an empty stack frame, to record the current PC, etc. */
744
745 void
746 push_dummy_frame ()
747 {
748 long w;
749 CORE_ADDR rab, gr1;
750 CORE_ADDR msp = read_register (MSP_REGNUM);
751 int lrnum, i, saved_lr0;
752
753
754 /* Allocate the new frame. */
755 gr1 = read_register (GR1_REGNUM) - DUMMY_FRAME_RSIZE;
756 write_register (GR1_REGNUM, gr1);
757
758 rab = read_register (RAB_REGNUM);
759 if (gr1 < rab)
760 {
761 /* We need to spill registers. */
762 int num_bytes = rab - gr1;
763 CORE_ADDR rfb = read_register (RFB_REGNUM);
764 int i;
765 long word;
766
767 write_register (RFB_REGNUM, rfb - num_bytes);
768 write_register (RAB_REGNUM, gr1);
769 for (i = 0; i < num_bytes; i += 4)
770 {
771 /* Note: word is in target byte order. */
772 read_register_gen (LR0_REGNUM + i / 4, &word);
773 write_memory (rfb - num_bytes + i, &word, 4);
774 }
775 }
776
777 /* There are no arguments in to the dummy frame, so we don't need
778 more than rsize plus the return address and lr1. */
779 write_register (LR0_REGNUM + 1, gr1 + DUMMY_FRAME_RSIZE + 2 * 4);
780
781 /* Set the memory frame pointer. */
782 write_register (LR0_REGNUM + DUMMY_FRAME_RSIZE / 4 - 1, msp);
783
784 /* Allocate arg_slop. */
785 write_register (MSP_REGNUM, msp - 16 * 4);
786
787 /* Save registers. */
788 lrnum = LR0_REGNUM + DUMMY_ARG/4;
789 for (i = 0; i < DUMMY_SAVE_SR128; ++i)
790 write_register (lrnum++, read_register (SR_REGNUM (i + 128)));
791 for (i = 0; i < DUMMY_SAVE_SR160; ++i)
792 write_register (lrnum++, read_register (SR_REGNUM (i + 160)));
793 for (i = 0; i < DUMMY_SAVE_GREGS; ++i)
794 write_register (lrnum++, read_register (RETURN_REGNUM + i));
795 /* Save the PCs. */
796 write_register (lrnum++, read_register (PC_REGNUM));
797 write_register (lrnum, read_register (NPC_REGNUM));
798 }
799
800 reginv_com (args, fromtty)
801 char *args;
802 int fromtty;
803 {
804 registers_changed();
805 if (fromtty)
806 printf_filtered("Gdb's register cache invalidated.\n");
807 }
808
809 /* We use this mostly for debugging gdb */
810 void
811 _initialize_29k()
812 {
813 add_com ("reginv ", class_obscure, reginv_com,
814 "Invalidate gdb's internal register cache.");
815
816 /* FIXME, there should be a way to make a CORE_ADDR variable settable. */
817 add_show_from_set
818 (add_set_cmd ("rstack_high_address", class_support, var_uinteger,
819 (char *)&rstack_high_address,
820 "Set top address in memory of the register stack.\n\
821 Attempts to access registers saved above this address will be ignored\n\
822 or will produce the value -1.", &setlist),
823 &showlist);
824 }
This page took 0.063981 seconds and 4 git commands to generate.