From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2605 invoked by alias); 19 Sep 2009 20:33:39 -0000 Received: (qmail 2595 invoked by uid 22791); 19 Sep 2009 20:33:37 -0000 X-SWARE-Spam-Status: No, hits=-2.4 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; Sat, 19 Sep 2009 20:33:34 +0000 Received: from mailhost2.vmware.com (mailhost2.vmware.com [10.16.67.167]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 7BBC756009; Sat, 19 Sep 2009 13:33:32 -0700 (PDT) Received: from [10.20.94.141] (msnyder-server.eng.vmware.com [10.20.94.141]) by mailhost2.vmware.com (Postfix) with ESMTP id 5F7688E78D; Sat, 19 Sep 2009 13:33:32 -0700 (PDT) Message-ID: <4AB53FF6.4030104@vmware.com> Date: Sat, 19 Sep 2009 20:33:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: Hui Zhu CC: Joel Brobecker , "gdb-patches@sourceware.org" Subject: Re: [RFA] Make the prec support signal better[4/4] -- amd64-linux References: <200909091352.n89Dq7FG003824@brahms.sibelius.xs4all.nl> 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-09/txt/msg00637.txt.bz2 No one has commented on these for 10 days now. It looks to me as if you have addressed the previous comments. Why don't you go ahead and commit this to the main cvs tree. Joel, can we add this change to the 7.0 branch? Hui Zhu wrote: > On Wed, Sep 9, 2009 at 21:52, Mark Kettenis wrote: >>> From: Hui Zhu >>> Date: Wed, 9 Sep 2009 21:29:20 +0800 >>> >>> This patch make amd64-linux support signal record. >>> When signal happen, amd64_linux_record_signal will record the change. >>> When the signal handler want return, new code in >>> "amd64_linux_syscall_record" will record the change. >>> >>> 2009-09-09 Michael Snyder >>> Hui Zhu >>> >>> * amd64-linux-tdep.c (amd64_all_but_ip_registers_record): New >>> function. >>> (amd64_linux_syscall_record): Call >>> amd64_all_but_ip_registers_record if syscall is >>> sys_rt_sigreturn. >>> (amd64_linux_signal_stack): New enum. >>> (amd64_linux_record_signal): New function. >>> (amd64_linux_init_abi): Call set_gdbarch_process_record_signal. >> Same comments, questions as the i386 counterpart. In addition to >> that: >> >>> - record_regs: >>> +record_regs: >> Not sure if it is spelled out in the coding standards, but emacs' GNU >> mode seems to insist on the space you're removing. >> >> Also, looking at this diff it seems there are lots of Linux-specific >> constants and functions that have an amd64_ prefix instead of an >> amd64_linux_ prefix. In particular the system call numbers. Please >> fix that (in a seperate diff). >> > > Thanks Mark. > > I make a new patch for it. Please help me with it. > > Hui > > 2009-09-10 Michael Snyder > Hui Zhu > > * amd64-linux-tdep.c (amd64_all_but_ip_registers_record): New > function. > (amd64_linux_syscall_record): Call > amd64_all_but_ip_registers_record if syscall is > sys_rt_sigreturn. > (AMD64_LINUX_redzone, AMD64_LINUX_xstate, > AMD64_LINUX_frame_size): New macros. > (amd64_linux_record_signal): New function. > (amd64_linux_init_abi): Call set_gdbarch_process_record_signal. > > --- > amd64-linux-tdep.c | 142 ++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 118 insertions(+), 24 deletions(-) > > --- a/amd64-linux-tdep.c > +++ b/amd64-linux-tdep.c > @@ -263,16 +263,48 @@ amd64_linux_write_pc (struct regcache *r > regcache_cooked_write_unsigned (regcache, AMD64_LINUX_ORIG_RAX_REGNUM, -1); > } > > -/* Parse the arguments of current system call instruction and record > - the values of the registers and memory that will be changed into > - "record_arch_list". This instruction is "syscall". > - > - Return -1 if something wrong. */ > +/* Record all registers but IP register for process-record. */ > > -static struct linux_record_tdep amd64_linux_record_tdep; > +static int > +amd64_all_but_ip_registers_record (struct regcache *regcache) > +{ > + if (record_arch_list_add_reg (regcache, AMD64_RAX_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RCX_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RDX_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RBX_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RSP_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RBP_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RSI_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_RDI_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R8_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R9_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R10_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R11_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R12_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R13_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R14_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_R15_REGNUM)) > + return -1; > + if (record_arch_list_add_reg (regcache, AMD64_EFLAGS_REGNUM)) > + return -1; > > -#define RECORD_ARCH_GET_FS 0x1003 > -#define RECORD_ARCH_GET_GS 0x1004 > + return 0; > +} > > /* amd64_canonicalize_syscall maps from the native amd64 Linux set > of syscall ids into a canonical set of syscall ids used by > @@ -1085,6 +1117,17 @@ amd64_canonicalize_syscall (enum amd64_s > } > } > > +/* Parse the arguments of current system call instruction and record > + the values of the registers and memory that will be changed into > + "record_arch_list". This instruction is "syscall". > + > + Return -1 if something wrong. */ > + > +static struct linux_record_tdep amd64_linux_record_tdep; > + > +#define RECORD_ARCH_GET_FS 0x1003 > +#define RECORD_ARCH_GET_GS 0x1004 > + > static int > amd64_linux_syscall_record (struct regcache *regcache) > { > @@ -1094,27 +1137,39 @@ amd64_linux_syscall_record (struct regca > > regcache_raw_read_unsigned (regcache, AMD64_RAX_REGNUM, &syscall_native); > > - syscall_gdb = amd64_canonicalize_syscall (syscall_native); > - > - if (syscall_native == amd64_sys_arch_prctl) > + switch (syscall_native) > { > - ULONGEST arg3; > + case amd64_sys_rt_sigreturn: > + if (amd64_all_but_ip_registers_record (regcache)) > + return -1; > + return 0; > + break; > > - regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg3, > - &arg3); > - if (arg3 == RECORD_ARCH_GET_FS || arg3 == RECORD_ARCH_GET_GS) > - { > - CORE_ADDR addr; > + case amd64_sys_arch_prctl: > + if (syscall_native == amd64_sys_arch_prctl) > + { > + ULONGEST arg3; > > - regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg2, > - &addr); > - if (record_arch_list_add_mem (addr, > - amd64_linux_record_tdep.size_ulong)) > - return -1; > - } > - goto record_regs; > + regcache_raw_read_unsigned (regcache, amd64_linux_record_tdep.arg3, > + &arg3); > + if (arg3 == RECORD_ARCH_GET_FS || arg3 == RECORD_ARCH_GET_GS) > + { > + CORE_ADDR addr; > + > + regcache_raw_read_unsigned (regcache, > + amd64_linux_record_tdep.arg2, > + &addr); > + if (record_arch_list_add_mem (addr, > + > amd64_linux_record_tdep.size_ulong)) > + return -1; > + } > + goto record_regs; > + } > + break; > } > > + syscall_gdb = amd64_canonicalize_syscall (syscall_native); > + > if (syscall_gdb < 0) > { > printf_unfiltered (_("Process record and replay target doesn't " > @@ -1137,6 +1192,44 @@ amd64_linux_syscall_record (struct regca > if (record_arch_list_add_reg (regcache, AMD64_R11_REGNUM)) > return -1; > > + return 0; > +} > + > +#define AMD64_LINUX_redzone 128 > +#define AMD64_LINUX_xstate 512 > +#define AMD64_LINUX_frame_size 560 > + > +int > +amd64_linux_record_signal (struct gdbarch *gdbarch, > + struct regcache *regcache, > + enum target_signal signal) > +{ > + ULONGEST rsp; > + > + if (amd64_all_but_ip_registers_record (regcache)) > + return -1; > + > + if (record_arch_list_add_reg (regcache, AMD64_RIP_REGNUM)) > + return -1; > + > + /* Record the change in the stack. */ > + regcache_raw_read_unsigned (regcache, AMD64_RSP_REGNUM, &rsp); > + /* redzone > + sp -= 128; */ > + rsp -= AMD64_LINUX_redzone; > + /* This is for xstate. > + sp -= sizeof (struct _fpstate); */ > + rsp -= AMD64_LINUX_xstate; > + /* This is for frame_size. > + sp -= sizeof (struct rt_sigframe); */ > + rsp -= AMD64_LINUX_frame_size; > + if (record_arch_list_add_mem (rsp, AMD64_LINUX_redzone > + + AMD64_LINUX_xstate > + + AMD64_LINUX_frame_size)) > + return -1; > + > + if (record_arch_list_add_end ()) > + return -1; > > return 0; > } > @@ -1187,6 +1280,7 @@ amd64_linux_init_abi (struct gdbarch_inf > set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type); > > set_gdbarch_process_record (gdbarch, i386_process_record); > + set_gdbarch_process_record_signal (gdbarch, amd64_linux_record_signal); > > /* Initialize the amd64_linux_record_tdep. */ > /* These values are the size of the type that will be used in a system