diff options
Diffstat (limited to 'gdb/i387-tdep.c')
-rw-r--r-- | gdb/i387-tdep.c | 264 |
1 files changed, 42 insertions, 222 deletions
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index 675ee8d..977edeb 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -1,6 +1,6 @@ /* Intel 387 floating point stuff. - Copyright (C) 1988-2024 Free Software Foundation, Inc. + Copyright (C) 1988-2025 Free Software Foundation, Inc. This file is part of GDB. @@ -818,30 +818,6 @@ static int xsave_xmm_avx512_offset[] = (xsave + (tdep)->xsave_layout.zmm_offset \ + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)]) -/* At xsave_bndregs_offset[REGNUM] you'll find the relative offset - within the BNDREGS region of the XSAVE extended state where the GDB - register BND0R + REGNUM is stored. */ - -static int xsave_bndregs_offset[] = { - 0 * 16, /* bnd0r...bnd3r registers. */ - 1 * 16, - 2 * 16, - 3 * 16 -}; - -#define XSAVE_BNDREGS_ADDR(tdep, xsave, regnum) \ - (xsave + (tdep)->xsave_layout.bndregs_offset \ - + xsave_bndregs_offset[regnum - I387_BND0R_REGNUM (tdep)]) - -static int xsave_bndcfg_offset[] = { - 0 * 8, /* bndcfg ... bndstatus. */ - 1 * 8, -}; - -#define XSAVE_BNDCFG_ADDR(tdep, xsave, regnum) \ - (xsave + (tdep)->xsave_layout.bndcfg_offset \ - + xsave_bndcfg_offset[regnum - I387_BNDCFGU_REGNUM (tdep)]) - /* At xsave_avx512_k_offset[REGNUM] you'll find the relative offset within the K region of the XSAVE extended state where the AVX512 opmask register K0 + REGNUM is stored. */ @@ -944,8 +920,6 @@ i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size, { /* Intel CPUs supporting PKRU. */ layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; layout.k_offset = 1088; layout.zmm_h_offset = 1152; layout.zmm_offset = 1664; @@ -964,20 +938,14 @@ i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size, { /* Intel CPUs supporting AVX512. */ layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; layout.k_offset = 1088; layout.zmm_h_offset = 1152; layout.zmm_offset = 1664; } - else if (HAS_MPX (xcr0) && xsave_size == 1088) - { - /* Intel CPUs supporting MPX. */ - layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; - } - else if (HAS_AVX (xcr0) && xsave_size == 832) + /* As MPX has been removed, we need the additional check + (xsave_size == 1088) to allow reading AVX registers from corefiles + on CPUs with MPX as the highest supported feature. */ + else if (HAS_AVX (xcr0) && (xsave_size == 832 || xsave_size == 1088)) { /* Intel and AMD CPUs supporting AVX. */ layout.avx_offset = 576; @@ -1000,8 +968,6 @@ i387_fallback_xsave_layout (uint64_t xcr0) { /* Intel CPUs supporting PKRU. */ layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; layout.k_offset = 1088; layout.zmm_h_offset = 1152; layout.zmm_offset = 1664; @@ -1012,21 +978,11 @@ i387_fallback_xsave_layout (uint64_t xcr0) { /* Intel CPUs supporting AVX512. */ layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; layout.k_offset = 1088; layout.zmm_h_offset = 1152; layout.zmm_offset = 1664; layout.sizeof_xsave = 2688; } - else if (HAS_MPX (xcr0)) - { - /* Intel CPUs supporting MPX. */ - layout.avx_offset = 576; - layout.bndregs_offset = 960; - layout.bndcfg_offset = 1024; - layout.sizeof_xsave = 1088; - } else if (HAS_AVX (xcr0)) { /* Intel and AMD CPUs supporting AVX. */ @@ -1075,23 +1031,20 @@ i387_supply_xsave (struct regcache *regcache, int regnum, unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep) + std::min (tdep->num_zmm_regs, 16); ULONGEST clear_bv; - static const gdb_byte zero[I386_MAX_REGISTER_SIZE] = { 0 }; enum { none = 0x0, x87 = 0x1, sse = 0x2, avxh = 0x4, - bndregs = 0x8, - bndcfg = 0x10, - avx512_k = 0x20, - avx512_zmm0_h = 0x40, - avx512_zmm16_h = 0x80, - avx512_ymmh_avx512 = 0x100, - avx512_xmm_avx512 = 0x200, - pkeys = 0x400, - all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h - | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys + avx512_k = 0x8, + avx512_zmm0_h = 0x10, + avx512_zmm16_h = 0x20, + avx512_ymmh_avx512 = 0x40, + avx512_xmm_avx512 = 0x80, + pkeys = 0x100, + all = x87 | sse | avxh | avx512_k | avx512_zmm0_h | avx512_zmm16_h + | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys } regclass; gdb_assert (regs != NULL); @@ -1121,12 +1074,6 @@ i387_supply_xsave (struct regcache *regcache, int regnum, else if (regnum >= I387_YMM0H_REGNUM (tdep) && regnum < I387_YMMENDH_REGNUM (tdep)) regclass = avxh; - else if (regnum >= I387_BND0R_REGNUM (tdep) - && regnum < I387_BNDCFGU_REGNUM (tdep)) - regclass = bndregs; - else if (regnum >= I387_BNDCFGU_REGNUM (tdep) - && regnum < I387_MPXEND_REGNUM (tdep)) - regclass = bndcfg; else if (regnum >= I387_XMM0_REGNUM (tdep) && regnum < I387_MXCSR_REGNUM (tdep)) regclass = sse; @@ -1154,14 +1101,14 @@ i387_supply_xsave (struct regcache *regcache, int regnum, case pkeys: if ((clear_bv & X86_XSTATE_PKRU)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_PKEYS_ADDR (tdep, regs, regnum)); return; case avx512_zmm0_h: if ((clear_bv & X86_XSTATE_ZMM_H)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum)); @@ -1169,7 +1116,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, case avx512_zmm16_h: if ((clear_bv & X86_XSTATE_ZMM)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum)); @@ -1177,14 +1124,14 @@ i387_supply_xsave (struct regcache *regcache, int regnum, case avx512_k: if ((clear_bv & X86_XSTATE_K)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_AVX512_K_ADDR (tdep, regs, regnum)); return; case avx512_ymmh_avx512: if ((clear_bv & X86_XSTATE_ZMM)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_YMM_H_AVX512_ADDR (tdep, regs, regnum)); @@ -1192,7 +1139,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, case avx512_xmm_avx512: if ((clear_bv & X86_XSTATE_ZMM)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum)); @@ -1200,35 +1147,21 @@ i387_supply_xsave (struct regcache *regcache, int regnum, case avxh: if ((clear_bv & X86_XSTATE_AVX)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, XSAVE_AVXH_ADDR (tdep, regs, regnum)); return; - case bndcfg: - if ((clear_bv & X86_XSTATE_BNDCFG)) - regcache->raw_supply (regnum, zero); - else - regcache->raw_supply (regnum, XSAVE_BNDCFG_ADDR (tdep, regs, regnum)); - return; - - case bndregs: - if ((clear_bv & X86_XSTATE_BNDREGS)) - regcache->raw_supply (regnum, zero); - else - regcache->raw_supply (regnum, XSAVE_BNDREGS_ADDR (tdep, regs, regnum)); - return; - case sse: if ((clear_bv & X86_XSTATE_SSE)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum)); return; case x87: if ((clear_bv & X86_XSTATE_X87)) - regcache->raw_supply (regnum, zero); + regcache->raw_supply_zeroed (regnum); else regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum)); return; @@ -1242,7 +1175,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, for (i = I387_PKRU_REGNUM (tdep); i < I387_PKEYSEND_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1259,7 +1192,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, if ((clear_bv & X86_XSTATE_ZMM_H)) { for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1277,7 +1210,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, for (i = I387_K0_REGNUM (tdep); i < I387_KEND_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1295,15 +1228,15 @@ i387_supply_xsave (struct regcache *regcache, int regnum, { for (i = I387_ZMM16H_REGNUM (tdep); i < I387_ZMMENDH_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); for (i = I387_YMM16H_REGNUM (tdep); i < I387_YMMH_AVX512_END_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); for (i = I387_XMM16_REGNUM (tdep); i < I387_XMM_AVX512_END_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1330,7 +1263,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, for (i = I387_YMM0H_REGNUM (tdep); i < I387_YMMENDH_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1341,40 +1274,6 @@ i387_supply_xsave (struct regcache *regcache, int regnum, } } - /* Handle the MPX registers. */ - if ((tdep->xcr0 & X86_XSTATE_BNDREGS)) - { - if (clear_bv & X86_XSTATE_BNDREGS) - { - for (i = I387_BND0R_REGNUM (tdep); - i < I387_BNDCFGU_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); - } - else - { - for (i = I387_BND0R_REGNUM (tdep); - i < I387_BNDCFGU_REGNUM (tdep); i++) - regcache->raw_supply (i, XSAVE_BNDREGS_ADDR (tdep, regs, i)); - } - } - - /* Handle the MPX registers. */ - if ((tdep->xcr0 & X86_XSTATE_BNDCFG)) - { - if (clear_bv & X86_XSTATE_BNDCFG) - { - for (i = I387_BNDCFGU_REGNUM (tdep); - i < I387_MPXEND_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); - } - else - { - for (i = I387_BNDCFGU_REGNUM (tdep); - i < I387_MPXEND_REGNUM (tdep); i++) - regcache->raw_supply (i, XSAVE_BNDCFG_ADDR (tdep, regs, i)); - } - } - /* Handle the XMM registers. */ if ((tdep->xcr0 & X86_XSTATE_SSE)) { @@ -1383,7 +1282,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1401,7 +1300,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, for (i = I387_ST0_REGNUM (tdep); i < I387_FCTRL_REGNUM (tdep); i++) - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } else { @@ -1436,7 +1335,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, regcache->raw_supply (i, buf); } else - regcache->raw_supply (i, zero); + regcache->raw_supply_zeroed (i); } /* Most of the FPU control registers occupy only 16 bits in the xsave extended state. Give those a special treatment. */ @@ -1527,16 +1426,14 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, x87 = 0x2, sse = 0x4, avxh = 0x8, - bndregs = 0x10, - bndcfg = 0x20, - avx512_k = 0x40, - avx512_zmm0_h = 0x80, - avx512_zmm16_h = 0x100, - avx512_ymmh_avx512 = 0x200, - avx512_xmm_avx512 = 0x400, - pkeys = 0x800, - all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h - | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys + avx512_k = 0x10, + avx512_zmm0_h = 0x20, + avx512_zmm16_h = 0x40, + avx512_ymmh_avx512 = 0x80, + avx512_xmm_avx512 = 0x100, + pkeys = 0x200, + all = x87 | sse | avxh | avx512_k | avx512_zmm0_h | avx512_zmm16_h + | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys } regclass; gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); @@ -1565,12 +1462,6 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, else if (regnum >= I387_YMM0H_REGNUM (tdep) && regnum < I387_YMMENDH_REGNUM (tdep)) regclass = avxh; - else if (regnum >= I387_BND0R_REGNUM (tdep) - && regnum < I387_BNDCFGU_REGNUM (tdep)) - regclass = bndregs; - else if (regnum >= I387_BNDCFGU_REGNUM (tdep) - && regnum < I387_MPXEND_REGNUM (tdep)) - regclass = bndcfg; else if (regnum >= I387_XMM0_REGNUM (tdep) && regnum < I387_MXCSR_REGNUM (tdep)) regclass = sse; @@ -1619,16 +1510,6 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, i < I387_PKEYSEND_REGNUM (tdep); i++) memset (XSAVE_PKEYS_ADDR (tdep, regs, i), 0, 4); - if ((clear_bv & X86_XSTATE_BNDREGS)) - for (i = I387_BND0R_REGNUM (tdep); - i < I387_BNDCFGU_REGNUM (tdep); i++) - memset (XSAVE_BNDREGS_ADDR (tdep, regs, i), 0, 16); - - if ((clear_bv & X86_XSTATE_BNDCFG)) - for (i = I387_BNDCFGU_REGNUM (tdep); - i < I387_MPXEND_REGNUM (tdep); i++) - memset (XSAVE_BNDCFG_ADDR (tdep, regs, i), 0, 8); - if ((clear_bv & X86_XSTATE_ZMM_H)) for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++) memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i), 0, 32); @@ -1683,7 +1564,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, byte_order, I387_FCTRL_INIT_VAL); else memset (FXSAVE_ADDR (tdep, regs, i), 0, - regcache_register_size (regcache, i)); + regcache->register_size (i)); } } } @@ -1771,34 +1652,6 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, } } - /* Check if any upper MPX registers are changed. */ - if ((tdep->xcr0 & X86_XSTATE_BNDREGS)) - for (i = I387_BND0R_REGNUM (tdep); - i < I387_BNDCFGU_REGNUM (tdep); i++) - { - regcache->raw_collect (i, raw); - p = XSAVE_BNDREGS_ADDR (tdep, regs, i); - if (memcmp (raw, p, 16)) - { - xstate_bv |= X86_XSTATE_BNDREGS; - memcpy (p, raw, 16); - } - } - - /* Check if any upper MPX registers are changed. */ - if ((tdep->xcr0 & X86_XSTATE_BNDCFG)) - for (i = I387_BNDCFGU_REGNUM (tdep); - i < I387_MPXEND_REGNUM (tdep); i++) - { - regcache->raw_collect (i, raw); - p = XSAVE_BNDCFG_ADDR (tdep, regs, i); - if (memcmp (raw, p, 8)) - { - xstate_bv |= X86_XSTATE_BNDCFG; - memcpy (p, raw, 8); - } - } - /* Check if any upper YMM registers are changed. */ if ((tdep->xcr0 & X86_XSTATE_AVX)) for (i = I387_YMM0H_REGNUM (tdep); @@ -1940,22 +1793,6 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, } break; - case bndregs: - regcache->raw_collect (regnum, raw); - p = XSAVE_BNDREGS_ADDR (tdep, regs, regnum); - if (memcmp (raw, p, 16)) - { - xstate_bv |= X86_XSTATE_BNDREGS; - memcpy (p, raw, 16); - } - break; - - case bndcfg: - p = XSAVE_BNDCFG_ADDR (tdep, regs, regnum); - xstate_bv |= X86_XSTATE_BNDCFG; - memcpy (p, raw, 8); - break; - case sse: /* This is an SSE register. */ p = FXSAVE_ADDR (tdep, regs, regnum); @@ -2050,7 +1887,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, int regsize; regcache->raw_collect (i, raw); - regsize = regcache_register_size (regcache, i); + regsize = regcache->register_size (i); p = FXSAVE_ADDR (tdep, regs, i); if (memcmp (raw, p, regsize)) { @@ -2143,20 +1980,3 @@ i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache) regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); } - -/* See i387-tdep.h. */ - -void -i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache) -{ - i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch); - - if (I387_BND0R_REGNUM (tdep) > 0) - { - gdb_byte bnd_buf[16]; - - memset (bnd_buf, 0, 16); - for (int i = 0; i < I387_NUM_BND_REGS; i++) - regcache->raw_write (I387_BND0R_REGNUM (tdep) + i, bnd_buf); - } -} |