From: Will Deacon <will@kernel.org>
To: Keno Fischer <keno@juliacomputing.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Kyle Huey <khuey@pernos.co>, Oleg Nesterov <oleg@redhat.com>,
linux-arm-kernel@lists.infradead.org,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: arm64: Register modification during syscall entry/exit stop
Date: Tue, 19 May 2020 09:15:51 +0100 [thread overview]
Message-ID: <20200519081551.GA9980@willie-the-truck> (raw)
In-Reply-To: <CABV8kRz0mKSc=u1LeonQSLroKJLOKWOWktCoGji2nvEBc=e7=w@mail.gmail.com>
Hi Keno,
On Mon, May 18, 2020 at 09:05:30PM -0400, Keno Fischer wrote:
> Continuing my theme of "weird things I encounter
> while trying to use ptrace on arm64", I ran into the
> effect of the following code in the syscall entry/exit
> reporting:
>
> ```
> /*
> * A scratch register (ip(r12) on AArch32, x7 on AArch64) is
> * used to denote syscall entry/exit:
> */
> regno = (is_compat_task() ? 12 : 7);
> saved_reg = regs->regs[regno];
> regs->regs[regno] = dir;
> ```
>
> This seems very weird to me. I can't think of any
> other architecture that does something similar
> (other than unicore32 apparently, but the ptrace
> support there seems like it might have just been
> copied from ARM). I'm able to work around this
> in my application, but it adds another stumbling block.
Yes, we inherited this from ARM and I think strace relies on it. In
hindsight, it is a little odd, although x7 is a parameter register in the
PCS and so it won't be live on entry to a system call.
> Some examples of things that happen:
> - Writes to x7 during syscall exit stops are ignored, so
> if the ptracer tries to emulate a setjmp-type thing, it
> might miss this register (ptracers sometimes like to do
> this to manually serialize execution between different
> threads, puppeteering a single thread of execution
> between different register states).
> - Reads from x7 are incorrect, so if the ptracer saves
> a register state and later tries to set it back to the task,
> it may get x7 incorrect, but user space may be expecting
> the register to be preserved (when might this happen? -
> consider a ptracer that wants to modify some syscall
> arguments, it modifies the arguments, restarts the syscall
> but then incurs a signal, so it tries to restore the original
> registers to let userspace deal with the signal without
> being confused - expect signal traps don't ignore x7
> modifications, so x7 may have been unexpectedly
> modified).
> - We now have seccomp traps, which kind of look and
> act like syscall-entry traps, but don't have this behavior,
> so it's not particularly reliable for ptracers to use.
>
> Furthermore, it seems unnecessary to me on modern
> kernels. We now have PTRACE_GET_SYSCALL_INFO,
> which exposes this information without lying to the ptracer
> about the tracee's registers.
>
> I understand, we can't just change this, since people may
> be relying on it, but I would like to propose adding a ptrace
> option (PTRACE_O_ARM_REGSGOOD?) that turns this
> behavior off. Now, I don't think we currently have any other
> arch-specific ptrace options, so maybe there is a different
> option that would be preferable (e.g. could be a different
> regset), but I do think it would be good to have a way to
> operate on the real x7 value. As I said, I can work around it,
> but hopefully I will be able to save a future implementer
> some headache.
I'm not opposed to extending ptrace so that we can try to wean people off
this interface, but I think we need some concrete situations where the
current behaviour actually causes a problem. Although the examples you've
listed above are interesting, I don't see why x7 is important in any of
them (and we only support up to 6 system call arguments).
Will
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-05-19 8:16 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-19 1:05 arm64: Register modification during syscall entry/exit stop Keno Fischer
2020-05-19 8:15 ` Will Deacon [this message]
2020-05-19 8:37 ` Keno Fischer
2020-05-20 17:41 ` Will Deacon
2020-05-23 5:35 ` Keno Fischer
2020-05-24 6:56 ` Keno Fischer
2020-05-27 9:55 ` Will Deacon
2020-05-27 10:19 ` Dave Martin
2020-05-31 9:33 ` Will Deacon
2020-05-31 16:13 ` Keno Fischer
2020-06-01 9:14 ` Dave Martin
2020-06-01 9:23 ` Keno Fischer
2020-06-01 9:52 ` Dave Martin
2020-05-31 16:20 ` Keno Fischer
2020-06-01 9:23 ` Dave Martin
2020-06-01 9:40 ` Keno Fischer
2020-06-01 9:59 ` Dave Martin
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=20200519081551.GA9980@willie-the-truck \
--to=will@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=keno@juliacomputing.com \
--cc=khuey@pernos.co \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.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