aboutsummaryrefslogtreecommitdiff
path: root/gdb/tm-68k.h
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>1991-10-24 10:21:41 +0000
committerFred Fish <fnf@specifix.com>1991-10-24 10:21:41 +0000
commitdcd15e5e7a267b5a91373155bb0f183ae4ec18e9 (patch)
tree4ad266fc9646c0697a99cdf7e4542395b656d7ab /gdb/tm-68k.h
parent150f5436253236069fabd06db673ba39059f7a1f (diff)
downloadgdb-dcd15e5e7a267b5a91373155bb0f183ae4ec18e9.zip
gdb-dcd15e5e7a267b5a91373155bb0f183ae4ec18e9.tar.gz
gdb-dcd15e5e7a267b5a91373155bb0f183ae4ec18e9.tar.bz2
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).
Diffstat (limited to 'gdb/tm-68k.h')
-rw-r--r--gdb/tm-68k.h53
1 files changed, 52 insertions, 1 deletions
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