From: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com>
To: Josh Poimboeuf <jpoimboe@redhat.com>, Mark Brown <broonie@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>,
Julien Thierry <jthierry@redhat.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Miroslav Benes <mbenes@suse.cz>, Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC PATCH 0/3] arm64: Implement reliable stack trace
Date: Fri, 29 Jan 2021 15:39:35 -0600 [thread overview]
Message-ID: <4a934966-0460-459c-cce3-ca67f099d781@linux.microsoft.com> (raw)
In-Reply-To: <20210128152649.6zin3hzim3etbv2p@treble>
On 1/28/21 9:26 AM, Josh Poimboeuf wrote:
>
> Hi all,
>
> I know this is an old patch set, but I'm not able to see the context,
> because I'm not subcribed to the ML. For future patch sets can you also
> add live-patching and lkml?
>
> Are we still considering the shadow stack thing? Just wondering why
> we're talking about objtool again.
>
I think that we are still considering the shadow stack thing. No discussion
has happened. Based on my limited knowledge of shadow stacks, I think that
shadow stacks do not get rid of objtool.
Here is what I feel about shadow stacks. Please correct me if I am wrong.
Advantages
==========
The only advantage in shadow stacks that I can see is that stack corruption
will not prevent unwinding from happening (unless the shadow stack gets
corrupted somehow).
Issues common with frame pointers
=================================
- The compiler has to generate the prolog and epilog. If we cannot trust the
compiler to generate these for frame pointers, can we trust it to
generate these for the shadow stack? If we can't, we would need objtool
anyway.
- The compiler would only generate shadow stack code for C functions.
For assembly functions, it has to be done by hand. So, objtool has to
check this anyway, right?
- Inline assembly in C functions can screw up the shadow stack just like
it can screw up frame pointers. Again, objtool needs to check.
- Performance hit because of the extra overhead in the prolog and the
epilog.
Issues unique to shadow stacks
==============================
- Performance hit because of the extra cache and memory footprint. There is
a paper that says that the performance hit can be as high as 10%. Using
a parallel shadow stack reduces the hit to about 3.5%. But then again,
the characteristics for the kernel may be different.
- A separate register has to be reserved for holding the shadow stack
pointer. The compiler (gcc) has to be changed to not use this register for
other purposes. And we have to trust that there are no compiler bugs
in this area. All assembly code that currently uses this register for
anything needs to be reviewed and potentially changed. This includes
all inline assembly code. BTW, I believe clang uses x18 for the shadow
stack pointer register.
- Need to decide if we need a separate shadow stack for task, IRQ,
overflow, etc. Or, use the same shadow stack. If it is the former,
we use more memory and need to switch stacks. If it is the latter,
we need to be aware of the boundaries between the different stack
traces in the shadow stack.
- longjmp style situations require unwinding the shadow stack by several
frames.
- either unwind the shadow stack repeatedly until the return
address matches with the original stack.
- for userland code, the shadow stack pointer can be saved in
setjmp and restored in longjmp. Something similar can be
done in the kernel.
- Minor issue is the sizing of the shadow stack so there is no overflow.
Questions
=========
Do we have to worry about code that modifies the return address
of a function?
Madhavan
_______________________________________________
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:[~2021-01-29 21:41 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-12 17:26 [RFC PATCH 0/3] arm64: Implement reliable stack trace Mark Brown
2020-10-12 17:26 ` [RFC PATCH 1/3] arm64: remove EL0 exception frame record Mark Brown
2020-10-12 17:26 ` [RFC PATCH 2/3] arm64: stacktrace: Report when we reach the end of the stack Mark Brown
2020-10-13 11:07 ` Mark Rutland
2020-10-12 17:26 ` [RFC PATCH 3/3] arm64: stacktrace: Implement reliable stacktrace Mark Brown
2020-10-13 10:42 ` Mark Brown
2020-10-13 11:42 ` Mark Rutland
2020-10-13 16:12 ` Mark Brown
2020-10-15 13:33 ` Miroslav Benes
2020-10-15 15:57 ` Mark Brown
2020-10-16 10:13 ` Miroslav Benes
2020-10-16 12:30 ` Mark Brown
2020-10-15 13:39 ` [RFC PATCH 0/3] arm64: Implement reliable stack trace Miroslav Benes
2020-10-15 14:16 ` Mark Rutland
2020-10-15 15:49 ` Mark Brown
2020-10-15 21:29 ` Josh Poimboeuf
2020-10-15 21:29 ` Josh Poimboeuf
2020-10-16 11:14 ` Mark Rutland
2020-10-16 11:14 ` Mark Rutland
2020-10-20 10:03 ` Mark Rutland
2020-10-20 10:03 ` Mark Rutland
2020-10-20 15:58 ` Josh Poimboeuf
2020-10-20 15:58 ` Josh Poimboeuf
2020-10-16 12:15 ` Mark Brown
2020-10-16 12:15 ` Mark Brown
2020-10-19 23:41 ` Josh Poimboeuf
2020-10-19 23:41 ` Josh Poimboeuf
2020-10-20 15:39 ` Mark Brown
2020-10-20 15:39 ` Mark Brown
2020-10-20 16:28 ` Josh Poimboeuf
2020-10-20 16:28 ` Josh Poimboeuf
2021-01-27 14:02 ` Madhavan T. Venkataraman
2021-01-27 16:40 ` Mark Rutland
2021-01-27 17:11 ` Mark Brown
2021-01-27 17:24 ` Madhavan T. Venkataraman
2021-01-27 19:54 ` Madhavan T. Venkataraman
2021-01-28 14:22 ` Mark Brown
2021-01-28 15:26 ` Josh Poimboeuf
2021-01-29 21:39 ` Madhavan T. Venkataraman [this message]
2021-02-01 3:20 ` Madhavan T. Venkataraman
2021-02-01 14:39 ` Mark Brown
2021-01-30 4:38 ` Madhavan T. Venkataraman
2021-02-01 15:21 ` Madhavan T. Venkataraman
2021-02-01 15:46 ` Madhavan T. Venkataraman
2021-02-01 16:02 ` Mark Rutland
2021-02-01 16:22 ` Mark Brown
2021-02-01 21:40 ` Madhavan T. Venkataraman
2021-02-01 21:38 ` Madhavan T. Venkataraman
2021-02-01 23:00 ` Josh Poimboeuf
2021-02-02 2:29 ` Madhavan T. Venkataraman
2021-02-02 3:36 ` Josh Poimboeuf
2021-02-02 10:05 ` Mark Rutland
2021-02-02 13:33 ` Madhavan T. Venkataraman
2021-02-02 13:35 ` Madhavan T. Venkataraman
2021-02-02 23:32 ` Madhavan T. Venkataraman
2021-02-03 16:53 ` Mark Rutland
2021-02-03 19:03 ` Madhavan T. Venkataraman
2021-02-05 2:36 ` Madhavan T. Venkataraman
2021-02-01 21:59 ` Madhavan T. Venkataraman
2021-02-02 13:36 ` Mark Brown
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=4a934966-0460-459c-cce3-ca67f099d781@linux.microsoft.com \
--to=madvenka@linux.microsoft.com \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=jpoimboe@redhat.com \
--cc=jthierry@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=mbenes@suse.cz \
--cc=will@kernel.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.