Automatic date update in version.in
[binutils-gdb.git] / gdb / i387-tdep.c
blob00c9523ff25816c4b5fad530373510b17d007f06
1 /* Intel 387 floating point stuff.
3 Copyright (C) 1988-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "frame.h"
21 #include "gdbcore.h"
22 #include "inferior.h"
23 #include "language.h"
24 #include "regcache.h"
25 #include "target-float.h"
26 #include "value.h"
28 #include "i386-tdep.h"
29 #include "i387-tdep.h"
30 #include "gdbsupport/x86-xstate.h"
32 /* Print the floating point number specified by RAW. */
34 static void
35 print_i387_value (struct gdbarch *gdbarch,
36 const gdb_byte *raw, struct ui_file *file)
38 /* We try to print 19 digits. The last digit may or may not contain
39 garbage, but we'd better print one too many. We need enough room
40 to print the value, 1 position for the sign, 1 for the decimal
41 point, 19 for the digits and 6 for the exponent adds up to 27. */
42 const struct type *type = i387_ext_type (gdbarch);
43 std::string str = target_float_to_string (raw, type, " %-+27.19g");
44 gdb_printf (file, "%s", str.c_str ());
47 /* Print the classification for the register contents RAW. */
49 static void
50 print_i387_ext (struct gdbarch *gdbarch,
51 const gdb_byte *raw, struct ui_file *file)
53 int sign;
54 int integer;
55 unsigned int exponent;
56 unsigned long fraction[2];
58 sign = raw[9] & 0x80;
59 integer = raw[7] & 0x80;
60 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
61 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
62 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
63 | (raw[5] << 8) | raw[4]);
65 if (exponent == 0x7fff && integer)
67 if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000)
68 /* Infinity. */
69 gdb_printf (file, " %cInf", (sign ? '-' : '+'));
70 else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000)
71 /* Real Indefinite (QNaN). */
72 gdb_puts (" Real Indefinite (QNaN)", file);
73 else if (fraction[1] & 0x40000000)
74 /* QNaN. */
75 gdb_puts (" QNaN", file);
76 else
77 /* SNaN. */
78 gdb_puts (" SNaN", file);
80 else if (exponent < 0x7fff && exponent > 0x0000 && integer)
81 /* Normal. */
82 print_i387_value (gdbarch, raw, file);
83 else if (exponent == 0x0000)
85 /* Denormal or zero. */
86 print_i387_value (gdbarch, raw, file);
88 if (integer)
89 /* Pseudo-denormal. */
90 gdb_puts (" Pseudo-denormal", file);
91 else if (fraction[0] || fraction[1])
92 /* Denormal. */
93 gdb_puts (" Denormal", file);
95 else
96 /* Unsupported. */
97 gdb_puts (" Unsupported", file);
100 /* Print the status word STATUS. If STATUS_P is false, then STATUS
101 was unavailable. */
103 static void
104 print_i387_status_word (int status_p,
105 unsigned int status, struct ui_file *file)
107 gdb_printf (file, "Status Word: ");
108 if (!status_p)
110 gdb_printf (file, "%s\n", _("<unavailable>"));
111 return;
114 gdb_printf (file, "%s", hex_string_custom (status, 4));
115 gdb_puts (" ", file);
116 gdb_printf (file, " %s", (status & 0x0001) ? "IE" : " ");
117 gdb_printf (file, " %s", (status & 0x0002) ? "DE" : " ");
118 gdb_printf (file, " %s", (status & 0x0004) ? "ZE" : " ");
119 gdb_printf (file, " %s", (status & 0x0008) ? "OE" : " ");
120 gdb_printf (file, " %s", (status & 0x0010) ? "UE" : " ");
121 gdb_printf (file, " %s", (status & 0x0020) ? "PE" : " ");
122 gdb_puts (" ", file);
123 gdb_printf (file, " %s", (status & 0x0080) ? "ES" : " ");
124 gdb_puts (" ", file);
125 gdb_printf (file, " %s", (status & 0x0040) ? "SF" : " ");
126 gdb_puts (" ", file);
127 gdb_printf (file, " %s", (status & 0x0100) ? "C0" : " ");
128 gdb_printf (file, " %s", (status & 0x0200) ? "C1" : " ");
129 gdb_printf (file, " %s", (status & 0x0400) ? "C2" : " ");
130 gdb_printf (file, " %s", (status & 0x4000) ? "C3" : " ");
132 gdb_puts ("\n", file);
134 gdb_printf (file,
135 " TOP: %d\n", ((status >> 11) & 7));
138 /* Print the control word CONTROL. If CONTROL_P is false, then
139 CONTROL was unavailable. */
141 static void
142 print_i387_control_word (int control_p,
143 unsigned int control, struct ui_file *file)
145 gdb_printf (file, "Control Word: ");
146 if (!control_p)
148 gdb_printf (file, "%s\n", _("<unavailable>"));
149 return;
152 gdb_printf (file, "%s", hex_string_custom (control, 4));
153 gdb_puts (" ", file);
154 gdb_printf (file, " %s", (control & 0x0001) ? "IM" : " ");
155 gdb_printf (file, " %s", (control & 0x0002) ? "DM" : " ");
156 gdb_printf (file, " %s", (control & 0x0004) ? "ZM" : " ");
157 gdb_printf (file, " %s", (control & 0x0008) ? "OM" : " ");
158 gdb_printf (file, " %s", (control & 0x0010) ? "UM" : " ");
159 gdb_printf (file, " %s", (control & 0x0020) ? "PM" : " ");
161 gdb_puts ("\n", file);
163 gdb_puts (" PC: ", file);
164 switch ((control >> 8) & 3)
166 case 0:
167 gdb_puts ("Single Precision (24-bits)\n", file);
168 break;
169 case 1:
170 gdb_puts ("Reserved\n", file);
171 break;
172 case 2:
173 gdb_puts ("Double Precision (53-bits)\n", file);
174 break;
175 case 3:
176 gdb_puts ("Extended Precision (64-bits)\n", file);
177 break;
180 gdb_puts (" RC: ", file);
181 switch ((control >> 10) & 3)
183 case 0:
184 gdb_puts ("Round to nearest\n", file);
185 break;
186 case 1:
187 gdb_puts ("Round down\n", file);
188 break;
189 case 2:
190 gdb_puts ("Round up\n", file);
191 break;
192 case 3:
193 gdb_puts ("Round toward zero\n", file);
194 break;
198 /* Print out the i387 floating point state. Note that we ignore FRAME
199 in the code below. That's OK since floating-point registers are
200 never saved on the stack. */
202 void
203 i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
204 const frame_info_ptr &frame, const char *args)
206 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
207 ULONGEST fctrl;
208 int fctrl_p;
209 ULONGEST fstat;
210 int fstat_p;
211 ULONGEST ftag;
212 int ftag_p;
213 ULONGEST fiseg;
214 int fiseg_p;
215 ULONGEST fioff;
216 int fioff_p;
217 ULONGEST foseg;
218 int foseg_p;
219 ULONGEST fooff;
220 int fooff_p;
221 ULONGEST fop;
222 int fop_p;
223 int fpreg;
224 int top;
226 gdb_assert (gdbarch == get_frame_arch (frame));
228 fctrl_p = read_frame_register_unsigned (frame,
229 I387_FCTRL_REGNUM (tdep), &fctrl);
230 fstat_p = read_frame_register_unsigned (frame,
231 I387_FSTAT_REGNUM (tdep), &fstat);
232 ftag_p = read_frame_register_unsigned (frame,
233 I387_FTAG_REGNUM (tdep), &ftag);
234 fiseg_p = read_frame_register_unsigned (frame,
235 I387_FISEG_REGNUM (tdep), &fiseg);
236 fioff_p = read_frame_register_unsigned (frame,
237 I387_FIOFF_REGNUM (tdep), &fioff);
238 foseg_p = read_frame_register_unsigned (frame,
239 I387_FOSEG_REGNUM (tdep), &foseg);
240 fooff_p = read_frame_register_unsigned (frame,
241 I387_FOOFF_REGNUM (tdep), &fooff);
242 fop_p = read_frame_register_unsigned (frame,
243 I387_FOP_REGNUM (tdep), &fop);
245 if (fstat_p)
247 top = ((fstat >> 11) & 7);
249 for (fpreg = 7; fpreg >= 0; fpreg--)
251 struct value *regval;
252 int regnum;
253 int i;
254 int tag = -1;
256 gdb_printf (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg);
258 if (ftag_p)
260 tag = (ftag >> (fpreg * 2)) & 3;
262 switch (tag)
264 case 0:
265 gdb_puts ("Valid ", file);
266 break;
267 case 1:
268 gdb_puts ("Zero ", file);
269 break;
270 case 2:
271 gdb_puts ("Special ", file);
272 break;
273 case 3:
274 gdb_puts ("Empty ", file);
275 break;
278 else
279 gdb_puts ("Unknown ", file);
281 regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep);
282 regval = get_frame_register_value (frame, regnum);
284 if (regval->entirely_available ())
286 const gdb_byte *raw = regval->contents ().data ();
288 gdb_puts ("0x", file);
289 for (i = 9; i >= 0; i--)
290 gdb_printf (file, "%02x", raw[i]);
292 if (tag != -1 && tag != 3)
293 print_i387_ext (gdbarch, raw, file);
295 else
296 gdb_printf (file, "%s", _("<unavailable>"));
298 gdb_puts ("\n", file);
302 gdb_puts ("\n", file);
303 print_i387_status_word (fstat_p, fstat, file);
304 print_i387_control_word (fctrl_p, fctrl, file);
305 gdb_printf (file, "Tag Word: %s\n",
306 ftag_p ? hex_string_custom (ftag, 4) : _("<unavailable>"));
307 gdb_printf (file, "Instruction Pointer: %s:",
308 fiseg_p ? hex_string_custom (fiseg, 2) : _("<unavailable>"));
309 gdb_printf (file, "%s\n",
310 fioff_p ? hex_string_custom (fioff, 8) : _("<unavailable>"));
311 gdb_printf (file, "Operand Pointer: %s:",
312 foseg_p ? hex_string_custom (foseg, 2) : _("<unavailable>"));
313 gdb_printf (file, "%s\n",
314 fooff_p ? hex_string_custom (fooff, 8) : _("<unavailable>"));
315 gdb_printf (file, "Opcode: %s\n",
316 fop_p
317 ? (hex_string_custom (fop ? (fop | 0xd800) : 0, 4))
318 : _("<unavailable>"));
322 /* Return nonzero if a value of type TYPE stored in register REGNUM
323 needs any special handling. */
326 i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
327 struct type *type)
329 if (i386_fp_regnum_p (gdbarch, regnum))
331 /* Floating point registers must be converted unless we are
332 accessing them in their hardware type or TYPE is not float. */
333 if (type == i387_ext_type (gdbarch)
334 || type->code () != TYPE_CODE_FLT)
335 return 0;
336 else
337 return 1;
340 return 0;
343 /* Read a value of type TYPE from register REGNUM in frame FRAME, and
344 return its contents in TO. */
347 i387_register_to_value (const frame_info_ptr &frame, int regnum,
348 struct type *type, gdb_byte *to,
349 int *optimizedp, int *unavailablep)
351 struct gdbarch *gdbarch = get_frame_arch (frame);
352 gdb_byte from[I386_MAX_REGISTER_SIZE];
354 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
356 /* We only support floating-point values. */
357 if (type->code () != TYPE_CODE_FLT)
359 warning (_("Cannot convert floating-point register value "
360 "to non-floating-point type."));
361 *optimizedp = *unavailablep = 0;
362 return 0;
365 /* Convert to TYPE. */
366 auto from_view
367 = gdb::make_array_view (from, register_size (gdbarch, regnum));
368 frame_info_ptr next_frame = get_next_frame_sentinel_okay (frame);
369 if (!get_frame_register_bytes (next_frame, regnum, 0, from_view, optimizedp,
370 unavailablep))
371 return 0;
373 target_float_convert (from, i387_ext_type (gdbarch), to, type);
374 *optimizedp = *unavailablep = 0;
375 return 1;
378 /* Write the contents FROM of a value of type TYPE into register
379 REGNUM in frame FRAME. */
381 void
382 i387_value_to_register (const frame_info_ptr &frame, int regnum,
383 struct type *type, const gdb_byte *from)
385 struct gdbarch *gdbarch = get_frame_arch (frame);
386 gdb_byte to[I386_MAX_REGISTER_SIZE];
388 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
390 /* We only support floating-point values. */
391 if (type->code () != TYPE_CODE_FLT)
393 warning (_("Cannot convert non-floating-point type "
394 "to floating-point register value."));
395 return;
398 /* Convert from TYPE. */
399 struct type *to_type = i387_ext_type (gdbarch);
400 target_float_convert (from, type, to, to_type);
401 auto to_view = gdb::make_array_view (to, to_type->length ());
402 put_frame_register (get_next_frame_sentinel_okay (frame), regnum, to_view);
406 /* Handle FSAVE and FXSAVE formats. */
408 /* At fsave_offset[REGNUM] you'll find the offset to the location in
409 the data structure used by the "fsave" instruction where GDB
410 register REGNUM is stored. */
412 static int fsave_offset[] =
414 28 + 0 * 10, /* %st(0) ... */
415 28 + 1 * 10,
416 28 + 2 * 10,
417 28 + 3 * 10,
418 28 + 4 * 10,
419 28 + 5 * 10,
420 28 + 6 * 10,
421 28 + 7 * 10, /* ... %st(7). */
422 0, /* `fctrl' (16 bits). */
423 4, /* `fstat' (16 bits). */
424 8, /* `ftag' (16 bits). */
425 16, /* `fiseg' (16 bits). */
426 12, /* `fioff'. */
427 24, /* `foseg' (16 bits). */
428 20, /* `fooff'. */
429 18 /* `fop' (bottom 11 bits). */
432 #define FSAVE_ADDR(tdep, fsave, regnum) \
433 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)])
436 /* Fill register REGNUM in REGCACHE with the appropriate value from
437 *FSAVE. This function masks off any of the reserved bits in
438 *FSAVE. */
440 void
441 i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
443 struct gdbarch *gdbarch = regcache->arch ();
444 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
445 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
446 const gdb_byte *regs = (const gdb_byte *) fsave;
447 int i;
449 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
451 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
452 if (regnum == -1 || regnum == i)
454 if (fsave == NULL)
456 regcache->raw_supply (i, NULL);
457 continue;
460 /* Most of the FPU control registers occupy only 16 bits in the
461 fsave area. Give those a special treatment. */
462 if (i >= I387_FCTRL_REGNUM (tdep)
463 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
465 gdb_byte val[4];
467 memcpy (val, FSAVE_ADDR (tdep, regs, i), 2);
468 val[2] = val[3] = 0;
469 if (i == I387_FOP_REGNUM (tdep))
470 val[1] &= ((1 << 3) - 1);
471 regcache->raw_supply (i, val);
473 else
474 regcache->raw_supply (i, FSAVE_ADDR (tdep, regs, i));
477 /* Provide dummy values for the SSE registers. */
478 for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
479 if (regnum == -1 || regnum == i)
480 regcache->raw_supply (i, NULL);
481 if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep))
483 gdb_byte buf[4];
485 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
486 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
490 /* Fill register REGNUM (if it is a floating-point register) in *FSAVE
491 with the value from REGCACHE. If REGNUM is -1, do this for all
492 registers. This function doesn't touch any of the reserved bits in
493 *FSAVE. */
495 void
496 i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
498 gdbarch *arch = regcache->arch ();
499 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
500 gdb_byte *regs = (gdb_byte *) fsave;
501 int i;
503 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
505 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
506 if (regnum == -1 || regnum == i)
508 /* Most of the FPU control registers occupy only 16 bits in
509 the fsave area. Give those a special treatment. */
510 if (i >= I387_FCTRL_REGNUM (tdep)
511 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
513 gdb_byte buf[4];
515 regcache->raw_collect (i, buf);
517 if (i == I387_FOP_REGNUM (tdep))
519 /* The opcode occupies only 11 bits. Make sure we
520 don't touch the other bits. */
521 buf[1] &= ((1 << 3) - 1);
522 buf[1] |= ((FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
524 memcpy (FSAVE_ADDR (tdep, regs, i), buf, 2);
526 else
527 regcache->raw_collect (i, FSAVE_ADDR (tdep, regs, i));
532 /* At fxsave_offset[REGNUM] you'll find the offset to the location in
533 the data structure used by the "fxsave" instruction where GDB
534 register REGNUM is stored. */
536 static int fxsave_offset[] =
538 32, /* %st(0) through ... */
543 112,
544 128,
545 144, /* ... %st(7) (80 bits each). */
546 0, /* `fctrl' (16 bits). */
547 2, /* `fstat' (16 bits). */
548 4, /* `ftag' (16 bits). */
549 12, /* `fiseg' (16 bits). */
550 8, /* `fioff'. */
551 20, /* `foseg' (16 bits). */
552 16, /* `fooff'. */
553 6, /* `fop' (bottom 11 bits). */
554 160 + 0 * 16, /* %xmm0 through ... */
555 160 + 1 * 16,
556 160 + 2 * 16,
557 160 + 3 * 16,
558 160 + 4 * 16,
559 160 + 5 * 16,
560 160 + 6 * 16,
561 160 + 7 * 16,
562 160 + 8 * 16,
563 160 + 9 * 16,
564 160 + 10 * 16,
565 160 + 11 * 16,
566 160 + 12 * 16,
567 160 + 13 * 16,
568 160 + 14 * 16,
569 160 + 15 * 16, /* ... %xmm15 (128 bits each). */
572 #define FXSAVE_ADDR(tdep, fxsave, regnum) \
573 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
575 /* We made an unfortunate choice in putting %mxcsr after the SSE
576 registers %xmm0-%xmm7 instead of before, since it makes supporting
577 the registers %xmm8-%xmm15 on AMD64 a bit involved. Therefore we
578 don't include the offset for %mxcsr here above. */
580 #define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24)
582 static int i387_tag (const gdb_byte *raw);
585 /* Fill register REGNUM in REGCACHE with the appropriate
586 floating-point or SSE register value from *FXSAVE. This function
587 masks off any of the reserved bits in *FXSAVE. */
589 void
590 i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
592 gdbarch *arch = regcache->arch ();
593 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
594 const gdb_byte *regs = (const gdb_byte *) fxsave;
595 int i;
597 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
598 gdb_assert (tdep->num_xmm_regs > 0);
600 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
601 if (regnum == -1 || regnum == i)
603 if (regs == NULL)
605 regcache->raw_supply (i, NULL);
606 continue;
609 /* Most of the FPU control registers occupy only 16 bits in
610 the fxsave area. Give those a special treatment. */
611 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
612 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
614 gdb_byte val[4];
616 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
617 val[2] = val[3] = 0;
618 if (i == I387_FOP_REGNUM (tdep))
619 val[1] &= ((1 << 3) - 1);
620 else if (i== I387_FTAG_REGNUM (tdep))
622 /* The fxsave area contains a simplified version of
623 the tag word. We have to look at the actual 80-bit
624 FP data to recreate the traditional i387 tag word. */
626 unsigned long ftag = 0;
627 int fpreg;
628 int top;
630 top = ((FXSAVE_ADDR (tdep, regs,
631 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
632 top &= 0x7;
634 for (fpreg = 7; fpreg >= 0; fpreg--)
636 int tag;
638 if (val[0] & (1 << fpreg))
640 int thisreg = (fpreg + 8 - top) % 8
641 + I387_ST0_REGNUM (tdep);
642 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
644 else
645 tag = 3; /* Empty */
647 ftag |= tag << (2 * fpreg);
649 val[0] = ftag & 0xff;
650 val[1] = (ftag >> 8) & 0xff;
652 regcache->raw_supply (i, val);
654 else
655 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
658 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
660 if (regs == NULL)
661 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), NULL);
662 else
663 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
664 FXSAVE_MXCSR_ADDR (regs));
668 /* Fill register REGNUM (if it is a floating-point or SSE register) in
669 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
670 all registers. This function doesn't touch any of the reserved
671 bits in *FXSAVE. */
673 void
674 i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
676 gdbarch *arch = regcache->arch ();
677 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
678 gdb_byte *regs = (gdb_byte *) fxsave;
679 int i;
681 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
682 gdb_assert (tdep->num_xmm_regs > 0);
684 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
685 if (regnum == -1 || regnum == i)
687 /* Most of the FPU control registers occupy only 16 bits in
688 the fxsave area. Give those a special treatment. */
689 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
690 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
692 gdb_byte buf[4];
694 regcache->raw_collect (i, buf);
696 if (i == I387_FOP_REGNUM (tdep))
698 /* The opcode occupies only 11 bits. Make sure we
699 don't touch the other bits. */
700 buf[1] &= ((1 << 3) - 1);
701 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
703 else if (i == I387_FTAG_REGNUM (tdep))
705 /* Converting back is much easier. */
707 unsigned short ftag;
708 int fpreg;
710 ftag = (buf[1] << 8) | buf[0];
711 buf[0] = 0;
712 buf[1] = 0;
714 for (fpreg = 7; fpreg >= 0; fpreg--)
716 int tag = (ftag >> (fpreg * 2)) & 3;
718 if (tag != 3)
719 buf[0] |= (1 << fpreg);
722 memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
724 else
725 regcache->raw_collect (i, FXSAVE_ADDR (tdep, regs, i));
728 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
729 regcache->raw_collect (I387_MXCSR_REGNUM (tdep),
730 FXSAVE_MXCSR_ADDR (regs));
733 /* `xstate_bv' is at byte offset 512. */
734 #define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
736 /* At xsave_avxh_offset[REGNUM] you'll find the relative offset within
737 the AVX region of the XSAVE extended state where the upper 128bits
738 of GDB register YMM0 + REGNUM is stored. */
740 static int xsave_avxh_offset[] =
742 0 * 16, /* Upper 128bit of %ymm0 through ... */
743 1 * 16,
744 2 * 16,
745 3 * 16,
746 4 * 16,
747 5 * 16,
748 6 * 16,
749 7 * 16,
750 8 * 16,
751 9 * 16,
752 10 * 16,
753 11 * 16,
754 12 * 16,
755 13 * 16,
756 14 * 16,
757 15 * 16 /* Upper 128bit of ... %ymm15 (128 bits each). */
760 #define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
761 (xsave + (tdep)->xsave_layout.avx_offset \
762 + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
764 /* At xsave_ymm_avx512_offset[REGNUM] you'll find the relative offset
765 within the ZMM region of the XSAVE extended state where the second
766 128bits of GDB register YMM16 + REGNUM is stored. */
768 static int xsave_ymm_avx512_offset[] =
770 16 + 0 * 64, /* %ymm16 through... */
771 16 + 1 * 64,
772 16 + 2 * 64,
773 16 + 3 * 64,
774 16 + 4 * 64,
775 16 + 5 * 64,
776 16 + 6 * 64,
777 16 + 7 * 64,
778 16 + 8 * 64,
779 16 + 9 * 64,
780 16 + 10 * 64,
781 16 + 11 * 64,
782 16 + 12 * 64,
783 16 + 13 * 64,
784 16 + 14 * 64,
785 16 + 15 * 64 /* ... %ymm31 (128 bits each). */
788 #define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum) \
789 (xsave + (tdep)->xsave_layout.zmm_offset \
790 + xsave_ymm_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)])
792 /* At xsave_xmm_avx512_offset[REGNUM] you'll find the relative offset
793 within the ZMM region of the XSAVE extended state where the first
794 128bits of GDB register XMM16 + REGNUM is stored. */
796 static int xsave_xmm_avx512_offset[] =
798 0 * 64, /* %xmm16 through... */
799 1 * 64,
800 2 * 64,
801 3 * 64,
802 4 * 64,
803 5 * 64,
804 6 * 64,
805 7 * 64,
806 8 * 64,
807 9 * 64,
808 10 * 64,
809 11 * 64,
810 12 * 64,
811 13 * 64,
812 14 * 64,
813 15 * 64 /* ... %xmm31 (128 bits each). */
816 #define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum) \
817 (xsave + (tdep)->xsave_layout.zmm_offset \
818 + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)])
820 /* At xsave_bndregs_offset[REGNUM] you'll find the relative offset
821 within the BNDREGS region of the XSAVE extended state where the GDB
822 register BND0R + REGNUM is stored. */
824 static int xsave_bndregs_offset[] = {
825 0 * 16, /* bnd0r...bnd3r registers. */
826 1 * 16,
827 2 * 16,
828 3 * 16
831 #define XSAVE_BNDREGS_ADDR(tdep, xsave, regnum) \
832 (xsave + (tdep)->xsave_layout.bndregs_offset \
833 + xsave_bndregs_offset[regnum - I387_BND0R_REGNUM (tdep)])
835 static int xsave_bndcfg_offset[] = {
836 0 * 8, /* bndcfg ... bndstatus. */
837 1 * 8,
840 #define XSAVE_BNDCFG_ADDR(tdep, xsave, regnum) \
841 (xsave + (tdep)->xsave_layout.bndcfg_offset \
842 + xsave_bndcfg_offset[regnum - I387_BNDCFGU_REGNUM (tdep)])
844 /* At xsave_avx512_k_offset[REGNUM] you'll find the relative offset
845 within the K region of the XSAVE extended state where the AVX512
846 opmask register K0 + REGNUM is stored. */
848 static int xsave_avx512_k_offset[] =
850 0 * 8, /* %k0 through... */
851 1 * 8,
852 2 * 8,
853 3 * 8,
854 4 * 8,
855 5 * 8,
856 6 * 8,
857 7 * 8 /* %k7 (64 bits each). */
860 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
861 (xsave + (tdep)->xsave_layout.k_offset \
862 + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
865 /* At xsave_avx512_zmm0_h_offset[REGNUM] you find the relative offset
866 within the ZMM_H region of the XSAVE extended state where the upper
867 256bits of the GDB register ZMM0 + REGNUM is stored. */
869 static int xsave_avx512_zmm0_h_offset[] =
871 0 * 32, /* Upper 256bit of %zmmh0 through... */
872 1 * 32,
873 2 * 32,
874 3 * 32,
875 4 * 32,
876 5 * 32,
877 6 * 32,
878 7 * 32,
879 8 * 32,
880 9 * 32,
881 10 * 32,
882 11 * 32,
883 12 * 32,
884 13 * 32,
885 14 * 32,
886 15 * 32 /* Upper 256bit of... %zmmh15 (256 bits each). */
889 #define XSAVE_AVX512_ZMM0_H_ADDR(tdep, xsave, regnum) \
890 (xsave + (tdep)->xsave_layout.zmm_h_offset \
891 + xsave_avx512_zmm0_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
893 /* At xsave_avx512_zmm16_h_offset[REGNUM] you find the relative offset
894 within the ZMM_H region of the XSAVE extended state where the upper
895 256bits of the GDB register ZMM16 + REGNUM is stored. */
897 static int xsave_avx512_zmm16_h_offset[] =
899 32 + 0 * 64, /* Upper 256bit of... %zmmh16 (256 bits each). */
900 32 + 1 * 64,
901 32 + 2 * 64,
902 32 + 3 * 64,
903 32 + 4 * 64,
904 32 + 5 * 64,
905 32 + 6 * 64,
906 32 + 7 * 64,
907 32 + 8 * 64,
908 32 + 9 * 64,
909 32 + 10 * 64,
910 32 + 11 * 64,
911 32 + 12 * 64,
912 32 + 13 * 64,
913 32 + 14 * 64,
914 32 + 15 * 64 /* Upper 256bit of... %zmmh31 (256 bits each). */
917 #define XSAVE_AVX512_ZMM16_H_ADDR(tdep, xsave, regnum) \
918 (xsave + (tdep)->xsave_layout.zmm_offset \
919 + xsave_avx512_zmm16_h_offset[regnum - I387_ZMM16H_REGNUM (tdep)])
921 /* At xsave_pkeys_offset[REGNUM] you'll find the relative offset
922 within the PKEYS region of the XSAVE extended state where the PKRU
923 register is stored. */
925 static int xsave_pkeys_offset[] =
927 0 * 8 /* %pkru (64 bits in XSTATE, 32-bit actually used by
928 instructions and applications). */
931 #define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
932 (xsave + (tdep)->xsave_layout.pkru_offset \
933 + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
936 /* See i387-tdep.h. */
938 bool
939 i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size,
940 x86_xsave_layout &layout)
942 if (HAS_PKRU (xcr0) && xsave_size == 2696)
944 /* Intel CPUs supporting PKRU. */
945 layout.avx_offset = 576;
946 layout.bndregs_offset = 960;
947 layout.bndcfg_offset = 1024;
948 layout.k_offset = 1088;
949 layout.zmm_h_offset = 1152;
950 layout.zmm_offset = 1664;
951 layout.pkru_offset = 2688;
953 else if (HAS_PKRU (xcr0) && xsave_size == 2440)
955 /* AMD CPUs supporting PKRU. */
956 layout.avx_offset = 576;
957 layout.k_offset = 832;
958 layout.zmm_h_offset = 896;
959 layout.zmm_offset = 1408;
960 layout.pkru_offset = 2432;
962 else if (HAS_AVX512 (xcr0) && xsave_size == 2688)
964 /* Intel CPUs supporting AVX512. */
965 layout.avx_offset = 576;
966 layout.bndregs_offset = 960;
967 layout.bndcfg_offset = 1024;
968 layout.k_offset = 1088;
969 layout.zmm_h_offset = 1152;
970 layout.zmm_offset = 1664;
972 else if (HAS_MPX (xcr0) && xsave_size == 1088)
974 /* Intel CPUs supporting MPX. */
975 layout.avx_offset = 576;
976 layout.bndregs_offset = 960;
977 layout.bndcfg_offset = 1024;
979 else if (HAS_AVX (xcr0) && xsave_size == 832)
981 /* Intel and AMD CPUs supporting AVX. */
982 layout.avx_offset = 576;
984 else
985 return false;
987 layout.sizeof_xsave = xsave_size;
988 return true;
991 /* See i387-tdep.h. */
993 x86_xsave_layout
994 i387_fallback_xsave_layout (uint64_t xcr0)
996 x86_xsave_layout layout;
998 if (HAS_PKRU (xcr0))
1000 /* Intel CPUs supporting PKRU. */
1001 layout.avx_offset = 576;
1002 layout.bndregs_offset = 960;
1003 layout.bndcfg_offset = 1024;
1004 layout.k_offset = 1088;
1005 layout.zmm_h_offset = 1152;
1006 layout.zmm_offset = 1664;
1007 layout.pkru_offset = 2688;
1008 layout.sizeof_xsave = 2696;
1010 else if (HAS_AVX512 (xcr0))
1012 /* Intel CPUs supporting AVX512. */
1013 layout.avx_offset = 576;
1014 layout.bndregs_offset = 960;
1015 layout.bndcfg_offset = 1024;
1016 layout.k_offset = 1088;
1017 layout.zmm_h_offset = 1152;
1018 layout.zmm_offset = 1664;
1019 layout.sizeof_xsave = 2688;
1021 else if (HAS_MPX (xcr0))
1023 /* Intel CPUs supporting MPX. */
1024 layout.avx_offset = 576;
1025 layout.bndregs_offset = 960;
1026 layout.bndcfg_offset = 1024;
1027 layout.sizeof_xsave = 1088;
1029 else if (HAS_AVX (xcr0))
1031 /* Intel and AMD CPUs supporting AVX. */
1032 layout.avx_offset = 576;
1033 layout.sizeof_xsave = 832;
1036 return layout;
1039 /* Extract from XSAVE a bitset of the features that are available on the
1040 target, but which have not yet been enabled. */
1042 ULONGEST
1043 i387_xsave_get_clear_bv (struct gdbarch *gdbarch, const void *xsave)
1045 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1046 const gdb_byte *regs = (const gdb_byte *) xsave;
1047 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1049 /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */
1050 ULONGEST xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1051 8, byte_order);
1053 /* Clear part in vector registers if its bit in xstat_bv is zero. */
1054 ULONGEST clear_bv = (~(xstate_bv)) & tdep->xcr0;
1056 return clear_bv;
1059 /* Similar to i387_supply_fxsave, but use XSAVE extended state. */
1061 void
1062 i387_supply_xsave (struct regcache *regcache, int regnum,
1063 const void *xsave)
1065 struct gdbarch *gdbarch = regcache->arch ();
1066 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1067 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1068 const gdb_byte *regs = (const gdb_byte *) xsave;
1069 int i;
1070 /* In 64-bit mode the split between "low" and "high" ZMM registers is at
1071 ZMM16. Outside of 64-bit mode there are no "high" ZMM registers at all.
1072 Precalculate the number to be used for the split point, with the all
1073 registers in the "low" portion outside of 64-bit mode. */
1074 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1075 + std::min (tdep->num_zmm_regs, 16);
1076 ULONGEST clear_bv;
1077 static const gdb_byte zero[I386_MAX_REGISTER_SIZE] = { 0 };
1078 enum
1080 none = 0x0,
1081 x87 = 0x1,
1082 sse = 0x2,
1083 avxh = 0x4,
1084 bndregs = 0x8,
1085 bndcfg = 0x10,
1086 avx512_k = 0x20,
1087 avx512_zmm0_h = 0x40,
1088 avx512_zmm16_h = 0x80,
1089 avx512_ymmh_avx512 = 0x100,
1090 avx512_xmm_avx512 = 0x200,
1091 pkeys = 0x400,
1092 all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h
1093 | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
1094 } regclass;
1096 gdb_assert (regs != NULL);
1097 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1098 gdb_assert (tdep->num_xmm_regs > 0);
1100 if (regnum == -1)
1101 regclass = all;
1102 else if (regnum >= I387_PKRU_REGNUM (tdep)
1103 && regnum < I387_PKEYSEND_REGNUM (tdep))
1104 regclass = pkeys;
1105 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
1106 && regnum < I387_ZMM16H_REGNUM (tdep))
1107 regclass = avx512_zmm0_h;
1108 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
1109 && regnum < I387_ZMMENDH_REGNUM (tdep))
1110 regclass = avx512_zmm16_h;
1111 else if (regnum >= I387_K0_REGNUM (tdep)
1112 && regnum < I387_KEND_REGNUM (tdep))
1113 regclass = avx512_k;
1114 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1115 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1116 regclass = avx512_ymmh_avx512;
1117 else if (regnum >= I387_XMM16_REGNUM (tdep)
1118 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1119 regclass = avx512_xmm_avx512;
1120 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1121 && regnum < I387_YMMENDH_REGNUM (tdep))
1122 regclass = avxh;
1123 else if (regnum >= I387_BND0R_REGNUM (tdep)
1124 && regnum < I387_BNDCFGU_REGNUM (tdep))
1125 regclass = bndregs;
1126 else if (regnum >= I387_BNDCFGU_REGNUM (tdep)
1127 && regnum < I387_MPXEND_REGNUM (tdep))
1128 regclass = bndcfg;
1129 else if (regnum >= I387_XMM0_REGNUM (tdep)
1130 && regnum < I387_MXCSR_REGNUM (tdep))
1131 regclass = sse;
1132 else if (regnum >= I387_ST0_REGNUM (tdep)
1133 && regnum < I387_FCTRL_REGNUM (tdep))
1134 regclass = x87;
1135 else
1136 regclass = none;
1138 clear_bv = i387_xsave_get_clear_bv (gdbarch, xsave);
1140 /* With the delayed xsave mechanism, in between the program
1141 starting, and the program accessing the vector registers for the
1142 first time, the register's values are invalid. The kernel
1143 initializes register states to zero when they are set the first
1144 time in a program. This means that from the user-space programs'
1145 perspective, it's the same as if the registers have always been
1146 zero from the start of the program. Therefore, the debugger
1147 should provide the same illusion to the user. */
1149 switch (regclass)
1151 case none:
1152 break;
1154 case pkeys:
1155 if ((clear_bv & X86_XSTATE_PKRU))
1156 regcache->raw_supply (regnum, zero);
1157 else
1158 regcache->raw_supply (regnum, XSAVE_PKEYS_ADDR (tdep, regs, regnum));
1159 return;
1161 case avx512_zmm0_h:
1162 if ((clear_bv & X86_XSTATE_ZMM_H))
1163 regcache->raw_supply (regnum, zero);
1164 else
1165 regcache->raw_supply (regnum,
1166 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum));
1167 return;
1169 case avx512_zmm16_h:
1170 if ((clear_bv & X86_XSTATE_ZMM))
1171 regcache->raw_supply (regnum, zero);
1172 else
1173 regcache->raw_supply (regnum,
1174 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum));
1175 return;
1177 case avx512_k:
1178 if ((clear_bv & X86_XSTATE_K))
1179 regcache->raw_supply (regnum, zero);
1180 else
1181 regcache->raw_supply (regnum, XSAVE_AVX512_K_ADDR (tdep, regs, regnum));
1182 return;
1184 case avx512_ymmh_avx512:
1185 if ((clear_bv & X86_XSTATE_ZMM))
1186 regcache->raw_supply (regnum, zero);
1187 else
1188 regcache->raw_supply (regnum,
1189 XSAVE_YMM_AVX512_ADDR (tdep, regs, regnum));
1190 return;
1192 case avx512_xmm_avx512:
1193 if ((clear_bv & X86_XSTATE_ZMM))
1194 regcache->raw_supply (regnum, zero);
1195 else
1196 regcache->raw_supply (regnum,
1197 XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum));
1198 return;
1200 case avxh:
1201 if ((clear_bv & X86_XSTATE_AVX))
1202 regcache->raw_supply (regnum, zero);
1203 else
1204 regcache->raw_supply (regnum, XSAVE_AVXH_ADDR (tdep, regs, regnum));
1205 return;
1207 case bndcfg:
1208 if ((clear_bv & X86_XSTATE_BNDCFG))
1209 regcache->raw_supply (regnum, zero);
1210 else
1211 regcache->raw_supply (regnum, XSAVE_BNDCFG_ADDR (tdep, regs, regnum));
1212 return;
1214 case bndregs:
1215 if ((clear_bv & X86_XSTATE_BNDREGS))
1216 regcache->raw_supply (regnum, zero);
1217 else
1218 regcache->raw_supply (regnum, XSAVE_BNDREGS_ADDR (tdep, regs, regnum));
1219 return;
1221 case sse:
1222 if ((clear_bv & X86_XSTATE_SSE))
1223 regcache->raw_supply (regnum, zero);
1224 else
1225 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
1226 return;
1228 case x87:
1229 if ((clear_bv & X86_XSTATE_X87))
1230 regcache->raw_supply (regnum, zero);
1231 else
1232 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
1233 return;
1235 case all:
1236 /* Handle PKEYS registers. */
1237 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1239 if ((clear_bv & X86_XSTATE_PKRU))
1241 for (i = I387_PKRU_REGNUM (tdep);
1242 i < I387_PKEYSEND_REGNUM (tdep);
1243 i++)
1244 regcache->raw_supply (i, zero);
1246 else
1248 for (i = I387_PKRU_REGNUM (tdep);
1249 i < I387_PKEYSEND_REGNUM (tdep);
1250 i++)
1251 regcache->raw_supply (i, XSAVE_PKEYS_ADDR (tdep, regs, i));
1255 /* Handle the upper halves of the low 8/16 ZMM registers. */
1256 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
1258 if ((clear_bv & X86_XSTATE_ZMM_H))
1260 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1261 regcache->raw_supply (i, zero);
1263 else
1265 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1266 regcache->raw_supply (i,
1267 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i));
1271 /* Handle AVX512 OpMask registers. */
1272 if ((tdep->xcr0 & X86_XSTATE_K))
1274 if ((clear_bv & X86_XSTATE_K))
1276 for (i = I387_K0_REGNUM (tdep);
1277 i < I387_KEND_REGNUM (tdep);
1278 i++)
1279 regcache->raw_supply (i, zero);
1281 else
1283 for (i = I387_K0_REGNUM (tdep);
1284 i < I387_KEND_REGNUM (tdep);
1285 i++)
1286 regcache->raw_supply (i, XSAVE_AVX512_K_ADDR (tdep, regs, i));
1290 /* Handle the upper 16 ZMM/YMM/XMM registers (if any). */
1291 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1293 if ((clear_bv & X86_XSTATE_ZMM))
1295 for (i = I387_ZMM16H_REGNUM (tdep);
1296 i < I387_ZMMENDH_REGNUM (tdep); i++)
1297 regcache->raw_supply (i, zero);
1298 for (i = I387_YMM16H_REGNUM (tdep);
1299 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1300 i++)
1301 regcache->raw_supply (i, zero);
1302 for (i = I387_XMM16_REGNUM (tdep);
1303 i < I387_XMM_AVX512_END_REGNUM (tdep);
1304 i++)
1305 regcache->raw_supply (i, zero);
1307 else
1309 for (i = I387_ZMM16H_REGNUM (tdep);
1310 i < I387_ZMMENDH_REGNUM (tdep); i++)
1311 regcache->raw_supply (i,
1312 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i));
1313 for (i = I387_YMM16H_REGNUM (tdep);
1314 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1315 i++)
1316 regcache->raw_supply (i, XSAVE_YMM_AVX512_ADDR (tdep, regs, i));
1317 for (i = I387_XMM16_REGNUM (tdep);
1318 i < I387_XMM_AVX512_END_REGNUM (tdep);
1319 i++)
1320 regcache->raw_supply (i, XSAVE_XMM_AVX512_ADDR (tdep, regs, i));
1323 /* Handle the upper YMM registers. */
1324 if ((tdep->xcr0 & X86_XSTATE_AVX))
1326 if ((clear_bv & X86_XSTATE_AVX))
1328 for (i = I387_YMM0H_REGNUM (tdep);
1329 i < I387_YMMENDH_REGNUM (tdep);
1330 i++)
1331 regcache->raw_supply (i, zero);
1333 else
1335 for (i = I387_YMM0H_REGNUM (tdep);
1336 i < I387_YMMENDH_REGNUM (tdep);
1337 i++)
1338 regcache->raw_supply (i, XSAVE_AVXH_ADDR (tdep, regs, i));
1342 /* Handle the MPX registers. */
1343 if ((tdep->xcr0 & X86_XSTATE_BNDREGS))
1345 if (clear_bv & X86_XSTATE_BNDREGS)
1347 for (i = I387_BND0R_REGNUM (tdep);
1348 i < I387_BNDCFGU_REGNUM (tdep); i++)
1349 regcache->raw_supply (i, zero);
1351 else
1353 for (i = I387_BND0R_REGNUM (tdep);
1354 i < I387_BNDCFGU_REGNUM (tdep); i++)
1355 regcache->raw_supply (i, XSAVE_BNDREGS_ADDR (tdep, regs, i));
1359 /* Handle the MPX registers. */
1360 if ((tdep->xcr0 & X86_XSTATE_BNDCFG))
1362 if (clear_bv & X86_XSTATE_BNDCFG)
1364 for (i = I387_BNDCFGU_REGNUM (tdep);
1365 i < I387_MPXEND_REGNUM (tdep); i++)
1366 regcache->raw_supply (i, zero);
1368 else
1370 for (i = I387_BNDCFGU_REGNUM (tdep);
1371 i < I387_MPXEND_REGNUM (tdep); i++)
1372 regcache->raw_supply (i, XSAVE_BNDCFG_ADDR (tdep, regs, i));
1376 /* Handle the XMM registers. */
1377 if ((tdep->xcr0 & X86_XSTATE_SSE))
1379 if ((clear_bv & X86_XSTATE_SSE))
1381 for (i = I387_XMM0_REGNUM (tdep);
1382 i < I387_MXCSR_REGNUM (tdep);
1383 i++)
1384 regcache->raw_supply (i, zero);
1386 else
1388 for (i = I387_XMM0_REGNUM (tdep);
1389 i < I387_MXCSR_REGNUM (tdep); i++)
1390 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1394 /* Handle the x87 registers. */
1395 if ((tdep->xcr0 & X86_XSTATE_X87))
1397 if ((clear_bv & X86_XSTATE_X87))
1399 for (i = I387_ST0_REGNUM (tdep);
1400 i < I387_FCTRL_REGNUM (tdep);
1401 i++)
1402 regcache->raw_supply (i, zero);
1404 else
1406 for (i = I387_ST0_REGNUM (tdep);
1407 i < I387_FCTRL_REGNUM (tdep);
1408 i++)
1409 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1412 break;
1415 /* Only handle x87 control registers. */
1416 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
1417 if (regnum == -1 || regnum == i)
1419 if (clear_bv & X86_XSTATE_X87)
1421 if (i == I387_FCTRL_REGNUM (tdep))
1423 gdb_byte buf[4];
1425 store_unsigned_integer (buf, 4, byte_order,
1426 I387_FCTRL_INIT_VAL);
1427 regcache->raw_supply (i, buf);
1429 else if (i == I387_FTAG_REGNUM (tdep))
1431 gdb_byte buf[4];
1433 store_unsigned_integer (buf, 4, byte_order, 0xffff);
1434 regcache->raw_supply (i, buf);
1436 else
1437 regcache->raw_supply (i, zero);
1439 /* Most of the FPU control registers occupy only 16 bits in
1440 the xsave extended state. Give those a special treatment. */
1441 else if (i != I387_FIOFF_REGNUM (tdep)
1442 && i != I387_FOOFF_REGNUM (tdep))
1444 gdb_byte val[4];
1446 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
1447 val[2] = val[3] = 0;
1448 if (i == I387_FOP_REGNUM (tdep))
1449 val[1] &= ((1 << 3) - 1);
1450 else if (i == I387_FTAG_REGNUM (tdep))
1452 /* The fxsave area contains a simplified version of
1453 the tag word. We have to look at the actual 80-bit
1454 FP data to recreate the traditional i387 tag word. */
1456 unsigned long ftag = 0;
1457 int fpreg;
1458 int top;
1460 top = ((FXSAVE_ADDR (tdep, regs,
1461 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
1462 top &= 0x7;
1464 for (fpreg = 7; fpreg >= 0; fpreg--)
1466 int tag;
1468 if (val[0] & (1 << fpreg))
1470 int thisreg = (fpreg + 8 - top) % 8
1471 + I387_ST0_REGNUM (tdep);
1472 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
1474 else
1475 tag = 3; /* Empty */
1477 ftag |= tag << (2 * fpreg);
1479 val[0] = ftag & 0xff;
1480 val[1] = (ftag >> 8) & 0xff;
1482 regcache->raw_supply (i, val);
1484 else
1485 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1488 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
1490 /* The MXCSR register is placed into the xsave buffer if either the
1491 AVX or SSE features are enabled. */
1492 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1493 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
1495 gdb_byte buf[4];
1497 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
1498 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
1500 else
1501 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
1502 FXSAVE_MXCSR_ADDR (regs));
1506 /* Similar to i387_collect_fxsave, but use XSAVE extended state. */
1508 void
1509 i387_collect_xsave (const struct regcache *regcache, int regnum,
1510 void *xsave, int gcore)
1512 struct gdbarch *gdbarch = regcache->arch ();
1513 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1514 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1515 gdb_byte *p, *regs = (gdb_byte *) xsave;
1516 gdb_byte raw[I386_MAX_REGISTER_SIZE];
1517 ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
1518 unsigned int i;
1519 /* See the comment in i387_supply_xsave(). */
1520 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1521 + std::min (tdep->num_zmm_regs, 16);
1522 enum
1524 x87_ctrl_or_mxcsr = 0x1,
1525 x87 = 0x2,
1526 sse = 0x4,
1527 avxh = 0x8,
1528 bndregs = 0x10,
1529 bndcfg = 0x20,
1530 avx512_k = 0x40,
1531 avx512_zmm0_h = 0x80,
1532 avx512_zmm16_h = 0x100,
1533 avx512_ymmh_avx512 = 0x200,
1534 avx512_xmm_avx512 = 0x400,
1535 pkeys = 0x800,
1536 all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h
1537 | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
1538 } regclass;
1540 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1541 gdb_assert (tdep->num_xmm_regs > 0);
1543 if (regnum == -1)
1544 regclass = all;
1545 else if (regnum >= I387_PKRU_REGNUM (tdep)
1546 && regnum < I387_PKEYSEND_REGNUM (tdep))
1547 regclass = pkeys;
1548 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
1549 && regnum < I387_ZMM16H_REGNUM (tdep))
1550 regclass = avx512_zmm0_h;
1551 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
1552 && regnum < I387_ZMMENDH_REGNUM (tdep))
1553 regclass = avx512_zmm16_h;
1554 else if (regnum >= I387_K0_REGNUM (tdep)
1555 && regnum < I387_KEND_REGNUM (tdep))
1556 regclass = avx512_k;
1557 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1558 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1559 regclass = avx512_ymmh_avx512;
1560 else if (regnum >= I387_XMM16_REGNUM (tdep)
1561 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1562 regclass = avx512_xmm_avx512;
1563 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1564 && regnum < I387_YMMENDH_REGNUM (tdep))
1565 regclass = avxh;
1566 else if (regnum >= I387_BND0R_REGNUM (tdep)
1567 && regnum < I387_BNDCFGU_REGNUM (tdep))
1568 regclass = bndregs;
1569 else if (regnum >= I387_BNDCFGU_REGNUM (tdep)
1570 && regnum < I387_MPXEND_REGNUM (tdep))
1571 regclass = bndcfg;
1572 else if (regnum >= I387_XMM0_REGNUM (tdep)
1573 && regnum < I387_MXCSR_REGNUM (tdep))
1574 regclass = sse;
1575 else if (regnum >= I387_ST0_REGNUM (tdep)
1576 && regnum < I387_FCTRL_REGNUM (tdep))
1577 regclass = x87;
1578 else if ((regnum >= I387_FCTRL_REGNUM (tdep)
1579 && regnum < I387_XMM0_REGNUM (tdep))
1580 || regnum == I387_MXCSR_REGNUM (tdep))
1581 regclass = x87_ctrl_or_mxcsr;
1582 else
1583 internal_error (_("invalid i387 regnum %d"), regnum);
1585 if (gcore)
1587 /* Clear XSAVE extended state. */
1588 memset (regs, 0, tdep->xsave_layout.sizeof_xsave);
1590 /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
1591 if (tdep->xsave_xcr0_offset != -1)
1592 memcpy (regs + tdep->xsave_xcr0_offset, &tdep->xcr0, 8);
1593 memcpy (XSAVE_XSTATE_BV_ADDR (regs), &tdep->xcr0, 8);
1596 /* The supported bits in `xstat_bv' are 8 bytes. */
1597 initial_xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1598 8, byte_order);
1599 clear_bv = (~(initial_xstate_bv)) & tdep->xcr0;
1601 /* The XSAVE buffer was filled lazily by the kernel. Only those
1602 features that are enabled were written into the buffer, disabled
1603 features left the buffer uninitialised. In order to identify if any
1604 registers have changed we will be comparing the register cache
1605 version to the version in the XSAVE buffer, it is important then that
1606 at this point we initialise to the default values any features in
1607 XSAVE that are not yet initialised.
1609 This could be made more efficient, we know which features (from
1610 REGNUM) we will be potentially updating, and could limit ourselves to
1611 only clearing that feature. However, the extra complexity does not
1612 seem justified at this point. */
1613 if (clear_bv)
1615 if ((clear_bv & X86_XSTATE_PKRU))
1616 for (i = I387_PKRU_REGNUM (tdep);
1617 i < I387_PKEYSEND_REGNUM (tdep); i++)
1618 memset (XSAVE_PKEYS_ADDR (tdep, regs, i), 0, 4);
1620 if ((clear_bv & X86_XSTATE_BNDREGS))
1621 for (i = I387_BND0R_REGNUM (tdep);
1622 i < I387_BNDCFGU_REGNUM (tdep); i++)
1623 memset (XSAVE_BNDREGS_ADDR (tdep, regs, i), 0, 16);
1625 if ((clear_bv & X86_XSTATE_BNDCFG))
1626 for (i = I387_BNDCFGU_REGNUM (tdep);
1627 i < I387_MPXEND_REGNUM (tdep); i++)
1628 memset (XSAVE_BNDCFG_ADDR (tdep, regs, i), 0, 8);
1630 if ((clear_bv & X86_XSTATE_ZMM_H))
1631 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1632 memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i), 0, 32);
1634 if ((clear_bv & X86_XSTATE_K))
1635 for (i = I387_K0_REGNUM (tdep);
1636 i < I387_KEND_REGNUM (tdep); i++)
1637 memset (XSAVE_AVX512_K_ADDR (tdep, regs, i), 0, 8);
1639 if ((clear_bv & X86_XSTATE_ZMM))
1641 for (i = I387_ZMM16H_REGNUM (tdep); i < I387_ZMMENDH_REGNUM (tdep);
1642 i++)
1643 memset (XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i), 0, 32);
1644 for (i = I387_YMM16H_REGNUM (tdep);
1645 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
1646 memset (XSAVE_YMM_AVX512_ADDR (tdep, regs, i), 0, 16);
1647 for (i = I387_XMM16_REGNUM (tdep);
1648 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1649 memset (XSAVE_XMM_AVX512_ADDR (tdep, regs, i), 0, 16);
1652 if ((clear_bv & X86_XSTATE_AVX))
1653 for (i = I387_YMM0H_REGNUM (tdep);
1654 i < I387_YMMENDH_REGNUM (tdep); i++)
1655 memset (XSAVE_AVXH_ADDR (tdep, regs, i), 0, 16);
1657 if ((clear_bv & X86_XSTATE_SSE))
1658 for (i = I387_XMM0_REGNUM (tdep);
1659 i < I387_MXCSR_REGNUM (tdep); i++)
1660 memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
1662 /* The mxcsr register is written into the xsave buffer if either AVX
1663 or SSE is enabled, so only clear it if both of those features
1664 require clearing. */
1665 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1666 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
1667 store_unsigned_integer (FXSAVE_MXCSR_ADDR (regs), 2, byte_order,
1668 I387_MXCSR_INIT_VAL);
1670 if ((clear_bv & X86_XSTATE_X87))
1672 for (i = I387_ST0_REGNUM (tdep);
1673 i < I387_FCTRL_REGNUM (tdep); i++)
1674 memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
1676 for (i = I387_FCTRL_REGNUM (tdep);
1677 i < I387_XMM0_REGNUM (tdep); i++)
1679 if (i == I387_FCTRL_REGNUM (tdep))
1680 store_unsigned_integer (FXSAVE_ADDR (tdep, regs, i), 2,
1681 byte_order, I387_FCTRL_INIT_VAL);
1682 else
1683 memset (FXSAVE_ADDR (tdep, regs, i), 0,
1684 regcache_register_size (regcache, i));
1689 if (regclass == all)
1691 /* Check if any PKEYS registers are changed. */
1692 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1693 for (i = I387_PKRU_REGNUM (tdep);
1694 i < I387_PKEYSEND_REGNUM (tdep); i++)
1696 regcache->raw_collect (i, raw);
1697 p = XSAVE_PKEYS_ADDR (tdep, regs, i);
1698 if (memcmp (raw, p, 4) != 0)
1700 xstate_bv |= X86_XSTATE_PKRU;
1701 memcpy (p, raw, 4);
1705 /* Check if any ZMMH registers are changed. */
1706 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1707 for (i = I387_ZMM16H_REGNUM (tdep);
1708 i < I387_ZMMENDH_REGNUM (tdep); i++)
1710 regcache->raw_collect (i, raw);
1711 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i);
1712 if (memcmp (raw, p, 32) != 0)
1714 xstate_bv |= X86_XSTATE_ZMM;
1715 memcpy (p, raw, 32);
1719 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
1720 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1722 regcache->raw_collect (i, raw);
1723 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i);
1724 if (memcmp (raw, p, 32) != 0)
1726 xstate_bv |= X86_XSTATE_ZMM_H;
1727 memcpy (p, raw, 32);
1731 /* Check if any K registers are changed. */
1732 if ((tdep->xcr0 & X86_XSTATE_K))
1733 for (i = I387_K0_REGNUM (tdep);
1734 i < I387_KEND_REGNUM (tdep); i++)
1736 regcache->raw_collect (i, raw);
1737 p = XSAVE_AVX512_K_ADDR (tdep, regs, i);
1738 if (memcmp (raw, p, 8) != 0)
1740 xstate_bv |= X86_XSTATE_K;
1741 memcpy (p, raw, 8);
1745 /* Check if any XMM or upper YMM registers are changed. */
1746 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1748 for (i = I387_YMM16H_REGNUM (tdep);
1749 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
1751 regcache->raw_collect (i, raw);
1752 p = XSAVE_YMM_AVX512_ADDR (tdep, regs, i);
1753 if (memcmp (raw, p, 16) != 0)
1755 xstate_bv |= X86_XSTATE_ZMM;
1756 memcpy (p, raw, 16);
1759 for (i = I387_XMM16_REGNUM (tdep);
1760 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1762 regcache->raw_collect (i, raw);
1763 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, i);
1764 if (memcmp (raw, p, 16) != 0)
1766 xstate_bv |= X86_XSTATE_ZMM;
1767 memcpy (p, raw, 16);
1772 /* Check if any upper MPX registers are changed. */
1773 if ((tdep->xcr0 & X86_XSTATE_BNDREGS))
1774 for (i = I387_BND0R_REGNUM (tdep);
1775 i < I387_BNDCFGU_REGNUM (tdep); i++)
1777 regcache->raw_collect (i, raw);
1778 p = XSAVE_BNDREGS_ADDR (tdep, regs, i);
1779 if (memcmp (raw, p, 16))
1781 xstate_bv |= X86_XSTATE_BNDREGS;
1782 memcpy (p, raw, 16);
1786 /* Check if any upper MPX registers are changed. */
1787 if ((tdep->xcr0 & X86_XSTATE_BNDCFG))
1788 for (i = I387_BNDCFGU_REGNUM (tdep);
1789 i < I387_MPXEND_REGNUM (tdep); i++)
1791 regcache->raw_collect (i, raw);
1792 p = XSAVE_BNDCFG_ADDR (tdep, regs, i);
1793 if (memcmp (raw, p, 8))
1795 xstate_bv |= X86_XSTATE_BNDCFG;
1796 memcpy (p, raw, 8);
1800 /* Check if any upper YMM registers are changed. */
1801 if ((tdep->xcr0 & X86_XSTATE_AVX))
1802 for (i = I387_YMM0H_REGNUM (tdep);
1803 i < I387_YMMENDH_REGNUM (tdep); i++)
1805 regcache->raw_collect (i, raw);
1806 p = XSAVE_AVXH_ADDR (tdep, regs, i);
1807 if (memcmp (raw, p, 16))
1809 xstate_bv |= X86_XSTATE_AVX;
1810 memcpy (p, raw, 16);
1814 /* Check if any SSE registers are changed. */
1815 if ((tdep->xcr0 & X86_XSTATE_SSE))
1816 for (i = I387_XMM0_REGNUM (tdep);
1817 i < I387_MXCSR_REGNUM (tdep); i++)
1819 regcache->raw_collect (i, raw);
1820 p = FXSAVE_ADDR (tdep, regs, i);
1821 if (memcmp (raw, p, 16))
1823 xstate_bv |= X86_XSTATE_SSE;
1824 memcpy (p, raw, 16);
1828 if ((tdep->xcr0 & X86_XSTATE_AVX) || (tdep->xcr0 & X86_XSTATE_SSE))
1830 i = I387_MXCSR_REGNUM (tdep);
1831 regcache->raw_collect (i, raw);
1832 p = FXSAVE_MXCSR_ADDR (regs);
1833 if (memcmp (raw, p, 4))
1835 /* Now, we need to mark one of either SSE of AVX as enabled.
1836 We could pick either. What we do is check to see if one
1837 of the features is already enabled, if it is then we leave
1838 it at that, otherwise we pick SSE. */
1839 if ((xstate_bv & (X86_XSTATE_SSE | X86_XSTATE_AVX)) == 0)
1840 xstate_bv |= X86_XSTATE_SSE;
1841 memcpy (p, raw, 4);
1845 /* Check if any X87 registers are changed. Only the non-control
1846 registers are handled here, the control registers are all handled
1847 later on in this function. */
1848 if ((tdep->xcr0 & X86_XSTATE_X87))
1849 for (i = I387_ST0_REGNUM (tdep);
1850 i < I387_FCTRL_REGNUM (tdep); i++)
1852 regcache->raw_collect (i, raw);
1853 p = FXSAVE_ADDR (tdep, regs, i);
1854 if (memcmp (raw, p, 10))
1856 xstate_bv |= X86_XSTATE_X87;
1857 memcpy (p, raw, 10);
1861 else
1863 /* Check if REGNUM is changed. */
1864 regcache->raw_collect (regnum, raw);
1866 switch (regclass)
1868 default:
1869 internal_error (_("invalid i387 regclass"));
1871 case pkeys:
1872 /* This is a PKEYS register. */
1873 p = XSAVE_PKEYS_ADDR (tdep, regs, regnum);
1874 if (memcmp (raw, p, 4) != 0)
1876 xstate_bv |= X86_XSTATE_PKRU;
1877 memcpy (p, raw, 4);
1879 break;
1881 case avx512_zmm16_h:
1882 /* This is a ZMM16-31 register. */
1883 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum);
1884 if (memcmp (raw, p, 32) != 0)
1886 xstate_bv |= X86_XSTATE_ZMM;
1887 memcpy (p, raw, 32);
1889 break;
1891 case avx512_zmm0_h:
1892 /* This is a ZMM0-15 register. */
1893 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum);
1894 if (memcmp (raw, p, 32) != 0)
1896 xstate_bv |= X86_XSTATE_ZMM_H;
1897 memcpy (p, raw, 32);
1899 break;
1901 case avx512_k:
1902 /* This is a AVX512 mask register. */
1903 p = XSAVE_AVX512_K_ADDR (tdep, regs, regnum);
1904 if (memcmp (raw, p, 8) != 0)
1906 xstate_bv |= X86_XSTATE_K;
1907 memcpy (p, raw, 8);
1909 break;
1911 case avx512_ymmh_avx512:
1912 /* This is an upper YMM16-31 register. */
1913 p = XSAVE_YMM_AVX512_ADDR (tdep, regs, regnum);
1914 if (memcmp (raw, p, 16) != 0)
1916 xstate_bv |= X86_XSTATE_ZMM;
1917 memcpy (p, raw, 16);
1919 break;
1921 case avx512_xmm_avx512:
1922 /* This is an upper XMM16-31 register. */
1923 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum);
1924 if (memcmp (raw, p, 16) != 0)
1926 xstate_bv |= X86_XSTATE_ZMM;
1927 memcpy (p, raw, 16);
1929 break;
1931 case avxh:
1932 /* This is an upper YMM register. */
1933 p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
1934 if (memcmp (raw, p, 16))
1936 xstate_bv |= X86_XSTATE_AVX;
1937 memcpy (p, raw, 16);
1939 break;
1941 case bndregs:
1942 regcache->raw_collect (regnum, raw);
1943 p = XSAVE_BNDREGS_ADDR (tdep, regs, regnum);
1944 if (memcmp (raw, p, 16))
1946 xstate_bv |= X86_XSTATE_BNDREGS;
1947 memcpy (p, raw, 16);
1949 break;
1951 case bndcfg:
1952 p = XSAVE_BNDCFG_ADDR (tdep, regs, regnum);
1953 xstate_bv |= X86_XSTATE_BNDCFG;
1954 memcpy (p, raw, 8);
1955 break;
1957 case sse:
1958 /* This is an SSE register. */
1959 p = FXSAVE_ADDR (tdep, regs, regnum);
1960 if (memcmp (raw, p, 16))
1962 xstate_bv |= X86_XSTATE_SSE;
1963 memcpy (p, raw, 16);
1965 break;
1967 case x87:
1968 /* This is an x87 register. */
1969 p = FXSAVE_ADDR (tdep, regs, regnum);
1970 if (memcmp (raw, p, 10))
1972 xstate_bv |= X86_XSTATE_X87;
1973 memcpy (p, raw, 10);
1975 break;
1977 case x87_ctrl_or_mxcsr:
1978 /* We only handle MXCSR here. All other x87 control registers
1979 are handled separately below. */
1980 if (regnum == I387_MXCSR_REGNUM (tdep))
1982 p = FXSAVE_MXCSR_ADDR (regs);
1983 if (memcmp (raw, p, 2))
1985 /* We're only setting MXCSR, so check the initial state
1986 to see if either of AVX or SSE are already enabled.
1987 If they are then we'll attribute this changed MXCSR to
1988 that feature. If neither feature is enabled, then
1989 we'll attribute this change to the SSE feature. */
1990 xstate_bv |= (initial_xstate_bv
1991 & (X86_XSTATE_AVX | X86_XSTATE_SSE));
1992 if ((xstate_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE)) == 0)
1993 xstate_bv |= X86_XSTATE_SSE;
1994 memcpy (p, raw, 2);
2000 /* Only handle x87 control registers. */
2001 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
2002 if (regnum == -1 || regnum == i)
2004 /* Most of the FPU control registers occupy only 16 bits in
2005 the xsave extended state. Give those a special treatment. */
2006 if (i != I387_FIOFF_REGNUM (tdep)
2007 && i != I387_FOOFF_REGNUM (tdep))
2009 gdb_byte buf[4];
2011 regcache->raw_collect (i, buf);
2013 if (i == I387_FOP_REGNUM (tdep))
2015 /* The opcode occupies only 11 bits. Make sure we
2016 don't touch the other bits. */
2017 buf[1] &= ((1 << 3) - 1);
2018 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
2020 else if (i == I387_FTAG_REGNUM (tdep))
2022 /* Converting back is much easier. */
2024 unsigned short ftag;
2025 int fpreg;
2027 ftag = (buf[1] << 8) | buf[0];
2028 buf[0] = 0;
2029 buf[1] = 0;
2031 for (fpreg = 7; fpreg >= 0; fpreg--)
2033 int tag = (ftag >> (fpreg * 2)) & 3;
2035 if (tag != 3)
2036 buf[0] |= (1 << fpreg);
2039 p = FXSAVE_ADDR (tdep, regs, i);
2040 if (memcmp (p, buf, 2))
2042 xstate_bv |= X86_XSTATE_X87;
2043 memcpy (p, buf, 2);
2046 else
2048 int regsize;
2050 regcache->raw_collect (i, raw);
2051 regsize = regcache_register_size (regcache, i);
2052 p = FXSAVE_ADDR (tdep, regs, i);
2053 if (memcmp (raw, p, regsize))
2055 xstate_bv |= X86_XSTATE_X87;
2056 memcpy (p, raw, regsize);
2061 /* Update the corresponding bits in `xstate_bv' if any
2062 registers are changed. */
2063 if (xstate_bv)
2065 /* The supported bits in `xstat_bv' are 8 bytes. */
2066 initial_xstate_bv |= xstate_bv;
2067 store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
2068 8, byte_order,
2069 initial_xstate_bv);
2073 /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
2074 *RAW. */
2076 static int
2077 i387_tag (const gdb_byte *raw)
2079 int integer;
2080 unsigned int exponent;
2081 unsigned long fraction[2];
2083 integer = raw[7] & 0x80;
2084 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
2085 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
2086 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
2087 | (raw[5] << 8) | raw[4]);
2089 if (exponent == 0x7fff)
2091 /* Special. */
2092 return (2);
2094 else if (exponent == 0x0000)
2096 if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer)
2098 /* Zero. */
2099 return (1);
2101 else
2103 /* Special. */
2104 return (2);
2107 else
2109 if (integer)
2111 /* Valid. */
2112 return (0);
2114 else
2116 /* Special. */
2117 return (2);
2122 /* Prepare the FPU stack in REGCACHE for a function return. */
2124 void
2125 i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
2127 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
2128 ULONGEST fstat;
2130 /* Set the top of the floating-point register stack to 7. The
2131 actual value doesn't really matter, but 7 is what a normal
2132 function return would end up with if the program started out with
2133 a freshly initialized FPU. */
2134 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
2135 fstat |= (7 << 11);
2136 regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
2138 /* Mark %st(1) through %st(7) as empty. Since we set the top of the
2139 floating-point register stack to 7, the appropriate value for the
2140 tag word is 0x3fff. */
2141 regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
2145 /* See i387-tdep.h. */
2147 void
2148 i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache)
2150 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
2152 if (I387_BND0R_REGNUM (tdep) > 0)
2154 gdb_byte bnd_buf[16];
2156 memset (bnd_buf, 0, 16);
2157 for (int i = 0; i < I387_NUM_BND_REGS; i++)
2158 regcache->raw_write (I387_BND0R_REGNUM (tdep) + i, bnd_buf);