From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: x86@kernel.org, "Paul E. McKenney" <paulmck@kernel.org>, Andy Lutomirski <luto@kernel.org>, Alexandre Chartre <alexandre.chartre@oracle.com>, Frederic Weisbecker <frederic@kernel.org>, Paolo Bonzini <pbonzini@redhat.com>, Sean Christopherson <sean.j.christopherson@intel.com>, Masami Hiramatsu <mhiramat@kernel.org>, Petr Mladek <pmladek@suse.com>, Steven Rostedt <rostedt@goodmis.org>, Joel Fernandes <joel@joelfernandes.org>, Boris Ostrovsky <boris.ostrovsky@oracle.com>, Juergen Gross <jgross@suse.com>, Brian Gerst <brgerst@gmail.com>, Mathieu Desnoyers <mathieu.desnoyers@efficios.com>, Josh Poimboeuf <jpoimboe@redhat.com>, Will Deacon <will@kernel.org> Subject: [patch V4 part 1 20/36] vmlinux.lds.h: Create section for protection against instrumentation Date: Tue, 05 May 2020 15:16:22 +0200 Message-ID: <20200505134100.075416272@linutronix.de> (raw) In-Reply-To: <20200505131602.633487962@linutronix.de> Some code pathes, especially the low level entry code, must be protected against instrumentation for various reasons: - Low level entry code can be a fragile beast, especially on x86. - With NO_HZ_FULL RCU state needs to be established before using it. Having a dedicated section for such code allows to validate with tooling that no unsafe functions are invoked. Add the .noinstr.text section and the noinstr attribute to mark functions. noinstr implies notrace. Kprobes will gain a section check later. Provide also a set of markers: instr_begin()/end() These are used to mark code inside a noinstr function which calls into regular instrumentable text section as safe. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- V2: Drop noinstr_call_begin()/end() --- include/asm-generic/sections.h | 3 +++ include/asm-generic/vmlinux.lds.h | 4 ++++ include/linux/compiler.h | 17 +++++++++++++++++ include/linux/compiler_types.h | 4 ++++ scripts/mod/modpost.c | 2 +- 5 files changed, 29 insertions(+), 1 deletion(-) --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h @@ -53,6 +53,9 @@ extern char __ctors_start[], __ctors_end /* Start and end of .opd section - used for function descriptors. */ extern char __start_opd[], __end_opd[]; +/* Start and end of instrumentation protected text section */ +extern char __noinstr_text_start[], __noinstr_text_end[]; + extern __visible const void __nosave_begin, __nosave_end; /* Function descriptor handling (if any). Override in asm/sections.h */ --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -551,6 +551,10 @@ #define TEXT_TEXT \ ALIGN_FUNCTION(); \ *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ + ALIGN_FUNCTION(); \ + __noinstr_text_start = .; \ + *(.noinstr.text) \ + __noinstr_text_end = .; \ *(.text..refcount) \ *(.ref.text) \ MEM_KEEP(init.text*) \ --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -120,10 +120,27 @@ void ftrace_likely_update(struct ftrace_ /* Annotate a C jump table to allow objtool to follow the code flow */ #define __annotate_jump_table __section(.rodata..c_jump_table) +/* Begin/end of an instrumentation safe region */ +#define instr_begin() ({ \ + asm volatile("%c0:\n\t" \ + ".pushsection .discard.instr_begin\n\t" \ + ".long %c0b - .\n\t" \ + ".popsection\n\t" : : "i" (__COUNTER__)); \ +}) + +#define instr_end() ({ \ + asm volatile("%c0:\n\t" \ + ".pushsection .discard.instr_end\n\t" \ + ".long %c0b - .\n\t" \ + ".popsection\n\t" : : "i" (__COUNTER__)); \ +}) + #else #define annotate_reachable() #define annotate_unreachable() #define __annotate_jump_table +#define instr_begin() do { } while(0) +#define instr_end() do { } while(0) #endif #ifndef ASM_UNREACHABLE --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -118,6 +118,10 @@ struct ftrace_likely_data { #define notrace __attribute__((__no_instrument_function__)) #endif +/* Section for code which can't be instrumented at all */ +#define noinstr \ + noinline notrace __attribute((__section__(".noinstr.text"))) + /* * it doesn't make sense on ARM (currently the only user of __naked) * to trace naked functions because then mcount is called without --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -948,7 +948,7 @@ static void check_section(const char *mo #define DATA_SECTIONS ".data", ".data.rel" #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \ - ".kprobes.text", ".cpuidle.text" + ".kprobes.text", ".cpuidle.text", ".noinstr.text" #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \ ".fixup", ".entry.text", ".exception.text", ".text.*", \ ".coldtext"
next prev parent reply index Thread overview: 178+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-05-05 13:16 [patch V4 part 1 00/36] x86/entry: Entry/exception code rework, preparatory patches Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 01/36] rcu: Add comments marking transitions between RCU watching and not Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 02/36] x86/hw_breakpoint: Prevent data breakpoints on cpu_entry_area Thomas Gleixner 2020-05-06 8:14 ` Borislav Petkov 2020-05-06 12:11 ` Alexandre Chartre 2020-05-09 9:00 ` Lai Jiangshan 2020-05-09 9:23 ` Lai Jiangshan 2020-05-09 19:08 ` Andy Lutomirski 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Andy Lutomirski 2020-05-05 13:16 ` [patch V4 part 1 03/36] sched: Clean up scheduler_ipi() Thomas Gleixner 2020-05-06 8:32 ` Thomas Gleixner 2020-05-06 8:40 ` Borislav Petkov 2020-05-06 9:12 ` Thomas Gleixner 2020-05-06 10:02 ` Borislav Petkov 2020-05-06 12:37 ` Alexandre Chartre 2020-05-06 15:03 ` Thomas Gleixner 2020-05-06 15:33 ` Peter Zijlstra 2020-05-06 18:28 ` Paul E. McKenney 2020-05-06 18:37 ` Peter Zijlstra 2020-05-06 18:46 ` Paul E. McKenney 2020-05-12 15:13 ` [tip: sched/core] " tip-bot2 for Peter Zijlstra (Intel) 2020-05-05 13:16 ` [patch V4 part 1 04/36] sched: Make scheduler_ipi inline Thomas Gleixner 2020-05-06 12:42 ` Alexandre Chartre 2020-05-12 15:13 ` [tip: sched/core] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 05/36] x86/entry: Flip _TIF_SIGPENDING and _TIF_NOTIFY_RESUME handling Thomas Gleixner 2020-05-06 11:53 ` Miroslav Benes 2020-05-06 12:06 ` Thomas Gleixner 2020-05-06 15:35 ` Peter Zijlstra 2020-05-06 13:06 ` Alexandre Chartre 2020-05-06 16:26 ` Borislav Petkov 2020-05-07 17:35 ` Andy Lutomirski 2020-05-13 20:56 ` Mathieu Desnoyers 2020-05-13 21:10 ` Steven Rostedt 2020-05-13 22:48 ` Mathieu Desnoyers 2020-05-14 0:12 ` Thomas Gleixner 2020-05-14 0:37 ` Steven Rostedt 2020-05-14 0:49 ` Thomas Gleixner 2020-05-14 1:22 ` Andy Lutomirski 2020-05-14 2:51 ` Mathieu Desnoyers 2020-05-14 9:19 ` Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 06/36] compiler: Simple READ/WRITE_ONCE() implementations Thomas Gleixner 2020-05-06 13:11 ` Alexandre Chartre 2020-05-06 13:33 ` Will Deacon 2020-05-06 15:36 ` Peter Zijlstra 2020-05-06 16:33 ` Borislav Petkov 2020-05-05 13:16 ` [patch V4 part 1 07/36] locking/atomics: Flip fallbacks and instrumentation Thomas Gleixner 2020-05-05 16:04 ` Mark Rutland 2020-05-07 23:41 ` Steven Rostedt 2020-05-08 8:40 ` Peter Zijlstra 2020-05-12 14:36 ` [tip: locking/kcsan] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 08/36] x86/doublefault: Remove memmove() call Thomas Gleixner 2020-05-06 13:47 ` Alexandre Chartre 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 09/36] x86/entry/64: Avoid pointless code when CONTEXT_TRACKING=n Thomas Gleixner 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 10/36] x86/entry: Remove the unused LOCKDEP_SYSEXIT cruft Thomas Gleixner 2020-05-06 13:52 ` Alexandre Chartre 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 11/36] x86/kvm: Handle async page faults directly through do_page_fault() Thomas Gleixner 2020-05-06 7:00 ` Paolo Bonzini 2020-05-06 14:05 ` Alexandre Chartre 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Andy Lutomirski 2020-05-05 13:16 ` [patch V4 part 1 12/36] x86/kvm: Sanitize kvm_async_pf_task_wait() Thomas Gleixner 2020-05-05 17:54 ` Paul E. McKenney 2020-05-05 21:50 ` Thomas Gleixner 2020-05-06 7:00 ` Paolo Bonzini 2020-05-06 12:53 ` Steven Rostedt 2020-05-06 15:13 ` Alexandre Chartre 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 13/36] x86/kvm: Restrict ASYNC_PF to user space Thomas Gleixner 2020-05-06 7:00 ` Paolo Bonzini 2020-05-06 15:29 ` Alexandre Chartre 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 14/36] x86/entry: Get rid of ist_begin/end_non_atomic() Thomas Gleixner 2020-05-06 15:34 ` Alexandre Chartre 2020-05-07 17:46 ` Andy Lutomirski 2020-05-13 22:57 ` Mathieu Desnoyers 2020-05-14 0:13 ` Steven Rostedt 2020-05-15 9:34 ` Thomas Gleixner 2020-05-15 13:11 ` Mathieu Desnoyers 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 15/36] kprobes: Lock kprobe_mutex while showing kprobe_blacklist Thomas Gleixner 2020-05-06 15:38 ` Alexandre Chartre 2020-05-12 15:18 ` [tip: core/kprobes] " tip-bot2 for Masami Hiramatsu 2020-05-05 13:16 ` [patch V4 part 1 16/36] kprobes: Support __kprobes blacklist in modules Thomas Gleixner 2020-05-06 15:47 ` Alexandre Chartre 2020-05-12 15:18 ` [tip: core/kprobes] " tip-bot2 for Masami Hiramatsu 2020-05-05 13:16 ` [patch V4 part 1 17/36] kprobes: Support NOKPROBE_SYMBOL() " Thomas Gleixner 2020-05-06 15:54 ` Alexandre Chartre 2020-05-12 15:18 ` [tip: core/kprobes] " tip-bot2 for Masami Hiramatsu 2020-05-05 13:16 ` [patch V4 part 1 18/36] samples/kprobes: Add __kprobes and NOKPROBE_SYMBOL() for handlers Thomas Gleixner 2020-05-06 15:57 ` Alexandre Chartre 2020-05-12 15:18 ` [tip: core/kprobes] " tip-bot2 for Masami Hiramatsu 2020-05-05 13:16 ` [patch V4 part 1 19/36] x86/entry: Exclude low level entry code from sanitizing Thomas Gleixner 2020-05-05 20:39 ` Brian Gerst 2020-05-06 15:42 ` Peter Zijlstra 2020-05-06 16:03 ` Alexandre Chartre 2020-05-13 22:58 ` Mathieu Desnoyers 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` Thomas Gleixner [this message] 2020-05-06 16:08 ` [patch V4 part 1 20/36] vmlinux.lds.h: Create section for protection against instrumentation Sean Christopherson 2020-05-06 16:28 ` Peter Zijlstra 2020-05-06 16:57 ` Thomas Gleixner 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 21/36] kprobes: Prevent probes in .noinstr.text section Thomas Gleixner 2020-05-08 6:30 ` Masami Hiramatsu 2020-05-19 19:52 ` [tip: core/kprobes] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 22/36] tracing: Provide lockdep less trace_hardirqs_on/off() variants Thomas Gleixner 2020-05-07 17:55 ` Andy Lutomirski 2020-05-07 18:52 ` Thomas Gleixner 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 23/36] bug: Annotate WARN/BUG/stackfail as noinstr safe Thomas Gleixner 2020-05-13 23:12 ` Mathieu Desnoyers 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Thomas Gleixner 2020-05-05 13:16 ` [patch V4 part 1 24/36] lockdep: Prepare for noinstr sections Thomas Gleixner 2020-05-08 0:23 ` Steven Rostedt 2020-05-08 8:44 ` Peter Zijlstra 2020-05-19 19:58 ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 25/36] rcu/tree: Mark the idle relevant functions noinstr Thomas Gleixner 2020-05-05 18:07 ` Paul E. McKenney 2020-05-19 19:48 ` Joel Fernandes 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Thomas Gleixner 2020-09-28 22:22 ` Kim Phillips 2020-09-28 22:55 ` Paul E. McKenney 2020-09-29 7:25 ` Peter Zijlstra 2020-09-29 11:25 ` Peter Zijlstra 2020-09-29 14:34 ` Steven Rostedt 2020-09-29 14:52 ` Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 26/36] printk: Prepare for nested printk_nmi_enter() Thomas Gleixner 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Petr Mladek 2020-05-05 13:16 ` [patch V4 part 1 27/36] arm64: Prepare arch_nmi_enter() for recursion Thomas Gleixner 2020-05-13 23:28 ` Mathieu Desnoyers 2020-05-15 14:04 ` Frederic Weisbecker 2020-05-15 15:45 ` Will Deacon 2020-05-15 16:01 ` Mathieu Desnoyers 2020-05-15 21:29 ` Thomas Gleixner 2020-05-15 21:31 ` Frederic Weisbecker 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Frederic Weisbecker 2020-05-05 13:16 ` [patch V4 part 1 28/36] hardirq/nmi: Allow nested nmi_enter() Thomas Gleixner 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 29/36] x86/mce: Send #MC singal from task work Thomas Gleixner 2020-05-07 18:02 ` Andy Lutomirski 2020-05-08 8:48 ` Peter Zijlstra 2020-05-08 21:30 ` Andy Lutomirski 2020-05-14 14:16 ` Borislav Petkov 2020-05-13 23:42 ` Mathieu Desnoyers 2020-05-14 17:38 ` Thomas Gleixner 2020-05-14 17:42 ` Mathieu Desnoyers 2020-05-14 14:17 ` Borislav Petkov 2020-05-14 16:03 ` Mathieu Desnoyers 2020-05-14 16:19 ` Andy Lutomirski 2020-05-14 16:39 ` Borislav Petkov 2020-05-14 17:05 ` Mathieu Desnoyers 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 30/36] lockdep: Always inline lockdep_{off,on}() Thomas Gleixner 2020-05-13 23:46 ` Mathieu Desnoyers 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 31/36] printk: Disallow instrumenting print_nmi_enter() Thomas Gleixner 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 32/36] sh/ftrace: Move arch_ftrace_nmi_{enter,exit} into nmi exception Thomas Gleixner 2020-05-08 0:34 ` Steven Rostedt 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 33/36] x86,tracing: Robustify ftrace_nmi_enter() Thomas Gleixner 2020-05-08 6:19 ` Masami Hiramatsu 2020-05-05 13:16 ` [patch V4 part 1 34/36] sched,rcu,tracing: Avoid tracing before in_nmi() is correct Thomas Gleixner 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 35/36] x86: Replace ist_enter() with nmi_enter() Thomas Gleixner 2020-05-07 18:04 ` Andy Lutomirski 2020-05-07 18:17 ` Mathieu Desnoyers 2020-05-08 8:50 ` Peter Zijlstra 2020-05-08 17:12 ` Josh Poimboeuf 2020-05-14 0:12 ` Mathieu Desnoyers 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Peter Zijlstra 2020-05-05 13:16 ` [patch V4 part 1 36/36] rcu: Make RCU IRQ enter/exit functions rely on in_nmi() Thomas Gleixner 2020-05-05 18:13 ` Paul E. McKenney 2020-05-06 17:09 ` Alexandre Chartre 2020-05-19 19:52 ` [tip: core/rcu] " tip-bot2 for Paul E. McKenney 2020-05-07 18:05 ` [patch V4 part 1 00/36] x86/entry: Entry/exception code rework, preparatory patches Andy Lutomirski
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=20200505134100.075416272@linutronix.de \ --to=tglx@linutronix.de \ --cc=alexandre.chartre@oracle.com \ --cc=boris.ostrovsky@oracle.com \ --cc=brgerst@gmail.com \ --cc=frederic@kernel.org \ --cc=jgross@suse.com \ --cc=joel@joelfernandes.org \ --cc=jpoimboe@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mathieu.desnoyers@efficios.com \ --cc=mhiramat@kernel.org \ --cc=paulmck@kernel.org \ --cc=pbonzini@redhat.com \ --cc=pmladek@suse.com \ --cc=rostedt@goodmis.org \ --cc=sean.j.christopherson@intel.com \ --cc=will@kernel.org \ --cc=x86@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
LKML Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git git clone --mirror https://lore.kernel.org/lkml/8 lkml/git/8.git git clone --mirror https://lore.kernel.org/lkml/9 lkml/git/9.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \ linux-kernel@vger.kernel.org public-inbox-index lkml Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git