1/* GNU/Linux/IA64 specific low level interface, for the remote server for GDB. 2 Copyright (C) 1995-2020 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19#include "server.h" 20#include "linux-low.h" 21 22#ifdef HAVE_SYS_REG_H 23#include <sys/reg.h> 24#endif 25 26/* Linux target op definitions for the IA64 architecture. */ 27 28class ia64_target : public linux_process_target 29{ 30public: 31 32 const regs_info *get_regs_info () override; 33 34 const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; 35 36protected: 37 38 void low_arch_setup () override; 39 40 bool low_cannot_fetch_register (int regno) override; 41 42 bool low_cannot_store_register (int regno) override; 43 44 bool low_fetch_register (regcache *regcache, int regno) override; 45 46 bool low_breakpoint_at (CORE_ADDR pc) override; 47}; 48 49/* The singleton target ops object. */ 50 51static ia64_target the_ia64_target; 52 53const gdb_byte * 54ia64_target::sw_breakpoint_from_kind (int kind, int *size) 55{ 56 gdb_assert_not_reached ("target op sw_breakpoint_from_kind is not " 57 "implemented by this target"); 58} 59 60bool 61ia64_target::low_breakpoint_at (CORE_ADDR pc) 62{ 63 gdb_assert_not_reached ("linux target op low_breakpoint_at is not " 64 "implemented by this target"); 65} 66 67/* Defined in auto-generated file reg-ia64.c. */ 68void init_registers_ia64 (void); 69extern const struct target_desc *tdesc_ia64; 70 71#define ia64_num_regs 462 72 73#include <asm/ptrace_offsets.h> 74 75static int ia64_regmap[] = 76 { 77 /* general registers */ 78 -1, /* gr0 not available; i.e, it's always zero */ 79 PT_R1, 80 PT_R2, 81 PT_R3, 82 PT_R4, 83 PT_R5, 84 PT_R6, 85 PT_R7, 86 PT_R8, 87 PT_R9, 88 PT_R10, 89 PT_R11, 90 PT_R12, 91 PT_R13, 92 PT_R14, 93 PT_R15, 94 PT_R16, 95 PT_R17, 96 PT_R18, 97 PT_R19, 98 PT_R20, 99 PT_R21, 100 PT_R22, 101 PT_R23, 102 PT_R24, 103 PT_R25, 104 PT_R26, 105 PT_R27, 106 PT_R28, 107 PT_R29, 108 PT_R30, 109 PT_R31, 110 /* gr32 through gr127 not directly available via the ptrace interface */ 111 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 112 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 113 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 114 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 116 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 117 /* Floating point registers */ 118 -1, -1, /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */ 119 PT_F2, 120 PT_F3, 121 PT_F4, 122 PT_F5, 123 PT_F6, 124 PT_F7, 125 PT_F8, 126 PT_F9, 127 PT_F10, 128 PT_F11, 129 PT_F12, 130 PT_F13, 131 PT_F14, 132 PT_F15, 133 PT_F16, 134 PT_F17, 135 PT_F18, 136 PT_F19, 137 PT_F20, 138 PT_F21, 139 PT_F22, 140 PT_F23, 141 PT_F24, 142 PT_F25, 143 PT_F26, 144 PT_F27, 145 PT_F28, 146 PT_F29, 147 PT_F30, 148 PT_F31, 149 PT_F32, 150 PT_F33, 151 PT_F34, 152 PT_F35, 153 PT_F36, 154 PT_F37, 155 PT_F38, 156 PT_F39, 157 PT_F40, 158 PT_F41, 159 PT_F42, 160 PT_F43, 161 PT_F44, 162 PT_F45, 163 PT_F46, 164 PT_F47, 165 PT_F48, 166 PT_F49, 167 PT_F50, 168 PT_F51, 169 PT_F52, 170 PT_F53, 171 PT_F54, 172 PT_F55, 173 PT_F56, 174 PT_F57, 175 PT_F58, 176 PT_F59, 177 PT_F60, 178 PT_F61, 179 PT_F62, 180 PT_F63, 181 PT_F64, 182 PT_F65, 183 PT_F66, 184 PT_F67, 185 PT_F68, 186 PT_F69, 187 PT_F70, 188 PT_F71, 189 PT_F72, 190 PT_F73, 191 PT_F74, 192 PT_F75, 193 PT_F76, 194 PT_F77, 195 PT_F78, 196 PT_F79, 197 PT_F80, 198 PT_F81, 199 PT_F82, 200 PT_F83, 201 PT_F84, 202 PT_F85, 203 PT_F86, 204 PT_F87, 205 PT_F88, 206 PT_F89, 207 PT_F90, 208 PT_F91, 209 PT_F92, 210 PT_F93, 211 PT_F94, 212 PT_F95, 213 PT_F96, 214 PT_F97, 215 PT_F98, 216 PT_F99, 217 PT_F100, 218 PT_F101, 219 PT_F102, 220 PT_F103, 221 PT_F104, 222 PT_F105, 223 PT_F106, 224 PT_F107, 225 PT_F108, 226 PT_F109, 227 PT_F110, 228 PT_F111, 229 PT_F112, 230 PT_F113, 231 PT_F114, 232 PT_F115, 233 PT_F116, 234 PT_F117, 235 PT_F118, 236 PT_F119, 237 PT_F120, 238 PT_F121, 239 PT_F122, 240 PT_F123, 241 PT_F124, 242 PT_F125, 243 PT_F126, 244 PT_F127, 245 /* predicate registers - we don't fetch these individually */ 246 -1, -1, -1, -1, -1, -1, -1, -1, 247 -1, -1, -1, -1, -1, -1, -1, -1, 248 -1, -1, -1, -1, -1, -1, -1, -1, 249 -1, -1, -1, -1, -1, -1, -1, -1, 250 -1, -1, -1, -1, -1, -1, -1, -1, 251 -1, -1, -1, -1, -1, -1, -1, -1, 252 -1, -1, -1, -1, -1, -1, -1, -1, 253 -1, -1, -1, -1, -1, -1, -1, -1, 254 /* branch registers */ 255 PT_B0, 256 PT_B1, 257 PT_B2, 258 PT_B3, 259 PT_B4, 260 PT_B5, 261 PT_B6, 262 PT_B7, 263 /* virtual frame pointer and virtual return address pointer */ 264 -1, -1, 265 /* other registers */ 266 PT_PR, 267 PT_CR_IIP, /* ip */ 268 PT_CR_IPSR, /* psr */ 269 PT_CFM, /* cfm */ 270 /* kernel registers not visible via ptrace interface (?) */ 271 -1, -1, -1, -1, -1, -1, -1, -1, 272 /* hole */ 273 -1, -1, -1, -1, -1, -1, -1, -1, 274 PT_AR_RSC, 275 PT_AR_BSP, 276 PT_AR_BSPSTORE, 277 PT_AR_RNAT, 278 -1, 279 -1, /* Not available: FCR, IA32 floating control register */ 280 -1, -1, 281 -1, /* Not available: EFLAG */ 282 -1, /* Not available: CSD */ 283 -1, /* Not available: SSD */ 284 -1, /* Not available: CFLG */ 285 -1, /* Not available: FSR */ 286 -1, /* Not available: FIR */ 287 -1, /* Not available: FDR */ 288 -1, 289 PT_AR_CCV, 290 -1, -1, -1, 291 PT_AR_UNAT, 292 -1, -1, -1, 293 PT_AR_FPSR, 294 -1, -1, -1, 295 -1, /* Not available: ITC */ 296 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 297 -1, -1, -1, -1, -1, -1, -1, -1, -1, 298 PT_AR_PFS, 299 PT_AR_LC, 300 PT_AR_EC, 301 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 302 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 303 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 304 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 305 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 306 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 307 -1, 308 }; 309 310bool 311ia64_target::low_cannot_store_register (int regno) 312{ 313 return false; 314} 315 316bool 317ia64_target::low_cannot_fetch_register (int regno) 318{ 319 return false; 320} 321 322/* GDB register numbers. */ 323#define IA64_GR0_REGNUM 0 324#define IA64_FR0_REGNUM 128 325#define IA64_FR1_REGNUM 129 326 327bool 328ia64_target::low_fetch_register (regcache *regcache, int regnum) 329{ 330 /* r0 cannot be fetched but is always zero. */ 331 if (regnum == IA64_GR0_REGNUM) 332 { 333 const gdb_byte zero[8] = { 0 }; 334 335 gdb_assert (sizeof (zero) == register_size (regcache->tdesc, regnum)); 336 supply_register (regcache, regnum, zero); 337 return true; 338 } 339 340 /* fr0 cannot be fetched but is always zero. */ 341 if (regnum == IA64_FR0_REGNUM) 342 { 343 const gdb_byte f_zero[16] = { 0 }; 344 345 gdb_assert (sizeof (f_zero) == register_size (regcache->tdesc, regnum)); 346 supply_register (regcache, regnum, f_zero); 347 return true; 348 } 349 350 /* fr1 cannot be fetched but is always one (1.0). */ 351 if (regnum == IA64_FR1_REGNUM) 352 { 353 const gdb_byte f_one[16] = 354 { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 }; 355 356 gdb_assert (sizeof (f_one) == register_size (regcache->tdesc, regnum)); 357 supply_register (regcache, regnum, f_one); 358 return true; 359 } 360 361 return false; 362} 363 364static struct usrregs_info ia64_usrregs_info = 365 { 366 ia64_num_regs, 367 ia64_regmap, 368 }; 369 370static struct regs_info myregs_info = 371 { 372 NULL, /* regset_bitmap */ 373 &ia64_usrregs_info 374 }; 375 376const regs_info * 377ia64_target::get_regs_info () 378{ 379 return &myregs_info; 380} 381 382void 383ia64_target::low_arch_setup () 384{ 385 current_process ()->tdesc = tdesc_ia64; 386} 387 388/* The linux target ops object. */ 389 390linux_process_target *the_linux_target = &the_ia64_target; 391 392void 393initialize_low_arch (void) 394{ 395 init_registers_ia64 (); 396} 397