From: Laurent Vivier <laurent@vivier.eu>
To: Richard Henderson <richard.henderson@linaro.org>,
Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>,
dgibson@redhat.com, riku.voipio@iki.fi
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] linux-user: ppc64: don't use volatile register during safe_syscall
Date: Thu, 26 Jul 2018 19:39:38 +0200 [thread overview]
Message-ID: <db84d8c9-fab0-a1eb-7cd8-a154a2a76b10@vivier.eu> (raw)
In-Reply-To: <4671a0f0-e399-6187-3205-994f663fa260@linaro.org>
Le 26/07/2018 à 19:15, Richard Henderson a écrit :
> On 07/25/2018 11:48 PM, 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 and is appropriate for local use in
>> safe_syscall.
>>
>> Signed-off-by: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
>> ---
>> Steps to reproduce:
>> On PPC host, issue `qemu-ppc64le /usr/bin/cc -E -`
>> Attempt Ctrl-C, the issue is reproduced.
>>
>> Reference:
>> https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#REG
>>
>> linux-user/host/ppc64/safe-syscall.inc.S | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/linux-user/host/ppc64/safe-syscall.inc.S b/linux-user/host/ppc64/safe-syscall.inc.S
>> index d30050a67c..b0cbbe6a69 100644
>> --- a/linux-user/host/ppc64/safe-syscall.inc.S
>> +++ b/linux-user/host/ppc64/safe-syscall.inc.S
>> @@ -49,7 +49,7 @@ safe_syscall_base:
>> * and returns the result in r3
>> * Shuffle everything around appropriately.
>> */
>> - mr 11, 3 /* signal_pending */
>> + mr 14, 3 /* signal_pending */
>
> I do see that I was incorrect in assuming that r11 would be unmodified. But
> you can't simply write to a call-saved register -- you must preserve its value
> for the caller.
>
> Saving the value requires that you find some space on, or create, a stack
> frame. Note that there are two different conventions for _CALL_AIX and
> _CALL_ELF==2.
Can we guess the syscall ('sc') will not modify neither r11 nor r14, but
the function caller expects that r11 is not modified because it's the
environment pointer, and saves r14 because it's one of its local
variable it knows it has to preserve?
In this case, I think Shivaprasad's fix is correct.
Thanks,
Laurent
next prev parent reply other threads:[~2018-07-26 17:40 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-26 6:48 [Qemu-devel] [PATCH] linux-user: ppc64: don't use volatile register during safe_syscall Shivaprasad G Bhat
2018-07-26 7:48 ` Laurent Vivier
2018-07-26 17:15 ` Richard Henderson
2018-07-26 17:39 ` Laurent Vivier [this message]
2018-07-27 4:47 ` Richard Henderson
2018-07-27 8:01 ` Laurent Vivier
2018-07-26 17:26 ` Richard Henderson
2018-07-27 6:42 ` Shivaprasad G Bhat
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=db84d8c9-fab0-a1eb-7cd8-a154a2a76b10@vivier.eu \
--to=laurent@vivier.eu \
--cc=dgibson@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).