GDB (API)
/home/stan/gdb/src/gdb/hppa-tdep.h
Go to the documentation of this file.
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 */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines