GDB (API)
|
00001 /* Target-dependent code for the HP PA-RISC architecture. 00002 00003 Copyright (C) 2003-2013 Free Software Foundation, Inc. 00004 00005 This file is part of GDB. 00006 00007 This program is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 3 of the License, or 00010 (at your option) any later version. 00011 00012 This program is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 00019 00020 #ifndef HPPA_TDEP_H 00021 #define HPPA_TDEP_H 00022 00023 struct trad_frame_saved_reg; 00024 struct objfile; 00025 struct so_list; 00026 00027 /* Register numbers of various important registers. */ 00028 00029 enum hppa_regnum 00030 { 00031 HPPA_R0_REGNUM = 0, /* Doesn't actually exist, used as base for 00032 other r registers. */ 00033 HPPA_R1_REGNUM = 1, 00034 HPPA_FLAGS_REGNUM = 0, /* Various status flags */ 00035 HPPA_RP_REGNUM = 2, /* return pointer */ 00036 HPPA_FP_REGNUM = 3, /* The ABI's frame pointer, when used */ 00037 HPPA_DP_REGNUM = 27, 00038 HPPA_RET0_REGNUM = 28, 00039 HPPA_RET1_REGNUM = 29, 00040 HPPA_SP_REGNUM = 30, /* Stack pointer. */ 00041 HPPA_R31_REGNUM = 31, 00042 HPPA_SAR_REGNUM = 32, /* Shift Amount Register */ 00043 HPPA_IPSW_REGNUM = 41, /* Interrupt Processor Status Word */ 00044 HPPA_PCOQ_HEAD_REGNUM = 33, /* instruction offset queue head */ 00045 HPPA_PCSQ_HEAD_REGNUM = 34, /* instruction space queue head */ 00046 HPPA_PCOQ_TAIL_REGNUM = 35, /* instruction offset queue tail */ 00047 HPPA_PCSQ_TAIL_REGNUM = 36, /* instruction space queue tail */ 00048 HPPA_EIEM_REGNUM = 37, /* External Interrupt Enable Mask */ 00049 HPPA_IIR_REGNUM = 38, /* Interrupt Instruction Register */ 00050 HPPA_ISR_REGNUM = 39, /* Interrupt Space Register */ 00051 HPPA_IOR_REGNUM = 40, /* Interrupt Offset Register */ 00052 HPPA_SR4_REGNUM = 43, /* space register 4 */ 00053 HPPA_SR0_REGNUM = 44, /* space register 0 */ 00054 HPPA_SR1_REGNUM = 45, /* space register 1 */ 00055 HPPA_SR2_REGNUM = 46, /* space register 2 */ 00056 HPPA_SR3_REGNUM = 47, /* space register 3 */ 00057 HPPA_SR5_REGNUM = 48, /* space register 5 */ 00058 HPPA_SR6_REGNUM = 49, /* space register 6 */ 00059 HPPA_SR7_REGNUM = 50, /* space register 7 */ 00060 HPPA_RCR_REGNUM = 51, /* Recover Counter (also known as cr0) */ 00061 HPPA_PID0_REGNUM = 52, /* Protection ID */ 00062 HPPA_PID1_REGNUM = 53, /* Protection ID */ 00063 HPPA_PID2_REGNUM = 55, /* Protection ID */ 00064 HPPA_PID3_REGNUM = 56, /* Protection ID */ 00065 HPPA_CCR_REGNUM = 54, /* Coprocessor Configuration Register */ 00066 HPPA_TR0_REGNUM = 57, /* Temporary Registers (cr24 -> cr31) */ 00067 HPPA_CR26_REGNUM = 59, 00068 HPPA_CR27_REGNUM = 60, /* Base register for thread-local 00069 storage, cr27 */ 00070 HPPA_FP0_REGNUM = 64, /* First floating-point. */ 00071 HPPA_FP4_REGNUM = 72, 00072 HPPA64_FP4_REGNUM = 68, 00073 HPPA_FP31R_REGNUM = 127, /* Last floating-point. */ 00074 00075 HPPA_ARG0_REGNUM = 26, /* The first argument of a callee. */ 00076 HPPA_ARG1_REGNUM = 25, /* The second argument of a callee. */ 00077 HPPA_ARG2_REGNUM = 24, /* The third argument of a callee. */ 00078 HPPA_ARG3_REGNUM = 23 /* The fourth argument of a callee. */ 00079 }; 00080 00081 /* Instruction size. */ 00082 #define HPPA_INSN_SIZE 4 00083 00084 /* Target-dependent structure in gdbarch. */ 00085 struct gdbarch_tdep 00086 { 00087 /* The number of bytes in an address. For now, this field is designed 00088 to allow us to differentiate hppa32 from hppa64 targets. */ 00089 int bytes_per_address; 00090 00091 /* Is this an ELF target? This can be 64-bit HP-UX, or a 32/64-bit GNU/Linux 00092 system. */ 00093 int is_elf; 00094 00095 /* Given a function address, try to find the global pointer for the 00096 corresponding shared object. */ 00097 CORE_ADDR (*find_global_pointer) (struct gdbarch *, struct value *); 00098 00099 /* For shared libraries, each call goes through a small piece of 00100 trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE 00101 evaluates to nonzero if we are currently stopped in one of these. */ 00102 int (*in_solib_call_trampoline) (struct gdbarch *gdbarch, CORE_ADDR pc); 00103 00104 /* For targets that support multiple spaces, we may have additional stubs 00105 in the return path. These stubs are internal to the ABI, and users are 00106 not interested in them. If we detect that we are returning to a stub, 00107 adjust the pc to the real caller. This improves the behavior of commands 00108 that traverse frames such as "up" and "finish". */ 00109 void (*unwind_adjust_stub) (struct frame_info *this_frame, CORE_ADDR base, 00110 struct trad_frame_saved_reg *saved_regs); 00111 00112 /* These are solib-dependent methods. They are really HPUX only, but 00113 we don't have a HPUX-specific tdep vector at the moment. */ 00114 CORE_ADDR (*solib_thread_start_addr) (struct so_list *so); 00115 CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr); 00116 CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr); 00117 CORE_ADDR (*solib_get_text_base) (struct objfile *objfile); 00118 }; 00119 00120 /* 00121 * Unwind table and descriptor. 00122 */ 00123 00124 struct unwind_table_entry 00125 { 00126 CORE_ADDR region_start; 00127 CORE_ADDR region_end; 00128 00129 unsigned int Cannot_unwind:1; /* 0 */ 00130 unsigned int Millicode:1; /* 1 */ 00131 unsigned int Millicode_save_sr0:1; /* 2 */ 00132 unsigned int Region_description:2; /* 3..4 */ 00133 unsigned int reserved:1; /* 5 */ 00134 unsigned int Entry_SR:1; /* 6 */ 00135 unsigned int Entry_FR:4; /* number saved *//* 7..10 */ 00136 unsigned int Entry_GR:5; /* number saved *//* 11..15 */ 00137 unsigned int Args_stored:1; /* 16 */ 00138 unsigned int Variable_Frame:1; /* 17 */ 00139 unsigned int Separate_Package_Body:1; /* 18 */ 00140 unsigned int Frame_Extension_Millicode:1; /* 19 */ 00141 unsigned int Stack_Overflow_Check:1; /* 20 */ 00142 unsigned int Two_Instruction_SP_Increment:1; /* 21 */ 00143 unsigned int sr4export:1; /* 22 */ 00144 unsigned int cxx_info:1; /* 23 */ 00145 unsigned int cxx_try_catch:1; /* 24 */ 00146 unsigned int sched_entry_seq:1; /* 25 */ 00147 unsigned int reserved1:1; /* 26 */ 00148 unsigned int Save_SP:1; /* 27 */ 00149 unsigned int Save_RP:1; /* 28 */ 00150 unsigned int Save_MRP_in_frame:1; /* 29 */ 00151 unsigned int save_r19:1; /* 30 */ 00152 unsigned int Cleanup_defined:1; /* 31 */ 00153 00154 unsigned int MPE_XL_interrupt_marker:1; /* 0 */ 00155 unsigned int HP_UX_interrupt_marker:1; /* 1 */ 00156 unsigned int Large_frame:1; /* 2 */ 00157 unsigned int alloca_frame:1; /* 3 */ 00158 unsigned int reserved2:1; /* 4 */ 00159 unsigned int Total_frame_size:27; /* 5..31 */ 00160 00161 /* This is *NOT* part of an actual unwind_descriptor in an object 00162 file. It is *ONLY* part of the "internalized" descriptors that 00163 we create from those in a file. */ 00164 00165 struct 00166 { 00167 unsigned int stub_type:4; /* 0..3 */ 00168 unsigned int padding:28; /* 4..31 */ 00169 } 00170 stub_unwind; 00171 }; 00172 00173 /* HP linkers also generate unwinds for various linker-generated stubs. 00174 GDB reads in the stubs from the $UNWIND_END$ subspace, then 00175 "converts" them into normal unwind entries using some of the reserved 00176 fields to store the stub type. */ 00177 00178 /* The gaps represent linker stubs used in MPE and space for future 00179 expansion. */ 00180 enum unwind_stub_types 00181 { 00182 LONG_BRANCH = 1, 00183 PARAMETER_RELOCATION = 2, 00184 EXPORT = 10, 00185 IMPORT = 11, 00186 IMPORT_SHLIB = 12, 00187 }; 00188 00189 struct unwind_table_entry *find_unwind_entry (CORE_ADDR); 00190 00191 /* We use the objfile->obj_private pointer for two things: 00192 * 1. An unwind table; 00193 * 00194 * 2. A pointer to any associated shared library object. 00195 * 00196 * #defines are used to help refer to these objects. 00197 */ 00198 00199 /* Info about the unwind table associated with an object file. 00200 * This is hung off of the "objfile->obj_private" pointer, and 00201 * is allocated in the objfile's psymbol obstack. This allows 00202 * us to have unique unwind info for each executable and shared 00203 * library that we are debugging. 00204 */ 00205 struct hppa_unwind_info 00206 { 00207 struct unwind_table_entry *table; /* Pointer to unwind info */ 00208 struct unwind_table_entry *cache; /* Pointer to last entry we found */ 00209 int last; /* Index of last entry */ 00210 }; 00211 00212 struct hppa_objfile_private 00213 { 00214 struct hppa_unwind_info *unwind_info; /* a pointer */ 00215 struct so_list *so_info; /* a pointer */ 00216 CORE_ADDR dp; 00217 00218 int dummy_call_sequence_reg; 00219 CORE_ADDR dummy_call_sequence_addr; 00220 }; 00221 00222 extern const struct objfile_data *hppa_objfile_priv_data; 00223 00224 int hppa_get_field (unsigned word, int from, int to); 00225 int hppa_extract_5_load (unsigned int); 00226 unsigned hppa_extract_5R_store (unsigned int); 00227 unsigned hppa_extract_5r_store (unsigned int); 00228 int hppa_extract_17 (unsigned int); 00229 int hppa_extract_21 (unsigned); 00230 int hppa_extract_14 (unsigned); 00231 CORE_ADDR hppa_symbol_address(const char *sym); 00232 00233 extern struct value * 00234 hppa_frame_prev_register_helper (struct frame_info *this_frame, 00235 struct trad_frame_saved_reg *saved_regs, 00236 int regnum); 00237 00238 extern CORE_ADDR hppa_read_pc (struct regcache *regcache); 00239 extern void hppa_write_pc (struct regcache *regcache, CORE_ADDR pc); 00240 extern CORE_ADDR hppa_unwind_pc (struct gdbarch *gdbarch, 00241 struct frame_info *next_frame); 00242 00243 extern struct minimal_symbol * 00244 hppa_lookup_stub_minimal_symbol (const char *name, 00245 enum unwind_stub_types stub_type); 00246 00247 extern struct hppa_objfile_private *hppa_init_objfile_priv_data (struct objfile *objfile); 00248 00249 extern int hppa_in_solib_call_trampoline (struct gdbarch *gdbarch, 00250 CORE_ADDR pc); 00251 extern CORE_ADDR hppa_skip_trampoline_code (struct frame_info *, CORE_ADDR pc); 00252 00253 #endif /* hppa-tdep.h */