Message ID | 20200219000817.195049-5-samitolvanen@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v8,01/12] add support for Clang's Shadow Call Stack (SCS) | expand |
On Tue, Feb 18, 2020 at 04:08:09PM -0800, Sami Tolvanen wrote: > The graph tracer hooks returns by modifying frame records on the > (regular) stack, but with SCS the return address is taken from the > shadow stack, and the value in the frame record has no effect. As we > don't currently have a mechanism to determine the corresponding slot > on the shadow stack (and to pass this through the ftrace > infrastructure), for now let's disable SCS when the graph tracer is > enabled. > > Signed-off-by: Sami Tolvanen <samitolvanen@google.com> > Reviewed-by: Kees Cook <keescook@chromium.org> > --- > arch/Kconfig | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/Kconfig b/arch/Kconfig > index 66b34fd0df54..4102b8e0eea9 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -535,6 +535,7 @@ config ARCH_SUPPORTS_SHADOW_CALL_STACK > > config SHADOW_CALL_STACK > bool "Clang Shadow Call Stack" > + depends on !FUNCTION_GRAPH_TRACER Fangrui Song has implemented `-fpatchable-function-entry` in LLVM (for 10.x onwards), so we can support this when DYNAMIC_FTRACE_WITH_REGS is selected. This can be: depends on DYNAMIC_FTRACE_WITH_REGS || !FUNCTION_GRAPH_TRACER ... and we can update the commit message to something like: | With SCS the return address is taken from the shadow stack and the | value in the frame record has no effect. The mcount based graph tracer | hooks returns by modifying frame records on the (regular) stack, and | thus is not compatible. The patchable-function-entry graph tracer | used for DYNAMIC_FTRACE_WITH_REGS modifies the LR before it is saved | to the shadow stack, and is compatible. | | Modifying the mcount based graph tracer to work with SCS would require | a mechanism to determine the corresponding slot on the shadow stack | (and to pass this through the ftrace infrastructure), and we expect | that everyone will eventually move to the patchable-function-entry | based graph tracer anyway, so for now let's disable SCS when the | mcount-based graph tracer is enabled. | | SCS and patchable-function-entry are both supported from LLVM 10.x. Assuming you're happy with that: Reviewed-by: Mark Rutland <mark.rutland@arm.com> Thanks, Mark.
On Wed, Feb 19, 2020 at 3:34 AM Mark Rutland <mark.rutland@arm.com> wrote: > Fangrui Song has implemented `-fpatchable-function-entry` in LLVM (for > 10.x onwards), so we can support this when DYNAMIC_FTRACE_WITH_REGS is > selected. > > This can be: > > depends on DYNAMIC_FTRACE_WITH_REGS || !FUNCTION_GRAPH_TRACER > > ... and we can update the commit message to something like: > > | With SCS the return address is taken from the shadow stack and the > | value in the frame record has no effect. The mcount based graph tracer > | hooks returns by modifying frame records on the (regular) stack, and > | thus is not compatible. The patchable-function-entry graph tracer > | used for DYNAMIC_FTRACE_WITH_REGS modifies the LR before it is saved > | to the shadow stack, and is compatible. > | > | Modifying the mcount based graph tracer to work with SCS would require > | a mechanism to determine the corresponding slot on the shadow stack > | (and to pass this through the ftrace infrastructure), and we expect > | that everyone will eventually move to the patchable-function-entry > | based graph tracer anyway, so for now let's disable SCS when the > | mcount-based graph tracer is enabled. > | > | SCS and patchable-function-entry are both supported from LLVM 10.x. > > Assuming you're happy with that: > > Reviewed-by: Mark Rutland <mark.rutland@arm.com> Great, thanks for pointing that out! This looks good to me, I'll use this in v9. Sami
diff --git a/arch/Kconfig b/arch/Kconfig index 66b34fd0df54..4102b8e0eea9 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -535,6 +535,7 @@ config ARCH_SUPPORTS_SHADOW_CALL_STACK config SHADOW_CALL_STACK bool "Clang Shadow Call Stack" + depends on !FUNCTION_GRAPH_TRACER depends on ARCH_SUPPORTS_SHADOW_CALL_STACK help This option enables Clang's Shadow Call Stack, which uses a