From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31377 invoked by alias); 6 Jul 2009 19:09:40 -0000 Received: (qmail 31361 invoked by uid 22791); 6 Jul 2009 19:09:37 -0000 X-SWARE-Spam-Status: No, hits=-0.9 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_23,J_CHICKENPOX_24,J_CHICKENPOX_25,J_CHICKENPOX_28 X-Spam-Check-By: sourceware.org Received: from web112520.mail.gq1.yahoo.com (HELO web112520.mail.gq1.yahoo.com) (98.137.26.118) by sourceware.org (qpsmtpd/0.43rc1) with SMTP; Mon, 06 Jul 2009 19:09:28 +0000 Received: (qmail 28282 invoked by uid 60001); 6 Jul 2009 19:09:26 -0000 Message-ID: <952284.27436.qm@web112520.mail.gq1.yahoo.com> Received: from [123.238.27.12] by web112520.mail.gq1.yahoo.com via HTTP; Mon, 06 Jul 2009 12:09:25 PDT Date: Mon, 06 Jul 2009 19:09:00 -0000 From: paawan oza Subject: Re: i386.record.floating.point.patch : with more testing and assurity To: Hui Zhu Cc: Michael Snyder , Mark Kettenis , "pedro@codesourcery.com" , "gdb-patches@sourceware.org" MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00157.txt.bz2 Hi, I am not sure why the text looks little unformatted in the mail.=20 (but it is not) but when I copy the patch and patch it on Linux, the code looks perfectly f= ormatted. Regards, Oza. --- On Tue, 7/7/09, paawan oza wrote: > From: paawan oza > Subject: Re: i386.record.floating.point.patch : with more testing and ass= urity > To: "Hui Zhu" > Cc: "Michael Snyder" , "Mark Kettenis" , "pedro@codesourcery.com" , "gdb-patche= s@sourceware.org" > Date: Tuesday, July 7, 2009, 12:34 AM > Hi, >=20 > please find the latest patch and ChangeLog as follows. >=20 > ******************** > ChangeLog > ******************** > Current: gdb-6.8.50.20090706 > 2009-07-06=A0 Oza=A0 >=20 > =A0 =A0 =A0 =A0 * i386-tdep.c: Support for > floating point recording. >=20 >=20 > *************************** > i386.records.floats.patch > *************************** >=20 >=20 > diff -urN ./gdb.orig/i386-tdep.c gdb.new/i386-tdep.c > --- ./gdb.orig/i386-tdep.c=A0=A0=A0 2009-07-02 > 13:25:54.000000000 -0400 > +++ gdb.new/i386-tdep.c=A0=A0=A0 2009-07-06 > 23:44:07.000000000 -0400 > @@ -3056,6 +3056,66 @@ > =A0=A0=A0return 0; > } >=20=20 > + > +/* Defines contents to record.=A0 */ > +#define I386_SAVE_FPU_REGS=A0 =A0 =A0 =A0 > =A0 =A0 =A0 0xfffd > +#define I386_SAVE_FPU_ENV=A0 =A0 =A0 =A0 > =A0 =A0 =A0=A0=A00xfffe > +#define I386_SAVE_FPU_ENV_REG_STACK=A0 > =A0=A0=A00xffff > + > +/* Record the value of floating point registers which will > be changed by the > +=A0=A0=A0Current instruction to > "record_arch_list".=A0=20 > +=A0=A0=A0Return -1 if something is wrong.=A0 > */=A0=20 > + > +static int i386_record_floats(struct gdbarch *gdbarch,=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct > i386_record_s *ir,=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 uint32_t > iregnum) > +{ > +=A0 struct gdbarch_tdep *tdep =3D gdbarch_tdep > (gdbarch); > +=A0 int i; > + > +=A0 /* Oza : because of floating point insn push/pop of > fpu stack=20 > +=A0 Is going to happen. currently we store st0-st7 > registers,=20 > +=A0 But we need not store all registers all the time, > In future=20 > +=A0 We use ftag register and record only those who are > not marked as an empty.=A0=20 > +=A0 */ > +=A0 if (I386_SAVE_FPU_REGS =3D=3D iregnum) > +=A0 =A0 { > +=A0 =A0 =A0 for (i =3D I387_ST0_REGNUM (tdep);i > <=3D I387_ST0_REGNUM (tdep) + 7;i++) > +=A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 if > (record_arch_list_add_reg (ir->regcache,i)) > +=A0 =A0 =A0 =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 } > +=A0 =A0 } > +=A0 else if (I386_SAVE_FPU_ENV =3D=3D iregnum) > +=A0 =A0 { > +=A0 =A0 =A0 for (i =3D I387_FCTRL_REGNUM(tdep);i > <=3D I387_FOP_REGNUM(tdep);i++) > +=A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 if (record_arch_list_add_reg > (ir->regcache,i)) > +=A0 =A0 =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 } > +=A0 =A0 } > +=A0 else if (I386_SAVE_FPU_ENV_REG_STACK =3D=3D iregnum) > +=A0 =A0 { > +=A0 =A0 =A0 for (i =3D I387_ST0_REGNUM (tdep);i > <=3D I387_FOP_REGNUM(tdep);i++) > +=A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 if (record_arch_list_add_reg > (ir->regcache,i)) > +=A0 =A0 =A0 =A0 =A0 return -1;=A0 =A0 >=20 > +=A0 =A0 =A0 } > +=A0 =A0 } > +=A0 else if ((iregnum >=3D I387_ST0_REGNUM (tdep)) > &&=20 > +=A0 =A0 =A0 =A0 =A0=A0=A0(iregnum > <=3D I387_FOP_REGNUM(tdep))) > +=A0 =A0 { > +=A0 =A0 =A0 if (record_arch_list_add_reg > (ir->regcache,iregnum)) > +=A0 =A0 =A0 =A0 return -1; > +=A0 =A0 } > +=A0 else > +=A0 =A0 { > +=A0 =A0 =A0 /* Parameter error.=A0 */ > +=A0 =A0 =A0 return -1; > +=A0 =A0 }=20 > +=A0 return 0; > +} > + > /* Parse the current instruction and record the values of > the registers and > =A0 =A0 memory that will be changed in current > instruction to "record_arch_list". > =A0 =A0 Return -1 if something wrong. */ > @@ -3070,6 +3130,7 @@ > =A0=A0=A0uint32_t tmpu32; > =A0=A0=A0uint32_t opcode; > =A0=A0=A0struct i386_record_s ir; > +=A0 struct gdbarch_tdep *tdep =3D gdbarch_tdep > (gdbarch); >=20=20 > =A0=A0=A0memset (&ir, 0, sizeof (struct > i386_record_s)); > =A0=A0=A0ir.regcache =3D regcache; > @@ -4105,8 +4166,7 @@ > =A0=A0=A0 } > =A0 =A0 =A0=A0=A0break; >=20=20 > -=A0 =A0 =A0 /* floats */ > -=A0 =A0 =A0 /* It just record the memory change > of instrcution. */ > +=A0 =A0 =A0 /* Floats.=A0 */ > =A0 =A0=A0=A0case 0xd8: > =A0 =A0=A0=A0case 0xd9: > =A0 =A0=A0=A0case 0xda: > @@ -4120,46 +4180,57 @@ > =A0 =A0 =A0=A0=A0ir.reg |=3D ((opcode & 7) > << 3); > =A0 =A0 =A0=A0=A0if (ir.mod !=3D 3) > =A0=A0=A0 { > -=A0=A0=A0 =A0 /* memory */ > +=A0=A0=A0 =A0 /* Memory.=A0 */ > =A0=A0=A0 =A0 uint32_t addr; >=20=20 > =A0=A0=A0 =A0 if (i386_record_lea_modrm_addr > (&ir, &addr)) > =A0=A0=A0 =A0 =A0 return -1; > =A0=A0=A0 =A0 switch (ir.reg) > =A0=A0=A0 =A0 =A0 { > -=A0=A0=A0 =A0 =A0 case 0x00: > -=A0=A0=A0 =A0 =A0 case 0x01: > =A0=A0=A0 =A0 =A0 case 0x02: > -=A0=A0=A0 =A0 =A0 case 0x03: > +=A0=A0=A0 =A0 =A0 case 0x12: > +=A0=A0=A0 =A0 =A0 case 0x22: > +=A0=A0=A0 =A0 =A0 case 0x32: > +=A0=A0=A0 =A0 =A0 =A0 /* For fcom, ficom > nothing to do.=A0 */ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0x03: > +=A0=A0=A0 =A0 =A0 case 0x13: > +=A0=A0=A0 =A0 =A0 case 0x23: > +=A0=A0=A0 =A0 =A0 case 0x33: > +=A0 =A0=A0=A0 =A0 =A0 =A0 /* For > fcomp, ficomp pop FPU stack, store all.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0=A0=A0 =A0 =A0 case 0x00: > +=A0 =A0 =A0 =A0=A0=A0 =A0 =A0 case > 0x01: > =A0=A0=A0 =A0 =A0 case 0x04: > =A0=A0=A0 =A0 =A0 case 0x05: > =A0=A0=A0 =A0 =A0 case 0x06: > =A0=A0=A0 =A0 =A0 case 0x07: > =A0=A0=A0 =A0 =A0 case 0x10: > -=A0=A0=A0 =A0 =A0 case 0x11: > -=A0=A0=A0 =A0 =A0 case 0x12: > -=A0=A0=A0 =A0 =A0 case 0x13: > +=A0 =A0 =A0 =A0=A0=A0 =A0 =A0 case > 0x11: > =A0=A0=A0 =A0 =A0 case 0x14: > =A0=A0=A0 =A0 =A0 case 0x15: > =A0=A0=A0 =A0 =A0 case 0x16: > =A0=A0=A0 =A0 =A0 case 0x17: > =A0=A0=A0 =A0 =A0 case 0x20: > =A0=A0=A0 =A0 =A0 case 0x21: > -=A0=A0=A0 =A0 =A0 case 0x22: > -=A0=A0=A0 =A0 =A0 case 0x23: > =A0=A0=A0 =A0 =A0 case 0x24: > =A0=A0=A0 =A0 =A0 case 0x25: > =A0=A0=A0 =A0 =A0 case 0x26: > =A0=A0=A0 =A0 =A0 case 0x27: > =A0=A0=A0 =A0 =A0 case 0x30: > =A0=A0=A0 =A0 =A0 case 0x31: > -=A0=A0=A0 =A0 =A0 case 0x32: > -=A0=A0=A0 =A0 =A0 case 0x33: > =A0=A0=A0 =A0 =A0 case 0x34: > =A0=A0=A0 =A0 =A0 case 0x35: > =A0=A0=A0 =A0 =A0 case 0x36: > =A0=A0=A0 =A0 =A0 case 0x37: > -=A0=A0=A0 =A0 =A0 =A0 break; > +=A0=A0=A0 =A0 =A0 =A0 /* For fadd, fmul, > fsub, fsubr, fdiv, fdivr, fiadd, fimul,=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0fisub, fisubr, fidiv, fidivr, modR/M.reg > is an extension of code,=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0Always affects st(0) register.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I387_ST0_REGNUM > (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > break;=A0 =A0 =A0 =A0 > =A0=A0=A0=A0=A0=A0 =A0 =A0 > =A0=A0=A0 =A0 =A0=20 > =A0=A0=A0 =A0 =A0 case 0x08: > =A0=A0=A0 =A0 =A0 case 0x0a: > =A0=A0=A0 =A0 =A0 case 0x0b: > @@ -4167,6 +4238,7 @@ > =A0=A0=A0 =A0 =A0 case 0x19: > =A0=A0=A0 =A0 =A0 case 0x1a: > =A0=A0=A0 =A0 =A0 case 0x1b: > +=A0=A0=A0 =A0 =A0 case 0x1d:=20 > =A0=A0=A0 =A0 =A0 case 0x28: > =A0=A0=A0 =A0 =A0 case 0x29: > =A0=A0=A0 =A0 =A0 case 0x2a: > @@ -4174,11 +4246,16 @@ > =A0=A0=A0 =A0 =A0 case 0x38: > =A0=A0=A0 =A0 =A0 case 0x39: > =A0=A0=A0 =A0 =A0 case 0x3a: > -=A0=A0=A0 =A0 =A0 case 0x3b: > +=A0=A0=A0 =A0 =A0 case > 0x3b:=A0=A0=A0 =A0=A0=A0 > +=A0=A0=A0 =A0 =A0 case 0x3c:=20 > +=A0=A0=A0 =A0 =A0 case 0x3d:=20 > =A0=A0=A0 =A0 =A0 =A0 switch (ir.reg > & 7) > =A0=A0=A0 =A0=A0=A0 { > =A0=A0=A0 =A0=A0=A0 case 0: > -=A0=A0=A0 =A0=A0=A0 =A0 break; > +=A0=A0=A0 =A0=A0=A0 =A0 /* Handling > fld, fild.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 break; > =A0=A0=A0 =A0=A0=A0 case 1: > =A0=A0=A0 =A0=A0=A0 =A0 switch > (ir.reg >> 4) > =A0=A0=A0 =A0=A0=A0 =A0 =A0 { > @@ -4191,6 +4268,7 @@ > =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > break; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 case > 3: > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > break; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 > default: > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (record_arch_list_add_mem (addr, 2)) > =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > @@ -4201,15 +4279,48 @@ > =A0=A0=A0 =A0=A0=A0 =A0 switch > (ir.reg >> 4) > =A0=A0=A0 =A0=A0=A0 =A0 =A0 { > =A0=A0=A0 =A0=A0=A0 =A0 =A0 case > 0: > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (record_arch_list_add_mem (addr, 4)) > +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (3 =3D=3D (ir.reg & 7)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 /* For fstp m32fp */ > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 }=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 break; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 case > 1: > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (record_arch_list_add_mem (addr, 4)) > =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if ((3 =3D=3D (ir.reg & 7))=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=A0=A0|| (5 =3D=3D (ir.reg > & 7))=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=A0=A0|| (7 =3D=3D (ir.reg > & 7))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 /* For fstp insn */ > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 }=20 > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > break; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 case > 2: > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (record_arch_list_add_mem (addr, 8)) > =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (3 =3D=3D (ir.reg & 7)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 /* For fstp m64fp */ > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 }=20 > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > break; > =A0=A0=A0 =A0=A0=A0 =A0 =A0 case > 3: > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if ((3 <=3D (ir.reg & 7)) && (6 <=3D (ir.reg > & 7))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 /* For fistp, fbld, fild, > fbstp.=A0 */ > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 }=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=20 > =A0=A0=A0 =A0=A0=A0 =A0 =A0 > default: > =A0=A0=A0 =A0=A0=A0 =A0 =A0 =A0 > if (record_arch_list_add_mem (addr, 2)) > =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > return -1; > @@ -4218,54 +4329,74 @@ > =A0=A0=A0 =A0=A0=A0 =A0 break; > =A0=A0=A0 =A0=A0=A0 } > =A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x0c: > -=A0=A0=A0 =A0 =A0 case 0x0d: > -=A0=A0=A0 =A0 =A0 case 0x1d: > -=A0=A0=A0 =A0 =A0 case 0x2c: > -=A0=A0=A0 =A0 =A0 case 0x3c: > -=A0=A0=A0 =A0 =A0 case 0x3d: > -=A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x0e: > +=A0=A0=A0=A0=A0=A0 =A0 =A0 case > 0x0c: > +=A0=A0=A0 =A0 =A0 =A0 /* Insn > fldenv.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I386_SAVE_FPU_ENV_REG_STACK)) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0=A0=A0 =A0 =A0 case 0x0d:=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Insn > fldcw.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I387_FCTRL_REGNUM > (tdep))) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0=A0=A0 =A0 =A0 case 0x2c:=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Insn > frstor.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I386_SAVE_FPU_ENV_REG_STACK)) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0=20 > +=A0=A0=A0 =A0 =A0 =A0 break;=20 > +=A0=A0=A0 =A0 =A0 case 0x0e:=20 > =A0=A0=A0 =A0 =A0 =A0 if (ir.dflag) > =A0=A0=A0 =A0=A0=A0 { > -=A0=A0=A0 =A0=A0=A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > -=A0=A0=A0 =A0=A0=A0 =A0 =A0 return > -1; > +=A0=A0=A0 =A0=A0=A0 if > (record_arch_list_add_mem (addr, 28)) > +=A0=A0=A0 =A0=A0=A0 =A0 return -1; > =A0=A0=A0 =A0=A0=A0 } > =A0=A0=A0 =A0 =A0 =A0 else > =A0=A0=A0 =A0=A0=A0 { > -=A0=A0=A0 =A0=A0=A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > -=A0=A0=A0 =A0=A0=A0 =A0 =A0 return > -1; > +=A0=A0=A0 =A0=A0=A0 if > (record_arch_list_add_mem (addr, 14)) > +=A0=A0=A0 =A0=A0=A0 =A0 return -1; > =A0=A0=A0 =A0=A0=A0 } > =A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x0f: > -=A0=A0=A0 =A0 =A0 case 0x2f: > +=A0=A0=A0 =A0 =A0 case 0x0f:=A0=20 > +=A0=A0=A0 =A0 =A0 case 0x2f:=A0=20 > =A0=A0=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 2)) > =A0=A0=A0 =A0=A0=A0 return -1; > =A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x1f: > -=A0=A0=A0 =A0 =A0 case 0x3e: > +=A0=A0=A0 =A0 =A0 case 0x1f:=A0=20 > +=A0=A0=A0 =A0 =A0 case 0x3e:=A0=20 > =A0=A0=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 10)) > =A0=A0=A0 =A0=A0=A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Insn > fstp, fbstp.=A0 */ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > =A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x2e: > +=A0=A0=A0 =A0 =A0 case 0x2e:=20 > =A0=A0=A0 =A0 =A0 =A0 if (ir.dflag) > =A0=A0=A0 =A0=A0=A0 { > -=A0=A0=A0 =A0=A0=A0 =A0 if > (record_arch_list_add_mem (addr, 28)) > -=A0=A0=A0 =A0=A0=A0 =A0 =A0 return > -1; > -=A0=A0=A0 =A0=A0=A0 =A0 addr +=3D 28; > +=A0=A0=A0 =A0=A0=A0 if > (record_arch_list_add_mem (addr, 28)) > +=A0=A0=A0 =A0=A0=A0 =A0 return -1; > +=A0=A0=A0 =A0=A0=A0 addr +=3D 28; > =A0=A0=A0 =A0=A0=A0 } > =A0=A0=A0 =A0 =A0 =A0 else > =A0=A0=A0 =A0=A0=A0 { > -=A0=A0=A0 =A0=A0=A0 =A0 if > (record_arch_list_add_mem (addr, 14)) > -=A0=A0=A0 =A0=A0=A0 =A0 =A0 return > -1; > -=A0=A0=A0 =A0=A0=A0 =A0 addr +=3D 14; > +=A0=A0=A0 =A0=A0=A0 if > (record_arch_list_add_mem (addr, 14)) > +=A0=A0=A0 =A0=A0=A0 =A0 return -1; > +=A0=A0=A0 =A0=A0=A0 addr +=3D 14; > =A0=A0=A0 =A0=A0=A0 } > =A0=A0=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 80)) > =A0=A0=A0 =A0=A0=A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Insn > fsave.=A0 */ > +=A0=A0=A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > =A0=A0=A0 =A0 > =A0=A0=A0I386_SAVE_FPU_ENV_REG_STACK)) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0=A0=A0 > =A0=A0=A0 =A0 =A0 =A0 break; > -=A0=A0=A0 =A0 =A0 case 0x3f: > +=A0=A0=A0 =A0 =A0 case 0x3f:=20 > =A0=A0=A0 =A0 =A0 =A0 if > (record_arch_list_add_mem (addr, 8)) > =A0=A0=A0 =A0=A0=A0 return -1; > +=A0=A0=A0 =A0=A0=A0 /* Ins fistp.=A0 > */ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_REGS)) > +=A0=A0=A0 =A0 =A0 =A0 =A0 return > -1;=A0=A0=A0 > =A0=A0=A0 =A0 =A0 =A0 break; > =A0=A0=A0 =A0 =A0 default: > =A0=A0=A0 =A0 =A0 =A0 ir.addr -=3D 2; > @@ -4273,9 +4404,198 @@ > =A0=A0=A0 =A0 =A0 =A0 goto no_support; > =A0=A0=A0 =A0 =A0 =A0 break; > =A0=A0=A0 =A0 =A0 } > -=A0=A0=A0 } > +=A0=A0=A0 }=A0=A0=A0 > +=A0 =A0 =A0 =A0 /* Opcode is an extension of > modR/M byte.=A0 */=A0 =A0=A0=A0 > +=A0=A0=A0 else > +=A0=A0=A0 {=20 > +=A0 =A0 =A0 =A0 =A0 switch (opcode) > +=A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xd8: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I387_ST0_REGNUM > (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > return -1;=A0=A0=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xd9:=A0 > =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if (0x0c > =3D=3D (ir.modrm >> 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if ((ir.modrm & 0x0f) <=3D 7) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir, > I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0=A0=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 else > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir,=A0 > \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 > =A0=A0=A0I387_ST0_REGNUM (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0=A0=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 /* If only st(0) is changing, then we have > already recorded */ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if ((ir.modrm & 0x0f) - 0x08) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(gdbarch, > &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 I387_ST0_REGNUM (tdep) + > ((ir.modrm & 0x0f) - 0x08))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1;=A0=A0=A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 }=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 }=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > switch(ir.modrm) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xe0: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xe1: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf0: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf5: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf8: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xfa: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xfc: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xfe: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xff: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir,=A0 > \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 > =A0=A0=A0I387_ST0_REGNUM (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 break;=A0 =A0 =A0 =A0 > =A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf1:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf2:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf3:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf4: > +=A0=A0=A0 =A0=A0=A0 =A0 case 0xf6:=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf7:=A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xe8:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xe9:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xea:=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xeb: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xec:=A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xed:=A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xee:=A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xf9:=A0 =A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xfb: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir, > I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1;=A0=A0=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 case 0xfd:=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir,=A0 > \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 > =A0=A0=A0I387_ST0_REGNUM (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 if (i386_record_floats(gdbarch, &ir,=A0 > \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 > =A0=A0=A0I387_ST0_REGNUM (tdep) + 1)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 }=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xda: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if (0xe9 > =3D=3D ir.modrm) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0=A0=A0 =A0=A0=A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1;=A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else if > ((0x0c =3D=3D ir.modrm >> 4) || (0x0d =3D=3D ir.modrm >> > 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I387_ST0_REGNUM > (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1;=A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (((ir.modrm & 0x0f) > 0) && ((ir.modrm & > 0x0f) <=3D 7)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I387_ST0_REGNUM (tdep) + (ir.modrm > & 0x0f))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0=A0=A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > else if ((ir.modrm & 0x0f) - 0x08) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0=A0=A0 =A0=A0=A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I387_ST0_REGNUM (tdep) + ((ir.modrm > & 0x0f) - 0x08))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > }=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break;=20 > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdb: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if (0xe3 > =3D=3D ir.modrm) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0=A0=A0 =A0=A0=A0 if > (i386_record_floats(gdbarch, &ir, I386_SAVE_FPU_ENV)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1;=A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else if > ((0x0c =3D=3D ir.modrm >> 4) || (0x0d =3D=3D ir.modrm >> > 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (i386_record_floats(gdbarch, &ir, I387_ST0_REGNUM > (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 return -1;=A0=A0=A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (((ir.modrm & 0x0f) > 0) && ((ir.modrm & > 0x0f) <=3D 7)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I387_ST0_REGNUM (tdep) + (ir.modrm > & 0x0f))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0=A0=A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > else if ((ir.modrm & 0x0f) - 0x08) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0=A0=A0 =A0=A0=A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 I387_ST0_REGNUM (tdep) + ((ir.modrm > & 0x0f) - 0x08))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > }=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdc: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if > (=A0 (0x0c =3D=3D ir.modrm >> 4)=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0|| (0x0d =3D=3D ir.modrm >> 4)=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0|| (0x0f =3D=3D ir.modrm >> 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if > ((ir.modrm & 0x0f) <=3D 7) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 I387_ST0_REGNUM (tdep) + (ir.modrm > & 0x0f))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0=A0=A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > else > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 { > +=A0=A0=A0 =A0=A0=A0 =A0 if > (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0=A0=A0I387_ST0_REGNUM (tdep) + ((ir.modrm > & 0x0f) - 0x08))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > }=A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdd:=A0 > =A0 =A0 =A0 =A0 =A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if (0x0c > =3D=3D ir.modrm >> 4) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0=A0=A0I387_FTAG_REGNUM > (tdep))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else if > ((0x0d =3D=3D ir.modrm >> 4) || (0x0e =3D=3D ir.modrm >> > 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if ((ir.modrm & 0x0f) <=3D 7) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(gdbarch, > &ir,=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 =A0 I387_ST0_REGNUM (tdep) + > (ir.modrm & 0x0f))) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return > -1;=A0=A0=A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 else > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 if (i386_record_floats(gdbarch, > &ir, I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > }=A0 =A0 =A0 =A0 =A0 =A0=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xde: > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((0x0c > =3D=3D ir.modrm >> 4)=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0|| (0x0e =3D=3D ir.modrm >> 4)=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0|| (0x0f =3D=3D ir.modrm >> 4)=A0 \ > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0|| (0xd9 =3D=3D ir.modrm)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > {=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir, > I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1;=A0=A0=A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > }=A0=A0=A0 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 case 0xdf: > +=A0=A0=A0 =A0 =A0 =A0 if (0xe0 =3D=3D > ir.modrm) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (record_arch_list_add_reg (ir.regcache, > I386_EAX_REGNUM)) > +=A0=A0=A0 =A0=A0=A0=A0=A0=A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 else if > ((0x0f =3D=3D ir.modrm >> 4) || (0x0e =3D=3D ir.modrm >> > 4)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 if (i386_record_floats(gdbarch, &ir, > I386_SAVE_FPU_REGS)) > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 > =A0 =A0 return -1; > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >=20 > +=A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > +=A0 =A0 =A0 =A0 =A0 =A0 } > =A0=A0=A0 =A0=20 > +=A0 =A0 =A0 =A0 }=A0 =A0 =A0 > =A0=A0=A0 > =A0 =A0 =A0=A0=A0break; > - > =A0 =A0 =A0=A0=A0/* string ops */ > =A0 =A0 =A0=A0=A0/* movsS */ > =A0 =A0=A0=A0case 0xa4: > @@ -4694,10 +5014,17 @@ > =A0 =A0 =A0=A0=A0/* fwait */ > =A0 =A0 =A0=A0=A0/* XXX */ > =A0 =A0=A0=A0case 0x9b: > -=A0 =A0 =A0 printf_unfiltered (_("Process record > doesn't support instruction " > -=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > =A0=A0=A0"fwait.\n")); > -=A0 =A0 =A0 ir.addr -=3D 1; > -=A0 =A0 =A0 goto no_support; > +=A0 =A0 =A0 if (target_read_memory (ir.addr, > &tmpu8, 1)) > +=A0=A0=A0 { > +=A0=A0=A0 =A0 if (record_debug) > +=A0=A0=A0 =A0 =A0 printf_unfiltered > (_("Process record: error reading memory at " > +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > =A0=A0=A0=A0=A0"addr 0x%s len =3D 1.\n"), > +=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 > =A0 =A0 =A0=A0=A0paddress (gdbarch, > ir.addr)); > +=A0=A0=A0 =A0 return -1; > +=A0=A0=A0 } > +=A0 =A0 =A0 opcode =3D (uint32_t) tmpu8; > +=A0 =A0 =A0 ir.addr++; > +=A0 =A0 =A0 goto reswitch;=A0 > =A0=A0=A0 > =A0 =A0 =A0=A0=A0break; >=20=20 > =A0 =A0 =A0=A0=A0/* int3 */ >=20 >=20 >=20 >=20 >=20 >=20 > --- On Sun, 7/5/09, Hui Zhu > wrote: >=20 > > From: Hui Zhu > > Subject: Re: i386.record.floating.point.patch : with > more testing and assurity > > To: "paawan oza" > > Cc: "Michael Snyder" , > "Mark Kettenis" , > "pedro@codesourcery.com" > , > "gdb-patches@sourceware.org" > > > Date: Sunday, July 5, 2009, 3:45 PM > > Hi Paawan, > >=20 > > 1.=A0 gcc -g -O2=A0=A0=A0-I. -I../../src/gdb > > -I../../src/gdb/common > > -I../../src/gdb/config > > -DLOCALEDIR=3D"\"/usr/local/share/locale\"" > > -DHAVE_CONFIG_H -I../../src/gdb/../include/opcode > > -I../../src/gdb/../readline/.. -I../bfd > > -I../../src/gdb/../bfd > > -I../../src/gdb/../include -I../libdecnumber > > -I../../src/gdb/../libdecnumber=A0 > > -I../../src/gdb/gnulib -Ignulib > > -DMI_OUT=3D1 -DTUI=3D1=A0 -Wall > > -Wdeclaration-after-statement > > -Wpointer-arith -Wformat-nonliteral -Wno-pointer-sign > > -Wno-unused > > -Wno-switch -Wno-char-subscripts -Werror -c -o > i386-tdep.o > > -MT > > i386-tdep.o -MMD -MP -MF .deps/i386-tdep.Tpo > > ../../src/gdb/i386-tdep.c > > cc1: warnings being treated as errors > > ../../src/gdb/i386-tdep.c: In function > > 'i386_process_record': > > ../../src/gdb/i386-tdep.c:4985: warning: implicit > > declaration of > > function 'paddr_nz' > > ../../src/gdb/i386-tdep.c:4985: warning: format '%s' > > expects type > > 'char *', but argument 2 has type 'int' > > make[2]: *** [i386-tdep.o] Error 1 > > make[2]: Leaving directory `/media/disk/gdb/bgdb/gdb' > > make[1]: *** [all-gdb] Error 2 > > make[1]: Leaving directory `/media/disk/gdb/bgdb' > > make: *** [all] Error 2 > >=20 > > paddr_nz was removed.=A0 Please update your patch > follow > > cvs-head. > >=20 > > 2. +#define I386_SAVE_FPU_REGS=A0=A0=A0 > > =A0=A0=A0 0xFFFD > > +#define I386_SAVE_FPU_ENV=A0=A0=A0 > > =A0=A0=A0 0xFFFE > > +#define I386_SAVE_FPU_ENV_REG_STACK=A0=A0=A0 > > 0xFFFF > >=20 > > They just used in prec right?=A0 Maybe you can move > them > > close to record > > code in i386-tedp.c. > >=20 > > 3. +static int i386_record_floats(struct i386_record_s > *ir, > > uint32_t iregnum) > > +{ > > +=A0 int i; > > + > > +=A0 /* Oza : push/pop of fpu stack is going to happen > > +=A0 =A0=A0=A0currently we store st0-st7 > > registers, but we need not store all > > registers all the time. > > +=A0 =A0=A0=A0using fstatus, we use 11-13 bits > > which gives us stack top and > > hence we optimize our storage. > > +=A0 =A0=A0=A0alternatively we can use ftag > > register too */ > > +=A0 if (I386_SAVE_FPU_REGS =3D=3D iregnum) > > +=A0 =A0 { > > +=A0 =A0 =A0 for > > (i=3DI386_ST0_REGNUM;i<=3DI386_ST0_REGNUM+7;i++) > > +=A0 =A0 =A0 =A0 { > > +=A0 =A0 =A0 =A0 =A0 if > > (record_arch_list_add_reg (ir->regcache,i)) > > +=A0 =A0 =A0 =A0 =A0 =A0 return -1; > > +=A0 =A0 =A0 =A0 } > > +=A0 =A0 } > > About the number of fp regs.=A0 Please use the code: > > #define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum) > > #define I387_NUM_XMM_REGS(tdep) > ((tdep)->num_xmm_regs) > > #define I387_MM0_REGNUM(tdep) ((tdep)->mm0_regnum) > >=20 > > #define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM > (tdep) + > > 8) > > #define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 1) > > #define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 2) > > #define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 3) > > #define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 4) > > #define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 5) > > #define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 6) > > #define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM > (tdep) + > > 7) > > #define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) > + > > 16) > > #define I387_MXCSR_REGNUM(tdep) \ > > =A0 (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS > > (tdep)) > >=20 > > They are in i387-tdep.h. > >=20 > > And maybe you can try function i387_supply_fsave and > > i387_collect_fsave. > >=20 > >=20 > > 4.=A0 Your code's format is not very well.=A0 Please > > make it like the code in cvs. > >=20 > >=20 > >=20 > > Thanks, > > Hui > >=20 > >=20 > >=20 > >=20 > > On Sat, Jul 4, 2009 at 13:19, paawan oza > > wrote: > > > > > > Hi, > > > > > > Actually, the initial patch which I submitted > were > > using them. > > > but as I have incorporated Hui's comments I have > > removed those constants completely. > > > in the sense I have no longer extended the > > enumration. > > > > > > but of course, those registers are recorded as > and > > when required. > > > e.g. (ffree insn changes FTAG register, so we > record > > it) > > > > > > Regards, > > > Oza. > > > > > > --- On Sat, 7/4/09, Michael Snyder > > wrote: > > > > > >> From: Michael Snyder > > >> Subject: Re: i386.record.floating.point.patch > : > > with more testing and assurity > > >> To: "paawan oza" > > >> Cc: "Mark Kettenis" , > > "pedro@codesourcery.com" > > , > > "teawater@gmail.com" > > , > > "gdb-patches@sourceware.org" > > > > >> Date: Saturday, July 4, 2009, 3:19 AM > > >> paawan oza wrote: > > >> > Hi, > > >> > > > >> > In My understanding the point was like > > below. > > >> > in the patch there were following > register > > extended in > > >> enumeration in i386-tdep.h > > >> > > > >> > I386_FSTAT, > > >> > I386_FTAG,=A0 =A0 =A0=A0=A0I386_FISEG, > > >> > I386_FIOFF, > > >> > I386_FOSEG, > > >> > I386_FOOFF, > > >> > I386_FOP > > >> > > > >> > > > >> > According to Hui in some of his > previous > > mails...his > > >> idea was > > >> >> FCTRL, FOP and so on are the fp reg > of > > >> amd64.=A0 For now, prec is still > > >> >> not support amd64 And amd64's > support are > > in > > >> amd64-tedp.... files.=A0 >Change > i386_regnum is > > not a > > >> good idea. I suggest you divide fp patch to > 2 > > >parts. One > > >> is for i386, the other for amd64. For now, > just > > send i386 > > >> patch >for review.=A0 And send amd64 patch > when > > prec > > >> support amd64" > > >> > > > >> > > > >> > while, my idea/understanding is: > > >> > FCTRL, FOP registers are not only a part > of > > amd64, but > > >> also part of i386 (x87 FPU unit) also. > > >> > so according to me these registers are > part > > of i386 > > >> also and it needed to be also in > i386-tdep.h. > > >> > > > >> > Regards, > > >> > Oza. > > >> > > >> I'm not sure why you want to add those > constants > > to > > >> i386-tdep.h, > > >> when the rest of your patch does not seem to > use > > them. > > >> > > >> > > > > > > > > > > > > > >=20 >=20 >=20 >=20 >=20