| Index: gdb/i386-tdep.c
|
| diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
|
| index fd5969d61e0a6ff57184300e6f85082d75d27d0a..a1a4453a81853ef7e853fe745c6ec02763b66069 100644
|
| --- a/gdb/i386-tdep.c
|
| +++ b/gdb/i386-tdep.c
|
| @@ -1,6 +1,6 @@
|
| /* Intel 386 target-dependent stuff.
|
|
|
| - Copyright (C) 1988-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 1988-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -45,17 +45,19 @@
|
| #include "remote.h"
|
| #include "exceptions.h"
|
| #include "gdb_assert.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
|
|
| #include "i386-tdep.h"
|
| #include "i387-tdep.h"
|
| #include "i386-xstate.h"
|
|
|
| #include "record.h"
|
| +#include "record-full.h"
|
| #include <stdint.h>
|
|
|
| #include "features/i386/i386.c"
|
| #include "features/i386/i386-avx.c"
|
| +#include "features/i386/i386-mpx.c"
|
| #include "features/i386/i386-mmx.c"
|
|
|
| #include "ax.h"
|
| @@ -97,6 +99,18 @@ static const char *i386_ymmh_names[] =
|
| "ymm4h", "ymm5h", "ymm6h", "ymm7h",
|
| };
|
|
|
| +static const char *i386_mpx_names[] =
|
| +{
|
| + "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus"
|
| +};
|
| +
|
| +/* Register names for MPX pseudo-registers. */
|
| +
|
| +static const char *i386_bnd_names[] =
|
| +{
|
| + "bnd0", "bnd1", "bnd2", "bnd3"
|
| +};
|
| +
|
| /* Register names for MMX pseudo-registers. */
|
|
|
| static const char *i386_mmx_names[] =
|
| @@ -201,6 +215,21 @@ i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
|
| return regnum >= 0 && regnum < tdep->num_ymm_regs;
|
| }
|
|
|
| +/* BND register? */
|
| +
|
| +int
|
| +i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
|
| +{
|
| + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| + int bnd0_regnum = tdep->bnd0_regnum;
|
| +
|
| + if (bnd0_regnum < 0)
|
| + return 0;
|
| +
|
| + regnum -= bnd0_regnum;
|
| + return regnum >= 0 && regnum < I387_NUM_BND_REGS;
|
| +}
|
| +
|
| /* SSE register? */
|
|
|
| int
|
| @@ -253,6 +282,34 @@ i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
|
| && regnum < I387_XMM0_REGNUM (tdep));
|
| }
|
|
|
| +/* BNDr (raw) register? */
|
| +
|
| +static int
|
| +i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
|
| +{
|
| + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| +
|
| + if (I387_BND0R_REGNUM (tdep) < 0)
|
| + return 0;
|
| +
|
| + regnum -= tdep->bnd0r_regnum;
|
| + return regnum >= 0 && regnum < I387_NUM_BND_REGS;
|
| +}
|
| +
|
| +/* BND control register? */
|
| +
|
| +static int
|
| +i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
|
| +{
|
| + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| +
|
| + if (I387_BNDCFGU_REGNUM (tdep) < 0)
|
| + return 0;
|
| +
|
| + regnum -= I387_BNDCFGU_REGNUM (tdep);
|
| + return regnum >= 0 && regnum < I387_NUM_MPX_CTRL_REGS;
|
| +}
|
| +
|
| /* Return the name of register REGNUM, or the empty string if it is
|
| an anonymous register. */
|
|
|
| @@ -272,6 +329,8 @@ const char *
|
| i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
|
| {
|
| struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| + if (i386_bnd_regnum_p (gdbarch, regnum))
|
| + return i386_bnd_names[regnum - tdep->bnd0_regnum];
|
| if (i386_mmx_regnum_p (gdbarch, regnum))
|
| return i386_mmx_names[regnum - I387_MM0_REGNUM (tdep)];
|
| else if (i386_ymm_regnum_p (gdbarch, regnum))
|
| @@ -750,7 +809,7 @@ i386_relocate_instruction (struct gdbarch *gdbarch,
|
| /* Where "ret" in the original code will return to. */
|
| ret_addr = oldloc + insn_length;
|
| push_buf[0] = 0x68; /* pushq $... */
|
| - memcpy (&push_buf[1], &ret_addr, 4);
|
| + store_unsigned_integer (&push_buf[1], 4, byte_order, ret_addr);
|
| /* Push the push. */
|
| append_insns (to, 5, push_buf);
|
|
|
| @@ -872,13 +931,14 @@ i386_follow_jump (struct gdbarch *gdbarch, CORE_ADDR pc)
|
| long delta = 0;
|
| int data16 = 0;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| if (op == 0x66)
|
| {
|
| data16 = 1;
|
| - op = read_memory_unsigned_integer (pc + 1, 1, byte_order);
|
| +
|
| + op = read_code_unsigned_integer (pc + 1, 1, byte_order);
|
| }
|
|
|
| switch (op)
|
| @@ -940,13 +1000,13 @@ i386_analyze_struct_return (CORE_ADDR pc, CORE_ADDR current_pc,
|
| if (current_pc <= pc)
|
| return pc;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| if (op != 0x58) /* popl %eax */
|
| return pc;
|
|
|
| - if (target_read_memory (pc + 1, buf, 4))
|
| + if (target_read_code (pc + 1, buf, 4))
|
| return pc;
|
|
|
| if (memcmp (buf, proto1, 3) != 0 && memcmp (buf, proto2, 4) != 0)
|
| @@ -987,7 +1047,7 @@ i386_skip_probe (CORE_ADDR pc)
|
| gdb_byte buf[8];
|
| gdb_byte op;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| if (op == 0x68 || op == 0x6a)
|
| @@ -1057,7 +1117,7 @@ i386_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
|
| I386_EDI_REGNUM /* %edi */
|
| };
|
|
|
| - if (target_read_memory (pc, buf, sizeof buf))
|
| + if (target_read_code (pc, buf, sizeof buf))
|
| return pc;
|
|
|
| /* Check caller-saved saved register. The first instruction has
|
| @@ -1146,7 +1206,7 @@ i386_match_pattern (CORE_ADDR pc, struct i386_insn pattern)
|
| {
|
| gdb_byte op;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return 0;
|
|
|
| if ((op & pattern.mask[0]) == pattern.insn[0])
|
| @@ -1158,7 +1218,7 @@ i386_match_pattern (CORE_ADDR pc, struct i386_insn pattern)
|
| gdb_assert (pattern.len > 1);
|
| gdb_assert (pattern.len <= I386_MAX_MATCHED_INSN_LEN);
|
|
|
| - if (target_read_memory (pc + 1, buf, pattern.len - 1))
|
| + if (target_read_code (pc + 1, buf, pattern.len - 1))
|
| return 0;
|
|
|
| for (i = 1; i < pattern.len; i++)
|
| @@ -1288,7 +1348,7 @@ i386_skip_noop (CORE_ADDR pc)
|
| gdb_byte op;
|
| int check = 1;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| while (check)
|
| @@ -1298,7 +1358,7 @@ i386_skip_noop (CORE_ADDR pc)
|
| if (op == 0x90)
|
| {
|
| pc += 1;
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
| check = 1;
|
| }
|
| @@ -1315,13 +1375,13 @@ i386_skip_noop (CORE_ADDR pc)
|
|
|
| else if (op == 0x8b)
|
| {
|
| - if (target_read_memory (pc + 1, &op, 1))
|
| + if (target_read_code (pc + 1, &op, 1))
|
| return pc;
|
|
|
| if (op == 0xff)
|
| {
|
| pc += 2;
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| check = 1;
|
| @@ -1349,7 +1409,7 @@ i386_analyze_frame_setup (struct gdbarch *gdbarch,
|
| if (limit <= pc)
|
| return limit;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
|
|
| if (op == 0x55) /* pushl %ebp */
|
| @@ -1385,21 +1445,43 @@ i386_analyze_frame_setup (struct gdbarch *gdbarch,
|
| if (limit <= pc + skip)
|
| return limit;
|
|
|
| - if (target_read_memory (pc + skip, &op, 1))
|
| + if (target_read_code (pc + skip, &op, 1))
|
| return pc + skip;
|
|
|
| - /* Check for `movl %esp, %ebp' -- can be written in two ways. */
|
| + /* The i386 prologue looks like
|
| +
|
| + push %ebp
|
| + mov %esp,%ebp
|
| + sub $0x10,%esp
|
| +
|
| + and a different prologue can be generated for atom.
|
| +
|
| + push %ebp
|
| + lea (%esp),%ebp
|
| + lea -0x10(%esp),%esp
|
| +
|
| + We handle both of them here. */
|
| +
|
| switch (op)
|
| {
|
| + /* Check for `movl %esp, %ebp' -- can be written in two ways. */
|
| case 0x8b:
|
| - if (read_memory_unsigned_integer (pc + skip + 1, 1, byte_order)
|
| + if (read_code_unsigned_integer (pc + skip + 1, 1, byte_order)
|
| != 0xec)
|
| return pc;
|
| + pc += (skip + 2);
|
| break;
|
| case 0x89:
|
| - if (read_memory_unsigned_integer (pc + skip + 1, 1, byte_order)
|
| + if (read_code_unsigned_integer (pc + skip + 1, 1, byte_order)
|
| != 0xe5)
|
| return pc;
|
| + pc += (skip + 2);
|
| + break;
|
| + case 0x8d: /* Check for 'lea (%ebp), %ebp'. */
|
| + if (read_code_unsigned_integer (pc + skip + 1, 2, byte_order)
|
| + != 0x242c)
|
| + return pc;
|
| + pc += (skip + 3);
|
| break;
|
| default:
|
| return pc;
|
| @@ -1410,7 +1492,6 @@ i386_analyze_frame_setup (struct gdbarch *gdbarch,
|
| necessary. We also now commit to skipping the special
|
| instructions mentioned before. */
|
| cache->locals = 0;
|
| - pc += (skip + 2);
|
|
|
| /* If that's all, return now. */
|
| if (limit <= pc)
|
| @@ -1419,43 +1500,54 @@ i386_analyze_frame_setup (struct gdbarch *gdbarch,
|
| /* Check for stack adjustment
|
|
|
| subl $XXX, %esp
|
| + or
|
| + lea -XXX(%esp),%esp
|
|
|
| NOTE: You can't subtract a 16-bit immediate from a 32-bit
|
| reg, so we don't have to worry about a data16 prefix. */
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
| if (op == 0x83)
|
| {
|
| /* `subl' with 8-bit immediate. */
|
| - if (read_memory_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
|
| + if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
|
| /* Some instruction starting with 0x83 other than `subl'. */
|
| return pc;
|
|
|
| /* `subl' with signed 8-bit immediate (though it wouldn't
|
| make sense to be negative). */
|
| - cache->locals = read_memory_integer (pc + 2, 1, byte_order);
|
| + cache->locals = read_code_integer (pc + 2, 1, byte_order);
|
| return pc + 3;
|
| }
|
| else if (op == 0x81)
|
| {
|
| /* Maybe it is `subl' with a 32-bit immediate. */
|
| - if (read_memory_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
|
| + if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
|
| /* Some instruction starting with 0x81 other than `subl'. */
|
| return pc;
|
|
|
| /* It is `subl' with a 32-bit immediate. */
|
| - cache->locals = read_memory_integer (pc + 2, 4, byte_order);
|
| + cache->locals = read_code_integer (pc + 2, 4, byte_order);
|
| return pc + 6;
|
| }
|
| + else if (op == 0x8d)
|
| + {
|
| + /* The ModR/M byte is 0x64. */
|
| + if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0x64)
|
| + return pc;
|
| + /* 'lea' with 8-bit displacement. */
|
| + cache->locals = -1 * read_code_integer (pc + 3, 1, byte_order);
|
| + return pc + 4;
|
| + }
|
| else
|
| {
|
| - /* Some instruction other than `subl'. */
|
| + /* Some instruction other than `subl' nor 'lea'. */
|
| return pc;
|
| }
|
| }
|
| else if (op == 0xc8) /* enter */
|
| {
|
| - cache->locals = read_memory_unsigned_integer (pc + 1, 2, byte_order);
|
| + cache->locals = read_code_unsigned_integer (pc + 1, 2, byte_order);
|
| return pc + 4;
|
| }
|
|
|
| @@ -1479,7 +1571,7 @@ i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
|
| offset -= cache->locals;
|
| for (i = 0; i < 8 && pc < current_pc; i++)
|
| {
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
| if (op < 0x50 || op > 0x57)
|
| break;
|
| @@ -1550,7 +1642,23 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
| CORE_ADDR pc;
|
| gdb_byte op;
|
| int i;
|
| + CORE_ADDR func_addr;
|
|
|
| + if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
|
| + {
|
| + CORE_ADDR post_prologue_pc
|
| + = skip_prologue_using_sal (gdbarch, func_addr);
|
| + struct symtab *s = find_pc_symtab (func_addr);
|
| +
|
| + /* Clang always emits a line note before the prologue and another
|
| + one after. We trust clang to emit usable line notes. */
|
| + if (post_prologue_pc
|
| + && (s != NULL
|
| + && s->producer != NULL
|
| + && strncmp (s->producer, "clang ", sizeof ("clang ") - 1) == 0))
|
| + return max (start_pc, post_prologue_pc);
|
| + }
|
| +
|
| cache.locals = -1;
|
| pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
|
| if (cache.locals < 0)
|
| @@ -1573,7 +1681,7 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
|
|
| for (i = 0; i < 6; i++)
|
| {
|
| - if (target_read_memory (pc + i, &op, 1))
|
| + if (target_read_code (pc + i, &op, 1))
|
| return pc;
|
|
|
| if (pic_pat[i] != op)
|
| @@ -1583,12 +1691,12 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
| {
|
| int delta = 6;
|
|
|
| - if (target_read_memory (pc + delta, &op, 1))
|
| + if (target_read_code (pc + delta, &op, 1))
|
| return pc;
|
|
|
| if (op == 0x89) /* movl %ebx, x(%ebp) */
|
| {
|
| - op = read_memory_unsigned_integer (pc + delta + 1, 1, byte_order);
|
| + op = read_code_unsigned_integer (pc + delta + 1, 1, byte_order);
|
|
|
| if (op == 0x5d) /* One byte offset from %ebp. */
|
| delta += 3;
|
| @@ -1597,13 +1705,13 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
| else /* Unexpected instruction. */
|
| delta = 0;
|
|
|
| - if (target_read_memory (pc + delta, &op, 1))
|
| + if (target_read_code (pc + delta, &op, 1))
|
| return pc;
|
| }
|
|
|
| /* addl y,%ebx */
|
| if (delta > 0 && op == 0x81
|
| - && read_memory_unsigned_integer (pc + delta + 1, 1, byte_order)
|
| + && read_code_unsigned_integer (pc + delta + 1, 1, byte_order)
|
| == 0xc3)
|
| {
|
| pc += delta + 6;
|
| @@ -1628,25 +1736,25 @@ i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
|
| enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
| gdb_byte op;
|
|
|
| - if (target_read_memory (pc, &op, 1))
|
| + if (target_read_code (pc, &op, 1))
|
| return pc;
|
| if (op == 0xe8)
|
| {
|
| gdb_byte buf[4];
|
|
|
| - if (target_read_memory (pc + 1, buf, sizeof buf) == 0)
|
| + if (target_read_code (pc + 1, buf, sizeof buf) == 0)
|
| {
|
| /* Make sure address is computed correctly as a 32bit
|
| integer even if CORE_ADDR is 64 bit wide. */
|
| - struct minimal_symbol *s;
|
| + struct bound_minimal_symbol s;
|
| CORE_ADDR call_dest;
|
|
|
| call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
|
| call_dest = call_dest & 0xffffffffU;
|
| s = lookup_minimal_symbol_by_pc (call_dest);
|
| - if (s != NULL
|
| - && SYMBOL_LINKAGE_NAME (s) != NULL
|
| - && strcmp (SYMBOL_LINKAGE_NAME (s), "__main") == 0)
|
| + if (s.minsym != NULL
|
| + && SYMBOL_LINKAGE_NAME (s.minsym) != NULL
|
| + && strcmp (SYMBOL_LINKAGE_NAME (s.minsym), "__main") == 0)
|
| pc += 5;
|
| }
|
| }
|
| @@ -1727,7 +1835,7 @@ i386_frame_cache_1 (struct frame_info *this_frame,
|
| cache->saved_regs[I386_EIP_REGNUM] -= cache->base;
|
| }
|
| else if (cache->pc != 0
|
| - || target_read_memory (get_frame_pc (this_frame), buf, 1))
|
| + || target_read_code (get_frame_pc (this_frame), buf, 1))
|
| {
|
| /* We're in a known function, but did not find a frame
|
| setup. Assume that the function does not use %ebp.
|
| @@ -1751,7 +1859,8 @@ i386_frame_cache_1 (struct frame_info *this_frame,
|
| /* Saved stack pointer has been saved (but the SAVED_SP_REG
|
| register may be unavailable). */
|
| if (cache->saved_sp == 0
|
| - && frame_register_read (this_frame, cache->saved_sp_reg, buf))
|
| + && deprecated_frame_register_read (this_frame,
|
| + cache->saved_sp_reg, buf))
|
| cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
|
| }
|
| /* Now that we have the base address for the stack frame we can
|
| @@ -2044,7 +2153,7 @@ struct i386_insn i386_tramp_chain_on_stack_insns[] =
|
| /* Return whether PC points inside a stack trampoline. */
|
|
|
| static int
|
| -i386_in_stack_tramp_p (struct gdbarch *gdbarch, CORE_ADDR pc)
|
| +i386_in_stack_tramp_p (CORE_ADDR pc)
|
| {
|
| gdb_byte insn;
|
| const char *name;
|
| @@ -2073,8 +2182,7 @@ i386_stack_tramp_frame_sniffer (const struct frame_unwind *self,
|
| void **this_cache)
|
| {
|
| if (frame_relative_level (this_frame) == 0)
|
| - return i386_in_stack_tramp_p (get_frame_arch (this_frame),
|
| - get_frame_pc (this_frame));
|
| + return i386_in_stack_tramp_p (get_frame_pc (this_frame));
|
| else
|
| return 0;
|
| }
|
| @@ -2630,6 +2738,9 @@ i386_return_value (struct gdbarch *gdbarch, struct value *function,
|
| || code == TYPE_CODE_UNION
|
| || code == TYPE_CODE_ARRAY)
|
| && !i386_reg_struct_return_p (gdbarch, type))
|
| + /* Complex double and long double uses the struct return covention. */
|
| + || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 16)
|
| + || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 24)
|
| /* 128-bit decimal float uses the struct return convention. */
|
| || (code == TYPE_CODE_DECFLOAT && TYPE_LENGTH (type) == 16))
|
| {
|
| @@ -2698,6 +2809,43 @@ i387_ext_type (struct gdbarch *gdbarch)
|
| return tdep->i387_ext_type;
|
| }
|
|
|
| +/* Construct type for pseudo BND registers. We can't use
|
| + tdesc_find_type since a complement of one value has to be used
|
| + to describe the upper bound. */
|
| +
|
| +static struct type *
|
| +i386_bnd_type (struct gdbarch *gdbarch)
|
| +{
|
| + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| +
|
| +
|
| + if (!tdep->i386_bnd_type)
|
| + {
|
| + struct type *t, *bound_t;
|
| + const struct builtin_type *bt = builtin_type (gdbarch);
|
| +
|
| + /* The type we're building is described bellow: */
|
| +#if 0
|
| + struct __bound128
|
| + {
|
| + void *lbound;
|
| + void *ubound; /* One complement of raw ubound field. */
|
| + };
|
| +#endif
|
| +
|
| + t = arch_composite_type (gdbarch,
|
| + "__gdb_builtin_type_bound128", TYPE_CODE_STRUCT);
|
| +
|
| + append_composite_type_field (t, "lbound", bt->builtin_data_ptr);
|
| + append_composite_type_field (t, "ubound", bt->builtin_data_ptr);
|
| +
|
| + TYPE_NAME (t) = "builtin_type_bound128";
|
| + tdep->i386_bnd_type = t;
|
| + }
|
| +
|
| + return tdep->i386_bnd_type;
|
| +}
|
| +
|
| /* Construct vector type for pseudo YMM registers. We can't use
|
| tdesc_find_type since YMM isn't described in target description. */
|
|
|
| @@ -2799,6 +2947,8 @@ i386_mmx_type (struct gdbarch *gdbarch)
|
| struct type *
|
| i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
|
| {
|
| + if (i386_bnd_regnum_p (gdbarch, regnum))
|
| + return i386_bnd_type (gdbarch);
|
| if (i386_mmx_regnum_p (gdbarch, regnum))
|
| return i386_mmx_type (gdbarch);
|
| else if (i386_ymm_regnum_p (gdbarch, regnum))
|
| @@ -2865,8 +3015,31 @@ i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
|
| else
|
| {
|
| struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| + if (i386_bnd_regnum_p (gdbarch, regnum))
|
| + {
|
| + regnum -= tdep->bnd0_regnum;
|
|
|
| - if (i386_ymm_regnum_p (gdbarch, regnum))
|
| + /* Extract (always little endian). Read lower 128bits. */
|
| + status = regcache_raw_read (regcache,
|
| + I387_BND0R_REGNUM (tdep) + regnum,
|
| + raw_buf);
|
| + if (status != REG_VALID)
|
| + mark_value_bytes_unavailable (result_value, 0, 16);
|
| + else
|
| + {
|
| + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
| + LONGEST upper, lower;
|
| + int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
|
| +
|
| + lower = extract_unsigned_integer (raw_buf, 8, byte_order);
|
| + upper = extract_unsigned_integer (raw_buf + 8, 8, byte_order);
|
| + upper = ~upper;
|
| +
|
| + memcpy (buf, &lower, size);
|
| + memcpy (buf + size, &upper, size);
|
| + }
|
| + }
|
| + else if (i386_ymm_regnum_p (gdbarch, regnum))
|
| {
|
| regnum -= tdep->ymm0_regnum;
|
|
|
| @@ -2959,7 +3132,34 @@ i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
|
| {
|
| struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
|
| - if (i386_ymm_regnum_p (gdbarch, regnum))
|
| + if (i386_bnd_regnum_p (gdbarch, regnum))
|
| + {
|
| + ULONGEST upper, lower;
|
| + int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
|
| + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
| +
|
| + /* New values from input value. */
|
| + regnum -= tdep->bnd0_regnum;
|
| + lower = extract_unsigned_integer (buf, size, byte_order);
|
| + upper = extract_unsigned_integer (buf + size, size, byte_order);
|
| +
|
| + /* Fetching register buffer. */
|
| + regcache_raw_read (regcache,
|
| + I387_BND0R_REGNUM (tdep) + regnum,
|
| + raw_buf);
|
| +
|
| + upper = ~upper;
|
| +
|
| + /* Set register bits. */
|
| + memcpy (raw_buf, &lower, 8);
|
| + memcpy (raw_buf + 8, &upper, 8);
|
| +
|
| +
|
| + regcache_raw_write (regcache,
|
| + I387_BND0R_REGNUM (tdep) + regnum,
|
| + raw_buf);
|
| + }
|
| + else if (i386_ymm_regnum_p (gdbarch, regnum))
|
| {
|
| regnum -= tdep->ymm0_regnum;
|
|
|
| @@ -3299,7 +3499,7 @@ i386_pe_skip_trampoline_code (struct frame_info *frame,
|
| unsigned long indirect =
|
| read_memory_unsigned_integer (pc + 2, 4, byte_order);
|
| struct minimal_symbol *indsym =
|
| - indirect ? lookup_minimal_symbol_by_pc (indirect) : 0;
|
| + indirect ? lookup_minimal_symbol_by_pc (indirect).minsym : 0;
|
| const char *symname = indsym ? SYMBOL_LINKAGE_NAME (indsym) : 0;
|
|
|
| if (symname)
|
| @@ -3361,11 +3561,9 @@ i386_svr4_sigtramp_p (struct frame_info *this_frame)
|
| CORE_ADDR pc = get_frame_pc (this_frame);
|
| const char *name;
|
|
|
| - /* UnixWare uses _sigacthandler. The origin of the other symbols is
|
| - currently unknown. */
|
| + /* The origin of these symbols is currently unknown. */
|
| find_pc_partial_function (pc, &name, NULL, NULL);
|
| return (name && (strcmp ("_sigreturn", name) == 0
|
| - || strcmp ("_sigacthandler", name) == 0
|
| || strcmp ("sigvechandler", name) == 0));
|
| }
|
|
|
| @@ -3443,6 +3641,7 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| char *regname;
|
| int len;
|
| struct stoken str;
|
| + char *endp;
|
|
|
| got_minus[0] = 0;
|
| if (*s == '+')
|
| @@ -3453,7 +3652,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| got_minus[0] = 1;
|
| }
|
|
|
| - displacements[0] = strtol (s, (char **) &s, 10);
|
| + displacements[0] = strtol (s, &endp, 10);
|
| + s = endp;
|
|
|
| if (*s != '+' && *s != '-')
|
| {
|
| @@ -3470,7 +3670,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| got_minus[1] = 1;
|
| }
|
|
|
| - displacements[1] = strtol (s, (char **) &s, 10);
|
| + displacements[1] = strtol (s, &endp, 10);
|
| + s = endp;
|
|
|
| if (*s != '+' && *s != '-')
|
| {
|
| @@ -3487,7 +3688,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| got_minus[2] = 1;
|
| }
|
|
|
| - displacements[2] = strtol (s, (char **) &s, 10);
|
| + displacements[2] = strtol (s, &endp, 10);
|
| + s = endp;
|
|
|
| if (*s != '(' || s[1] != '%')
|
| break;
|
| @@ -3577,7 +3779,12 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| break;
|
|
|
| if (isdigit (*s))
|
| - offset = strtol (s, (char **) &s, 10);
|
| + {
|
| + char *endp;
|
| +
|
| + offset = strtol (s, &endp, 10);
|
| + s = endp;
|
| + }
|
|
|
| if (*s != '(' || s[1] != '%')
|
| break;
|
| @@ -3624,6 +3831,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
|
|
| if (*s == ',')
|
| {
|
| + char *endp;
|
| +
|
| ++s;
|
| if (*s == '+')
|
| ++s;
|
| @@ -3633,7 +3842,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
|
| size_minus = 1;
|
| }
|
|
|
| - size = strtol (s, (char **) &s, 10);
|
| + size = strtol (s, &endp, 10);
|
| + s = endp;
|
|
|
| if (*s != ')')
|
| break;
|
| @@ -3804,7 +4014,8 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
|
| {
|
| const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
|
| - ymm_regnum_p, ymmh_regnum_p;
|
| + ymm_regnum_p, ymmh_regnum_p, bndr_regnum_p, bnd_regnum_p,
|
| + mpx_ctrl_regnum_p;
|
|
|
| /* Don't include pseudo registers, except for MMX, in any register
|
| groups. */
|
| @@ -3849,13 +4060,31 @@ i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
|
| || ymmh_regnum_p))
|
| return 0;
|
|
|
| + bnd_regnum_p = i386_bnd_regnum_p (gdbarch, regnum);
|
| + if (group == all_reggroup
|
| + && ((bnd_regnum_p && (tdep->xcr0 & I386_XSTATE_MPX_MASK))))
|
| + return bnd_regnum_p;
|
| +
|
| + bndr_regnum_p = i386_bndr_regnum_p (gdbarch, regnum);
|
| + if (group == all_reggroup
|
| + && ((bndr_regnum_p && (tdep->xcr0 & I386_XSTATE_MPX_MASK))))
|
| + return 0;
|
| +
|
| + mpx_ctrl_regnum_p = i386_mpx_ctrl_regnum_p (gdbarch, regnum);
|
| + if (group == all_reggroup
|
| + && ((mpx_ctrl_regnum_p && (tdep->xcr0 & I386_XSTATE_MPX_MASK))))
|
| + return mpx_ctrl_regnum_p;
|
| +
|
| if (group == general_reggroup)
|
| return (!fp_regnum_p
|
| && !mmx_regnum_p
|
| && !mxcsr_regnum_p
|
| && !xmm_regnum_p
|
| && !ymm_regnum_p
|
| - && !ymmh_regnum_p);
|
| + && !ymmh_regnum_p
|
| + && !bndr_regnum_p
|
| + && !bnd_regnum_p
|
| + && !mpx_ctrl_regnum_p);
|
|
|
| return default_register_reggroup_p (gdbarch, regnum, group);
|
| }
|
| @@ -3933,22 +4162,17 @@ struct i386_record_s
|
| const int *regmap;
|
| };
|
|
|
| -/* Parse "modrm" part in current memory address that irp->addr point to
|
| - Return -1 if something wrong. */
|
| +/* Parse the "modrm" part of the memory address irp->addr points at.
|
| + Returns -1 if something goes wrong, 0 otherwise. */
|
|
|
| static int
|
| i386_record_modrm (struct i386_record_s *irp)
|
| {
|
| struct gdbarch *gdbarch = irp->gdbarch;
|
|
|
| - if (target_read_memory (irp->addr, &irp->modrm, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr %s len = 1.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, &irp->modrm, 1))
|
| + return -1;
|
| +
|
| irp->addr++;
|
| irp->mod = (irp->modrm >> 6) & 3;
|
| irp->reg = (irp->modrm >> 3) & 7;
|
| @@ -3957,9 +4181,8 @@ i386_record_modrm (struct i386_record_s *irp)
|
| return 0;
|
| }
|
|
|
| -/* Get the memory address that current instruction write to and set it to
|
| - the argument "addr".
|
| - Return -1 if something wrong. */
|
| +/* Extract the memory address that the current instruction writes to,
|
| + and return it in *ADDR. Return -1 if something goes wrong. */
|
|
|
| static int
|
| i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| @@ -3982,14 +4205,8 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| if (base == 4)
|
| {
|
| havesib = 1;
|
| - if (target_read_memory (irp->addr, &byte, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 1.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, &byte, 1))
|
| + return -1;
|
| irp->addr++;
|
| scale = (byte >> 6) & 3;
|
| index = ((byte >> 3) & 7) | irp->rex_x;
|
| @@ -4003,14 +4220,8 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| if ((base & 7) == 5)
|
| {
|
| base = 0xff;
|
| - if (target_read_memory (irp->addr, buf, 4))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading "
|
| - "memory at addr %s len = 4.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 4))
|
| + return -1;
|
| irp->addr += 4;
|
| *addr = extract_signed_integer (buf, 4, byte_order);
|
| if (irp->regmap[X86_RECORD_R8_REGNUM] && !havesib)
|
| @@ -4018,26 +4229,14 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| }
|
| break;
|
| case 1:
|
| - if (target_read_memory (irp->addr, buf, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 1.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 1))
|
| + return -1;
|
| irp->addr++;
|
| *addr = (int8_t) buf[0];
|
| break;
|
| case 2:
|
| - if (target_read_memory (irp->addr, buf, 4))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 4.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 4))
|
| + return -1;
|
| *addr = extract_signed_integer (buf, 4, byte_order);
|
| irp->addr += 4;
|
| break;
|
| @@ -4076,14 +4275,8 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| case 0:
|
| if (irp->rm == 6)
|
| {
|
| - if (target_read_memory (irp->addr, buf, 2))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading "
|
| - "memory at addr %s len = 2.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 2))
|
| + return -1;
|
| irp->addr += 2;
|
| *addr = extract_signed_integer (buf, 2, byte_order);
|
| irp->rm = 0;
|
| @@ -4091,26 +4284,14 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| }
|
| break;
|
| case 1:
|
| - if (target_read_memory (irp->addr, buf, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 1.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 1))
|
| + return -1;
|
| irp->addr++;
|
| *addr = (int8_t) buf[0];
|
| break;
|
| case 2:
|
| - if (target_read_memory (irp->addr, buf, 2))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 2.\n"),
|
| - paddress (gdbarch, irp->addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, irp->addr, buf, 2))
|
| + return -1;
|
| irp->addr += 2;
|
| *addr = extract_signed_integer (buf, 2, byte_order);
|
| break;
|
| @@ -4190,9 +4371,9 @@ i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
|
| return 0;
|
| }
|
|
|
| -/* Record the value of the memory that willbe changed in current instruction
|
| - to "record_arch_list".
|
| - Return -1 if something wrong. */
|
| +/* Record the address and contents of the memory that will be changed
|
| + by the current instruction. Return -1 if something goes wrong, 0
|
| + otherwise. */
|
|
|
| static int
|
| i386_record_lea_modrm (struct i386_record_s *irp)
|
| @@ -4202,7 +4383,7 @@ i386_record_lea_modrm (struct i386_record_s *irp)
|
|
|
| if (irp->override >= 0)
|
| {
|
| - if (record_memory_query)
|
| + if (record_full_memory_query)
|
| {
|
| int q;
|
|
|
| @@ -4223,27 +4404,27 @@ Do you want to stop the program?"),
|
| if (i386_record_lea_modrm_addr (irp, &addr))
|
| return -1;
|
|
|
| - if (record_arch_list_add_mem (addr, 1 << irp->ot))
|
| + if (record_full_arch_list_add_mem (addr, 1 << irp->ot))
|
| return -1;
|
|
|
| return 0;
|
| }
|
|
|
| -/* Record the push operation to "record_arch_list".
|
| - Return -1 if something wrong. */
|
| +/* Record the effects of a push operation. Return -1 if something
|
| + goes wrong, 0 otherwise. */
|
|
|
| static int
|
| i386_record_push (struct i386_record_s *irp, int size)
|
| {
|
| ULONGEST addr;
|
|
|
| - if (record_arch_list_add_reg (irp->regcache,
|
| - irp->regmap[X86_RECORD_RESP_REGNUM]))
|
| + if (record_full_arch_list_add_reg (irp->regcache,
|
| + irp->regmap[X86_RECORD_RESP_REGNUM]))
|
| return -1;
|
| regcache_raw_read_unsigned (irp->regcache,
|
| irp->regmap[X86_RECORD_RESP_REGNUM],
|
| &addr);
|
| - if (record_arch_list_add_mem ((CORE_ADDR) addr - size, size))
|
| + if (record_full_arch_list_add_mem ((CORE_ADDR) addr - size, size))
|
| return -1;
|
|
|
| return 0;
|
| @@ -4255,9 +4436,9 @@ i386_record_push (struct i386_record_s *irp, int size)
|
| #define I386_SAVE_FPU_ENV 0xfffe
|
| #define I386_SAVE_FPU_ENV_REG_STACK 0xffff
|
|
|
| -/* Record the value of floating point registers which will be changed
|
| - by the current instruction to "record_arch_list". Return -1 if
|
| - something is wrong. */
|
| +/* Record the values of the floating point registers which will be
|
| + changed by the current instruction. Returns -1 if something is
|
| + wrong, 0 otherwise. */
|
|
|
| static int i386_record_floats (struct gdbarch *gdbarch,
|
| struct i386_record_s *ir,
|
| @@ -4275,7 +4456,7 @@ static int i386_record_floats (struct gdbarch *gdbarch,
|
| {
|
| for (i = I387_ST0_REGNUM (tdep); i <= I387_ST0_REGNUM (tdep) + 7; i++)
|
| {
|
| - if (record_arch_list_add_reg (ir->regcache, i))
|
| + if (record_full_arch_list_add_reg (ir->regcache, i))
|
| return -1;
|
| }
|
| }
|
| @@ -4283,7 +4464,7 @@ static int i386_record_floats (struct gdbarch *gdbarch,
|
| {
|
| for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
|
| {
|
| - if (record_arch_list_add_reg (ir->regcache, i))
|
| + if (record_full_arch_list_add_reg (ir->regcache, i))
|
| return -1;
|
| }
|
| }
|
| @@ -4291,14 +4472,14 @@ static int i386_record_floats (struct gdbarch *gdbarch,
|
| {
|
| for (i = I387_ST0_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
|
| {
|
| - if (record_arch_list_add_reg (ir->regcache, i))
|
| + if (record_full_arch_list_add_reg (ir->regcache, i))
|
| return -1;
|
| }
|
| }
|
| else if ((iregnum >= I387_ST0_REGNUM (tdep)) &&
|
| (iregnum <= I387_FOP_REGNUM (tdep)))
|
| {
|
| - if (record_arch_list_add_reg (ir->regcache,iregnum))
|
| + if (record_full_arch_list_add_reg (ir->regcache,iregnum))
|
| return -1;
|
| }
|
| else
|
| @@ -4310,19 +4491,19 @@ static int i386_record_floats (struct gdbarch *gdbarch,
|
| {
|
| for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
|
| {
|
| - if (record_arch_list_add_reg (ir->regcache, i))
|
| + if (record_full_arch_list_add_reg (ir->regcache, i))
|
| return -1;
|
| }
|
| }
|
| return 0;
|
| }
|
|
|
| -/* Parse the current instruction and record the values of the registers and
|
| - memory that will be changed in current instruction to "record_arch_list".
|
| - Return -1 if something wrong. */
|
| +/* Parse the current instruction, and record the values of the
|
| + registers and memory that will be changed by the current
|
| + instruction. Returns -1 if something goes wrong, 0 otherwise. */
|
|
|
| -#define I386_RECORD_ARCH_LIST_ADD_REG(regnum) \
|
| - record_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])
|
| +#define I386_RECORD_FULL_ARCH_LIST_ADD_REG(regnum) \
|
| + record_full_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])
|
|
|
| int
|
| i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| @@ -4337,7 +4518,6 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| gdb_byte buf[MAX_REGISTER_SIZE];
|
| struct i386_record_s ir;
|
| struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
| - int rex = 0;
|
| uint8_t rex_w = -1;
|
| uint8_t rex_r = 0;
|
|
|
| @@ -4360,14 +4540,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| /* prefixes */
|
| while (1)
|
| {
|
| - if (target_read_memory (ir.addr, &opcode8, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr %s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
|
| + return -1;
|
| ir.addr++;
|
| switch (opcode8) /* Instruction prefixes */
|
| {
|
| @@ -4423,7 +4597,6 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
|
| {
|
| /* REX */
|
| - rex = 1;
|
| rex_w = (opcode8 >> 3) & 1;
|
| rex_r = (opcode8 & 0x4) << 1;
|
| ir.rex_x = (opcode8 & 0x2) << 2;
|
| @@ -4458,14 +4631,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| switch (opcode)
|
| {
|
| case 0x0f:
|
| - if (target_read_memory (ir.addr, &opcode8, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr %s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
|
| + return -1;
|
| ir.addr++;
|
| opcode = (uint32_t) opcode8 | 0x0f00;
|
| goto reswitch;
|
| @@ -4541,7 +4708,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| break;
|
| case 1: /* OP Gv, Ev */
|
| @@ -4550,14 +4717,14 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.reg |= rex_r;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| break;
|
| case 2: /* OP A, Iv */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| break;
|
| }
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x80: /* GRP1 */
|
| @@ -4584,9 +4751,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| return -1;
|
| }
|
| else
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x40: /* inc */
|
| @@ -4607,8 +4774,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| case 0x4e:
|
| case 0x4f:
|
|
|
| - I386_RECORD_ARCH_LIST_ADD_REG (opcode & 7);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (opcode & 7);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xf6: /* GRP3 */
|
| @@ -4626,7 +4793,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| switch (ir.reg)
|
| {
|
| case 0: /* test */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 2: /* not */
|
| case 3: /* neg */
|
| @@ -4640,19 +4807,19 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| if (ir.reg == 3) /* neg */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 4: /* mul */
|
| case 5: /* imul */
|
| case 6: /* div */
|
| case 7: /* idiv */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| if (ir.ot != OT_BYTE)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| default:
|
| ir.addr -= 2;
|
| @@ -4690,26 +4857,26 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 2: /* call */
|
| if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
|
| ir.dflag = 2;
|
| if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 3: /* lcall */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 4: /* jmp */
|
| case 5: /* ljmp */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 6: /* push */
|
| if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
|
| @@ -4729,16 +4896,16 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| case 0x85:
|
| case 0xa8:
|
| case 0xa9:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x98: /* CWDE/CBW */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| break;
|
|
|
| case 0x99: /* CDQ/CWD */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| break;
|
|
|
| case 0x0faf: /* imul */
|
| @@ -4754,8 +4921,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.reg |= rex_r;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fc0: /* xadd */
|
| @@ -4771,10 +4938,10 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| {
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| else
|
| {
|
| @@ -4782,9 +4949,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| return -1;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fb0: /* cmpxchg */
|
| @@ -4798,18 +4965,18 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| if (ir.mod == 3)
|
| {
|
| ir.reg |= rex_r;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| }
|
| else
|
| {
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fc7: /* cmpxchg8b */
|
| @@ -4821,11 +4988,11 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| opcode = opcode << 8 | ir.modrm;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x50: /* push */
|
| @@ -4886,8 +5053,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| case 0x5d:
|
| case 0x5e:
|
| case 0x5f:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
|
| break;
|
|
|
| case 0x61: /* popa */
|
| @@ -4899,7 +5066,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| for (regnum = X86_RECORD_REAX_REGNUM;
|
| regnum <= X86_RECORD_REDI_REGNUM;
|
| regnum++)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (regnum);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
|
| break;
|
|
|
| case 0x8f: /* pop */
|
| @@ -4910,18 +5077,18 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| else
|
| {
|
| ir.popl_esp_hack = 1 << ir.ot;
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| break;
|
|
|
| case 0xc8: /* enter */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
|
| ir.dflag = 2;
|
| if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
|
| @@ -4929,8 +5096,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| break;
|
|
|
| case 0xc9: /* leave */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| break;
|
|
|
| case 0x07: /* pop es */
|
| @@ -4939,9 +5106,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x17: /* pop ss */
|
| @@ -4950,9 +5117,9 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x1f: /* pop ds */
|
| @@ -4961,21 +5128,21 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fa1: /* pop fs */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fa9: /* pop gs */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x88: /* mov */
|
| @@ -5003,7 +5170,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| break;
|
|
|
| @@ -5018,7 +5185,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.reg |= rex_r;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| break;
|
|
|
| case 0x8c: /* mov seg */
|
| @@ -5032,7 +5199,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| }
|
|
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| else
|
| {
|
| ir.ot = OT_WORD;
|
| @@ -5067,8 +5234,8 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| goto no_support;
|
| break;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (regnum);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fb6: /* movzbS */
|
| @@ -5077,7 +5244,7 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| case 0x0fbf: /* movswS */
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| break;
|
|
|
| case 0x8d: /* lea */
|
| @@ -5093,21 +5260,21 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
|
| ir.reg |= rex_r;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| break;
|
|
|
| case 0xa0: /* mov EAX */
|
| case 0xa1:
|
|
|
| case 0xd7: /* xlat */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| break;
|
|
|
| case 0xa2: /* mov EAX */
|
| case 0xa3:
|
| if (ir.override >= 0)
|
| {
|
| - if (record_memory_query)
|
| + if (record_full_memory_query)
|
| {
|
| int q;
|
|
|
| @@ -5130,44 +5297,26 @@ Do you want to stop the program?"),
|
| ir.ot = ir.dflag + OT_WORD;
|
| if (ir.aflag == 2)
|
| {
|
| - if (target_read_memory (ir.addr, buf, 8))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading "
|
| - "memory at addr 0x%s len = 8.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, buf, 8))
|
| + return -1;
|
| ir.addr += 8;
|
| addr = extract_unsigned_integer (buf, 8, byte_order);
|
| }
|
| else if (ir.aflag)
|
| {
|
| - if (target_read_memory (ir.addr, buf, 4))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading "
|
| - "memory at addr 0x%s len = 4.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, buf, 4))
|
| + return -1;
|
| ir.addr += 4;
|
| addr = extract_unsigned_integer (buf, 4, byte_order);
|
| }
|
| else
|
| {
|
| - if (target_read_memory (ir.addr, buf, 2))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading "
|
| - "memory at addr 0x%s len = 2.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, buf, 2))
|
| + return -1;
|
| ir.addr += 2;
|
| addr = extract_unsigned_integer (buf, 2, byte_order);
|
| }
|
| - if (record_arch_list_add_mem (addr, 1 << ir.ot))
|
| + if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
|
| return -1;
|
| }
|
| break;
|
| @@ -5180,9 +5329,9 @@ Do you want to stop the program?"),
|
| case 0xb5:
|
| case 0xb6:
|
| case 0xb7:
|
| - I386_RECORD_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
|
| - ? ((opcode & 0x7) | ir.rex_b)
|
| - : ((opcode & 0x7) & 0x3));
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
|
| + ? ((opcode & 0x7) | ir.rex_b)
|
| + : ((opcode & 0x7) & 0x3));
|
| break;
|
|
|
| case 0xb8: /* mov R, Iv */
|
| @@ -5193,7 +5342,7 @@ Do you want to stop the program?"),
|
| case 0xbd:
|
| case 0xbe:
|
| case 0xbf:
|
| - I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
|
| break;
|
|
|
| case 0x91: /* xchg R, EAX */
|
| @@ -5203,8 +5352,8 @@ Do you want to stop the program?"),
|
| case 0x95:
|
| case 0x96:
|
| case 0x97:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (opcode & 0x7);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (opcode & 0x7);
|
| break;
|
|
|
| case 0x86: /* xchg Ev, Gv */
|
| @@ -5220,7 +5369,7 @@ Do you want to stop the program?"),
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| else
|
| {
|
| @@ -5230,7 +5379,7 @@ Do you want to stop the program?"),
|
| ir.reg |= rex_r;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| break;
|
|
|
| case 0xc4: /* les Gv */
|
| @@ -5273,9 +5422,9 @@ Do you want to stop the program?"),
|
| regnum = X86_RECORD_GS_REGNUM;
|
| break;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (regnum);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xc0: /* shifts */
|
| @@ -5300,9 +5449,9 @@ Do you want to stop the program?"),
|
| ir.rm |= ir.rex_b;
|
| if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
|
| ir.rm &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fa4:
|
| @@ -5313,7 +5462,7 @@ Do you want to stop the program?"),
|
| return -1;
|
| if (ir.mod == 3)
|
| {
|
| - if (record_arch_list_add_reg (ir.regcache, ir.rm))
|
| + if (record_full_arch_list_add_reg (ir.regcache, ir.rm))
|
| return -1;
|
| }
|
| else
|
| @@ -5416,17 +5565,17 @@ Do you want to stop the program?"),
|
| switch (ir.reg >> 4)
|
| {
|
| case 0:
|
| - if (record_arch_list_add_mem (addr64, 4))
|
| + if (record_full_arch_list_add_mem (addr64, 4))
|
| return -1;
|
| break;
|
| case 2:
|
| - if (record_arch_list_add_mem (addr64, 8))
|
| + if (record_full_arch_list_add_mem (addr64, 8))
|
| return -1;
|
| break;
|
| case 3:
|
| break;
|
| default:
|
| - if (record_arch_list_add_mem (addr64, 2))
|
| + if (record_full_arch_list_add_mem (addr64, 2))
|
| return -1;
|
| break;
|
| }
|
| @@ -5435,7 +5584,7 @@ Do you want to stop the program?"),
|
| switch (ir.reg >> 4)
|
| {
|
| case 0:
|
| - if (record_arch_list_add_mem (addr64, 4))
|
| + if (record_full_arch_list_add_mem (addr64, 4))
|
| return -1;
|
| if (3 == (ir.reg & 7))
|
| {
|
| @@ -5446,7 +5595,7 @@ Do you want to stop the program?"),
|
| }
|
| break;
|
| case 1:
|
| - if (record_arch_list_add_mem (addr64, 4))
|
| + if (record_full_arch_list_add_mem (addr64, 4))
|
| return -1;
|
| if ((3 == (ir.reg & 7))
|
| || (5 == (ir.reg & 7))
|
| @@ -5459,7 +5608,7 @@ Do you want to stop the program?"),
|
| }
|
| break;
|
| case 2:
|
| - if (record_arch_list_add_mem (addr64, 8))
|
| + if (record_full_arch_list_add_mem (addr64, 8))
|
| return -1;
|
| if (3 == (ir.reg & 7))
|
| {
|
| @@ -5479,7 +5628,7 @@ Do you want to stop the program?"),
|
| }
|
| /* Fall through */
|
| default:
|
| - if (record_arch_list_add_mem (addr64, 2))
|
| + if (record_full_arch_list_add_mem (addr64, 2))
|
| return -1;
|
| break;
|
| }
|
| @@ -5506,18 +5655,18 @@ Do you want to stop the program?"),
|
| case 0x0e:
|
| if (ir.dflag)
|
| {
|
| - if (record_arch_list_add_mem (addr64, 28))
|
| + if (record_full_arch_list_add_mem (addr64, 28))
|
| return -1;
|
| }
|
| else
|
| {
|
| - if (record_arch_list_add_mem (addr64, 14))
|
| + if (record_full_arch_list_add_mem (addr64, 14))
|
| return -1;
|
| }
|
| break;
|
| case 0x0f:
|
| case 0x2f:
|
| - if (record_arch_list_add_mem (addr64, 2))
|
| + if (record_full_arch_list_add_mem (addr64, 2))
|
| return -1;
|
| /* Insn fstp, fbstp. */
|
| if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
|
| @@ -5525,23 +5674,23 @@ Do you want to stop the program?"),
|
| break;
|
| case 0x1f:
|
| case 0x3e:
|
| - if (record_arch_list_add_mem (addr64, 10))
|
| + if (record_full_arch_list_add_mem (addr64, 10))
|
| return -1;
|
| break;
|
| case 0x2e:
|
| if (ir.dflag)
|
| {
|
| - if (record_arch_list_add_mem (addr64, 28))
|
| + if (record_full_arch_list_add_mem (addr64, 28))
|
| return -1;
|
| addr64 += 28;
|
| }
|
| else
|
| {
|
| - if (record_arch_list_add_mem (addr64, 14))
|
| + if (record_full_arch_list_add_mem (addr64, 14))
|
| return -1;
|
| addr64 += 14;
|
| }
|
| - if (record_arch_list_add_mem (addr64, 80))
|
| + if (record_full_arch_list_add_mem (addr64, 80))
|
| return -1;
|
| /* Insn fsave. */
|
| if (i386_record_floats (gdbarch, &ir,
|
| @@ -5549,7 +5698,7 @@ Do you want to stop the program?"),
|
| return -1;
|
| break;
|
| case 0x3f:
|
| - if (record_arch_list_add_mem (addr64, 8))
|
| + if (record_full_arch_list_add_mem (addr64, 8))
|
| return -1;
|
| /* Insn fistp. */
|
| if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
|
| @@ -5755,7 +5904,8 @@ Do you want to stop the program?"),
|
| case 0xdf:
|
| if (0xe0 == ir.modrm)
|
| {
|
| - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM))
|
| + if (record_full_arch_list_add_reg (ir.regcache,
|
| + I386_EAX_REGNUM))
|
| return -1;
|
| }
|
| else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
|
| @@ -5798,7 +5948,7 @@ Do you want to stop the program?"),
|
| if (ir.aflag && (es != ds))
|
| {
|
| /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
|
| - if (record_memory_query)
|
| + if (record_full_memory_query)
|
| {
|
| int q;
|
|
|
| @@ -5815,59 +5965,59 @@ Do you want to stop the program?"),
|
| }
|
| else
|
| {
|
| - if (record_arch_list_add_mem (addr, 1 << ir.ot))
|
| + if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
|
| return -1;
|
| }
|
|
|
| if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| if (opcode == 0xa4 || opcode == 0xa5)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| }
|
| break;
|
|
|
| case 0xa6: /* cmpsS */
|
| case 0xa7:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xac: /* lodsS */
|
| case 0xad:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xae: /* scasS */
|
| case 0xaf:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x6e: /* outsS */
|
| case 0x6f:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xe4: /* port I/O */
|
| case 0xe5:
|
| case 0xec:
|
| case 0xed:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| break;
|
|
|
| case 0xe6:
|
| @@ -5879,16 +6029,16 @@ Do you want to stop the program?"),
|
| /* control */
|
| case 0xc2: /* ret im */
|
| case 0xc3: /* ret */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xca: /* lret im */
|
| case 0xcb: /* lret */
|
| case 0xcf: /* iret */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xe8: /* call im */
|
| @@ -5904,7 +6054,7 @@ Do you want to stop the program?"),
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
|
| if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
|
| return -1;
|
| break;
|
| @@ -5962,13 +6112,13 @@ Do you want to stop the program?"),
|
| case 0x0f9d:
|
| case 0x0f9e:
|
| case 0x0f9f:
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| ir.ot = OT_BYTE;
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
|
| - : (ir.rm & 0x3));
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
|
| + : (ir.rm & 0x3));
|
| else
|
| {
|
| if (i386_record_lea_modrm (&ir))
|
| @@ -5997,12 +6147,12 @@ Do you want to stop the program?"),
|
| ir.reg |= rex_r;
|
| if (ir.dflag == OT_BYTE)
|
| ir.reg &= 0x3;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| break;
|
|
|
| /* flags */
|
| case 0x9c: /* pushf */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
|
| ir.dflag = 2;
|
| if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
|
| @@ -6010,8 +6160,8 @@ Do you want to stop the program?"),
|
| break;
|
|
|
| case 0x9d: /* popf */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x9e: /* sahf */
|
| @@ -6026,7 +6176,7 @@ Do you want to stop the program?"),
|
| case 0xf9: /* stc */
|
| case 0xfc: /* cld */
|
| case 0xfd: /* std */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x9f: /* lahf */
|
| @@ -6035,8 +6185,8 @@ Do you want to stop the program?"),
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| break;
|
|
|
| /* bit operations */
|
| @@ -6053,18 +6203,18 @@ Do you want to stop the program?"),
|
| if (ir.reg != 4)
|
| {
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| else
|
| {
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| }
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fa3: /* bt Gv, Ev */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fab: /* bts */
|
| @@ -6074,7 +6224,7 @@ Do you want to stop the program?"),
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| else
|
| {
|
| uint64_t addr64;
|
| @@ -6095,18 +6245,18 @@ Do you want to stop the program?"),
|
| addr64 += ((int64_t) addr >> 6) << 6;
|
| break;
|
| }
|
| - if (record_arch_list_add_mem (addr64, 1 << ir.ot))
|
| + if (record_full_arch_list_add_mem (addr64, 1 << ir.ot))
|
| return -1;
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0fbc: /* bsf */
|
| case 0x0fbd: /* bsr */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| /* bcd */
|
| @@ -6121,8 +6271,8 @@ Do you want to stop the program?"),
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| /* misc */
|
| @@ -6135,14 +6285,8 @@ Do you want to stop the program?"),
|
| break;
|
|
|
| case 0x9b: /* fwait */
|
| - if (target_read_memory (ir.addr, &opcode8, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr 0x%s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
|
| + return -1;
|
| opcode = (uint32_t) opcode8;
|
| ir.addr++;
|
| goto reswitch;
|
| @@ -6161,14 +6305,8 @@ Do you want to stop the program?"),
|
| {
|
| int ret;
|
| uint8_t interrupt;
|
| - if (target_read_memory (ir.addr, &interrupt, 1))
|
| - {
|
| - if (record_debug)
|
| - printf_unfiltered (_("Process record: error reading memory "
|
| - "at addr %s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &interrupt, 1))
|
| + return -1;
|
| ir.addr++;
|
| if (interrupt != 0x80
|
| || tdep->i386_intx80_record == NULL)
|
| @@ -6212,7 +6350,7 @@ Do you want to stop the program?"),
|
| case 0x0fcd:
|
| case 0x0fce:
|
| case 0x0fcf:
|
| - I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b);
|
| break;
|
|
|
| case 0xd6: /* salc */
|
| @@ -6221,16 +6359,16 @@ Do you want to stop the program?"),
|
| ir.addr -= 1;
|
| goto no_support;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0xe0: /* loopnz */
|
| case 0xe1: /* loopz */
|
| case 0xe2: /* loop */
|
| case 0xe3: /* jecxz */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0f30: /* wrmsr */
|
| @@ -6248,8 +6386,8 @@ Do you want to stop the program?"),
|
| break;
|
|
|
| case 0x0f31: /* rdtsc */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| break;
|
|
|
| case 0x0f34: /* sysenter */
|
| @@ -6304,10 +6442,10 @@ Do you want to stop the program?"),
|
| break;
|
|
|
| case 0x0fa2: /* cpuid */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
|
| break;
|
|
|
| case 0xf4: /* hlt */
|
| @@ -6325,7 +6463,7 @@ Do you want to stop the program?"),
|
| case 0: /* sldt */
|
| case 1: /* str */
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| else
|
| {
|
| ir.ot = OT_WORD;
|
| @@ -6338,7 +6476,7 @@ Do you want to stop the program?"),
|
| break;
|
| case 4: /* verr */
|
| case 5: /* verw */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| default:
|
| ir.addr -= 3;
|
| @@ -6365,7 +6503,7 @@ Do you want to stop the program?"),
|
| }
|
| if (ir.override >= 0)
|
| {
|
| - if (record_memory_query)
|
| + if (record_full_memory_query)
|
| {
|
| int q;
|
|
|
| @@ -6384,17 +6522,17 @@ Do you want to stop the program?"),
|
| {
|
| if (i386_record_lea_modrm_addr (&ir, &addr64))
|
| return -1;
|
| - if (record_arch_list_add_mem (addr64, 2))
|
| + if (record_full_arch_list_add_mem (addr64, 2))
|
| return -1;
|
| addr64 += 2;
|
| if (ir.regmap[X86_RECORD_R8_REGNUM])
|
| {
|
| - if (record_arch_list_add_mem (addr64, 8))
|
| + if (record_full_arch_list_add_mem (addr64, 8))
|
| return -1;
|
| }
|
| else
|
| {
|
| - if (record_arch_list_add_mem (addr64, 4))
|
| + if (record_full_arch_list_add_mem (addr64, 4))
|
| return -1;
|
| }
|
| }
|
| @@ -6408,7 +6546,7 @@ Do you want to stop the program?"),
|
| case 0: /* monitor */
|
| break;
|
| case 1: /* mwait */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| default:
|
| ir.addr -= 3;
|
| @@ -6422,7 +6560,7 @@ Do you want to stop the program?"),
|
| /* sidt */
|
| if (ir.override >= 0)
|
| {
|
| - if (record_memory_query)
|
| + if (record_full_memory_query)
|
| {
|
| int q;
|
|
|
| @@ -6443,17 +6581,17 @@ Do you want to stop the program?"),
|
|
|
| if (i386_record_lea_modrm_addr (&ir, &addr64))
|
| return -1;
|
| - if (record_arch_list_add_mem (addr64, 2))
|
| + if (record_full_arch_list_add_mem (addr64, 2))
|
| return -1;
|
| addr64 += 2;
|
| if (ir.regmap[X86_RECORD_R8_REGNUM])
|
| {
|
| - if (record_arch_list_add_mem (addr64, 8))
|
| + if (record_full_arch_list_add_mem (addr64, 8))
|
| return -1;
|
| }
|
| else
|
| {
|
| - if (record_arch_list_add_mem (addr64, 4))
|
| + if (record_full_arch_list_add_mem (addr64, 4))
|
| return -1;
|
| }
|
| }
|
| @@ -6465,8 +6603,8 @@ Do you want to stop the program?"),
|
| /* xgetbv */
|
| if (ir.rm == 0)
|
| {
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| break;
|
| }
|
| /* xsetbv */
|
| @@ -6484,7 +6622,7 @@ Do you want to stop the program?"),
|
| case 4: /* smsw */
|
| if (ir.mod == 3)
|
| {
|
| - if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b))
|
| + if (record_full_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b))
|
| return -1;
|
| }
|
| else
|
| @@ -6493,16 +6631,16 @@ Do you want to stop the program?"),
|
| if (i386_record_lea_modrm (&ir))
|
| return -1;
|
| }
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 6: /* lmsw */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| case 7: /* invlpg */
|
| if (ir.mod == 3)
|
| {
|
| if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM])
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
|
| else
|
| {
|
| ir.addr -= 3;
|
| @@ -6511,7 +6649,7 @@ Do you want to stop the program?"),
|
| }
|
| }
|
| else
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
| default:
|
| ir.addr -= 3;
|
| @@ -6530,8 +6668,8 @@ Do you want to stop the program?"),
|
| return -1;
|
| if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
|
| {
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
|
| - ? (ir.reg | rex_r) : ir.rm);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
|
| + ? (ir.reg | rex_r) : ir.rm);
|
| }
|
| else
|
| {
|
| @@ -6540,15 +6678,15 @@ Do you want to stop the program?"),
|
| return -1;
|
| }
|
| if (!ir.regmap[X86_RECORD_R8_REGNUM])
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0f02: /* lar */
|
| case 0x0f03: /* lsl */
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0f18:
|
| @@ -6590,9 +6728,9 @@ Do you want to stop the program?"),
|
| case 4:
|
| case 8:
|
| if (opcode & 2)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| else
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| break;
|
| default:
|
| ir.addr -= 3;
|
| @@ -6614,13 +6752,13 @@ Do you want to stop the program?"),
|
| goto no_support;
|
| }
|
| if (opcode & 2)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| else
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| break;
|
|
|
| case 0x0f06: /* clts */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| /* MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 */
|
| @@ -6632,19 +6770,14 @@ Do you want to stop the program?"),
|
| case 0x0f77: /* emms */
|
| if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
|
| + record_full_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
|
| break;
|
|
|
| case 0x0f0f: /* 3DNow! data */
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| - if (target_read_memory (ir.addr, &opcode8, 1))
|
| - {
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr %s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
|
| + return -1;
|
| ir.addr++;
|
| switch (opcode8)
|
| {
|
| @@ -6674,7 +6807,7 @@ Do you want to stop the program?"),
|
| case 0xbf: /* 3DNow! pavgusb */
|
| if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
|
| goto no_support_3dnow_data;
|
| - record_arch_list_add_reg (ir.regcache, ir.reg);
|
| + record_full_arch_list_add_reg (ir.regcache, ir.reg);
|
| break;
|
|
|
| default:
|
| @@ -6686,15 +6819,15 @@ no_support_3dnow_data:
|
| break;
|
|
|
| case 0x0faa: /* rsm */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
|
| break;
|
|
|
| case 0x0fae:
|
| @@ -6706,10 +6839,10 @@ no_support_3dnow_data:
|
| {
|
| uint64_t tmpu64;
|
|
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| if (i386_record_lea_modrm_addr (&ir, &tmpu64))
|
| return -1;
|
| - if (record_arch_list_add_mem (tmpu64, 512))
|
| + if (record_full_arch_list_add_mem (tmpu64, 512))
|
| return -1;
|
| }
|
| break;
|
| @@ -6718,33 +6851,34 @@ no_support_3dnow_data:
|
| {
|
| int i;
|
|
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
|
|
| for (i = I387_MM0_REGNUM (tdep);
|
| i386_mmx_regnum_p (gdbarch, i); i++)
|
| - record_arch_list_add_reg (ir.regcache, i);
|
| + record_full_arch_list_add_reg (ir.regcache, i);
|
|
|
| for (i = I387_XMM0_REGNUM (tdep);
|
| i386_xmm_regnum_p (gdbarch, i); i++)
|
| - record_arch_list_add_reg (ir.regcache, i);
|
| + record_full_arch_list_add_reg (ir.regcache, i);
|
|
|
| if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
|
| - record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_MXCSR_REGNUM(tdep));
|
|
|
| for (i = I387_ST0_REGNUM (tdep);
|
| i386_fp_regnum_p (gdbarch, i); i++)
|
| - record_arch_list_add_reg (ir.regcache, i);
|
| + record_full_arch_list_add_reg (ir.regcache, i);
|
|
|
| for (i = I387_FCTRL_REGNUM (tdep);
|
| i386_fpc_regnum_p (gdbarch, i); i++)
|
| - record_arch_list_add_reg (ir.regcache, i);
|
| + record_full_arch_list_add_reg (ir.regcache, i);
|
| }
|
| break;
|
|
|
| case 2: /* ldmxcsr */
|
| if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
|
| + record_full_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
|
| break;
|
|
|
| case 3: /* stmxcsr */
|
| @@ -6911,13 +7045,8 @@ reswitch_prefix_add:
|
| case 0xf20f38:
|
| case 0x0f3a:
|
| case 0x660f3a:
|
| - if (target_read_memory (ir.addr, &opcode8, 1))
|
| - {
|
| - printf_unfiltered (_("Process record: error reading memory at "
|
| - "addr %s len = 1.\n"),
|
| - paddress (gdbarch, ir.addr));
|
| - return -1;
|
| - }
|
| + if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
|
| + return -1;
|
| ir.addr++;
|
| opcode = (uint32_t) opcode8 | opcode << 8;
|
| goto reswitch_prefix_add;
|
| @@ -7127,10 +7256,10 @@ reswitch_prefix_add:
|
| ir.reg |= rex_r;
|
| if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_XMM0_REGNUM (tdep) + ir.reg);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_XMM0_REGNUM (tdep) + ir.reg);
|
| if ((opcode & 0xfffffffc) == 0x660f3a60)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0f11: /* movups */
|
| @@ -7160,8 +7289,8 @@ reswitch_prefix_add:
|
| if (!i386_xmm_regnum_p (gdbarch,
|
| I387_XMM0_REGNUM (tdep) + ir.rm))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_XMM0_REGNUM (tdep) + ir.rm);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_XMM0_REGNUM (tdep) + ir.rm);
|
| }
|
| else
|
| {
|
| @@ -7214,7 +7343,7 @@ reswitch_prefix_add:
|
| case 0x660fc5: /* pextrw */
|
| case 0x0fd7: /* pmovmskb */
|
| case 0x660fd7: /* pmovmskb */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
|
| break;
|
|
|
| case 0x0f3800: /* pshufb */
|
| @@ -7315,8 +7444,8 @@ reswitch_prefix_add:
|
| return -1;
|
| if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_MM0_REGNUM (tdep) + ir.reg);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_MM0_REGNUM (tdep) + ir.reg);
|
| break;
|
|
|
| case 0x0f71: /* psllw */
|
| @@ -7326,8 +7455,8 @@ reswitch_prefix_add:
|
| return -1;
|
| if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_MM0_REGNUM (tdep) + ir.rm);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_MM0_REGNUM (tdep) + ir.rm);
|
| break;
|
|
|
| case 0x660f71: /* psllw */
|
| @@ -7338,8 +7467,8 @@ reswitch_prefix_add:
|
| ir.rm |= ir.rex_b;
|
| if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_XMM0_REGNUM (tdep) + ir.rm);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_XMM0_REGNUM (tdep) + ir.rm);
|
| break;
|
|
|
| case 0x0f7e: /* movd */
|
| @@ -7347,7 +7476,7 @@ reswitch_prefix_add:
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| if (ir.mod == 3)
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
|
| else
|
| {
|
| if (ir.dflag == 2)
|
| @@ -7366,8 +7495,8 @@ reswitch_prefix_add:
|
| {
|
| if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_MM0_REGNUM (tdep) + ir.rm);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_MM0_REGNUM (tdep) + ir.rm);
|
| }
|
| else
|
| {
|
| @@ -7380,8 +7509,8 @@ reswitch_prefix_add:
|
| case 0xf30fb8: /* popcnt */
|
| if (i386_record_modrm (&ir))
|
| return -1;
|
| - I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x660fd6: /* movq */
|
| @@ -7393,8 +7522,8 @@ reswitch_prefix_add:
|
| if (!i386_xmm_regnum_p (gdbarch,
|
| I387_XMM0_REGNUM (tdep) + ir.rm))
|
| goto no_support;
|
| - record_arch_list_add_reg (ir.regcache,
|
| - I387_XMM0_REGNUM (tdep) + ir.rm);
|
| + record_full_arch_list_add_reg (ir.regcache,
|
| + I387_XMM0_REGNUM (tdep) + ir.rm);
|
| }
|
| else
|
| {
|
| @@ -7409,14 +7538,14 @@ reswitch_prefix_add:
|
| case 0x660f2e: /* ucomisd */
|
| case 0x0f2f: /* comiss */
|
| case 0x660f2f: /* comisd */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
|
| break;
|
|
|
| case 0x0ff7: /* maskmovq */
|
| regcache_raw_read_unsigned (ir.regcache,
|
| ir.regmap[X86_RECORD_REDI_REGNUM],
|
| &addr);
|
| - if (record_arch_list_add_mem (addr, 64))
|
| + if (record_full_arch_list_add_mem (addr, 64))
|
| return -1;
|
| break;
|
|
|
| @@ -7424,7 +7553,7 @@ reswitch_prefix_add:
|
| regcache_raw_read_unsigned (ir.regcache,
|
| ir.regmap[X86_RECORD_REDI_REGNUM],
|
| &addr);
|
| - if (record_arch_list_add_mem (addr, 128))
|
| + if (record_full_arch_list_add_mem (addr, 128))
|
| return -1;
|
| break;
|
|
|
| @@ -7440,8 +7569,8 @@ reswitch_prefix_add:
|
| }
|
|
|
| /* In the future, maybe still need to deal with need_dasm. */
|
| - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM);
|
| - if (record_arch_list_add_end ())
|
| + I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM);
|
| + if (record_full_arch_list_add_end ())
|
| return -1;
|
|
|
| return 0;
|
| @@ -7534,7 +7663,7 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
|
| {
|
| const struct target_desc *tdesc = tdep->tdesc;
|
| const struct tdesc_feature *feature_core;
|
| - const struct tdesc_feature *feature_sse, *feature_avx;
|
| + const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx;
|
| int i, num_regs, valid_p;
|
|
|
| if (! tdesc_has_registers (tdesc))
|
| @@ -7551,6 +7680,9 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
|
| /* Try AVX registers. */
|
| feature_avx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx");
|
|
|
| + /* Try MPX registers. */
|
| + feature_mpx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx");
|
| +
|
| valid_p = 1;
|
|
|
| /* The XCR0 bits. */
|
| @@ -7597,6 +7729,23 @@ i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
|
| tdep->register_names[i]);
|
| }
|
|
|
| + if (feature_mpx)
|
| + {
|
| + tdep->xcr0 = I386_XSTATE_MPX_MASK;
|
| +
|
| + if (tdep->bnd0r_regnum < 0)
|
| + {
|
| + tdep->mpx_register_names = i386_mpx_names;
|
| + tdep->bnd0r_regnum = I386_BND0R_REGNUM;
|
| + tdep->bndcfgu_regnum = I386_BNDCFGU_REGNUM;
|
| + }
|
| +
|
| + for (i = 0; i < I387_NUM_MPX_REGS; i++)
|
| + valid_p &= tdesc_numbered_register (feature_mpx, tdesc_data,
|
| + I387_BND0R_REGNUM (tdep) + i,
|
| + tdep->mpx_register_names[i]);
|
| + }
|
| +
|
| return valid_p;
|
| }
|
|
|
| @@ -7610,6 +7759,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
| const struct target_desc *tdesc;
|
| int mm0_regnum;
|
| int ymm0_regnum;
|
| + int bnd0_regnum;
|
| + int num_bnd_cooked;
|
|
|
| /* If there is already a candidate, use it. */
|
| arches = gdbarch_list_lookup_by_info (arches, &info);
|
| @@ -7783,8 +7934,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|
|
| /* Even though the default ABI only includes general-purpose registers,
|
| floating-point registers and the SSE registers, we have to leave a
|
| - gap for the upper AVX registers. */
|
| - set_gdbarch_num_regs (gdbarch, I386_AVX_NUM_REGS);
|
| + gap for the upper AVX registers and the MPX registers. */
|
| + set_gdbarch_num_regs (gdbarch, I386_MPX_NUM_REGS);
|
|
|
| /* Get the x86 target description from INFO. */
|
| tdesc = info.target_desc;
|
| @@ -7805,6 +7956,10 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
| tdep->num_mmx_regs = 8;
|
| tdep->num_ymm_regs = 0;
|
|
|
| + /* No MPX registers. */
|
| + tdep->bnd0r_regnum = -1;
|
| + tdep->bndcfgu_regnum = -1;
|
| +
|
| tdesc_data = tdesc_data_alloc ();
|
|
|
| set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
|
| @@ -7823,13 +7978,16 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
| return NULL;
|
| }
|
|
|
| + num_bnd_cooked = (tdep->bnd0r_regnum > 0 ? I387_NUM_BND_REGS : 0);
|
| +
|
| /* Wire in pseudo registers. Number of pseudo registers may be
|
| changed. */
|
| set_gdbarch_num_pseudo_regs (gdbarch, (tdep->num_byte_regs
|
| + tdep->num_word_regs
|
| + tdep->num_dword_regs
|
| + tdep->num_mmx_regs
|
| - + tdep->num_ymm_regs));
|
| + + tdep->num_ymm_regs
|
| + + num_bnd_cooked));
|
|
|
| /* Target description may be changed. */
|
| tdesc = tdep->tdesc;
|
| @@ -7863,14 +8021,21 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
| else
|
| tdep->ymm0_regnum = -1;
|
|
|
| + bnd0_regnum = mm0_regnum;
|
| if (tdep->num_mmx_regs != 0)
|
| {
|
| /* Support MMX pseudo-register if MMX hasn't been disabled. */
|
| tdep->mm0_regnum = mm0_regnum;
|
| + bnd0_regnum += tdep->num_mmx_regs;
|
| }
|
| else
|
| tdep->mm0_regnum = -1;
|
|
|
| + if (tdep->bnd0r_regnum > 0)
|
| + tdep->bnd0_regnum = bnd0_regnum;
|
| + else
|
| + tdep-> bnd0_regnum = -1;
|
| +
|
| /* Hook in the legacy prologue-based unwinders last (fallback). */
|
| frame_unwind_append_unwinder (gdbarch, &i386_stack_tramp_frame_unwind);
|
| frame_unwind_append_unwinder (gdbarch, &i386_sigtramp_frame_unwind);
|
| @@ -7948,6 +8113,7 @@ is \"default\"."),
|
| initialize_tdesc_i386 ();
|
| initialize_tdesc_i386_mmx ();
|
| initialize_tdesc_i386_avx ();
|
| + initialize_tdesc_i386_mpx ();
|
|
|
| /* Tell remote stub that we support XML target description. */
|
| register_remote_support_xml ("i386");
|
|
|