Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@vmware.com>
To: Hui Zhu <teawater@gmail.com>
Cc: Joel Brobecker <brobecker@adacore.com>,
	  "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: Re: [RFA] Make the prec support signal better[4/4] -- amd64-linux
Date: Sat, 19 Sep 2009 20:33:00 -0000	[thread overview]
Message-ID: <4AB53FF6.4030104@vmware.com> (raw)
In-Reply-To: <daef60380909091857m2aa797bfqa5b91f3f527f7c6c@mail.gmail.com>

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<mark.kettenis@xs4all.nl> wrote:
>>> From: Hui Zhu <teawater@gmail.com>
>>> 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  <msnyder@vmware.com>
>>>           Hui Zhu  <teawater@gmail.com>
>>>
>>>       * 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  <msnyder@vmware.com>
> 	    Hui Zhu  <teawater@gmail.com>
> 
> 	* 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


  reply	other threads:[~2009-09-19 20:33 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-09 13:29 Hui Zhu
2009-09-09 13:52 ` Mark Kettenis
2009-09-10  1:57   ` Hui Zhu
2009-09-19 20:33     ` Michael Snyder [this message]
2009-09-19 20:57       ` Mark Kettenis
2009-09-21  7:00         ` Hui Zhu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AB53FF6.4030104@vmware.com \
    --to=msnyder@vmware.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=teawater@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox