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