From dcd15e5e7a267b5a91373155bb0f183ae4ec18e9 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Thu, 24 Oct 1991 10:21:41 +0000 Subject: Move code duplicated in almost every single m68k based machine to the common target file tm-68k.h. Duplications still need to be removed (FIXME). --- gdb/tm-68k.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) (limited to 'gdb/tm-68k.h') diff --git a/gdb/tm-68k.h b/gdb/tm-68k.h index 3839c4e..2a5893c 100644 --- a/gdb/tm-68k.h +++ b/gdb/tm-68k.h @@ -73,7 +73,7 @@ read_memory_integer (read_register (SP_REGNUM), 4) #endif /* If your kernel resets the pc after the trap happens you may need to - define this in m-68k.h. */ + define this before including this file. */ #if !defined (DECR_PC_AFTER_BREAK) #define DECR_PC_AFTER_BREAK 2 @@ -468,6 +468,57 @@ extern struct ext_format ext_format_68881; #endif /* no 68881. */ #endif /* no FIND_FRAME_SAVED_REGS. */ + +/* Things needed for making the inferior call functions. + It seems like every m68k based machine has almost identical definitions + in the individual machine's configuration files. Most other cpu types + (mips, i386, etc) have routines in their *-tdep.c files to handle this + for most configurations. The m68k family should be able to do this as + well. These macros can still be overridden when necessary. */ + +/* The CALL_DUMMY macro is the sequence of instructions + fmovem 0xff,-(sp) + moveml 0xfffc,-(sp) + clrw -(sp) + movew ccr,-(sp) + /..* The arguments are pushed at this point by GDB; + no code is needed in the dummy for this. + The CALL_DUMMY_START_OFFSET gives the position of + the following jsr instruction. *../ + jsr @#32323232 + addl #69696969,sp + bpt + nop +Note this is 28 bytes. +We actually start executing at the jsr, since the pushing of the +registers is done by PUSH_DUMMY_FRAME. If this were real code, +the arguments for the function called by the jsr would be pushed +between the moveml and the jsr, and we could allow it to execute through. +But the arguments have to be pushed by GDB after the PUSH_DUMMY_FRAME is done, +and we cannot allow the moveml to push the registers again lest they be +taken for the arguments. */ + +#define CALL_DUMMY {0xf227e0ff, 0x48e7fffc, 0x426742e7, 0x4eb93232, 0x3232dffc, 0x69696969, 0x4e414e71} + +#define CALL_DUMMY_LENGTH 28 + +#define CALL_DUMMY_START_OFFSET 12 + +/* Insert the specified number of args and function address + into a call sequence of the above form stored at DUMMYNAME. */ + +#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ +{ *(int *)((char *) dummyname + 20) = nargs * 4; \ + *(int *)((char *) dummyname + 14) = fun; } + +/* Push an empty stack frame, to record the current PC, etc. */ + +#define PUSH_DUMMY_FRAME { m68k_push_dummy_frame (); } + +/* Discard from the stack the innermost frame, restoring all registers. */ + +#define POP_FRAME { m68k_pop_frame (); } + /* Note that stuff for calling inferior functions is not in this file because the call dummy is different for different breakpoint instructions, which are different on different systems. Perhaps -- cgit v1.1