]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m68k-tdep.c
import gdb-19990504 snapshot
[thirdparty/binutils-gdb.git] / gdb / m68k-tdep.c
CommitLineData
c906108c
SS
1/* Target dependent code for the Motorola 68000 series.
2 Copyright (C) 1990, 1992 Free Software Foundation, Inc.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#include "defs.h"
21#include "frame.h"
22#include "symtab.h"
23#include "gdbcore.h"
24#include "value.h"
25#include "gdb_string.h"
7a292a7a 26#include "inferior.h"
c906108c
SS
27
28\f
b83266a0
SS
29/* The only reason this is here is the tm-altos.h reference below. It
30 was moved back here from tm-m68k.h. FIXME? */
31
32extern CORE_ADDR
33altos_skip_prologue (pc)
34 CORE_ADDR pc;
35{
36 register int op = read_memory_integer (pc, 2);
37 if (op == 0047126)
38 pc += 4; /* Skip link #word */
39 else if (op == 0044016)
40 pc += 6; /* Skip link #long */
41 /* Not sure why branches are here. */
42 /* From tm-isi.h, tm-altos.h */
43 else if (op == 0060000)
44 pc += 4; /* Skip bra #word */
45 else if (op == 00600377)
46 pc += 6; /* skip bra #long */
47 else if ((op & 0177400) == 0060000)
48 pc += 2; /* skip bra #char */
49 return pc;
50}
51
52/* The only reason this is here is the tm-isi.h reference below. It
53 was moved back here from tm-m68k.h. FIXME? */
54
55extern CORE_ADDR
56isi_skip_prologue (pc)
57 CORE_ADDR pc;
58{
59 register int op = read_memory_integer (pc, 2);
60 if (op == 0047126)
61 pc += 4; /* Skip link #word */
62 else if (op == 0044016)
63 pc += 6; /* Skip link #long */
64 /* Not sure why branches are here. */
65 /* From tm-isi.h, tm-altos.h */
66 else if (op == 0060000)
67 pc += 4; /* Skip bra #word */
68 else if (op == 00600377)
69 pc += 6; /* skip bra #long */
70 else if ((op & 0177400) == 0060000)
71 pc += 2; /* skip bra #char */
72 return pc;
73}
74
75
c906108c
SS
76/* Push an empty stack frame, to record the current PC, etc. */
77
78void
79m68k_push_dummy_frame ()
80{
81 register CORE_ADDR sp = read_register (SP_REGNUM);
82 register int regnum;
83 char raw_buffer[12];
84
85 sp = push_word (sp, read_register (PC_REGNUM));
86 sp = push_word (sp, read_register (FP_REGNUM));
87 write_register (FP_REGNUM, sp);
88
89 /* Always save the floating-point registers, whether they exist on
90 this target or not. */
91 for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)
92 {
93 read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);
94 sp = push_bytes (sp, raw_buffer, 12);
95 }
96
97 for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)
98 {
99 sp = push_word (sp, read_register (regnum));
100 }
101 sp = push_word (sp, read_register (PS_REGNUM));
102 write_register (SP_REGNUM, sp);
103}
104
105/* Discard from the stack the innermost frame,
106 restoring all saved registers. */
107
108void
109m68k_pop_frame ()
110{
111 register struct frame_info *frame = get_current_frame ();
112 register CORE_ADDR fp;
113 register int regnum;
114 struct frame_saved_regs fsr;
115 char raw_buffer[12];
116
117 fp = FRAME_FP (frame);
118 get_frame_saved_regs (frame, &fsr);
119 for (regnum = FP0_REGNUM + 7 ; regnum >= FP0_REGNUM ; regnum--)
120 {
121 if (fsr.regs[regnum])
122 {
123 read_memory (fsr.regs[regnum], raw_buffer, 12);
124 write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);
125 }
126 }
127 for (regnum = FP_REGNUM - 1 ; regnum >= 0 ; regnum--)
128 {
129 if (fsr.regs[regnum])
130 {
131 write_register (regnum, read_memory_integer (fsr.regs[regnum], 4));
132 }
133 }
134 if (fsr.regs[PS_REGNUM])
135 {
136 write_register (PS_REGNUM, read_memory_integer (fsr.regs[PS_REGNUM], 4));
137 }
138 write_register (FP_REGNUM, read_memory_integer (fp, 4));
139 write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
140 write_register (SP_REGNUM, fp + 8);
141 flush_cached_frames ();
142}
143
144\f
145/* Given an ip value corresponding to the start of a function,
146 return the ip of the first instruction after the function
147 prologue. This is the generic m68k support. Machines which
148 require something different can override the SKIP_PROLOGUE
149 macro to point elsewhere.
150
151 Some instructions which typically may appear in a function
152 prologue include:
153
154 A link instruction, word form:
155
156 link.w %a6,&0 4e56 XXXX
157
158 A link instruction, long form:
159
160 link.l %fp,&F%1 480e XXXX XXXX
161
162 A movm instruction to preserve integer regs:
163
164 movm.l &M%1,(4,%sp) 48ef XXXX XXXX
165
166 A fmovm instruction to preserve float regs:
167
168 fmovm &FPM%1,(FPO%1,%sp) f237 XXXX XXXX XXXX XXXX
169
170 Some profiling setup code (FIXME, not recognized yet):
171
172 lea.l (.L3,%pc),%a1 43fb XXXX XXXX XXXX
173 bsr _mcount 61ff XXXX XXXX
174
175 */
176
177#define P_LINK_L 0x480e
178#define P_LINK_W 0x4e56
179#define P_MOV_L 0x207c
180#define P_JSR 0x4eb9
181#define P_BSR 0x61ff
182#define P_LEA_L 0x43fb
183#define P_MOVM_L 0x48ef
184#define P_FMOVM 0xf237
185#define P_TRAP 0x4e40
186
187CORE_ADDR
188m68k_skip_prologue (ip)
189CORE_ADDR ip;
190{
191 register CORE_ADDR limit;
192 struct symtab_and_line sal;
193 register int op;
194
195 /* Find out if there is a known limit for the extent of the prologue.
196 If so, ensure we don't go past it. If not, assume "infinity". */
197
198 sal = find_pc_line (ip, 0);
199 limit = (sal.end) ? sal.end : (CORE_ADDR) ~0;
200
201 while (ip < limit)
202 {
203 op = read_memory_integer (ip, 2);
204 op &= 0xFFFF;
205
206 if (op == P_LINK_W)
207 {
208 ip += 4; /* Skip link.w */
209 }
210 else if (op == 0x4856)
211 ip += 2; /* Skip pea %fp */
212 else if (op == 0x2c4f)
213 ip += 2; /* Skip move.l %sp, %fp */
214 else if (op == P_LINK_L)
215 {
216 ip += 6; /* Skip link.l */
217 }
218 else if (op == P_MOVM_L)
219 {
220 ip += 6; /* Skip movm.l */
221 }
222 else if (op == P_FMOVM)
223 {
224 ip += 10; /* Skip fmovm */
225 }
226 else
227 {
228 break; /* Found unknown code, bail out. */
229 }
230 }
231 return (ip);
232}
233
234void
235m68k_find_saved_regs (frame_info, saved_regs)
236 struct frame_info *frame_info;
237 struct frame_saved_regs *saved_regs;
238{
239 register int regnum;
240 register int regmask;
241 register CORE_ADDR next_addr;
242 register CORE_ADDR pc;
243
244 /* First possible address for a pc in a call dummy for this frame. */
245 CORE_ADDR possible_call_dummy_start =
246 (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM*4 - 4 - 8*12;
247
248 int nextinsn;
249 memset (saved_regs, 0, sizeof (*saved_regs));
250 if ((frame_info)->pc >= possible_call_dummy_start
251 && (frame_info)->pc <= (frame_info)->frame)
252 {
253
254 /* It is a call dummy. We could just stop now, since we know
255 what the call dummy saves and where. But this code proceeds
256 to parse the "prologue" which is part of the call dummy.
257 This is needlessly complex and confusing. FIXME. */
258
259 next_addr = (frame_info)->frame;
260 pc = possible_call_dummy_start;
261 }
262 else
263 {
264 pc = get_pc_function_start ((frame_info)->pc);
265
266 if (0x4856 == read_memory_integer (pc, 2)
267 && 0x2c4f == read_memory_integer (pc + 2, 2))
268 {
269 /*
270 pea %fp
271 move.l %sp, %fp */
272
273 pc += 4;
274 next_addr = frame_info->frame;
275 }
276 else if (044016 == read_memory_integer (pc, 2))
277 /* link.l %fp */
278 /* Find the address above the saved
279 regs using the amount of storage from the link instruction. */
280 next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc+=4;
281 else if (047126 == read_memory_integer (pc, 2))
282 /* link.w %fp */
283 /* Find the address above the saved
284 regs using the amount of storage from the link instruction. */
285 next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc+=2;
286 else goto lose;
287
288 /* If have an addal #-n, sp next, adjust next_addr. */
289 if ((0177777 & read_memory_integer (pc, 2)) == 0157774)
290 next_addr += read_memory_integer (pc += 2, 4), pc += 4;
291 }
292 regmask = read_memory_integer (pc + 2, 2);
293
294 /* Here can come an fmovem. Check for it. */
295 nextinsn = 0xffff & read_memory_integer (pc, 2);
296 if (0xf227 == nextinsn
297 && (regmask & 0xff00) == 0xe000)
298 { pc += 4; /* Regmask's low bit is for register fp7, the first pushed */
299 for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
300 if (regmask & 1)
301 saved_regs->regs[regnum] = (next_addr -= 12);
302 regmask = read_memory_integer (pc + 2, 2); }
303
304 /* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */
305 if (0044327 == read_memory_integer (pc, 2))
306 { pc += 4; /* Regmask's low bit is for register 0, the first written */
307 for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
308 if (regmask & 1)
309 saved_regs->regs[regnum] = (next_addr += 4) - 4; }
310 else if (0044347 == read_memory_integer (pc, 2))
311 {
312 pc += 4; /* Regmask's low bit is for register 15, the first pushed */
313 for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1)
314 if (regmask & 1)
315 saved_regs->regs[regnum] = (next_addr -= 4);
316 }
317 else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
318 {
319 regnum = 0xf & read_memory_integer (pc, 2); pc += 2;
320 saved_regs->regs[regnum] = (next_addr -= 4);
321 /* gcc, at least, may use a pair of movel instructions when saving
322 exactly 2 registers. */
323 if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
324 {
325 regnum = 0xf & read_memory_integer (pc, 2);
326 pc += 2;
327 saved_regs->regs[regnum] = (next_addr -= 4);
328 }
329 }
330
331 /* fmovemx to index of sp may follow. */
332 regmask = read_memory_integer (pc + 2, 2);
333 nextinsn = 0xffff & read_memory_integer (pc, 2);
334 if (0xf236 == nextinsn
335 && (regmask & 0xff00) == 0xf000)
336 { pc += 10; /* Regmask's low bit is for register fp0, the first written */
337 for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
338 if (regmask & 1)
339 saved_regs->regs[regnum] = (next_addr += 12) - 12;
340 regmask = read_memory_integer (pc + 2, 2); }
341
342 /* clrw -(sp); movw ccr,-(sp) may follow. */
343 if (0x426742e7 == read_memory_integer (pc, 4))
344 saved_regs->regs[PS_REGNUM] = (next_addr -= 4);
345 lose: ;
346 saved_regs->regs[SP_REGNUM] = (frame_info)->frame + 8;
347 saved_regs->regs[FP_REGNUM] = (frame_info)->frame;
348 saved_regs->regs[PC_REGNUM] = (frame_info)->frame + 4;
349#ifdef SIG_SP_FP_OFFSET
350 /* Adjust saved SP_REGNUM for fake _sigtramp frames. */
351 if (frame_info->signal_handler_caller && frame_info->next)
352 saved_regs->regs[SP_REGNUM] = frame_info->next->frame + SIG_SP_FP_OFFSET;
353#endif
354}
355
356
357#ifdef USE_PROC_FS /* Target dependent support for /proc */
358
359#include <sys/procfs.h>
360
361/* The /proc interface divides the target machine's register set up into
362 two different sets, the general register set (gregset) and the floating
363 point register set (fpregset). For each set, there is an ioctl to get
364 the current register set and another ioctl to set the current values.
365
366 The actual structure passed through the ioctl interface is, of course,
367 naturally machine dependent, and is different for each set of registers.
368 For the m68k for example, the general register set is typically defined
369 by:
370
371 typedef int gregset_t[18];
372
373 #define R_D0 0
374 ...
375 #define R_PS 17
376
377 and the floating point set by:
378
379 typedef struct fpregset {
380 int f_pcr;
381 int f_psr;
382 int f_fpiaddr;
383 int f_fpregs[8][3]; (8 regs, 96 bits each)
384 } fpregset_t;
385
386 These routines provide the packing and unpacking of gregset_t and
387 fpregset_t formatted data.
388
389 */
390
391/* Atari SVR4 has R_SR but not R_PS */
392
393#if !defined (R_PS) && defined (R_SR)
394#define R_PS R_SR
395#endif
396
397/* Given a pointer to a general register set in /proc format (gregset_t *),
398 unpack the register contents and supply them as gdb's idea of the current
399 register values. */
400
401void
402supply_gregset (gregsetp)
403gregset_t *gregsetp;
404{
405 register int regi;
406 register greg_t *regp = (greg_t *) gregsetp;
407
408 for (regi = 0 ; regi < R_PC ; regi++)
409 {
410 supply_register (regi, (char *) (regp + regi));
411 }
412 supply_register (PS_REGNUM, (char *) (regp + R_PS));
413 supply_register (PC_REGNUM, (char *) (regp + R_PC));
414}
415
416void
417fill_gregset (gregsetp, regno)
418gregset_t *gregsetp;
419int regno;
420{
421 register int regi;
422 register greg_t *regp = (greg_t *) gregsetp;
c906108c
SS
423
424 for (regi = 0 ; regi < R_PC ; regi++)
425 {
426 if ((regno == -1) || (regno == regi))
427 {
428 *(regp + regi) = *(int *) &registers[REGISTER_BYTE (regi)];
429 }
430 }
431 if ((regno == -1) || (regno == PS_REGNUM))
432 {
433 *(regp + R_PS) = *(int *) &registers[REGISTER_BYTE (PS_REGNUM)];
434 }
435 if ((regno == -1) || (regno == PC_REGNUM))
436 {
437 *(regp + R_PC) = *(int *) &registers[REGISTER_BYTE (PC_REGNUM)];
438 }
439}
440
441#if defined (FP0_REGNUM)
442
443/* Given a pointer to a floating point register set in /proc format
444 (fpregset_t *), unpack the register contents and supply them as gdb's
445 idea of the current floating point register values. */
446
447void
448supply_fpregset (fpregsetp)
449fpregset_t *fpregsetp;
450{
451 register int regi;
452 char *from;
453
454 for (regi = FP0_REGNUM ; regi < FPC_REGNUM ; regi++)
455 {
456 from = (char *) &(fpregsetp -> f_fpregs[regi-FP0_REGNUM][0]);
457 supply_register (regi, from);
458 }
459 supply_register (FPC_REGNUM, (char *) &(fpregsetp -> f_pcr));
460 supply_register (FPS_REGNUM, (char *) &(fpregsetp -> f_psr));
461 supply_register (FPI_REGNUM, (char *) &(fpregsetp -> f_fpiaddr));
462}
463
464/* Given a pointer to a floating point register set in /proc format
465 (fpregset_t *), update the register specified by REGNO from gdb's idea
466 of the current floating point register set. If REGNO is -1, update
467 them all. */
468
469void
470fill_fpregset (fpregsetp, regno)
471fpregset_t *fpregsetp;
472int regno;
473{
474 int regi;
475 char *to;
476 char *from;
c906108c
SS
477
478 for (regi = FP0_REGNUM ; regi < FPC_REGNUM ; regi++)
479 {
480 if ((regno == -1) || (regno == regi))
481 {
482 from = (char *) &registers[REGISTER_BYTE (regi)];
483 to = (char *) &(fpregsetp -> f_fpregs[regi-FP0_REGNUM][0]);
484 memcpy (to, from, REGISTER_RAW_SIZE (regi));
485 }
486 }
487 if ((regno == -1) || (regno == FPC_REGNUM))
488 {
489 fpregsetp -> f_pcr = *(int *) &registers[REGISTER_BYTE (FPC_REGNUM)];
490 }
491 if ((regno == -1) || (regno == FPS_REGNUM))
492 {
493 fpregsetp -> f_psr = *(int *) &registers[REGISTER_BYTE (FPS_REGNUM)];
494 }
495 if ((regno == -1) || (regno == FPI_REGNUM))
496 {
497 fpregsetp -> f_fpiaddr = *(int *) &registers[REGISTER_BYTE (FPI_REGNUM)];
498 }
499}
500
501#endif /* defined (FP0_REGNUM) */
502
503#endif /* USE_PROC_FS */
504
505#ifdef GET_LONGJMP_TARGET
506/* Figure out where the longjmp will land. Slurp the args out of the stack.
507 We expect the first arg to be a pointer to the jmp_buf structure from which
508 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
509 This routine returns true on success. */
510
511int
512get_longjmp_target(pc)
513 CORE_ADDR *pc;
514{
515 char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
516 CORE_ADDR sp, jb_addr;
517
518 sp = read_register(SP_REGNUM);
519
520 if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
521 buf,
522 TARGET_PTR_BIT / TARGET_CHAR_BIT))
523 return 0;
524
525 jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
526
527 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
528 TARGET_PTR_BIT / TARGET_CHAR_BIT))
529 return 0;
530
531 *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
532
533 return 1;
534}
535#endif /* GET_LONGJMP_TARGET */
536
537/* Immediately after a function call, return the saved pc before the frame
538 is setup. For sun3's, we check for the common case of being inside of a
539 system call, and if so, we know that Sun pushes the call # on the stack
540 prior to doing the trap. */
541
542CORE_ADDR
543m68k_saved_pc_after_call(frame)
544 struct frame_info *frame;
545{
546#ifdef SYSCALL_TRAP
547 int op;
548
549 op = read_memory_integer (frame->pc - SYSCALL_TRAP_OFFSET, 2);
550
551 if (op == SYSCALL_TRAP)
552 return read_memory_integer (read_register (SP_REGNUM) + 4, 4);
553 else
554#endif /* SYSCALL_TRAP */
555 return read_memory_integer (read_register (SP_REGNUM), 4);
556}
557
558void
559_initialize_m68k_tdep ()
560{
561 tm_print_insn = print_insn_m68k;
562}