📄 tm-i386.h
字号:
/* Index within `registers' of the first byte of the space for register N. */#define REGISTER_BYTE(n) (i386_register_byte[(n)])extern int i386_register_byte[];/* Number of bytes of storage in the actual machine representation for register N. */#define REGISTER_RAW_SIZE(n) (i386_register_raw_size[(n)])extern int i386_register_raw_size[];/* Largest value REGISTER_RAW_SIZE can have. */#define MAX_REGISTER_RAW_SIZE 16/* Number of bytes of storage in the program's representation for register N. */#define REGISTER_VIRTUAL_SIZE(n) (i386_register_virtual_size[(n)])extern int i386_register_virtual_size[];/* Largest value REGISTER_VIRTUAL_SIZE can have. */#define MAX_REGISTER_VIRTUAL_SIZE 16/* Return the GDB type object for the "standard" data type of data in register N. Perhaps si and di should go here, but potentially they could be used for things other than address. */#define REGISTER_VIRTUAL_TYPE(N) \ (((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM) \ ? lookup_pointer_type (builtin_type_void) \ : IS_FP_REGNUM(N) ? builtin_type_long_double \ : IS_SSE_REGNUM(N) ? builtin_type_v4sf \ : builtin_type_int)/* REGISTER_CONVERTIBLE(N) is true iff register N's virtual format is different from its raw format. Note that this definition assumes that the host supports IEEE 32-bit floats, since it doesn't say that SSE registers need conversion. Even if we can't find a counterexample, this is still sloppy. */#define REGISTER_CONVERTIBLE(n) (IS_FP_REGNUM (n))/* Convert data from raw format for register REGNUM in buffer FROM to virtual format with type TYPE in buffer TO. */#define REGISTER_CONVERT_TO_VIRTUAL(regnum, type, from, to) \ i386_register_convert_to_virtual ((regnum), (type), (from), (to));extern void i386_register_convert_to_virtual (int regnum, struct type *type, char *from, char *to);/* Convert data from virtual format with type TYPE in buffer FROM to raw format for register REGNUM in buffer TO. */#define REGISTER_CONVERT_TO_RAW(type, regnum, from, to) \ i386_register_convert_to_raw ((type), (regnum), (from), (to));extern void i386_register_convert_to_raw (struct type *type, int regnum, char *from, char *to);/* Print out the i387 floating point state. */#ifdef HAVE_I387_REGSextern void i387_float_info (void);#define FLOAT_INFO { i387_float_info (); }#endif/* Store the address of the place in which to copy the structure the subroutine will return. This is called from call_function. */#define STORE_STRUCT_RETURN(ADDR, SP) \ { char buf[REGISTER_SIZE]; \ (SP) -= sizeof (ADDR); \ store_address (buf, sizeof (ADDR), ADDR); \ write_memory ((SP), buf, sizeof (ADDR)); }/* Extract from an array REGBUF containing the (raw) register state a function return value of type TYPE, and copy that, in virtual format, into VALBUF. */#define EXTRACT_RETURN_VALUE(type, regbuf, valbuf) \ i386_extract_return_value ((type), (regbuf), (valbuf))extern void i386_extract_return_value (struct type *type, char *regbuf, char *valbuf);/* Write into appropriate registers a function return value of type TYPE, given in virtual format. */#define STORE_RETURN_VALUE(TYPE,VALBUF) \ { \ if (TYPE_CODE (TYPE) == TYPE_CODE_FLT) \ write_register_bytes (REGISTER_BYTE (FP0_REGNUM), (VALBUF), \ TYPE_LENGTH (TYPE)); \ else \ write_register_bytes (0, (VALBUF), TYPE_LENGTH (TYPE)); \ }/* 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) (*(int *)(REGBUF))/* The following redefines make backtracing through sigtramp work. They manufacture a fake sigtramp frame and obtain the saved pc in sigtramp from the sigcontext structure which is pushed by the kernel on the user stack, along with a pointer to it. *//* FRAME_CHAIN takes a frame's nominal address and produces the frame's chain-pointer. In the case of the i386, the frame's nominal address is the address of a 4-byte word containing the calling frame's address. */#define FRAME_CHAIN(thisframe) \ ((thisframe)->signal_handler_caller \ ? (thisframe)->frame \ : (!inside_entry_file ((thisframe)->pc) \ ? read_memory_integer ((thisframe)->frame, 4) \ : 0))/* 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) \ (((FI)->signal_handler_caller) ? 0 : frameless_look_for_prologue(FI))/* Saved Pc. Get it from sigcontext if within sigtramp. */#define FRAME_SAVED_PC(FRAME) \ (((FRAME)->signal_handler_caller \ ? sigtramp_saved_pc (FRAME) \ : read_memory_integer ((FRAME)->frame + 4, 4)) \ )extern CORE_ADDR sigtramp_saved_pc PARAMS ((struct frame_info *));#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)/* Return number of args passed to a frame. Can return -1, meaning no way to tell, which is typical now that the C compiler delays popping them. */#define FRAME_NUM_ARGS(fi) (i386_frame_num_args(fi))extern int i386_frame_num_args PARAMS ((struct frame_info *));/* 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. */extern void i386_frame_init_saved_regs PARAMS ((struct frame_info *));#define FRAME_INIT_SAVED_REGS(FI) i386_frame_init_saved_regs (FI)/* Things needed for making the inferior call functions. *//* "An argument's size is increased, if necessary, to make it a multiple of [32 bit] words. This may require tail padding, depending on the size of the argument" - from the x86 ABI. */#define PARM_BOUNDARY 32/* Push an empty stack frame, to record the current PC, etc. */#define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); }extern void i386_push_dummy_frame PARAMS ((void));/* Discard from the stack the innermost frame, restoring all registers. */#define POP_FRAME { i386_pop_frame (); }extern void i386_pop_frame PARAMS ((void));/* this is * call 11223344 (32 bit relative) * int3 */#define CALL_DUMMY { 0x223344e8, 0xcc11 }#define CALL_DUMMY_LENGTH 8#define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */#define CALL_DUMMY_BREAKPOINT_OFFSET 5/* 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 from, to, delta, loc; \ loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); \ from = loc + 5; \ to = (int)(fun); \ delta = to - from; \ *((char *)(dummyname) + 1) = (delta & 0xff); \ *((char *)(dummyname) + 2) = ((delta >> 8) & 0xff); \ *((char *)(dummyname) + 3) = ((delta >> 16) & 0xff); \ *((char *)(dummyname) + 4) = ((delta >> 24) & 0xff); \}extern void print_387_control_word PARAMS ((unsigned int));extern void print_387_status_word PARAMS ((unsigned int));/* Offset from SP to first arg on stack at first instruction of a function */#define SP_ARG0 (1 * 4)#endif /* ifndef TM_I386_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -