1 /* i387-specific utility functions, for the remote server for GDB.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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/>. */
21 #include "x86-xstate.h"
23 static const int num_mpx_bnd_registers
= 4;
24 static const int num_mpx_cfg_registers
= 2;
25 static const int num_avx512_k_registers
= 8;
26 static const int num_avx512_zmmh_low_registers
= 16;
27 static const int num_avx512_zmmh_high_registers
= 16;
28 static const int num_avx512_ymmh_registers
= 16;
29 static const int num_avx512_xmm_registers
= 16;
30 static const int num_pkeys_registers
= 1;
32 /* Note: These functions preserve the reserved bits in control registers.
33 However, gdbserver promptly throws away that information. */
35 /* These structs should have the proper sizes and alignment on both
36 i386 and x86-64 machines. */
39 /* All these are only sixteen bits, plus padding, except for fop (which
40 is only eleven bits), and fooff / fioff (which are 32 bits each). */
54 /* Space for eight 80-bit FP values. */
55 unsigned char st_space
[80];
59 /* All these are only sixteen bits, plus padding, except for fop (which
60 is only eleven bits), and fooff / fioff (which are 32 bits each). */
75 /* Space for eight 80-bit FP values in 128-bit spaces. */
76 unsigned char st_space
[128];
78 /* Space for eight 128-bit XMM values, or 16 on x86-64. */
79 unsigned char xmm_space
[256];
83 /* All these are only sixteen bits, plus padding, except for fop (which
84 is only eleven bits), and fooff / fioff (which are 32 bits each). */
97 unsigned int mxcsr_mask
;
99 /* Space for eight 80-bit FP values in 128-bit spaces. */
100 unsigned char st_space
[128];
102 /* Space for eight 128-bit XMM values, or 16 on x86-64. */
103 unsigned char xmm_space
[256];
105 unsigned char reserved1
[48];
107 /* The extended control register 0 (the XFEATURE_ENABLED_MASK
109 unsigned long long xcr0
;
111 unsigned char reserved2
[40];
113 /* The XSTATE_BV bit vector. */
114 unsigned long long xstate_bv
;
116 unsigned char reserved3
[56];
118 /* Space for eight upper 128-bit YMM values, or 16 on x86-64. */
119 unsigned char ymmh_space
[256];
121 unsigned char reserved4
[128];
123 /* Space for 4 bound registers values of 128 bits. */
124 unsigned char mpx_bnd_space
[64];
126 /* Space for 2 MPX configuration registers of 64 bits
127 plus reserved space. */
128 unsigned char mpx_cfg_space
[16];
130 unsigned char reserved5
[48];
132 /* Space for 8 OpMask register values of 64 bits. */
133 unsigned char k_space
[64];
135 /* Space for 16 256-bit zmm0-15. */
136 unsigned char zmmh_low_space
[512];
138 /* Space for 16 512-bit zmm16-31 values. */
139 unsigned char zmmh_high_space
[1024];
141 /* Space for 1 32-bit PKRU register. The HW XSTATE size for this feature is
142 actually 64 bits, but WRPKRU/RDPKRU instructions ignore upper 32 bits. */
143 unsigned char pkru_space
[8];
147 i387_cache_to_fsave (struct regcache
*regcache
, void *buf
)
149 struct i387_fsave
*fp
= (struct i387_fsave
*) buf
;
151 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
152 unsigned long val
, val2
;
154 for (i
= 0; i
< 8; i
++)
155 collect_register (regcache
, i
+ st0_regnum
,
156 ((char *) &fp
->st_space
[0]) + i
* 10);
158 collect_register_by_name (regcache
, "fioff", &fp
->fioff
);
159 collect_register_by_name (regcache
, "fooff", &fp
->fooff
);
161 /* This one's 11 bits... */
162 collect_register_by_name (regcache
, "fop", &val2
);
163 fp
->fop
= (val2
& 0x7FF) | (fp
->fop
& 0xF800);
165 /* Some registers are 16-bit. */
166 collect_register_by_name (regcache
, "fctrl", &val
);
169 collect_register_by_name (regcache
, "fstat", &val
);
173 collect_register_by_name (regcache
, "ftag", &val
);
177 collect_register_by_name (regcache
, "fiseg", &val
);
181 collect_register_by_name (regcache
, "foseg", &val
);
187 i387_fsave_to_cache (struct regcache
*regcache
, const void *buf
)
189 struct i387_fsave
*fp
= (struct i387_fsave
*) buf
;
191 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
194 for (i
= 0; i
< 8; i
++)
195 supply_register (regcache
, i
+ st0_regnum
,
196 ((char *) &fp
->st_space
[0]) + i
* 10);
198 supply_register_by_name (regcache
, "fioff", &fp
->fioff
);
199 supply_register_by_name (regcache
, "fooff", &fp
->fooff
);
201 /* Some registers are 16-bit. */
202 val
= fp
->fctrl
& 0xFFFF;
203 supply_register_by_name (regcache
, "fctrl", &val
);
205 val
= fp
->fstat
& 0xFFFF;
206 supply_register_by_name (regcache
, "fstat", &val
);
208 val
= fp
->ftag
& 0xFFFF;
209 supply_register_by_name (regcache
, "ftag", &val
);
211 val
= fp
->fiseg
& 0xFFFF;
212 supply_register_by_name (regcache
, "fiseg", &val
);
214 val
= fp
->foseg
& 0xFFFF;
215 supply_register_by_name (regcache
, "foseg", &val
);
217 /* fop has only 11 valid bits. */
218 val
= (fp
->fop
) & 0x7FF;
219 supply_register_by_name (regcache
, "fop", &val
);
223 i387_cache_to_fxsave (struct regcache
*regcache
, void *buf
)
225 struct i387_fxsave
*fp
= (struct i387_fxsave
*) buf
;
227 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
228 int xmm0_regnum
= find_regno (regcache
->tdesc
, "xmm0");
229 unsigned long val
, val2
;
230 /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */
231 int num_xmm_registers
= register_size (regcache
->tdesc
, 0) == 8 ? 16 : 8;
233 for (i
= 0; i
< 8; i
++)
234 collect_register (regcache
, i
+ st0_regnum
,
235 ((char *) &fp
->st_space
[0]) + i
* 16);
236 for (i
= 0; i
< num_xmm_registers
; i
++)
237 collect_register (regcache
, i
+ xmm0_regnum
,
238 ((char *) &fp
->xmm_space
[0]) + i
* 16);
240 collect_register_by_name (regcache
, "fioff", &fp
->fioff
);
241 collect_register_by_name (regcache
, "fooff", &fp
->fooff
);
242 collect_register_by_name (regcache
, "mxcsr", &fp
->mxcsr
);
244 /* This one's 11 bits... */
245 collect_register_by_name (regcache
, "fop", &val2
);
246 fp
->fop
= (val2
& 0x7FF) | (fp
->fop
& 0xF800);
248 /* Some registers are 16-bit. */
249 collect_register_by_name (regcache
, "fctrl", &val
);
252 collect_register_by_name (regcache
, "fstat", &val
);
255 /* Convert to the simplifed tag form stored in fxsave data. */
256 collect_register_by_name (regcache
, "ftag", &val
);
259 for (i
= 7; i
>= 0; i
--)
261 int tag
= (val
>> (i
* 2)) & 3;
268 collect_register_by_name (regcache
, "fiseg", &val
);
271 collect_register_by_name (regcache
, "foseg", &val
);
276 i387_cache_to_xsave (struct regcache
*regcache
, void *buf
)
278 struct i387_xsave
*fp
= (struct i387_xsave
*) buf
;
280 unsigned long val
, val2
;
281 unsigned long long xstate_bv
= 0;
282 unsigned long long clear_bv
= 0;
285 /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */
286 int num_xmm_registers
= register_size (regcache
->tdesc
, 0) == 8 ? 16 : 8;
288 /* The supported bits in `xstat_bv' are 8 bytes. Clear part in
289 vector registers if its bit in xstat_bv is zero. */
290 clear_bv
= (~fp
->xstate_bv
) & x86_xcr0
;
292 /* Clear part in x87 and vector registers if its bit in xstat_bv is
296 if ((clear_bv
& X86_XSTATE_X87
))
297 for (i
= 0; i
< 8; i
++)
298 memset (((char *) &fp
->st_space
[0]) + i
* 16, 0, 10);
300 if ((clear_bv
& X86_XSTATE_SSE
))
301 for (i
= 0; i
< num_xmm_registers
; i
++)
302 memset (((char *) &fp
->xmm_space
[0]) + i
* 16, 0, 16);
304 if ((clear_bv
& X86_XSTATE_AVX
))
305 for (i
= 0; i
< num_xmm_registers
; i
++)
306 memset (((char *) &fp
->ymmh_space
[0]) + i
* 16, 0, 16);
308 if ((clear_bv
& X86_XSTATE_BNDREGS
))
309 for (i
= 0; i
< num_mpx_bnd_registers
; i
++)
310 memset (((char *) &fp
->mpx_bnd_space
[0]) + i
* 16, 0, 16);
312 if ((clear_bv
& X86_XSTATE_BNDCFG
))
313 for (i
= 0; i
< num_mpx_cfg_registers
; i
++)
314 memset (((char *) &fp
->mpx_cfg_space
[0]) + i
* 8, 0, 8);
316 if ((clear_bv
& X86_XSTATE_K
))
317 for (i
= 0; i
< num_avx512_k_registers
; i
++)
318 memset (((char *) &fp
->k_space
[0]) + i
* 8, 0, 8);
320 if ((clear_bv
& X86_XSTATE_ZMM_H
))
321 for (i
= 0; i
< num_avx512_zmmh_low_registers
; i
++)
322 memset (((char *) &fp
->zmmh_low_space
[0]) + i
* 32, 0, 32);
324 if ((clear_bv
& X86_XSTATE_ZMM
))
326 for (i
= 0; i
< num_avx512_zmmh_high_registers
; i
++)
327 memset (((char *) &fp
->zmmh_low_space
[0]) + 32 + i
* 64, 0, 32);
328 for (i
= 0; i
< num_avx512_xmm_registers
; i
++)
329 memset (((char *) &fp
->zmmh_high_space
[0]) + i
* 64, 0, 16);
330 for (i
= 0; i
< num_avx512_ymmh_registers
; i
++)
331 memset (((char *) &fp
->zmmh_high_space
[0]) + 16 + i
* 64, 0, 16);
334 if ((clear_bv
& X86_XSTATE_PKRU
))
335 for (i
= 0; i
< num_pkeys_registers
; i
++)
336 memset (((char *) &fp
->pkru_space
[0]) + i
* 4, 0, 4);
339 /* Check if any x87 registers are changed. */
340 if ((x86_xcr0
& X86_XSTATE_X87
))
342 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
344 for (i
= 0; i
< 8; i
++)
346 collect_register (regcache
, i
+ st0_regnum
, raw
);
347 p
= ((char *) &fp
->st_space
[0]) + i
* 16;
348 if (memcmp (raw
, p
, 10))
350 xstate_bv
|= X86_XSTATE_X87
;
356 /* Check if any SSE registers are changed. */
357 if ((x86_xcr0
& X86_XSTATE_SSE
))
359 int xmm0_regnum
= find_regno (regcache
->tdesc
, "xmm0");
361 for (i
= 0; i
< num_xmm_registers
; i
++)
363 collect_register (regcache
, i
+ xmm0_regnum
, raw
);
364 p
= ((char *) &fp
->xmm_space
[0]) + i
* 16;
365 if (memcmp (raw
, p
, 16))
367 xstate_bv
|= X86_XSTATE_SSE
;
373 /* Check if any AVX registers are changed. */
374 if ((x86_xcr0
& X86_XSTATE_AVX
))
376 int ymm0h_regnum
= find_regno (regcache
->tdesc
, "ymm0h");
378 for (i
= 0; i
< num_xmm_registers
; i
++)
380 collect_register (regcache
, i
+ ymm0h_regnum
, raw
);
381 p
= ((char *) &fp
->ymmh_space
[0]) + i
* 16;
382 if (memcmp (raw
, p
, 16))
384 xstate_bv
|= X86_XSTATE_AVX
;
390 /* Check if any bound register has changed. */
391 if ((x86_xcr0
& X86_XSTATE_BNDREGS
))
393 int bnd0r_regnum
= find_regno (regcache
->tdesc
, "bnd0raw");
395 for (i
= 0; i
< num_mpx_bnd_registers
; i
++)
397 collect_register (regcache
, i
+ bnd0r_regnum
, raw
);
398 p
= ((char *) &fp
->mpx_bnd_space
[0]) + i
* 16;
399 if (memcmp (raw
, p
, 16))
401 xstate_bv
|= X86_XSTATE_BNDREGS
;
407 /* Check if any status register has changed. */
408 if ((x86_xcr0
& X86_XSTATE_BNDCFG
))
410 int bndcfg_regnum
= find_regno (regcache
->tdesc
, "bndcfgu");
412 for (i
= 0; i
< num_mpx_cfg_registers
; i
++)
414 collect_register (regcache
, i
+ bndcfg_regnum
, raw
);
415 p
= ((char *) &fp
->mpx_cfg_space
[0]) + i
* 8;
416 if (memcmp (raw
, p
, 8))
418 xstate_bv
|= X86_XSTATE_BNDCFG
;
424 /* Check if any K registers are changed. */
425 if ((x86_xcr0
& X86_XSTATE_K
))
427 int k0_regnum
= find_regno (regcache
->tdesc
, "k0");
429 for (i
= 0; i
< num_avx512_k_registers
; i
++)
431 collect_register (regcache
, i
+ k0_regnum
, raw
);
432 p
= ((char *) &fp
->k_space
[0]) + i
* 8;
433 if (memcmp (raw
, p
, 8) != 0)
435 xstate_bv
|= X86_XSTATE_K
;
441 /* Check if any of ZMM0H-ZMM15H registers are changed. */
442 if ((x86_xcr0
& X86_XSTATE_ZMM_H
))
444 int zmm0h_regnum
= find_regno (regcache
->tdesc
, "zmm0h");
446 for (i
= 0; i
< num_avx512_zmmh_low_registers
; i
++)
448 collect_register (regcache
, i
+ zmm0h_regnum
, raw
);
449 p
= ((char *) &fp
->zmmh_low_space
[0]) + i
* 32;
450 if (memcmp (raw
, p
, 32) != 0)
452 xstate_bv
|= X86_XSTATE_ZMM_H
;
458 /* Check if any of ZMM16H-ZMM31H registers are changed. */
459 if ((x86_xcr0
& X86_XSTATE_ZMM
))
461 int zmm16h_regnum
= find_regno (regcache
->tdesc
, "zmm16h");
463 for (i
= 0; i
< num_avx512_zmmh_high_registers
; i
++)
465 collect_register (regcache
, i
+ zmm16h_regnum
, raw
);
466 p
= ((char *) &fp
->zmmh_high_space
[0]) + 32 + i
* 64;
467 if (memcmp (raw
, p
, 32) != 0)
469 xstate_bv
|= X86_XSTATE_ZMM
;
475 /* Check if any XMM_AVX512 registers are changed. */
476 if ((x86_xcr0
& X86_XSTATE_ZMM
))
478 int xmm_avx512_regnum
= find_regno (regcache
->tdesc
, "xmm16");
480 for (i
= 0; i
< num_avx512_xmm_registers
; i
++)
482 collect_register (regcache
, i
+ xmm_avx512_regnum
, raw
);
483 p
= ((char *) &fp
->zmmh_high_space
[0]) + i
* 64;
484 if (memcmp (raw
, p
, 16) != 0)
486 xstate_bv
|= X86_XSTATE_ZMM
;
492 /* Check if any YMMH_AVX512 registers are changed. */
493 if ((x86_xcr0
& X86_XSTATE_ZMM
))
495 int ymmh_avx512_regnum
= find_regno (regcache
->tdesc
, "ymm16h");
497 for (i
= 0; i
< num_avx512_ymmh_registers
; i
++)
499 collect_register (regcache
, i
+ ymmh_avx512_regnum
, raw
);
500 p
= ((char *) &fp
->zmmh_high_space
[0]) + 16 + i
* 64;
501 if (memcmp (raw
, p
, 16) != 0)
503 xstate_bv
|= X86_XSTATE_ZMM
;
509 /* Check if any PKEYS registers are changed. */
510 if ((x86_xcr0
& X86_XSTATE_PKRU
))
512 int pkru_regnum
= find_regno (regcache
->tdesc
, "pkru");
514 for (i
= 0; i
< num_pkeys_registers
; i
++)
516 collect_register (regcache
, i
+ pkru_regnum
, raw
);
517 p
= ((char *) &fp
->pkru_space
[0]) + i
* 4;
518 if (memcmp (raw
, p
, 4) != 0)
520 xstate_bv
|= X86_XSTATE_PKRU
;
526 /* Update the corresponding bits in xstate_bv if any SSE/AVX
527 registers are changed. */
528 fp
->xstate_bv
|= xstate_bv
;
530 collect_register_by_name (regcache
, "fioff", &fp
->fioff
);
531 collect_register_by_name (regcache
, "fooff", &fp
->fooff
);
532 collect_register_by_name (regcache
, "mxcsr", &fp
->mxcsr
);
534 /* This one's 11 bits... */
535 collect_register_by_name (regcache
, "fop", &val2
);
536 fp
->fop
= (val2
& 0x7FF) | (fp
->fop
& 0xF800);
538 /* Some registers are 16-bit. */
539 collect_register_by_name (regcache
, "fctrl", &val
);
542 collect_register_by_name (regcache
, "fstat", &val
);
545 /* Convert to the simplifed tag form stored in fxsave data. */
546 collect_register_by_name (regcache
, "ftag", &val
);
549 for (i
= 7; i
>= 0; i
--)
551 int tag
= (val
>> (i
* 2)) & 3;
558 collect_register_by_name (regcache
, "fiseg", &val
);
561 collect_register_by_name (regcache
, "foseg", &val
);
566 i387_ftag (struct i387_fxsave
*fp
, int regno
)
568 unsigned char *raw
= &fp
->st_space
[regno
* 16];
569 unsigned int exponent
;
570 unsigned long fraction
[2];
573 integer
= raw
[7] & 0x80;
574 exponent
= (((raw
[9] & 0x7f) << 8) | raw
[8]);
575 fraction
[0] = ((raw
[3] << 24) | (raw
[2] << 16) | (raw
[1] << 8) | raw
[0]);
576 fraction
[1] = (((raw
[7] & 0x7f) << 24) | (raw
[6] << 16)
577 | (raw
[5] << 8) | raw
[4]);
579 if (exponent
== 0x7fff)
584 else if (exponent
== 0x0000)
586 if (fraction
[0] == 0x0000 && fraction
[1] == 0x0000 && !integer
)
613 i387_fxsave_to_cache (struct regcache
*regcache
, const void *buf
)
615 struct i387_fxsave
*fp
= (struct i387_fxsave
*) buf
;
617 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
618 int xmm0_regnum
= find_regno (regcache
->tdesc
, "xmm0");
620 /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */
621 int num_xmm_registers
= register_size (regcache
->tdesc
, 0) == 8 ? 16 : 8;
623 for (i
= 0; i
< 8; i
++)
624 supply_register (regcache
, i
+ st0_regnum
,
625 ((char *) &fp
->st_space
[0]) + i
* 16);
626 for (i
= 0; i
< num_xmm_registers
; i
++)
627 supply_register (regcache
, i
+ xmm0_regnum
,
628 ((char *) &fp
->xmm_space
[0]) + i
* 16);
630 supply_register_by_name (regcache
, "fioff", &fp
->fioff
);
631 supply_register_by_name (regcache
, "fooff", &fp
->fooff
);
632 supply_register_by_name (regcache
, "mxcsr", &fp
->mxcsr
);
634 /* Some registers are 16-bit. */
635 val
= fp
->fctrl
& 0xFFFF;
636 supply_register_by_name (regcache
, "fctrl", &val
);
638 val
= fp
->fstat
& 0xFFFF;
639 supply_register_by_name (regcache
, "fstat", &val
);
641 /* Generate the form of ftag data that GDB expects. */
642 top
= (fp
->fstat
>> 11) & 0x7;
644 for (i
= 7; i
>= 0; i
--)
647 if (fp
->ftag
& (1 << i
))
648 tag
= i387_ftag (fp
, (i
+ 8 - top
) % 8);
651 val
|= tag
<< (2 * i
);
653 supply_register_by_name (regcache
, "ftag", &val
);
655 val
= fp
->fiseg
& 0xFFFF;
656 supply_register_by_name (regcache
, "fiseg", &val
);
658 val
= fp
->foseg
& 0xFFFF;
659 supply_register_by_name (regcache
, "foseg", &val
);
661 val
= (fp
->fop
) & 0x7FF;
662 supply_register_by_name (regcache
, "fop", &val
);
666 i387_xsave_to_cache (struct regcache
*regcache
, const void *buf
)
668 struct i387_xsave
*fp
= (struct i387_xsave
*) buf
;
669 struct i387_fxsave
*fxp
= (struct i387_fxsave
*) buf
;
672 unsigned long long clear_bv
;
674 /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */
675 int num_xmm_registers
= register_size (regcache
->tdesc
, 0) == 8 ? 16 : 8;
677 /* The supported bits in `xstat_bv' are 8 bytes. Clear part in
678 vector registers if its bit in xstat_bv is zero. */
679 clear_bv
= (~fp
->xstate_bv
) & x86_xcr0
;
681 /* Check if any x87 registers are changed. */
682 if ((x86_xcr0
& X86_XSTATE_X87
) != 0)
684 int st0_regnum
= find_regno (regcache
->tdesc
, "st0");
686 if ((clear_bv
& X86_XSTATE_X87
) != 0)
688 for (i
= 0; i
< 8; i
++)
689 supply_register_zeroed (regcache
, i
+ st0_regnum
);
693 p
= (gdb_byte
*) &fp
->st_space
[0];
694 for (i
= 0; i
< 8; i
++)
695 supply_register (regcache
, i
+ st0_regnum
, p
+ i
* 16);
699 if ((x86_xcr0
& X86_XSTATE_SSE
) != 0)
701 int xmm0_regnum
= find_regno (regcache
->tdesc
, "xmm0");
703 if ((clear_bv
& X86_XSTATE_SSE
))
705 for (i
= 0; i
< num_xmm_registers
; i
++)
706 supply_register_zeroed (regcache
, i
+ xmm0_regnum
);
710 p
= (gdb_byte
*) &fp
->xmm_space
[0];
711 for (i
= 0; i
< num_xmm_registers
; i
++)
712 supply_register (regcache
, i
+ xmm0_regnum
, p
+ i
* 16);
716 if ((x86_xcr0
& X86_XSTATE_AVX
) != 0)
718 int ymm0h_regnum
= find_regno (regcache
->tdesc
, "ymm0h");
720 if ((clear_bv
& X86_XSTATE_AVX
) != 0)
722 for (i
= 0; i
< num_xmm_registers
; i
++)
723 supply_register_zeroed (regcache
, i
+ ymm0h_regnum
);
727 p
= (gdb_byte
*) &fp
->ymmh_space
[0];
728 for (i
= 0; i
< num_xmm_registers
; i
++)
729 supply_register (regcache
, i
+ ymm0h_regnum
, p
+ i
* 16);
733 if ((x86_xcr0
& X86_XSTATE_BNDREGS
))
735 int bnd0r_regnum
= find_regno (regcache
->tdesc
, "bnd0raw");
738 if ((clear_bv
& X86_XSTATE_BNDREGS
) != 0)
740 for (i
= 0; i
< num_mpx_bnd_registers
; i
++)
741 supply_register_zeroed (regcache
, i
+ bnd0r_regnum
);
745 p
= (gdb_byte
*) &fp
->mpx_bnd_space
[0];
746 for (i
= 0; i
< num_mpx_bnd_registers
; i
++)
747 supply_register (regcache
, i
+ bnd0r_regnum
, p
+ i
* 16);
752 if ((x86_xcr0
& X86_XSTATE_BNDCFG
))
754 int bndcfg_regnum
= find_regno (regcache
->tdesc
, "bndcfgu");
756 if ((clear_bv
& X86_XSTATE_BNDCFG
) != 0)
758 for (i
= 0; i
< num_mpx_cfg_registers
; i
++)
759 supply_register_zeroed (regcache
, i
+ bndcfg_regnum
);
763 p
= (gdb_byte
*) &fp
->mpx_cfg_space
[0];
764 for (i
= 0; i
< num_mpx_cfg_registers
; i
++)
765 supply_register (regcache
, i
+ bndcfg_regnum
, p
+ i
* 8);
769 if ((x86_xcr0
& X86_XSTATE_K
) != 0)
771 int k0_regnum
= find_regno (regcache
->tdesc
, "k0");
773 if ((clear_bv
& X86_XSTATE_K
) != 0)
775 for (i
= 0; i
< num_avx512_k_registers
; i
++)
776 supply_register_zeroed (regcache
, i
+ k0_regnum
);
780 p
= (gdb_byte
*) &fp
->k_space
[0];
781 for (i
= 0; i
< num_avx512_k_registers
; i
++)
782 supply_register (regcache
, i
+ k0_regnum
, p
+ i
* 8);
786 if ((x86_xcr0
& X86_XSTATE_ZMM_H
) != 0)
788 int zmm0h_regnum
= find_regno (regcache
->tdesc
, "zmm0h");
790 if ((clear_bv
& X86_XSTATE_ZMM_H
) != 0)
792 for (i
= 0; i
< num_avx512_zmmh_low_registers
; i
++)
793 supply_register_zeroed (regcache
, i
+ zmm0h_regnum
);
797 p
= (gdb_byte
*) &fp
->zmmh_low_space
[0];
798 for (i
= 0; i
< num_avx512_zmmh_low_registers
; i
++)
799 supply_register (regcache
, i
+ zmm0h_regnum
, p
+ i
* 32);
803 if ((x86_xcr0
& X86_XSTATE_ZMM
) != 0)
805 int zmm16h_regnum
= find_regno (regcache
->tdesc
, "zmm16h");
806 int ymm16h_regnum
= find_regno (regcache
->tdesc
, "ymm16h");
807 int xmm16_regnum
= find_regno (regcache
->tdesc
, "xmm16");
809 if ((clear_bv
& X86_XSTATE_ZMM
) != 0)
811 for (i
= 0; i
< num_avx512_zmmh_high_registers
; i
++)
812 supply_register_zeroed (regcache
, i
+ zmm16h_regnum
);
813 for (i
= 0; i
< num_avx512_ymmh_registers
; i
++)
814 supply_register_zeroed (regcache
, i
+ ymm16h_regnum
);
815 for (i
= 0; i
< num_avx512_xmm_registers
; i
++)
816 supply_register_zeroed (regcache
, i
+ xmm16_regnum
);
820 p
= (gdb_byte
*) &fp
->zmmh_high_space
[0];
821 for (i
= 0; i
< num_avx512_zmmh_high_registers
; i
++)
822 supply_register (regcache
, i
+ zmm16h_regnum
, p
+ 32 + i
* 64);
823 for (i
= 0; i
< num_avx512_ymmh_registers
; i
++)
824 supply_register (regcache
, i
+ ymm16h_regnum
, p
+ 16 + i
* 64);
825 for (i
= 0; i
< num_avx512_xmm_registers
; i
++)
826 supply_register (regcache
, i
+ xmm16_regnum
, p
+ i
* 64);
830 if ((x86_xcr0
& X86_XSTATE_PKRU
) != 0)
832 int pkru_regnum
= find_regno (regcache
->tdesc
, "pkru");
834 if ((clear_bv
& X86_XSTATE_PKRU
) != 0)
836 for (i
= 0; i
< num_pkeys_registers
; i
++)
837 supply_register_zeroed (regcache
, i
+ pkru_regnum
);
841 p
= (gdb_byte
*) &fp
->pkru_space
[0];
842 for (i
= 0; i
< num_pkeys_registers
; i
++)
843 supply_register (regcache
, i
+ pkru_regnum
, p
+ i
* 4);
847 supply_register_by_name (regcache
, "fioff", &fp
->fioff
);
848 supply_register_by_name (regcache
, "fooff", &fp
->fooff
);
849 supply_register_by_name (regcache
, "mxcsr", &fp
->mxcsr
);
851 /* Some registers are 16-bit. */
852 val
= fp
->fctrl
& 0xFFFF;
853 supply_register_by_name (regcache
, "fctrl", &val
);
855 val
= fp
->fstat
& 0xFFFF;
856 supply_register_by_name (regcache
, "fstat", &val
);
858 /* Generate the form of ftag data that GDB expects. */
859 top
= (fp
->fstat
>> 11) & 0x7;
861 for (i
= 7; i
>= 0; i
--)
864 if (fp
->ftag
& (1 << i
))
865 tag
= i387_ftag (fxp
, (i
+ 8 - top
) % 8);
868 val
|= tag
<< (2 * i
);
870 supply_register_by_name (regcache
, "ftag", &val
);
872 val
= fp
->fiseg
& 0xFFFF;
873 supply_register_by_name (regcache
, "fiseg", &val
);
875 val
= fp
->foseg
& 0xFFFF;
876 supply_register_by_name (regcache
, "foseg", &val
);
878 val
= (fp
->fop
) & 0x7FF;
879 supply_register_by_name (regcache
, "fop", &val
);
882 /* Default to SSE. */
883 unsigned long long x86_xcr0
= X86_XSTATE_SSE_MASK
;