sparc-sol2-tdep.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /* Target-dependent code for Solaris SPARC.
  2. Copyright (C) 2003-2022 Free Software Foundation, Inc.
  3. This file is part of GDB.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  14. #include "defs.h"
  15. #include "frame.h"
  16. #include "frame-unwind.h"
  17. #include "gdbcore.h"
  18. #include "symtab.h"
  19. #include "objfiles.h"
  20. #include "osabi.h"
  21. #include "regcache.h"
  22. #include "regset.h"
  23. #include "target.h"
  24. #include "trad-frame.h"
  25. #include "sol2-tdep.h"
  26. #include "sparc-tdep.h"
  27. #include "solib-svr4.h"
  28. /* From <sys/regset.h>. */
  29. const struct sparc_gregmap sparc32_sol2_gregmap =
  30. {
  31. 32 * 4, /* %psr */
  32. 33 * 4, /* %pc */
  33. 34 * 4, /* %npc */
  34. 35 * 4, /* %y */
  35. 36 * 4, /* %wim */
  36. 37 * 4, /* %tbr */
  37. 1 * 4, /* %g1 */
  38. 16 * 4, /* %l0 */
  39. };
  40. const struct sparc_fpregmap sparc32_sol2_fpregmap =
  41. {
  42. 0 * 4, /* %f0 */
  43. 33 * 4, /* %fsr */
  44. };
  45. static void
  46. sparc32_sol2_supply_core_gregset (const struct regset *regset,
  47. struct regcache *regcache,
  48. int regnum, const void *gregs, size_t len)
  49. {
  50. sparc32_supply_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
  51. }
  52. static void
  53. sparc32_sol2_collect_core_gregset (const struct regset *regset,
  54. const struct regcache *regcache,
  55. int regnum, void *gregs, size_t len)
  56. {
  57. sparc32_collect_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
  58. }
  59. static void
  60. sparc32_sol2_supply_core_fpregset (const struct regset *regset,
  61. struct regcache *regcache,
  62. int regnum, const void *fpregs, size_t len)
  63. {
  64. sparc32_supply_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
  65. }
  66. static void
  67. sparc32_sol2_collect_core_fpregset (const struct regset *regset,
  68. const struct regcache *regcache,
  69. int regnum, void *fpregs, size_t len)
  70. {
  71. sparc32_collect_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
  72. }
  73. static const struct regset sparc32_sol2_gregset =
  74. {
  75. NULL,
  76. sparc32_sol2_supply_core_gregset,
  77. sparc32_sol2_collect_core_gregset
  78. };
  79. static const struct regset sparc32_sol2_fpregset =
  80. {
  81. NULL,
  82. sparc32_sol2_supply_core_fpregset,
  83. sparc32_sol2_collect_core_fpregset
  84. };
  85. static struct sparc_frame_cache *
  86. sparc32_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
  87. void **this_cache)
  88. {
  89. struct sparc_frame_cache *cache;
  90. CORE_ADDR mcontext_addr, addr;
  91. int regnum;
  92. if (*this_cache)
  93. return (struct sparc_frame_cache *) *this_cache;
  94. cache = sparc_frame_cache (this_frame, this_cache);
  95. gdb_assert (cache == *this_cache);
  96. cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
  97. /* The third argument is a pointer to an instance of `ucontext_t',
  98. which has a member `uc_mcontext' that contains the saved
  99. registers. */
  100. regnum =
  101. (cache->copied_regs_mask & 0x04) ? SPARC_I2_REGNUM : SPARC_O2_REGNUM;
  102. mcontext_addr = get_frame_register_unsigned (this_frame, regnum) + 40;
  103. cache->saved_regs[SPARC32_PSR_REGNUM].set_addr (mcontext_addr + 0 * 4);
  104. cache->saved_regs[SPARC32_PC_REGNUM].set_addr (mcontext_addr + 1 * 4);
  105. cache->saved_regs[SPARC32_NPC_REGNUM].set_addr (mcontext_addr + 2 * 4);
  106. cache->saved_regs[SPARC32_Y_REGNUM].set_addr (mcontext_addr + 3 * 4);
  107. /* Since %g0 is always zero, keep the identity encoding. */
  108. for (regnum = SPARC_G1_REGNUM, addr = mcontext_addr + 4 * 4;
  109. regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
  110. cache->saved_regs[regnum].set_addr (addr);
  111. if (get_frame_memory_unsigned (this_frame, mcontext_addr + 19 * 4, 4))
  112. {
  113. /* The register windows haven't been flushed. */
  114. for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
  115. cache->saved_regs[regnum].set_unknown ();
  116. }
  117. else
  118. {
  119. addr = cache->saved_regs[SPARC_SP_REGNUM].addr ();
  120. addr = get_frame_memory_unsigned (this_frame, addr, 4);
  121. for (regnum = SPARC_L0_REGNUM;
  122. regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
  123. cache->saved_regs[regnum].set_addr (addr);
  124. }
  125. return cache;
  126. }
  127. static void
  128. sparc32_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
  129. void **this_cache,
  130. struct frame_id *this_id)
  131. {
  132. struct sparc_frame_cache *cache =
  133. sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
  134. (*this_id) = frame_id_build (cache->base, cache->pc);
  135. }
  136. static struct value *
  137. sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
  138. void **this_cache,
  139. int regnum)
  140. {
  141. struct sparc_frame_cache *cache =
  142. sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
  143. return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
  144. }
  145. static int
  146. sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
  147. struct frame_info *this_frame,
  148. void **this_cache)
  149. {
  150. return sol2_sigtramp_p (this_frame);
  151. }
  152. static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
  153. {
  154. "sparc32 solaris sigtramp",
  155. SIGTRAMP_FRAME,
  156. default_frame_unwind_stop_reason,
  157. sparc32_sol2_sigtramp_frame_this_id,
  158. sparc32_sol2_sigtramp_frame_prev_register,
  159. NULL,
  160. sparc32_sol2_sigtramp_frame_sniffer
  161. };
  162. static void
  163. sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
  164. {
  165. sparc_gdbarch_tdep *tdep = (sparc_gdbarch_tdep *) gdbarch_tdep (gdbarch);
  166. tdep->gregset = &sparc32_sol2_gregset;
  167. tdep->sizeof_gregset = 152;
  168. tdep->fpregset = &sparc32_sol2_fpregset;
  169. tdep->sizeof_fpregset = 400;
  170. sol2_init_abi (info, gdbarch);
  171. /* Solaris has SVR4-style shared libraries... */
  172. set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
  173. set_solib_svr4_fetch_link_map_offsets
  174. (gdbarch, svr4_ilp32_fetch_link_map_offsets);
  175. /* ...which means that we need some special handling when doing
  176. prologue analysis. */
  177. tdep->plt_entry_size = 12;
  178. /* Solaris has kernel-assisted single-stepping support. */
  179. set_gdbarch_software_single_step (gdbarch, NULL);
  180. frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind);
  181. }
  182. void _initialize_sparc_sol2_tdep ();
  183. void
  184. _initialize_sparc_sol2_tdep ()
  185. {
  186. gdbarch_register_osabi (bfd_arch_sparc, 0,
  187. GDB_OSABI_SOLARIS, sparc32_sol2_init_abi);
  188. }