From: Helge Deller <deller@gmx.de>
To: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>,
Richard Henderson <rth@twiddle.net>,
John David Anglin <dave.anglin@bell.net>
Cc: linux-parisc@vger.kernel.org
Subject: Re: Testing the lws_compare_and_swap_2 syscall
Date: Mon, 6 Nov 2017 22:27:34 +0100 [thread overview]
Message-ID: <20171106212734.GA29237@ls3530.fritz.box> (raw)
In-Reply-To: <1508973952@msgid.manchmal.in-ulm.de>
* Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>:
> John David Anglin wrote...
>
> > On 2017-10-24, at 4:03 PM, Christoph Biedl wrote:
> >
> > > To start with, using the invalid value 4 as size parameter does not
> > > return ENOSYS as I'd expect but crashes my system[2], using both 32 and
> > > 64 bit kernel, no root privileges required.
> >
> > /* Check the validity of the size pointer */
> > subi,>>= 4, %r23, %r0
> > b,n lws_exit_nosys
> >
> > The condition in the subi instruction should be ">>". The branch is incorrectly nullified when
> > %r23 is 4.
I'd prefer this (untested) patch:
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
index 41e60a9c7db2..f8a8754322ae 100644
--- a/arch/parisc/kernel/syscall.S
+++ b/arch/parisc/kernel/syscall.S
@@ -698,8 +698,7 @@ lws_compare_and_swap_2:
#endif
/* Check the validity of the size pointer */
- subi,>>= 4, %r23, %r0
- b,n lws_exit_nosys
+ cmpib,COND(<<),n 3, %r23, lws_exit_nosys
/* Jump to the functions which will load the old and new values into
registers depending on the their size */
> Ups, way too obvious. This does the trick, or: Tested-By:
> Should I try to get a CVE number for this, or is parisc considered
> *that* historical nobody actually cares?
I think a CVE is not needed for parisc. There are no real productive
users (I assume).
> Now, using the given cmpxchg2 function, the following code tests this
> LWS for 32bit: The first test is for *mem == *old, the second for
> *mem != *old. Is there anything wrong with this?
>
> uint32_t mem;
> uint32_t old;
> uint32_t new;
>
> mem = 1;
> old = 1;
> new = 3;
> cmpxchg2 (&mem, &old, &new, 2);
> if (mem == old) {
> printf ("PASS: mem unchanged\n");
> } else {
> printf ("FAIL: got = 0x%x, expected = 0x%x\n", mem, old);
> }
>
> mem = 1;
> old = 3;
> new = 3;
> cmpxchg2 (&mem, &old, &new, 2);
> if (mem == new) {
> printf ("PASS: mem changed\n");
> } else {
> printf ("FAIL: got = 0x%x, expected = 0x%x\n", mem, new);
> }
>
> My problem here: Both tests fail, and so do more complex ones that test
> the other data sizes as well.
>
> After staring at lws_compare_and_swap_2 a long time it seems there are
> two issues: First, there is more usage of ",ma" so an update of mem/r26
> hits the wrong place. After that, all results are the wrong way around.
> I'm frightened to tell but I fear the logic in lws_compare_and_swap_2
> is inverted in each and every place. I'm happy to be convinced
> otherwise. But for the time being it seems the patch below is an
> improvement.
>
> Status: My system boots and all my tests pass. However, I find smartd
> stalling in 100% CPU, might be coincidence. Now I'm putting some more
> load onto the box to see whether it's less crashy then it used to be the
> previous weeks.
Did you continued your tests?
How were the results.
> Aside, there is another ",ma" modifier in lws_compare_and_swap that I
> fail to understand. Haven't checked yet in detail yet, though.
I'd suggest to keep the other ",ma" modifiers for now.
Helge
next prev parent reply other threads:[~2017-11-06 21:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-24 20:03 Testing the lws_compare_and_swap_2 syscall Christoph Biedl
2017-10-25 1:48 ` John David Anglin
2017-10-26 0:22 ` Christoph Biedl
2017-10-26 14:06 ` John David Anglin
2017-11-06 21:27 ` Helge Deller [this message]
2017-11-06 22:45 ` John David Anglin
2017-11-07 21:31 ` John David Anglin
2017-11-07 21:46 ` Christoph Biedl
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=20171106212734.GA29237@ls3530.fritz.box \
--to=deller@gmx.de \
--cc=dave.anglin@bell.net \
--cc=linux-kernel.bfrz@manchmal.in-ulm.de \
--cc=linux-parisc@vger.kernel.org \
--cc=rth@twiddle.net \
/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