gdb/gdbserver/i387-fp.c - gdb

Global variables defined

Data types defined

Functions defined

Source code

  1. /* i387-specific utility functions, for the remote server for GDB.
  2.    Copyright (C) 2000-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 "i387-fp.h"
  16. #include "x86-xstate.h"

  17. static const int num_mpx_bnd_registers = 4;
  18. static const int num_mpx_cfg_registers = 2;
  19. static const int num_avx512_k_registers = 8;
  20. static const int num_avx512_zmmh_low_registers = 16;
  21. static const int num_avx512_zmmh_high_registers = 16;
  22. static const int num_avx512_ymmh_registers = 16;
  23. static const int num_avx512_xmm_registers = 16;

  24. /* Note: These functions preserve the reserved bits in control registers.
  25.    However, gdbserver promptly throws away that information.  */

  26. /* These structs should have the proper sizes and alignment on both
  27.    i386 and x86-64 machines.  */

  28. struct i387_fsave {
  29.   /* All these are only sixteen bits, plus padding, except for fop (which
  30.      is only eleven bits), and fooff / fioff (which are 32 bits each).  */
  31.   unsigned short fctrl;
  32.   unsigned short pad1;
  33.   unsigned short fstat;
  34.   unsigned short pad2;
  35.   unsigned short ftag;
  36.   unsigned short pad3;
  37.   unsigned int fioff;
  38.   unsigned short fiseg;
  39.   unsigned short fop;
  40.   unsigned int fooff;
  41.   unsigned short foseg;
  42.   unsigned short pad4;

  43.   /* Space for eight 80-bit FP values.  */
  44.   unsigned char st_space[80];
  45. };

  46. struct i387_fxsave {
  47.   /* All these are only sixteen bits, plus padding, except for fop (which
  48.      is only eleven bits), and fooff / fioff (which are 32 bits each).  */
  49.   unsigned short fctrl;
  50.   unsigned short fstat;
  51.   unsigned short ftag;
  52.   unsigned short fop;
  53.   unsigned int fioff;
  54.   unsigned short fiseg;
  55.   unsigned short pad1;
  56.   unsigned int fooff;
  57.   unsigned short foseg;
  58.   unsigned short pad12;

  59.   unsigned int mxcsr;
  60.   unsigned int pad3;

  61.   /* Space for eight 80-bit FP values in 128-bit spaces.  */
  62.   unsigned char st_space[128];

  63.   /* Space for eight 128-bit XMM values, or 16 on x86-64.  */
  64.   unsigned char xmm_space[256];
  65. };

  66. struct i387_xsave {
  67.   /* All these are only sixteen bits, plus padding, except for fop (which
  68.      is only eleven bits), and fooff / fioff (which are 32 bits each).  */
  69.   unsigned short fctrl;
  70.   unsigned short fstat;
  71.   unsigned short ftag;
  72.   unsigned short fop;
  73.   unsigned int fioff;
  74.   unsigned short fiseg;
  75.   unsigned short pad1;
  76.   unsigned int fooff;
  77.   unsigned short foseg;
  78.   unsigned short pad12;

  79.   unsigned int mxcsr;
  80.   unsigned int mxcsr_mask;

  81.   /* Space for eight 80-bit FP values in 128-bit spaces.  */
  82.   unsigned char st_space[128];

  83.   /* Space for eight 128-bit XMM values, or 16 on x86-64.  */
  84.   unsigned char xmm_space[256];

  85.   unsigned char reserved1[48];

  86.   /* The extended control register 0 (the XFEATURE_ENABLED_MASK
  87.      register).  */
  88.   unsigned long long xcr0;

  89.   unsigned char reserved2[40];

  90.   /* The XSTATE_BV bit vector.  */
  91.   unsigned long long xstate_bv;

  92.   unsigned char reserved3[56];

  93.   /* Space for eight upper 128-bit YMM values, or 16 on x86-64.  */
  94.   unsigned char ymmh_space[256];

  95.   unsigned char reserved4[128];

  96.   /* Space for 4 bound registers values of 128 bits.  */
  97.   unsigned char mpx_bnd_space[64];

  98.   /* Space for 2 MPX configuration registers of 64 bits
  99.      plus reserved space.  */
  100.   unsigned char mpx_cfg_space[16];

  101.   unsigned char reserved5[48];

  102.   /* Space for 8 OpMask register values of 64 bits.  */
  103.   unsigned char k_space[64];

  104.   /* Space for 16 256-bit zmm0-15.  */
  105.   unsigned char zmmh_low_space[512];

  106.   /* Space for 16 512-bit zmm16-31 values.  */
  107.   unsigned char zmmh_high_space[1024];
  108. };

  109. void
  110. i387_cache_to_fsave (struct regcache *regcache, void *buf)
  111. {
  112.   struct i387_fsave *fp = (struct i387_fsave *) buf;
  113.   int i;
  114.   int st0_regnum = find_regno (regcache->tdesc, "st0");
  115.   unsigned long val, val2;

  116.   for (i = 0; i < 8; i++)
  117.     collect_register (regcache, i + st0_regnum,
  118.                       ((char *) &fp->st_space[0]) + i * 10);

  119.   collect_register_by_name (regcache, "fioff", &fp->fioff);
  120.   collect_register_by_name (regcache, "fooff", &fp->fooff);

  121.   /* This one's 11 bits... */
  122.   collect_register_by_name (regcache, "fop", &val2);
  123.   fp->fop = (val2 & 0x7FF) | (fp->fop & 0xF800);

  124.   /* Some registers are 16-bit.  */
  125.   collect_register_by_name (regcache, "fctrl", &val);
  126.   fp->fctrl = val;

  127.   collect_register_by_name (regcache, "fstat", &val);
  128.   val &= 0xFFFF;
  129.   fp->fstat = val;

  130.   collect_register_by_name (regcache, "ftag", &val);
  131.   val &= 0xFFFF;
  132.   fp->ftag = val;

  133.   collect_register_by_name (regcache, "fiseg", &val);
  134.   val &= 0xFFFF;
  135.   fp->fiseg = val;

  136.   collect_register_by_name (regcache, "foseg", &val);
  137.   val &= 0xFFFF;
  138.   fp->foseg = val;
  139. }

  140. void
  141. i387_fsave_to_cache (struct regcache *regcache, const void *buf)
  142. {
  143.   struct i387_fsave *fp = (struct i387_fsave *) buf;
  144.   int i;
  145.   int st0_regnum = find_regno (regcache->tdesc, "st0");
  146.   unsigned long val;

  147.   for (i = 0; i < 8; i++)
  148.     supply_register (regcache, i + st0_regnum,
  149.                      ((char *) &fp->st_space[0]) + i * 10);

  150.   supply_register_by_name (regcache, "fioff", &fp->fioff);
  151.   supply_register_by_name (regcache, "fooff", &fp->fooff);

  152.   /* Some registers are 16-bit.  */
  153.   val = fp->fctrl & 0xFFFF;
  154.   supply_register_by_name (regcache, "fctrl", &val);

  155.   val = fp->fstat & 0xFFFF;
  156.   supply_register_by_name (regcache, "fstat", &val);

  157.   val = fp->ftag & 0xFFFF;
  158.   supply_register_by_name (regcache, "ftag", &val);

  159.   val = fp->fiseg & 0xFFFF;
  160.   supply_register_by_name (regcache, "fiseg", &val);

  161.   val = fp->foseg & 0xFFFF;
  162.   supply_register_by_name (regcache, "foseg", &val);

  163.   /* fop has only 11 valid bits.  */
  164.   val = (fp->fop) & 0x7FF;
  165.   supply_register_by_name (regcache, "fop", &val);
  166. }

  167. void
  168. i387_cache_to_fxsave (struct regcache *regcache, void *buf)
  169. {
  170.   struct i387_fxsave *fp = (struct i387_fxsave *) buf;
  171.   int i;
  172.   int st0_regnum = find_regno (regcache->tdesc, "st0");
  173.   int xmm0_regnum = find_regno (regcache->tdesc, "xmm0");
  174.   unsigned long val, val2;
  175.   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
  176.   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;

  177.   for (i = 0; i < 8; i++)
  178.     collect_register (regcache, i + st0_regnum,
  179.                       ((char *) &fp->st_space[0]) + i * 16);
  180.   for (i = 0; i < num_xmm_registers; i++)
  181.     collect_register (regcache, i + xmm0_regnum,
  182.                       ((char *) &fp->xmm_space[0]) + i * 16);

  183.   collect_register_by_name (regcache, "fioff", &fp->fioff);
  184.   collect_register_by_name (regcache, "fooff", &fp->fooff);
  185.   collect_register_by_name (regcache, "mxcsr", &fp->mxcsr);

  186.   /* This one's 11 bits... */
  187.   collect_register_by_name (regcache, "fop", &val2);
  188.   fp->fop = (val2 & 0x7FF) | (fp->fop & 0xF800);

  189.   /* Some registers are 16-bit.  */
  190.   collect_register_by_name (regcache, "fctrl", &val);
  191.   fp->fctrl = val;

  192.   collect_register_by_name (regcache, "fstat", &val);
  193.   fp->fstat = val;

  194.   /* Convert to the simplifed tag form stored in fxsave data.  */
  195.   collect_register_by_name (regcache, "ftag", &val);
  196.   val &= 0xFFFF;
  197.   val2 = 0;
  198.   for (i = 7; i >= 0; i--)
  199.     {
  200.       int tag = (val >> (i * 2)) & 3;

  201.       if (tag != 3)
  202.         val2 |= (1 << i);
  203.     }
  204.   fp->ftag = val2;

  205.   collect_register_by_name (regcache, "fiseg", &val);
  206.   fp->fiseg = val;

  207.   collect_register_by_name (regcache, "foseg", &val);
  208.   fp->foseg = val;
  209. }

  210. void
  211. i387_cache_to_xsave (struct regcache *regcache, void *buf)
  212. {
  213.   struct i387_xsave *fp = (struct i387_xsave *) buf;
  214.   int i;
  215.   unsigned long val, val2;
  216.   unsigned int clear_bv;
  217.   unsigned long long xstate_bv = 0;
  218.   char raw[64];
  219.   char *p;
  220.   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
  221.   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;

  222.   /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
  223.      vector registers if its bit in xstat_bv is zero.  */
  224.   clear_bv = (~fp->xstate_bv) & x86_xcr0;

  225.   /* Clear part in x87 and vector registers if its bit in xstat_bv is
  226.      zero.  */
  227.   if (clear_bv)
  228.     {
  229.       if ((clear_bv & X86_XSTATE_X87))
  230.         for (i = 0; i < 8; i++)
  231.           memset (((char *) &fp->st_space[0]) + i * 16, 0, 10);

  232.       if ((clear_bv & X86_XSTATE_SSE))
  233.         for (i = 0; i < num_xmm_registers; i++)
  234.           memset (((char *) &fp->xmm_space[0]) + i * 16, 0, 16);

  235.       if ((clear_bv & X86_XSTATE_AVX))
  236.         for (i = 0; i < num_xmm_registers; i++)
  237.           memset (((char *) &fp->ymmh_space[0]) + i * 16, 0, 16);

  238.       if ((clear_bv & X86_XSTATE_BNDREGS))
  239.         for (i = 0; i < num_mpx_bnd_registers; i++)
  240.           memset (((char *) &fp->mpx_bnd_space[0]) + i * 16, 0, 16);

  241.       if ((clear_bv & X86_XSTATE_BNDCFG))
  242.         for (i = 0; i < num_mpx_cfg_registers; i++)
  243.           memset (((char *) &fp->mpx_cfg_space[0]) + i * 8, 0, 8);

  244.       if ((clear_bv & X86_XSTATE_K))
  245.         for (i = 0; i < num_avx512_k_registers; i++)
  246.           memset (((char *) &fp->k_space[0]) + i * 8, 0, 8);

  247.       if ((clear_bv & X86_XSTATE_ZMM_H))
  248.         for (i = 0; i < num_avx512_zmmh_low_registers; i++)
  249.           memset (((char *) &fp->zmmh_low_space[0]) + i * 32, 0, 32);

  250.       if ((clear_bv & X86_XSTATE_ZMM))
  251.         {
  252.           for (i = 0; i < num_avx512_zmmh_high_registers; i++)
  253.             memset (((char *) &fp->zmmh_low_space[0]) + 32 + i * 64, 0, 32);
  254.           for (i = 0; i < num_avx512_xmm_registers; i++)
  255.             memset (((char *) &fp->zmmh_high_space[0]) + i * 64, 0, 16);
  256.           for (i = 0; i < num_avx512_ymmh_registers; i++)
  257.             memset (((char *) &fp->zmmh_high_space[0]) + 16 + i * 64, 0, 16);
  258.         }
  259.     }

  260.   /* Check if any x87 registers are changed.  */
  261.   if ((x86_xcr0 & X86_XSTATE_X87))
  262.     {
  263.       int st0_regnum = find_regno (regcache->tdesc, "st0");

  264.       for (i = 0; i < 8; i++)
  265.         {
  266.           collect_register (regcache, i + st0_regnum, raw);
  267.           p = ((char *) &fp->st_space[0]) + i * 16;
  268.           if (memcmp (raw, p, 10))
  269.             {
  270.               xstate_bv |= X86_XSTATE_X87;
  271.               memcpy (p, raw, 10);
  272.             }
  273.         }
  274.     }

  275.   /* Check if any SSE registers are changed.  */
  276.   if ((x86_xcr0 & X86_XSTATE_SSE))
  277.     {
  278.       int xmm0_regnum = find_regno (regcache->tdesc, "xmm0");

  279.       for (i = 0; i < num_xmm_registers; i++)
  280.         {
  281.           collect_register (regcache, i + xmm0_regnum, raw);
  282.           p = ((char *) &fp->xmm_space[0]) + i * 16;
  283.           if (memcmp (raw, p, 16))
  284.             {
  285.               xstate_bv |= X86_XSTATE_SSE;
  286.               memcpy (p, raw, 16);
  287.             }
  288.         }
  289.     }

  290.   /* Check if any AVX registers are changed.  */
  291.   if ((x86_xcr0 & X86_XSTATE_AVX))
  292.     {
  293.       int ymm0h_regnum = find_regno (regcache->tdesc, "ymm0h");

  294.       for (i = 0; i < num_xmm_registers; i++)
  295.         {
  296.           collect_register (regcache, i + ymm0h_regnum, raw);
  297.           p = ((char *) &fp->ymmh_space[0]) + i * 16;
  298.           if (memcmp (raw, p, 16))
  299.             {
  300.               xstate_bv |= X86_XSTATE_AVX;
  301.               memcpy (p, raw, 16);
  302.             }
  303.         }
  304.     }

  305.   /* Check if any bound register has changed.  */
  306.   if ((x86_xcr0 & X86_XSTATE_BNDREGS))
  307.     {
  308.      int bnd0r_regnum = find_regno (regcache->tdesc, "bnd0raw");

  309.       for (i = 0; i < num_mpx_bnd_registers; i++)
  310.         {
  311.           collect_register (regcache, i + bnd0r_regnum, raw);
  312.           p = ((char *) &fp->mpx_bnd_space[0]) + i * 16;
  313.           if (memcmp (raw, p, 16))
  314.             {
  315.               xstate_bv |= X86_XSTATE_BNDREGS;
  316.               memcpy (p, raw, 16);
  317.             }
  318.         }
  319.     }

  320.   /* Check if any status register has changed.  */
  321.   if ((x86_xcr0 & X86_XSTATE_BNDCFG))
  322.     {
  323.       int bndcfg_regnum = find_regno (regcache->tdesc, "bndcfgu");

  324.       for (i = 0; i < num_mpx_cfg_registers; i++)
  325.         {
  326.           collect_register (regcache, i + bndcfg_regnum, raw);
  327.           p = ((char *) &fp->mpx_cfg_space[0]) + i * 8;
  328.           if (memcmp (raw, p, 8))
  329.             {
  330.               xstate_bv |= X86_XSTATE_BNDCFG;
  331.               memcpy (p, raw, 8);
  332.             }
  333.         }
  334.     }

  335.   /* Check if any K registers are changed.  */
  336.   if ((x86_xcr0 & X86_XSTATE_K))
  337.     {
  338.       int k0_regnum = find_regno (regcache->tdesc, "k0");

  339.       for (i = 0; i < num_avx512_k_registers; i++)
  340.         {
  341.           collect_register (regcache, i + k0_regnum, raw);
  342.           p = ((char *) &fp->k_space[0]) + i * 8;
  343.           if (memcmp (raw, p, 8) != 0)
  344.             {
  345.               xstate_bv |= X86_XSTATE_K;
  346.               memcpy (p, raw, 8);
  347.             }
  348.         }
  349.     }

  350.   /* Check if any of ZMM0H-ZMM15H registers are changed.  */
  351.   if ((x86_xcr0 & X86_XSTATE_ZMM_H))
  352.     {
  353.       int zmm0h_regnum = find_regno (regcache->tdesc, "zmm0h");

  354.       for (i = 0; i < num_avx512_zmmh_low_registers; i++)
  355.         {
  356.           collect_register (regcache, i + zmm0h_regnum, raw);
  357.           p = ((char *) &fp->zmmh_low_space[0]) + i * 32;
  358.           if (memcmp (raw, p, 32) != 0)
  359.             {
  360.               xstate_bv |= X86_XSTATE_ZMM_H;
  361.               memcpy (p, raw, 32);
  362.             }
  363.         }
  364.     }

  365.   /* Check if any of ZMM16H-ZMM31H registers are changed.  */
  366.   if ((x86_xcr0 & X86_XSTATE_ZMM))
  367.     {
  368.       int zmm16h_regnum = find_regno (regcache->tdesc, "zmm16h");

  369.       for (i = 0; i < num_avx512_zmmh_high_registers; i++)
  370.         {
  371.           collect_register (regcache, i + zmm16h_regnum, raw);
  372.           p = ((char *) &fp->zmmh_low_space[0]) + 32 + i * 64;
  373.           if (memcmp (raw, p, 32) != 0)
  374.             {
  375.               xstate_bv |= X86_XSTATE_ZMM;
  376.               memcpy (p, raw, 32);
  377.             }
  378.         }
  379.     }

  380.   /* Check if any XMM_AVX512 registers are changed.  */
  381.   if ((x86_xcr0 & X86_XSTATE_ZMM))
  382.     {
  383.       int xmm_avx512_regnum = find_regno (regcache->tdesc, "xmm16");

  384.       for (i = 0; i < num_avx512_xmm_registers; i++)
  385.         {
  386.           collect_register (regcache, i + xmm_avx512_regnum, raw);
  387.           p = ((char *) &fp->zmmh_high_space[0]) + i * 64;
  388.           if (memcmp (raw, p, 16) != 0)
  389.             {
  390.               xstate_bv |= X86_XSTATE_ZMM;
  391.               memcpy (p, raw, 16);
  392.             }
  393.         }
  394.     }

  395.   /* Check if any YMMH_AVX512 registers are changed.  */
  396.   if ((x86_xcr0 & X86_XSTATE_ZMM))
  397.     {
  398.       int ymmh_avx512_regnum = find_regno (regcache->tdesc, "ymm16h");

  399.       for (i = 0; i < num_avx512_ymmh_registers; i++)
  400.         {
  401.           collect_register (regcache, i + ymmh_avx512_regnum, raw);
  402.           p = ((char *) &fp->zmmh_high_space[0]) + 16 + i * 64;
  403.           if (memcmp (raw, p, 16) != 0)
  404.             {
  405.               xstate_bv |= X86_XSTATE_ZMM;
  406.               memcpy (p, raw, 16);
  407.             }
  408.         }
  409.     }

  410.   /* Update the corresponding bits in xstate_bv if any SSE/AVX
  411.      registers are changed.  */
  412.   fp->xstate_bv |= xstate_bv;

  413.   collect_register_by_name (regcache, "fioff", &fp->fioff);
  414.   collect_register_by_name (regcache, "fooff", &fp->fooff);
  415.   collect_register_by_name (regcache, "mxcsr", &fp->mxcsr);

  416.   /* This one's 11 bits... */
  417.   collect_register_by_name (regcache, "fop", &val2);
  418.   fp->fop = (val2 & 0x7FF) | (fp->fop & 0xF800);

  419.   /* Some registers are 16-bit.  */
  420.   collect_register_by_name (regcache, "fctrl", &val);
  421.   fp->fctrl = val;

  422.   collect_register_by_name (regcache, "fstat", &val);
  423.   fp->fstat = val;

  424.   /* Convert to the simplifed tag form stored in fxsave data.  */
  425.   collect_register_by_name (regcache, "ftag", &val);
  426.   val &= 0xFFFF;
  427.   val2 = 0;
  428.   for (i = 7; i >= 0; i--)
  429.     {
  430.       int tag = (val >> (i * 2)) & 3;

  431.       if (tag != 3)
  432.         val2 |= (1 << i);
  433.     }
  434.   fp->ftag = val2;

  435.   collect_register_by_name (regcache, "fiseg", &val);
  436.   fp->fiseg = val;

  437.   collect_register_by_name (regcache, "foseg", &val);
  438.   fp->foseg = val;
  439. }

  440. static int
  441. i387_ftag (struct i387_fxsave *fp, int regno)
  442. {
  443.   unsigned char *raw = &fp->st_space[regno * 16];
  444.   unsigned int exponent;
  445.   unsigned long fraction[2];
  446.   int integer;

  447.   integer = raw[7] & 0x80;
  448.   exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
  449.   fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
  450.   fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
  451.                  | (raw[5] << 8) | raw[4]);

  452.   if (exponent == 0x7fff)
  453.     {
  454.       /* Special.  */
  455.       return (2);
  456.     }
  457.   else if (exponent == 0x0000)
  458.     {
  459.       if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer)
  460.         {
  461.           /* Zero.  */
  462.           return (1);
  463.         }
  464.       else
  465.         {
  466.           /* Special.  */
  467.           return (2);
  468.         }
  469.     }
  470.   else
  471.     {
  472.       if (integer)
  473.         {
  474.           /* Valid.  */
  475.           return (0);
  476.         }
  477.       else
  478.         {
  479.           /* Special.  */
  480.           return (2);
  481.         }
  482.     }
  483. }

  484. void
  485. i387_fxsave_to_cache (struct regcache *regcache, const void *buf)
  486. {
  487.   struct i387_fxsave *fp = (struct i387_fxsave *) buf;
  488.   int i, top;
  489.   int st0_regnum = find_regno (regcache->tdesc, "st0");
  490.   int xmm0_regnum = find_regno (regcache->tdesc, "xmm0");
  491.   unsigned long val;
  492.   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
  493.   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;

  494.   for (i = 0; i < 8; i++)
  495.     supply_register (regcache, i + st0_regnum,
  496.                      ((char *) &fp->st_space[0]) + i * 16);
  497.   for (i = 0; i < num_xmm_registers; i++)
  498.     supply_register (regcache, i + xmm0_regnum,
  499.                      ((char *) &fp->xmm_space[0]) + i * 16);

  500.   supply_register_by_name (regcache, "fioff", &fp->fioff);
  501.   supply_register_by_name (regcache, "fooff", &fp->fooff);
  502.   supply_register_by_name (regcache, "mxcsr", &fp->mxcsr);

  503.   /* Some registers are 16-bit.  */
  504.   val = fp->fctrl & 0xFFFF;
  505.   supply_register_by_name (regcache, "fctrl", &val);

  506.   val = fp->fstat & 0xFFFF;
  507.   supply_register_by_name (regcache, "fstat", &val);

  508.   /* Generate the form of ftag data that GDB expects.  */
  509.   top = (fp->fstat >> 11) & 0x7;
  510.   val = 0;
  511.   for (i = 7; i >= 0; i--)
  512.     {
  513.       int tag;
  514.       if (fp->ftag & (1 << i))
  515.         tag = i387_ftag (fp, (i + 8 - top) % 8);
  516.       else
  517.         tag = 3;
  518.       val |= tag << (2 * i);
  519.     }
  520.   supply_register_by_name (regcache, "ftag", &val);

  521.   val = fp->fiseg & 0xFFFF;
  522.   supply_register_by_name (regcache, "fiseg", &val);

  523.   val = fp->foseg & 0xFFFF;
  524.   supply_register_by_name (regcache, "foseg", &val);

  525.   val = (fp->fop) & 0x7FF;
  526.   supply_register_by_name (regcache, "fop", &val);
  527. }

  528. void
  529. i387_xsave_to_cache (struct regcache *regcache, const void *buf)
  530. {
  531.   struct i387_xsave *fp = (struct i387_xsave *) buf;
  532.   struct i387_fxsave *fxp = (struct i387_fxsave *) buf;
  533.   int i, top;
  534.   unsigned long val;
  535.   unsigned int clear_bv;
  536.   gdb_byte *p;
  537.   /* Amd64 has 16 xmm regs; I386 has 8 xmm regs.  */
  538.   int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8;

  539.   /* The supported bits in `xstat_bv' are 1 byte.  Clear part in
  540.      vector registers if its bit in xstat_bv is zero.  */
  541.   clear_bv = (~fp->xstate_bv) & x86_xcr0;

  542.   /* Check if any x87 registers are changed.  */
  543.   if ((x86_xcr0 & X86_XSTATE_X87) != 0)
  544.     {
  545.       int st0_regnum = find_regno (regcache->tdesc, "st0");

  546.       if ((clear_bv & X86_XSTATE_X87) != 0)
  547.         {
  548.           for (i = 0; i < 8; i++)
  549.             supply_register_zeroed (regcache, i + st0_regnum);
  550.         }
  551.       else
  552.         {
  553.           p = (gdb_byte *) &fp->st_space[0];
  554.           for (i = 0; i < 8; i++)
  555.             supply_register (regcache, i + st0_regnum, p + i * 16);
  556.         }
  557.     }

  558.   if ((x86_xcr0 & X86_XSTATE_SSE) != 0)
  559.     {
  560.       int xmm0_regnum = find_regno (regcache->tdesc, "xmm0");

  561.       if ((clear_bv & X86_XSTATE_SSE))
  562.         {
  563.           for (i = 0; i < num_xmm_registers; i++)
  564.             supply_register_zeroed (regcache, i + xmm0_regnum);
  565.         }
  566.       else
  567.         {
  568.           p = (gdb_byte *) &fp->xmm_space[0];
  569.           for (i = 0; i < num_xmm_registers; i++)
  570.             supply_register (regcache, i + xmm0_regnum, p + i * 16);
  571.         }
  572.     }

  573.   if ((x86_xcr0 & X86_XSTATE_AVX) != 0)
  574.     {
  575.       int ymm0h_regnum = find_regno (regcache->tdesc, "ymm0h");

  576.       if ((clear_bv & X86_XSTATE_AVX) != 0)
  577.         {
  578.           for (i = 0; i < num_xmm_registers; i++)
  579.             supply_register_zeroed (regcache, i + ymm0h_regnum);
  580.         }
  581.       else
  582.         {
  583.           p = (gdb_byte *) &fp->ymmh_space[0];
  584.           for (i = 0; i < num_xmm_registers; i++)
  585.             supply_register (regcache, i + ymm0h_regnum, p + i * 16);
  586.         }
  587.     }

  588.   if ((x86_xcr0 & X86_XSTATE_BNDREGS))
  589.     {
  590.       int bnd0r_regnum = find_regno (regcache->tdesc, "bnd0raw");


  591.       if ((clear_bv & X86_XSTATE_BNDREGS) != 0)
  592.         {
  593.           for (i = 0; i < num_mpx_bnd_registers; i++)
  594.             supply_register_zeroed (regcache, i + bnd0r_regnum);
  595.         }
  596.       else
  597.         {
  598.           p = (gdb_byte *) &fp->mpx_bnd_space[0];
  599.           for (i = 0; i < num_mpx_bnd_registers; i++)
  600.             supply_register (regcache, i + bnd0r_regnum, p + i * 16);
  601.         }

  602.     }

  603.   if ((x86_xcr0 & X86_XSTATE_BNDCFG))
  604.     {
  605.       int bndcfg_regnum = find_regno (regcache->tdesc, "bndcfgu");

  606.       if ((clear_bv & X86_XSTATE_BNDCFG) != 0)
  607.         {
  608.           for (i = 0; i < num_mpx_cfg_registers; i++)
  609.             supply_register_zeroed (regcache, i + bndcfg_regnum);
  610.         }
  611.       else
  612.         {
  613.           p = (gdb_byte *) &fp->mpx_cfg_space[0];
  614.           for (i = 0; i < num_mpx_cfg_registers; i++)
  615.             supply_register (regcache, i + bndcfg_regnum, p + i * 8);
  616.         }
  617.     }

  618.   if ((x86_xcr0 & X86_XSTATE_K) != 0)
  619.     {
  620.       int k0_regnum = find_regno (regcache->tdesc, "k0");

  621.       if ((clear_bv & X86_XSTATE_K) != 0)
  622.         {
  623.           for (i = 0; i < num_avx512_k_registers; i++)
  624.             supply_register_zeroed (regcache, i + k0_regnum);
  625.         }
  626.       else
  627.         {
  628.           p = (gdb_byte *) &fp->k_space[0];
  629.           for (i = 0; i < num_avx512_k_registers; i++)
  630.             supply_register (regcache, i + k0_regnum, p + i * 8);
  631.         }
  632.     }

  633.   if ((x86_xcr0 & X86_XSTATE_ZMM_H) != 0)
  634.     {
  635.       int zmm0h_regnum = find_regno (regcache->tdesc, "zmm0h");

  636.       if ((clear_bv & X86_XSTATE_ZMM_H) != 0)
  637.         {
  638.           for (i = 0; i < num_avx512_zmmh_low_registers; i++)
  639.             supply_register_zeroed (regcache, i + zmm0h_regnum);
  640.         }
  641.       else
  642.         {
  643.           p = (gdb_byte *) &fp->zmmh_low_space[0];
  644.           for (i = 0; i < num_avx512_zmmh_low_registers; i++)
  645.             supply_register (regcache, i + zmm0h_regnum, p + i * 32);
  646.         }
  647.     }

  648.   if ((x86_xcr0 & X86_XSTATE_ZMM) != 0)
  649.     {
  650.       int zmm16h_regnum = find_regno (regcache->tdesc, "zmm16h");
  651.       int ymm16h_regnum = find_regno (regcache->tdesc, "ymm16h");
  652.       int xmm16_regnum = find_regno (regcache->tdesc, "xmm16");

  653.       if ((clear_bv & X86_XSTATE_ZMM) != 0)
  654.         {
  655.           for (i = 0; i < num_avx512_zmmh_high_registers; i++)
  656.             supply_register_zeroed (regcache, i + zmm16h_regnum);
  657.           for (i = 0; i < num_avx512_ymmh_registers; i++)
  658.             supply_register_zeroed (regcache, i + ymm16h_regnum);
  659.           for (i = 0; i < num_avx512_xmm_registers; i++)
  660.             supply_register_zeroed (regcache, i + xmm16_regnum);
  661.         }
  662.       else
  663.         {
  664.           p = (gdb_byte *) &fp->zmmh_high_space[0];
  665.           for (i = 0; i < num_avx512_zmmh_high_registers; i++)
  666.             supply_register (regcache, i + zmm16h_regnum, p + 32 + i * 64);
  667.           for (i = 0; i < num_avx512_ymmh_registers; i++)
  668.             supply_register (regcache, i + ymm16h_regnum, p + 16 + i * 64);
  669.           for (i = 0; i < num_avx512_xmm_registers; i++)
  670.             supply_register (regcache, i + xmm16_regnum, p + i * 64);
  671.         }
  672.     }

  673.   supply_register_by_name (regcache, "fioff", &fp->fioff);
  674.   supply_register_by_name (regcache, "fooff", &fp->fooff);
  675.   supply_register_by_name (regcache, "mxcsr", &fp->mxcsr);

  676.   /* Some registers are 16-bit.  */
  677.   val = fp->fctrl & 0xFFFF;
  678.   supply_register_by_name (regcache, "fctrl", &val);

  679.   val = fp->fstat & 0xFFFF;
  680.   supply_register_by_name (regcache, "fstat", &val);

  681.   /* Generate the form of ftag data that GDB expects.  */
  682.   top = (fp->fstat >> 11) & 0x7;
  683.   val = 0;
  684.   for (i = 7; i >= 0; i--)
  685.     {
  686.       int tag;
  687.       if (fp->ftag & (1 << i))
  688.         tag = i387_ftag (fxp, (i + 8 - top) % 8);
  689.       else
  690.         tag = 3;
  691.       val |= tag << (2 * i);
  692.     }
  693.   supply_register_by_name (regcache, "ftag", &val);

  694.   val = fp->fiseg & 0xFFFF;
  695.   supply_register_by_name (regcache, "fiseg", &val);

  696.   val = fp->foseg & 0xFFFF;
  697.   supply_register_by_name (regcache, "foseg", &val);

  698.   val = (fp->fop) & 0x7FF;
  699.   supply_register_by_name (regcache, "fop", &val);
  700. }

  701. /* Default to SSE.  */
  702. unsigned long long x86_xcr0 = X86_XSTATE_SSE_MASK;