📄 tm-hppa.h
字号:
"instruction" following the last BLE is 0xffffffff, then the ptrace will fail and the dummy frame is not correctly popped. By placing a NOP in the delay slot of the BLE instruction we can be sure that we never try to execute a 0xffffffff instruction and avoid the kernel bug. The second NOP is needed to keep the call dummy 8 byte aligned. *//* Define offsets into the call dummy for the target function address */#define FUNC_LDIL_OFFSET (INSTRUCTION_SIZE * 9)#define FUNC_LDO_OFFSET (INSTRUCTION_SIZE * 10)/* Define offsets into the call dummy for the _sr4export address */#define SR4EXPORT_LDIL_OFFSET (INSTRUCTION_SIZE * 12)#define SR4EXPORT_LDO_OFFSET (INSTRUCTION_SIZE * 13)#define CALL_DUMMY {0x4BDA3FB9, 0x4BD93FB1, 0x4BD83FA9, 0x4BD73FA1,\ 0x37C13FB9, 0x24201004, 0x2C391005, 0x24311006,\ 0x2C291007, 0x22C00000, 0x36D60000, 0x02C010A4,\ 0x20200000, 0x34210000, 0x002010b4, 0x82842022,\ 0xe6c06000, 0x081f0242, 0x00010004, 0x00151820,\ 0xe6c00002, 0xe4202000, 0x6bdf3fd1, 0x00010004,\ 0x00151820, 0xe6c00002, 0x08000240, 0x08000240}#define CALL_DUMMY_LENGTH (INSTRUCTION_SIZE * 28)#define REG_PARM_STACK_SPACE 16#else /* defined PA_LEVEL_0 *//* This is the call dummy for a level 0 PA. Level 0's don't have space registers (or floating point??), so we skip all that inter-space call stuff, and avoid touching the fp regs. call_dummy ldw -36(%sp), %arg0 ldw -40(%sp), %arg1 ldw -44(%sp), %arg2 ldw -48(%sp), %arg3 ldil 0, %r31 ; FUNC_LDIL_OFFSET must point here ldo 0(%r31), %r31 ; FUNC_LDO_OFFSET must point here ble 0(%sr0, %r31) copy %r31, %r2 break 4, 8 nop ; restore_pc_queue expects these bv,n 0(%r22) ; instructions to be here... nop *//* Define offsets into the call dummy for the target function address */#define FUNC_LDIL_OFFSET (INSTRUCTION_SIZE * 4)#define FUNC_LDO_OFFSET (INSTRUCTION_SIZE * 5)#define CALL_DUMMY {0x4bda3fb9, 0x4bd93fb1, 0x4bd83fa9, 0x4bd73fa1,\ 0x23e00000, 0x37ff0000, 0xe7e00000, 0x081f0242,\ 0x00010004, 0x08000240, 0xeac0c002, 0x08000240}#define CALL_DUMMY_LENGTH (INSTRUCTION_SIZE * 12)#endif#define CALL_DUMMY_START_OFFSET 0/* If we've reached a trap instruction within the call dummy, then we'll consider that to mean that we've reached the call dummy's end after its successful completion. */#define CALL_DUMMY_HAS_COMPLETED(pc, sp, frame_address) \ (PC_IN_CALL_DUMMY((pc), (sp), (frame_address)) && \ (read_memory_integer((pc), 4) == BREAKPOINT32))/* * Insert the specified number of args and function address * into a call sequence of the above form stored at DUMMYNAME. * * On the hppa we need to call the stack dummy through $$dyncall. * Therefore our version of FIX_CALL_DUMMY takes an extra argument, * real_pc, which is the location where gdb should start up the * inferior to do the function call. */#define FIX_CALL_DUMMY hppa_fix_call_dummyextern CORE_ADDR hppa_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR, int, struct value **, struct type *, int));#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \ (hppa_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr)))extern CORE_ADDR hppa_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, CORE_ADDR));/* The low two bits of the PC on the PA contain the privilege level. Some genius implementing a (non-GCC) compiler apparently decided this means that "addresses" in a text section therefore include a privilege level, and thus symbol tables should contain these bits. This seems like a bonehead thing to do--anyway, it seems to work for our purposes to just ignore those bits. */#define SMASH_TEXT_ADDRESS(addr) ((addr) &= ~0x3)#define GDB_TARGET_IS_HPPA#define BELIEVE_PCC_PROMOTION 1/* * Unwind table and descriptor. */struct unwind_table_entry { CORE_ADDR region_start; CORE_ADDR region_end; unsigned int Cannot_unwind:1; /* 0 */ unsigned int Millicode:1; /* 1 */ unsigned int Millicode_save_sr0:1; /* 2 */ unsigned int Region_description:2; /* 3..4 */ unsigned int reserved1:1; /* 5 */ unsigned int Entry_SR:1; /* 6 */ unsigned int Entry_FR:4; /* number saved *//* 7..10 */ unsigned int Entry_GR:5; /* number saved *//* 11..15 */ unsigned int Args_stored:1; /* 16 */ unsigned int Variable_Frame:1; /* 17 */ unsigned int Separate_Package_Body:1; /* 18 */ unsigned int Frame_Extension_Millicode:1; /* 19 */ unsigned int Stack_Overflow_Check:1; /* 20 */ unsigned int Two_Instruction_SP_Increment:1; /* 21 */ unsigned int Ada_Region:1; /* 22 */ unsigned int cxx_info:1; /* 23 */ unsigned int cxx_try_catch:1; /* 24 */ unsigned int sched_entry_seq:1; /* 25 */ unsigned int reserved2:1; /* 26 */ unsigned int Save_SP:1; /* 27 */ unsigned int Save_RP:1; /* 28 */ unsigned int Save_MRP_in_frame:1; /* 29 */ unsigned int extn_ptr_defined:1; /* 30 */ unsigned int Cleanup_defined:1; /* 31 */ unsigned int MPE_XL_interrupt_marker:1; /* 0 */ unsigned int HP_UX_interrupt_marker:1; /* 1 */ unsigned int Large_frame:1; /* 2 */ unsigned int Pseudo_SP_Set:1; /* 3 */ unsigned int reserved4:1; /* 4 */ unsigned int Total_frame_size:27; /* 5..31 */ /* This is *NOT* part of an actual unwind_descriptor in an object file. It is *ONLY* part of the "internalized" descriptors that we create from those in a file. */ struct { unsigned int stub_type:4; /* 0..3 */ unsigned int padding:28; /* 4..31 */ } stub_unwind; };/* HP linkers also generate unwinds for various linker-generated stubs. GDB reads in the stubs from the $UNWIND_END$ subspace, then "converts" them into normal unwind entries using some of the reserved fields to store the stub type. */struct stub_unwind_entry { /* The offset within the executable for the associated stub. */ unsigned stub_offset; /* The type of stub this unwind entry describes. */ char type; /* Unknown. Not needed by GDB at this time. */ char prs_info; /* Length (in instructions) of the associated stub. */ short stub_length; };/* Sizes (in bytes) of the native unwind entries. */#define UNWIND_ENTRY_SIZE 16#define STUB_UNWIND_ENTRY_SIZE 8/* The gaps represent linker stubs used in MPE and space for future expansion. */enum unwind_stub_types { LONG_BRANCH = 1, PARAMETER_RELOCATION = 2, EXPORT = 10, IMPORT = 11, IMPORT_SHLIB = 12, };/* We use the objfile->obj_private pointer for two things: * 1. An unwind table; * * 2. A pointer to any associated shared library object. * * #defines are used to help refer to these objects. *//* Info about the unwind table associated with an object file. * This is hung off of the "objfile->obj_private" pointer, and * is allocated in the objfile's psymbol obstack. This allows * us to have unique unwind info for each executable and shared * library that we are debugging. */struct obj_unwind_info { struct unwind_table_entry *table; /* Pointer to unwind info */ struct unwind_table_entry *cache; /* Pointer to last entry we found */ int last; /* Index of last entry */ };typedef struct obj_private_struct { struct obj_unwind_info *unwind_info; /* a pointer */ struct so_list *so_info; /* a pointer */ CORE_ADDR dp; }obj_private_data_t;#if 0extern void target_write_pcPARAMS ((CORE_ADDR, int)) extern CORE_ADDR target_read_pc PARAMS ((int)); extern CORE_ADDR skip_trampoline_code PARAMS ((CORE_ADDR, char *));#endif#define TARGET_READ_PC(pid) target_read_pc (pid) extern CORE_ADDR target_read_pc PARAMS ((int));#define TARGET_WRITE_PC(v,pid) target_write_pc (v,pid) extern void target_write_pc PARAMS ((CORE_ADDR, int));#define TARGET_READ_FP() target_read_fp (inferior_pid) extern CORE_ADDR target_read_fp PARAMS ((int));/* For a number of horrible reasons we may have to adjust the location of variables on the stack. Ugh. */#define HPREAD_ADJUST_STACK_ADDRESS(ADDR) hpread_adjust_stack_address(ADDR) extern int hpread_adjust_stack_address PARAMS ((CORE_ADDR));/* If the current gcc for for this target does not produce correct debugging information for float parameters, both prototyped and unprototyped, then define this macro. This forces gdb to always assume that floats are passed as doubles and then converted in the callee. For the pa, it appears that the debug info marks the parameters as floats regardless of whether the function is prototyped, but the actual values are passed as doubles for the non-prototyped case and floats for the prototyped case. Thus we choose to make the non-prototyped case work for C and break the prototyped case, since the non-prototyped case is probably much more common. (FIXME). */#define COERCE_FLOAT_TO_DOUBLE(formal, actual) (current_language -> la_language == language_c)/* Here's how to step off a permanent breakpoint. */#define SKIP_PERMANENT_BREAKPOINT (hppa_skip_permanent_breakpoint)extern void hppa_skip_permanent_breakpoint (void);/* On HP-UX, certain system routines (millicode) have names beginning with $ or $$, e.g. $$dyncall, which handles inter-space procedure calls on PA-RISC. Tell the expression parser to check for those when parsing tokens that begin with "$". */#define SYMBOLS_CAN_START_WITH_DOLLAR (1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -