diff options
author | Hui Zhu <teawater@gmail.com> | 2008-09-09 09:26:35 +0000 |
---|---|---|
committer | Hui Zhu <teawater@gmail.com> | 2008-09-09 09:26:35 +0000 |
commit | cb56f9ae443dfe8e378c6849d0e54328b09186a6 (patch) | |
tree | 478de8d9b0c4b0f792ca1743fd44cda3f075bdad | |
parent | f767248d4f488d3892803628a72a59190d12fc9c (diff) | |
download | gdb-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/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 158 |
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 */ |