diff options
-rw-r--r-- | gdb/gdbserver/i387-fp.c | 8 | ||||
-rw-r--r-- | gdb/i387-tdep.c | 33 |
2 files changed, 25 insertions, 16 deletions
diff --git a/gdb/gdbserver/i387-fp.c b/gdb/gdbserver/i387-fp.c index b9d7754cb08..8267045a5c4 100644 --- a/gdb/gdbserver/i387-fp.c +++ b/gdb/gdbserver/i387-fp.c @@ -273,14 +273,14 @@ i387_cache_to_xsave (struct regcache *regcache, void *buf) struct i387_xsave *fp = (struct i387_xsave *) buf; int i; unsigned long val, val2; - unsigned int clear_bv; unsigned long long xstate_bv = 0; + unsigned long long clear_bv = 0; char raw[64]; char *p; /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */ int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8; - /* The supported bits in `xstat_bv' are 1 byte. Clear part in + /* The supported bits in `xstat_bv' are 8 bytes. Clear part in vector registers if its bit in xstat_bv is zero. */ clear_bv = (~fp->xstate_bv) & x86_xcr0; @@ -643,12 +643,12 @@ i387_xsave_to_cache (struct regcache *regcache, const void *buf) struct i387_fxsave *fxp = (struct i387_fxsave *) buf; int i, top; unsigned long val; - unsigned int clear_bv; + unsigned long long clear_bv; gdb_byte *p; /* Amd64 has 16 xmm regs; I386 has 8 xmm regs. */ int num_xmm_registers = register_size (regcache->tdesc, 0) == 8 ? 16 : 8; - /* The supported bits in `xstat_bv' are 1 byte. Clear part in + /* The supported bits in `xstat_bv' are 8 bytes. Clear part in vector registers if its bit in xstat_bv is zero. */ clear_bv = (~fp->xstate_bv) & x86_xcr0; diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index adbe7213308..e3418d76273 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -898,7 +898,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); const gdb_byte *regs = (const gdb_byte *) xsave; int i; - unsigned int clear_bv; + ULONGEST clear_bv; static const gdb_byte zero[MAX_REGISTER_SIZE] = { 0 }; enum { @@ -950,12 +950,15 @@ i387_supply_xsave (struct regcache *regcache, int regnum, if (regclass != none) { - /* Get `xstat_bv'. */ - const gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs); + /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */ + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + ULONGEST xstate_bv = 0; - /* The supported bits in `xstat_bv' are 1 byte. Clear part in - vector registers if its bit in xstat_bv is zero. */ - clear_bv = (~(*xstate_bv_p)) & tdep->xcr0; + xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs), + 8, byte_order); + + /* Clear part in vector registers if its bit in xstat_bv is zero. */ + clear_bv = (~(xstate_bv)) & tdep->xcr0; } else clear_bv = X86_XSTATE_ALL_MASK; @@ -1333,11 +1336,14 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, if ((regclass & check)) { gdb_byte raw[I386_MAX_REGISTER_SIZE]; - gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs); - unsigned int xstate_bv = 0; - /* The supported bits in `xstat_bv' are 1 byte. */ - unsigned int clear_bv = (~(*xstate_bv_p)) & tdep->xcr0; + ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0; gdb_byte *p; + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + + /* The supported bits in `xstat_bv' are 8 bytes. */ + initial_xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs), + 8, byte_order); + clear_bv = (~(initial_xstate_bv)) & tdep->xcr0; /* Clear register set if its bit in xstat_bv is zero. */ if (clear_bv) @@ -1619,8 +1625,11 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, registers are changed. */ if (xstate_bv) { - /* The supported bits in `xstat_bv' are 1 byte. */ - *xstate_bv_p |= (gdb_byte) xstate_bv; + /* The supported bits in `xstat_bv' are 8 bytes. */ + initial_xstate_bv |= xstate_bv; + store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs), + 8, byte_order, + initial_xstate_bv); switch (regclass) { |