All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>,
	dgibson@redhat.com, riku.voipio@iki.fi, laurent@vivier.eu
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v3] linux-user: ppc64: don't use volatile register during safe_syscall
Date: Mon, 30 Jul 2018 08:44:07 -0400	[thread overview]
Message-ID: <4a633022-d560-a704-e143-928b8467f09c@linaro.org> (raw)
In-Reply-To: <153294521235.6959.12520498748431693809.stgit@dhcp-9-109-246-16>

On 07/30/2018 06:09 AM, Shivaprasad G Bhat wrote:
> r11 is a volatile register on PPC as per calling conventions.
> The safe_syscall code uses it to check if the signal_pending
> is set during the safe_syscall. When a syscall is interrupted
> on return from signal handling, the r11 might be corrupted
> before we retry the syscall leading to a crash. The registers
> r0-r13 are not to be used here as they have
> volatile/designated/reserved usages.
> 
> Change the code to use r14 which is non-volatile.
> Use SP+16 which is a slot for LR, for save/restore of previous value
> of r14. SP+16 can be used, as LR is preserved across the syscall.
> 
> Steps to reproduce:
> On PPC host, issue `qemu-x86_64 /usr/bin/cc -E -`
> Attempt Ctrl-C, the issue is reproduced.
> 
> Reference:
> https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#REG
> https://openpowerfoundation.org/wp-content/uploads/2016/03/ABI64BitOpenPOWERv1.1_16July2015_pub4.pdf
> 
> Signed-off-by: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>

This does fix the bug, so
Tested-by: Richard Henderson <richard.henderson@linaro.org>

But we can do slightly better:

> @@ -49,7 +49,8 @@ safe_syscall_base:
>  	 *               and returns the result in r3
>  	 * Shuffle everything around appropriately.
>  	 */
> -	mr	11, 3	/* signal_pending */
> +	std     14, 16(1) /* Preserve r14 in SP+16 */

Above this context, we have a .cfi_startproc directive, which indicates we are
providing unwind information for this function (trivial up to this point).

To preserve that, you need to add

	.cfi_offset 14, 16

right here, indicating r14 is saved 16 bytes "up" the stack frame.

Since this portion of the stack frame is allocated by the caller, this saved
value remains valid through the end of the function, so we do not need to do
anything at the points where the value is restored.

>  safe_syscall_end:
> +	ld 14, 16(1) /* restore r14 to its original value */
>  	/* code path when we did execute the syscall */

Swap these two lines.

With those two changes,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~

  reply	other threads:[~2018-07-30 12:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-30 10:09 [Qemu-devel] [PATCH v3] linux-user: ppc64: don't use volatile register during safe_syscall Shivaprasad G Bhat
2018-07-30 12:44 ` Richard Henderson [this message]
2018-07-30 19:16   ` Laurent Vivier
2018-07-31  0:42     ` David Gibson

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=4a633022-d560-a704-e143-928b8467f09c@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=dgibson@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=riku.voipio@iki.fi \
    --cc=sbhat@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.