From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23229 invoked by alias); 7 Dec 2009 19:00:15 -0000 Received: (qmail 23214 invoked by uid 22791); 7 Dec 2009 19:00:13 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 07 Dec 2009 19:00:01 +0000 Received: from mailhost3.vmware.com (mailhost3.vmware.com [10.16.27.45]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 9B9F74402C; Mon, 7 Dec 2009 10:59:59 -0800 (PST) Received: from [10.20.94.141] (msnyder-server.eng.vmware.com [10.20.94.141]) by mailhost3.vmware.com (Postfix) with ESMTP id 90C18CD91F; Mon, 7 Dec 2009 10:59:59 -0800 (PST) Message-ID: <4B1D5096.8000206@vmware.com> Date: Mon, 07 Dec 2009 19:00:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20090624) MIME-Version: 1.0 To: Hui Zhu CC: gdb-patches ml Subject: Re: [RFA/RFC] Prec multi-thread support [2/4] arch support References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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-12/txt/msg00085.txt.bz2 Hui Zhu wrote: > 1. In record_linux_system_call gdb_sys_clone, I set record_step to 0. > Then the record target will let inferior continue until to a > breakpoint. Most of time, record just let inferior step. But > sys_clone is very special. It cannot work OK with > PTRACE_SINGLESTEP.(It make me hang this patch a log of months.) > > 2. Add new argument "addr" that point to the next code that need to be > analyzed to linux syscall record function "record_linux_system_call". Here is your stylistic review: > 2009-11-25 Hui Zhu > > * amd64-linux-tdep.c (amd64_linux_syscall_record): Add new > argument "addr". > * i386-linux-tdep.c (i386_linux_intx80_sysenter_record): Ditto. > * i386-tdep.c (i386_record_lea_modrm): Add "if (record_debug)" > to segment register warning. > (i386_process_record): Ditto. Add new argument "addr" when > call i386_intx80_record, i386_sysenter_record and > i386_syscall_record. > * i386-tdep.h (gdbarch_tdep): Add new argument "addr" when > call i386_intx80_record, i386_sysenter_record and > i386_syscall_record. > * linux-record.c (inferior.h): New include. > (record_linux_system_call): Add new argument "addr". > Update code for gdb_sys_clone. > * linux-record.h (record_linux_system_call): Add new argument > "addr". > > --- > amd64-linux-tdep.c | 4 ++-- > i386-linux-tdep.c | 4 ++-- > i386-tdep.c | 52 +++++++++++++++++++++++++++++----------------------- > i386-tdep.h | 6 +++--- > linux-record.c | 13 +++++++++---- > linux-record.h | 2 +- > 6 files changed, 46 insertions(+), 35 deletions(-) > > --- a/amd64-linux-tdep.c > +++ b/amd64-linux-tdep.c > @@ -1155,7 +1155,7 @@ static struct linux_record_tdep amd64_li > #define RECORD_ARCH_GET_GS 0x1004 > > static int > -amd64_linux_syscall_record (struct regcache *regcache) > +amd64_linux_syscall_record (struct regcache *regcache, CORE_ADDR addr) > { > int ret; > ULONGEST syscall_native; > @@ -1205,7 +1205,7 @@ amd64_linux_syscall_record (struct regca > } > else > { > - ret = record_linux_system_call (syscall_gdb, regcache, > + ret = record_linux_system_call (syscall_gdb, addr, regcache, > &amd64_linux_record_tdep); > if (ret) > return ret; > --- a/i386-linux-tdep.c > +++ b/i386-linux-tdep.c > @@ -411,7 +411,7 @@ i386_canonicalize_syscall (int syscall) > static struct linux_record_tdep i386_linux_record_tdep; > > static int > -i386_linux_intx80_sysenter_record (struct regcache *regcache) > +i386_linux_intx80_sysenter_record (struct regcache *regcache, CORE_ADDR addr) Break up long line. > { > int ret; > LONGEST syscall_native; > @@ -437,7 +437,7 @@ i386_linux_intx80_sysenter_record (struc > return 0; > } > > - ret = record_linux_system_call (syscall_gdb, regcache, > + ret = record_linux_system_call (syscall_gdb, addr, regcache, > &i386_linux_record_tdep); > if (ret) > return ret; > --- a/i386-tdep.c > +++ b/i386-tdep.c > @@ -3160,10 +3160,11 @@ i386_record_lea_modrm (struct i386_recor > > if (irp->override >= 0) > { > - warning (_("Process record ignores the memory change " > - "of instruction at address %s because it " > - "can't get the value of the segment register."), > - paddress (gdbarch, irp->orig_addr)); > + if (record_debug) > + warning (_("Process record ignores the memory change " > + "of instruction at address %s because it " > + "can't get the value of the segment register."), > + paddress (gdbarch, irp->orig_addr)); > return 0; > } > > @@ -4042,11 +4043,12 @@ reswitch: > case 0xa3: > if (ir.override >= 0) > { > - warning (_("Process record ignores the memory change " > - "of instruction at address %s because " > - "it can't get the value of the segment " > - "register."), > - paddress (gdbarch, ir.orig_addr)); > + if (record_debug) > + warning (_("Process record ignores the memory change " > + "of instruction at address %s because " > + "it can't get the value of the segment " > + "register."), > + paddress (gdbarch, ir.orig_addr)); > } > else > { > @@ -4467,11 +4469,12 @@ reswitch: > if (ir.aflag && (es != ds)) > { > /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */ > - warning (_("Process record ignores the memory " > - "change of instruction at address %s " > - "because it can't get the value of the " > - "ES segment register."), > - paddress (gdbarch, ir.orig_addr)); > + if (record_debug) > + warning (_("Process record ignores the memory " > + "change of instruction at address %s " > + "because it can't get the value of the " > + "ES segment register."), > + paddress (gdbarch, ir.orig_addr)); > } > else > { > @@ -4872,7 +4875,7 @@ reswitch: > ir.addr -= 2; > goto no_support; > } > - ret = gdbarch_tdep (gdbarch)->i386_intx80_record (ir.regcache); > + ret = gdbarch_tdep (gdbarch)->i386_intx80_record (ir.regcache, ir.addr); Break up long line. > if (ret) > return ret; > } > @@ -4974,7 +4977,8 @@ reswitch: > ir.addr -= 2; > goto no_support; > } > - ret = gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.regcache); > + ret = gdbarch_tdep (gdbarch)->i386_sysenter_record (ir.regcache, > + ir.addr); > if (ret) > return ret; > } > @@ -4999,7 +5003,8 @@ reswitch: > ir.addr -= 2; > goto no_support; > } > - ret = gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache); > + ret = gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache, > + ir.addr); > if (ret) > return ret; > } > @@ -5135,12 +5140,13 @@ reswitch: > /* sidt */ > if (ir.override >= 0) > { > - warning (_("Process record ignores the memory " > - "change of instruction at " > - "address %s because it can't get " > - "the value of the segment " > - "register."), > - paddress (gdbarch, ir.orig_addr)); > + if (record_debug) > + warning (_("Process record ignores the memory " > + "change of instruction at " > + "address %s because it can't get " > + "the value of the segment " > + "register."), > + paddress (gdbarch, ir.orig_addr)); > } > else > { > --- a/i386-tdep.h > +++ b/i386-tdep.h > @@ -115,11 +115,11 @@ struct gdbarch_tdep > in GDB is not same as I386 instructions. */ > const int *record_regmap; > /* Parse intx80 args. */ > - int (*i386_intx80_record) (struct regcache *regcache); > + int (*i386_intx80_record) (struct regcache *regcache, CORE_ADDR addr); > /* Parse sysenter args. */ > - int (*i386_sysenter_record) (struct regcache *regcache); > + int (*i386_sysenter_record) (struct regcache *regcache, CORE_ADDR addr); > /* Parse syscall args. */ > - int (*i386_syscall_record) (struct regcache *regcache); > + int (*i386_syscall_record) (struct regcache *regcache, CORE_ADDR addr); > }; > > /* Floating-point registers. */ > --- a/linux-record.c > +++ b/linux-record.c > @@ -21,6 +21,7 @@ > #include "target.h" > #include "gdbtypes.h" > #include "regcache.h" > +#include "inferior.h" > #include "record.h" > #include "linux-record.h" > > @@ -222,7 +223,7 @@ record_linux_msghdr (struct regcache *re > Return -1 if something wrong. */ > > int > -record_linux_system_call (enum gdb_syscall syscall, > +record_linux_system_call (enum gdb_syscall syscall, CORE_ADDR addr, > struct regcache *regcache, > struct linux_record_tdep *tdep) > { > @@ -242,8 +243,9 @@ record_linux_system_call (enum gdb_sysca > int q; > target_terminal_ours (); > q = yquery (_("The next instruction is syscall exit. " > - "It will make the program exit. " > - "Do you want to stop the program?")); > + "It will make the thread %s exit. " > + "Do you want to stop the program?"), > + target_pid_to_str (inferior_ptid)); > target_terminal_inferior (); > if (q) > return 1; > @@ -1209,10 +1211,13 @@ record_linux_system_call (enum gdb_sysca > > case gdb_sys_fsync: > case gdb_sys_sigreturn: > - case gdb_sys_clone: > case gdb_sys_setdomainname: > break; > > + case gdb_sys_clone: > + record_step = 0; > + break; > + > case gdb_sys_newuname: > regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); > if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, > --- a/linux-record.h > +++ b/linux-record.h > @@ -534,7 +534,7 @@ enum gdb_syscall { > > /* Record a linux syscall. */ > > -extern int record_linux_system_call (enum gdb_syscall num, > +extern int record_linux_system_call (enum gdb_syscall num, CORE_ADDR addr, Break up long line. > struct regcache *regcache, > struct linux_record_tdep *tdep); > #endif /* _LINUX_RECORD_H_ */