Messages in this thread | | | Date | Wed, 03 Nov 2021 10:18:22 +0300 | Subject | Re: Stackleak vs noinstr (Was: [GIT pull] objtool/core for v5.16-rc1) | From | Alexander Popov <> |
| |
On November 2, 2021 1:03:44 PM GMT+03:00, Peter Zijlstra <peterz@infradead.org> wrote: >On Tue, Nov 02, 2021 at 10:05:50AM +0100, Peter Zijlstra wrote: >> On Tue, Nov 02, 2021 at 09:00:36AM +0100, Peter Zijlstra wrote: >> > On Mon, Nov 01, 2021 at 01:44:39PM -0700, Linus Torvalds wrote: >> >> > > do_machine_check()+0x27: call to stackleak_track_stack ... >> > > do_syscall_64()+0x9: call to stackleak_track_stack ... >> > > do_int80_syscall_32()+0x9: call to stackleak_track_stack ... >> > > exc_general_protection()+0x22: call to stackleak_track_stack >... >> > > fixup_bad_iret()+0x20: call to stackleak_track_stack ... >> > > .entry.text+0x10e6: call to stackleak_erase ... >> > > .entry.text+0x143: call to stackleak_erase ... >> > > .entry.text+0x17d9: call to stackleak_erase ... >> > > >> > > most seem to be about the stackleak thing, >> > >> > Right, I recently ran into this and hacen't yet had time to look >into >> > it. I suspect my normal build box doesn't have the GCC plugin crud >> > enabled or somesuch. >> > >> > I think the GCC stackleak plugin needs fixing, specifically it >needs a >> > function attribute such that it will not emit instrumentation in >noinstr >> > functions. I'll go chase down the developer of that thing. >> >> Alexander, is there any way to make this plugin grow a function >> attribute which we can add to noinstr ? There's a strict requirement >the >> compiler doesn't add extra code to noinstr functions these days. >> >> We'll 'soon' be running noinstr C code before switching to kernel >page >> tables even. > >Using my pre-release GCC-12 compiler (the only one I have with plugin >crud enabled apparently), the below seems to work. > >Having the plugin gate on section name seems a lot hacky, but given >it's >already doing that, one more doesn't hurt.
Hello Peter!
Yes, this is a correct approach.
But I'm not sure about removing NOKPROBE_SYMBOL and notrace for stackleak_erase. Does the code in noinstr.text disable all those?
Best regards, Alexander
>--- >diff --git a/kernel/stackleak.c b/kernel/stackleak.c >index ce161a8e8d97..135866ca8878 100644 >--- a/kernel/stackleak.c >+++ b/kernel/stackleak.c >@@ -48,7 +48,7 @@ int stack_erasing_sysctl(struct ctl_table *table, int >write, > #define skip_erasing() false > #endif /* CONFIG_STACKLEAK_RUNTIME_DISABLE */ > >-asmlinkage void notrace stackleak_erase(void) >+asmlinkage noinstr void stackleak_erase(void) > { > /* It would be nice not to have 'kstack_ptr' and 'boundary' on stack >*/ > unsigned long kstack_ptr = current->lowest_stack; >@@ -102,7 +102,6 @@ asmlinkage void notrace stackleak_erase(void) > /* Reset the 'lowest_stack' value for the next syscall */ > current->lowest_stack = current_top_of_stack() - THREAD_SIZE/64; > } >-NOKPROBE_SYMBOL(stackleak_erase); > >void __used __no_caller_saved_registers notrace >stackleak_track_stack(void) > { >diff --git a/scripts/gcc-plugins/stackleak_plugin.c >b/scripts/gcc-plugins/stackleak_plugin.c >index e9db7dcb3e5f..07688a1c686b 100644 >--- a/scripts/gcc-plugins/stackleak_plugin.c >+++ b/scripts/gcc-plugins/stackleak_plugin.c >@@ -446,6 +446,8 @@ static bool stackleak_gate(void) > return false; > if (!strncmp(TREE_STRING_POINTER(section), ".meminit.text", 13)) > return false; >+ if (!strncmp(TREE_STRING_POINTER(section), ".noinstr.text", 13)) >+ return false; > } > > return track_frame_size >= 0;
| |