summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHui Zhu <teawater@gmail.com>2008-09-09 09:26:35 +0000
committerHui Zhu <teawater@gmail.com>2008-09-09 09:26:35 +0000
commitcb56f9ae443dfe8e378c6849d0e54328b09186a6 (patch)
tree478de8d9b0c4b0f792ca1743fd44cda3f075bdad
parentf767248d4f488d3892803628a72a59190d12fc9c (diff)
downloadgdb-cb56f9ae443dfe8e378c6849d0e54328b09186a6.tar.gz
2008-09-09 Hui Zhu <teawater@gmail.com>
* i386-tdep.c (i386_record): Record the memory change of FP instructions.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/i386-tdep.c158
2 files changed, 161 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f11e4771887..0394611c0f5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2008-09-09 Hui Zhu <teawater@gmail.com>
+
+ * i386-tdep.c (i386_record): Record the memory change of FP instructions.
+
2008-09-07 Hui Zhu <teawater@gmail.com>
* record.c (record_wait): Add code to deal with record_first.
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 02ec71626f6..b391e5d0fd1 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -4111,7 +4111,163 @@ reswitch:
break;
/* floats */
- /* XXX */
+ /* It just record the memory change of instrcution. */
+ case 0xd8 ... 0xdf:
+ if (i386_record_modrm ())
+ {
+ return (-1);
+ }
+ reg |= ((opcode & 7) << 3);
+ if (mod != 3)
+ {
+ /* memory */
+ uint32_t addr;
+
+ if (i386_record_lea_modrm_addr (&addr))
+ {
+ return (-1);
+ }
+ switch (reg)
+ {
+ case 0x00 ... 0x07:
+ case 0x10 ... 0x17:
+ case 0x20 ... 0x27:
+ case 0x30 ... 0x37:
+ break;
+ case 0x08:
+ case 0x0a:
+ case 0x0b:
+ case 0x18 ... 0x1b:
+ case 0x28 ... 0x2b:
+ case 0x38 ... 0x3b:
+ switch (reg & 7)
+ {
+ case 0:
+ break;
+ case 1:
+ switch (reg >> 4)
+ {
+ case 0:
+ if (record_arch_list_add_mem (addr, 4))
+ {
+ return (-1);
+ }
+ break;
+ case 2:
+ if (record_arch_list_add_mem (addr, 8))
+ {
+ return (-1);
+ }
+ break;
+ case 3:
+ default:
+ if (record_arch_list_add_mem (addr, 2))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+ default:
+ switch (reg >> 4)
+ {
+ case 0:
+ case 1:
+ if (record_arch_list_add_mem (addr, 4))
+ {
+ return (-1);
+ }
+ break;
+ case 2:
+ if (record_arch_list_add_mem (addr, 8))
+ {
+ return (-1);
+ }
+ break;
+ case 3:
+ default:
+ if (record_arch_list_add_mem (addr, 2))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+ }
+ break;
+ case 0x0c:
+ case 0x0d:
+ case 0x1d:
+ case 0x2c:
+ case 0x3c:
+ case 0x3d:
+ break;
+ case 0x0e:
+ if (dflag)
+ {
+ if (record_arch_list_add_mem (addr, 28))
+ {
+ return (-1);
+ }
+ }
+ else
+ {
+ if (record_arch_list_add_mem (addr, 14))
+ {
+ return (-1);
+ }
+ }
+ break;
+ case 0x0f:
+ case 0x2f:
+ if (record_arch_list_add_mem (addr, 2))
+ {
+ return (-1);
+ }
+ break;
+ case 0x1f:
+ case 0x3e:
+ if (record_arch_list_add_mem (addr, 10))
+ {
+ return (-1);
+ }
+ break;
+ case 0x2e:
+ if (dflag)
+ {
+ if (record_arch_list_add_mem (addr, 28))
+ {
+ return (-1);
+ }
+ addr += 28;
+ }
+ else
+ {
+ if (record_arch_list_add_mem (addr, 14))
+ {
+ return (-1);
+ }
+ addr += 14;
+ }
+ if (record_arch_list_add_mem (addr, 80))
+ {
+ return (-1);
+ }
+ break;
+ case 0x3f:
+ if (record_arch_list_add_mem (addr, 8))
+ {
+ return (-1);
+ }
+ break;
+ default:
+ i386_record_pc -= 2;
+ opcode = opcode << 8 | modrm;
+ goto no_support;
+ break;
+ }
+ }
+ break;
/* string ops */
/* movsS */