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"); |