⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm-68k.h

📁 早期freebsd实现
💻 H
📖 第 1 页 / 共 2 页
字号:
	         (TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)),	\	  TYPE_LENGTH(TYPE))#endif/* Write into appropriate registers a function return value   of type TYPE, given in virtual format.  Assumes floats are passed   in d0/d1.  */#if !defined (STORE_RETURN_VALUE)#define STORE_RETURN_VALUE(TYPE,VALBUF) \  write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))#endif/* Extract from an array REGBUF containing the (raw) register state   the address in which a function should return its structure value,   as a CORE_ADDR (or an expression that can be used as one).  */#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))/* Describe the pointer in each stack frame to the previous stack frame   (its caller).  *//* FRAME_CHAIN takes a frame's nominal address and produces the frame's   chain-pointer.   In the case of the 68000, the frame's nominal address   is the address of a 4-byte word containing the calling frame's address.  */#define FRAME_CHAIN(thisframe)  (FRAME_ADDR)m68k_frame_chain(thisframe)/* Define other aspects of the stack frame.  *//* A macro that tells us whether the function invocation represented   by FI does not have a frame on the stack associated with it.  If it   does not, FRAMELESS is set to 1, else 0.  */#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \  (FRAMELESS) = frameless_look_for_prologue(FI)#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4))#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)/* Set VAL to the number of args passed to frame described by FI.   Can set VAL to -1, meaning no way to tell.  *//* We can't tell how many args there are   now that the C compiler delays popping them.  */#if !defined (FRAME_NUM_ARGS)#define FRAME_NUM_ARGS(val,fi) (val = -1)#endif/* Return number of bytes at start of arglist that are not really args.  */#define FRAME_ARGS_SKIP 8/* Put here the code to store, into a struct frame_saved_regs,   the addresses of the saved registers of frame described by FRAME_INFO.   This includes special registers such as pc and fp saved in special   ways in the stack frame.  sp is even more special:   the address we return for it IS the sp for the next frame.  */#if !defined (FRAME_FIND_SAVED_REGS)#if defined (HAVE_68881)#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)		\{ register int regnum;							\  register int regmask;							\  register CORE_ADDR next_addr;						\  register CORE_ADDR pc;						\  int nextinsn;								\  bzero (&frame_saved_regs, sizeof frame_saved_regs);			\  if ((frame_info)->pc >= (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM*4 - 8*12 - 4 \      && (frame_info)->pc <= (frame_info)->frame)				\    { next_addr = (frame_info)->frame;					\      pc = (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 8*12 - 4; }\  else   								\    { pc = get_pc_function_start ((frame_info)->pc); 			\      /* Verify we have a link a6 instruction next;			\	 if not we lose.  If we win, find the address above the saved   \	 regs using the amount of storage from the link instruction.  */\      if (044016 == read_memory_integer (pc, 2))			\	next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc+=4; \      else if (047126 == read_memory_integer (pc, 2))			\	next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc+=2; \      else goto lose;							\      /* If have an addal #-n, sp next, adjust next_addr.  */		\      if ((0177777 & read_memory_integer (pc, 2)) == 0157774)		\	next_addr += read_memory_integer (pc += 2, 4), pc += 4;		\    }									\  /* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */	\  regmask = read_memory_integer (pc + 2, 2);				\  /* But before that can come an fmovem.  Check for it.  */		\  nextinsn = 0xffff & read_memory_integer (pc, 2);			\  if (0xf227 == nextinsn						\      && (regmask & 0xff00) == 0xe000)					\    { pc += 4; /* Regmask's low bit is for register fp7, the first pushed */ \      for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr -= 12);		\      regmask = read_memory_integer (pc + 2, 2); }			\  if (0044327 == read_memory_integer (pc, 2))				\    { pc += 4; /* Regmask's low bit is for register 0, the first written */ \      for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr += 4) - 4; }	\  else if (0044347 == read_memory_integer (pc, 2))			\    { pc += 4; /* Regmask's low bit is for register 15, the first pushed */ \      for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr -= 4); }		\  else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))		\    { regnum = 0xf & read_memory_integer (pc, 2); pc += 2;		\      (frame_saved_regs).regs[regnum] = (next_addr -= 4); }		\  /* fmovemx to index of sp may follow.  */				\  regmask = read_memory_integer (pc + 2, 2);				\  nextinsn = 0xffff & read_memory_integer (pc, 2);			\  if (0xf236 == nextinsn						\      && (regmask & 0xff00) == 0xf000)					\    { pc += 10; /* Regmask's low bit is for register fp0, the first written */ \      for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr += 12) - 12;	\      regmask = read_memory_integer (pc + 2, 2); }			\  /* clrw -(sp); movw ccr,-(sp) may follow.  */				\  if (0x426742e7 == read_memory_integer (pc, 4))			\    (frame_saved_regs).regs[PS_REGNUM] = (next_addr -= 4);		\  lose: ;								\  (frame_saved_regs).regs[SP_REGNUM] = (frame_info)->frame + 8;		\  (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame;		\  (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 4;		\}#else /* no 68881.  */#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)		\{ register int regnum;							\  register int regmask;							\  register CORE_ADDR next_addr;						\  register CORE_ADDR pc;						\  bzero (&frame_saved_regs, sizeof frame_saved_regs);			\  if ((frame_info)->pc >= (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM*4 - 4 \      && (frame_info)->pc <= (frame_info)->frame)				\    { next_addr = (frame_info)->frame;					\      pc = (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4; }\  else   								\    { pc = get_pc_function_start ((frame_info)->pc); 			\      /* Verify we have a link a6 instruction next;			\	 if not we lose.  If we win, find the address above the saved   \	 regs using the amount of storage from the link instruction.  */\      if (044016 == read_memory_integer (pc, 2))			\	next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc+=4; \      else if (047126 == read_memory_integer (pc, 2))			\	next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc+=2; \      else goto lose;							\      /* If have an addal #-n, sp next, adjust next_addr.  */		\      if ((0177777 & read_memory_integer (pc, 2)) == 0157774)		\	next_addr += read_memory_integer (pc += 2, 4), pc += 4;		\    }									\  /* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */	\  regmask = read_memory_integer (pc + 2, 2);				\  if (0044327 == read_memory_integer (pc, 2))				\    { pc += 4; /* Regmask's low bit is for register 0, the first written */ \      for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr += 4) - 4; }	\  else if (0044347 == read_memory_integer (pc, 2))			\    { pc += 4; /* Regmask's low bit is for register 15, the first pushed */ \      for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1)		\	if (regmask & 1)						\          (frame_saved_regs).regs[regnum] = (next_addr -= 4); }		\  else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))		\    { regnum = 0xf & read_memory_integer (pc, 2); pc += 2;		\      (frame_saved_regs).regs[regnum] = (next_addr -= 4); }		\  /* clrw -(sp); movw ccr,-(sp) may follow.  */				\  if (0x426742e7 == read_memory_integer (pc, 4))			\    (frame_saved_regs).regs[PS_REGNUM] = (next_addr -= 4);		\  lose: ;								\  (frame_saved_regs).regs[SP_REGNUM] = (frame_info)->frame + 8;		\  (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame;		\  (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 4;		\}#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, as disassembled   by gdb itself:	fmovemx fp0-fp7,sp@-			0xf227 0xe0ff	moveml d0-a5,sp@-			0x48e7 0xfffc	clrw sp@-				0x4267	movew ccr,sp@-				0x42e7	/..* 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 @#0x32323232			0x4eb9 0x3232 0x3232	addal #0x69696969,sp			0xdffc 0x6969 0x6969	trap #<your BPT_VECTOR number here>	0x4e4?	nop					0x4e71   Note this is CALL_DUMMY_LENGTH bytes (28 for the above example).   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.  */#if defined (HAVE_68881)#define CALL_DUMMY {0xf227e0ff, 0x48e7fffc, 0x426742e7, 0x4eb93232, 0x3232dffc, 0x69696969, (0x4e404e71 | (BPT_VECTOR << 16))}#define CALL_DUMMY_LENGTH 28		/* Size of CALL_DUMMY */#define CALL_DUMMY_START_OFFSET 12	/* Offset to jsr instruction*/#else#define CALL_DUMMY {0x48e7fffc, 0x426742e7, 0x4eb93232, 0x3232dffc, 0x69696969, (0x4e404e71 | (BPT_VECTOR << 16))}#define CALL_DUMMY_LENGTH 24		/* Size of CALL_DUMMY */#define CALL_DUMMY_START_OFFSET 8	/* Offset to jsr instruction*/#endif	/* HAVE_68881 *//* Insert the specified number of args and function address   into a call sequence of the above form stored at DUMMYNAME.   We use the BFD routines to store a big-endian value of known size.  */#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p)     \{ _do_putb32 (fun,     (char *) dummyname + CALL_DUMMY_START_OFFSET + 2);  \  _do_putb32 (nargs*4, (char *) dummyname + CALL_DUMMY_START_OFFSET + 8); }/* Push an empty stack frame, to record the current PC, etc.  */#define PUSH_DUMMY_FRAME	{ m68k_push_dummy_frame (); }extern void m68k_push_dummy_frame PARAMS ((void));extern void m68k_pop_frame PARAMS ((void));/* Discard from the stack the innermost frame, restoring all registers.  */#define POP_FRAME		{ m68k_pop_frame (); }/* Offset from SP to first arg on stack at first instruction of a function */#define SP_ARG0 (1 * 4)#ifdef KERNELDEBUGextern int kernel_debugging;#undef FRAME_CHAIN_VALID#define FRAME_CHAIN_VALID(chain, thisframe) \	(chain != 0 && \	 kernel_debugging ? inside_kernstack(chain) : \		(!inside_entry_file(FRAME_SAVED_PC(thisframe))))extern int Xkernel_xfer_memory();#define KERNEL_XFER_MEMORY Xkernel_xfer_memory#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -