From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: munroesj@us.ibm.com
Cc: "Ryan S. Arnold" <rsa@us.ibm.com>,
linux-arch@vger.kernel.org,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Mark Lord <kernel@teksavvy.com>,
Ulrich Drepper <drepper@redhat.com>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: 64-syscall args on 32-bit vs syscall()
Date: Tue, 16 Mar 2010 07:32:23 +1100 [thread overview]
Message-ID: <1268685143.2335.34.camel@pasglop> (raw)
In-Reply-To: <1268665412.19726.75.camel@spokane1.rchland.ibm.com>
> The powerpc implementation of syscall is:
>
>
> ENTRY (syscall)
> mr r0,r3
> mr r3,r4
> mr r4,r5
> mr r5,r6
> mr r6,r7
> mr r7,r8
> mr r8,r9
> sc
> PSEUDO_RET
> PSEUDO_END (syscall)
And my proposal is to make it instead:
#define syscall(__sysno, __args...) __syscall(0,__sysno,__args)
ENTRY (__syscall)
mr r0,r4
mr r3,r5
mr r4,r6
mr r5,r7
mr r6,r8
mr r7,r9
mr r8,r10
sc
PSEUDO_RET
PSEUDO_END (__syscall)
> The ABI says:
>
> "Long long arguments are considered to have 8-byte size and alignment.
> The same 8-byte arguments that must go in aligned pairs or registers are
> 8-byte aligned on the stack."
Right, that's what I'm explaining too.
> This implies that the SYS_fallocate call will skip a register to get the
> required alignment in the parameter save area.
>
> for ppc32 on entry
>
> r3 == SYS_fallocate
> r4 == fd
> r5 == mode
> r6 == not used
> r7, r8 == offset
> r9 == len
len is 64-bit too afaik but let's ignore that for now
> This gets shifted to:
>
> r0 == SYS_fallocate
> r3 == fd
> r4 == mode
> r5 == not used
> r6, r7 == offset
> r8 == len
Which is not correct, as the kernel expects:
r0 == SYS_fallocate
r3 == fd
r4 == mode
r5, r6 == offset
r7, r8 == len
> For syscall the vararg parms will be mirrored to the parameter save area
> but will not be used. The ABI does not talk to LE for this case.
Right, but the fact that we shift all args by -1- register means that we
break the 64-bit register pair alignment compared to the real syscall
which uses r0 instead for the syscall number. Hence my proposal to add
a dummy argument to restore that alignment.
As it is there is userspace code that does:
syscall(SYS_fallocate, fd, mode, offset, len);
Which works on x86 but is broken on ppc32 unless we do that change.
Cheers,
Ben.
> Ryan does the new ABI doc cover this?
>
> > This will break because the first argument to syscall now shifts
> > everything by one register, which breaks the register pair alignment
> > (and I suppose archs with stack based calling convention can have
> > similar alignment issues even if x86 doesn't).
> >
> > Ulrich, Steven, shouldn't we have glibc's syscall() take a long long as
> > it's first argument to correct that ? Either that or making it some kind
> > of macro wrapper around a __syscall(int dummy, int sysno, ...) ?
> >
> > As it is, any 32-bit app using syscall() on any of the syscalls that
> > takes 64-bit arguments will be broken, unless the app itself breaks up
> > the argument, but the the order of the hi and lo part is different
> > between BE and LE architectures ;-)
> >
> > So is there a more "correct" solution than another here ? Should powerpc
> > glibc be fixed at least so that syscall() keeps the alignment ?
> >
> > Cheers,
> > Ben.
> >
> >
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2010-03-15 20:32 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-15 4:48 64-syscall args on 32-bit vs syscall() Benjamin Herrenschmidt
2010-03-15 5:06 ` David Miller
2010-03-15 5:18 ` Benjamin Herrenschmidt
2010-03-15 5:54 ` David Miller
2010-03-15 20:22 ` Benjamin Herrenschmidt
2010-03-15 13:44 ` Ralf Baechle
2010-03-15 15:13 ` H. Peter Anvin
2010-03-15 16:00 ` Ulrich Drepper
2010-03-15 19:00 ` David Miller
2010-03-15 19:41 ` H. Peter Anvin
2010-03-15 20:35 ` Benjamin Herrenschmidt
2010-03-15 20:41 ` H. Peter Anvin
2010-03-16 21:56 ` Steven Munroe
2010-03-17 0:31 ` Benjamin Herrenschmidt
2010-03-17 5:52 ` Ulrich Drepper
2010-03-17 8:56 ` Benjamin Herrenschmidt
2010-03-17 9:14 ` Ulrich Drepper
2010-03-17 10:13 ` Benjamin Herrenschmidt
2010-03-17 9:18 ` Jamie Lokier
2010-03-17 10:18 ` Benjamin Herrenschmidt
2010-03-17 18:30 ` H. Peter Anvin
2010-03-17 20:35 ` Benjamin Herrenschmidt
2010-03-17 20:53 ` H. Peter Anvin
2010-03-17 22:58 ` Benjamin Herrenschmidt
2010-03-18 16:08 ` Steven Munroe
2010-03-18 16:21 ` Andreas Schwab
2010-03-18 17:03 ` Steven Munroe
2010-03-18 21:18 ` Benjamin Herrenschmidt
2010-03-19 1:22 ` Jamie Lokier
2010-03-15 20:27 ` Benjamin Herrenschmidt
2010-03-15 15:03 ` Steven Munroe
2010-03-15 20:32 ` Benjamin Herrenschmidt [this message]
2010-03-15 15:04 ` Jamie Lokier
2010-03-15 20:33 ` Benjamin Herrenschmidt
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=1268685143.2335.34.camel@pasglop \
--to=benh@kernel.crashing.org \
--cc=drepper@redhat.com \
--cc=kernel@teksavvy.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=munroesj@us.ibm.com \
--cc=rsa@us.ibm.com \
--cc=torvalds@linux-foundation.org \
/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.