From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17592 invoked by alias); 9 Sep 2009 13:29:36 -0000 Received: (qmail 17314 invoked by uid 22791); 9 Sep 2009 13:29:32 -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; Wed, 09 Sep 2009 13:29:27 +0000 Received: by mail-px0-f180.google.com with SMTP id 10so4032492pxi.24 for ; Wed, 09 Sep 2009 06:29:27 -0700 (PDT) MIME-Version: 1.0 Received: by 10.142.9.39 with SMTP id 39mr11050wfi.115.1252502967090; Wed, 09 Sep 2009 06:29:27 -0700 (PDT) From: Hui Zhu Date: Wed, 09 Sep 2009 13:29:00 -0000 Message-ID: Subject: [RFA] Make the prec support signal better[3/4] -- i386-linux To: gdb-patches ml Cc: Michael Snyder Content-Type: multipart/mixed; boundary=00504502b45f6efd8204732512e6 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/msg00244.txt.bz2 --00504502b45f6efd8204732512e6 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 3754 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. 2009-09-09 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_signal_stack): New enum. (i386_linux_record_signal): New function. (i386_linux_init_abi): Call set_gdbarch_process_record_signal. --- i386-linux-tdep.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 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 regcache_cooked_write_unsigned (regcache, I386_LINUX_ORIG_EAX_REGNUM, -1); } +/* Record all registers 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; +} + static struct linux_record_tdep i386_linux_record_tdep; /* i386_canonicalize_syscall maps from the native i386 Linux set @@ -388,6 +415,14 @@ i386_linux_intx80_sysenter_record (struc regcache_raw_read_signed (regcache, I386_EAX_REGNUM, &syscall_native); + if (syscall_native == 119 || syscall_native == 173) + { + /* sys_sigreturn sys_rt_sigreturn */ + if (i386_all_but_ip_registers_record (regcache)) + return -1; + return 0; + } + syscall_gdb = i386_canonicalize_syscall (syscall_native); if (syscall_gdb < 0) @@ -409,6 +444,41 @@ i386_linux_intx80_sysenter_record (struc return 0; } + +enum i386_linux_signal_stack { + xstate = 270, + 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 -= sizeof (struct _fpstate); */ + esp -= xstate; + /* This is for frame_size. + sp -= sizeof (struct rt_sigframe); */ + esp -= frame_size; + if (record_arch_list_add_mem (esp, xstate + 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 +574,7 @@ i386_linux_init_abi (struct gdbarch_info tdep->sc_num_regs = 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 --00504502b45f6efd8204732512e6 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_fze3jazj0 Content-length: 4214 LS0tCiBpMzg2LWxpbnV4LXRkZXAuYyB8ICAgNzEgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZp bGUgY2hhbmdlZCwgNzEgaW5zZXJ0aW9ucygrKQoKLS0tIGEvaTM4Ni1saW51 eC10ZGVwLmMKKysrIGIvaTM4Ni1saW51eC10ZGVwLmMKQEAgLTM1NCw2ICsz NTQsMzMgQEAgaTM4Nl9saW51eF93cml0ZV9wYyAoc3RydWN0IHJlZ2NhY2hl ICpyZQogICByZWdjYWNoZV9jb29rZWRfd3JpdGVfdW5zaWduZWQgKHJlZ2Nh Y2hlLCBJMzg2X0xJTlVYX09SSUdfRUFYX1JFR05VTSwgLTEpOwogfQogCisv KiBSZWNvcmQgYWxsIHJlZ2lzdGVycyBmb3IgcHJvY2Vzcy1yZWNvcmQuICAq LworCitzdGF0aWMgaW50CitpMzg2X2FsbF9idXRfaXBfcmVnaXN0ZXJzX3Jl Y29yZCAoc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSkKK3sKKyAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2FjaGUsIEkzODZfRUFYX1JF R05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChyZWdjYWNoZSwgSTM4Nl9FQ1hfUkVHTlVNKSkKKyAgICBy ZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKHJl Z2NhY2hlLCBJMzg2X0VEWF9SRUdOVU0pKQorICAgIHJldHVybiAtMTsKKyAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2FjaGUsIEkzODZf RUJYX1JFR05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVjb3JkX2Fy Y2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNKSkK KyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKHJlZ2NhY2hlLCBJMzg2X0VCUF9SRUdOVU0pKQorICAgIHJldHVybiAt MTsKKyAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAocmVnY2FjaGUs IEkzODZfRVNJX1JFR05VTSkpCisgICAgcmV0dXJuIC0xOworICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChyZWdjYWNoZSwgSTM4Nl9FRElfUkVH TlVNKSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKHJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQorICAg IHJldHVybiAtMTsKKworICByZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVj dCBsaW51eF9yZWNvcmRfdGRlcCBpMzg2X2xpbnV4X3JlY29yZF90ZGVwOwog CiAvKiBpMzg2X2Nhbm9uaWNhbGl6ZV9zeXNjYWxsIG1hcHMgZnJvbSB0aGUg bmF0aXZlIGkzODYgTGludXggc2V0CkBAIC0zODgsNiArNDE1LDE0IEBAIGkz ODZfbGludXhfaW50eDgwX3N5c2VudGVyX3JlY29yZCAoc3RydWMKIAogICBy ZWdjYWNoZV9yYXdfcmVhZF9zaWduZWQgKHJlZ2NhY2hlLCBJMzg2X0VBWF9S RUdOVU0sICZzeXNjYWxsX25hdGl2ZSk7CiAKKyAgaWYgKHN5c2NhbGxfbmF0 aXZlID09IDExOSB8fCBzeXNjYWxsX25hdGl2ZSA9PSAxNzMpCisgICB7Cisg ICAgIC8qIHN5c19zaWdyZXR1cm4gc3lzX3J0X3NpZ3JldHVybiAqLworICAg ICBpZiAoaTM4Nl9hbGxfYnV0X2lwX3JlZ2lzdGVyc19yZWNvcmQgKHJlZ2Nh Y2hlKSkKKyAgICAgICByZXR1cm4gLTE7CisgICAgIHJldHVybiAwOworICAg fQorCiAgIHN5c2NhbGxfZ2RiID0gaTM4Nl9jYW5vbmljYWxpemVfc3lzY2Fs bCAoc3lzY2FsbF9uYXRpdmUpOwogCiAgIGlmIChzeXNjYWxsX2dkYiA8IDAp CkBAIC00MDksNiArNDQ0LDQxIEBAIGkzODZfbGludXhfaW50eDgwX3N5c2Vu dGVyX3JlY29yZCAoc3RydWMKIAogICByZXR1cm4gMDsKIH0KKworZW51bSBp Mzg2X2xpbnV4X3NpZ25hbF9zdGFjayB7CisgIHhzdGF0ZSA9IDI3MCwKKyAg ZnJhbWVfc2l6ZSA9IDczMiwKK307CisKK2ludAoraTM4Nl9saW51eF9yZWNv cmRfc2lnbmFsIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB0YXJnZXRfc2lnbmFs IHNpZ25hbCkKK3sKKyAgVUxPTkdFU1QgZXNwOworCisgIGlmIChpMzg2X2Fs bF9idXRfaXBfcmVnaXN0ZXJzX3JlY29yZCAocmVnY2FjaGUpKQorICAgIHJl dHVybiAtMTsKKworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChy ZWdjYWNoZSwgSTM4Nl9FSVBfUkVHTlVNKSkKKyAgICByZXR1cm4gLTE7CisK KyAgLyogUmVjb3JkIHRoZSBjaGFuZ2UgaW4gdGhlIHN0YWNrLiAgKi8KKyAg cmVnY2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKHJlZ2NhY2hlLCBJMzg2X0VT UF9SRUdOVU0sICZlc3ApOworICAvKiBUaGlzIGlzIGZvciB4c3RhdGUuCisg ICAgIHNwIC09IHNpemVvZiAoc3RydWN0IF9mcHN0YXRlKTsgICovCisgIGVz cCAtPSB4c3RhdGU7CisgIC8qIFRoaXMgaXMgZm9yIGZyYW1lX3NpemUuCisg ICAgIHNwIC09IHNpemVvZiAoc3RydWN0IHJ0X3NpZ2ZyYW1lKTsgICovCisg IGVzcCAtPSBmcmFtZV9zaXplOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9h ZGRfbWVtIChlc3AsIHhzdGF0ZSArIGZyYW1lX3NpemUpKQorICAgIHJldHVy biAtMTsKKworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfZW5kICgpKQor ICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMDsKK30KIAwKIAogLyogVGhl IHJlZ2lzdGVyIHNldHMgdXNlZCBpbiBHTlUvTGludXggRUxGIGNvcmUtZHVt cHMgYXJlIGlkZW50aWNhbCB0bwpAQCAtNTA0LDYgKzU3NCw3IEBAIGkzODZf bGludXhfaW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8KICAgdGRlcC0+ c2NfbnVtX3JlZ3MgPSBBUlJBWV9TSVpFIChpMzg2X2xpbnV4X3NjX3JlZ19v ZmZzZXQpOwogCiAgIHNldF9nZGJhcmNoX3Byb2Nlc3NfcmVjb3JkIChnZGJh cmNoLCBpMzg2X3Byb2Nlc3NfcmVjb3JkKTsKKyAgc2V0X2dkYmFyY2hfcHJv Y2Vzc19yZWNvcmRfc2lnbmFsIChnZGJhcmNoLCBpMzg2X2xpbnV4X3JlY29y ZF9zaWduYWwpOwogCiAgIC8qIEluaXRpYWxpemUgdGhlIGkzODZfbGludXhf cmVjb3JkX3RkZXAuICAqLwogICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHRoZSBz aXplIG9mIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIGluIGEgc3lzdGVt Cg== --00504502b45f6efd8204732512e6--