1 /* Target-dependent code for GNU/Linux on Tilera TILE-Gx processors. 2 3 Copyright (C) 2012-2020 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "osabi.h" 22 #include "linux-tdep.h" 23 #include "glibc-tdep.h" 24 #include "solib-svr4.h" 25 #include "symtab.h" 26 #include "regcache.h" 27 #include "regset.h" 28 #include "tramp-frame.h" 29 #include "trad-frame.h" 30 #include "tilegx-tdep.h" 31 #include "gdbarch.h" 32 33 /* Signal trampoline support. */ 34 35 static void 36 tilegx_linux_sigframe_init (const struct tramp_frame *self, 37 struct frame_info *this_frame, 38 struct trad_frame_cache *this_cache, 39 CORE_ADDR func) 40 { 41 CORE_ADDR sp = get_frame_register_unsigned (this_frame, 54); 42 43 /* Base address of register save area. */ 44 CORE_ADDR base = sp 45 + 16 /* Skip ABI_SAVE_AREA. */ 46 + 128 /* Skip SIGINFO. */ 47 + 40; /* Skip UCONTEXT. */ 48 49 /* Address of saved LR register (R56) which holds previous PC. */ 50 CORE_ADDR prev_pc = base + 56 * 8; 51 52 int i; 53 54 for (i = 0; i < 56; i++) 55 trad_frame_set_reg_addr (this_cache, i, base + i * 8); 56 57 trad_frame_set_reg_value (this_cache, 64, 58 get_frame_memory_unsigned (this_frame, prev_pc, 8)); 59 60 /* Save a frame ID. */ 61 trad_frame_set_id (this_cache, frame_id_build (base, func)); 62 } 63 64 static const struct tramp_frame tilegx_linux_rt_sigframe = 65 { 66 SIGTRAMP_FRAME, 67 8, 68 { 69 { 0x00045fe551483000ULL, ULONGEST_MAX }, /* { moveli r10, 139 } */ 70 { 0x286b180051485000ULL, ULONGEST_MAX }, /* { swint1 } */ 71 { TRAMP_SENTINEL_INSN, ULONGEST_MAX } 72 }, 73 tilegx_linux_sigframe_init 74 }; 75 76 /* Register map; must match struct pt_regs in "ptrace.h". */ 77 78 static const struct regcache_map_entry tilegx_linux_regmap[] = 79 { 80 { TILEGX_NUM_EASY_REGS, TILEGX_FIRST_EASY_REGNUM, 8 }, 81 { 1, TILEGX_PC_REGNUM, 8 }, 82 { 1, TILEGX_FAULTNUM_REGNUM, 8 }, 83 { 0 } 84 }; 85 86 #define TILEGX_LINUX_SIZEOF_GREGSET (64 * 8) 87 88 /* TILE-Gx Linux kernel register set. */ 89 90 static const struct regset tilegx_linux_regset = 91 { 92 tilegx_linux_regmap, 93 regcache_supply_regset, regcache_collect_regset 94 }; 95 96 97 static void 98 tilegx_iterate_over_regset_sections (struct gdbarch *gdbarch, 99 iterate_over_regset_sections_cb *cb, 100 void *cb_data, 101 const struct regcache *regcache) 102 { 103 cb (".reg", TILEGX_LINUX_SIZEOF_GREGSET, TILEGX_LINUX_SIZEOF_GREGSET, 104 &tilegx_linux_regset, NULL, cb_data); 105 } 106 107 /* OS specific initialization of gdbarch. */ 108 109 static void 110 tilegx_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) 111 { 112 int arch_size = gdbarch_addr_bit (gdbarch); 113 114 linux_init_abi (info, gdbarch); 115 116 tramp_frame_prepend_unwinder (gdbarch, &tilegx_linux_rt_sigframe); 117 118 set_gdbarch_iterate_over_regset_sections 119 (gdbarch, tilegx_iterate_over_regset_sections); 120 121 /* GNU/Linux uses SVR4-style shared libraries. */ 122 if (arch_size == 32) 123 set_solib_svr4_fetch_link_map_offsets (gdbarch, 124 svr4_ilp32_fetch_link_map_offsets); 125 else 126 set_solib_svr4_fetch_link_map_offsets (gdbarch, 127 svr4_lp64_fetch_link_map_offsets); 128 129 /* Enable TLS support. */ 130 set_gdbarch_fetch_tls_load_module_address (gdbarch, 131 svr4_fetch_objfile_link_map); 132 133 /* Shared library handling. */ 134 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); 135 set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); 136 } 137 138 void _initialize_tilegx_linux_tdep (); 139 void 140 _initialize_tilegx_linux_tdep () 141 { 142 gdbarch_register_osabi (bfd_arch_tilegx, bfd_mach_tilegx, GDB_OSABI_LINUX, 143 tilegx_linux_init_abi); 144 } 145