From: Mark Rutland <mark.rutland@arm.com>
To: Catalin Marinas <catalin.marinas@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, will.deacon@arm.com,
marc.zyngier@arm.com, linux@dominikbrodowski.net,
hch@infradead.org, james.morse@arm.com, viro@zeniv.linux.org.uk,
linux-fsdevel@vger.kernel.org, dave.martin@arm.com
Subject: Re: [PATCHv3 08/19] arm64: convert raw syscall invocation to C
Date: Tue, 19 Jun 2018 15:48:45 +0100 [thread overview]
Message-ID: <20180619144845.22mgd4req5cnp5tv@lakrids.cambridge.arm.com> (raw)
In-Reply-To: <20180619142125.esqcbknxd2pqeotb@localhost>
On Tue, Jun 19, 2018 at 03:21:25PM +0100, Catalin Marinas wrote:
> On Mon, Jun 18, 2018 at 01:02:59PM +0100, Mark Rutland wrote:
> > diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c
> > new file mode 100644
> > index 000000000000..b463b962d597
> > --- /dev/null
> > +++ b/arch/arm64/kernel/syscall.c
> > @@ -0,0 +1,30 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +
> > +#include <linux/nospec.h>
> > +#include <linux/ptrace.h>
> > +
> > +long do_ni_syscall(struct pt_regs *regs);
> > +
> > +typedef long (*syscall_fn_t)(unsigned long, unsigned long,
> > + unsigned long, unsigned long,
> > + unsigned long, unsigned long);
> > +
> > +static void __invoke_syscall(struct pt_regs *regs, syscall_fn_t syscall_fn)
> > +{
> > + regs->regs[0] = syscall_fn(regs->regs[0], regs->regs[1],
> > + regs->regs[2], regs->regs[3],
> > + regs->regs[4], regs->regs[5]);
> > +}
> > +
> > +asmlinkage void invoke_syscall(struct pt_regs *regs, unsigned int scno,
> > + unsigned int sc_nr,
> > + syscall_fn_t syscall_table[])
> > +{
> > + if (scno < sc_nr) {
> > + syscall_fn_t syscall_fn;
> > + syscall_fn = syscall_table[array_index_nospec(scno, sc_nr)];
> > + __invoke_syscall(regs, syscall_fn);
> > + } else {
> > + regs->regs[0] = do_ni_syscall(regs);
> > + }
> > +}
>
> While reviewing the subsequent patch, it crossed my mind that we no
> longer have any callers to do_ni_syscall() outside this file. Can we not
> more it here and have a similar implementation to __invoke_syscall() for
> consistency, i.e. set regs->regs[0].
I think so, though it complicates the logic in do_ni_syscall(), since
there are two places we may return a value.
Would you be happy if instead I made __invoke_syscall() return the
result, and have invoke_syscall() place the result in regs->regs[0] in
either case, e.g. as below?
Thanks,
Mark.
---->8----
// SPDX-License-Identifier: GPL-2.0
#include <linux/errno.h>
#include <linux/nospec.h>
#include <linux/ptrace.h>
#include <linux/syscalls.h>
#include <asm/compat.h>
long compat_arm_syscall(struct pt_regs *regs);
static long do_ni_syscall(struct pt_regs *regs)
{
#ifdef CONFIG_COMPAT
long ret;
if (is_compat_task()) {
ret = compat_arm_syscall(regs);
if (ret != -ENOSYS)
return ret;
}
#endif
return sys_ni_syscall();
}
typedef long (*syscall_fn_t)(unsigned long, unsigned long,
unsigned long, unsigned long,
unsigned long, unsigned long);
static long __invoke_syscall(struct pt_regs *regs, syscall_fn_t syscall_fn)
{
return syscall_fn(regs->regs[0], regs->regs[1], regs->regs[2],
regs->regs[3], regs->regs[4], regs->regs[5]);
}
asmlinkage void invoke_syscall(struct pt_regs *regs, unsigned int scno,
unsigned int sc_nr,
syscall_fn_t syscall_table[])
{
long ret;
if (scno < sc_nr) {
syscall_fn_t syscall_fn;
syscall_fn = syscall_table[array_index_nospec(scno, sc_nr)];
ret = __invoke_syscall(regs, syscall_fn);
} else {
ret = do_ni_syscall(regs);
}
regs->regs[0] = ret;
}
next prev parent reply other threads:[~2018-06-19 14:48 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-18 12:02 [PATCHv3 00/19] arm64: invoke syscalls with pt_regs Mark Rutland
2018-06-18 12:02 ` [PATCHv3 01/19] arm64: consistently use unsigned long for thread flags Mark Rutland
2018-06-19 10:49 ` Catalin Marinas
2018-06-19 11:19 ` Mark Rutland
2018-06-18 12:02 ` [PATCHv3 02/19] arm64: move SCTLR_EL{1,2} assertions to <asm/sysreg.h> Mark Rutland
2018-06-19 11:02 ` [PATCHv3 02/19] arm64: move SCTLR_EL{1, 2} " Catalin Marinas
2018-06-19 11:48 ` [PATCHv3 02/19] arm64: move SCTLR_EL{1,2} " Mark Rutland
2018-06-18 12:02 ` [PATCHv3 03/19] arm64: introduce sysreg_clear_set() Mark Rutland
2018-06-19 11:44 ` Catalin Marinas
2018-06-19 11:47 ` Marc Zyngier
2018-06-18 12:02 ` [PATCHv3 04/19] arm64: kill config_sctlr_el1() Mark Rutland
2018-06-19 11:44 ` Catalin Marinas
2018-06-18 12:02 ` [PATCHv3 05/19] arm64: kill change_cpacr() Mark Rutland
2018-06-19 11:45 ` Catalin Marinas
2018-06-18 12:02 ` [PATCHv3 06/19] arm64: move sve_user_{enable,disable} to <asm/fpsimd.h> Mark Rutland
2018-06-19 12:00 ` [PATCHv3 06/19] arm64: move sve_user_{enable, disable} " Catalin Marinas
2018-06-19 12:19 ` Dave Martin
2018-06-18 12:02 ` [PATCHv3 07/19] arm64: remove sigreturn wrappers Mark Rutland
2018-06-19 12:47 ` Catalin Marinas
2018-06-18 12:02 ` [PATCHv3 08/19] arm64: convert raw syscall invocation to C Mark Rutland
2018-06-19 13:33 ` Catalin Marinas
2018-06-19 14:21 ` Catalin Marinas
2018-06-19 14:48 ` Mark Rutland [this message]
2018-06-19 14:55 ` Catalin Marinas
2018-06-19 14:58 ` Mark Rutland
2018-06-18 12:03 ` [PATCHv3 09/19] arm64: convert syscall trace logic " Mark Rutland
2018-06-19 14:32 ` Catalin Marinas
2018-06-19 15:14 ` Mark Rutland
2018-06-18 12:03 ` [PATCHv3 10/19] arm64: convert native/compat syscall entry " Mark Rutland
2018-06-19 12:18 ` Dave Martin
2018-06-19 13:15 ` Mark Rutland
2018-06-20 9:21 ` Dave Martin
2018-06-19 15:20 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 11/19] arm64: don't reload GPRs after apply_ssbd Mark Rutland
2018-06-19 15:23 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 12/19] arm64: zero GPRs upon entry from EL0 Mark Rutland
2018-06-19 15:24 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 13/19] kernel: add ksys_personality() Mark Rutland
2018-06-19 15:45 ` Catalin Marinas
2018-06-19 15:53 ` Mark Rutland
2018-06-18 12:03 ` [PATCHv3 14/19] kernel: add kcompat_sys_{f,}statfs64() Mark Rutland
2018-06-18 12:03 ` [PATCHv3 15/19] arm64: remove in-kernel call to sys_personality() Mark Rutland
2018-06-19 15:46 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 16/19] arm64: use {COMPAT,}SYSCALL_DEFINE0 for sigreturn Mark Rutland
2018-06-19 15:48 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 17/19] arm64: use SYSCALL_DEFINE6() for mmap Mark Rutland
2018-06-19 15:50 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 18/19] arm64: convert compat wrappers to C Mark Rutland
2018-06-19 15:51 ` Catalin Marinas
2018-06-18 12:03 ` [PATCHv3 19/19] arm64: implement syscall wrappers Mark Rutland
2018-06-19 16:13 ` Catalin Marinas
2018-06-19 15:38 ` [PATCHv3 00/19] arm64: invoke syscalls with pt_regs Mark Rutland
2018-06-19 16:14 ` Catalin Marinas
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=20180619144845.22mgd4req5cnp5tv@lakrids.cambridge.arm.com \
--to=mark.rutland@arm.com \
--cc=catalin.marinas@arm.com \
--cc=dave.martin@arm.com \
--cc=hch@infradead.org \
--cc=james.morse@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux@dominikbrodowski.net \
--cc=marc.zyngier@arm.com \
--cc=viro@zeniv.linux.org.uk \
--cc=will.deacon@arm.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).