* gas/m68hc11/m68hc11.exp: Rename from all.exp; run the new tests.
[deliverable/binutils-gdb.git] / gdb / m68k-tdep.c
CommitLineData
c906108c 1/* Target dependent code for the Motorola 68000 series.
b6ba6518 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001
a1de33a8 3 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b
JM
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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22#include "defs.h"
23#include "frame.h"
24#include "symtab.h"
25#include "gdbcore.h"
26#include "value.h"
27#include "gdb_string.h"
7a292a7a 28#include "inferior.h"
4e052eda 29#include "regcache.h"
5d3ed2e3 30#include "arch-utils.h"
32eeb91a
AS
31
32#include "m68k-tdep.h"
c906108c 33\f
c5aa993b 34
89c3b6d3
PDM
35#define P_LINKL_FP 0x480e
36#define P_LINKW_FP 0x4e56
37#define P_PEA_FP 0x4856
38#define P_MOVL_SP_FP 0x2c4f
39#define P_MOVL 0x207c
40#define P_JSR 0x4eb9
41#define P_BSR 0x61ff
42#define P_LEAL 0x43fb
43#define P_MOVML 0x48ef
44#define P_FMOVM 0xf237
45#define P_TRAP 0x4e40
46
103a1597 47
103a1597
GS
48#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
49#define REGISTER_BYTES_NOFP (16*4 + 8)
50
51#define NUM_FREGS (NUM_REGS-24)
52
53/* Offset from SP to first arg on stack at first instruction of a function */
54
55#define SP_ARG0 (1 * 4)
56
57/* This was determined by experimentation on hp300 BSD 4.3. Perhaps
58 it corresponds to some offset in /usr/include/sys/user.h or
59 something like that. Using some system include file would
60 have the advantage of probably being more robust in the face
61 of OS upgrades, but the disadvantage of being wrong for
62 cross-debugging. */
63
64#define SIG_PC_FP_OFFSET 530
65
66#define TARGET_M68K
67
68
69#if !defined (BPT_VECTOR)
70#define BPT_VECTOR 0xf
71#endif
72
73#if !defined (REMOTE_BPT_VECTOR)
74#define REMOTE_BPT_VECTOR 1
75#endif
76
77
7f8e7424
GS
78void m68k_frame_init_saved_regs (struct frame_info *frame_info);
79
103a1597
GS
80
81/* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc
82 so m68k_remote_breakpoint_from_pc is currently not used. */
83
84const static unsigned char *
85m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
86{
87 static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)};
88 *lenptr = sizeof (break_insn);
89 return break_insn;
90}
91
92const static unsigned char *
93m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
94{
95 static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
96 *lenptr = sizeof (break_insn);
97 return break_insn;
98}
99
100
942dc0e9 101static int
5ae5f592 102m68k_register_bytes_ok (long numbytes)
942dc0e9
GS
103{
104 return ((numbytes == REGISTER_BYTES_FP)
105 || (numbytes == REGISTER_BYTES_NOFP));
106}
107
5d3ed2e3
GS
108/* Number of bytes of storage in the actual machine representation
109 for register regnum. On the 68000, all regs are 4 bytes
110 except the floating point regs which are 12 bytes. */
111/* Note that the unsigned cast here forces the result of the
112 subtraction to very high positive values if regnum < FP0_REGNUM */
113
114static int
115m68k_register_raw_size (int regnum)
116{
117 return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
118}
119
120/* Number of bytes of storage in the program's representation
121 for register regnum. On the 68000, all regs are 4 bytes
122 except the floating point regs which are 12-byte long doubles. */
123
124static int
125m68k_register_virtual_size (int regnum)
126{
127 return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
128}
129
d85fe7f7
AS
130/* Return the GDB type object for the "standard" data type of data in
131 register N. This should be int for D0-D7, SR, FPCONTROL and
132 FPSTATUS, long double for FP0-FP7, and void pointer for all others
133 (A0-A7, PC, FPIADDR). Note, for registers which contain
134 addresses return pointer to void, not pointer to char, because we
135 don't want to attempt to print the string after printing the
136 address. */
5d3ed2e3
GS
137
138static struct type *
139m68k_register_virtual_type (int regnum)
140{
03dac896
AS
141 if (regnum >= FP0_REGNUM && regnum <= FP0_REGNUM + 7)
142 return builtin_type_m68881_ext;
143
32eeb91a 144 if (regnum == M68K_FPI_REGNUM || regnum == PC_REGNUM)
03dac896
AS
145 return builtin_type_void_func_ptr;
146
32eeb91a
AS
147 if (regnum == M68K_FPC_REGNUM || regnum == M68K_FPS_REGNUM
148 || regnum == PS_REGNUM)
03dac896
AS
149 return builtin_type_int32;
150
32eeb91a 151 if (regnum >= M68K_A0_REGNUM && regnum <= M68K_A0_REGNUM + 7)
03dac896
AS
152 return builtin_type_void_data_ptr;
153
154 return builtin_type_int32;
5d3ed2e3
GS
155}
156
157/* Function: m68k_register_name
158 Returns the name of the standard m68k register regnum. */
159
160static const char *
161m68k_register_name (int regnum)
162{
163 static char *register_names[] = {
164 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
165 "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",
166 "ps", "pc",
167 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
168 "fpcontrol", "fpstatus", "fpiaddr", "fpcode", "fpflags"
169 };
170
171 if (regnum < 0 ||
172 regnum >= sizeof (register_names) / sizeof (register_names[0]))
173 internal_error (__FILE__, __LINE__,
174 "m68k_register_name: illegal register number %d", regnum);
175 else
176 return register_names[regnum];
177}
178
179/* Stack must be kept short aligned when doing function calls. */
180
181static CORE_ADDR
182m68k_stack_align (CORE_ADDR addr)
183{
184 return ((addr + 1) & ~1);
185}
186
187/* Index within `registers' of the first byte of the space for
188 register regnum. */
189
190static int
191m68k_register_byte (int regnum)
192{
32eeb91a
AS
193 if (regnum >= M68K_FPC_REGNUM)
194 return (((regnum - M68K_FPC_REGNUM) * 4) + 168);
5d3ed2e3
GS
195 else if (regnum >= FP0_REGNUM)
196 return (((regnum - FP0_REGNUM) * 12) + 72);
197 else
198 return (regnum * 4);
199}
200
942dc0e9
GS
201/* Store the address of the place in which to copy the structure the
202 subroutine will return. This is called from call_function. */
203
204static void
205m68k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
206{
32eeb91a 207 write_register (M68K_A1_REGNUM, addr);
942dc0e9
GS
208}
209
210/* Extract from an array regbuf containing the (raw) register state
211 a function return value of type type, and copy that, in virtual format,
212 into valbuf. This is assuming that floating point values are returned
213 as doubles in d0/d1. */
214
215static void
216m68k_deprecated_extract_return_value (struct type *type, char *regbuf,
217 char *valbuf)
218{
219 int offset = 0;
220 int typeLength = TYPE_LENGTH (type);
221
222 if (typeLength < 4)
223 offset = 4 - typeLength;
224
225 memcpy (valbuf, regbuf + offset, typeLength);
226}
227
228static CORE_ADDR
229m68k_deprecated_extract_struct_value_address (char *regbuf)
230{
231 return (*(CORE_ADDR *) (regbuf));
232}
233
234/* Write into appropriate registers a function return value
235 of type TYPE, given in virtual format. Assumes floats are passed
236 in d0/d1. */
237
238static void
239m68k_store_return_value (struct type *type, char *valbuf)
240{
73937e03 241 deprecated_write_register_bytes (0, valbuf, TYPE_LENGTH (type));
942dc0e9
GS
242}
243
244/* Describe the pointer in each stack frame to the previous stack frame
245 (its caller). */
246
247/* FRAME_CHAIN takes a frame's nominal address and produces the frame's
248 chain-pointer.
249 In the case of the 68000, the frame's nominal address
250 is the address of a 4-byte word containing the calling frame's address. */
251
252/* If we are chaining from sigtramp, then manufacture a sigtramp frame
253 (which isn't really on the stack. I'm not sure this is right for anything
254 but BSD4.3 on an hp300. */
255
256static CORE_ADDR
257m68k_frame_chain (struct frame_info *thisframe)
258{
32eeb91a 259 if (get_frame_type (thisframe) == SIGTRAMP_FRAME)
942dc0e9 260 return thisframe->frame;
32eeb91a 261 else if (!inside_entry_file (thisframe->pc))
b5fc49aa 262 return read_memory_unsigned_integer (thisframe->frame, 4);
942dc0e9
GS
263 else
264 return 0;
265}
266
267/* A function that tells us whether the function invocation represented
268 by fi does not have a frame on the stack associated with it. If it
269 does not, FRAMELESS is set to 1, else 0. */
270
271static int
272m68k_frameless_function_invocation (struct frame_info *fi)
273{
32eeb91a 274 if (get_frame_type (fi) == SIGTRAMP_FRAME)
942dc0e9
GS
275 return 0;
276 else
277 return frameless_look_for_prologue (fi);
278}
279
280static CORE_ADDR
281m68k_frame_saved_pc (struct frame_info *frame)
282{
32eeb91a 283 if (get_frame_type (frame) == SIGTRAMP_FRAME)
942dc0e9
GS
284 {
285 if (frame->next)
b5fc49aa
AS
286 return read_memory_unsigned_integer (frame->next->frame
287 + SIG_PC_FP_OFFSET, 4);
942dc0e9 288 else
b5fc49aa
AS
289 return read_memory_unsigned_integer (read_register (SP_REGNUM)
290 + SIG_PC_FP_OFFSET - 8, 4);
942dc0e9
GS
291 }
292 else
b5fc49aa 293 return read_memory_unsigned_integer (frame->frame + 4, 4);
942dc0e9
GS
294}
295
296
b83266a0
SS
297/* The only reason this is here is the tm-altos.h reference below. It
298 was moved back here from tm-m68k.h. FIXME? */
299
300extern CORE_ADDR
fba45db2 301altos_skip_prologue (CORE_ADDR pc)
b83266a0 302{
b5fc49aa 303 register int op = read_memory_unsigned_integer (pc, 2);
89c3b6d3 304 if (op == P_LINKW_FP)
c5aa993b 305 pc += 4; /* Skip link #word */
89c3b6d3 306 else if (op == P_LINKL_FP)
c5aa993b 307 pc += 6; /* Skip link #long */
b83266a0 308 /* Not sure why branches are here. */
514e603d 309 /* From tm-altos.h */
b83266a0 310 else if (op == 0060000)
c5aa993b 311 pc += 4; /* Skip bra #word */
b83266a0 312 else if (op == 00600377)
c5aa993b 313 pc += 6; /* skip bra #long */
b83266a0 314 else if ((op & 0177400) == 0060000)
c5aa993b 315 pc += 2; /* skip bra #char */
b83266a0
SS
316 return pc;
317}
318
89c3b6d3 319int
fba45db2 320delta68_in_sigtramp (CORE_ADDR pc, char *name)
89c3b6d3 321{
1bd54964
AC
322 if (name != NULL)
323 return strcmp (name, "_sigcode") == 0;
324 else
325 return 0;
89c3b6d3
PDM
326}
327
328CORE_ADDR
fba45db2 329delta68_frame_args_address (struct frame_info *frame_info)
89c3b6d3
PDM
330{
331 /* we assume here that the only frameless functions are the system calls
332 or other functions who do not put anything on the stack. */
32eeb91a 333 if (get_frame_type (frame_info) == SIGTRAMP_FRAME)
89c3b6d3
PDM
334 return frame_info->frame + 12;
335 else if (frameless_look_for_prologue (frame_info))
336 {
b5d78d39 337 /* Check for an interrupted system call */
5a203e44 338 if (frame_info->next && (get_frame_type (frame_info->next) == SIGTRAMP_FRAME))
b5d78d39
GS
339 return frame_info->next->frame + 16;
340 else
341 return frame_info->frame + 4;
89c3b6d3
PDM
342 }
343 else
344 return frame_info->frame;
345}
346
347CORE_ADDR
fba45db2 348delta68_frame_saved_pc (struct frame_info *frame_info)
89c3b6d3 349{
b5fc49aa
AS
350 return read_memory_unsigned_integer (delta68_frame_args_address (frame_info)
351 + 4, 4);
89c3b6d3
PDM
352}
353
392a587b
JM
354/* Return number of args passed to a frame.
355 Can return -1, meaning no way to tell. */
356
357int
fba45db2 358isi_frame_num_args (struct frame_info *fi)
392a587b
JM
359{
360 int val;
361 CORE_ADDR pc = FRAME_SAVED_PC (fi);
b5fc49aa 362 int insn = read_memory_unsigned_integer (pc, 2);
392a587b 363 val = 0;
c5aa993b 364 if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
392a587b 365 val = read_memory_integer (pc + 2, 2);
c5aa993b
JM
366 else if ((insn & 0170777) == 0050217 /* addql #N, sp */
367 || (insn & 0170777) == 0050117) /* addqw */
392a587b
JM
368 {
369 val = (insn >> 9) & 7;
370 if (val == 0)
371 val = 8;
372 }
c5aa993b 373 else if (insn == 0157774) /* addal #WW, sp */
392a587b
JM
374 val = read_memory_integer (pc + 2, 4);
375 val >>= 2;
376 return val;
377}
378
379int
fba45db2 380delta68_frame_num_args (struct frame_info *fi)
392a587b
JM
381{
382 int val;
383 CORE_ADDR pc = FRAME_SAVED_PC (fi);
b5fc49aa 384 int insn = read_memory_unsigned_integer (pc, 2);
392a587b 385 val = 0;
c5aa993b 386 if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
392a587b 387 val = read_memory_integer (pc + 2, 2);
c5aa993b
JM
388 else if ((insn & 0170777) == 0050217 /* addql #N, sp */
389 || (insn & 0170777) == 0050117) /* addqw */
392a587b
JM
390 {
391 val = (insn >> 9) & 7;
392 if (val == 0)
393 val = 8;
394 }
c5aa993b 395 else if (insn == 0157774) /* addal #WW, sp */
392a587b
JM
396 val = read_memory_integer (pc + 2, 4);
397 val >>= 2;
398 return val;
399}
400
401int
fba45db2 402news_frame_num_args (struct frame_info *fi)
392a587b
JM
403{
404 int val;
405 CORE_ADDR pc = FRAME_SAVED_PC (fi);
b5fc49aa 406 int insn = read_memory_unsigned_integer (pc, 2);
392a587b 407 val = 0;
c5aa993b 408 if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
392a587b 409 val = read_memory_integer (pc + 2, 2);
c5aa993b
JM
410 else if ((insn & 0170777) == 0050217 /* addql #N, sp */
411 || (insn & 0170777) == 0050117) /* addqw */
392a587b
JM
412 {
413 val = (insn >> 9) & 7;
414 if (val == 0)
415 val = 8;
416 }
c5aa993b 417 else if (insn == 0157774) /* addal #WW, sp */
392a587b
JM
418 val = read_memory_integer (pc + 2, 4);
419 val >>= 2;
420 return val;
421}
b83266a0 422
7f8e7424
GS
423/* Insert the specified number of args and function address
424 into a call sequence of the above form stored at DUMMYNAME.
425 We use the BFD routines to store a big-endian value of known size. */
426
427void
a2c6a6d5
GS
428m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
429 struct value **args, struct type *type, int gcc_p)
7f8e7424 430{
a2c6a6d5
GS
431 bfd_putb32 (fun, (unsigned char *) dummy + CALL_DUMMY_START_OFFSET + 2);
432 bfd_putb32 (nargs * 4,
433 (unsigned char *) dummy + CALL_DUMMY_START_OFFSET + 8);
7f8e7424
GS
434}
435
436
c906108c
SS
437/* Push an empty stack frame, to record the current PC, etc. */
438
439void
fba45db2 440m68k_push_dummy_frame (void)
c906108c
SS
441{
442 register CORE_ADDR sp = read_register (SP_REGNUM);
443 register int regnum;
444 char raw_buffer[12];
445
446 sp = push_word (sp, read_register (PC_REGNUM));
447 sp = push_word (sp, read_register (FP_REGNUM));
448 write_register (FP_REGNUM, sp);
449
450 /* Always save the floating-point registers, whether they exist on
451 this target or not. */
452 for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)
453 {
73937e03 454 deprecated_read_register_bytes (REGISTER_BYTE (regnum), raw_buffer, 12);
c906108c
SS
455 sp = push_bytes (sp, raw_buffer, 12);
456 }
457
458 for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)
459 {
460 sp = push_word (sp, read_register (regnum));
461 }
462 sp = push_word (sp, read_register (PS_REGNUM));
463 write_register (SP_REGNUM, sp);
464}
465
466/* Discard from the stack the innermost frame,
467 restoring all saved registers. */
468
469void
fba45db2 470m68k_pop_frame (void)
c906108c
SS
471{
472 register struct frame_info *frame = get_current_frame ();
473 register CORE_ADDR fp;
474 register int regnum;
c906108c
SS
475 char raw_buffer[12];
476
c193f6ac 477 fp = get_frame_base (frame);
7f8e7424 478 m68k_frame_init_saved_regs (frame);
c5aa993b 479 for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--)
c906108c 480 {
7f8e7424 481 if (frame->saved_regs[regnum])
c906108c 482 {
7f8e7424 483 read_memory (frame->saved_regs[regnum], raw_buffer, 12);
73937e03
AC
484 deprecated_write_register_bytes (REGISTER_BYTE (regnum), raw_buffer,
485 12);
c906108c
SS
486 }
487 }
c5aa993b 488 for (regnum = FP_REGNUM - 1; regnum >= 0; regnum--)
c906108c 489 {
7f8e7424 490 if (frame->saved_regs[regnum])
c906108c 491 {
a2c6a6d5
GS
492 write_register (regnum,
493 read_memory_integer (frame->saved_regs[regnum], 4));
c906108c
SS
494 }
495 }
7f8e7424 496 if (frame->saved_regs[PS_REGNUM])
c906108c 497 {
b5d78d39 498 write_register (PS_REGNUM,
7f8e7424 499 read_memory_integer (frame->saved_regs[PS_REGNUM], 4));
c906108c
SS
500 }
501 write_register (FP_REGNUM, read_memory_integer (fp, 4));
502 write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
503 write_register (SP_REGNUM, fp + 8);
504 flush_cached_frames ();
505}
c906108c 506\f
c5aa993b 507
c906108c
SS
508/* Given an ip value corresponding to the start of a function,
509 return the ip of the first instruction after the function
510 prologue. This is the generic m68k support. Machines which
511 require something different can override the SKIP_PROLOGUE
512 macro to point elsewhere.
513
514 Some instructions which typically may appear in a function
515 prologue include:
516
517 A link instruction, word form:
518
c5aa993b 519 link.w %a6,&0 4e56 XXXX
c906108c
SS
520
521 A link instruction, long form:
522
c5aa993b 523 link.l %fp,&F%1 480e XXXX XXXX
c906108c
SS
524
525 A movm instruction to preserve integer regs:
526
c5aa993b 527 movm.l &M%1,(4,%sp) 48ef XXXX XXXX
c906108c
SS
528
529 A fmovm instruction to preserve float regs:
530
c5aa993b 531 fmovm &FPM%1,(FPO%1,%sp) f237 XXXX XXXX XXXX XXXX
c906108c
SS
532
533 Some profiling setup code (FIXME, not recognized yet):
534
c5aa993b
JM
535 lea.l (.L3,%pc),%a1 43fb XXXX XXXX XXXX
536 bsr _mcount 61ff XXXX XXXX
c906108c 537
c5aa993b 538 */
c906108c 539
c906108c 540CORE_ADDR
fba45db2 541m68k_skip_prologue (CORE_ADDR ip)
c906108c
SS
542{
543 register CORE_ADDR limit;
544 struct symtab_and_line sal;
545 register int op;
546
547 /* Find out if there is a known limit for the extent of the prologue.
548 If so, ensure we don't go past it. If not, assume "infinity". */
549
550 sal = find_pc_line (ip, 0);
b5d78d39 551 limit = (sal.end) ? sal.end : (CORE_ADDR) ~0;
c906108c
SS
552
553 while (ip < limit)
554 {
b5fc49aa 555 op = read_memory_unsigned_integer (ip, 2);
c5aa993b 556
89c3b6d3
PDM
557 if (op == P_LINKW_FP)
558 ip += 4; /* Skip link.w */
559 else if (op == P_PEA_FP)
c5aa993b 560 ip += 2; /* Skip pea %fp */
89c3b6d3 561 else if (op == P_MOVL_SP_FP)
c5aa993b 562 ip += 2; /* Skip move.l %sp, %fp */
89c3b6d3
PDM
563 else if (op == P_LINKL_FP)
564 ip += 6; /* Skip link.l */
565 else if (op == P_MOVML)
566 ip += 6; /* Skip movm.l */
c906108c 567 else if (op == P_FMOVM)
89c3b6d3 568 ip += 10; /* Skip fmovm */
c906108c 569 else
b5d78d39 570 break; /* Found unknown code, bail out. */
c906108c
SS
571 }
572 return (ip);
573}
574
7f8e7424
GS
575/* Store the addresses of the saved registers of the frame described by
576 FRAME_INFO in its saved_regs field.
577 This includes special registers such as pc and fp saved in special
578 ways in the stack frame. sp is even more special:
579 the address we return for it IS the sp for the next frame. */
580
c906108c 581void
7f8e7424 582m68k_frame_init_saved_regs (struct frame_info *frame_info)
c906108c 583{
c5aa993b
JM
584 register int regnum;
585 register int regmask;
586 register CORE_ADDR next_addr;
c906108c
SS
587 register CORE_ADDR pc;
588
589 /* First possible address for a pc in a call dummy for this frame. */
590 CORE_ADDR possible_call_dummy_start =
b5fc49aa 591 frame_info->frame - 28 - FP_REGNUM * 4 - 4 - 8 * 12;
c906108c
SS
592
593 int nextinsn;
7f8e7424
GS
594
595 if (frame_info->saved_regs)
596 return;
597
598 frame_saved_regs_zalloc (frame_info);
599
600 memset (frame_info->saved_regs, 0, SIZEOF_FRAME_SAVED_REGS);
601
b5fc49aa
AS
602 if (frame_info->pc >= possible_call_dummy_start
603 && frame_info->pc <= frame_info->frame)
c906108c
SS
604 {
605
606 /* It is a call dummy. We could just stop now, since we know
c5aa993b
JM
607 what the call dummy saves and where. But this code proceeds
608 to parse the "prologue" which is part of the call dummy.
609 This is needlessly complex and confusing. FIXME. */
c906108c 610
b5fc49aa 611 next_addr = frame_info->frame;
c906108c
SS
612 pc = possible_call_dummy_start;
613 }
c5aa993b 614 else
c906108c 615 {
b5fc49aa 616 pc = get_pc_function_start (frame_info->pc);
c906108c 617
b5fc49aa 618 nextinsn = read_memory_unsigned_integer (pc, 2);
89c3b6d3 619 if (P_PEA_FP == nextinsn
b5fc49aa 620 && P_MOVL_SP_FP == read_memory_unsigned_integer (pc + 2, 2))
c906108c 621 {
89c3b6d3 622 /* pea %fp
c5aa993b 623 move.l %sp, %fp */
c906108c 624 next_addr = frame_info->frame;
89c3b6d3 625 pc += 4;
c906108c 626 }
89c3b6d3 627 else if (P_LINKL_FP == nextinsn)
c906108c
SS
628 /* link.l %fp */
629 /* Find the address above the saved
630 regs using the amount of storage from the link instruction. */
89c3b6d3 631 {
b5fc49aa 632 next_addr = frame_info->frame + read_memory_integer (pc + 2, 4);
89c3b6d3
PDM
633 pc += 6;
634 }
635 else if (P_LINKW_FP == nextinsn)
c906108c
SS
636 /* link.w %fp */
637 /* Find the address above the saved
638 regs using the amount of storage from the link instruction. */
89c3b6d3 639 {
b5fc49aa 640 next_addr = frame_info->frame + read_memory_integer (pc + 2, 2);
89c3b6d3
PDM
641 pc += 4;
642 }
c5aa993b
JM
643 else
644 goto lose;
645
646 /* If have an addal #-n, sp next, adjust next_addr. */
b5fc49aa 647 if (read_memory_unsigned_integer (pc, 2) == 0157774)
c5aa993b
JM
648 next_addr += read_memory_integer (pc += 2, 4), pc += 4;
649 }
c5aa993b 650
b5d78d39 651 for (;;)
c5aa993b 652 {
b5fc49aa
AS
653 nextinsn = read_memory_unsigned_integer (pc, 2);
654 regmask = read_memory_unsigned_integer (pc + 2, 2);
89c3b6d3
PDM
655 /* fmovemx to -(sp) */
656 if (0xf227 == nextinsn && (regmask & 0xff00) == 0xe000)
c906108c 657 {
89c3b6d3
PDM
658 /* Regmask's low bit is for register fp7, the first pushed */
659 for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
660 if (regmask & 1)
7f8e7424 661 frame_info->saved_regs[regnum] = (next_addr -= 12);
89c3b6d3
PDM
662 pc += 4;
663 }
664 /* fmovemx to (fp + displacement) */
665 else if (0171056 == nextinsn && (regmask & 0xff00) == 0xf000)
666 {
667 register CORE_ADDR addr;
668
b5fc49aa 669 addr = frame_info->frame + read_memory_integer (pc + 4, 2);
89c3b6d3
PDM
670 /* Regmask's low bit is for register fp7, the first pushed */
671 for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
672 if (regmask & 1)
673 {
7f8e7424 674 frame_info->saved_regs[regnum] = addr;
89c3b6d3
PDM
675 addr += 12;
676 }
677 pc += 6;
678 }
679 /* moveml to (sp) */
680 else if (0044327 == nextinsn)
681 {
682 /* Regmask's low bit is for register 0, the first written */
683 for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
684 if (regmask & 1)
685 {
7f8e7424 686 frame_info->saved_regs[regnum] = next_addr;
89c3b6d3
PDM
687 next_addr += 4;
688 }
689 pc += 4;
690 }
691 /* moveml to (fp + displacement) */
692 else if (0044356 == nextinsn)
693 {
694 register CORE_ADDR addr;
695
b5fc49aa 696 addr = frame_info->frame + read_memory_integer (pc + 4, 2);
89c3b6d3
PDM
697 /* Regmask's low bit is for register 0, the first written */
698 for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
699 if (regmask & 1)
700 {
7f8e7424 701 frame_info->saved_regs[regnum] = addr;
89c3b6d3
PDM
702 addr += 4;
703 }
704 pc += 6;
705 }
706 /* moveml to -(sp) */
707 else if (0044347 == nextinsn)
708 {
709 /* Regmask's low bit is for register 15, the first pushed */
710 for (regnum = 16; --regnum >= 0; regmask >>= 1)
711 if (regmask & 1)
7f8e7424 712 frame_info->saved_regs[regnum] = (next_addr -= 4);
89c3b6d3
PDM
713 pc += 4;
714 }
715 /* movl r,-(sp) */
716 else if (0x2f00 == (0xfff0 & nextinsn))
717 {
718 regnum = 0xf & nextinsn;
7f8e7424 719 frame_info->saved_regs[regnum] = (next_addr -= 4);
89c3b6d3 720 pc += 2;
c906108c 721 }
89c3b6d3
PDM
722 /* fmovemx to index of sp */
723 else if (0xf236 == nextinsn && (regmask & 0xff00) == 0xf000)
724 {
725 /* Regmask's low bit is for register fp0, the first written */
726 for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
727 if (regmask & 1)
728 {
7f8e7424 729 frame_info->saved_regs[regnum] = next_addr;
89c3b6d3
PDM
730 next_addr += 12;
731 }
732 pc += 10;
733 }
734 /* clrw -(sp); movw ccr,-(sp) */
735 else if (0x4267 == nextinsn && 0x42e7 == regmask)
736 {
7f8e7424 737 frame_info->saved_regs[PS_REGNUM] = (next_addr -= 4);
89c3b6d3
PDM
738 pc += 4;
739 }
740 else
741 break;
c906108c 742 }
c5aa993b 743lose:;
7f8e7424
GS
744 frame_info->saved_regs[SP_REGNUM] = (frame_info)->frame + 8;
745 frame_info->saved_regs[FP_REGNUM] = (frame_info)->frame;
746 frame_info->saved_regs[PC_REGNUM] = (frame_info)->frame + 4;
c906108c
SS
747#ifdef SIG_SP_FP_OFFSET
748 /* Adjust saved SP_REGNUM for fake _sigtramp frames. */
5a203e44 749 if ((get_frame_type (frame_info) == SIGTRAMP_FRAME) && frame_info->next)
7f8e7424
GS
750 frame_info->saved_regs[SP_REGNUM] =
751 frame_info->next->frame + SIG_SP_FP_OFFSET;
c906108c
SS
752#endif
753}
754
755
c5aa993b 756#ifdef USE_PROC_FS /* Target dependent support for /proc */
c906108c
SS
757
758#include <sys/procfs.h>
759
c60c0f5f
MS
760/* Prototypes for supply_gregset etc. */
761#include "gregset.h"
762
c906108c 763/* The /proc interface divides the target machine's register set up into
c5aa993b
JM
764 two different sets, the general register set (gregset) and the floating
765 point register set (fpregset). For each set, there is an ioctl to get
766 the current register set and another ioctl to set the current values.
c906108c 767
c5aa993b
JM
768 The actual structure passed through the ioctl interface is, of course,
769 naturally machine dependent, and is different for each set of registers.
770 For the m68k for example, the general register set is typically defined
771 by:
c906108c 772
c5aa993b 773 typedef int gregset_t[18];
c906108c 774
c5aa993b
JM
775 #define R_D0 0
776 ...
777 #define R_PS 17
c906108c 778
c5aa993b 779 and the floating point set by:
c906108c 780
c5aa993b
JM
781 typedef struct fpregset {
782 int f_pcr;
783 int f_psr;
784 int f_fpiaddr;
785 int f_fpregs[8][3]; (8 regs, 96 bits each)
786 } fpregset_t;
c906108c 787
c5aa993b
JM
788 These routines provide the packing and unpacking of gregset_t and
789 fpregset_t formatted data.
c906108c
SS
790
791 */
792
793/* Atari SVR4 has R_SR but not R_PS */
794
795#if !defined (R_PS) && defined (R_SR)
796#define R_PS R_SR
797#endif
798
799/* Given a pointer to a general register set in /proc format (gregset_t *),
c5aa993b
JM
800 unpack the register contents and supply them as gdb's idea of the current
801 register values. */
c906108c
SS
802
803void
fba45db2 804supply_gregset (gregset_t *gregsetp)
c906108c
SS
805{
806 register int regi;
807 register greg_t *regp = (greg_t *) gregsetp;
808
c5aa993b 809 for (regi = 0; regi < R_PC; regi++)
c906108c
SS
810 {
811 supply_register (regi, (char *) (regp + regi));
812 }
813 supply_register (PS_REGNUM, (char *) (regp + R_PS));
814 supply_register (PC_REGNUM, (char *) (regp + R_PC));
815}
816
817void
fba45db2 818fill_gregset (gregset_t *gregsetp, int regno)
c906108c
SS
819{
820 register int regi;
821 register greg_t *regp = (greg_t *) gregsetp;
c906108c 822
c5aa993b 823 for (regi = 0; regi < R_PC; regi++)
c906108c
SS
824 {
825 if ((regno == -1) || (regno == regi))
826 {
524d7c18 827 *(regp + regi) = *(int *) &deprecated_registers[REGISTER_BYTE (regi)];
c906108c
SS
828 }
829 }
830 if ((regno == -1) || (regno == PS_REGNUM))
831 {
524d7c18 832 *(regp + R_PS) = *(int *) &deprecated_registers[REGISTER_BYTE (PS_REGNUM)];
c906108c
SS
833 }
834 if ((regno == -1) || (regno == PC_REGNUM))
835 {
524d7c18 836 *(regp + R_PC) = *(int *) &deprecated_registers[REGISTER_BYTE (PC_REGNUM)];
c906108c
SS
837 }
838}
839
840#if defined (FP0_REGNUM)
841
842/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
843 (fpregset_t *), unpack the register contents and supply them as gdb's
844 idea of the current floating point register values. */
c906108c 845
c5aa993b 846void
fba45db2 847supply_fpregset (fpregset_t *fpregsetp)
c906108c
SS
848{
849 register int regi;
850 char *from;
c5aa993b 851
32eeb91a 852 for (regi = FP0_REGNUM; regi < M68K_FPC_REGNUM; regi++)
c906108c 853 {
c5aa993b 854 from = (char *) &(fpregsetp->f_fpregs[regi - FP0_REGNUM][0]);
c906108c
SS
855 supply_register (regi, from);
856 }
32eeb91a
AS
857 supply_register (M68K_FPC_REGNUM, (char *) &(fpregsetp->f_pcr));
858 supply_register (M68K_FPS_REGNUM, (char *) &(fpregsetp->f_psr));
859 supply_register (M68K_FPI_REGNUM, (char *) &(fpregsetp->f_fpiaddr));
c906108c
SS
860}
861
862/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
863 (fpregset_t *), update the register specified by REGNO from gdb's idea
864 of the current floating point register set. If REGNO is -1, update
865 them all. */
c906108c
SS
866
867void
fba45db2 868fill_fpregset (fpregset_t *fpregsetp, int regno)
c906108c
SS
869{
870 int regi;
871 char *to;
872 char *from;
c906108c 873
32eeb91a 874 for (regi = FP0_REGNUM; regi < M68K_FPC_REGNUM; regi++)
c906108c
SS
875 {
876 if ((regno == -1) || (regno == regi))
877 {
524d7c18 878 from = (char *) &deprecated_registers[REGISTER_BYTE (regi)];
c5aa993b 879 to = (char *) &(fpregsetp->f_fpregs[regi - FP0_REGNUM][0]);
c906108c
SS
880 memcpy (to, from, REGISTER_RAW_SIZE (regi));
881 }
882 }
32eeb91a 883 if ((regno == -1) || (regno == M68K_FPC_REGNUM))
c906108c 884 {
32eeb91a 885 fpregsetp->f_pcr = *(int *) &deprecated_registers[REGISTER_BYTE (M68K_FPC_REGNUM)];
c906108c 886 }
32eeb91a 887 if ((regno == -1) || (regno == M68K_FPS_REGNUM))
c906108c 888 {
32eeb91a 889 fpregsetp->f_psr = *(int *) &deprecated_registers[REGISTER_BYTE (M68K_FPS_REGNUM)];
c906108c 890 }
32eeb91a 891 if ((regno == -1) || (regno == M68K_FPI_REGNUM))
c906108c 892 {
32eeb91a 893 fpregsetp->f_fpiaddr = *(int *) &deprecated_registers[REGISTER_BYTE (M68K_FPI_REGNUM)];
c906108c
SS
894 }
895}
896
c5aa993b 897#endif /* defined (FP0_REGNUM) */
c906108c 898
c5aa993b 899#endif /* USE_PROC_FS */
c906108c 900
c906108c
SS
901/* Figure out where the longjmp will land. Slurp the args out of the stack.
902 We expect the first arg to be a pointer to the jmp_buf structure from which
903 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
904 This routine returns true on success. */
905
2765b798
AC
906/* NOTE: cagney/2000-11-08: For this function to be fully multi-arched
907 the macro's JB_PC and JB_ELEMENT_SIZE would need to be moved into
908 the ``struct gdbarch_tdep'' object and then set on a target ISA/ABI
909 dependant basis. */
910
c906108c 911int
f4281f55 912m68k_get_longjmp_target (CORE_ADDR *pc)
c906108c 913{
2765b798 914#if defined (JB_PC) && defined (JB_ELEMENT_SIZE)
35fc8285 915 char *buf;
c906108c
SS
916 CORE_ADDR sp, jb_addr;
917
35fc8285 918 buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT);
c5aa993b 919 sp = read_register (SP_REGNUM);
c906108c 920
b5d78d39
GS
921 if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
922 buf, TARGET_PTR_BIT / TARGET_CHAR_BIT))
c906108c
SS
923 return 0;
924
925 jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
926
927 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
928 TARGET_PTR_BIT / TARGET_CHAR_BIT))
929 return 0;
930
931 *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
932
933 return 1;
2765b798 934#else
8e65ff28
AC
935 internal_error (__FILE__, __LINE__,
936 "m68k_get_longjmp_target: not implemented");
2765b798
AC
937 return 0;
938#endif
c906108c 939}
c906108c
SS
940
941/* Immediately after a function call, return the saved pc before the frame
942 is setup. For sun3's, we check for the common case of being inside of a
943 system call, and if so, we know that Sun pushes the call # on the stack
944 prior to doing the trap. */
945
946CORE_ADDR
fba45db2 947m68k_saved_pc_after_call (struct frame_info *frame)
c906108c
SS
948{
949#ifdef SYSCALL_TRAP
950 int op;
951
b5fc49aa 952 op = read_memory_unsigned_integer (frame->pc - SYSCALL_TRAP_OFFSET, 2);
c906108c
SS
953
954 if (op == SYSCALL_TRAP)
b5fc49aa 955 return read_memory_unsigned_integer (read_register (SP_REGNUM) + 4, 4);
c906108c
SS
956 else
957#endif /* SYSCALL_TRAP */
b5fc49aa 958 return read_memory_unsigned_integer (read_register (SP_REGNUM), 4);
c906108c
SS
959}
960
152d9db6
GS
961/* Function: m68k_gdbarch_init
962 Initializer function for the m68k gdbarch vector.
963 Called by gdbarch. Sets up the gdbarch vector(s) for this target. */
964
965static struct gdbarch *
966m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
967{
a2c6a6d5
GS
968 static LONGEST call_dummy_words[7] = { 0xf227e0ff, 0x48e7fffc, 0x426742e7,
969 0x4eb93232, 0x3232dffc, 0x69696969,
970 (0x4e404e71 | (BPT_VECTOR << 16))
971 };
152d9db6
GS
972 struct gdbarch_tdep *tdep = NULL;
973 struct gdbarch *gdbarch;
974
975 /* find a candidate among the list of pre-declared architectures. */
976 arches = gdbarch_list_lookup_by_info (arches, &info);
977 if (arches != NULL)
978 return (arches->gdbarch);
979
980#if 0
981 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
982#endif
6300c360 983
152d9db6
GS
984 gdbarch = gdbarch_alloc (&info, 0);
985
5d3ed2e3
GS
986 set_gdbarch_long_double_format (gdbarch, &floatformat_m68881_ext);
987 set_gdbarch_long_double_bit (gdbarch, 96);
988
989 set_gdbarch_function_start_offset (gdbarch, 0);
990
991 set_gdbarch_skip_prologue (gdbarch, m68k_skip_prologue);
992 set_gdbarch_saved_pc_after_call (gdbarch, m68k_saved_pc_after_call);
103a1597 993 set_gdbarch_breakpoint_from_pc (gdbarch, m68k_local_breakpoint_from_pc);
5d3ed2e3
GS
994
995 /* Stack grows down. */
996 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
997 set_gdbarch_stack_align (gdbarch, m68k_stack_align);
998
6300c360
GS
999
1000 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
942dc0e9
GS
1001 set_gdbarch_decr_pc_after_break (gdbarch, 2);
1002
1003 set_gdbarch_store_struct_return (gdbarch, m68k_store_struct_return);
1004 set_gdbarch_deprecated_extract_return_value (gdbarch,
1005 m68k_deprecated_extract_return_value);
ebba8386 1006 set_gdbarch_deprecated_store_return_value (gdbarch, m68k_store_return_value);
942dc0e9
GS
1007
1008 set_gdbarch_frame_chain (gdbarch, m68k_frame_chain);
6300c360 1009 set_gdbarch_frame_chain_valid (gdbarch, generic_func_frame_chain_valid);
942dc0e9
GS
1010 set_gdbarch_frame_saved_pc (gdbarch, m68k_frame_saved_pc);
1011 set_gdbarch_frame_init_saved_regs (gdbarch, m68k_frame_init_saved_regs);
1012 set_gdbarch_frameless_function_invocation (gdbarch,
1013 m68k_frameless_function_invocation);
6300c360
GS
1014 /* OK to default this value to 'unknown'. */
1015 set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
1016 set_gdbarch_frame_args_skip (gdbarch, 8);
942dc0e9 1017
5d3ed2e3
GS
1018 set_gdbarch_register_raw_size (gdbarch, m68k_register_raw_size);
1019 set_gdbarch_register_virtual_size (gdbarch, m68k_register_virtual_size);
1020 set_gdbarch_max_register_raw_size (gdbarch, 12);
1021 set_gdbarch_max_register_virtual_size (gdbarch, 12);
1022 set_gdbarch_register_virtual_type (gdbarch, m68k_register_virtual_type);
1023 set_gdbarch_register_name (gdbarch, m68k_register_name);
1024 set_gdbarch_register_size (gdbarch, 4);
1025 set_gdbarch_register_byte (gdbarch, m68k_register_byte);
942dc0e9
GS
1026 set_gdbarch_num_regs (gdbarch, 29);
1027 set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
1028 set_gdbarch_register_bytes (gdbarch, (16 * 4 + 8 + 8 * 12 + 3 * 4));
32eeb91a
AS
1029 set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
1030 set_gdbarch_fp_regnum (gdbarch, M68K_FP_REGNUM);
1031 set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);
1032 set_gdbarch_ps_regnum (gdbarch, M68K_PS_REGNUM);
1033 set_gdbarch_fp0_regnum (gdbarch, M68K_FP0_REGNUM);
a2c6a6d5 1034
07555a72 1035 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
7f8e7424
GS
1036 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
1037 set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
a2c6a6d5 1038 set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 24);
b4b88177 1039 set_gdbarch_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
7f8e7424
GS
1040 set_gdbarch_call_dummy_p (gdbarch, 1);
1041 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
1042 set_gdbarch_call_dummy_length (gdbarch, 28);
1043 set_gdbarch_call_dummy_start_offset (gdbarch, 12);
a2c6a6d5 1044
7f8e7424
GS
1045 set_gdbarch_call_dummy_words (gdbarch, call_dummy_words);
1046 set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (call_dummy_words));
1047 set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
1048 set_gdbarch_fix_call_dummy (gdbarch, m68k_fix_call_dummy);
1049 set_gdbarch_push_dummy_frame (gdbarch, m68k_push_dummy_frame);
1050 set_gdbarch_pop_frame (gdbarch, m68k_pop_frame);
a2c6a6d5 1051
152d9db6
GS
1052 return gdbarch;
1053}
1054
1055
1056static void
1057m68k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
1058{
1059
1060}
2acceee2 1061
c906108c 1062void
fba45db2 1063_initialize_m68k_tdep (void)
c906108c 1064{
152d9db6 1065 gdbarch_register (bfd_arch_m68k, m68k_gdbarch_init, m68k_dump_tdep);
c906108c
SS
1066 tm_print_insn = print_insn_m68k;
1067}
This page took 0.355758 seconds and 4 git commands to generate.