From: Florian Fuchs <fuchsfl@gmail.com>
To: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Rich Felker <dalias@libc.org>,
linux-sh@vger.kernel.org,
Geert Uytterhoeven <geert+renesas@glider.be>,
Yoshinori Sato <yoshinori.sato@nifty.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sh: lib: Restore r4 in shift helpers
Date: Tue, 6 Oct 2026 20:33:13 +0200 [thread overview]
Message-ID: <asU-6UBmN4OjNsLV@lithos> (raw)
In-Reply-To: <e2d4c042a53eddc1ea8d800e171e6c59c9d3f7e1.camel@physik.fu-berlin.de>
On 06 Oct 07:41, John Paul Adrian Glaubitz wrote:
> > Please correct me if I'm wrong, but after reading the code in [1], it looks
> > to me as your patch doesn't preserve r4 but it's actually storing it into
> > r0 to be used by the selected shift sequence.
Yes, the value is copied to r0 for the shift sequence to use, but only after
the r4 original value has been popped back into r4.
The shift sequence themselfs only operate on r0 and then rts, so nothing
touches r4 after this point.
So the caller gets the original r4 back, which is what GCC expects.
> > With the previous code, r4 is pushed onto the stack first but not restored
> > before the shift sequence is jumped to, so what your patch does not make sure
> > that r4 is restored across the complete call of the shift helper but rather
> > restore the input value in r4 from the stack before calling the jump sequence.
Yes, it needs the selected shift sequence to not touch r4 as well.
> Could you comment on this and maybe rephrase your commit message if you agree
> with my analysis? The patch itself is fine, but I think the description is
> somewhat inaccurate.
I think your analysis is correct. The selected shift sequences don't touch
other register beside r0, so I think it is currently not necessary to make
sure that r4 survives the complete call, even if the selected sequence would
touch r4.
Is it more accurate or which aspect would need a better message, or do
you dislike the "across the whole call" aspect? While the patch doesn't
really make sure r4 is always preserved, it reflects the behaviour after
the patch.
Commit 940d4113f330 ("sh: New gcc support") reuses r4 as scratch for
the jump table offset and pops the saved value into r0 in the jmp
delay slot, so the helpers return with r4 still holding the table
byte. GCC can keep a live value in r4 across the call, which leads to
runtime data corruption.
GCC calls __ashlsi3, __ashrsi3 and __lshrsi3 with a special convention:
value in r4, result in r0, and only r0 and T clobbered.
Pop the saved value back into r4 before the jmp and copy it to r0 in
the delay slot. The shift sequences only operate on r0, so r4 is now
preserved across the whole call.
Regards
Florian
next prev parent reply other threads:[~2026-10-06 18:33 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 10:41 Florian Fuchs
2026-09-16 19:35 ` John Paul Adrian Glaubitz
2026-09-17 7:17 ` John Paul Adrian Glaubitz
2026-09-22 13:19 ` yoshinori.sato
2026-09-22 13:40 ` John Paul Adrian Glaubitz
2026-10-06 5:41 ` John Paul Adrian Glaubitz
2026-10-06 18:33 ` Florian Fuchs [this message]
2026-10-06 18:54 ` John Paul Adrian Glaubitz
2026-10-06 21:44 ` David Laight
2026-10-07 5:03 ` John Paul Adrian Glaubitz
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=asU-6UBmN4OjNsLV@lithos \
--to=fuchsfl@gmail.com \
--cc=dalias@libc.org \
--cc=geert+renesas@glider.be \
--cc=glaubitz@physik.fu-berlin.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=yoshinori.sato@nifty.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
all inboxes | Powered by JetHome®