gdb/gdbserver/linux-ia64-low.c - gdb

Global variables defined

Functions defined

Macros defined

Source code

  1. /* GNU/Linux/IA64 specific low level interface, for the remote server for GDB.
  2.    Copyright (C) 1995-2015 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 "server.h"
  15. #include "linux-low.h"

  16. #ifdef HAVE_SYS_REG_H
  17. #include <sys/reg.h>
  18. #endif

  19. /* Defined in auto-generated file reg-ia64.c.  */
  20. void init_registers_ia64 (void);
  21. extern const struct target_desc *tdesc_ia64;

  22. #define ia64_num_regs 462

  23. #include <asm/ptrace_offsets.h>

  24. static int ia64_regmap[] =
  25.   {
  26.     /* general registers */
  27.     -1,                /* gr0 not available; i.e, it's always zero */
  28.     PT_R1,
  29.     PT_R2,
  30.     PT_R3,
  31.     PT_R4,
  32.     PT_R5,
  33.     PT_R6,
  34.     PT_R7,
  35.     PT_R8,
  36.     PT_R9,
  37.     PT_R10,
  38.     PT_R11,
  39.     PT_R12,
  40.     PT_R13,
  41.     PT_R14,
  42.     PT_R15,
  43.     PT_R16,
  44.     PT_R17,
  45.     PT_R18,
  46.     PT_R19,
  47.     PT_R20,
  48.     PT_R21,
  49.     PT_R22,
  50.     PT_R23,
  51.     PT_R24,
  52.     PT_R25,
  53.     PT_R26,
  54.     PT_R27,
  55.     PT_R28,
  56.     PT_R29,
  57.     PT_R30,
  58.     PT_R31,
  59.     /* gr32 through gr127 not directly available via the ptrace interface */
  60.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  61.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  62.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  63.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  64.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  65.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  66.     /* Floating point registers */
  67.     -1, -1,        /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */
  68.     PT_F2,
  69.     PT_F3,
  70.     PT_F4,
  71.     PT_F5,
  72.     PT_F6,
  73.     PT_F7,
  74.     PT_F8,
  75.     PT_F9,
  76.     PT_F10,
  77.     PT_F11,
  78.     PT_F12,
  79.     PT_F13,
  80.     PT_F14,
  81.     PT_F15,
  82.     PT_F16,
  83.     PT_F17,
  84.     PT_F18,
  85.     PT_F19,
  86.     PT_F20,
  87.     PT_F21,
  88.     PT_F22,
  89.     PT_F23,
  90.     PT_F24,
  91.     PT_F25,
  92.     PT_F26,
  93.     PT_F27,
  94.     PT_F28,
  95.     PT_F29,
  96.     PT_F30,
  97.     PT_F31,
  98.     PT_F32,
  99.     PT_F33,
  100.     PT_F34,
  101.     PT_F35,
  102.     PT_F36,
  103.     PT_F37,
  104.     PT_F38,
  105.     PT_F39,
  106.     PT_F40,
  107.     PT_F41,
  108.     PT_F42,
  109.     PT_F43,
  110.     PT_F44,
  111.     PT_F45,
  112.     PT_F46,
  113.     PT_F47,
  114.     PT_F48,
  115.     PT_F49,
  116.     PT_F50,
  117.     PT_F51,
  118.     PT_F52,
  119.     PT_F53,
  120.     PT_F54,
  121.     PT_F55,
  122.     PT_F56,
  123.     PT_F57,
  124.     PT_F58,
  125.     PT_F59,
  126.     PT_F60,
  127.     PT_F61,
  128.     PT_F62,
  129.     PT_F63,
  130.     PT_F64,
  131.     PT_F65,
  132.     PT_F66,
  133.     PT_F67,
  134.     PT_F68,
  135.     PT_F69,
  136.     PT_F70,
  137.     PT_F71,
  138.     PT_F72,
  139.     PT_F73,
  140.     PT_F74,
  141.     PT_F75,
  142.     PT_F76,
  143.     PT_F77,
  144.     PT_F78,
  145.     PT_F79,
  146.     PT_F80,
  147.     PT_F81,
  148.     PT_F82,
  149.     PT_F83,
  150.     PT_F84,
  151.     PT_F85,
  152.     PT_F86,
  153.     PT_F87,
  154.     PT_F88,
  155.     PT_F89,
  156.     PT_F90,
  157.     PT_F91,
  158.     PT_F92,
  159.     PT_F93,
  160.     PT_F94,
  161.     PT_F95,
  162.     PT_F96,
  163.     PT_F97,
  164.     PT_F98,
  165.     PT_F99,
  166.     PT_F100,
  167.     PT_F101,
  168.     PT_F102,
  169.     PT_F103,
  170.     PT_F104,
  171.     PT_F105,
  172.     PT_F106,
  173.     PT_F107,
  174.     PT_F108,
  175.     PT_F109,
  176.     PT_F110,
  177.     PT_F111,
  178.     PT_F112,
  179.     PT_F113,
  180.     PT_F114,
  181.     PT_F115,
  182.     PT_F116,
  183.     PT_F117,
  184.     PT_F118,
  185.     PT_F119,
  186.     PT_F120,
  187.     PT_F121,
  188.     PT_F122,
  189.     PT_F123,
  190.     PT_F124,
  191.     PT_F125,
  192.     PT_F126,
  193.     PT_F127,
  194.     /* predicate registers - we don't fetch these individually */
  195.     -1, -1, -1, -1, -1, -1, -1, -1,
  196.     -1, -1, -1, -1, -1, -1, -1, -1,
  197.     -1, -1, -1, -1, -1, -1, -1, -1,
  198.     -1, -1, -1, -1, -1, -1, -1, -1,
  199.     -1, -1, -1, -1, -1, -1, -1, -1,
  200.     -1, -1, -1, -1, -1, -1, -1, -1,
  201.     -1, -1, -1, -1, -1, -1, -1, -1,
  202.     -1, -1, -1, -1, -1, -1, -1, -1,
  203.     /* branch registers */
  204.     PT_B0,
  205.     PT_B1,
  206.     PT_B2,
  207.     PT_B3,
  208.     PT_B4,
  209.     PT_B5,
  210.     PT_B6,
  211.     PT_B7,
  212.     /* virtual frame pointer and virtual return address pointer */
  213.     -1, -1,
  214.     /* other registers */
  215.     PT_PR,
  216.     PT_CR_IIP,        /* ip */
  217.     PT_CR_IPSR, /* psr */
  218.     PT_CFM,        /* cfm */
  219.     /* kernel registers not visible via ptrace interface (?) */
  220.     -1, -1, -1, -1, -1, -1, -1, -1,
  221.     /* hole */
  222.     -1, -1, -1, -1, -1, -1, -1, -1,
  223.     PT_AR_RSC,
  224.     PT_AR_BSP,
  225.     PT_AR_BSPSTORE,
  226.     PT_AR_RNAT,
  227.     -1,
  228.     -1,                /* Not available: FCR, IA32 floating control register */
  229.     -1, -1,
  230.     -1,                /* Not available: EFLAG */
  231.     -1,                /* Not available: CSD */
  232.     -1,                /* Not available: SSD */
  233.     -1,                /* Not available: CFLG */
  234.     -1,                /* Not available: FSR */
  235.     -1,                /* Not available: FIR */
  236.     -1,                /* Not available: FDR */
  237.     -1,
  238.     PT_AR_CCV,
  239.     -1, -1, -1,
  240.     PT_AR_UNAT,
  241.     -1, -1, -1,
  242.     PT_AR_FPSR,
  243.     -1, -1, -1,
  244.     -1,                /* Not available: ITC */
  245.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  246.     -1, -1, -1, -1, -1, -1, -1, -1, -1,
  247.     PT_AR_PFS,
  248.     PT_AR_LC,
  249.     PT_AR_EC,
  250.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  251.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  252.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  253.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  254.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  255.     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  256.     -1,
  257.   };

  258. static int
  259. ia64_cannot_store_register (int regno)
  260. {
  261.   return 0;
  262. }

  263. static int
  264. ia64_cannot_fetch_register (int regno)
  265. {
  266.   return 0;
  267. }

  268. /* GDB register numbers.  */
  269. #define IA64_GR0_REGNUM                0
  270. #define IA64_FR0_REGNUM                128
  271. #define IA64_FR1_REGNUM                129

  272. static int
  273. ia64_fetch_register (struct regcache *regcache, int regnum)
  274. {
  275.   /* r0 cannot be fetched but is always zero.  */
  276.   if (regnum == IA64_GR0_REGNUM)
  277.     {
  278.       const gdb_byte zero[8] = { 0 };

  279.       gdb_assert (sizeof (zero) == register_size (regcache->tdesc, regnum));
  280.       supply_register (regcache, regnum, zero);
  281.       return 1;
  282.     }

  283.   /* fr0 cannot be fetched but is always zero.  */
  284.   if (regnum == IA64_FR0_REGNUM)
  285.     {
  286.       const gdb_byte f_zero[16] = { 0 };

  287.       gdb_assert (sizeof (f_zero) == register_size (regcache->tdesc, regnum));
  288.       supply_register (regcache, regnum, f_zero);
  289.       return 1;
  290.     }

  291.   /* fr1 cannot be fetched but is always one (1.0).  */
  292.   if (regnum == IA64_FR1_REGNUM)
  293.     {
  294.       const gdb_byte f_one[16] =
  295.         { 0, 0, 0, 0, 0, 0, 0, 0x80, 0xff, 0xff, 0, 0, 0, 0, 0, 0 };

  296.       gdb_assert (sizeof (f_one) == register_size (regcache->tdesc, regnum));
  297.       supply_register (regcache, regnum, f_one);
  298.       return 1;
  299.     }

  300.   return 0;
  301. }

  302. static struct usrregs_info ia64_usrregs_info =
  303.   {
  304.     ia64_num_regs,
  305.     ia64_regmap,
  306.   };

  307. static struct regs_info regs_info =
  308.   {
  309.     NULL, /* regset_bitmap */
  310.     &ia64_usrregs_info
  311.   };

  312. static const struct regs_info *
  313. ia64_regs_info (void)
  314. {
  315.   return &regs_info;
  316. }

  317. static void
  318. ia64_arch_setup (void)
  319. {
  320.   current_process ()->tdesc = tdesc_ia64;
  321. }


  322. struct linux_target_ops the_low_target = {
  323.   ia64_arch_setup,
  324.   ia64_regs_info,
  325.   ia64_cannot_fetch_register,
  326.   ia64_cannot_store_register,
  327.   ia64_fetch_register,
  328. };

  329. void
  330. initialize_low_arch (void)
  331. {
  332.   init_registers_ia64 ();
  333. }