2009-08-29 Hui Zhu <teawater@gmail.com>

* i386-tdep.c (i386_process_record): Fix the error of string
	ops instructions's handler.
This commit is contained in:
Hui Zhu
2009-08-29 05:32:16 +00:00
parent 791f39718a
commit 77d7dc9283
2 changed files with 38 additions and 36 deletions

@ -1,3 +1,8 @@
2009-08-29 Hui Zhu <teawater@gmail.com>
* i386-tdep.c (i386_process_record): Fix the error of string
ops instructions's handler.
2009-08-28 Doug Evans <dje@google.com> 2009-08-28 Doug Evans <dje@google.com>
* top.c (execute_command): Remove redundant comment. * top.c (execute_command): Remove redundant comment.

@ -4443,50 +4443,47 @@ reswitch:
/* insS */ /* insS */
case 0x6c: case 0x6c:
case 0x6d: case 0x6d:
if ((opcode & 1) == 0)
ir.ot = OT_BYTE;
else
ir.ot = ir.dflag + OT_WORD;
regcache_raw_read_unsigned (ir.regcache, regcache_raw_read_unsigned (ir.regcache,
ir.regmap[X86_RECORD_REDI_REGNUM], ir.regmap[X86_RECORD_RECX_REGNUM],
&tmpulongest); &tmpulongest);
if (!ir.aflag) if (tmpulongest)
{ {
tmpulongest &= 0xffff; ULONGEST es, ds;
/* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
if (record_debug) if ((opcode & 1) == 0)
printf_unfiltered (_("Process record ignores the memory change " ir.ot = OT_BYTE;
"of instruction at address 0x%s because " else
"it can't get the value of the segment " ir.ot = ir.dflag + OT_WORD;
"register.\n"),
paddress (gdbarch, ir.addr));
}
if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
{
ULONGEST count, eflags;
regcache_raw_read_unsigned (ir.regcache, regcache_raw_read_unsigned (ir.regcache,
ir.regmap[X86_RECORD_REDI_REGNUM], ir.regmap[X86_RECORD_REDI_REGNUM],
&count); &tmpulongest);
if (!ir.aflag)
count &= 0xffff;
regcache_raw_read_unsigned (ir.regcache, regcache_raw_read_unsigned (ir.regcache,
ir.regmap[X86_RECORD_EFLAGS_REGNUM], ir.regmap[X86_RECORD_ES_REGNUM],
&eflags); &es);
if ((eflags >> 10) & 0x1) regcache_raw_read_unsigned (ir.regcache,
tmpulongest -= (count - 1) * (1 << ir.ot); ir.regmap[X86_RECORD_DS_REGNUM],
if (record_arch_list_add_mem (tmpulongest, count * (1 << ir.ot))) &ds);
return -1; if (ir.aflag && (es != ds))
I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); {
} /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
else if (record_debug)
{ printf_unfiltered (_("Process record ignores the memory "
"change of instruction at address 0x%s "
"because it can't get the value of the "
"ES segment register.\n"),
paddress (gdbarch, ir.addr));
}
if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot)) if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot))
return -1; return -1;
} if (opcode == 0xa4 || opcode == 0xa5)
if (opcode == 0xa4 || opcode == 0xa5) I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
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_REDI_REGNUM); I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); }
break; break;
/* cmpsS */ /* cmpsS */