* Makefile.in (m68k-tdep.o, m68klinux-tdep.o): Update
[deliverable/binutils-gdb.git] / gdb / m68k-tdep.c
CommitLineData
c906108c 1/* Target dependent code for the Motorola 68000 series.
51603483
DJ
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
3 2002, 2003
a1de33a8 4 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include "defs.h"
24#include "frame.h"
8de307e0
AS
25#include "frame-base.h"
26#include "frame-unwind.h"
c906108c
SS
27#include "symtab.h"
28#include "gdbcore.h"
29#include "value.h"
30#include "gdb_string.h"
8de307e0 31#include "gdb_assert.h"
7a292a7a 32#include "inferior.h"
4e052eda 33#include "regcache.h"
5d3ed2e3 34#include "arch-utils.h"
55809acb 35#include "osabi.h"
32eeb91a
AS
36
37#include "m68k-tdep.h"
c906108c 38\f
c5aa993b 39
89c3b6d3
PDM
40#define P_LINKL_FP 0x480e
41#define P_LINKW_FP 0x4e56
42#define P_PEA_FP 0x4856
8de307e0
AS
43#define P_MOVEAL_SP_FP 0x2c4f
44#define P_ADDAW_SP 0xdefc
45#define P_ADDAL_SP 0xdffc
46#define P_SUBQW_SP 0x514f
47#define P_SUBQL_SP 0x518f
48#define P_LEA_SP_SP 0x4fef
49#define P_LEA_PC_A5 0x4bfb0170
50#define P_FMOVEMX_SP 0xf227
51#define P_MOVEL_SP 0x2f00
52#define P_MOVEML_SP 0x48e7
89c3b6d3 53
103a1597 54
103a1597
GS
55#define REGISTER_BYTES_FP (16*4 + 8 + 8*12 + 3*4)
56#define REGISTER_BYTES_NOFP (16*4 + 8)
57
103a1597 58/* Offset from SP to first arg on stack at first instruction of a function */
103a1597
GS
59#define SP_ARG0 (1 * 4)
60
103a1597
GS
61#if !defined (BPT_VECTOR)
62#define BPT_VECTOR 0xf
63#endif
64
65#if !defined (REMOTE_BPT_VECTOR)
66#define REMOTE_BPT_VECTOR 1
67#endif
68
69
103a1597
GS
70/* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc
71 so m68k_remote_breakpoint_from_pc is currently not used. */
72
eb2e12d7 73static const unsigned char *
103a1597
GS
74m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
75{
76 static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)};
77 *lenptr = sizeof (break_insn);
78 return break_insn;
79}
80
eb2e12d7 81static const unsigned char *
103a1597
GS
82m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
83{
84 static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
85 *lenptr = sizeof (break_insn);
86 return break_insn;
87}
88
89
942dc0e9 90static int
5ae5f592 91m68k_register_bytes_ok (long numbytes)
942dc0e9
GS
92{
93 return ((numbytes == REGISTER_BYTES_FP)
94 || (numbytes == REGISTER_BYTES_NOFP));
95}
96
d85fe7f7
AS
97/* Return the GDB type object for the "standard" data type of data in
98 register N. This should be int for D0-D7, SR, FPCONTROL and
99 FPSTATUS, long double for FP0-FP7, and void pointer for all others
100 (A0-A7, PC, FPIADDR). Note, for registers which contain
101 addresses return pointer to void, not pointer to char, because we
102 don't want to attempt to print the string after printing the
103 address. */
5d3ed2e3
GS
104
105static struct type *
8de307e0 106m68k_register_type (struct gdbarch *gdbarch, int regnum)
5d3ed2e3 107{
03dac896
AS
108 if (regnum >= FP0_REGNUM && regnum <= FP0_REGNUM + 7)
109 return builtin_type_m68881_ext;
110
32eeb91a 111 if (regnum == M68K_FPI_REGNUM || regnum == PC_REGNUM)
03dac896
AS
112 return builtin_type_void_func_ptr;
113
32eeb91a
AS
114 if (regnum == M68K_FPC_REGNUM || regnum == M68K_FPS_REGNUM
115 || regnum == PS_REGNUM)
03dac896
AS
116 return builtin_type_int32;
117
32eeb91a 118 if (regnum >= M68K_A0_REGNUM && regnum <= M68K_A0_REGNUM + 7)
03dac896
AS
119 return builtin_type_void_data_ptr;
120
121 return builtin_type_int32;
5d3ed2e3
GS
122}
123
124/* Function: m68k_register_name
125 Returns the name of the standard m68k register regnum. */
126
127static const char *
128m68k_register_name (int regnum)
129{
130 static char *register_names[] = {
131 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
132 "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",
133 "ps", "pc",
134 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
135 "fpcontrol", "fpstatus", "fpiaddr", "fpcode", "fpflags"
136 };
137
138 if (regnum < 0 ||
139 regnum >= sizeof (register_names) / sizeof (register_names[0]))
140 internal_error (__FILE__, __LINE__,
141 "m68k_register_name: illegal register number %d", regnum);
142 else
143 return register_names[regnum];
144}
145
5d3ed2e3
GS
146/* Index within `registers' of the first byte of the space for
147 register regnum. */
148
149static int
150m68k_register_byte (int regnum)
151{
32eeb91a
AS
152 if (regnum >= M68K_FPC_REGNUM)
153 return (((regnum - M68K_FPC_REGNUM) * 4) + 168);
5d3ed2e3
GS
154 else if (regnum >= FP0_REGNUM)
155 return (((regnum - FP0_REGNUM) * 12) + 72);
156 else
157 return (regnum * 4);
158}
8de307e0
AS
159\f
160/* Extract from an array REGBUF containing the (raw) register state, a
161 function return value of TYPE, and copy that, in virtual format,
162 into VALBUF. */
942dc0e9
GS
163
164static void
8de307e0
AS
165m68k_extract_return_value (struct type *type, struct regcache *regcache,
166 void *valbuf)
942dc0e9 167{
8de307e0
AS
168 int len = TYPE_LENGTH (type);
169 char buf[M68K_MAX_REGISTER_SIZE];
942dc0e9 170
8de307e0
AS
171 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
172 && TYPE_NFIELDS (type) == 1)
173 {
174 m68k_extract_return_value (TYPE_FIELD_TYPE (type, 0), regcache, valbuf);
175 return;
176 }
942dc0e9 177
8de307e0
AS
178 if (len <= 4)
179 {
180 regcache_raw_read (regcache, M68K_D0_REGNUM, buf);
181 memcpy (valbuf, buf + (4 - len), len);
182 }
183 else if (len <= 8)
184 {
185 regcache_raw_read (regcache, M68K_D0_REGNUM, buf);
186 memcpy (valbuf, buf + (8 - len), len - 4);
187 regcache_raw_read (regcache, M68K_D1_REGNUM,
188 (char *) valbuf + (len - 4));
189 }
190 else
191 internal_error (__FILE__, __LINE__,
192 "Cannot extract return value of %d bytes long.", len);
942dc0e9
GS
193}
194
8de307e0
AS
195/* Write into the appropriate registers a function return value stored
196 in VALBUF of type TYPE, given in virtual format. */
942dc0e9
GS
197
198static void
8de307e0
AS
199m68k_store_return_value (struct type *type, struct regcache *regcache,
200 const void *valbuf)
942dc0e9 201{
8de307e0 202 int len = TYPE_LENGTH (type);
942dc0e9 203
8de307e0
AS
204 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
205 && TYPE_NFIELDS (type) == 1)
206 {
207 m68k_store_return_value (TYPE_FIELD_TYPE (type, 0), regcache, valbuf);
208 return;
209 }
942dc0e9 210
8de307e0
AS
211 if (len <= 4)
212 regcache_raw_write_part (regcache, M68K_D0_REGNUM, 4 - len, len, valbuf);
213 else if (len <= 8)
214 {
215 regcache_raw_write_part (regcache, M68K_D1_REGNUM, 8 - len,
216 len - 4, valbuf);
217 regcache_raw_write (regcache, M68K_D0_REGNUM,
218 (char *) valbuf + (len - 4));
219 }
220 else
221 internal_error (__FILE__, __LINE__,
222 "Cannot store return value of %d bytes long.", len);
223}
942dc0e9 224
8de307e0
AS
225/* Extract from REGCACHE, which contains the (raw) register state, the
226 address in which a function should return its structure value, as a
227 CORE_ADDR. */
942dc0e9
GS
228
229static CORE_ADDR
8de307e0 230m68k_extract_struct_value_address (struct regcache *regcache)
942dc0e9 231{
8de307e0
AS
232 char buf[4];
233
234 regcache_cooked_read (regcache, M68K_D0_REGNUM, buf);
235 return extract_unsigned_integer (buf, 4);
942dc0e9
GS
236}
237
238/* A function that tells us whether the function invocation represented
239 by fi does not have a frame on the stack associated with it. If it
240 does not, FRAMELESS is set to 1, else 0. */
241
242static int
243m68k_frameless_function_invocation (struct frame_info *fi)
244{
32eeb91a 245 if (get_frame_type (fi) == SIGTRAMP_FRAME)
942dc0e9
GS
246 return 0;
247 else
248 return frameless_look_for_prologue (fi);
249}
250
89c3b6d3 251int
fba45db2 252delta68_in_sigtramp (CORE_ADDR pc, char *name)
89c3b6d3 253{
1bd54964
AC
254 if (name != NULL)
255 return strcmp (name, "_sigcode") == 0;
256 else
257 return 0;
89c3b6d3
PDM
258}
259
260CORE_ADDR
fba45db2 261delta68_frame_args_address (struct frame_info *frame_info)
89c3b6d3
PDM
262{
263 /* we assume here that the only frameless functions are the system calls
264 or other functions who do not put anything on the stack. */
32eeb91a 265 if (get_frame_type (frame_info) == SIGTRAMP_FRAME)
1e2330ba 266 return get_frame_base (frame_info) + 12;
89c3b6d3
PDM
267 else if (frameless_look_for_prologue (frame_info))
268 {
b5d78d39 269 /* Check for an interrupted system call */
11c02a10
AC
270 if (get_next_frame (frame_info) && (get_frame_type (get_next_frame (frame_info)) == SIGTRAMP_FRAME))
271 return get_frame_base (get_next_frame (frame_info)) + 16;
b5d78d39 272 else
1e2330ba 273 return get_frame_base (frame_info) + 4;
89c3b6d3
PDM
274 }
275 else
1e2330ba 276 return get_frame_base (frame_info);
89c3b6d3
PDM
277}
278
279CORE_ADDR
fba45db2 280delta68_frame_saved_pc (struct frame_info *frame_info)
89c3b6d3 281{
b5fc49aa
AS
282 return read_memory_unsigned_integer (delta68_frame_args_address (frame_info)
283 + 4, 4);
89c3b6d3
PDM
284}
285
392a587b 286int
fba45db2 287delta68_frame_num_args (struct frame_info *fi)
392a587b
JM
288{
289 int val;
8bedc050 290 CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi);
b5fc49aa 291 int insn = read_memory_unsigned_integer (pc, 2);
392a587b 292 val = 0;
c5aa993b 293 if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
392a587b 294 val = read_memory_integer (pc + 2, 2);
c5aa993b
JM
295 else if ((insn & 0170777) == 0050217 /* addql #N, sp */
296 || (insn & 0170777) == 0050117) /* addqw */
392a587b
JM
297 {
298 val = (insn >> 9) & 7;
299 if (val == 0)
300 val = 8;
301 }
c5aa993b 302 else if (insn == 0157774) /* addal #WW, sp */
392a587b
JM
303 val = read_memory_integer (pc + 2, 4);
304 val >>= 2;
305 return val;
306}
307
8de307e0
AS
308static CORE_ADDR
309m68k_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
310 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
311 struct value **args, CORE_ADDR sp, int struct_return,
312 CORE_ADDR struct_addr)
7f8e7424 313{
8de307e0
AS
314 char buf[4];
315 int i;
316
317 /* Push arguments in reverse order. */
318 for (i = nargs - 1; i >= 0; i--)
319 {
320 int len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[i]));
321 int container_len = (len + 3) & ~3;
322 int offset = container_len - len;
323
324 sp -= container_len;
325 write_memory (sp + offset, VALUE_CONTENTS_ALL (args[i]), len);
326 }
327
328 /* Push value address. */
329 if (struct_return)
330 {
331 sp -= 4;
332 store_unsigned_integer (buf, 4, struct_addr);
333 write_memory (sp, buf, 4);
334 }
335
336 /* Store return address. */
337 sp -= 4;
338 store_unsigned_integer (buf, 4, bp_addr);
339 write_memory (sp, buf, 4);
340
341 /* Finally, update the stack pointer... */
342 store_unsigned_integer (buf, 4, sp);
343 regcache_cooked_write (regcache, M68K_SP_REGNUM, buf);
344
345 /* ...and fake a frame pointer. */
346 regcache_cooked_write (regcache, M68K_FP_REGNUM, buf);
347
348 /* DWARF2/GCC uses the stack address *before* the function call as a
349 frame's CFA. */
350 return sp + 8;
7f8e7424 351}
8de307e0
AS
352\f
353struct m68k_frame_cache
354{
355 /* Base address. */
356 CORE_ADDR base;
357 CORE_ADDR sp_offset;
358 CORE_ADDR pc;
7f8e7424 359
8de307e0
AS
360 /* Saved registers. */
361 CORE_ADDR saved_regs[M68K_NUM_REGS];
362 CORE_ADDR saved_sp;
7f8e7424 363
8de307e0
AS
364 /* Stack space reserved for local variables. */
365 long locals;
366};
c906108c 367
8de307e0
AS
368/* Allocate and initialize a frame cache. */
369
370static struct m68k_frame_cache *
371m68k_alloc_frame_cache (void)
c906108c 372{
8de307e0
AS
373 struct m68k_frame_cache *cache;
374 int i;
c906108c 375
8de307e0 376 cache = FRAME_OBSTACK_ZALLOC (struct m68k_frame_cache);
c906108c 377
8de307e0
AS
378 /* Base address. */
379 cache->base = 0;
380 cache->sp_offset = -4;
381 cache->pc = 0;
c906108c 382
8de307e0
AS
383 /* Saved registers. We initialize these to -1 since zero is a valid
384 offset (that's where %fp is supposed to be stored). */
385 for (i = 0; i < M68K_NUM_REGS; i++)
386 cache->saved_regs[i] = -1;
387
388 /* Frameless until proven otherwise. */
389 cache->locals = -1;
390
391 return cache;
c906108c
SS
392}
393
8de307e0
AS
394/* Check whether PC points at a code that sets up a new stack frame.
395 If so, it updates CACHE and returns the address of the first
396 instruction after the sequence that sets removes the "hidden"
397 argument from the stack or CURRENT_PC, whichever is smaller.
398 Otherwise, return PC. */
c906108c 399
8de307e0
AS
400static CORE_ADDR
401m68k_analyze_frame_setup (CORE_ADDR pc, CORE_ADDR current_pc,
402 struct m68k_frame_cache *cache)
c906108c 403{
8de307e0
AS
404 int op;
405
406 if (pc >= current_pc)
407 return current_pc;
c906108c 408
8de307e0
AS
409 op = read_memory_unsigned_integer (pc, 2);
410
411 if (op == P_LINKW_FP || op == P_LINKL_FP || op == P_PEA_FP)
c906108c 412 {
8de307e0
AS
413 cache->saved_regs[M68K_FP_REGNUM] = 0;
414 cache->sp_offset += 4;
415 if (op == P_LINKW_FP)
416 {
417 /* link.w %fp, #-N */
418 /* link.w %fp, #0; adda.l #-N, %sp */
419 cache->locals = -read_memory_integer (pc + 2, 2);
420
421 if (pc + 4 < current_pc && cache->locals == 0)
422 {
423 op = read_memory_unsigned_integer (pc + 4, 2);
424 if (op == P_ADDAL_SP)
425 {
426 cache->locals = read_memory_integer (pc + 6, 4);
427 return pc + 10;
428 }
429 }
430
431 return pc + 4;
432 }
433 else if (op == P_LINKL_FP)
c906108c 434 {
8de307e0
AS
435 /* link.l %fp, #-N */
436 cache->locals = -read_memory_integer (pc + 2, 4);
437 return pc + 6;
438 }
439 else
440 {
441 /* pea (%fp); movea.l %sp, %fp */
442 cache->locals = 0;
443
444 if (pc + 2 < current_pc)
445 {
446 op = read_memory_unsigned_integer (pc + 2, 2);
447
448 if (op == P_MOVEAL_SP_FP)
449 {
450 /* move.l %sp, %fp */
451 return pc + 4;
452 }
453 }
454
455 return pc + 2;
c906108c
SS
456 }
457 }
8de307e0 458 else if ((op & 0170777) == P_SUBQW_SP || (op & 0170777) == P_SUBQL_SP)
c906108c 459 {
8de307e0
AS
460 /* subq.[wl] #N,%sp */
461 /* subq.[wl] #8,%sp; subq.[wl] #N,%sp */
462 cache->locals = (op & 07000) == 0 ? 8 : (op & 07000) >> 9;
463 if (pc + 2 < current_pc)
c906108c 464 {
8de307e0
AS
465 op = read_memory_unsigned_integer (pc + 2, 2);
466 if ((op & 0170777) == P_SUBQW_SP || (op & 0170777) == P_SUBQL_SP)
467 {
468 cache->locals += (op & 07000) == 0 ? 8 : (op & 07000) >> 9;
469 return pc + 4;
470 }
c906108c 471 }
8de307e0
AS
472 return pc + 2;
473 }
474 else if (op == P_ADDAW_SP || op == P_LEA_SP_SP)
475 {
476 /* adda.w #-N,%sp */
477 /* lea (-N,%sp),%sp */
478 cache->locals = -read_memory_integer (pc + 2, 2);
479 return pc + 4;
c906108c 480 }
8de307e0 481 else if (op == P_ADDAL_SP)
c906108c 482 {
8de307e0
AS
483 /* adda.l #-N,%sp */
484 cache->locals = -read_memory_integer (pc + 2, 4);
485 return pc + 6;
c906108c 486 }
8de307e0
AS
487
488 return pc;
c906108c 489}
c5aa993b 490
8de307e0
AS
491/* Check whether PC points at code that saves registers on the stack.
492 If so, it updates CACHE and returns the address of the first
493 instruction after the register saves or CURRENT_PC, whichever is
494 smaller. Otherwise, return PC. */
c906108c 495
8de307e0
AS
496static CORE_ADDR
497m68k_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
498 struct m68k_frame_cache *cache)
499{
500 if (cache->locals >= 0)
501 {
502 CORE_ADDR offset;
503 int op;
504 int i, mask, regno;
c906108c 505
8de307e0
AS
506 offset = -4 - cache->locals;
507 while (pc < current_pc)
508 {
509 op = read_memory_unsigned_integer (pc, 2);
510 if (op == P_FMOVEMX_SP)
511 {
512 /* fmovem.x REGS,-(%sp) */
513 op = read_memory_unsigned_integer (pc + 2, 2);
514 if ((op & 0xff00) == 0xe000)
515 {
516 mask = op & 0xff;
517 for (i = 0; i < 16; i++, mask >>= 1)
518 {
519 if (mask & 1)
520 {
521 cache->saved_regs[i + M68K_FP0_REGNUM] = offset;
522 offset -= 12;
523 }
524 }
525 pc += 4;
526 }
527 else
528 break;
529 }
530 else if ((op & 0170677) == P_MOVEL_SP)
531 {
532 /* move.l %R,-(%sp) */
533 regno = ((op & 07000) >> 9) | ((op & 0100) >> 3);
534 cache->saved_regs[regno] = offset;
535 offset -= 4;
536 pc += 2;
537 }
538 else if (op == P_MOVEML_SP)
539 {
540 /* movem.l REGS,-(%sp) */
541 mask = read_memory_unsigned_integer (pc + 2, 2);
542 for (i = 0; i < 16; i++, mask >>= 1)
543 {
544 if (mask & 1)
545 {
546 cache->saved_regs[15 - i] = offset;
547 offset -= 4;
548 }
549 }
550 pc += 4;
551 }
552 else
553 break;
554 }
555 }
556
557 return pc;
558}
c906108c 559
c906108c 560
8de307e0
AS
561/* Do a full analysis of the prologue at PC and update CACHE
562 accordingly. Bail out early if CURRENT_PC is reached. Return the
563 address where the analysis stopped.
c906108c 564
8de307e0 565 We handle all cases that can be generated by gcc.
c906108c 566
8de307e0 567 For allocating a stack frame:
c906108c 568
8de307e0
AS
569 link.w %a6,#-N
570 link.l %a6,#-N
571 pea (%fp); move.l %sp,%fp
572 link.w %a6,#0; add.l #-N,%sp
573 subq.l #N,%sp
574 subq.w #N,%sp
575 subq.w #8,%sp; subq.w #N-8,%sp
576 add.w #-N,%sp
577 lea (-N,%sp),%sp
578 add.l #-N,%sp
c906108c 579
8de307e0 580 For saving registers:
c906108c 581
8de307e0
AS
582 fmovem.x REGS,-(%sp)
583 move.l R1,-(%sp)
584 move.l R1,-(%sp); move.l R2,-(%sp)
585 movem.l REGS,-(%sp)
c906108c 586
8de307e0 587 For setting up the PIC register:
c906108c 588
8de307e0 589 lea (%pc,N),%a5
c906108c 590
8de307e0 591 */
c906108c 592
eb2e12d7 593static CORE_ADDR
8de307e0
AS
594m68k_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
595 struct m68k_frame_cache *cache)
c906108c 596{
8de307e0 597 unsigned int op;
c906108c 598
8de307e0
AS
599 pc = m68k_analyze_frame_setup (pc, current_pc, cache);
600 pc = m68k_analyze_register_saves (pc, current_pc, cache);
601 if (pc >= current_pc)
602 return current_pc;
c906108c 603
8de307e0
AS
604 /* Check for GOT setup. */
605 op = read_memory_unsigned_integer (pc, 4);
606 if (op == P_LEA_PC_A5)
c906108c 607 {
8de307e0
AS
608 /* lea (%pc,N),%a5 */
609 return pc + 6;
c906108c 610 }
8de307e0
AS
611
612 return pc;
c906108c
SS
613}
614
8de307e0 615/* Return PC of first real instruction. */
7f8e7424 616
8de307e0
AS
617static CORE_ADDR
618m68k_skip_prologue (CORE_ADDR start_pc)
c906108c 619{
8de307e0
AS
620 struct m68k_frame_cache cache;
621 CORE_ADDR pc;
622 int op;
c906108c 623
8de307e0
AS
624 cache.locals = -1;
625 pc = m68k_analyze_prologue (start_pc, (CORE_ADDR) -1, &cache);
626 if (cache.locals < 0)
627 return start_pc;
628 return pc;
629}
c906108c 630
8de307e0
AS
631static CORE_ADDR
632m68k_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
633{
634 char buf[8];
7f8e7424 635
8de307e0
AS
636 frame_unwind_register (next_frame, PC_REGNUM, buf);
637 return extract_typed_address (buf, builtin_type_void_func_ptr);
638}
639\f
640/* Normal frames. */
7f8e7424 641
8de307e0
AS
642static struct m68k_frame_cache *
643m68k_frame_cache (struct frame_info *next_frame, void **this_cache)
644{
645 struct m68k_frame_cache *cache;
646 char buf[4];
647 int i;
648
649 if (*this_cache)
650 return *this_cache;
651
652 cache = m68k_alloc_frame_cache ();
653 *this_cache = cache;
654
655 /* In principle, for normal frames, %fp holds the frame pointer,
656 which holds the base address for the current stack frame.
657 However, for functions that don't need it, the frame pointer is
658 optional. For these "frameless" functions the frame pointer is
659 actually the frame pointer of the calling frame. Signal
660 trampolines are just a special case of a "frameless" function.
661 They (usually) share their frame pointer with the frame that was
662 in progress when the signal occurred. */
663
664 frame_unwind_register (next_frame, M68K_FP_REGNUM, buf);
665 cache->base = extract_unsigned_integer (buf, 4);
666 if (cache->base == 0)
667 return cache;
668
669 /* For normal frames, %pc is stored at 4(%fp). */
670 cache->saved_regs[M68K_PC_REGNUM] = 4;
671
672 cache->pc = frame_func_unwind (next_frame);
673 if (cache->pc != 0)
674 m68k_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
675
676 if (cache->locals < 0)
677 {
678 /* We didn't find a valid frame, which means that CACHE->base
679 currently holds the frame pointer for our calling frame. If
680 we're at the start of a function, or somewhere half-way its
681 prologue, the function's frame probably hasn't been fully
682 setup yet. Try to reconstruct the base address for the stack
683 frame by looking at the stack pointer. For truly "frameless"
684 functions this might work too. */
685
686 frame_unwind_register (next_frame, M68K_SP_REGNUM, buf);
687 cache->base = extract_unsigned_integer (buf, 4) + cache->sp_offset;
688 }
7f8e7424 689
8de307e0
AS
690 /* Now that we have the base address for the stack frame we can
691 calculate the value of %sp in the calling frame. */
692 cache->saved_sp = cache->base + 8;
7f8e7424 693
8de307e0
AS
694 /* Adjust all the saved registers such that they contain addresses
695 instead of offsets. */
696 for (i = 0; i < M68K_NUM_REGS; i++)
697 if (cache->saved_regs[i] != -1)
698 cache->saved_regs[i] += cache->base;
c906108c 699
8de307e0
AS
700 return cache;
701}
c906108c 702
8de307e0
AS
703static void
704m68k_frame_this_id (struct frame_info *next_frame, void **this_cache,
705 struct frame_id *this_id)
706{
707 struct m68k_frame_cache *cache = m68k_frame_cache (next_frame, this_cache);
c906108c 708
8de307e0
AS
709 /* This marks the outermost frame. */
710 if (cache->base == 0)
711 return;
c5aa993b 712
8de307e0
AS
713 /* See the end of m68k_push_dummy_call. */
714 *this_id = frame_id_build (cache->base + 8, cache->pc);
715}
c5aa993b 716
8de307e0
AS
717static void
718m68k_frame_prev_register (struct frame_info *next_frame, void **this_cache,
719 int regnum, int *optimizedp,
720 enum lval_type *lvalp, CORE_ADDR *addrp,
721 int *realnump, void *valuep)
722{
723 struct m68k_frame_cache *cache = m68k_frame_cache (next_frame, this_cache);
724
725 gdb_assert (regnum >= 0);
726
727 if (regnum == M68K_SP_REGNUM && cache->saved_sp)
c5aa993b 728 {
8de307e0
AS
729 *optimizedp = 0;
730 *lvalp = not_lval;
731 *addrp = 0;
732 *realnump = -1;
733 if (valuep)
c906108c 734 {
8de307e0
AS
735 /* Store the value. */
736 store_unsigned_integer (valuep, 4, cache->saved_sp);
89c3b6d3 737 }
8de307e0
AS
738 return;
739 }
740
741 if (regnum < M68K_NUM_REGS && cache->saved_regs[regnum] != -1)
742 {
743 *optimizedp = 0;
744 *lvalp = lval_memory;
745 *addrp = cache->saved_regs[regnum];
746 *realnump = -1;
747 if (valuep)
89c3b6d3 748 {
8de307e0
AS
749 /* Read the value in from memory. */
750 read_memory (*addrp, valuep,
751 register_size (current_gdbarch, regnum));
89c3b6d3 752 }
8de307e0 753 return;
c906108c 754 }
8de307e0
AS
755
756 frame_register_unwind (next_frame, regnum,
757 optimizedp, lvalp, addrp, realnump, valuep);
758}
759
760static const struct frame_unwind m68k_frame_unwind =
761{
762 NORMAL_FRAME,
763 m68k_frame_this_id,
764 m68k_frame_prev_register
765};
766
767static const struct frame_unwind *
768m68k_frame_p (CORE_ADDR pc)
769{
770 return &m68k_frame_unwind;
771}
772\f
773/* Signal trampolines. */
774
775static struct m68k_frame_cache *
776m68k_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
777{
778 struct m68k_frame_cache *cache;
779 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
780 struct m68k_sigtramp_info info;
781 char buf[4];
782 int i;
783
784 if (*this_cache)
785 return *this_cache;
786
787 cache = m68k_alloc_frame_cache ();
788
789 frame_unwind_register (next_frame, M68K_SP_REGNUM, buf);
790 cache->base = extract_unsigned_integer (buf, 4) - 4;
791
792 info = tdep->get_sigtramp_info (next_frame);
793
794 for (i = 0; i < M68K_NUM_REGS; i++)
795 if (info.sc_reg_offset[i] != -1)
796 cache->saved_regs[i] = info.sigcontext_addr + info.sc_reg_offset[i];
797
798 *this_cache = cache;
799 return cache;
800}
801
802static void
803m68k_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache,
804 struct frame_id *this_id)
805{
806 struct m68k_frame_cache *cache =
807 m68k_sigtramp_frame_cache (next_frame, this_cache);
808
809 /* See the end of m68k_push_dummy_call. */
810 *this_id = frame_id_build (cache->base + 8, frame_pc_unwind (next_frame));
811}
812
813static void
814m68k_sigtramp_frame_prev_register (struct frame_info *next_frame,
815 void **this_cache,
816 int regnum, int *optimizedp,
817 enum lval_type *lvalp, CORE_ADDR *addrp,
818 int *realnump, void *valuep)
819{
820 /* Make sure we've initialized the cache. */
821 m68k_sigtramp_frame_cache (next_frame, this_cache);
822
823 m68k_frame_prev_register (next_frame, this_cache, regnum,
824 optimizedp, lvalp, addrp, realnump, valuep);
825}
826
827static const struct frame_unwind m68k_sigtramp_frame_unwind =
828{
829 SIGTRAMP_FRAME,
830 m68k_sigtramp_frame_this_id,
831 m68k_sigtramp_frame_prev_register
832};
833
834static const struct frame_unwind *
835m68k_sigtramp_frame_p (CORE_ADDR pc)
836{
837 char *name;
838
839 /* We shouldn't even bother to try if the OSABI didn't register
840 a get_sigtramp_info handler. */
841 if (!gdbarch_tdep (current_gdbarch)->get_sigtramp_info)
842 return NULL;
843
844 find_pc_partial_function (pc, &name, NULL, NULL);
845 if (PC_IN_SIGTRAMP (pc, name))
846 return &m68k_sigtramp_frame_unwind;
847
848 return NULL;
c906108c 849}
8de307e0
AS
850\f
851static CORE_ADDR
852m68k_frame_base_address (struct frame_info *next_frame, void **this_cache)
853{
854 struct m68k_frame_cache *cache = m68k_frame_cache (next_frame, this_cache);
855
856 return cache->base;
857}
858
859static const struct frame_base m68k_frame_base =
860{
861 &m68k_frame_unwind,
862 m68k_frame_base_address,
863 m68k_frame_base_address,
864 m68k_frame_base_address
865};
866
867static struct frame_id
868m68k_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
869{
870 char buf[4];
871 CORE_ADDR fp;
c906108c 872
8de307e0
AS
873 frame_unwind_register (next_frame, M68K_FP_REGNUM, buf);
874 fp = extract_unsigned_integer (buf, 4);
c906108c 875
8de307e0
AS
876 /* See the end of m68k_push_dummy_call. */
877 return frame_id_build (fp + 8, frame_pc_unwind (next_frame));
878}
879\f
c5aa993b 880#ifdef USE_PROC_FS /* Target dependent support for /proc */
c906108c
SS
881
882#include <sys/procfs.h>
883
c60c0f5f
MS
884/* Prototypes for supply_gregset etc. */
885#include "gregset.h"
886
c906108c 887/* The /proc interface divides the target machine's register set up into
c5aa993b
JM
888 two different sets, the general register set (gregset) and the floating
889 point register set (fpregset). For each set, there is an ioctl to get
890 the current register set and another ioctl to set the current values.
c906108c 891
c5aa993b
JM
892 The actual structure passed through the ioctl interface is, of course,
893 naturally machine dependent, and is different for each set of registers.
894 For the m68k for example, the general register set is typically defined
895 by:
c906108c 896
c5aa993b 897 typedef int gregset_t[18];
c906108c 898
c5aa993b
JM
899 #define R_D0 0
900 ...
901 #define R_PS 17
c906108c 902
c5aa993b 903 and the floating point set by:
c906108c 904
c5aa993b
JM
905 typedef struct fpregset {
906 int f_pcr;
907 int f_psr;
908 int f_fpiaddr;
909 int f_fpregs[8][3]; (8 regs, 96 bits each)
910 } fpregset_t;
c906108c 911
c5aa993b
JM
912 These routines provide the packing and unpacking of gregset_t and
913 fpregset_t formatted data.
c906108c
SS
914
915 */
916
917/* Atari SVR4 has R_SR but not R_PS */
918
919#if !defined (R_PS) && defined (R_SR)
920#define R_PS R_SR
921#endif
922
923/* Given a pointer to a general register set in /proc format (gregset_t *),
c5aa993b
JM
924 unpack the register contents and supply them as gdb's idea of the current
925 register values. */
c906108c
SS
926
927void
fba45db2 928supply_gregset (gregset_t *gregsetp)
c906108c
SS
929{
930 register int regi;
931 register greg_t *regp = (greg_t *) gregsetp;
932
c5aa993b 933 for (regi = 0; regi < R_PC; regi++)
c906108c
SS
934 {
935 supply_register (regi, (char *) (regp + regi));
936 }
937 supply_register (PS_REGNUM, (char *) (regp + R_PS));
938 supply_register (PC_REGNUM, (char *) (regp + R_PC));
939}
940
941void
fba45db2 942fill_gregset (gregset_t *gregsetp, int regno)
c906108c
SS
943{
944 register int regi;
945 register greg_t *regp = (greg_t *) gregsetp;
c906108c 946
c5aa993b 947 for (regi = 0; regi < R_PC; regi++)
c906108c 948 {
8de307e0
AS
949 if (regno == -1 || regno == regi)
950 regcache_collect (regi, regp + regi);
c906108c 951 }
8de307e0
AS
952 if (regno == -1 || regno == PS_REGNUM)
953 regcache_collect (PS_REGNUM, regp + R_PS);
954 if (regno == -1 || regno == PC_REGNUM)
955 regcache_collect (PC_REGNUM, regp + R_PC);
c906108c
SS
956}
957
958#if defined (FP0_REGNUM)
959
960/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
961 (fpregset_t *), unpack the register contents and supply them as gdb's
962 idea of the current floating point register values. */
c906108c 963
c5aa993b 964void
fba45db2 965supply_fpregset (fpregset_t *fpregsetp)
c906108c
SS
966{
967 register int regi;
968 char *from;
c5aa993b 969
32eeb91a 970 for (regi = FP0_REGNUM; regi < M68K_FPC_REGNUM; regi++)
c906108c 971 {
c5aa993b 972 from = (char *) &(fpregsetp->f_fpregs[regi - FP0_REGNUM][0]);
c906108c
SS
973 supply_register (regi, from);
974 }
32eeb91a
AS
975 supply_register (M68K_FPC_REGNUM, (char *) &(fpregsetp->f_pcr));
976 supply_register (M68K_FPS_REGNUM, (char *) &(fpregsetp->f_psr));
977 supply_register (M68K_FPI_REGNUM, (char *) &(fpregsetp->f_fpiaddr));
c906108c
SS
978}
979
980/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
981 (fpregset_t *), update the register specified by REGNO from gdb's idea
982 of the current floating point register set. If REGNO is -1, update
983 them all. */
c906108c
SS
984
985void
fba45db2 986fill_fpregset (fpregset_t *fpregsetp, int regno)
c906108c
SS
987{
988 int regi;
c906108c 989
32eeb91a 990 for (regi = FP0_REGNUM; regi < M68K_FPC_REGNUM; regi++)
c906108c 991 {
8de307e0
AS
992 if (regno == -1 || regno == regi)
993 regcache_collect (regi, &fpregsetp->f_fpregs[regi - FP0_REGNUM][0]);
c906108c 994 }
8de307e0
AS
995 if (regno == -1 || regno == M68K_FPC_REGNUM)
996 regcache_collect (M68K_FPC_REGNUM, &fpregsetp->f_pcr);
997 if (regno == -1 || regno == M68K_FPS_REGNUM)
998 regcache_collect (M68K_FPS_REGNUM, &fpregsetp->f_psr);
999 if (regno == -1 || regno == M68K_FPI_REGNUM)
1000 regcache_collect (M68K_FPI_REGNUM, &fpregsetp->f_fpiaddr);
c906108c
SS
1001}
1002
c5aa993b 1003#endif /* defined (FP0_REGNUM) */
c906108c 1004
c5aa993b 1005#endif /* USE_PROC_FS */
c906108c 1006
c906108c
SS
1007/* Figure out where the longjmp will land. Slurp the args out of the stack.
1008 We expect the first arg to be a pointer to the jmp_buf structure from which
1009 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
1010 This routine returns true on success. */
1011
1012int
f4281f55 1013m68k_get_longjmp_target (CORE_ADDR *pc)
c906108c 1014{
35fc8285 1015 char *buf;
c906108c 1016 CORE_ADDR sp, jb_addr;
eb2e12d7
AS
1017 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1018
1019 if (tdep->jb_pc < 0)
1020 {
1021 internal_error (__FILE__, __LINE__,
1022 "m68k_get_longjmp_target: not implemented");
1023 return 0;
1024 }
c906108c 1025
35fc8285 1026 buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT);
c5aa993b 1027 sp = read_register (SP_REGNUM);
c906108c 1028
b5d78d39
GS
1029 if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
1030 buf, TARGET_PTR_BIT / TARGET_CHAR_BIT))
c906108c
SS
1031 return 0;
1032
7c0b4a20 1033 jb_addr = extract_unsigned_integer (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
c906108c 1034
eb2e12d7 1035 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
c906108c
SS
1036 TARGET_PTR_BIT / TARGET_CHAR_BIT))
1037 return 0;
1038
7c0b4a20 1039 *pc = extract_unsigned_integer (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
c906108c
SS
1040 return 1;
1041}
c906108c 1042
8de307e0 1043#ifdef SYSCALL_TRAP
c906108c
SS
1044/* Immediately after a function call, return the saved pc before the frame
1045 is setup. For sun3's, we check for the common case of being inside of a
1046 system call, and if so, we know that Sun pushes the call # on the stack
1047 prior to doing the trap. */
1048
eb2e12d7 1049static CORE_ADDR
fba45db2 1050m68k_saved_pc_after_call (struct frame_info *frame)
c906108c 1051{
c906108c
SS
1052 int op;
1053
b5fc49aa 1054 op = read_memory_unsigned_integer (frame->pc - SYSCALL_TRAP_OFFSET, 2);
c906108c
SS
1055
1056 if (op == SYSCALL_TRAP)
b5fc49aa 1057 return read_memory_unsigned_integer (read_register (SP_REGNUM) + 4, 4);
c906108c 1058 else
b5fc49aa 1059 return read_memory_unsigned_integer (read_register (SP_REGNUM), 4);
c906108c 1060}
8de307e0 1061#endif /* SYSCALL_TRAP */
c906108c 1062
152d9db6
GS
1063/* Function: m68k_gdbarch_init
1064 Initializer function for the m68k gdbarch vector.
1065 Called by gdbarch. Sets up the gdbarch vector(s) for this target. */
1066
1067static struct gdbarch *
1068m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1069{
1070 struct gdbarch_tdep *tdep = NULL;
1071 struct gdbarch *gdbarch;
1072
1073 /* find a candidate among the list of pre-declared architectures. */
1074 arches = gdbarch_list_lookup_by_info (arches, &info);
1075 if (arches != NULL)
1076 return (arches->gdbarch);
1077
eb2e12d7
AS
1078 tdep = xmalloc (sizeof (struct gdbarch_tdep));
1079 gdbarch = gdbarch_alloc (&info, tdep);
152d9db6 1080
5d3ed2e3
GS
1081 set_gdbarch_long_double_format (gdbarch, &floatformat_m68881_ext);
1082 set_gdbarch_long_double_bit (gdbarch, 96);
1083
1084 set_gdbarch_function_start_offset (gdbarch, 0);
1085
1086 set_gdbarch_skip_prologue (gdbarch, m68k_skip_prologue);
8de307e0 1087#ifdef SYSCALL_TRAP
6913c89a 1088 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, m68k_saved_pc_after_call);
8de307e0 1089#endif
103a1597 1090 set_gdbarch_breakpoint_from_pc (gdbarch, m68k_local_breakpoint_from_pc);
5d3ed2e3
GS
1091
1092 /* Stack grows down. */
1093 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
78bf922a 1094 set_gdbarch_parm_boundary (gdbarch, 32);
6300c360
GS
1095
1096 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
942dc0e9
GS
1097 set_gdbarch_decr_pc_after_break (gdbarch, 2);
1098
8de307e0
AS
1099 set_gdbarch_extract_return_value (gdbarch, m68k_extract_return_value);
1100 set_gdbarch_store_return_value (gdbarch, m68k_store_return_value);
1101 set_gdbarch_extract_struct_value_address (gdbarch,
1102 m68k_extract_struct_value_address);
942dc0e9 1103
942dc0e9
GS
1104 set_gdbarch_frameless_function_invocation (gdbarch,
1105 m68k_frameless_function_invocation);
6300c360 1106 set_gdbarch_frame_args_skip (gdbarch, 8);
942dc0e9 1107
8de307e0 1108 set_gdbarch_register_type (gdbarch, m68k_register_type);
5d3ed2e3 1109 set_gdbarch_register_name (gdbarch, m68k_register_name);
942dc0e9
GS
1110 set_gdbarch_num_regs (gdbarch, 29);
1111 set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
32eeb91a 1112 set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
32eeb91a
AS
1113 set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);
1114 set_gdbarch_ps_regnum (gdbarch, M68K_PS_REGNUM);
1115 set_gdbarch_fp0_regnum (gdbarch, M68K_FP0_REGNUM);
a2c6a6d5 1116
8de307e0 1117 set_gdbarch_push_dummy_call (gdbarch, m68k_push_dummy_call);
6c0e89ed 1118
650fcc91
AS
1119 /* Disassembler. */
1120 set_gdbarch_print_insn (gdbarch, print_insn_m68k);
1121
eb2e12d7
AS
1122#if defined JB_PC && defined JB_ELEMENT_SIZE
1123 tdep->jb_pc = JB_PC;
1124 tdep->jb_elt_size = JB_ELEMENT_SIZE;
1125#else
1126 tdep->jb_pc = -1;
1127#endif
8de307e0
AS
1128 tdep->get_sigtramp_info = NULL;
1129
1130 /* Frame unwinder. */
1131 set_gdbarch_unwind_dummy_id (gdbarch, m68k_unwind_dummy_id);
1132 set_gdbarch_unwind_pc (gdbarch, m68k_unwind_pc);
1133 frame_base_set_default (gdbarch, &m68k_frame_base);
eb2e12d7 1134
55809acb
AS
1135 /* Hook in ABI-specific overrides, if they have been registered. */
1136 gdbarch_init_osabi (info, gdbarch);
1137
eb2e12d7
AS
1138 /* Now we have tuned the configuration, set a few final things,
1139 based on what the OS ABI has told us. */
1140
1141 if (tdep->jb_pc >= 0)
1142 set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
1143
8de307e0
AS
1144 frame_unwind_append_predicate (gdbarch, m68k_sigtramp_frame_p);
1145 frame_unwind_append_predicate (gdbarch, m68k_frame_p);
1146
152d9db6
GS
1147 return gdbarch;
1148}
1149
1150
1151static void
1152m68k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
1153{
eb2e12d7 1154 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
152d9db6 1155
eb2e12d7
AS
1156 if (tdep == NULL)
1157 return;
152d9db6 1158}
2acceee2 1159
a78f21af
AC
1160extern initialize_file_ftype _initialize_m68k_tdep; /* -Wmissing-prototypes */
1161
c906108c 1162void
fba45db2 1163_initialize_m68k_tdep (void)
c906108c 1164{
152d9db6 1165 gdbarch_register (bfd_arch_m68k, m68k_gdbarch_init, m68k_dump_tdep);
c906108c 1166}
This page took 0.414177 seconds and 4 git commands to generate.