* tm-hppa.h: New file, architectural definition of HP PA.
[deliverable/binutils-gdb.git] / gdb / am29k-tdep.c
CommitLineData
dd3b648e 1/* Target-machine dependent code for the AMD 29000
7d9884b9 2 Copyright 1990, 1991 Free Software Foundation, Inc.
dd3b648e
RP
3 Contributed by Cygnus Support. Written by Jim Kingdon.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
99a7de40
JG
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
dd3b648e
RP
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
99a7de40
JG
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
dd3b648e
RP
20
21#include "defs.h"
22#include "gdbcore.h"
dd3b648e
RP
23#include "frame.h"
24#include "value.h"
d0b04c6a 25/*#include <sys/param.h> */
dd3b648e
RP
26#include "symtab.h"
27#include "inferior.h"
8f86a4e4 28#include "gdbcmd.h"
dd3b648e 29
7730bd5a
JG
30extern CORE_ADDR text_start; /* FIXME, kludge... */
31
8f86a4e4
JG
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
36static CORE_ADDR rstack_high_address = UINT_MAX;
37
dd3b648e
RP
38/* Structure to hold cached info about function prologues. */
39struct 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. */
64CORE_ADDR
65examine_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;
1ab3bf1b 73 struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
dd3b648e
RP
74 struct prologue_info *mi = 0;
75
1ab3bf1b 76 if (msymbol != NULL)
07df4831 77 mi = (struct prologue_info *) msymbol -> info;
dd3b648e
RP
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
d0b04c6a
SG
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 */
dd3b648e 151 insn = read_memory_integer (p, 4);
d0b04c6a 152 if ((insn & 0xff00ffff) != (0x5e000100|RAB_HW_REGNUM))
dd3b648e
RP
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
d0b04c6a
SG
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
dd3b648e
RP
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.
d0b04c6a
SG
195 To allow for alternate register sets (gcc -mkernel-registers) the msp
196 register number is a compile time constant.
dd3b648e
RP
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);
d0b04c6a
SG
203 if (((insn & 0xff80ffff) == (0x15800000|(MSP_HW_REGNUM<<8))) /* add */
204 || ((insn & 0xff80ffff) == (0x81800000|(MSP_HW_REGNUM<<8)))) /* sll */
dd3b648e
RP
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
d0b04c6a
SG
215 To allow for alternate register sets (gcc -mkernel-registers) the msp
216 register number is a compile time constant.
217
dd3b648e
RP
218 Normally this is just
219 sub msp,msp,<msize>
220 */
221 insn = read_memory_integer (p, 4);
d0b04c6a
SG
222 if ((insn & 0xffffff00) ==
223 (0x25000000|(MSP_HW_REGNUM<<16)|(MSP_HW_REGNUM<<8)))
dd3b648e
RP
224 {
225 p += 4;
d0b04c6a 226 if (msize != NULL)
dd3b648e
RP
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>. */
d0b04c6a
SG
258 if ((insn & 0xffffff00) ==
259 (0x24000000|(MSP_HW_REGNUM<<16)|(MSP_HW_REGNUM<<8))
dd3b648e
RP
260 && (insn & 0xff) == reg)
261 {
262 p = q + 4;
263 if (msize != NULL)
264 *msize = msize0;
265 }
266 }
267 }
268
269 done:
1ab3bf1b 270 if (msymbol != NULL)
dd3b648e
RP
271 {
272 if (mi == 0)
273 {
274 /* Add a new cache entry. */
275 mi = (struct prologue_info *)xmalloc (sizeof (struct prologue_info));
07df4831 276 msymbol -> info = (char *)mi;
dd3b648e
RP
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
305CORE_ADDR
306skip_prologue (pc)
307 CORE_ADDR pc;
308{
309 return examine_prologue (pc, (unsigned *)NULL, (unsigned *)NULL,
310 (int *)NULL);
311}
d0b04c6a
SG
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 */
321static int /* 0/1 - failure/success of finding the tag word */
322examine_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}
dd3b648e
RP
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. */
358static void
359init_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;
d0b04c6a 367 int mfp_used, trans;
dd3b648e
RP
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);
d0b04c6a 390 fci->flags |= (TRANSPARENT|MFP_USED);
dd3b648e
RP
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;
d0b04c6a 413 fci->flags = TRANSPARENT;
dd3b648e
RP
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 }
d0b04c6a
SG
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
dd3b648e
RP
433 fci->rsize = rsize;
434 fci->msize = msize;
d0b04c6a
SG
435 fci->flags = 0;
436 if (mfp_used)
437 fci->flags |= MFP_USED;
438 if (trans)
439 fci->flags |= TRANSPARENT;
dd3b648e
RP
440 if (innermost_frame)
441 {
442 fci->saved_msp = read_register (MSP_REGNUM) + msize;
443 }
444 else
445 {
446 if (mfp_used)
d0b04c6a
SG
447 fci->saved_msp =
448 read_register_stack_integer (fci->frame + rsize - 4, 4);
dd3b648e 449 else
d0b04c6a 450 fci->saved_msp = fci->next->saved_msp + msize;
dd3b648e
RP
451 }
452}
453
454void
455init_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);
17f7e032
JG
462 else {
463 /* We're in get_prev_frame_info.
464 Take care of everything in init_frame_pc. */
465 ;
466 }
dd3b648e
RP
467}
468
469void
470init_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 ());
d0b04c6a 476 init_frame_info (fromleaf, fci);
dd3b648e
RP
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
483CORE_ADDR
484frame_locals_address (fi)
485 struct frame_info *fi;
486{
d0b04c6a 487 if (fi->flags & MFP_USED)
dd3b648e
RP
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. */
503void
504read_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);
d0b04c6a 512
d0b04c6a 513 /* If we don't do this 'info register' stops in the middle. */
8f86a4e4 514 if (memaddr >= rstack_high_address)
d0b04c6a
SG
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 }
8f86a4e4 527 else if (memaddr < rfb)
dd3b648e
RP
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. */
d0b04c6a
SG
543 if (myaddr != NULL)
544 read_memory (memaddr, myaddr, 4);
dd3b648e
RP
545 if (lval != NULL)
546 *lval = lval_memory;
547 if (actual_mem_addr != NULL)
17f7e032 548 *actual_mem_addr = memaddr;
dd3b648e
RP
549 }
550}
551
552/* Analogous to read_memory_integer
553 except the length is understood to be 4. */
554long
555read_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. */
568static void
569write_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);
d0b04c6a 576 /* If we don't do this 'info register' stops in the middle. */
8f86a4e4 577 if (memaddr >= rstack_high_address)
d0b04c6a
SG
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 }
8f86a4e4 583 else if (memaddr < rfb)
dd3b648e
RP
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)
d0b04c6a 592 *actual_mem_addr = NULL;
dd3b648e
RP
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)
17f7e032 600 *actual_mem_addr = memaddr;
dd3b648e
RP
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. */
611void
612get_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{
d0b04c6a 620 struct frame_info *fi;
dd3b648e
RP
621 CORE_ADDR addr;
622 enum lval_type lval;
623
d0b04c6a
SG
624 if (frame == 0)
625 return;
626
627 fi = get_frame_info (frame);
628
dd3b648e
RP
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
d0b04c6a 687
dd3b648e
RP
688/* Discard from the stack the innermost frame,
689 restoring all saved registers. */
690
691void
692pop_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;
dd3b648e
RP
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 {
d0b04c6a 706 int lrnum = LR0_REGNUM + DUMMY_ARG/4;
dd3b648e 707 for (i = 0; i < DUMMY_SAVE_SR128; ++i)
d0b04c6a
SG
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++));
6093e5b0 711 for (i = 0; i < DUMMY_SAVE_GREGS; ++i)
d0b04c6a
SG
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));
dd3b648e
RP
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 }
dd3b648e
RP
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
745void
746push_dummy_frame ()
747{
748 long w;
749 CORE_ADDR rab, gr1;
750 CORE_ADDR msp = read_register (MSP_REGNUM);
d0b04c6a 751 int lrnum, i, saved_lr0;
dd3b648e 752
dd3b648e 753
d0b04c6a 754 /* Allocate the new frame. */
dd3b648e
RP
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. */
b2f27f8e 772 read_register_gen (LR0_REGNUM + i / 4, &word);
d0b04c6a 773 write_memory (rfb - num_bytes + i, &word, 4);
dd3b648e
RP
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. */
d0b04c6a 788 lrnum = LR0_REGNUM + DUMMY_ARG/4;
dd3b648e 789 for (i = 0; i < DUMMY_SAVE_SR128; ++i)
d0b04c6a
SG
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)));
6093e5b0 793 for (i = 0; i < DUMMY_SAVE_GREGS; ++i)
d0b04c6a
SG
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
800reginv_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");
dd3b648e 807}
d0b04c6a
SG
808
809/* We use this mostly for debugging gdb */
810void
811_initialize_29k()
812{
813 add_com ("reginv ", class_obscure, reginv_com,
814 "Invalidate gdb's internal register cache.");
d0b04c6a 815
8f86a4e4
JG
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\
821Attempts to access registers saved above this address will be ignored\n\
822or will produce the value -1.", &setlist),
823 &showlist);
824}
This page took 0.087526 seconds and 4 git commands to generate.