From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7202 invoked by alias); 10 Sep 2009 01:51:47 -0000 Received: (qmail 6953 invoked by uid 22791); 10 Sep 2009 01:51:43 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-px0-f180.google.com (HELO mail-px0-f180.google.com) (209.85.216.180) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 10 Sep 2009 01:51:37 +0000 Received: by pxi10 with SMTP id 10so4551395pxi.24 for ; Wed, 09 Sep 2009 18:51:36 -0700 (PDT) MIME-Version: 1.0 Received: by 10.142.202.5 with SMTP id z5mr123634wff.170.1252547496102; Wed, 09 Sep 2009 18:51:36 -0700 (PDT) In-Reply-To: <200909091345.n89DjW0u028957@brahms.sibelius.xs4all.nl> References: <200909091345.n89DjW0u028957@brahms.sibelius.xs4all.nl> From: Hui Zhu Date: Thu, 10 Sep 2009 01:51:00 -0000 Message-ID: Subject: Re: [RFA] Make the prec support signal better[3/4] -- i386-linux To: Mark Kettenis Cc: gdb-patches@sourceware.org, msnyder@vmware.com Content-Type: multipart/mixed; boundary=000e0cd2df3a91ccda04732f70b6 X-IsSubscribed: yes 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-09/txt/msg00269.txt.bz2 --000e0cd2df3a91ccda04732f70b6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 6798 Thanks Mark. On Wed, Sep 9, 2009 at 21:45, Mark Kettenis wrote: >> From: Hui Zhu >> Date: Wed, 9 Sep 2009 21:29:07 +0800 >> >> This patch make i386-linux support signal record. >> When signal happen, i386_linux_record_signal will record the change. >> When the signal handler want return, new code in >> "i386_linux_intx80_sysenter_record" will record the change. >> >> =A0i386-linux-tdep.c | =A0 71 ++++++++++++++++++++++++++++++++++++++++++= ++++++++++++ >> =A01 file changed, 71 insertions(+) >> >> --- a/i386-linux-tdep.c >> +++ b/i386-linux-tdep.c >> @@ -354,6 +354,33 @@ i386_linux_write_pc (struct regcache *re >> =A0 =A0regcache_cooked_write_unsigned (regcache, I386_LINUX_ORIG_EAX_REG= NUM, -1); >> =A0} >> >> +/* Record all registers for process-record. =A0*/ > > Not quite true isn't it? I will update it. > >> +static int >> +i386_all_but_ip_registers_record (struct regcache *regcache) >> +{ >> + =A0if (record_arch_list_add_reg (regcache, I386_EAX_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_ECX_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_EDX_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_EBX_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_ESP_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_EBP_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_ESI_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_EDI_REGNUM)) >> + =A0 =A0return -1; >> + =A0if (record_arch_list_add_reg (regcache, I386_EFLAGS_REGNUM)) >> + =A0 =A0return -1; >> + >> + =A0return 0; >> +} > > Why exactly is it that you're not recording the instruction pointer? This is because this function will be called by "i386_linux_intx80_sysenter_record", this function will be called by i386_process_record, i386_process_record will record the ip when return, so i386_linux_intx80_sysenter_record don't need record ip. > >> =A0static struct linux_record_tdep i386_linux_record_tdep; >> >> =A0/* i386_canonicalize_syscall maps from the native i386 Linux set >> @@ -388,6 +415,14 @@ i386_linux_intx80_sysenter_record (struc >> >> =A0 =A0regcache_raw_read_signed (regcache, I386_EAX_REGNUM, &syscall_nat= ive); >> >> + =A0if (syscall_native =3D=3D 119 || syscall_native =3D=3D 173) >> + =A0 { > > Ugh, magic numbers. =A0We have symbolic constants for them isn't it? > Any reason not to use them? I will fix them. > >> +enum i386_linux_signal_stack { >> + =A0xstate =3D 270, >> + =A0frame_size =3D 732, >> +}; > > IMHO, these should be #define's, spelled with all capitals and have > I386_LINUX_ prefixes. > I will fix them. I make a new patch for it. Please help me with it. Hui 2009-09-10 Michael Snyder Hui Zhu * i386-linux-tdep.c (i386_all_but_ip_registers_record): New function. (i386_linux_intx80_sysenter_record): Call i386_all_but_ip_registers_record if syscall is sys_sigreturn or sys_rt_sigreturn. (I386_LINUX_xstate, I386_LINUX_frame_size): New macros. (i386_linux_record_signal): New function. (i386_linux_init_abi): Call set_gdbarch_process_record_signal. --- i386-linux-tdep.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++- 1 file changed, 71 insertions(+), 1 deletion(-) --- a/i386-linux-tdep.c +++ b/i386-linux-tdep.c @@ -354,7 +354,32 @@ i386_linux_write_pc (struct regcache *re regcache_cooked_write_unsigned (regcache, I386_LINUX_ORIG_EAX_REGNUM, -1= ); } -static struct linux_record_tdep i386_linux_record_tdep; +/* Record all registers but IP register for process-record. */ + +static int +i386_all_but_ip_registers_record (struct regcache *regcache) +{ + if (record_arch_list_add_reg (regcache, I386_EAX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_ECX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EDX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EBX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_ESP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EBP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_ESI_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EDI_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EFLAGS_REGNUM)) + return -1; + + return 0; +} /* i386_canonicalize_syscall maps from the native i386 Linux set of syscall ids into a canonical set of syscall ids used by @@ -379,6 +404,8 @@ i386_canonicalize_syscall (int syscall) Return -1 if something wrong. */ +static struct linux_record_tdep i386_linux_record_tdep; + static int i386_linux_intx80_sysenter_record (struct regcache *regcache) { @@ -398,6 +425,14 @@ i386_linux_intx80_sysenter_record (struc return -1; } + if (syscall_gdb =3D=3D gdb_sys_sigreturn + || syscall_gdb =3D=3D gdb_sys_rt_sigreturn) + { + if (i386_all_but_ip_registers_record (regcache)) + return -1; + return 0; + } + ret =3D record_linux_system_call (syscall_gdb, regcache, &i386_linux_record_tdep); if (ret) @@ -409,6 +444,40 @@ i386_linux_intx80_sysenter_record (struc return 0; } + +#define I386_LINUX_xstate 270 +#define I386_LINUX_frame_size 732 + +int +i386_linux_record_signal (struct gdbarch *gdbarch, + struct regcache *regcache, + enum target_signal signal) +{ + ULONGEST esp; + + if (i386_all_but_ip_registers_record (regcache)) + return -1; + + if (record_arch_list_add_reg (regcache, I386_EIP_REGNUM)) + return -1; + + /* Record the change in the stack. */ + regcache_raw_read_unsigned (regcache, I386_ESP_REGNUM, &esp); + /* This is for xstate. + sp -=3D sizeof (struct _fpstate); */ + esp -=3D I386_LINUX_xstate; + /* This is for frame_size. + sp -=3D sizeof (struct rt_sigframe); */ + esp -=3D I386_LINUX_frame_size; + if (record_arch_list_add_mem (esp, + I386_LINUX_xstate + I386_LINUX_frame_size)) + return -1; + + if (record_arch_list_add_end ()) + return -1; + + return 0; +} /* The register sets used in GNU/Linux ELF core-dumps are identical to @@ -504,6 +573,7 @@ i386_linux_init_abi (struct gdbarch_info tdep->sc_num_regs =3D ARRAY_SIZE (i386_linux_sc_reg_offset); set_gdbarch_process_record (gdbarch, i386_process_record); + set_gdbarch_process_record_signal (gdbarch, i386_linux_record_signal); /* Initialize the i386_linux_record_tdep. */ /* These values are the size of the type that will be used in a system --000e0cd2df3a91ccda04732f70b6 Content-Type: text/plain; charset=US-ASCII; name="prec-support-signal-i386-linux.txt" Content-Disposition: attachment; filename="prec-support-signal-i386-linux.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fzeujjz70 Content-length: 4693 LS0tCiBpMzg2LWxpbnV4LXRkZXAuYyB8ICAgNzIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZp bGUgY2hhbmdlZCwgNzEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoK LS0tIGEvaTM4Ni1saW51eC10ZGVwLmMKKysrIGIvaTM4Ni1saW51eC10ZGVw LmMKQEAgLTM1NCw3ICszNTQsMzIgQEAgaTM4Nl9saW51eF93cml0ZV9wYyAo c3RydWN0IHJlZ2NhY2hlICpyZQogICByZWdjYWNoZV9jb29rZWRfd3JpdGVf dW5zaWduZWQgKHJlZ2NhY2hlLCBJMzg2X0xJTlVYX09SSUdfRUFYX1JFR05V TSwgLTEpOwogfQogCi1zdGF0aWMgc3RydWN0IGxpbnV4X3JlY29yZF90ZGVw IGkzODZfbGludXhfcmVjb3JkX3RkZXA7CisvKiBSZWNvcmQgYWxsIHJlZ2lz dGVycyBidXQgSVAgcmVnaXN0ZXIgZm9yIHByb2Nlc3MtcmVjb3JkLiAgKi8K Kworc3RhdGljIGludAoraTM4Nl9hbGxfYnV0X2lwX3JlZ2lzdGVyc19yZWNv cmQgKHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUpCit7CisgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdO VU0pKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAocmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkpCisgICAgcmV0 dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdj YWNoZSwgSTM4Nl9FRFhfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7CisgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBJMzg2X0VC WF9SRUdOVU0pKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAocmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCisg ICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChyZWdjYWNoZSwgSTM4Nl9FQlBfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7 CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJlZ2NhY2hlLCBJ Mzg2X0VTSV9SRUdOVU0pKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2FjaGUsIEkzODZfRURJX1JFR05V TSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9h ZGRfcmVnIChyZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKKyAgICBy ZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7Cit9CiAKIC8qIGkzODZfY2Fub25p Y2FsaXplX3N5c2NhbGwgbWFwcyBmcm9tIHRoZSBuYXRpdmUgaTM4NiBMaW51 eCBzZXQKICAgIG9mIHN5c2NhbGwgaWRzIGludG8gYSBjYW5vbmljYWwgc2V0 IG9mIHN5c2NhbGwgaWRzIHVzZWQgYnkKQEAgLTM3OSw2ICs0MDQsOCBAQCBp Mzg2X2Nhbm9uaWNhbGl6ZV9zeXNjYWxsIChpbnQgc3lzY2FsbCkKIAogICAg UmV0dXJuIC0xIGlmIHNvbWV0aGluZyB3cm9uZy4gICovCiAKK3N0YXRpYyBz dHJ1Y3QgbGludXhfcmVjb3JkX3RkZXAgaTM4Nl9saW51eF9yZWNvcmRfdGRl cDsKKwogc3RhdGljIGludAogaTM4Nl9saW51eF9pbnR4ODBfc3lzZW50ZXJf cmVjb3JkIChzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlKQogewpAQCAtMzk4 LDYgKzQyNSwxNCBAQCBpMzg2X2xpbnV4X2ludHg4MF9zeXNlbnRlcl9yZWNv cmQgKHN0cnVjCiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgIGlmIChz eXNjYWxsX2dkYiA9PSBnZGJfc3lzX3NpZ3JldHVybgorICAgICAgfHwgc3lz Y2FsbF9nZGIgPT0gZ2RiX3N5c19ydF9zaWdyZXR1cm4pCisgICB7CisgICAg IGlmIChpMzg2X2FsbF9idXRfaXBfcmVnaXN0ZXJzX3JlY29yZCAocmVnY2Fj aGUpKQorICAgICAgIHJldHVybiAtMTsKKyAgICAgcmV0dXJuIDA7CisgICB9 CisKICAgcmV0ID0gcmVjb3JkX2xpbnV4X3N5c3RlbV9jYWxsIChzeXNjYWxs X2dkYiwgcmVnY2FjaGUsCiAJCQkJICAmaTM4Nl9saW51eF9yZWNvcmRfdGRl cCk7CiAgIGlmIChyZXQpCkBAIC00MDksNiArNDQ0LDQwIEBAIGkzODZfbGlu dXhfaW50eDgwX3N5c2VudGVyX3JlY29yZCAoc3RydWMKIAogICByZXR1cm4g MDsKIH0KKworI2RlZmluZSBJMzg2X0xJTlVYX3hzdGF0ZQkyNzAKKyNkZWZp bmUgSTM4Nl9MSU5VWF9mcmFtZV9zaXplCTczMgorCitpbnQKK2kzODZfbGlu dXhfcmVjb3JkX3NpZ25hbCAoc3RydWN0IGdkYmFyY2ggKmdkYmFyY2gsCisg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWdjYWNoZSAqcmVn Y2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gdGFyZ2V0 X3NpZ25hbCBzaWduYWwpCit7CisgIFVMT05HRVNUIGVzcDsKKworICBpZiAo aTM4Nl9hbGxfYnV0X2lwX3JlZ2lzdGVyc19yZWNvcmQgKHJlZ2NhY2hlKSkK KyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X3JlZyAocmVnY2FjaGUsIEkzODZfRUlQX1JFR05VTSkpCisgICAgcmV0dXJu IC0xOworCisgIC8qIFJlY29yZCB0aGUgY2hhbmdlIGluIHRoZSBzdGFjay4g ICovCisgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChyZWdjYWNoZSwg STM4Nl9FU1BfUkVHTlVNLCAmZXNwKTsKKyAgLyogVGhpcyBpcyBmb3IgeHN0 YXRlLgorICAgICBzcCAtPSBzaXplb2YgKHN0cnVjdCBfZnBzdGF0ZSk7ICAq LworICBlc3AgLT0gSTM4Nl9MSU5VWF94c3RhdGU7CisgIC8qIFRoaXMgaXMg Zm9yIGZyYW1lX3NpemUuCisgICAgIHNwIC09IHNpemVvZiAoc3RydWN0IHJ0 X3NpZ2ZyYW1lKTsgICovCisgIGVzcCAtPSBJMzg2X0xJTlVYX2ZyYW1lX3Np emU7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGVzcCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTM4Nl9MSU5VWF94c3Rh dGUgKyBJMzg2X0xJTlVYX2ZyYW1lX3NpemUpKQorICAgIHJldHVybiAtMTsK KworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfZW5kICgpKQorICAgIHJl dHVybiAtMTsKKworICByZXR1cm4gMDsKK30KIAwKIAogLyogVGhlIHJlZ2lz dGVyIHNldHMgdXNlZCBpbiBHTlUvTGludXggRUxGIGNvcmUtZHVtcHMgYXJl IGlkZW50aWNhbCB0bwpAQCAtNTA0LDYgKzU3Myw3IEBAIGkzODZfbGludXhf aW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8KICAgdGRlcC0+c2NfbnVt X3JlZ3MgPSBBUlJBWV9TSVpFIChpMzg2X2xpbnV4X3NjX3JlZ19vZmZzZXQp OwogCiAgIHNldF9nZGJhcmNoX3Byb2Nlc3NfcmVjb3JkIChnZGJhcmNoLCBp Mzg2X3Byb2Nlc3NfcmVjb3JkKTsKKyAgc2V0X2dkYmFyY2hfcHJvY2Vzc19y ZWNvcmRfc2lnbmFsIChnZGJhcmNoLCBpMzg2X2xpbnV4X3JlY29yZF9zaWdu YWwpOwogCiAgIC8qIEluaXRpYWxpemUgdGhlIGkzODZfbGludXhfcmVjb3Jk X3RkZXAuICAqLwogICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHRoZSBzaXplIG9m IHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIGluIGEgc3lzdGVtCg== --000e0cd2df3a91ccda04732f70b6--