x86: Rewrite exit-to-userspace code
Subsystems (6)
Andy Lutomirski
maintainerv5 cover x86: Rewrite exit-to-userspace code
This is the first big batch of x86 asm-to-C conversion patches.
The exit-to-usermode code is copied in several places and is written in a nasty combination of asm and C. It's not at all clear what it's supposed to do, and the way it's structured makes it very hard to work with. For example, it's not even clear why syscall exit hooks are called only once per syscall right now. (It seems to be a side effect of the way that rdi and rdx are handled in the asm loop, and it seems reliable, but it's still pointlessly complicated.) The existing code also makes context tracking overly complicated and hard to understand. Finally, it's nearly impossible for anyone to change what happens on exit to usermode, since the existing code is so fragile.
I tried to clean it up incrementally, but I decided it was too hard. Instead, this series just replaces the code. It seems to work.
Context tracking in particular works very differently now. The low-level entry code checks that we're in CONTEXT_USER and switches to CONTEXT_KERNEL. The exit code does the reverse. There is no need to track what CONTEXT_XYZ state we came from, because we already know. Similarly, SCHEDULE_USER is gone, since we can reschedule if needed by simply calling schedule() from C code.
The main things that are missing are that I haven't done the 32-bit parts (anyone want to help?) and therefore I haven't deleted the old C code. I also think this may break UML for trivial reasons.
IRQ context tracking is still messy. One the cleanup progresses to the point that we can enter CONTEXT_KERNEL in syscalls before enabling interrupts, we can fully clean up IRQ context tracking.
Once these land, I'll send some more :)
Note: we might want to backport patches 1 and 2.
Changes from v4:
- Remove now-unused SAVE_EXTRA_REGS_RBP macro
- Fix comment at the top of common.c
- Decorate internal labels in error_entry with .L
- Fix two mis-formatted asm lines
- Undo inadvertent removal of R11 initialization in the sysexit path
I didn't rename the error_entry labels.
Changes from v3:
- Add the syscall_arg_fault_32 test.
- Fix a pre-existing bad syscall arg buglet.
- Fix an asm glitch due to a bad rebase.
- Fix a CONFIG_PROVE_LOCKDEP warning.
Borislav: the end result of this series differs from the v3.91 that I only in the removal of a single trailing tab. The badarg patch is in a different place now, though, since we might want to backport it.
Changes from v2: Misplaced the actual list -- sorry.
Changes from v1:
- Fix bisection failure by squashing the 64-bit native and compat syscall conversions together. The intermediate state didn't built, and fixing it isn't worthwhile (the results will be harder to understand).
- Replace context_tracking_assert_state with CT_WARN_ON and ct_state.
- The last two patches are now. I incorrectly thought that we weren't ready for them yet on 32-bit kernels, but I was wrong.
Andy Lutomirski (16):
selftests/x86: Add a test for 32-bit fast syscall arg faults x86/entry/64/compat: Fix bad fast syscall arg failure path
context_tracking: Add ct_state and CT_WARN_ON
notifiers: Assert that RCU is watching in notify_die
x86: Move C entry and exit code to arch/x86/entry/common.c x86/traps: Assert that we're in CONTEXT_KERNEL in exception entries x86/entry: Add enter_from_user_mode and use it in syscalls x86/entry: Add new, comprehensible entry and exit hooks x86/entry/64: Really create an error-entry-from-usermode code path x86/entry/64: Migrate 64-bit and compat syscalls to new exit hooks x86/asm/entry/64: Save all regs on interrupt entry x86/asm/entry/64: Simplify irq stack pt_regs handling x86/asm/entry/64: Migrate error and interrupt exit work to C x86/entry: Remove exception_enter from most trap handlers x86/entry: Remove SCHEDULE_USER and asm/context-tracking.h x86/irq: Document how IRQ context tracking works and add an assertion
Ingo Molnar (1):
uml: Fix do_signal() prototype
arch/um/include/shared/kern_util.h | 3 +- arch/um/kernel/process.c | 6 +- arch/um/kernel/signal.c | 8 +- arch/um/kernel/tlb.c | 2 +- arch/um/kernel/trap.c | 2 +- arch/x86/entry/Makefile | 1 + arch/x86/entry/calling.h | 3 - arch/x86/entry/common.c | 374 ++++++++++++++++++++++++ arch/x86/entry/entry_64.S | 197 ++++--------- arch/x86/entry/entry_64_compat.S | 46 ++- arch/x86/include/asm/context_tracking.h | 10 - arch/x86/include/asm/signal.h | 1 + arch/x86/include/asm/traps.h | 4 +- arch/x86/kernel/cpu/mcheck/mce.c | 5 +- arch/x86/kernel/cpu/mcheck/p5.c | 5 +- arch/x86/kernel/cpu/mcheck/winchip.c | 4 +- arch/x86/kernel/irq.c | 15 + arch/x86/kernel/ptrace.c | 202 +------------ arch/x86/kernel/signal.c | 28 +- arch/x86/kernel/traps.c | 87 ++---- include/linux/context_tracking.h | 15 + include/linux/context_tracking_state.h | 1 + kernel/notifier.c | 2 + tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/syscall_arg_fault.c | 130 ++++++++ 25 files changed, 681 insertions(+), 472 deletions(-) create mode 100644 arch/x86/entry/common.c delete mode 100644 arch/x86/include/asm/context_tracking.h create mode 100644 tools/testing/selftests/x86/syscall_arg_fault.c
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 3/17 uml: Fix do_signal() prototype
From: Ingo Molnar <[email protected]>
Once x86 exports its do_signal(), the prototypes will clash.
Fix the clash and also improve the code a bit: remove the unnecessary kern_do_signal() indirection. This allows interrupt_end() to share the 'regs' parameter calculation.
Also remove the unused return code to match x86.
Minimally build and boot tested.
--- arch/um/include/shared/kern_util.h | 3 ++- arch/um/kernel/process.c | 6 ++++-- arch/um/kernel/signal.c | 8 +------- arch/um/kernel/tlb.c | 2 +- arch/um/kernel/trap.c | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-)
arch/um/include/shared/kern_util.h +2 -1
@@ -22,7 +22,8 @@ extern int kmalloc_ok;extern unsigned long alloc_stack (int order,int atomic);extern void free_stack (unsigned long stack,int order); -extern int do_signal (void ); +struct pt_regs ; +extern void do_signal (struct pt_regs *regs);extern void interrupt_end (void );extern void relay_signal (int sig,struct siginfo *si,struct uml_pt_regs *regs);
arch/um/kernel/process.c +4 -2
@@ -90,12 +90,14 @@ void *__switch_to(struct task_struct *from, struct task_struct *to)void interrupt_end (void ) { +struct pt_regs *regs = ¤t->thread.regs; +if (need_resched ())schedule ();if (test_thread_flag (TIF_SIGPENDING )) -do_signal (); +do_signal (regs);if (test_and_clear_thread_flag (TIF_NOTIFY_RESUME )) -tracehook_notify_resume (¤t->thread.regs); +tracehook_notify_resume (regs); }void exit_thread (void )
arch/um/kernel/signal.c +1 -7
@@ -64,7 +64,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)signal_setup_done (err, ksig, singlestep); } -static int kern_do_signal (struct pt_regs *regs) +void do_signal (struct pt_regs *regs) {struct ksignal ksig;int handled_sig =0 ;
@@ -110,10 +110,4 @@ static int kern_do_signal(struct pt_regs *regs)*/ if (!handled_sig)restore_saved_sigmask (); -return handled_sig; -} - -int do_signal (void ) -{ -return kern_do_signal (¤t->thread.regs); }
arch/um/kernel/tlb.c +1 -1
@@ -291,7 +291,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,/* We are under mmap_sem, release it such that current can terminate */ up_write (¤t->mm->mmap_sem);force_sig (SIGKILL , current); -do_signal (); +do_signal (¤t->thread.regs); } }
arch/um/kernel/trap.c +1 -1
@@ -173,7 +173,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)void fatal_sigsegv (void ) {force_sigsegv (SIGSEGV , current); -do_signal (); +do_signal (¤t->thread.regs);/* * This is to tell gcc that we're not returning - do_signal * can, in general, return, but in this case, it's not, since
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 2/17 x86/entry/64/compat: Fix bad fast syscall arg failure path
In reply to Andy LutomirskiIf user code does SYSCALL32 or SYSENTER without a valid stack, then our attempt to determine the syscall args will result in a failed uaccess fault. Previously, we would try to recover by jumping to the syscall exit code, but we'd run the syscall exit work even though we never made it to the syscall entry work.
Clean it up by treating the failure path as a non-syscall entry and exit pair.
This fixes strace's output when running the syscall_arg_fault test. Without this fix, strace would get out of sync and would fail to associate syscall entries with syscall exits.
--- arch/x86/entry/entry_64.S | 2 +- arch/x86/entry/entry_64_compat.S | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-)
arch/x86/entry/entry_64.S +1 -1
@@ -613,7 +613,7 @@ ret_from_intr: testb $3, CS(%rsp) jz retint_kernel /* Interrupt came from user space */ -retint_user: +GLOBAL(retint_user) GET_THREAD_INFO(%rcx) /* %rcx: thread info. Interrupts are off. */
arch/x86/entry/entry_64_compat.S +33 -2
@@ -425,8 +425,39 @@ cstar_tracesys: END(entry_SYSCALL_compat) ia32_badarg: - ASM_CLAC - movq $-EFAULT, RAX(%rsp) + /* + * So far, we've entered kernel mode, set AC, turned on IRQs, and + * saved C regs except r8-r11. We haven't done any of the other + * standard entry work, though. We want to bail, but we shouldn't + * treat this as a syscall entry since we don't even know what the + * args are. Instead, treat this as a non-syscall entry, finish + * the entry work, and immediately exit after setting AX = -EFAULT. + * + * We're really just being polite here. Killing the task outright + * would be a reasonable action, too. Given that the only valid + * way to have gotten here is through the vDSO, and we already know + * that the stack pointer is bad, the task isn't going to survive + * for long no matter what we do. + */ + + ASM_CLAC /* undo STAC */ + movq $-EFAULT, RAX(%rsp) /* return -EFAULT if possible */ + + /* Fill in the rest of pt_regs */ + xorl %eax, %eax + movq %rax, R11(%rsp) + movq %rax, R10(%rsp) + movq %rax, R9(%rsp) + movq %rax, R8(%rsp) + SAVE_EXTRA_REGS + + /* Turn IRQs back off. */ + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF + + /* And exit again. */ + jmp retint_user + ia32_ret_from_sys_call: xorl %eax, %eax /* Do not leak kernel information */ movq %rax, R11(%rsp)
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 1/17 selftests/x86: Add a test for 32-bit fast syscall arg faults
In reply to Andy LutomirskiThis test passes on 4.0 and fails on some newer kernels. Fortunately, the failure is likely not a big deal. This test will make sure that we don't break it further (e.g. OOPSing) as we clean up the entry code and that we eventually fix the regression.
There's arguably no need to preserve the old ABI here -- anything that makes it into a fast (vDSO) syscall with a bad stack is about to crash no matter what we do.
--- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/syscall_arg_fault.c | 130 ++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/x86/syscall_arg_fault.c
tools/testing/selftests/x86/Makefile +1 -1
@@ -5,7 +5,7 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean TARGETS_C_BOTHBITS := sigreturn single_step_syscall sysret_ss_attrs -TARGETS_C_32BIT_ONLY := entry_from_vm86 +TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32)
tools/testing/selftests/x86/syscall_arg_fault.c new file +130 -0
130 lines not on this page · raw message
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 4/17 context_tracking: Add ct_state and CT_WARN_ON
In reply to Andy LutomirskiThis will let us sprinkle sanity checks around the kernel without making too much of a mess.
--- include/linux/context_tracking.h | 15 +++++++++++++++ include/linux/context_tracking_state.h | 1 + 2 files changed, 16 insertions(+)
include/linux/context_tracking.h +15 -0
@@ -49,13 +49,28 @@ static inline void exception_exit(enum ctx_state prev_ctx) } } + +/** +* ct_state() - return the current context tracking state if known +* +* Returns the current cpu's context tracking state if context tracking +* is enabled. If context tracking is disabled, returns +* CONTEXT_DISABLED. This should be used primarily for debugging. +*/ +static inline enum ctx_state ct_state (void ) +{ +return context_tracking_is_enabled () ? +this_cpu_read (context_tracking.state) :CONTEXT_DISABLED ; +}#else static inline void user_enter (void ) { }static inline void user_exit (void ) { }static inline enum ctx_state exception_enter (void ) {return 0 ; }static inline void exception_exit (enum ctx_state prev_ctx) { } +static inline enum ctx_state ct_state (void ) {return CONTEXT_DISABLED ; }#endif /* !CONFIG_CONTEXT_TRACKING */ +#define CT_WARN_ON (cond) WARN_ON(context_tracking_is_enabled() && (cond))#ifdef CONFIG_CONTEXT_TRACKING_FORCE extern void context_tracking_init (void );
include/linux/context_tracking_state.h +1 -0
@@ -14,6 +14,7 @@ struct context_tracking {bool active;int recursion;enum ctx_state { +CONTEXT_DISABLED =-1 ,/* returned by ct_state() if unknown */ CONTEXT_KERNEL =0 ,CONTEXT_USER ,CONTEXT_GUEST ,
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 17/17 x86/irq: Document how IRQ context tracking works and add an assertion
In reply to Andy Lutomirski--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/x86/kernel/irq.c +15 -0
@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq; +/* +* NB: Unlike exception entries, IRQ entries do not reliably +* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +entering_irq (); +/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" ); + irq =__this_cpu_read (vector_irq[vector]);if (!handle_irq (irq, regs)) {
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 16/17 x86/entry: Remove SCHEDULE_USER and asm/context-tracking.h
In reply to Andy LutomirskiSCHEDULE_USER is no longer used, and asm/context-tracking.h contained nothing else. Remove the header entirely
--- arch/x86/entry/entry_64.S | 1 - arch/x86/include/asm/context_tracking.h | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 arch/x86/include/asm/context_tracking.h
arch/x86/entry/entry_64.S +0 -1
@@ -33,7 +33,6 @@ #include <asm/paravirt.h> #include <asm/percpu.h> #include <asm/asm.h> -#include <asm/context_tracking.h> #include <asm/smap.h> #include <asm/pgtable_types.h> #include <linux/err.h>
arch/x86/include/asm/context_tracking.h deleted +0 -10
@@ -1,10 +0,0 @@ -#ifndef _ASM_X86_CONTEXT_TRACKING_H -#define _ASM_X86_CONTEXT_TRACKING_H - -#ifdef CONFIG_CONTEXT_TRACKING -# define SCHEDULE_USER call schedule_user -#else -# define SCHEDULE_USER call schedule -#endif - -#endif
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 15/17 x86/entry: Remove exception_enter from most trap handlers
In reply to Andy LutomirskiOn 64-bit kernels, we don't need it any more: we handle context tracking directly on entry from user mode and exit to user mode. On 32-bit kernels, we don't support context tracking at all, so these hooks had no effect.
This doesn't change do_page_fault. Before we do that, we need to make sure that there is no code that can page fault from kernel mode with CONTEXT_USER. The 32-bit fast system call stack argument code is the only offender I'm aware of right now.
--- arch/x86/include/asm/traps.h | 4 +- arch/x86/kernel/cpu/mcheck/mce.c | 5 +-- arch/x86/kernel/cpu/mcheck/p5.c | 5 +-- arch/x86/kernel/cpu/mcheck/winchip.c | 4 +- arch/x86/kernel/traps.c | 78 +++++++++--------------------------- 5 files changed, 27 insertions(+), 69 deletions(-)
arch/x86/include/asm/traps.h +2 -2
@@ -112,8 +112,8 @@ asmlinkage void smp_threshold_interrupt(void); asmlinkage void smp_deferred_error_interrupt(void);#endif -extern enum ctx_state ist_enter (struct pt_regs *regs); -extern void ist_exit (struct pt_regs *regs,enum ctx_state prev_state); +extern void ist_enter (struct pt_regs *regs); +extern void ist_exit (struct pt_regs *regs);extern void ist_begin_non_atomic (struct pt_regs *regs);extern void ist_end_non_atomic (void );
arch/x86/kernel/cpu/mcheck/mce.c +2 -3
@@ -1029,7 +1029,6 @@ void do_machine_check(struct pt_regs *regs, long error_code) {struct mca_config *cfg = &mca_cfg;struct mce m, *final; -enum ctx_state prev_state;int i;int worst =0 ;int severity;
@@ -1055,7 +1054,7 @@ void do_machine_check(struct pt_regs *regs, long error_code)int flags =MF_ACTION_REQUIRED ;int lmce =0 ; - prev_state =ist_enter (regs); +ist_enter (regs);this_cpu_inc (mce_exception_count);
@@ -1227,7 +1226,7 @@ out:local_irq_disable ();ist_end_non_atomic (); done: -ist_exit (regs, prev_state); +ist_exit (regs); }EXPORT_SYMBOL_GPL (do_machine_check);
arch/x86/kernel/cpu/mcheck/p5.c +2 -3
@@ -19,10 +19,9 @@ int mce_p5_enabled __read_mostly;/* Machine check handler for Pentium class Intel CPUs: */ static void pentium_machine_check (struct pt_regs *regs,long error_code) { -enum ctx_state prev_state;u32 loaddr, hi, lotype; - prev_state =ist_enter (regs); +ist_enter (regs);rdmsr (MSR_IA32_P5_MC_ADDR , loaddr, hi);rdmsr (MSR_IA32_P5_MC_TYPE , lotype, hi);
@@ -39,7 +38,7 @@ static void pentium_machine_check(struct pt_regs *regs, long error_code)add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_NOW_UNRELIABLE ); -ist_exit (regs, prev_state); +ist_exit (regs); }/* Set up machine check reporting for processors with Intel style MCE: */
arch/x86/kernel/cpu/mcheck/winchip.c +2 -2
@@ -15,12 +15,12 @@/* Machine check handler for WinChip C6: */ static void winchip_machine_check (struct pt_regs *regs,long error_code) { -enum ctx_state prev_state =ist_enter (regs); +ist_enter (regs);printk (KERN_EMERG "CPU0: Machine Check Exception.\n" );add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_NOW_UNRELIABLE ); -ist_exit (regs, prev_state); +ist_exit (regs); }/* Set up machine check reporting on the Winchip C6 series */
arch/x86/kernel/traps.c +19 -59
264 lines not on this page · raw message
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 14/17 x86/asm/entry/64: Migrate error and interrupt exit work to C
In reply to Andy Lutomirski--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)
arch/x86/entry/entry_64.S +18 -46
@@ -508,7 +508,16 @@ END(irq_entries_start) testb $3, CS(%rsp) jz 1f + + /* + * IRQ from user mode. Switch to kernel gsbase and inform context + * tracking that we're in kernel mode. + */ SWAPGS +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + 1: /* * Save previous stack pointer, optionally switch to interrupt stack.
@@ -547,26 +556,13 @@ ret_from_intr: testb $3, CS(%rsp) jz retint_kernel - /* Interrupt came from user space */ -GLOBAL(retint_user) - GET_THREAD_INFO(%rcx) - /* %rcx: thread info. Interrupts are off. */ -retint_with_reschedule: - movl $_TIF_WORK_MASK, %edi -retint_check: + /* Interrupt came from user space */ LOCKDEP_SYS_EXIT_IRQ - movl TI_flags(%rcx), %edx - andl %edi, %edx - jnz retint_careful - -retint_swapgs: /* return to user-space */ - /* - * The iretq could re-enable interrupts: - */ - DISABLE_INTERRUPTS(CLBR_ANY) +GLOBAL(retint_user) + mov %rsp,%rdi + call prepare_exit_to_usermode TRACE_IRQS_IRETQ - SWAPGS jmp restore_regs_and_iret
@@ -644,35 +640,6 @@ native_irq_return_ldt: popq %rax jmp native_irq_return_iret #endif - - /* edi: workmask, edx: work */ -retint_careful: - bt $TIF_NEED_RESCHED, %edx - jnc retint_signal - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - pushq %rdi - SCHEDULE_USER - popq %rdi - GET_THREAD_INFO(%rcx) - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp retint_check - -retint_signal: - testl $_TIF_DO_NOTIFY_MASK, %edx - jz retint_swapgs - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - movq $-1, ORIG_RAX(%rsp) - xorl %esi, %esi /* oldset */ - movq %rsp, %rdi /* &pt_regs */ - call do_notify_resume - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - GET_THREAD_INFO(%rcx) - jmp retint_with_reschedule - END(common_interrupt) /*
@@ -1088,7 +1055,12 @@ ENTRY(error_entry) SWAPGS .Lerror_entry_from_usermode_after_swapgs: +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + .Lerror_entry_done: + TRACE_IRQS_OFF ret
arch/x86/entry/entry_64_compat.S +5 -0
@@ -455,6 +455,11 @@ ia32_badarg: DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF + /* Now finish entering normal kernel mode. */ +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + /* And exit again. */ jmp retint_user
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 13/17 x86/asm/entry/64: Simplify irq stack pt_regs handling
In reply to Andy LutomirskiThere's no need for both rsi and rdi to point to the original stack.
--- arch/x86/entry/entry_64.S | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/x86/entry/entry_64.S +3 -5
@@ -506,8 +506,6 @@ END(irq_entries_start) SAVE_C_REGS SAVE_EXTRA_REGS - movq %rsp,%rdi /* arg1 for \func (pointer to pt_regs) */ - testb $3, CS(%rsp) jz 1f SWAPGS
@@ -519,14 +517,14 @@ END(irq_entries_start) * a little cheaper to use a separate counter in the PDA (short of * moving irq_enter into assembly, which would be too much work) */ - movq %rsp, %rsi + movq %rsp, %rdi incl PER_CPU_VAR(irq_count) cmovzq PER_CPU_VAR(irq_stack_ptr), %rsp - pushq %rsi + pushq %rdi /* We entered an interrupt context - irqs are off: */ TRACE_IRQS_OFF - call \func + call \func /* rdi points to pt_regs */ .endm /*
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 12/17 x86/asm/entry/64: Save all regs on interrupt entry
In reply to Andy LutomirskiTo prepare for the big rewrite of the error and interrupt exit paths, we will need pt_regs completely filled in. It's already completely filled in when error_exit runs, so rearrange interrupt handling to match it. This will slow down interrupt handling very slightly (eight instructions), but the simplification it enables will be more than worth it.
--- arch/x86/entry/calling.h | 3 --- arch/x86/entry/entry_64.S | 29 +++++++++-------------------- 2 files changed, 9 insertions(+), 23 deletions(-)
arch/x86/entry/calling.h +0 -3
@@ -135,9 +135,6 @@ For 32-bit we have the following conventions - kernel is built with movq %rbp, 4*8+\offset(%rsp) movq %rbx, 5*8+\offset(%rsp) .endm - .macro SAVE_EXTRA_REGS_RBP offset=0 - movq %rbp, 4*8+\offset(%rsp) - .endm .macro RESTORE_EXTRA_REGS offset=0 movq 0*8+\offset(%rsp), %r15
arch/x86/entry/entry_64.S +9 -20
@@ -502,21 +502,13 @@ END(irq_entries_start) /* 0(%rsp): ~(interrupt number) */ .macro interrupt func cld - /* - * Since nothing in interrupt handling code touches r12...r15 members - * of "struct pt_regs", and since interrupts can nest, we can save - * four stack slots and simultaneously provide - * an unwind-friendly stack layout by saving "truncated" pt_regs - * exactly up to rbp slot, without these members. - */ - ALLOC_PT_GPREGS_ON_STACK -RBP - SAVE_C_REGS -RBP - /* this goes to 0(%rsp) for unwinder, not for saving the value: */ - SAVE_EXTRA_REGS_RBP -RBP + ALLOC_PT_GPREGS_ON_STACK + SAVE_C_REGS + SAVE_EXTRA_REGS - leaq -RBP(%rsp), %rdi /* arg1 for \func (pointer to pt_regs) */ + movq %rsp,%rdi /* arg1 for \func (pointer to pt_regs) */ - testb $3, CS-RBP(%rsp) + testb $3, CS(%rsp) jz 1f SWAPGS 1:
@@ -553,9 +545,7 @@ ret_from_intr: decl PER_CPU_VAR(irq_count) /* Restore saved previous stack */ - popq %rsi - /* return code expects complete pt_regs - adjust rsp accordingly: */ - leaq -RBP(%rsi), %rsp + popq %rsp testb $3, CS(%rsp) jz retint_kernel
@@ -580,7 +570,7 @@ retint_swapgs: /* return to user-space */ TRACE_IRQS_IRETQ SWAPGS - jmp restore_c_regs_and_iret + jmp restore_regs_and_iret /* Returning to kernel space */ retint_kernel:
@@ -604,6 +594,8 @@ retint_kernel: * At this label, code paths which return to kernel and to user, * which come from interrupts/exception and from syscalls, merge. */ +restore_regs_and_iret: + RESTORE_EXTRA_REGS restore_c_regs_and_iret: RESTORE_C_REGS REMOVE_PT_GPREGS_FROM_STACK 8
@@ -674,12 +666,10 @@ retint_signal: jz retint_swapgs TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) - SAVE_EXTRA_REGS movq $-1, ORIG_RAX(%rsp) xorl %esi, %esi /* oldset */ movq %rsp, %rdi /* &pt_regs */ call do_notify_resume - RESTORE_EXTRA_REGS DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF GET_THREAD_INFO(%rcx)
@@ -1160,7 +1150,6 @@ END(error_entry) */ ENTRY(error_exit) movl %ebx, %eax - RESTORE_EXTRA_REGS DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF testl %eax, %eax
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 11/17 x86/entry/64: Migrate 64-bit and compat syscalls to new exit hooks
In reply to Andy LutomirskiThese need to be migrated together, as the compat case used to jump into the middle of the 64-bit exit code.
--- arch/x86/entry/entry_64.S | 69 +++++----------------------------------- arch/x86/entry/entry_64_compat.S | 6 ++-- 2 files changed, 11 insertions(+), 64 deletions(-)
arch/x86/entry/entry_64.S +8 -61
@@ -229,6 +229,11 @@ entry_SYSCALL_64_fastpath: */ USERGS_SYSRET64 +GLOBAL(int_ret_from_sys_call_irqs_off) + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) + jmp int_ret_from_sys_call + /* Do syscall entry tracing */ tracesys: movq %rsp, %rdi
@@ -272,69 +277,11 @@ tracesys_phase2: * Has correct iret frame. */ GLOBAL(int_ret_from_sys_call) - DISABLE_INTERRUPTS(CLBR_NONE) -int_ret_from_sys_call_irqs_off: /* jumps come here from the irqs-off SYSRET path */ - TRACE_IRQS_OFF - movl $_TIF_ALLWORK_MASK, %edi - /* edi: mask to check */ -GLOBAL(int_with_check) - LOCKDEP_SYS_EXIT_IRQ - GET_THREAD_INFO(%rcx) - movl TI_flags(%rcx), %edx - andl %edi, %edx - jnz int_careful - andl $~TS_COMPAT, TI_status(%rcx) - jmp syscall_return - - /* - * Either reschedule or signal or syscall exit tracking needed. - * First do a reschedule test. - * edx: work, edi: workmask - */ -int_careful: - bt $TIF_NEED_RESCHED, %edx - jnc int_very_careful - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - pushq %rdi - SCHEDULE_USER - popq %rdi - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp int_with_check - - /* handle signals and tracing -- both require a full pt_regs */ -int_very_careful: - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) SAVE_EXTRA_REGS - /* Check for syscall exit trace */ - testl $_TIF_WORK_SYSCALL_EXIT, %edx - jz int_signal - pushq %rdi - leaq 8(%rsp), %rdi /* &ptregs -> arg1 */ - call syscall_trace_leave - popq %rdi - andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU), %edi - jmp int_restore_rest - -int_signal: - testl $_TIF_DO_NOTIFY_MASK, %edx - jz 1f - movq %rsp, %rdi /* &ptregs -> arg1 */ - xorl %esi, %esi /* oldset -> arg2 */ - call do_notify_resume -1: movl $_TIF_WORK_MASK, %edi -int_restore_rest: + movq %rsp, %rdi + call syscall_return_slowpath /* returns with IRQs disabled */ RESTORE_EXTRA_REGS - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp int_with_check - -syscall_return: - /* The IRETQ could re-enable interrupts: */ - DISABLE_INTERRUPTS(CLBR_ANY) - TRACE_IRQS_IRETQ + TRACE_IRQS_IRETQ /* we're about to change IF */ /* * Try to use SYSRET instead of IRET if we're returning to
arch/x86/entry/entry_64_compat.S +3 -3
@@ -209,10 +209,10 @@ sysexit_from_sys_call: .endm .macro auditsys_exit exit - testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) - jnz ia32_ret_from_sys_call TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) + testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) + jnz ia32_ret_from_sys_call movl %eax, %esi /* second arg, syscall return value */ cmpl $-MAX_ERRNO, %eax /* is it an error ? */ jbe 1f
@@ -231,7 +231,7 @@ sysexit_from_sys_call: movq %rax, R10(%rsp) movq %rax, R9(%rsp) movq %rax, R8(%rsp) - jmp int_with_check + jmp int_ret_from_sys_call_irqs_off .endm sysenter_auditsys:
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 10/17 x86/entry/64: Really create an error-entry-from-usermode code path
In reply to Andy LutomirskiIn 539f51136500 ("x86/asm/entry/64: Disentangle error_entry/exit gsbase/ebx/usermode code"), I arranged the code slightly wrong -- IRET faults would skip the code path that was intended to execute on all error entries from user mode. Fix it up.
While we're at it, make all the labels in error_entry local.
This does not fix a bug, but we'll need it, and it slightly shrinks the code.
--- arch/x86/entry/entry_64.S | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
arch/x86/entry/entry_64.S +16 -12
@@ -1143,12 +1143,17 @@ ENTRY(error_entry) SAVE_EXTRA_REGS 8 xorl %ebx, %ebx testb $3, CS+8(%rsp) - jz error_kernelspace + jz .Lerror_kernelspace - /* We entered from user mode */ +.Lerror_entry_from_usermode_swapgs: + /* + * We entered from user mode or we're pretending to have entered + * from user mode due to an IRET fault. + */ SWAPGS -error_entry_done: +.Lerror_entry_from_usermode_after_swapgs: +.Lerror_entry_done: TRACE_IRQS_OFF ret
@@ -1158,31 +1163,30 @@ error_entry_done: * truncated RIP for IRET exceptions returning to compat mode. Check * for these here too. */ -error_kernelspace: +.Lerror_kernelspace: incl %ebx leaq native_irq_return_iret(%rip), %rcx cmpq %rcx, RIP+8(%rsp) - je error_bad_iret + je .Lerror_bad_iret movl %ecx, %eax /* zero extend */ cmpq %rax, RIP+8(%rsp) - je bstep_iret + je .Lbstep_iret cmpq $gs_change, RIP+8(%rsp) - jne error_entry_done + jne .Lerror_entry_done /* * hack: gs_change can fail with user gsbase. If this happens, fix up * gsbase and proceed. We'll fix up the exception and land in * gs_change's error handler with kernel gsbase. */ - SWAPGS - jmp error_entry_done + jmp .Lerror_entry_from_usermode_swapgs -bstep_iret: +.Lbstep_iret: /* Fix truncated RIP */ movq %rcx, RIP+8(%rsp) /* fall through */ -error_bad_iret: +.Lerror_bad_iret: /* * We came from an IRET to user mode, so we have user gsbase. * Switch to kernel gsbase:
@@ -1198,7 +1202,7 @@ error_bad_iret: call fixup_bad_iret mov %rax, %rsp decl %ebx - jmp error_entry_done + jmp .Lerror_entry_from_usermode_after_swapgs END(error_entry)
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 9/17 x86/entry: Add new, comprehensible entry and exit hooks
In reply to Andy LutomirskiThe current entry and exit code is incomprehensible, appears to work primary by luck, and is very difficult to incrementally improve. Add new code in preparation for simply deleting the old code.
prepare_exit_to_usermode is a new function that will handle all slow path exits to user mode. It is called with IRQs disabled and it leaves us in a state in which it is safe to immediately return to user mode. IRQs must not be re-enabled at any point after prepare_exit_to_usermode returns and user mode is actually entered. (We can, of course, fail to enter user mode and treat that failure as a fresh entry to kernel mode.) All callers of do_notify_resume will be migrated to call prepare_exit_to_usermode instead; prepare_exit_to_usermode needs to do everything that do_notify_resume does, but it also takes care of scheduling and context tracking. Unlike do_notify_resume, it does not need to be called in a loop.
syscall_return_slowpath is exactly what it sounds like. It will be called on any syscall exit slow path. It will replaces syscall_trace_leave and it calls prepare_exit_to_usermode on the way out.
--- arch/x86/entry/common.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +111 -1
@@ -207,6 +207,7 @@ long syscall_trace_enter(struct pt_regs *regs)return syscall_trace_enter_phase2 (regs, arch, phase1_result); } +/* Deprecated. */ void syscall_trace_leave (struct pt_regs *regs) {bool step;
@@ -237,8 +238,117 @@ void syscall_trace_leave(struct pt_regs *regs)user_enter (); } +static struct thread_info *pt_regs_to_thread_info (struct pt_regs *regs) +{ +unsigned long top_of_stack = + (unsigned long )(regs +1 ) +TOP_OF_KERNEL_STACK_PADDING ; +return (struct thread_info *)(top_of_stack -THREAD_SIZE ); +} + +/* Called with IRQs disabled. */ +__visible void prepare_exit_to_usermode(struct pt_regs *regs) +{ +if (WARN_ON (!irqs_disabled ())) +local_irq_disable (); + +/* +* In order to return to user mode, we need to have IRQs off with +* none of _TIF_SIGPENDING, _TIF_NOTIFY_RESUME, _TIF_USER_RETURN_NOTIFY, +* _TIF_UPROBE, or _TIF_NEED_RESCHED set. Several of these flags +* can be set at any time on preemptable kernels if we have IRQs on, +* so we need to loop. Disabling preemption wouldn't help: doing the +* work to clear some of the flags can sleep. +*/ +while (true) { +u32 cached_flags = +READ_ONCE (pt_regs_to_thread_info (regs)->flags); + +if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | + _TIF_UPROBE | _TIF_NEED_RESCHED))) +break ; + +/* We have work to do. */ +local_irq_enable (); + +if (cached_flags & _TIF_NEED_RESCHED) +schedule (); + +if (cached_flags & _TIF_UPROBE) +uprobe_notify_resume (regs); + +/* deal with pending signal delivery */ +if (cached_flags & _TIF_SIGPENDING) +do_signal (regs); + +if (cached_flags & _TIF_NOTIFY_RESUME) { +clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); + } + +if (cached_flags & _TIF_USER_RETURN_NOTIFY) +fire_user_return_notifiers (); + +/* Disable IRQs and retry */ +local_irq_disable (); + } + +user_enter (); +} + +/* +* Called with IRQs on and fully valid regs. Returns with IRQs off in a +* state such that we can immediately switch to user mode. +*/ +__visible void syscall_return_slowpath(struct pt_regs *regs) +{ +struct thread_info *ti =pt_regs_to_thread_info (regs); +u32 cached_flags =READ_ONCE (ti->flags); +bool step; + +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL ); + +if (WARN (irqs_disabled (),"syscall %ld left IRQs disabled" , + regs->orig_ax)) +local_irq_enable (); + +/* +* First do one-time work. If these work items are enabled, we +* want to run them exactly once per syscall exit with IRQs on. +*/ +if (cached_flags & (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | + _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT)) { +audit_syscall_exit (regs); + +if (cached_flags & _TIF_SYSCALL_TRACEPOINT) +trace_sys_exit (regs, regs->ax); + +/* +* If TIF_SYSCALL_EMU is set, we only get here because of +* TIF_SINGLESTEP (i.e. this is PTRACE_SYSEMU_SINGLESTEP). +* We already reported this syscall instruction in +* syscall_trace_enter(). +*/ + step =unlikely ( + (cached_flags & (_TIF_SINGLESTEP | _TIF_SYSCALL_EMU)) + == _TIF_SINGLESTEP); +if (step || cached_flags & _TIF_SYSCALL_TRACE) +tracehook_report_syscall_exit (regs, step); + } + +#ifdef CONFIG_COMPAT +/* +* Compat syscalls set TS_COMPAT. Make sure we clear it before +* returning to user mode. +*/ + ti->status &= ~TS_COMPAT ; +#endif + +local_irq_disable (); +prepare_exit_to_usermode (regs); +} +/* -* notification of userspace execution resumption +* Deprecated notification of userspace execution resumption * - triggered by the TIF_WORK_MASK flags */ __visible void
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 8/17 x86/entry: Add enter_from_user_mode and use it in syscalls
In reply to Andy LutomirskiChanging the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in CONTEXT_USER when we enter from user mode and wire it up for syscall entries.
Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if CONFIG_CONTEXT_TRACING (adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler than user_exit), which will enable us to get rid of the extra call.
--- arch/x86/entry/common.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +12 -1
@@ -28,6 +28,15 @@#define CREATE_TRACE_POINTS #include <trace/events/syscalls.h> +#ifdef CONFIG_CONTEXT_TRACKING +/* Called on entry from user mode with IRQs off. */ +__visible void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit (); +} +#endif +static void do_audit_syscall_entry (struct pt_regs *regs,u32 arch) {#ifdef CONFIG_X86_64
@@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) work =ACCESS_ONCE (current_thread_info ()->flags) & _TIF_WORK_SYSCALL_ENTRY; +#ifdef CONFIG_CONTEXT_TRACKING /* * If TIF_NOHZ is set, we are required to call user_exit() before * doing anything that could touch RCU. */ if (work & _TIF_NOHZ) { -user_exit (); +enter_from_user_mode (); work &= ~_TIF_NOHZ; } +#endif #ifdef CONFIG_SECCOMP /*
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 7/17 x86/traps: Assert that we're in CONTEXT_KERNEL in exception entries
In reply to Andy LutomirskiOther than the super-atomic exception entries, all exception entries are supposed to switch our context tracking state to CONTEXT_KERNEL. Assert that they do. These assertions appear trivial at this point, as exception_enter is the function responsible for switching context, but I'm planning on reworking x86's exception context tracking, and these assertions will help make sure that all of this code keeps working.
--- arch/x86/kernel/traps.c | 9 +++++++++ 1 file changed, 9 insertions(+)
arch/x86/kernel/traps.c +9 -0
@@ -292,6 +292,8 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,enum ctx_state prev_state =exception_enter ();siginfo_t info; +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL ); +if (notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) !=NOTIFY_STOP ) {conditional_sti (regs);
@@ -376,6 +378,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)siginfo_t *info; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );if (notify_die (DIE_TRAP ,"bounds" , regs, error_code,X86_TRAP_BR ,SIGSEGV ) ==NOTIFY_STOP ) goto exit;
@@ -457,6 +460,7 @@ do_general_protection(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );conditional_sti (regs);if (v8086_mode (regs)) {
@@ -514,6 +518,7 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)return ; prev_state =ist_enter (regs); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP if (kgdb_ll_trap (DIE_INT3 ,"int3" , regs, error_code,X86_TRAP_BP ,SIGTRAP ) ==NOTIFY_STOP )
@@ -750,6 +755,7 @@ dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );math_error (regs, error_code,X86_TRAP_MF );exception_exit (prev_state); }
@@ -760,6 +766,7 @@ do_simd_coprocessor_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );math_error (regs, error_code,X86_TRAP_XF );exception_exit (prev_state); }
@@ -776,6 +783,7 @@ do_device_not_available(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );BUG_ON (use_eager_fpu ());#ifdef CONFIG_MATH_EMULATION
@@ -805,6 +813,7 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );local_irq_enable (); info.si_signo =SIGILL ;
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 6/17 x86: Move C entry and exit code to arch/x86/entry/common.c
In reply to Andy LutomirskiThe entry and exit C helpers were confusingly scattered between ptrace.c and signal.c, even though they aren't specific to ptrace or signal handling. Move them together in a new file.
This change just moves code around. It doesn't change anything.
--- arch/x86/entry/Makefile | 1 + arch/x86/entry/common.c | 253 ++++++++++++++++++++++++++++++++++++++++++ arch/x86/include/asm/signal.h | 1 + arch/x86/kernel/ptrace.c | 202 +-------------------------------- arch/x86/kernel/signal.c | 28 +---- 5 files changed, 257 insertions(+), 228 deletions(-) create mode 100644 arch/x86/entry/common.c
arch/x86/entry/Makefile +1 -0
@@ -2,6 +2,7 @@ # Makefile for the x86 low level entry code # obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o +obj-y += common.o obj-y += vdso/ obj-y += vsyscall/
arch/x86/entry/common.c new file +253 -0
253 lines not on this page · raw message
arch/x86/include/asm/signal.h +1 -0
@@ -30,6 +30,7 @@ typedef sigset_t compat_sigset_t;#endif /* __ASSEMBLY__ */ #include <uapi/asm/signal.h> #ifndef __ASSEMBLY__ +extern void do_signal (struct pt_regs *regs);extern void do_notify_resume (struct pt_regs *,void *,__u32 );#define __ARCH_HAS_SA_RESTORER
arch/x86/kernel/ptrace.c +1 -201
214 lines not on this page · raw message
arch/x86/kernel/signal.c +1 -27
@@ -701,7 +701,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)* want to handle. Thus you cannot kill init even with a SIGKILL even by * mistake. */ -static void do_signal (struct pt_regs *regs) +void do_signal (struct pt_regs *regs) {struct ksignal ksig;
@@ -736,32 +736,6 @@ static void do_signal(struct pt_regs *regs)restore_saved_sigmask (); } -/* -* notification of userspace execution resumption -* - triggered by the TIF_WORK_MASK flags -*/ -__visible void -do_notify_resume (struct pt_regs *regs,void *unused,__u32 thread_info_flags) -{ -user_exit (); - -if (thread_info_flags & _TIF_UPROBE) -uprobe_notify_resume (regs); - -/* deal with pending signal delivery */ -if (thread_info_flags & _TIF_SIGPENDING) -do_signal (regs); - -if (thread_info_flags & _TIF_NOTIFY_RESUME) { -clear_thread_flag (TIF_NOTIFY_RESUME ); -tracehook_notify_resume (regs); - } -if (thread_info_flags & _TIF_USER_RETURN_NOTIFY) -fire_user_return_notifiers (); - -user_enter (); -} -void signal_fault (struct pt_regs *regs,void __user *frame,char *where) {struct task_struct *me = current;
Signature · 1 line
2.4.3
Andy Lutomirski
maintainerPATCH v5 5/17 notifiers: Assert that RCU is watching in notify_die
In reply to Andy LutomirskiLow-level arch entries often call notify_die, and it's easy for arch code to fail to exit an RCU quiescent state first. Assert that we're not quiescent in notify_die.
--- kernel/notifier.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/notifier.c +2 -0
@@ -544,6 +544,8 @@ int notrace notify_die(enum die_val val, const char *str, .signr = sig, }; +rcu_lockdep_assert (rcu_is_watching (), +"notify_die called but RCU thinks we're quiescent" );return atomic_notifier_call_chain (&die_chain, val, &args); }NOKPROBE_SYMBOL (notify_die);
Signature · 1 line
2.4.3
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry, selftests/x86: Add a test for 32-bit fast syscall arg faults
In reply to Andy Lutomirskix86/entry, selftests/x86: Add a test for 32-bit fast syscall arg faults
Commit-ID: 5e5c684a2c78b98dcba3d6fce56773a375f63980 Gitweb: http://git.kernel.org/tip/5e5c684a2c78b98dcba3d6fce56773a375f63980 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:18 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:58:30 +0200
x86/entry, selftests/x86: Add a test for 32-bit fast syscall arg faults
This test passes on 4.0 and fails on some newer kernels. Fortunately, the failure is likely not a big deal.
This test will make sure that we don't break it further (e.g. OOPSing) as we clean up the entry code and that we eventually fix the regression.
There's arguably no need to preserve the old ABI here -- anything that makes it into a fast (vDSO) syscall with a bad stack is about to crash no matter what we do.
--- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/syscall_arg_fault.c | 130 ++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-)
tools/testing/selftests/x86/Makefile +1 -1
@@ -5,7 +5,7 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean TARGETS_C_BOTHBITS := sigreturn single_step_syscall sysret_ss_attrs -TARGETS_C_32BIT_ONLY := entry_from_vm86 +TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32)
tools/testing/selftests/x86/syscall_arg_fault.c new file +130 -0
130 lines not on this page · raw message
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry/64/compat: Fix bad fast syscall arg failure path
In reply to Andy Lutomirskix86/entry/64/compat: Fix bad fast syscall arg failure path
Commit-ID: 5e99cb7c35ca0580da8e892f91c655d35ecf8798 Gitweb: http://git.kernel.org/tip/5e99cb7c35ca0580da8e892f91c655d35ecf8798 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:19 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:58:30 +0200
x86/entry/64/compat: Fix bad fast syscall arg failure path
If user code does SYSCALL32 or SYSENTER without a valid stack, then our attempt to determine the syscall args will result in a failed uaccess fault. Previously, we would try to recover by jumping to the syscall exit code, but we'd run the syscall exit work even though we never made it to the syscall entry work.
Clean it up by treating the failure path as a non-syscall entry and exit pair.
This fixes strace's output when running the syscall_arg_fault test. Without this fix, strace would get out of sync and would fail to associate syscall entries with syscall exits.
--- arch/x86/entry/entry_64.S | 2 +- arch/x86/entry/entry_64_compat.S | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-)
arch/x86/entry/entry_64.S +1 -1
@@ -613,7 +613,7 @@ ret_from_intr: testb $3, CS(%rsp) jz retint_kernel /* Interrupt came from user space */ -retint_user: +GLOBAL(retint_user) GET_THREAD_INFO(%rcx) /* %rcx: thread info. Interrupts are off. */
arch/x86/entry/entry_64_compat.S +33 -2
@@ -428,8 +428,39 @@ cstar_tracesys: END(entry_SYSCALL_compat) ia32_badarg: - ASM_CLAC - movq $-EFAULT, RAX(%rsp) + /* + * So far, we've entered kernel mode, set AC, turned on IRQs, and + * saved C regs except r8-r11. We haven't done any of the other + * standard entry work, though. We want to bail, but we shouldn't + * treat this as a syscall entry since we don't even know what the + * args are. Instead, treat this as a non-syscall entry, finish + * the entry work, and immediately exit after setting AX = -EFAULT. + * + * We're really just being polite here. Killing the task outright + * would be a reasonable action, too. Given that the only valid + * way to have gotten here is through the vDSO, and we already know + * that the stack pointer is bad, the task isn't going to survive + * for long no matter what we do. + */ + + ASM_CLAC /* undo STAC */ + movq $-EFAULT, RAX(%rsp) /* return -EFAULT if possible */ + + /* Fill in the rest of pt_regs */ + xorl %eax, %eax + movq %rax, R11(%rsp) + movq %rax, R10(%rsp) + movq %rax, R9(%rsp) + movq %rax, R8(%rsp) + SAVE_EXTRA_REGS + + /* Turn IRQs back off. */ + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF + + /* And exit again. */ + jmp retint_user + ia32_ret_from_sys_call: xorl %eax, %eax /* Do not leak kernel information */ movq %rax, R11(%rsp)
tip-bot for Ingo Molnar
merge bot[tip:x86/asm] um: Fix do_signal() prototype
In reply to Andy Lutomirskium: Fix do_signal() prototype
Commit-ID: ccaee5f851470dec6894a6835b6fadffc2bb7514 Gitweb: http://git.kernel.org/tip/ccaee5f851470dec6894a6835b6fadffc2bb7514 Author: Ingo Molnar <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:20 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:58:54 +0200
um: Fix do_signal() prototype
Once x86 exports its do_signal(), the prototypes will clash.
Fix the clash and also improve the code a bit: remove the unnecessary kern_do_signal() indirection. This allows interrupt_end() to share the 'regs' parameter calculation.
Also remove the unused return code to match x86.
Minimally build and boot tested.
--- arch/um/include/shared/kern_util.h | 3 ++- arch/um/kernel/process.c | 6 ++++-- arch/um/kernel/signal.c | 8 +------- arch/um/kernel/tlb.c | 2 +- arch/um/kernel/trap.c | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-)
arch/um/include/shared/kern_util.h +2 -1
@@ -22,7 +22,8 @@ extern int kmalloc_ok;extern unsigned long alloc_stack (int order,int atomic);extern void free_stack (unsigned long stack,int order); -extern int do_signal (void ); +struct pt_regs ; +extern void do_signal (struct pt_regs *regs);extern void interrupt_end (void );extern void relay_signal (int sig,struct siginfo *si,struct uml_pt_regs *regs);
arch/um/kernel/process.c +4 -2
@@ -90,12 +90,14 @@ void *__switch_to(struct task_struct *from, struct task_struct *to)void interrupt_end (void ) { +struct pt_regs *regs = ¤t->thread.regs; +if (need_resched ())schedule ();if (test_thread_flag (TIF_SIGPENDING )) -do_signal (); +do_signal (regs);if (test_and_clear_thread_flag (TIF_NOTIFY_RESUME )) -tracehook_notify_resume (¤t->thread.regs); +tracehook_notify_resume (regs); }void exit_thread (void )
arch/um/kernel/signal.c +1 -7
@@ -64,7 +64,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)signal_setup_done (err, ksig, singlestep); } -static int kern_do_signal (struct pt_regs *regs) +void do_signal (struct pt_regs *regs) {struct ksignal ksig;int handled_sig =0 ;
@@ -110,10 +110,4 @@ static int kern_do_signal(struct pt_regs *regs)*/ if (!handled_sig)restore_saved_sigmask (); -return handled_sig; -} - -int do_signal (void ) -{ -return kern_do_signal (¤t->thread.regs); }
arch/um/kernel/tlb.c +1 -1
@@ -291,7 +291,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,/* We are under mmap_sem, release it such that current can terminate */ up_write (¤t->mm->mmap_sem);force_sig (SIGKILL , current); -do_signal (); +do_signal (¤t->thread.regs); } }
arch/um/kernel/trap.c +1 -1
@@ -173,7 +173,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)void fatal_sigsegv (void ) {force_sigsegv (SIGSEGV , current); -do_signal (); +do_signal (¤t->thread.regs);/* * This is to tell gcc that we're not returning - do_signal * can, in general, return, but in this case, it's not, since
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] context_tracking: Add ct_state() and CT_WARN_ON()
In reply to Andy Lutomirskicontext_tracking: Add ct_state() and CT_WARN_ON()
Commit-ID: f9281648ecd5081803bb2da84b9ccb0cf48436cd Gitweb: http://git.kernel.org/tip/f9281648ecd5081803bb2da84b9ccb0cf48436cd Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:21 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:04 +0200
context_tracking: Add ct_state() and CT_WARN_ON()
This will let us sprinkle sanity checks around the kernel without making too much of a mess.
--- include/linux/context_tracking.h | 15 +++++++++++++++ include/linux/context_tracking_state.h | 1 + 2 files changed, 16 insertions(+)
include/linux/context_tracking.h +15 -0
@@ -49,13 +49,28 @@ static inline void exception_exit(enum ctx_state prev_ctx) } } + +/** +* ct_state() - return the current context tracking state if known +* +* Returns the current cpu's context tracking state if context tracking +* is enabled. If context tracking is disabled, returns +* CONTEXT_DISABLED. This should be used primarily for debugging. +*/ +static inline enum ctx_state ct_state (void ) +{ +return context_tracking_is_enabled () ? +this_cpu_read (context_tracking.state) :CONTEXT_DISABLED ; +}#else static inline void user_enter (void ) { }static inline void user_exit (void ) { }static inline enum ctx_state exception_enter (void ) {return 0 ; }static inline void exception_exit (enum ctx_state prev_ctx) { } +static inline enum ctx_state ct_state (void ) {return CONTEXT_DISABLED ; }#endif /* !CONFIG_CONTEXT_TRACKING */ +#define CT_WARN_ON (cond) WARN_ON(context_tracking_is_enabled() && (cond))#ifdef CONFIG_CONTEXT_TRACKING_FORCE extern void context_tracking_init (void );
include/linux/context_tracking_state.h +1 -0
@@ -14,6 +14,7 @@ struct context_tracking {bool active;int recursion;enum ctx_state { +CONTEXT_DISABLED =-1 ,/* returned by ct_state() if unknown */ CONTEXT_KERNEL =0 ,CONTEXT_USER ,CONTEXT_GUEST ,
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] notifiers, RCU: Assert that RCU is watching in notify_die()
In reply to Andy Lutomirskinotifiers, RCU: Assert that RCU is watching in notify_die()
Commit-ID: e727c7d7a11e109849582e9165d54b254eb181d7 Gitweb: http://git.kernel.org/tip/e727c7d7a11e109849582e9165d54b254eb181d7 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:22 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:04 +0200
notifiers, RCU: Assert that RCU is watching in notify_die()
Low-level arch entries often call notify_die(), and it's easy for arch code to fail to exit an RCU quiescent state first. Assert that we're not quiescent in notify_die().
--- kernel/notifier.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/notifier.c +2 -0
@@ -544,6 +544,8 @@ int notrace notify_die(enum die_val val, const char *str, .signr = sig, }; +rcu_lockdep_assert (rcu_is_watching (), +"notify_die called but RCU thinks we're quiescent" );return atomic_notifier_call_chain (&die_chain, val, &args); }NOKPROBE_SYMBOL (notify_die);
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Move C entry and exit code to arch/x86/ entry/common.c
In reply to Andy Lutomirskix86/entry: Move C entry and exit code to arch/x86/entry/common.c
Commit-ID: 1f484aa6904697f390027c12fba130fa94b20831 Gitweb: http://git.kernel.org/tip/1f484aa6904697f390027c12fba130fa94b20831 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:23 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:05 +0200
x86/entry: Move C entry and exit code to arch/x86/entry/common.c
The entry and exit C helpers were confusingly scattered between ptrace.c and signal.c, even though they aren't specific to ptrace or signal handling. Move them together in a new file.
This change just moves code around. It doesn't change anything.
--- arch/x86/entry/Makefile | 1 + arch/x86/entry/common.c | 253 ++++++++++++++++++++++++++++++++++++++++++ arch/x86/include/asm/signal.h | 1 + arch/x86/kernel/ptrace.c | 202 +-------------------------------- arch/x86/kernel/signal.c | 28 +---- 5 files changed, 257 insertions(+), 228 deletions(-)
arch/x86/entry/Makefile +1 -0
@@ -2,6 +2,7 @@ # Makefile for the x86 low level entry code # obj-y := entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o +obj-y += common.o obj-y += vdso/ obj-y += vsyscall/
arch/x86/entry/common.c new file +253 -0
253 lines not on this page · raw message
arch/x86/include/asm/signal.h +1 -0
@@ -30,6 +30,7 @@ typedef sigset_t compat_sigset_t;#endif /* __ASSEMBLY__ */ #include <uapi/asm/signal.h> #ifndef __ASSEMBLY__ +extern void do_signal (struct pt_regs *regs);extern void do_notify_resume (struct pt_regs *,void *,__u32 );#define __ARCH_HAS_SA_RESTORER
arch/x86/kernel/ptrace.c +1 -201
214 lines not on this page · raw message
arch/x86/kernel/signal.c +1 -27
@@ -700,7 +700,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)* want to handle. Thus you cannot kill init even with a SIGKILL even by * mistake. */ -static void do_signal (struct pt_regs *regs) +void do_signal (struct pt_regs *regs) {struct ksignal ksig;
@@ -735,32 +735,6 @@ static void do_signal(struct pt_regs *regs)restore_saved_sigmask (); } -/* -* notification of userspace execution resumption -* - triggered by the TIF_WORK_MASK flags -*/ -__visible void -do_notify_resume (struct pt_regs *regs,void *unused,__u32 thread_info_flags) -{ -user_exit (); - -if (thread_info_flags & _TIF_UPROBE) -uprobe_notify_resume (regs); - -/* deal with pending signal delivery */ -if (thread_info_flags & _TIF_SIGPENDING) -do_signal (regs); - -if (thread_info_flags & _TIF_NOTIFY_RESUME) { -clear_thread_flag (TIF_NOTIFY_RESUME ); -tracehook_notify_resume (regs); - } -if (thread_info_flags & _TIF_USER_RETURN_NOTIFY) -fire_user_return_notifiers (); - -user_enter (); -} -void signal_fault (struct pt_regs *regs,void __user *frame,char *where) {struct task_struct *me = current;
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/traps, context_tracking: Assert that we' re in CONTEXT_KERNEL in exception entries
In reply to Andy Lutomirskix86/traps, context_tracking: Assert that we're in CONTEXT_KERNEL in exception entries
Commit-ID: 02fdcd5eac9d653d1addbd69b0c58d73650e1c00 Gitweb: http://git.kernel.org/tip/02fdcd5eac9d653d1addbd69b0c58d73650e1c00 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:24 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:05 +0200
x86/traps, context_tracking: Assert that we're in CONTEXT_KERNEL in exception entries
Other than the super-atomic exception entries, all exception entries are supposed to switch our context tracking state to CONTEXT_KERNEL. Assert that they do. These assertions appear trivial at this point, as exception_enter() is the function responsible for switching context, but I'm planning on reworking x86's exception context tracking, and these assertions will help make sure that all of this code keeps working.
--- arch/x86/kernel/traps.c | 9 +++++++++ 1 file changed, 9 insertions(+)
arch/x86/kernel/traps.c +9 -0
@@ -292,6 +292,8 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,enum ctx_state prev_state =exception_enter ();siginfo_t info; +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL ); +if (notify_die (DIE_TRAP , str, regs, error_code, trapnr, signr) !=NOTIFY_STOP ) {conditional_sti (regs);
@@ -376,6 +378,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)siginfo_t *info; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );if (notify_die (DIE_TRAP ,"bounds" , regs, error_code,X86_TRAP_BR ,SIGSEGV ) ==NOTIFY_STOP ) goto exit;
@@ -457,6 +460,7 @@ do_general_protection(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );conditional_sti (regs);if (v8086_mode (regs)) {
@@ -514,6 +518,7 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)return ; prev_state =ist_enter (regs); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP if (kgdb_ll_trap (DIE_INT3 ,"int3" , regs, error_code,X86_TRAP_BP ,SIGTRAP ) ==NOTIFY_STOP )
@@ -750,6 +755,7 @@ dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );math_error (regs, error_code,X86_TRAP_MF );exception_exit (prev_state); }
@@ -760,6 +766,7 @@ do_simd_coprocessor_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );math_error (regs, error_code,X86_TRAP_XF );exception_exit (prev_state); }
@@ -776,6 +783,7 @@ do_device_not_available(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );BUG_ON (use_eager_fpu ());#ifdef CONFIG_MATH_EMULATION
@@ -805,6 +813,7 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)enum ctx_state prev_state; prev_state =exception_enter (); +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL );local_irq_enable (); info.si_signo =SIGILL ;
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Add enter_from_user_mode() and use it in syscalls
In reply to Andy Lutomirskix86/entry: Add enter_from_user_mode() and use it in syscalls
Commit-ID: feed36cde0a10adb957445a37e48f957f30b2273 Gitweb: http://git.kernel.org/tip/feed36cde0a10adb957445a37e48f957f30b2273 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:25 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200
x86/entry: Add enter_from_user_mode() and use it in syscalls
Changing the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in CONTEXT_USER when we enter from user mode and wire it up for syscall entries.
Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if CONFIG_CONTEXT_TRACING (adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler than user_exit), which will enable us to get rid of the extra call.
--- arch/x86/entry/common.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +12 -1
@@ -28,6 +28,15 @@#define CREATE_TRACE_POINTS #include <trace/events/syscalls.h> +#ifdef CONFIG_CONTEXT_TRACKING +/* Called on entry from user mode with IRQs off. */ +__visible void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit (); +} +#endif +static void do_audit_syscall_entry (struct pt_regs *regs,u32 arch) {#ifdef CONFIG_X86_64
@@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) work =ACCESS_ONCE (current_thread_info ()->flags) & _TIF_WORK_SYSCALL_ENTRY; +#ifdef CONFIG_CONTEXT_TRACKING /* * If TIF_NOHZ is set, we are required to call user_exit() before * doing anything that could touch RCU. */ if (work & _TIF_NOHZ) { -user_exit (); +enter_from_user_mode (); work &= ~_TIF_NOHZ; } +#endif #ifdef CONFIG_SECCOMP /*
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Add new, comprehensible entry and exit handlers written in C
In reply to Andy Lutomirskix86/entry: Add new, comprehensible entry and exit handlers written in C
Commit-ID: c5c46f59e4e7c1ab244b8d38f2b61d317df90bba Gitweb: http://git.kernel.org/tip/c5c46f59e4e7c1ab244b8d38f2b61d317df90bba Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:26 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200
x86/entry: Add new, comprehensible entry and exit handlers written in C
The current x86 entry and exit code, written in a mixture of assembly and C code, is incomprehensible due to being open-coded in a lot of places without coherent documentation.
It appears to work primary by luck and duct tape: i.e. obvious runtime failures were fixed on-demand, without re-thinking the design.
Due to those reasons our confidence level in that code is low, and it is very difficult to incrementally improve.
Add new code written in C, in preparation for simply deleting the old entry code.
prepare_exit_to_usermode() is a new function that will handle all slow path exits to user mode. It is called with IRQs disabled and it leaves us in a state in which it is safe to immediately return to user mode. IRQs must not be re-enabled at any point after prepare_exit_to_usermode() returns and user mode is actually entered. (We can, of course, fail to enter user mode and treat that failure as a fresh entry to kernel mode.)
All callers of do_notify_resume() will be migrated to call prepare_exit_to_usermode() instead; prepare_exit_to_usermode() needs to do everything that do_notify_resume() does today, but it also takes care of scheduling and context tracking. Unlike do_notify_resume(), it does not need to be called in a loop.
syscall_return_slowpath() is exactly what it sounds like: it will be called on any syscall exit slow path. It will replace syscall_trace_leave() and it calls prepare_exit_to_usermode() on the way out.
--- arch/x86/entry/common.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +111 -1
@@ -207,6 +207,7 @@ long syscall_trace_enter(struct pt_regs *regs)return syscall_trace_enter_phase2 (regs, arch, phase1_result); } +/* Deprecated. */ void syscall_trace_leave (struct pt_regs *regs) {bool step;
@@ -237,8 +238,117 @@ void syscall_trace_leave(struct pt_regs *regs)user_enter (); } +static struct thread_info *pt_regs_to_thread_info (struct pt_regs *regs) +{ +unsigned long top_of_stack = + (unsigned long )(regs +1 ) +TOP_OF_KERNEL_STACK_PADDING ; +return (struct thread_info *)(top_of_stack -THREAD_SIZE ); +} + +/* Called with IRQs disabled. */ +__visible void prepare_exit_to_usermode(struct pt_regs *regs) +{ +if (WARN_ON (!irqs_disabled ())) +local_irq_disable (); + +/* +* In order to return to user mode, we need to have IRQs off with +* none of _TIF_SIGPENDING, _TIF_NOTIFY_RESUME, _TIF_USER_RETURN_NOTIFY, +* _TIF_UPROBE, or _TIF_NEED_RESCHED set. Several of these flags +* can be set at any time on preemptable kernels if we have IRQs on, +* so we need to loop. Disabling preemption wouldn't help: doing the +* work to clear some of the flags can sleep. +*/ +while (true) { +u32 cached_flags = +READ_ONCE (pt_regs_to_thread_info (regs)->flags); + +if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | + _TIF_UPROBE | _TIF_NEED_RESCHED))) +break ; + +/* We have work to do. */ +local_irq_enable (); + +if (cached_flags & _TIF_NEED_RESCHED) +schedule (); + +if (cached_flags & _TIF_UPROBE) +uprobe_notify_resume (regs); + +/* deal with pending signal delivery */ +if (cached_flags & _TIF_SIGPENDING) +do_signal (regs); + +if (cached_flags & _TIF_NOTIFY_RESUME) { +clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); + } + +if (cached_flags & _TIF_USER_RETURN_NOTIFY) +fire_user_return_notifiers (); + +/* Disable IRQs and retry */ +local_irq_disable (); + } + +user_enter (); +} + +/* +* Called with IRQs on and fully valid regs. Returns with IRQs off in a +* state such that we can immediately switch to user mode. +*/ +__visible void syscall_return_slowpath(struct pt_regs *regs) +{ +struct thread_info *ti =pt_regs_to_thread_info (regs); +u32 cached_flags =READ_ONCE (ti->flags); +bool step; + +CT_WARN_ON (ct_state () !=CONTEXT_KERNEL ); + +if (WARN (irqs_disabled (),"syscall %ld left IRQs disabled" , + regs->orig_ax)) +local_irq_enable (); + +/* +* First do one-time work. If these work items are enabled, we +* want to run them exactly once per syscall exit with IRQs on. +*/ +if (cached_flags & (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | + _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT)) { +audit_syscall_exit (regs); + +if (cached_flags & _TIF_SYSCALL_TRACEPOINT) +trace_sys_exit (regs, regs->ax); + +/* +* If TIF_SYSCALL_EMU is set, we only get here because of +* TIF_SINGLESTEP (i.e. this is PTRACE_SYSEMU_SINGLESTEP). +* We already reported this syscall instruction in +* syscall_trace_enter(). +*/ + step =unlikely ( + (cached_flags & (_TIF_SINGLESTEP | _TIF_SYSCALL_EMU)) + == _TIF_SINGLESTEP); +if (step || cached_flags & _TIF_SYSCALL_TRACE) +tracehook_report_syscall_exit (regs, step); + } + +#ifdef CONFIG_COMPAT +/* +* Compat syscalls set TS_COMPAT. Make sure we clear it before +* returning to user mode. +*/ + ti->status &= ~TS_COMPAT ; +#endif + +local_irq_disable (); +prepare_exit_to_usermode (regs); +} +/* -* notification of userspace execution resumption +* Deprecated notification of userspace execution resumption * - triggered by the TIF_WORK_MASK flags */ __visible void
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry/64: Really create an error-entry-from-usermode code path
In reply to Andy Lutomirskix86/entry/64: Really create an error-entry-from-usermode code path
Commit-ID: cb6f64ed5a04036eef07e70b57dd5dd78f2fbcef Gitweb: http://git.kernel.org/tip/cb6f64ed5a04036eef07e70b57dd5dd78f2fbcef Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:27 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:07 +0200
x86/entry/64: Really create an error-entry-from-usermode code path
In 539f51136500 ("x86/asm/entry/64: Disentangle error_entry/exit gsbase/ebx/usermode code"), I arranged the code slightly wrong -- IRET faults would skip the code path that was intended to execute on all error entries from user mode. Fix it up.
While we're at it, make all the labels in error_entry local.
This does not fix a bug, but we'll need it, and it slightly shrinks the code.
--- arch/x86/entry/entry_64.S | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
arch/x86/entry/entry_64.S +16 -12
@@ -1143,12 +1143,17 @@ ENTRY(error_entry) SAVE_EXTRA_REGS 8 xorl %ebx, %ebx testb $3, CS+8(%rsp) - jz error_kernelspace + jz .Lerror_kernelspace - /* We entered from user mode */ +.Lerror_entry_from_usermode_swapgs: + /* + * We entered from user mode or we're pretending to have entered + * from user mode due to an IRET fault. + */ SWAPGS -error_entry_done: +.Lerror_entry_from_usermode_after_swapgs: +.Lerror_entry_done: TRACE_IRQS_OFF ret
@@ -1158,31 +1163,30 @@ error_entry_done: * truncated RIP for IRET exceptions returning to compat mode. Check * for these here too. */ -error_kernelspace: +.Lerror_kernelspace: incl %ebx leaq native_irq_return_iret(%rip), %rcx cmpq %rcx, RIP+8(%rsp) - je error_bad_iret + je .Lerror_bad_iret movl %ecx, %eax /* zero extend */ cmpq %rax, RIP+8(%rsp) - je bstep_iret + je .Lbstep_iret cmpq $gs_change, RIP+8(%rsp) - jne error_entry_done + jne .Lerror_entry_done /* * hack: gs_change can fail with user gsbase. If this happens, fix up * gsbase and proceed. We'll fix up the exception and land in * gs_change's error handler with kernel gsbase. */ - SWAPGS - jmp error_entry_done + jmp .Lerror_entry_from_usermode_swapgs -bstep_iret: +.Lbstep_iret: /* Fix truncated RIP */ movq %rcx, RIP+8(%rsp) /* fall through */ -error_bad_iret: +.Lerror_bad_iret: /* * We came from an IRET to user mode, so we have user gsbase. * Switch to kernel gsbase:
@@ -1198,7 +1202,7 @@ error_bad_iret: call fixup_bad_iret mov %rax, %rsp decl %ebx - jmp error_entry_done + jmp .Lerror_entry_from_usermode_after_swapgs END(error_entry)
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry/64: Migrate 64-bit and compat syscalls to the new exit handlers and remove old assembly code
In reply to Andy Lutomirskix86/entry/64: Migrate 64-bit and compat syscalls to the new exit handlers and remove old assembly code
Commit-ID: 29ea1b258b98a862e59d72556714b75051ae93fb Gitweb: http://git.kernel.org/tip/29ea1b258b98a862e59d72556714b75051ae93fb Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:28 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:07 +0200
x86/entry/64: Migrate 64-bit and compat syscalls to the new exit handlers and remove old assembly code
These need to be migrated together, as the compat case used to jump into the middle of the 64-bit exit code.
Remove the old assembly code.
--- arch/x86/entry/entry_64.S | 69 +++++----------------------------------- arch/x86/entry/entry_64_compat.S | 6 ++-- 2 files changed, 11 insertions(+), 64 deletions(-)
arch/x86/entry/entry_64.S +8 -61
@@ -229,6 +229,11 @@ entry_SYSCALL_64_fastpath: */ USERGS_SYSRET64 +GLOBAL(int_ret_from_sys_call_irqs_off) + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) + jmp int_ret_from_sys_call + /* Do syscall entry tracing */ tracesys: movq %rsp, %rdi
@@ -272,69 +277,11 @@ tracesys_phase2: * Has correct iret frame. */ GLOBAL(int_ret_from_sys_call) - DISABLE_INTERRUPTS(CLBR_NONE) -int_ret_from_sys_call_irqs_off: /* jumps come here from the irqs-off SYSRET path */ - TRACE_IRQS_OFF - movl $_TIF_ALLWORK_MASK, %edi - /* edi: mask to check */ -GLOBAL(int_with_check) - LOCKDEP_SYS_EXIT_IRQ - GET_THREAD_INFO(%rcx) - movl TI_flags(%rcx), %edx - andl %edi, %edx - jnz int_careful - andl $~TS_COMPAT, TI_status(%rcx) - jmp syscall_return - - /* - * Either reschedule or signal or syscall exit tracking needed. - * First do a reschedule test. - * edx: work, edi: workmask - */ -int_careful: - bt $TIF_NEED_RESCHED, %edx - jnc int_very_careful - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - pushq %rdi - SCHEDULE_USER - popq %rdi - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp int_with_check - - /* handle signals and tracing -- both require a full pt_regs */ -int_very_careful: - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) SAVE_EXTRA_REGS - /* Check for syscall exit trace */ - testl $_TIF_WORK_SYSCALL_EXIT, %edx - jz int_signal - pushq %rdi - leaq 8(%rsp), %rdi /* &ptregs -> arg1 */ - call syscall_trace_leave - popq %rdi - andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU), %edi - jmp int_restore_rest - -int_signal: - testl $_TIF_DO_NOTIFY_MASK, %edx - jz 1f - movq %rsp, %rdi /* &ptregs -> arg1 */ - xorl %esi, %esi /* oldset -> arg2 */ - call do_notify_resume -1: movl $_TIF_WORK_MASK, %edi -int_restore_rest: + movq %rsp, %rdi + call syscall_return_slowpath /* returns with IRQs disabled */ RESTORE_EXTRA_REGS - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp int_with_check - -syscall_return: - /* The IRETQ could re-enable interrupts: */ - DISABLE_INTERRUPTS(CLBR_ANY) - TRACE_IRQS_IRETQ + TRACE_IRQS_IRETQ /* we're about to change IF */ /* * Try to use SYSRET instead of IRET if we're returning to
arch/x86/entry/entry_64_compat.S +3 -3
@@ -210,10 +210,10 @@ sysexit_from_sys_call: .endm .macro auditsys_exit exit - testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) - jnz ia32_ret_from_sys_call TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) + testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT), ASM_THREAD_INFO(TI_flags, %rsp, SIZEOF_PTREGS) + jnz ia32_ret_from_sys_call movl %eax, %esi /* second arg, syscall return value */ cmpl $-MAX_ERRNO, %eax /* is it an error ? */ jbe 1f
@@ -232,7 +232,7 @@ sysexit_from_sys_call: movq %rax, R10(%rsp) movq %rax, R9(%rsp) movq %rax, R8(%rsp) - jmp int_with_check + jmp int_ret_from_sys_call_irqs_off .endm sysenter_auditsys:
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/asm/entry/64: Save all regs on interrupt entry
In reply to Andy Lutomirskix86/asm/entry/64: Save all regs on interrupt entry
Commit-ID: ff467594f2a4be01a0fa5e9ffc223fa930d232dd Gitweb: http://git.kernel.org/tip/ff467594f2a4be01a0fa5e9ffc223fa930d232dd Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:29 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:07 +0200
x86/asm/entry/64: Save all regs on interrupt entry
To prepare for the big rewrite of the error and interrupt exit paths, we will need pt_regs completely filled in.
It's already completely filled in when error_exit runs, so rearrange interrupt handling to match it. This will slow down interrupt handling very slightly (eight instructions), but the simplification it enables will be more than worth it.
--- arch/x86/entry/calling.h | 3 --- arch/x86/entry/entry_64.S | 29 +++++++++-------------------- 2 files changed, 9 insertions(+), 23 deletions(-)
arch/x86/entry/calling.h +0 -3
@@ -135,9 +135,6 @@ For 32-bit we have the following conventions - kernel is built with movq %rbp, 4*8+\offset(%rsp) movq %rbx, 5*8+\offset(%rsp) .endm - .macro SAVE_EXTRA_REGS_RBP offset=0 - movq %rbp, 4*8+\offset(%rsp) - .endm .macro RESTORE_EXTRA_REGS offset=0 movq 0*8+\offset(%rsp), %r15
arch/x86/entry/entry_64.S +9 -20
@@ -502,21 +502,13 @@ END(irq_entries_start) /* 0(%rsp): ~(interrupt number) */ .macro interrupt func cld - /* - * Since nothing in interrupt handling code touches r12...r15 members - * of "struct pt_regs", and since interrupts can nest, we can save - * four stack slots and simultaneously provide - * an unwind-friendly stack layout by saving "truncated" pt_regs - * exactly up to rbp slot, without these members. - */ - ALLOC_PT_GPREGS_ON_STACK -RBP - SAVE_C_REGS -RBP - /* this goes to 0(%rsp) for unwinder, not for saving the value: */ - SAVE_EXTRA_REGS_RBP -RBP + ALLOC_PT_GPREGS_ON_STACK + SAVE_C_REGS + SAVE_EXTRA_REGS - leaq -RBP(%rsp), %rdi /* arg1 for \func (pointer to pt_regs) */ + movq %rsp,%rdi /* arg1 for \func (pointer to pt_regs) */ - testb $3, CS-RBP(%rsp) + testb $3, CS(%rsp) jz 1f SWAPGS 1:
@@ -553,9 +545,7 @@ ret_from_intr: decl PER_CPU_VAR(irq_count) /* Restore saved previous stack */ - popq %rsi - /* return code expects complete pt_regs - adjust rsp accordingly: */ - leaq -RBP(%rsi), %rsp + popq %rsp testb $3, CS(%rsp) jz retint_kernel
@@ -580,7 +570,7 @@ retint_swapgs: /* return to user-space */ TRACE_IRQS_IRETQ SWAPGS - jmp restore_c_regs_and_iret + jmp restore_regs_and_iret /* Returning to kernel space */ retint_kernel:
@@ -604,6 +594,8 @@ retint_kernel: * At this label, code paths which return to kernel and to user, * which come from interrupts/exception and from syscalls, merge. */ +restore_regs_and_iret: + RESTORE_EXTRA_REGS restore_c_regs_and_iret: RESTORE_C_REGS REMOVE_PT_GPREGS_FROM_STACK 8
@@ -674,12 +666,10 @@ retint_signal: jz retint_swapgs TRACE_IRQS_ON ENABLE_INTERRUPTS(CLBR_NONE) - SAVE_EXTRA_REGS movq $-1, ORIG_RAX(%rsp) xorl %esi, %esi /* oldset */ movq %rsp, %rdi /* &pt_regs */ call do_notify_resume - RESTORE_EXTRA_REGS DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF GET_THREAD_INFO(%rcx)
@@ -1160,7 +1150,6 @@ END(error_entry) */ ENTRY(error_exit) movl %ebx, %eax - RESTORE_EXTRA_REGS DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF testl %eax, %eax
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/asm/entry/64: Simplify IRQ stack pt_regs handling
In reply to Andy Lutomirskix86/asm/entry/64: Simplify IRQ stack pt_regs handling
Commit-ID: a586f98e9767fb0dfdb989002866b4024f00ce08 Gitweb: http://git.kernel.org/tip/a586f98e9767fb0dfdb989002866b4024f00ce08 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:30 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200
x86/asm/entry/64: Simplify IRQ stack pt_regs handling
There's no need for both RSI and RDI to point to the original stack.
--- arch/x86/entry/entry_64.S | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/x86/entry/entry_64.S +3 -5
@@ -506,8 +506,6 @@ END(irq_entries_start) SAVE_C_REGS SAVE_EXTRA_REGS - movq %rsp,%rdi /* arg1 for \func (pointer to pt_regs) */ - testb $3, CS(%rsp) jz 1f SWAPGS
@@ -519,14 +517,14 @@ END(irq_entries_start) * a little cheaper to use a separate counter in the PDA (short of * moving irq_enter into assembly, which would be too much work) */ - movq %rsp, %rsi + movq %rsp, %rdi incl PER_CPU_VAR(irq_count) cmovzq PER_CPU_VAR(irq_stack_ptr), %rsp - pushq %rsi + pushq %rdi /* We entered an interrupt context - irqs are off: */ TRACE_IRQS_OFF - call \func + call \func /* rdi points to pt_regs */ .endm /*
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy Lutomirskix86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Commit-ID: 02bc7768fe447ae305e924b931fa629073a4a1b9 Gitweb: http://git.kernel.org/tip/02bc7768fe447ae305e924b931fa629073a4a1b9 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:31 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200
x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)
arch/x86/entry/entry_64.S +18 -46
@@ -508,7 +508,16 @@ END(irq_entries_start) testb $3, CS(%rsp) jz 1f + + /* + * IRQ from user mode. Switch to kernel gsbase and inform context + * tracking that we're in kernel mode. + */ SWAPGS +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + 1: /* * Save previous stack pointer, optionally switch to interrupt stack.
@@ -547,26 +556,13 @@ ret_from_intr: testb $3, CS(%rsp) jz retint_kernel - /* Interrupt came from user space */ -GLOBAL(retint_user) - GET_THREAD_INFO(%rcx) - /* %rcx: thread info. Interrupts are off. */ -retint_with_reschedule: - movl $_TIF_WORK_MASK, %edi -retint_check: + /* Interrupt came from user space */ LOCKDEP_SYS_EXIT_IRQ - movl TI_flags(%rcx), %edx - andl %edi, %edx - jnz retint_careful - -retint_swapgs: /* return to user-space */ - /* - * The iretq could re-enable interrupts: - */ - DISABLE_INTERRUPTS(CLBR_ANY) +GLOBAL(retint_user) + mov %rsp,%rdi + call prepare_exit_to_usermode TRACE_IRQS_IRETQ - SWAPGS jmp restore_regs_and_iret
@@ -644,35 +640,6 @@ native_irq_return_ldt: popq %rax jmp native_irq_return_iret #endif - - /* edi: workmask, edx: work */ -retint_careful: - bt $TIF_NEED_RESCHED, %edx - jnc retint_signal - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - pushq %rdi - SCHEDULE_USER - popq %rdi - GET_THREAD_INFO(%rcx) - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - jmp retint_check - -retint_signal: - testl $_TIF_DO_NOTIFY_MASK, %edx - jz retint_swapgs - TRACE_IRQS_ON - ENABLE_INTERRUPTS(CLBR_NONE) - movq $-1, ORIG_RAX(%rsp) - xorl %esi, %esi /* oldset */ - movq %rsp, %rdi /* &pt_regs */ - call do_notify_resume - DISABLE_INTERRUPTS(CLBR_NONE) - TRACE_IRQS_OFF - GET_THREAD_INFO(%rcx) - jmp retint_with_reschedule - END(common_interrupt) /*
@@ -1088,7 +1055,12 @@ ENTRY(error_entry) SWAPGS .Lerror_entry_from_usermode_after_swapgs: +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + .Lerror_entry_done: + TRACE_IRQS_OFF ret
arch/x86/entry/entry_64_compat.S +5 -0
@@ -458,6 +458,11 @@ ia32_badarg: DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF + /* Now finish entering normal kernel mode. */ +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif + /* And exit again. */ jmp retint_user
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Remove exception_enter() from most trap handlers
In reply to Andy Lutomirskix86/entry: Remove exception_enter() from most trap handlers
Commit-ID: 8c84014f3bbb112d07e73f30a10ac8a3a72f8649 Gitweb: http://git.kernel.org/tip/8c84014f3bbb112d07e73f30a10ac8a3a72f8649 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:32 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:09 +0200
x86/entry: Remove exception_enter() from most trap handlers
On 64-bit kernels, we don't need it any more: we handle context tracking directly on entry from user mode and exit to user mode.
On 32-bit kernels, we don't support context tracking at all, so these callbacks had no effect.
Note: this doesn't change do_page_fault(). Before we do that, we need to make sure that there is no code that can page fault from kernel mode with CONTEXT_USER. The 32-bit fast system call stack argument code is the only offender I'm aware of right now.
--- arch/x86/include/asm/traps.h | 4 +- arch/x86/kernel/cpu/mcheck/mce.c | 5 +-- arch/x86/kernel/cpu/mcheck/p5.c | 5 +-- arch/x86/kernel/cpu/mcheck/winchip.c | 4 +- arch/x86/kernel/traps.c | 78 +++++++++--------------------------- 5 files changed, 27 insertions(+), 69 deletions(-)
arch/x86/include/asm/traps.h +2 -2
@@ -112,8 +112,8 @@ asmlinkage void smp_threshold_interrupt(void); asmlinkage void smp_deferred_error_interrupt(void);#endif -extern enum ctx_state ist_enter (struct pt_regs *regs); -extern void ist_exit (struct pt_regs *regs,enum ctx_state prev_state); +extern void ist_enter (struct pt_regs *regs); +extern void ist_exit (struct pt_regs *regs);extern void ist_begin_non_atomic (struct pt_regs *regs);extern void ist_end_non_atomic (void );
arch/x86/kernel/cpu/mcheck/mce.c +2 -3
@@ -1029,7 +1029,6 @@ void do_machine_check(struct pt_regs *regs, long error_code) {struct mca_config *cfg = &mca_cfg;struct mce m, *final; -enum ctx_state prev_state;int i;int worst =0 ;int severity;
@@ -1055,7 +1054,7 @@ void do_machine_check(struct pt_regs *regs, long error_code)int flags =MF_ACTION_REQUIRED ;int lmce =0 ; - prev_state =ist_enter (regs); +ist_enter (regs);this_cpu_inc (mce_exception_count);
@@ -1227,7 +1226,7 @@ out:local_irq_disable ();ist_end_non_atomic (); done: -ist_exit (regs, prev_state); +ist_exit (regs); }EXPORT_SYMBOL_GPL (do_machine_check);
arch/x86/kernel/cpu/mcheck/p5.c +2 -3
@@ -19,10 +19,9 @@ int mce_p5_enabled __read_mostly;/* Machine check handler for Pentium class Intel CPUs: */ static void pentium_machine_check (struct pt_regs *regs,long error_code) { -enum ctx_state prev_state;u32 loaddr, hi, lotype; - prev_state =ist_enter (regs); +ist_enter (regs);rdmsr (MSR_IA32_P5_MC_ADDR , loaddr, hi);rdmsr (MSR_IA32_P5_MC_TYPE , lotype, hi);
@@ -39,7 +38,7 @@ static void pentium_machine_check(struct pt_regs *regs, long error_code)add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_NOW_UNRELIABLE ); -ist_exit (regs, prev_state); +ist_exit (regs); }/* Set up machine check reporting for processors with Intel style MCE: */
arch/x86/kernel/cpu/mcheck/winchip.c +2 -2
@@ -15,12 +15,12 @@/* Machine check handler for WinChip C6: */ static void winchip_machine_check (struct pt_regs *regs,long error_code) { -enum ctx_state prev_state =ist_enter (regs); +ist_enter (regs);printk (KERN_EMERG "CPU0: Machine Check Exception.\n" );add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_NOW_UNRELIABLE ); -ist_exit (regs, prev_state); +ist_exit (regs); }/* Set up machine check reporting on the Winchip C6 series */
arch/x86/kernel/traps.c +19 -59
264 lines not on this page · raw message
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Remove SCHEDULE_USER and asm/ context-tracking.h
In reply to Andy Lutomirskix86/entry: Remove SCHEDULE_USER and asm/context-tracking.h
Commit-ID: 06a7b36c7bd932e60997bedbae32b3d8e6722281 Gitweb: http://git.kernel.org/tip/06a7b36c7bd932e60997bedbae32b3d8e6722281 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:33 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:09 +0200
x86/entry: Remove SCHEDULE_USER and asm/context-tracking.h
SCHEDULE_USER is no longer used, and asm/context-tracking.h contained nothing else. Remove the header entirely.
--- arch/x86/entry/entry_64.S | 1 - arch/x86/include/asm/context_tracking.h | 10 ---------- 2 files changed, 11 deletions(-)
arch/x86/entry/entry_64.S +0 -1
@@ -33,7 +33,6 @@ #include <asm/paravirt.h> #include <asm/percpu.h> #include <asm/asm.h> -#include <asm/context_tracking.h> #include <asm/smap.h> #include <asm/pgtable_types.h> #include <linux/err.h>
arch/x86/include/asm/context_tracking.h deleted +0 -10
@@ -1,10 +0,0 @@ -#ifndef _ASM_X86_CONTEXT_TRACKING_H -#define _ASM_X86_CONTEXT_TRACKING_H - -#ifdef CONFIG_CONTEXT_TRACKING -# define SCHEDULE_USER call schedule_user -#else -# define SCHEDULE_USER call schedule -#endif - -#endif
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
In reply to Andy Lutomirskix86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
Commit-ID: 0333a209cbf600e980fc55c24878a56f25f48b65 Gitweb: http://git.kernel.org/tip/0333a209cbf600e980fc55c24878a56f25f48b65 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:34 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:10 +0200
x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
arch/x86/kernel/irq.c +15 -0
@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq; +/* +* NB: Unlike exception entries, IRQ entries do not reliably +* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +entering_irq (); +/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" ); + irq =__this_cpu_read (vector_irq[vector]);if (!handle_irq (irq, regs)) {
So this looks mostly problem free on my boxen, except this warning triggers:
Adding 3911820k swap on /dev/sda2. Priority:-1 extents:1 across:3911820k
capability: warning: `dbus-daemon' uses 32-bit capabilities (legacy support in use)
------------[ cut here ]------------ WARNING: CPU: 1 PID: 2445 at arch/x86/entry/common.c:311 syscall_return_slowpath+0x4c/0x270() syscall 6 left IRQs disabled Modules linked in: CPU: 1 PID: 2445 Comm: distccd Not tainted 4.2.0-rc1-01597-gaecd781-dirty #18 0000000000000000 00000000776afac2 ffff880035413e58 ffffffff81c8915f 0000000000000000 ffff880035413eb0 ffff880035413e98 ffffffff810a8d82 ffff880035413e78 ffff880035413f58 0000000020020002 ffff880035410000 Call Trace: [<ffffffff81c8915f>] dump_stack+0x4f/0x7b [<ffffffff810a8d82>] warn_slowpath_common+0xa2/0xc0 [<ffffffff810a8df5>] warn_slowpath_fmt+0x55/0x70 [<ffffffff81001ddc>] syscall_return_slowpath+0x4c/0x270 [<ffffffff81c96471>] int_ret_from_sys_call+0x25/0x9f ---[ end trace 083efc734e089d37 ]---
device: 'vcs2': device_add
PM: Adding info for No Bus:vcs2
device: 'vcsa2': device_add
with ancient user-space, running the attached .config.
The system booted up fine otherwise. The warning corresponds to:
if (WARN(irqs_disabled(), "syscall %ld left IRQs disabled",
regs->orig_ax))
local_irq_enable();and this was just the regular startup of the distccd daemon during bootup, nothing particularly fancy.
Note that 'distccd' is a 32-bit ELF binary - and this is a 64-bit kernel.
Syscall 6 would be:
arch/x86/entry/syscalls/syscall_32.tbl:6 i386 close sys_close
Thanks,
Ingo
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 4.2.0-rc1 Kernel Configuration
#CONFIG_64BIT=yCONFIG_X86_64=yCONFIG_X86=yCONFIG_INSTRUCTION_DECODER=yCONFIG_OUTPUT_FORMAT="elf64-x86-64"CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"CONFIG_LOCKDEP_SUPPORT=yCONFIG_STACKTRACE_SUPPORT=yCONFIG_HAVE_LATENCYTOP_SUPPORT=yCONFIG_MMU=yCONFIG_NEED_DMA_MAP_STATE=yCONFIG_NEED_SG_DMA_LENGTH=yCONFIG_GENERIC_ISA_DMA=yCONFIG_GENERIC_BUG=yCONFIG_GENERIC_BUG_RELATIVE_POINTERS=yCONFIG_GENERIC_HWEIGHT=yCONFIG_ARCH_MAY_HAVE_PC_FDC=yCONFIG_RWSEM_XCHGADD_ALGORITHM=yCONFIG_GENERIC_CALIBRATE_DELAY=yCONFIG_ARCH_HAS_CPU_RELAX=yCONFIG_ARCH_HAS_CACHE_LINE_SIZE=yCONFIG_HAVE_SETUP_PER_CPU_AREA=yCONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=yCONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=yCONFIG_ARCH_HIBERNATION_POSSIBLE=yCONFIG_ARCH_SUSPEND_POSSIBLE=yCONFIG_ARCH_WANT_HUGE_PMD_SHARE=yCONFIG_ARCH_WANT_GENERAL_HUGETLB=yCONFIG_ZONE_DMA32=yCONFIG_AUDIT_ARCH=yCONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=yCONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=yCONFIG_X86_64_SMP=yCONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" CONFIG_BOOTPARAM_SUPPORT_NOT_WANTED=yCONFIG_ARCH_SUPPORTS_UPROBES=yCONFIG_FIX_EARLYCON_MEM=yCONFIG_PGTABLE_LEVELS=4CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"CONFIG_IRQ_WORK=yCONFIG_BUILDTIME_EXTABLE_SORT=y
#
# General setup
#CONFIG_BROKEN_BOOT_ALLOWED4=y
# CONFIG_BROKEN_BOOT_ALLOWED3 is not set
# CONFIG_BROKEN_BOOT_DISALLOWED is not setCONFIG_BROKEN_BOOT_EUROPE=yCONFIG_BROKEN_BOOT_TITAN=yCONFIG_INIT_ENV_ARG_LIMIT=32CONFIG_CROSS_COMPILE=""CONFIG_COMPILE_TEST=yCONFIG_LOCALVERSION=""CONFIG_LOCALVERSION_AUTO=yCONFIG_HAVE_KERNEL_GZIP=yCONFIG_HAVE_KERNEL_BZIP2=yCONFIG_HAVE_KERNEL_LZMA=yCONFIG_HAVE_KERNEL_XZ=yCONFIG_HAVE_KERNEL_LZO=yCONFIG_HAVE_KERNEL_LZ4=y
# CONFIG_KERNEL_GZIP is not setCONFIG_KERNEL_BZIP2=y
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not setCONFIG_DEFAULT_HOSTNAME="(none)"CONFIG_SWAP=yCONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_CROSS_MEMORY_ATTACH is not set
# CONFIG_FHANDLE is not set
# CONFIG_USELIB is not set
# CONFIG_AUDIT is not setCONFIG_HAVE_ARCH_AUDITSYSCALL=y
#
# IRQ subsystem
#CONFIG_GENERIC_IRQ_PROBE=yCONFIG_GENERIC_IRQ_SHOW=yCONFIG_GENERIC_PENDING_IRQ=yCONFIG_GENERIC_IRQ_CHIP=yCONFIG_IRQ_DOMAIN=yCONFIG_IRQ_DOMAIN_HIERARCHY=yCONFIG_IRQ_DOMAIN_DEBUG=yCONFIG_IRQ_FORCED_THREADING=yCONFIG_SPARSE_IRQ=yCONFIG_CLOCKSOURCE_WATCHDOG=yCONFIG_ARCH_CLOCKSOURCE_DATA=yCONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=yCONFIG_GENERIC_TIME_VSYSCALL=yCONFIG_GENERIC_CLOCKEVENTS=yCONFIG_GENERIC_CLOCKEVENTS_BROADCAST=yCONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=yCONFIG_GENERIC_CMOS_UPDATE=y
#
# Timers subsystem
#CONFIG_TICK_ONESHOT=yCONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not setCONFIG_NO_HZ_IDLE=y
# CONFIG_NO_HZ_FULL is not setCONFIG_NO_HZ=yCONFIG_HIGH_RES_TIMERS=y
#
# CPU/Task time and stats accounting
#
# CONFIG_TICK_CPU_ACCOUNTING is not set
# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not setCONFIG_IRQ_TIME_ACCOUNTING=yCONFIG_BSD_PROCESS_ACCT=yCONFIG_BSD_PROCESS_ACCT_V3=yCONFIG_TASKSTATS=yCONFIG_TASK_DELAY_ACCT=yCONFIG_TASK_XACCT=yCONFIG_TASK_IO_ACCOUNTING=y
#
# RCU Subsystem
#CONFIG_PREEMPT_RCU=yCONFIG_RCU_EXPERT=yCONFIG_SRCU=y
# CONFIG_TASKS_RCU is not setCONFIG_RCU_STALL_COMMON=yCONFIG_RCU_FANOUT=64CONFIG_RCU_FANOUT_LEAF=16
# CONFIG_RCU_FAST_NO_HZ is not setCONFIG_TREE_RCU_TRACE=yCONFIG_RCU_BOOST=yCONFIG_RCU_KTHREAD_PRIO=1CONFIG_RCU_BOOST_DELAY=500
# CONFIG_RCU_NOCB_CPU is not set
# CONFIG_RCU_EXPEDITE_BOOT is not setCONFIG_BUILD_BIN2C=yCONFIG_IKCONFIG=yCONFIG_IKCONFIG_PROC=yCONFIG_LOG_BUF_SHIFT=20CONFIG_LOG_CPU_MAX_BUF_SHIFT=12CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=yCONFIG_ARCH_SUPPORTS_NUMA_BALANCING=yCONFIG_ARCH_SUPPORTS_INT128=yCONFIG_CGROUPS=yCONFIG_CGROUP_DEBUG=yCONFIG_CGROUP_FREEZER=yCONFIG_CGROUP_DEVICE=yCONFIG_CPUSETS=yCONFIG_PROC_PID_CPUSET=y
# CONFIG_CGROUP_CPUACCT is not setCONFIG_PAGE_COUNTER=yCONFIG_MEMCG=yCONFIG_MEMCG_SWAP=y
# CONFIG_MEMCG_SWAP_ENABLED is not setCONFIG_MEMCG_KMEM=y
# CONFIG_CGROUP_PERF is not setCONFIG_CGROUP_SCHED=y
# CONFIG_FAIR_GROUP_SCHED is not set
# CONFIG_RT_GROUP_SCHED is not set
# CONFIG_BLK_CGROUP is not setCONFIG_CHECKPOINT_RESTORE=y
# CONFIG_NAMESPACES is not set
# CONFIG_SCHED_AUTOGROUP is not setCONFIG_SYSFS_DEPRECATED=yCONFIG_SYSFS_DEPRECATED_V2=yCONFIG_RELAY=yCONFIG_BLK_DEV_INITRD=yCONFIG_INITRAMFS_SOURCE=""CONFIG_RD_GZIP=yCONFIG_RD_BZIP2=y
# CONFIG_RD_LZMA is not set
# CONFIG_RD_XZ is not set
# CONFIG_RD_LZO is not setCONFIG_RD_LZ4=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not setCONFIG_ANON_INODES=yCONFIG_HAVE_UID16=yCONFIG_SYSCTL_EXCEPTION_TRACE=yCONFIG_HAVE_PCSPKR_PLATFORM=yCONFIG_BPF=yCONFIG_EXPERT=y
# CONFIG_UID16 is not setCONFIG_MULTIUSER=y
# CONFIG_SGETMASK_SYSCALL is not set
# CONFIG_SYSFS_SYSCALL is not setCONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=yCONFIG_PRINTK=yCONFIG_BUG=y
# CONFIG_ELF_CORE is not setCONFIG_PCSPKR_PLATFORM=yCONFIG_BASE_FULL=yCONFIG_FUTEX=y
# CONFIG_EPOLL is not set
# CONFIG_SIGNALFD is not set
# CONFIG_TIMERFD is not setCONFIG_EVENTFD=yCONFIG_BPF_SYSCALL=y
# CONFIG_SHMEM is not setCONFIG_AIO=yCONFIG_ADVISE_SYSCALLS=y
# CONFIG_PCI_QUIRKS is not setCONFIG_EMBEDDED=yCONFIG_HAVE_PERF_EVENTS=y
#
# Kernel Performance Events And Counters
#CONFIG_PERF_EVENTS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not setCONFIG_VM_EVENT_COUNTERS=y
# CONFIG_COMPAT_BRK is not setCONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not setCONFIG_SYSTEM_TRUSTED_KEYRING=y
# CONFIG_PROFILING is not setCONFIG_TRACEPOINTS=yCONFIG_HAVE_OPROFILE=yCONFIG_OPROFILE_NMI_TIMER=y
# CONFIG_KPROBES is not setCONFIG_JUMP_LABEL=yCONFIG_UPROBES=y
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not setCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=yCONFIG_ARCH_USE_BUILTIN_BSWAP=yCONFIG_USER_RETURN_NOTIFIER=yCONFIG_HAVE_IOREMAP_PROT=yCONFIG_HAVE_KPROBES=yCONFIG_HAVE_KRETPROBES=yCONFIG_HAVE_OPTPROBES=yCONFIG_HAVE_KPROBES_ON_FTRACE=yCONFIG_HAVE_ARCH_TRACEHOOK=yCONFIG_HAVE_DMA_ATTRS=yCONFIG_HAVE_DMA_CONTIGUOUS=yCONFIG_GENERIC_SMP_IDLE_THREAD=yCONFIG_HAVE_REGS_AND_STACK_ACCESS_API=yCONFIG_HAVE_DMA_API_DEBUG=yCONFIG_HAVE_HW_BREAKPOINT=yCONFIG_HAVE_MIXED_BREAKPOINTS_REGS=yCONFIG_HAVE_USER_RETURN_NOTIFIER=yCONFIG_HAVE_PERF_EVENTS_NMI=yCONFIG_HAVE_PERF_REGS=yCONFIG_HAVE_PERF_USER_STACK_DUMP=yCONFIG_HAVE_ARCH_JUMP_LABEL=yCONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=yCONFIG_HAVE_CMPXCHG_LOCAL=yCONFIG_HAVE_CMPXCHG_DOUBLE=yCONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=yCONFIG_ARCH_WANT_OLD_COMPAT_IPC=yCONFIG_HAVE_ARCH_SECCOMP_FILTER=yCONFIG_SECCOMP_FILTER=yCONFIG_HAVE_CC_STACKPROTECTOR=yCONFIG_CC_STACKPROTECTOR=y
# CONFIG_CC_STACKPROTECTOR_NONE is not set
# CONFIG_CC_STACKPROTECTOR_REGULAR is not setCONFIG_CC_STACKPROTECTOR_STRONG=yCONFIG_HAVE_CONTEXT_TRACKING=yCONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=yCONFIG_HAVE_IRQ_TIME_ACCOUNTING=yCONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=yCONFIG_HAVE_ARCH_HUGE_VMAP=yCONFIG_HAVE_ARCH_SOFT_DIRTY=yCONFIG_MODULES_USE_ELF_RELA=yCONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=yCONFIG_ARCH_HAS_PGD_INIT_LATE=yCONFIG_ARCH_HAS_ELF_RANDOMIZE=yCONFIG_HAVE_COPY_THREAD_TLS=yCONFIG_OLD_SIGSUSPEND3=yCONFIG_COMPAT_OLD_SIGACTION=y
#
# GCOV-based kernel profiling
#CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not setCONFIG_SLABINFO=yCONFIG_RT_MUTEXES=yCONFIG_BASE_SMALL=0CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set
# CONFIG_MODULE_UNLOAD is not setCONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not setCONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not setCONFIG_MODULE_SIG_ALL=y
# CONFIG_MODULE_SIG_SHA1 is not setCONFIG_MODULE_SIG_SHA224=y
# CONFIG_MODULE_SIG_SHA256 is not set
# CONFIG_MODULE_SIG_SHA384 is not set
# CONFIG_MODULE_SIG_SHA512 is not setCONFIG_MODULE_SIG_HASH="sha224"CONFIG_MODULE_COMPRESS=yCONFIG_MODULE_COMPRESS_GZIP=y
# CONFIG_MODULE_COMPRESS_XZ is not setCONFIG_MODULES_TREE_LOOKUP=yCONFIG_STOP_MACHINE=yCONFIG_BLOCK=yCONFIG_BLK_DEV_BSG=yCONFIG_BLK_DEV_BSGLIB=yCONFIG_BLK_DEV_INTEGRITY=yCONFIG_BLK_CMDLINE_PARSER=y
#
# Partition Types
#CONFIG_PARTITION_ADVANCED=yCONFIG_ACORN_PARTITION=yCONFIG_ACORN_PARTITION_CUMANA=yCONFIG_ACORN_PARTITION_EESOX=yCONFIG_ACORN_PARTITION_ICS=yCONFIG_ACORN_PARTITION_ADFS=yCONFIG_ACORN_PARTITION_POWERTEC=yCONFIG_ACORN_PARTITION_RISCIX=y
# CONFIG_AIX_PARTITION is not setCONFIG_OSF_PARTITION=y
# CONFIG_AMIGA_PARTITION is not set
# CONFIG_ATARI_PARTITION is not set
# CONFIG_MAC_PARTITION is not setCONFIG_MSDOS_PARTITION=yCONFIG_BSD_DISKLABEL=y
# CONFIG_MINIX_SUBPARTITION is not setCONFIG_SOLARIS_X86_PARTITION=y
# CONFIG_UNIXWARE_DISKLABEL is not set
# CONFIG_LDM_PARTITION is not setCONFIG_SGI_PARTITION=yCONFIG_ULTRIX_PARTITION=y
# CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not setCONFIG_EFI_PARTITION=yCONFIG_SYSV68_PARTITION=yCONFIG_CMDLINE_PARTITION=yCONFIG_BLOCK_COMPAT=y
#
# IO Schedulers
#CONFIG_IOSCHED_NOOP=yCONFIG_IOSCHED_DEADLINE=mCONFIG_IOSCHED_CFQ=mCONFIG_DEFAULT_NOOP=yCONFIG_DEFAULT_IOSCHED="noop"CONFIG_PREEMPT_NOTIFIERS=yCONFIG_PADATA=yCONFIG_ASN1=yCONFIG_UNINLINE_SPIN_UNLOCK=yCONFIG_ARCH_SUPPORTS_ATOMIC_RMW=yCONFIG_RWSEM_SPIN_ON_OWNER=yCONFIG_LOCK_SPIN_ON_OWNER=yCONFIG_ARCH_USE_QUEUED_SPINLOCKS=yCONFIG_QUEUED_SPINLOCKS=yCONFIG_ARCH_USE_QUEUED_RWLOCKS=yCONFIG_QUEUED_RWLOCKS=yCONFIG_FREEZER=y
#
# Processor type and features
#
# CONFIG_ZONE_DMA is not set
# CONFIG_SMP_SUPPORT is not setCONFIG_X86_FEATURE_NAMES=yCONFIG_X86_MPPARSE=y
# CONFIG_X86_EXTENDED_PLATFORM is not setCONFIG_IOSF_MBI=mCONFIG_IOSF_MBI_DEBUG=y
# CONFIG_SCHED_OMIT_FRAME_POINTER is not set
# CONFIG_KVMTOOL_TEST_ENABLE is not set
# CONFIG_HYPERVISOR_GUEST is not setCONFIG_NO_BOOTMEM=y
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not setCONFIG_GENERIC_CPU=yCONFIG_X86_INTERNODE_CACHE_SHIFT=6CONFIG_X86_L1_CACHE_SHIFT=6CONFIG_X86_TSC=yCONFIG_X86_CMPXCHG64=yCONFIG_X86_CMOV=yCONFIG_X86_MINIMUM_CPU_FAMILY=64CONFIG_X86_DEBUGCTLMSR=yCONFIG_PROCESSOR_SELECT=y
# CONFIG_CPU_SUP_INTEL is not setCONFIG_CPU_SUP_AMD=yCONFIG_CPU_SUP_CENTAUR=yCONFIG_HPET_TIMER=y
# CONFIG_DMI is not setCONFIG_GART_IOMMU=yCONFIG_CALGARY_IOMMU=yCONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=yCONFIG_SWIOTLB=yCONFIG_IOMMU_HELPER=y
# CONFIG_MAXSMP is not setCONFIG_NR_CPUS=64
# CONFIG_SCHED_SMT is not set
# CONFIG_SCHED_MC is not set
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not setCONFIG_PREEMPT=yCONFIG_PREEMPT_COUNT=yCONFIG_X86_LOCAL_APIC=yCONFIG_X86_IO_APIC=yCONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
# CONFIG_X86_MCE is not setCONFIG_X86_16BIT=yCONFIG_X86_ESPFIX64=yCONFIG_X86_VSYSCALL_EMULATION=y
# CONFIG_I8K is not setCONFIG_MICROCODE=yCONFIG_MICROCODE_INTEL=y
# CONFIG_MICROCODE_AMD is not setCONFIG_MICROCODE_OLD_INTERFACE=y
# CONFIG_MICROCODE_EARLY is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set
# CONFIG_UP_WANTED_1 is not setCONFIG_SMP=yCONFIG_ARCH_PHYS_ADDR_T_64BIT=yCONFIG_ARCH_DMA_ADDR_T_64BIT=yCONFIG_NUMA=yCONFIG_AMD_NUMA=y
# CONFIG_NUMA_EMU is not setCONFIG_NODES_SHIFT=6CONFIG_ARCH_SPARSEMEM_ENABLE=yCONFIG_ARCH_SPARSEMEM_DEFAULT=yCONFIG_ARCH_SELECT_MEMORY_MODEL=yCONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000CONFIG_SELECT_MEMORY_MODEL=yCONFIG_SPARSEMEM_MANUAL=yCONFIG_SPARSEMEM=yCONFIG_NEED_MULTIPLE_NODES=yCONFIG_HAVE_MEMORY_PRESENT=yCONFIG_SPARSEMEM_EXTREME=yCONFIG_SPARSEMEM_VMEMMAP_ENABLE=yCONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
# CONFIG_SPARSEMEM_VMEMMAP is not setCONFIG_HAVE_MEMBLOCK=yCONFIG_HAVE_MEMBLOCK_NODE_MAP=yCONFIG_ARCH_DISCARD_MEMBLOCK=yCONFIG_MOVABLE_NODE=y
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
# CONFIG_MEMORY_HOTPLUG is not setCONFIG_PAGEFLAGS_EXTENDED=yCONFIG_SPLIT_PTLOCK_CPUS=4CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=yCONFIG_MEMORY_BALLOON=y
# CONFIG_COMPACTION is not set
# CONFIG_MIGRATION is not setCONFIG_PHYS_ADDR_T_64BIT=yCONFIG_ZONE_DMA_FLAG=0CONFIG_NEED_BOUNCE_POOL=yCONFIG_VIRT_TO_BUS=yCONFIG_MMU_NOTIFIER=yCONFIG_KSM=yCONFIG_DEFAULT_MMAP_MIN_ADDR=4096
# CONFIG_TRANSPARENT_HUGEPAGE is not set
# CONFIG_CLEANCACHE is not set
# CONFIG_FRONTSWAP is not set
# CONFIG_CMA is not set
# CONFIG_MEM_SOFT_DIRTY is not setCONFIG_ZPOOL=y
# CONFIG_ZBUD is not setCONFIG_ZSMALLOC=yCONFIG_PGTABLE_MAPPING=yCONFIG_ZSMALLOC_STAT=yCONFIG_GENERIC_EARLY_IOREMAP=yCONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y
# CONFIG_X86_PMEM_LEGACY is not set
# CONFIG_X86_CHECK_BIOS_CORRUPTION is not setCONFIG_X86_RESERVE_LOW=64CONFIG_MTRR=y
# CONFIG_MTRR_SANITIZER is not setCONFIG_X86_PAT=yCONFIG_ARCH_USES_PG_UNCACHED=y
# CONFIG_ARCH_RANDOM is not setCONFIG_X86_SMAP=yCONFIG_SECCOMP=y
# CONFIG_HZ_100 is not setCONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not setCONFIG_HZ=250CONFIG_SCHED_HRTICK=y
# CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not setCONFIG_PHYSICAL_START=0x1000000CONFIG_RELOCATABLE=yCONFIG_RANDOMIZE_BASE=yCONFIG_RANDOMIZE_BASE_MAX_OFFSET=0x40000000CONFIG_X86_NEED_RELOCS=yCONFIG_PHYSICAL_ALIGN=0x200000CONFIG_HOTPLUG_CPU=yCONFIG_BOOTPARAM_HOTPLUG_CPU0=yCONFIG_DEBUG_HOTPLUG_CPU0=y
# CONFIG_COMPAT_VDSO is not setCONFIG_CMDLINE_BOOL=yCONFIG_CMDLINE=""CONFIG_HAVE_LIVEPATCH=yCONFIG_LIVEPATCH=yCONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=yCONFIG_USE_PERCPU_NUMA_NODE_ID=y
#
# Power management and ACPI options
#CONFIG_ARCH_HIBERNATION_HEADER=y
# CONFIG_SUSPEND is not setCONFIG_HIBERNATE_CALLBACKS=yCONFIG_HIBERNATION=yCONFIG_PM_STD_PARTITION=""CONFIG_PM_SLEEP=yCONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_AUTOSLEEP is not set
# CONFIG_PM_WAKELOCKS is not setCONFIG_PM=yCONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not setCONFIG_PM_SLEEP_DEBUG=yCONFIG_DPM_WATCHDOG=yCONFIG_DPM_WATCHDOG_TIMEOUT=60
# CONFIG_PM_TRACE_RTC is not setCONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
# CONFIG_ACPI is not setCONFIG_SFI=y
#
# CPU Frequency scaling
#CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_ONDEMAND=m CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
#
# CPU frequency scaling drivers
#
# CONFIG_X86_INTEL_PSTATE is not set
# CONFIG_X86_P4_CLOCKMOD is not set
#
# shared options # # CONFIG_X86_SPEEDSTEP_LIB is not set
#
# CPU Idle
#
# CONFIG_CPU_IDLE is not set
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
#
# Memory power savings
#
# CONFIG_I7300_IDLE is not set
#
# Bus options (PCI etc.)
#CONFIG_PCI=yCONFIG_PCI_DIRECT=yCONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
# CONFIG_PCIEPORTBUS is not setCONFIG_PCI_BUS_ADDR_T_64BIT=y
# CONFIG_PCI_MSI is not setCONFIG_PCI_DEBUG=y
# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
# CONFIG_PCI_STUB is not setCONFIG_HT_IRQ=yCONFIG_PCI_ATS=yCONFIG_PCI_IOV=y
# CONFIG_PCI_PRI is not setCONFIG_PCI_PASID=y
#
# PCI host controller drivers
#CONFIG_ISA_DMA_API=yCONFIG_AMD_NB=yCONFIG_PCCARD=yCONFIG_PCMCIA=yCONFIG_PCMCIA_LOAD_CIS=yCONFIG_CARDBUS=y
#
# PC-card bridges
#
# CONFIG_YENTA is not setCONFIG_PD6729=yCONFIG_I82092=yCONFIG_PCCARD_NONSTATIC=yCONFIG_HOTPLUG_PCI=yCONFIG_HOTPLUG_PCI_CPCI=y
# CONFIG_HOTPLUG_PCI_CPCI_ZT5550 is not setCONFIG_HOTPLUG_PCI_CPCI_GENERIC=yCONFIG_HOTPLUG_PCI_SHPC=yCONFIG_RAPIDIO=yCONFIG_RAPIDIO_DISC_TIMEOUT=30
# CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not setCONFIG_RAPIDIO_DMA_ENGINE=y
# CONFIG_RAPIDIO_DEBUG is not setCONFIG_RAPIDIO_ENUM_BASIC=m
#
# RapidIO Switch drivers
#CONFIG_RAPIDIO_TSI57X=yCONFIG_RAPIDIO_CPS_XX=yCONFIG_RAPIDIO_TSI568=y
# CONFIG_RAPIDIO_CPS_GEN2 is not set
# CONFIG_X86_SYSFB is not set
#
# Executable file formats / Emulations
#CONFIG_BINFMT_ELF=yCONFIG_COMPAT_BINFMT_ELF=y
# CONFIG_BINFMT_SCRIPT is not set
# CONFIG_HAVE_AOUT is not setCONFIG_BINFMT_MISC=mCONFIG_COREDUMP=yCONFIG_IA32_EMULATION=yCONFIG_IA32_AOUT=m
# CONFIG_X86_X32 is not setCONFIG_COMPAT=yCONFIG_COMPAT_FOR_U64_ALIGNMENT=yCONFIG_SYSVIPC_COMPAT=yCONFIG_KEYS_COMPAT=yCONFIG_X86_DEV_DMA_OPS=yCONFIG_PMC_ATOM=yCONFIG_NET=yCONFIG_NET_INGRESS=y
#
# Networking options
#CONFIG_PACKET=yCONFIG_PACKET_DIAG=mCONFIG_UNIX=y
# CONFIG_UNIX_DIAG is not setCONFIG_XFRM=yCONFIG_XFRM_ALGO=m
# CONFIG_XFRM_USER is not setCONFIG_XFRM_SUB_POLICY=yCONFIG_XFRM_MIGRATE=yCONFIG_XFRM_STATISTICS=y
# CONFIG_NET_KEY is not setCONFIG_INET=yCONFIG_IP_MULTICAST=yCONFIG_IP_ADVANCED_ROUTER=yCONFIG_IP_FIB_TRIE_STATS=y
# CONFIG_IP_MULTIPLE_TABLES is not setCONFIG_IP_ROUTE_MULTIPATH=y
# CONFIG_IP_ROUTE_VERBOSE is not setCONFIG_IP_ROUTE_CLASSID=y
# CONFIG_IP_PNP is not setCONFIG_NET_IPIP=mCONFIG_NET_IPGRE_DEMUX=yCONFIG_NET_IP_TUNNEL=yCONFIG_NET_IPGRE=m
# CONFIG_NET_IPGRE_BROADCAST is not setCONFIG_IP_MROUTE=yCONFIG_IP_MROUTE_MULTIPLE_TABLES=yCONFIG_IP_PIMSM_V1=y
# CONFIG_IP_PIMSM_V2 is not set
# CONFIG_SYN_COOKIES is not setCONFIG_NET_IPVTI=mCONFIG_NET_UDP_TUNNEL=yCONFIG_NET_FOU=mCONFIG_NET_FOU_IP_TUNNELS=yCONFIG_GENEVE_CORE=yCONFIG_INET_AH=m
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not setCONFIG_INET_TUNNEL=m
# CONFIG_INET_XFRM_MODE_TRANSPORT is not setCONFIG_INET_XFRM_MODE_TUNNEL=m
# CONFIG_INET_XFRM_MODE_BEET is not setCONFIG_INET_LRO=mCONFIG_INET_DIAG=mCONFIG_INET_TCP_DIAG=mCONFIG_INET_UDP_DIAG=m
# CONFIG_TCP_CONG_ADVANCED is not setCONFIG_TCP_CONG_CUBIC=yCONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_TCP_MD5SIG is not set
# CONFIG_NETLABEL is not setCONFIG_NETWORK_SECMARK=yCONFIG_NET_PTP_CLASSIFY=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not setCONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not setCONFIG_NETFILTER_ADVANCED=yCONFIG_BRIDGE_NETFILTER=m
#
# Core Netfilter Configuration
#CONFIG_NETFILTER_INGRESS=yCONFIG_NETFILTER_NETLINK=yCONFIG_NETFILTER_NETLINK_ACCT=yCONFIG_NETFILTER_NETLINK_QUEUE=yCONFIG_NETFILTER_NETLINK_LOG=y
# CONFIG_NF_CONNTRACK is not setCONFIG_NF_LOG_COMMON=yCONFIG_NF_TABLES=yCONFIG_NF_TABLES_NETDEV=yCONFIG_NFT_EXTHDR=mCONFIG_NFT_META=y
# CONFIG_NFT_RBTREE is not setCONFIG_NFT_HASH=yCONFIG_NFT_COUNTER=m
# CONFIG_NFT_LOG is not setCONFIG_NFT_LIMIT=mCONFIG_NFT_QUEUE=yCONFIG_NFT_REJECT=yCONFIG_NFT_COMPAT=mCONFIG_NETFILTER_XTABLES=y
#
# Xtables combined modules
#CONFIG_NETFILTER_XT_MARK=y
#
# Xtables targets
#
# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not setCONFIG_NETFILTER_XT_TARGET_CLASSIFY=mCONFIG_NETFILTER_XT_TARGET_DSCP=mCONFIG_NETFILTER_XT_TARGET_HL=mCONFIG_NETFILTER_XT_TARGET_HMARK=yCONFIG_NETFILTER_XT_TARGET_IDLETIMER=yCONFIG_NETFILTER_XT_TARGET_LOG=y
# CONFIG_NETFILTER_XT_TARGET_MARK is not setCONFIG_NETFILTER_XT_TARGET_NFLOG=m
# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not setCONFIG_NETFILTER_XT_TARGET_RATEEST=y
# CONFIG_NETFILTER_XT_TARGET_TEE is not setCONFIG_NETFILTER_XT_TARGET_TPROXY=m
# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not setCONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
#
# Xtables matches
#CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=mCONFIG_NETFILTER_XT_MATCH_BPF=mCONFIG_NETFILTER_XT_MATCH_CGROUP=yCONFIG_NETFILTER_XT_MATCH_COMMENT=y
# CONFIG_NETFILTER_XT_MATCH_CPU is not setCONFIG_NETFILTER_XT_MATCH_DCCP=m
# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not setCONFIG_NETFILTER_XT_MATCH_DSCP=mCONFIG_NETFILTER_XT_MATCH_ECN=mCONFIG_NETFILTER_XT_MATCH_ESP=yCONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
# CONFIG_NETFILTER_XT_MATCH_HL is not setCONFIG_NETFILTER_XT_MATCH_IPCOMP=yCONFIG_NETFILTER_XT_MATCH_IPRANGE=m
# CONFIG_NETFILTER_XT_MATCH_L2TP is not setCONFIG_NETFILTER_XT_MATCH_LENGTH=mCONFIG_NETFILTER_XT_MATCH_LIMIT=mCONFIG_NETFILTER_XT_MATCH_MAC=m
# CONFIG_NETFILTER_XT_MATCH_MARK is not set
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not setCONFIG_NETFILTER_XT_MATCH_NFACCT=mCONFIG_NETFILTER_XT_MATCH_OSF=y
# CONFIG_NETFILTER_XT_MATCH_OWNER is not setCONFIG_NETFILTER_XT_MATCH_POLICY=y
# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not setCONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
# CONFIG_NETFILTER_XT_MATCH_QUOTA is not setCONFIG_NETFILTER_XT_MATCH_RATEEST=yCONFIG_NETFILTER_XT_MATCH_REALM=mCONFIG_NETFILTER_XT_MATCH_RECENT=yCONFIG_NETFILTER_XT_MATCH_SCTP=yCONFIG_NETFILTER_XT_MATCH_SOCKET=mCONFIG_NETFILTER_XT_MATCH_STATISTIC=mCONFIG_NETFILTER_XT_MATCH_STRING=yCONFIG_NETFILTER_XT_MATCH_TCPMSS=yCONFIG_NETFILTER_XT_MATCH_TIME=y
# CONFIG_NETFILTER_XT_MATCH_U32 is not set
# CONFIG_IP_SET is not setCONFIG_IP_VS=yCONFIG_IP_VS_DEBUG=yCONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
# CONFIG_IP_VS_PROTO_TCP is not set
# CONFIG_IP_VS_PROTO_UDP is not setCONFIG_IP_VS_PROTO_AH_ESP=y
# CONFIG_IP_VS_PROTO_ESP is not setCONFIG_IP_VS_PROTO_AH=yCONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#CONFIG_IP_VS_RR=yCONFIG_IP_VS_WRR=mCONFIG_IP_VS_LC=yCONFIG_IP_VS_WLC=y
# CONFIG_IP_VS_FO is not setCONFIG_IP_VS_LBLC=mCONFIG_IP_VS_LBLCR=yCONFIG_IP_VS_DH=mCONFIG_IP_VS_SH=m
# CONFIG_IP_VS_SED is not setCONFIG_IP_VS_NQ=y
#
# IPVS SH scheduler
#CONFIG_IP_VS_SH_TAB_BITS=8
#
# IPVS application helper
#
#
# IP: Netfilter Configuration
#CONFIG_NF_DEFRAG_IPV4=mCONFIG_NF_TABLES_IPV4=mCONFIG_NFT_CHAIN_ROUTE_IPV4=mCONFIG_NFT_REJECT_IPV4=mCONFIG_NF_TABLES_ARP=mCONFIG_NF_LOG_ARP=yCONFIG_NF_LOG_IPV4=yCONFIG_NF_REJECT_IPV4=mCONFIG_IP_NF_IPTABLES=mCONFIG_IP_NF_MATCH_AH=mCONFIG_IP_NF_MATCH_ECN=mCONFIG_IP_NF_MATCH_RPFILTER=m
# CONFIG_IP_NF_MATCH_TTL is not setCONFIG_IP_NF_FILTER=mCONFIG_IP_NF_TARGET_REJECT=mCONFIG_IP_NF_MANGLE=mCONFIG_IP_NF_TARGET_ECN=m
# CONFIG_IP_NF_TARGET_TTL is not setCONFIG_IP_NF_RAW=mCONFIG_IP_NF_SECURITY=mCONFIG_IP_NF_ARPTABLES=yCONFIG_IP_NF_ARPFILTER=mCONFIG_IP_NF_ARP_MANGLE=m
#
# DECnet: Netfilter Configuration
#
# CONFIG_DECNET_NF_GRABULATOR is not setCONFIG_NF_TABLES_BRIDGE=mCONFIG_NFT_BRIDGE_META=mCONFIG_NF_LOG_BRIDGE=mCONFIG_BRIDGE_NF_EBTABLES=mCONFIG_BRIDGE_EBT_BROUTE=m
# CONFIG_BRIDGE_EBT_T_FILTER is not setCONFIG_BRIDGE_EBT_T_NAT=mCONFIG_BRIDGE_EBT_802_3=mCONFIG_BRIDGE_EBT_AMONG=mCONFIG_BRIDGE_EBT_ARP=mCONFIG_BRIDGE_EBT_IP=m
# CONFIG_BRIDGE_EBT_LIMIT is not setCONFIG_BRIDGE_EBT_MARK=mCONFIG_BRIDGE_EBT_PKTTYPE=m
# CONFIG_BRIDGE_EBT_STP is not setCONFIG_BRIDGE_EBT_VLAN=mCONFIG_BRIDGE_EBT_ARPREPLY=mCONFIG_BRIDGE_EBT_DNAT=mCONFIG_BRIDGE_EBT_MARK_T=m
# CONFIG_BRIDGE_EBT_REDIRECT is not set
# CONFIG_BRIDGE_EBT_SNAT is not set
# CONFIG_BRIDGE_EBT_LOG is not set
# CONFIG_BRIDGE_EBT_NFLOG is not setCONFIG_IP_DCCP=yCONFIG_INET_DCCP_DIAG=m
#
# DCCP CCIDs Configuration
#
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
# CONFIG_IP_DCCP_CCID3 is not set
#
# DCCP Kernel Hacking
#CONFIG_IP_DCCP_DEBUG=yCONFIG_IP_SCTP=mCONFIG_SCTP_DBG_OBJCNT=y
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set
# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not setCONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE=y
# CONFIG_SCTP_COOKIE_HMAC_MD5 is not setCONFIG_SCTP_COOKIE_HMAC_SHA1=y
# CONFIG_TIPC is not setCONFIG_ATM=m
# CONFIG_ATM_CLIP is not setCONFIG_ATM_LANE=mCONFIG_ATM_MPOA=m
# CONFIG_ATM_BR2684 is not set
# CONFIG_L2TP is not setCONFIG_STP=mCONFIG_BRIDGE=mCONFIG_BRIDGE_IGMP_SNOOPING=yCONFIG_HAVE_NET_DSA=y
# CONFIG_VLAN_8021Q is not setCONFIG_DECNET=mCONFIG_DECNET_ROUTER=yCONFIG_LLC=yCONFIG_LLC2=mCONFIG_IPX=yCONFIG_IPX_INTERN=y
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not setCONFIG_PHONET=yCONFIG_IEEE802154=m
# CONFIG_IEEE802154_SOCKET is not setCONFIG_MAC802154=mCONFIG_NET_SCHED=y
#
# Queueing/Scheduling
#CONFIG_NET_SCH_CBQ=m
# CONFIG_NET_SCH_HTB is not setCONFIG_NET_SCH_HFSC=y
# CONFIG_NET_SCH_ATM is not setCONFIG_NET_SCH_PRIO=mCONFIG_NET_SCH_MULTIQ=yCONFIG_NET_SCH_RED=mCONFIG_NET_SCH_SFB=yCONFIG_NET_SCH_SFQ=yCONFIG_NET_SCH_TEQL=yCONFIG_NET_SCH_TBF=yCONFIG_NET_SCH_GRED=m
# CONFIG_NET_SCH_DSMARK is not setCONFIG_NET_SCH_NETEM=yCONFIG_NET_SCH_DRR=m
# CONFIG_NET_SCH_MQPRIO is not setCONFIG_NET_SCH_CHOKE=mCONFIG_NET_SCH_QFQ=mCONFIG_NET_SCH_CODEL=m
# CONFIG_NET_SCH_FQ_CODEL is not setCONFIG_NET_SCH_FQ=y
# CONFIG_NET_SCH_HHF is not setCONFIG_NET_SCH_PIE=yCONFIG_NET_SCH_PLUG=m
#
# Classification
#CONFIG_NET_CLS=yCONFIG_NET_CLS_BASIC=y
# CONFIG_NET_CLS_TCINDEX is not setCONFIG_NET_CLS_ROUTE4=yCONFIG_NET_CLS_FW=yCONFIG_NET_CLS_U32=y
# CONFIG_CLS_U32_PERF is not set
# CONFIG_CLS_U32_MARK is not setCONFIG_NET_CLS_RSVP=mCONFIG_NET_CLS_RSVP6=mCONFIG_NET_CLS_FLOW=mCONFIG_NET_CLS_CGROUP=mCONFIG_NET_CLS_BPF=m
# CONFIG_NET_CLS_FLOWER is not set
# CONFIG_NET_EMATCH is not set
# CONFIG_NET_CLS_ACT is not setCONFIG_NET_CLS_IND=yCONFIG_NET_SCH_FIFO=yCONFIG_DCB=y
# CONFIG_DNS_RESOLVER is not set
# CONFIG_BATMAN_ADV is not set
# CONFIG_OPENVSWITCH is not set
# CONFIG_VSOCKETS is not setCONFIG_NETLINK_MMAP=yCONFIG_NETLINK_DIAG=mCONFIG_MPLS=yCONFIG_NET_MPLS_GSO=mCONFIG_MPLS_ROUTING=m
# CONFIG_HSR is not set
# CONFIG_NET_SWITCHDEV is not setCONFIG_RPS=yCONFIG_RFS_ACCEL=yCONFIG_XPS=y
# CONFIG_CGROUP_NET_PRIO is not setCONFIG_CGROUP_NET_CLASSID=yCONFIG_NET_RX_BUSY_POLL=yCONFIG_BQL=y
# CONFIG_BPF_JIT is not setCONFIG_NET_FLOW_LIMIT=y
#
# Network testing
#
# CONFIG_NET_PKTGEN is not setCONFIG_NET_DROP_MONITOR=yCONFIG_HAMRADIO=y
#
# Packet Radio protocols
#
# CONFIG_AX25 is not setCONFIG_CAN=yCONFIG_CAN_RAW=y
# CONFIG_CAN_BCM is not setCONFIG_CAN_GW=y
#
# CAN Device Drivers
#
# CONFIG_CAN_VCAN is not set
# CONFIG_CAN_SLCAN is not setCONFIG_CAN_DEV=mCONFIG_CAN_CALC_BITTIMING=y
# CONFIG_CAN_LEDS is not set
# CONFIG_CAN_AT91 is not set
# CONFIG_CAN_JANZ_ICAN3 is not setCONFIG_PCH_CAN=m
# CONFIG_CAN_SJA1000 is not setCONFIG_CAN_C_CAN=m
# CONFIG_CAN_C_CAN_PLATFORM is not set
# CONFIG_CAN_C_CAN_PCI is not set
# CONFIG_CAN_M_CAN is not setCONFIG_CAN_CC770=m
# CONFIG_CAN_CC770_ISA is not setCONFIG_CAN_CC770_PLATFORM=m
#
# CAN SPI interfaces
#CONFIG_CAN_MCP251X=m
#
# CAN USB interfaces
#
# CONFIG_CAN_EMS_USB is not setCONFIG_CAN_ESD_USB2=m
# CONFIG_CAN_GS_USB is not setCONFIG_CAN_KVASER_USB=mCONFIG_CAN_PEAK_USB=m
# CONFIG_CAN_8DEV_USB is not setCONFIG_CAN_SOFTING=mCONFIG_CAN_SOFTING_CS=m
# CONFIG_CAN_DEBUG_DEVICES is not setCONFIG_IRDA=m
#
# IrDA protocols
#CONFIG_IRLAN=mCONFIG_IRNET=m
# CONFIG_IRCOMM is not setCONFIG_IRDA_ULTRA=y
#
# IrDA options
#CONFIG_IRDA_CACHE_LAST_LSAP=yCONFIG_IRDA_FAST_RR=y
# CONFIG_IRDA_DEBUG is not set
#
# Infrared-port device drivers
#
#
# SIR device drivers
#CONFIG_IRTTY_SIR=m
#
# Dongle support
#CONFIG_DONGLE=yCONFIG_ESI_DONGLE=mCONFIG_ACTISYS_DONGLE=mCONFIG_TEKRAM_DONGLE=m
# CONFIG_TOIM3232_DONGLE is not setCONFIG_LITELINK_DONGLE=m
# CONFIG_MA600_DONGLE is not setCONFIG_GIRBIL_DONGLE=mCONFIG_MCP2120_DONGLE=m
# CONFIG_OLD_BELKIN_DONGLE is not setCONFIG_ACT200L_DONGLE=mCONFIG_KINGSUN_DONGLE=mCONFIG_KSDAZZLE_DONGLE=mCONFIG_KS959_DONGLE=m
#
# FIR device drivers
#
# CONFIG_USB_IRDA is not setCONFIG_SIGMATEL_FIR=mCONFIG_NSC_FIR=m
# CONFIG_WINBOND_FIR is not set
# CONFIG_SMC_IRCC_FIR is not set
# CONFIG_ALI_FIR is not setCONFIG_VLSI_FIR=mCONFIG_VIA_FIR=mCONFIG_MCS_FIR=m
# CONFIG_SH_IRDA is not set
# CONFIG_BT is not setCONFIG_AF_RXRPC=m
# CONFIG_AF_RXRPC_DEBUG is not set
# CONFIG_RXKAD is not setCONFIG_FIB_RULES=y
# CONFIG_WIRELESS is not set
# CONFIG_WIMAX is not setCONFIG_RFKILL=y
# CONFIG_RFKILL_INPUT is not setCONFIG_RFKILL_REGULATOR=yCONFIG_RFKILL_GPIO=yCONFIG_NET_9P=y
# CONFIG_NET_9P_VIRTIO is not setCONFIG_NET_9P_RDMA=yCONFIG_NET_9P_DEBUG=yCONFIG_CAIF=m
# CONFIG_CAIF_DEBUG is not setCONFIG_CAIF_NETDEV=mCONFIG_CAIF_USB=mCONFIG_CEPH_LIB=mCONFIG_CEPH_LIB_PRETTYDEBUG=y
# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not setCONFIG_NFC=mCONFIG_NFC_DIGITAL=mCONFIG_NFC_NCI=mCONFIG_NFC_NCI_SPI=yCONFIG_NFC_NCI_UART=m
# CONFIG_NFC_HCI is not set
#
# Near Field Communication (NFC) devices
#CONFIG_NFC_PN533=m
# CONFIG_NFC_TRF7970A is not setCONFIG_NFC_SIM=mCONFIG_NFC_PORT100=m
# CONFIG_NFC_MRVL is not set
# CONFIG_NFC_ST_NCI is not setCONFIG_NFC_NXP_NCI=mCONFIG_NFC_NXP_NCI_I2C=mCONFIG_HAVE_BPF_JIT=y
#
# Device Drivers
#
#
# Generic Driver Options
#CONFIG_UEVENT_HELPER=yCONFIG_UEVENT_HELPER_PATH=""
# CONFIG_DEVTMPFS is not setCONFIG_STANDALONE=yCONFIG_PREVENT_FIRMWARE_BUILD=yCONFIG_FW_LOADER=y
# CONFIG_FIRMWARE_IN_KERNEL is not setCONFIG_EXTRA_FIRMWARE=""CONFIG_FW_LOADER_USER_HELPER=yCONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
# CONFIG_ALLOW_DEV_COREDUMP is not setCONFIG_DEBUG_DRIVER=y
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not set
# CONFIG_GENERIC_CPU_DEVICES is not setCONFIG_GENERIC_CPU_AUTOPROBE=yCONFIG_REGMAP=yCONFIG_REGMAP_I2C=yCONFIG_REGMAP_SPI=yCONFIG_REGMAP_MMIO=yCONFIG_REGMAP_IRQ=yCONFIG_DMA_SHARED_BUFFER=y
# CONFIG_FENCE_TRACE is not set
#
# Bus devices
#CONFIG_CONNECTOR=yCONFIG_PROC_EVENTS=y
# CONFIG_OF is not setCONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
# CONFIG_PARPORT is not setCONFIG_BLK_DEV=yCONFIG_BLK_DEV_NULL_BLK=y
# CONFIG_BLK_DEV_FD is not setCONFIG_BLK_DEV_PCIESSD_MTIP32XX=mCONFIG_ZRAM=mCONFIG_ZRAM_LZ4_COMPRESS=y
# CONFIG_BLK_CPQ_CISS_DA is not setCONFIG_BLK_DEV_DAC960=yCONFIG_BLK_DEV_UMEM=y
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not setCONFIG_BLK_DEV_NBD=m
# CONFIG_BLK_DEV_SKD is not setCONFIG_BLK_DEV_SX8=m
# CONFIG_BLK_DEV_RAM is not setCONFIG_CDROM_PKTCDVD=mCONFIG_CDROM_PKTCDVD_BUFFERS=8CONFIG_CDROM_PKTCDVD_WCACHE=yCONFIG_ATA_OVER_ETH=mCONFIG_VIRTIO_BLK=yCONFIG_BLK_DEV_HD=yCONFIG_BLK_DEV_RBD=m
# CONFIG_BLK_DEV_RSXX is not set
#
# Misc devices
#CONFIG_SENSORS_LIS3LV02D=y
# CONFIG_AD525X_DPOT is not setCONFIG_DUMMY_IRQ=yCONFIG_IBM_ASM=mCONFIG_PHANTOM=m
# CONFIG_INTEL_MID_PTI is not set
# CONFIG_SGI_IOC4 is not setCONFIG_TIFM_CORE=yCONFIG_TIFM_7XX1=mCONFIG_ICS932S401=y
# CONFIG_ATMEL_SSC is not setCONFIG_ENCLOSURE_SERVICES=y
# CONFIG_HP_ILO is not setCONFIG_APDS9802ALS=y
# CONFIG_ISL29003 is not setCONFIG_ISL29020=yCONFIG_SENSORS_TSL2550=y
# CONFIG_SENSORS_BH1780 is not setCONFIG_SENSORS_BH1770=mCONFIG_SENSORS_APDS990X=y
# CONFIG_HMC6352 is not set
# CONFIG_DS1682 is not set
# CONFIG_TI_DAC7512 is not setCONFIG_BMP085=yCONFIG_BMP085_I2C=mCONFIG_BMP085_SPI=mCONFIG_PCH_PHUB=yCONFIG_USB_SWITCH_FSA9480=m
# CONFIG_LATTICE_ECP3_CONFIG is not setCONFIG_SRAM=yCONFIG_C2PORT=yCONFIG_C2PORT_DURAMAR_2150=y
#
# EEPROM support
#
# CONFIG_EEPROM_AT24 is not setCONFIG_EEPROM_AT25=y
# CONFIG_EEPROM_LEGACY is not set
# CONFIG_EEPROM_MAX6875 is not setCONFIG_EEPROM_93CX6=m
# CONFIG_EEPROM_93XX46 is not setCONFIG_CB710_CORE=yCONFIG_CB710_DEBUG=yCONFIG_CB710_DEBUG_ASSUMPTIONS=y
#
# Texas Instruments shared transport line discipline #
# CONFIG_TI_ST is not set
# CONFIG_SENSORS_LIS3_SPI is not set CONFIG_SENSORS_LIS3_I2C=y
#
# Altera FPGA firmware download module
#CONFIG_ALTERA_STAPL=yCONFIG_VMWARE_VMCI=m
#
# Intel MIC Bus Driver
#CONFIG_INTEL_MIC_BUS=m
#
# SCIF Bus Driver
#CONFIG_SCIF_BUS=m
#
# Intel MIC Host Driver
#CONFIG_INTEL_MIC_HOST=m
#
# Intel MIC Card Driver
#CONFIG_INTEL_MIC_CARD=m
#
# SCIF Driver
#CONFIG_SCIF=mCONFIG_GENWQE=mCONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0CONFIG_ECHO=y
# CONFIG_CXL_BASE is not set
# CONFIG_CXL_KERNEL_API is not setCONFIG_HAVE_IDE=y
#
# SCSI device support
#CONFIG_SCSI_MOD=yCONFIG_RAID_ATTRS=yCONFIG_SCSI=yCONFIG_SCSI_DMA=y
# CONFIG_SCSI_NETLINK is not setCONFIG_SCSI_MQ_DEFAULT=yCONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not setCONFIG_BLK_DEV_SR=mCONFIG_BLK_DEV_SR_VENDOR=yCONFIG_CHR_DEV_SG=yCONFIG_CHR_DEV_SCH=m
# CONFIG_SCSI_ENCLOSURE is not set
# CONFIG_SCSI_CONSTANTS is not setCONFIG_SCSI_LOGGING=y
# CONFIG_SCSI_SCAN_ASYNC is not set
#
# SCSI Transports
#CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not setCONFIG_SCSI_ISCSI_ATTRS=yCONFIG_SCSI_SAS_ATTRS=yCONFIG_SCSI_SAS_LIBSAS=y
# CONFIG_SCSI_SAS_ATA is not setCONFIG_SCSI_SAS_HOST_SMP=y
# CONFIG_SCSI_SRP_ATTRS is not setCONFIG_SCSI_LOWLEVEL=yCONFIG_ISCSI_TCP=mCONFIG_ISCSI_BOOT_SYSFS=yCONFIG_SCSI_CXGB3_ISCSI=mCONFIG_SCSI_CXGB4_ISCSI=m
# CONFIG_SCSI_BNX2_ISCSI is not setCONFIG_BE2ISCSI=yCONFIG_BLK_DEV_3W_XXXX_RAID=y
# CONFIG_SCSI_HPSA is not setCONFIG_SCSI_3W_9XXX=m
# CONFIG_SCSI_3W_SAS is not setCONFIG_SCSI_ACARD=yCONFIG_SCSI_AACRAID=mCONFIG_SCSI_AIC7XXX=yCONFIG_AIC7XXX_CMDS_PER_DEVICE=32CONFIG_AIC7XXX_RESET_DELAY_MS=5000CONFIG_AIC7XXX_DEBUG_ENABLE=yCONFIG_AIC7XXX_DEBUG_MASK=0CONFIG_AIC7XXX_REG_PRETTY_PRINT=yCONFIG_SCSI_AIC79XX=yCONFIG_AIC79XX_CMDS_PER_DEVICE=32CONFIG_AIC79XX_RESET_DELAY_MS=5000
# CONFIG_AIC79XX_DEBUG_ENABLE is not setCONFIG_AIC79XX_DEBUG_MASK=0
# CONFIG_AIC79XX_REG_PRETTY_PRINT is not setCONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not setCONFIG_SCSI_MVSAS=mCONFIG_SCSI_MVSAS_DEBUG=y
# CONFIG_SCSI_MVSAS_TASKLET is not setCONFIG_SCSI_MVUMI=m
# CONFIG_SCSI_DPT_I2O is not setCONFIG_SCSI_ADVANSYS=mCONFIG_SCSI_ARCMSR=yCONFIG_SCSI_ESAS2R=yCONFIG_MEGARAID_NEWGEN=y
# CONFIG_MEGARAID_MM is not set
# CONFIG_MEGARAID_LEGACY is not setCONFIG_MEGARAID_SAS=yCONFIG_SCSI_MPT2SAS=yCONFIG_SCSI_MPT2SAS_MAX_SGE=128CONFIG_SCSI_MPT2SAS_LOGGING=y
# CONFIG_SCSI_UFSHCD is not setCONFIG_SCSI_HPTIOP=mCONFIG_SCSI_BUSLOGIC=mCONFIG_SCSI_FLASHPOINT=y
# CONFIG_VMWARE_PVSCSI is not set
# CONFIG_SCSI_SNIC is not setCONFIG_SCSI_DMX3191D=y
# CONFIG_SCSI_EATA is not setCONFIG_SCSI_FUTURE_DOMAIN=yCONFIG_SCSI_GDTH=yCONFIG_SCSI_ISCI=y
# CONFIG_SCSI_IPS is not setCONFIG_SCSI_INITIO=yCONFIG_SCSI_INIA100=y
# CONFIG_SCSI_STEX is not set
# CONFIG_SCSI_SYM53C8XX_2 is not setCONFIG_SCSI_QLOGIC_1280=y
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_AM53C974 is not setCONFIG_SCSI_WD719X=m
# CONFIG_SCSI_PMCRAID is not set
# CONFIG_SCSI_PM8001 is not setCONFIG_SCSI_VIRTIO=mCONFIG_SCSI_LOWLEVEL_PCMCIA=y
# CONFIG_PCMCIA_AHA152X is not setCONFIG_PCMCIA_FDOMAIN=m
# CONFIG_PCMCIA_QLOGIC is not set
# CONFIG_PCMCIA_SYM53C500 is not set
# CONFIG_SCSI_DH is not set
# CONFIG_SCSI_OSD_INITIATOR is not setCONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not set
# CONFIG_ATA_VERBOSE_ERROR is not setCONFIG_SATA_PMP=y
#
# Controllers with non-SFF native interface
#CONFIG_SATA_AHCI=yCONFIG_SATA_AHCI_PLATFORM=m
# CONFIG_SATA_INIC162X is not setCONFIG_SATA_ACARD_AHCI=mCONFIG_SATA_SIL24=yCONFIG_ATA_SFF=y
#
# SFF controllers with custom DMA interface
#
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not setCONFIG_SATA_SX4=mCONFIG_ATA_BMDMA=y
#
# SATA SFF controllers with BMDMA
#CONFIG_ATA_PIIX=yCONFIG_SATA_HIGHBANK=mCONFIG_SATA_MV=yCONFIG_SATA_NV=yCONFIG_SATA_PROMISE=yCONFIG_SATA_RCAR=m
# CONFIG_SATA_SIL is not setCONFIG_SATA_SIS=y
# CONFIG_SATA_SVW is not setCONFIG_SATA_ULI=m
# CONFIG_SATA_VIA is not setCONFIG_SATA_VITESSE=m
#
# PATA SFF controllers with BMDMA
#CONFIG_PATA_ALI=mCONFIG_PATA_AMD=yCONFIG_PATA_ARASAN_CF=yCONFIG_PATA_ARTOP=mCONFIG_PATA_ATIIXP=y
# CONFIG_PATA_ATP867X is not setCONFIG_PATA_CMD64X=mCONFIG_PATA_CS5520=mCONFIG_PATA_CS5530=mCONFIG_PATA_CS5536=mCONFIG_PATA_CYPRESS=y
# CONFIG_PATA_EFAR is not setCONFIG_PATA_HPT366=yCONFIG_PATA_HPT37X=yCONFIG_PATA_HPT3X2N=m
# CONFIG_PATA_HPT3X3 is not setCONFIG_PATA_IT8213=y
# CONFIG_PATA_IT821X is not setCONFIG_PATA_JMICRON=yCONFIG_PATA_MARVELL=mCONFIG_PATA_NETCELL=yCONFIG_PATA_NINJA32=yCONFIG_PATA_NS87415=yCONFIG_PATA_OLDPIIX=y
# CONFIG_PATA_OPTIDMA is not setCONFIG_PATA_PDC2027X=yCONFIG_PATA_PDC_OLD=y
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RDC is not setCONFIG_PATA_SC1200=mCONFIG_PATA_SCH=y
# CONFIG_PATA_SERVERWORKS is not setCONFIG_PATA_SIL680=mCONFIG_PATA_SIS=yCONFIG_PATA_TOSHIBA=mCONFIG_PATA_TRIFLEX=m
# CONFIG_PATA_VIA is not setCONFIG_PATA_WINBOND=y
#
# PIO-only SFF controllers
#CONFIG_PATA_CMD640_PCI=mCONFIG_PATA_MPIIX=y
# CONFIG_PATA_NS87410 is not setCONFIG_PATA_OPTI=yCONFIG_PATA_PCMCIA=y
# CONFIG_PATA_PLATFORM is not setCONFIG_PATA_RZ1000=y
#
# Generic fallback / legacy drivers
#
# CONFIG_ATA_GENERIC is not setCONFIG_PATA_LEGACY=mCONFIG_MD=y
# CONFIG_BLK_DEV_MD is not setCONFIG_BCACHE=m
# CONFIG_BCACHE_DEBUG is not set
# CONFIG_BCACHE_CLOSURES_DEBUG is not set
# CONFIG_BLK_DEV_DM is not setCONFIG_TARGET_CORE=y
# CONFIG_TCM_IBLOCK is not set
# CONFIG_TCM_FILEIO is not set
# CONFIG_TCM_PSCSI is not set
# CONFIG_TCM_USER2 is not set
# CONFIG_LOOPBACK_TARGET is not setCONFIG_ISCSI_TARGET=mCONFIG_FUSION=yCONFIG_FUSION_SPI=yCONFIG_FUSION_SAS=yCONFIG_FUSION_MAX_SGE=128
# CONFIG_FUSION_CTL is not setCONFIG_FUSION_LOGGING=y
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# CONFIG_FIREWIRE_NOSY is not set
# CONFIG_MACINTOSH_DRIVERS is not setCONFIG_NETDEVICES=yCONFIG_MII=yCONFIG_NET_CORE=y
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_NET_FC is not set
# CONFIG_NET_TEAM is not setCONFIG_MACVLAN=yCONFIG_MACVTAP=yCONFIG_VXLAN=mCONFIG_GENEVE=yCONFIG_NETCONSOLE=y
# CONFIG_NETCONSOLE_DYNAMIC is not setCONFIG_NETPOLL=yCONFIG_NET_POLL_CONTROLLER=yCONFIG_RIONET=yCONFIG_RIONET_TX_SIZE=128CONFIG_RIONET_RX_SIZE=128CONFIG_TUN=mCONFIG_TUN_VNET_CROSS_LE=y
# CONFIG_VETH is not setCONFIG_VIRTIO_NET=yCONFIG_NLMON=mCONFIG_ARCNET=yCONFIG_ARCNET_1201=yCONFIG_ARCNET_1051=mCONFIG_ARCNET_RAW=m
# CONFIG_ARCNET_CAP is not set
CONFIG_ARCNET_COM90xx=m
CONFIG_ARCNET_COM90xxIO=yCONFIG_ARCNET_RIM_I=m
# CONFIG_ARCNET_COM20020 is not setCONFIG_ATM_DRIVERS=yCONFIG_ATM_DUMMY=mCONFIG_ATM_TCP=m
# CONFIG_ATM_LANAI is not set
# CONFIG_ATM_ENI is not setCONFIG_ATM_FIRESTREAM=mCONFIG_ATM_ZATM=m
# CONFIG_ATM_ZATM_DEBUG is not setCONFIG_ATM_NICSTAR=mCONFIG_ATM_NICSTAR_USE_SUNI=y
# CONFIG_ATM_NICSTAR_USE_IDT77105 is not setCONFIG_ATM_IDT77252=mCONFIG_ATM_IDT77252_DEBUG=y
# CONFIG_ATM_IDT77252_RCV_ALL is not setCONFIG_ATM_IDT77252_USE_SUNI=y
# CONFIG_ATM_AMBASSADOR is not set
# CONFIG_ATM_HORIZON is not set
# CONFIG_ATM_IA is not setCONFIG_ATM_FORE200E=mCONFIG_ATM_FORE200E_USE_TASKLET=yCONFIG_ATM_FORE200E_TX_RETRY=16CONFIG_ATM_FORE200E_DEBUG=0CONFIG_ATM_HE=mCONFIG_ATM_HE_USE_SUNI=yCONFIG_ATM_SOLOS=m
#
# CAIF transport drivers
#CONFIG_CAIF_TTY=m
# CONFIG_CAIF_SPI_SLAVE is not setCONFIG_CAIF_HSI=m
# CONFIG_CAIF_VIRTIO is not set
# CONFIG_VHOST_NET is not setCONFIG_VHOST_SCSI=mCONFIG_VHOST_RING=mCONFIG_VHOST=mCONFIG_VHOST_CROSS_ENDIAN_LEGACY=y
#
# Distributed Switch Architecture drivers
#
# CONFIG_NET_DSA_MV88E6XXX is not set
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not setCONFIG_ETHERNET=yCONFIG_MDIO=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set
# CONFIG_NET_VENDOR_AGERE is not set
# CONFIG_NET_VENDOR_ALTEON is not setCONFIG_ALTERA_TSE=yCONFIG_NET_VENDOR_AMD=yCONFIG_AMD8111_ETH=m
# CONFIG_PCNET32 is not setCONFIG_PCMCIA_NMCLAN=m
# CONFIG_NET_XGENE is not set
# CONFIG_NET_VENDOR_ARC is not set
# CONFIG_NET_VENDOR_ATHEROS is not setCONFIG_NET_CADENCE=yCONFIG_MACB=mCONFIG_NET_VENDOR_BROADCOM=yCONFIG_B44=mCONFIG_B44_PCI_AUTOSELECT=yCONFIG_B44_PCICORE_AUTOSELECT=yCONFIG_B44_PCI=yCONFIG_BCMGENET=mCONFIG_BNX2=yCONFIG_CNIC=yCONFIG_TIGON3=yCONFIG_BNX2X=yCONFIG_BNX2X_SRIOV=y
# CONFIG_NET_VENDOR_BROCADE is not setCONFIG_NET_CALXEDA_XGMAC=y
# CONFIG_NET_VENDOR_CAVIUM is not setCONFIG_NET_VENDOR_CHELSIO=yCONFIG_CHELSIO_T1=m
# CONFIG_CHELSIO_T1_1G is not setCONFIG_CHELSIO_T3=yCONFIG_CHELSIO_T4=yCONFIG_CHELSIO_T4_DCB=yCONFIG_CHELSIO_T4VF=yCONFIG_NET_VENDOR_CISCO=y
# CONFIG_ENIC is not setCONFIG_CX_ECAT=mCONFIG_DNET=mCONFIG_NET_VENDOR_DEC=yCONFIG_NET_TULIP=yCONFIG_DE2104X=yCONFIG_DE2104X_DSL=0
# CONFIG_TULIP is not setCONFIG_DE4X5=y
# CONFIG_WINBOND_840 is not setCONFIG_DM9102=mCONFIG_ULI526X=m
# CONFIG_PCMCIA_XIRCOM is not set
# CONFIG_NET_VENDOR_DLINK is not setCONFIG_NET_VENDOR_EMULEX=yCONFIG_BE2NET=yCONFIG_BE2NET_HWMON=yCONFIG_NET_VENDOR_EZCHIP=yCONFIG_NET_VENDOR_EXAR=yCONFIG_S2IO=yCONFIG_VXGE=yCONFIG_VXGE_DEBUG_TRACE_ALL=yCONFIG_NET_VENDOR_FUJITSU=y
# CONFIG_PCMCIA_FMVJ18X is not set
# CONFIG_NET_VENDOR_HP is not setCONFIG_NET_VENDOR_INTEL=yCONFIG_E100=yCONFIG_E1000=mCONFIG_E1000E=yCONFIG_IGB=m
# CONFIG_IGB_HWMON is not set
# CONFIG_IGBVF is not set
# CONFIG_IXGB is not set
# CONFIG_IXGBE is not set
# CONFIG_I40E is not set
# CONFIG_NET_VENDOR_I825XX is not setCONFIG_IP1000=mCONFIG_JME=m
# CONFIG_NET_VENDOR_MARVELL is not set
# CONFIG_NET_VENDOR_MELLANOX is not set
# CONFIG_NET_VENDOR_MICREL is not setCONFIG_NET_VENDOR_MICROCHIP=yCONFIG_ENC28J60=y
# CONFIG_ENC28J60_WRITEVERIFY is not setCONFIG_NET_VENDOR_MYRI=y
# CONFIG_MYRI10GE is not set
# CONFIG_FEALNX is not setCONFIG_NET_VENDOR_NATSEMI=yCONFIG_NATSEMI=y
# CONFIG_NS83820 is not setCONFIG_NET_VENDOR_8390=yCONFIG_PCMCIA_AXNET=yCONFIG_NE2K_PCI=y
# CONFIG_PCMCIA_PCNET is not setCONFIG_NET_VENDOR_NVIDIA=yCONFIG_FORCEDETH=y
# CONFIG_NET_VENDOR_OKI is not set
# CONFIG_ETHOC is not setCONFIG_NET_PACKET_ENGINE=yCONFIG_HAMACHI=mCONFIG_YELLOWFIN=yCONFIG_NET_VENDOR_QLOGIC=yCONFIG_QLA3XXX=y
# CONFIG_QLCNIC is not setCONFIG_QLGE=mCONFIG_NETXEN_NIC=yCONFIG_NET_VENDOR_QUALCOMM=y
# CONFIG_NET_VENDOR_REALTEK is not set
# CONFIG_NET_VENDOR_RENESAS is not setCONFIG_NET_VENDOR_RDC=y
# CONFIG_R6040 is not setCONFIG_NET_VENDOR_ROCKER=y
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SILAN is not setCONFIG_NET_VENDOR_SIS=yCONFIG_SIS900=mCONFIG_SIS190=mCONFIG_SFC=y
# CONFIG_SFC_MCDI_MON is not setCONFIG_SFC_SRIOV=y
# CONFIG_SFC_MCDI_LOGGING is not setCONFIG_NET_VENDOR_SMSC=yCONFIG_PCMCIA_SMC91C92=mCONFIG_EPIC100=yCONFIG_SMSC911X=m
# CONFIG_SMSC911X_ARCH_HOOKS is not setCONFIG_SMSC9420=yCONFIG_NET_VENDOR_STMICRO=y
# CONFIG_STMMAC_ETH is not set
# CONFIG_NET_VENDOR_SUN is not set
# CONFIG_NET_VENDOR_TEHUTI is not setCONFIG_NET_VENDOR_TI=y
# CONFIG_TI_CPSW_ALE is not setCONFIG_TLAN=y
# CONFIG_NET_VENDOR_VIA is not setCONFIG_NET_VENDOR_WIZNET=yCONFIG_WIZNET_W5100=yCONFIG_WIZNET_W5300=m
# CONFIG_WIZNET_BUS_DIRECT is not set
# CONFIG_WIZNET_BUS_INDIRECT is not setCONFIG_WIZNET_BUS_ANY=y
# CONFIG_NET_VENDOR_XIRCOM is not setCONFIG_FDDI=mCONFIG_DEFXX=m
# CONFIG_DEFXX_MMIO is not setCONFIG_SKFP=m
# CONFIG_HIPPI is not setCONFIG_PHYLIB=y
#
# MII PHY device drivers
#CONFIG_AT803X_PHY=yCONFIG_AMD_PHY=mCONFIG_MARVELL_PHY=yCONFIG_DAVICOM_PHY=mCONFIG_QSEMI_PHY=y
# CONFIG_LXT_PHY is not setCONFIG_CICADA_PHY=yCONFIG_VITESSE_PHY=mCONFIG_SMSC_PHY=yCONFIG_BROADCOM_PHY=yCONFIG_BCM7XXX_PHY=m
# CONFIG_BCM87XX_PHY is not set
# CONFIG_ICPLUS_PHY is not set
# CONFIG_REALTEK_PHY is not set
# CONFIG_NATIONAL_PHY is not setCONFIG_STE10XP=m
# CONFIG_LSI_ET1011C_PHY is not set
# CONFIG_MICREL_PHY is not set
# CONFIG_DP83867_PHY is not setCONFIG_FIXED_PHY=mCONFIG_MDIO_BITBANG=mCONFIG_MDIO_GPIO=mCONFIG_MDIO_BCM_UNIMAC=mCONFIG_MICREL_KS8995MA=mCONFIG_PPP=yCONFIG_PPP_BSDCOMP=yCONFIG_PPP_DEFLATE=yCONFIG_PPP_FILTER=yCONFIG_PPP_MPPE=yCONFIG_PPP_MULTILINK=y
# CONFIG_PPPOATM is not set
# CONFIG_PPPOE is not setCONFIG_PPTP=m
# CONFIG_PPP_ASYNC is not setCONFIG_PPP_SYNC_TTY=mCONFIG_SLIP=yCONFIG_SLHC=yCONFIG_SLIP_COMPRESSED=yCONFIG_SLIP_SMART=y
# CONFIG_SLIP_MODE_SLIP6 is not setCONFIG_USB_NET_DRIVERS=mCONFIG_USB_CATC=m
# CONFIG_USB_KAWETH is not setCONFIG_USB_PEGASUS=mCONFIG_USB_RTL8150=m
# CONFIG_USB_RTL8152 is not setCONFIG_USB_USBNET=mCONFIG_USB_NET_AX8817X=mCONFIG_USB_NET_AX88179_178A=mCONFIG_USB_NET_CDCETHER=m
# CONFIG_USB_NET_CDC_EEM is not setCONFIG_USB_NET_CDC_NCM=mCONFIG_USB_NET_HUAWEI_CDC_NCM=mCONFIG_USB_NET_CDC_MBIM=m
# CONFIG_USB_NET_DM9601 is not setCONFIG_USB_NET_SR9700=mCONFIG_USB_NET_SR9800=mCONFIG_USB_NET_SMSC75XX=m
# CONFIG_USB_NET_SMSC95XX is not setCONFIG_USB_NET_GL620A=mCONFIG_USB_NET_NET1080=mCONFIG_USB_NET_PLUSB=mCONFIG_USB_NET_MCS7830=m
# CONFIG_USB_NET_RNDIS_HOST is not setCONFIG_USB_NET_CDC_SUBSET=m
# CONFIG_USB_ALI_M5632 is not set
# CONFIG_USB_AN2720 is not set
# CONFIG_USB_BELKIN is not set
# CONFIG_USB_ARMLINUX is not set
# CONFIG_USB_EPSON2888 is not setCONFIG_USB_KC2190=yCONFIG_USB_NET_ZAURUS=mCONFIG_USB_NET_CX82310_ETH=m
# CONFIG_USB_NET_KALMIA is not set
# CONFIG_USB_NET_QMI_WWAN is not setCONFIG_USB_HSO=m
# CONFIG_USB_NET_INT51X1 is not setCONFIG_USB_CDC_PHONET=m
# CONFIG_USB_IPHETH is not set
# CONFIG_USB_SIERRA_NET is not setCONFIG_USB_VL600=m
# CONFIG_WLAN is not set
#
# Enable WiMAX (Networking options) to see the WiMAX drivers #CONFIG_WAN=y
# CONFIG_HDLC is not setCONFIG_DLCI=yCONFIG_DLCI_MAX=8
# CONFIG_SBNI is not set
# CONFIG_IEEE802154_DRIVERS is not set CONFIG_VMXNET3=y
#
# Input device support
#CONFIG_INPUT=yCONFIG_INPUT_LEDS=mCONFIG_INPUT_FF_MEMLESS=yCONFIG_INPUT_POLLDEV=y
# CONFIG_INPUT_SPARSEKMAP is not setCONFIG_INPUT_MATRIXKMAP=y
#
# Userland interfaces
#CONFIG_INPUT_MOUSEDEV=yCONFIG_INPUT_MOUSEDEV_PSAUX=yCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not setCONFIG_INPUT_EVDEV=m
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not setCONFIG_KEYBOARD_ADP5589=mCONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT1070 is not setCONFIG_KEYBOARD_QT2160=m
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not setCONFIG_KEYBOARD_TCA6416=yCONFIG_KEYBOARD_TCA8418=yCONFIG_KEYBOARD_MATRIX=yCONFIG_KEYBOARD_LM8323=yCONFIG_KEYBOARD_LM8333=yCONFIG_KEYBOARD_MAX7359=y
# CONFIG_KEYBOARD_MCS is not set
# CONFIG_KEYBOARD_MPR121 is not setCONFIG_KEYBOARD_NEWTON=yCONFIG_KEYBOARD_OPENCORES=mCONFIG_KEYBOARD_STOWAWAY=yCONFIG_KEYBOARD_ST_KEYSCAN=yCONFIG_KEYBOARD_SUNKBD=yCONFIG_KEYBOARD_SH_KEYSC=mCONFIG_KEYBOARD_XTKBD=yCONFIG_INPUT_MOUSE=yCONFIG_MOUSE_PS2=mCONFIG_MOUSE_PS2_ALPS=y
# CONFIG_MOUSE_PS2_LOGIPS2PP is not setCONFIG_MOUSE_PS2_SYNAPTICS=yCONFIG_MOUSE_PS2_CYPRESS=y
# CONFIG_MOUSE_PS2_TRACKPOINT is not set
# CONFIG_MOUSE_PS2_ELANTECH is not setCONFIG_MOUSE_PS2_SENTELIC=yCONFIG_MOUSE_PS2_TOUCHKIT=yCONFIG_MOUSE_PS2_FOCALTECH=y
# CONFIG_MOUSE_SERIAL is not setCONFIG_MOUSE_APPLETOUCH=m
# CONFIG_MOUSE_BCM5974 is not set
# CONFIG_MOUSE_CYAPA is not setCONFIG_MOUSE_ELAN_I2C=y
# CONFIG_MOUSE_ELAN_I2C_I2C is not setCONFIG_MOUSE_ELAN_I2C_SMBUS=yCONFIG_MOUSE_VSXXXAA=mCONFIG_MOUSE_GPIO=y
# CONFIG_MOUSE_SYNAPTICS_I2C is not setCONFIG_MOUSE_SYNAPTICS_USB=yCONFIG_INPUT_TABLET=yCONFIG_TABLET_USB_ACECAD=mCONFIG_TABLET_USB_AIPTEK=m
# CONFIG_TABLET_USB_GTCO is not set
# CONFIG_TABLET_USB_HANWANG is not setCONFIG_TABLET_USB_KBTAB=m
# CONFIG_TABLET_SERIAL_WACOM4 is not set
# CONFIG_INPUT_TOUCHSCREEN is not setCONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_BMA150 is not setCONFIG_INPUT_E3X0_BUTTON=m
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MAX77693_HAPTIC is not setCONFIG_INPUT_MAX77843_HAPTIC=yCONFIG_INPUT_MAX8997_HAPTIC=m
# CONFIG_INPUT_MC13783_PWRBUTTON is not set
# CONFIG_INPUT_MMA8450 is not setCONFIG_INPUT_MPU3050=mCONFIG_INPUT_APANEL=yCONFIG_INPUT_GP2A=mCONFIG_INPUT_GPIO_BEEPER=y
# CONFIG_INPUT_GPIO_TILT_POLLED is not setCONFIG_INPUT_ATI_REMOTE2=mCONFIG_INPUT_KEYSPAN_REMOTE=m
# CONFIG_INPUT_KXTJ9 is not setCONFIG_INPUT_POWERMATE=mCONFIG_INPUT_YEALINK=y
# CONFIG_INPUT_CM109 is not set
# CONFIG_INPUT_REGULATOR_HAPTIC is not setCONFIG_INPUT_RETU_PWRBUTTON=mCONFIG_INPUT_AXP20X_PEK=yCONFIG_INPUT_TWL6040_VIBRA=mCONFIG_INPUT_UINPUT=mCONFIG_INPUT_PALMAS_PWRBUTTON=yCONFIG_INPUT_PCF50633_PMU=m
# CONFIG_INPUT_PCF8574 is not setCONFIG_INPUT_PWM_BEEPER=yCONFIG_INPUT_GPIO_ROTARY_ENCODER=yCONFIG_INPUT_DA9052_ONKEY=m
# CONFIG_INPUT_DA9055_ONKEY is not set
# CONFIG_INPUT_ADXL34X is not setCONFIG_INPUT_IMS_PCU=mCONFIG_INPUT_CMA3000=mCONFIG_INPUT_CMA3000_I2C=m
# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not setCONFIG_INPUT_DRV260X_HAPTICS=mCONFIG_INPUT_DRV2665_HAPTICS=yCONFIG_INPUT_DRV2667_HAPTICS=m
#
# Hardware I/O ports
#CONFIG_SERIO=yCONFIG_ARCH_MIGHT_HAVE_PC_SERIO=yCONFIG_SERIO_I8042=yCONFIG_SERIO_SERPORT=yCONFIG_SERIO_CT82C710=yCONFIG_SERIO_PCIPS2=yCONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not setCONFIG_SERIO_ALTERA_PS2=mCONFIG_SERIO_PS2MULT=yCONFIG_SERIO_ARC_PS2=y
# CONFIG_SERIO_OLPC_APSP is not set
# CONFIG_SERIO_SUN4I_PS2 is not set
#
# Character devices
#CONFIG_TTY=yCONFIG_VT=y
# CONFIG_CONSOLE_TRANSLATIONS is not setCONFIG_VT_CONSOLE=yCONFIG_VT_CONSOLE_SLEEP=yCONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not setCONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not setCONFIG_LEGACY_PTYS=yCONFIG_LEGACY_PTY_COUNT=256
# CONFIG_SERIAL_NONSTANDARD is not setCONFIG_NOZOMI=m
# CONFIG_N_GSM is not set
# CONFIG_TRACE_SINK is not set
# CONFIG_DEVMEM is not setCONFIG_DEVKMEM=y
#
# Serial drivers
#CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_CONSOLE=y
# CONFIG_SERIAL_8250_DMA is not set CONFIG_SERIAL_8250_PCI=m
# CONFIG_SERIAL_8250_CS is not set CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y
# CONFIG_SERIAL_8250_SHARE_IRQ is not set CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_DW=y
#
# Non-8250 serial port support
#
# CONFIG_SERIAL_CLPS711X is not setCONFIG_SERIAL_MAX3100=mCONFIG_SERIAL_MAX310X=mCONFIG_SERIAL_UARTLITE=yCONFIG_SERIAL_UARTLITE_CONSOLE=yCONFIG_SERIAL_SH_SCI=mCONFIG_SERIAL_SH_SCI_NR_UARTS=2
# CONFIG_SERIAL_SH_SCI_DMA is not setCONFIG_SERIAL_CORE=yCONFIG_SERIAL_CORE_CONSOLE=yCONFIG_SERIAL_JSM=y
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SC16IS7XX is not setCONFIG_SERIAL_TIMBERDALE=yCONFIG_SERIAL_BCM63XX=yCONFIG_SERIAL_BCM63XX_CONSOLE=y
# CONFIG_SERIAL_ALTERA_JTAGUART is not setCONFIG_SERIAL_ALTERA_UART=mCONFIG_SERIAL_ALTERA_UART_MAXPORTS=4CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200CONFIG_SERIAL_IFX6X60=yCONFIG_SERIAL_PCH_UART=yCONFIG_SERIAL_PCH_UART_CONSOLE=y
# CONFIG_SERIAL_ARC is not setCONFIG_SERIAL_RP2=mCONFIG_SERIAL_RP2_NR_UARTS=32
# CONFIG_SERIAL_FSL_LPUART is not setCONFIG_SERIAL_ST_ASC=mCONFIG_SERIAL_MEN_Z135=mCONFIG_SERIAL_STM32=y
# CONFIG_SERIAL_STM32_CONSOLE is not set
# CONFIG_TTY_PRINTK is not set
# CONFIG_VIRTIO_CONSOLE is not set
# CONFIG_IPMI_HANDLER is not set
# CONFIG_HW_RANDOM is not setCONFIG_NVRAM=mCONFIG_R3964=mCONFIG_APPLICOM=m
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not setCONFIG_CARDMAN_4000=y
# CONFIG_CARDMAN_4040 is not set
# CONFIG_IPWIRELESS is not setCONFIG_MWAVE=y
# CONFIG_RAW_DRIVER is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not setCONFIG_DEVPORT=yCONFIG_XILLYBUS=y
#
# I2C support
#CONFIG_I2C=yCONFIG_I2C_BOARDINFO=y
# CONFIG_I2C_COMPAT is not setCONFIG_I2C_CHARDEV=yCONFIG_I2C_MUX=y
#
# Multiplexer I2C Chip support
#CONFIG_I2C_MUX_GPIO=m
# CONFIG_I2C_MUX_PCA9541 is not set
# CONFIG_I2C_MUX_PCA954x is not setCONFIG_I2C_HELPER_AUTO=yCONFIG_I2C_SMBUS=yCONFIG_I2C_ALGOBIT=yCONFIG_I2C_ALGOPCA=y
#
# I2C Hardware Bus support
#
#
# PC SMBus host controller drivers
#CONFIG_I2C_ALI1535=yCONFIG_I2C_ALI1563=yCONFIG_I2C_ALI15X3=mCONFIG_I2C_AMD756=y
# CONFIG_I2C_AMD756_S4882 is not setCONFIG_I2C_AMD8111=m
# CONFIG_I2C_HIX5HD2 is not setCONFIG_I2C_I801=y
# CONFIG_I2C_ISCH is not setCONFIG_I2C_ISMT=mCONFIG_I2C_PIIX4=m
# CONFIG_I2C_NFORCE2 is not setCONFIG_I2C_SIS5595=yCONFIG_I2C_SIS630=mCONFIG_I2C_SIS96X=yCONFIG_I2C_VIA=yCONFIG_I2C_VIAPRO=y
#
# I2C system bus drivers (mostly embedded / system-on-chip) #CONFIG_I2C_AXXIA=mCONFIG_I2C_BCM_IPROC=mCONFIG_I2C_BRCMSTB=yCONFIG_I2C_CBUS_GPIO=m CONFIG_I2C_DESIGNWARE_CORE=y CONFIG_I2C_DESIGNWARE_PLATFORM=y
# CONFIG_I2C_DESIGNWARE_PCI is not set
# CONFIG_I2C_EFM32 is not setCONFIG_I2C_EG20T=yCONFIG_I2C_GPIO=yCONFIG_I2C_IMG=yCONFIG_I2C_JZ4780=y
# CONFIG_I2C_KEMPLD is not setCONFIG_I2C_MT65XX=yCONFIG_I2C_OCORES=yCONFIG_I2C_PCA_PLATFORM=y
# CONFIG_I2C_PXA_PCI is not setCONFIG_I2C_RIIC=mCONFIG_I2C_SH_MOBILE=mCONFIG_I2C_SIMTEC=yCONFIG_I2C_XILINX=m
# CONFIG_I2C_XLP9XX is not setCONFIG_I2C_RCAR=m
#
# External I2C/SMBus adapter drivers
#
# CONFIG_I2C_DIOLAN_U2C is not setCONFIG_I2C_DLN2=mCONFIG_I2C_PARPORT_LIGHT=y
# CONFIG_I2C_ROBOTFUZZ_OSIF is not setCONFIG_I2C_TAOS_EVM=mCONFIG_I2C_TINY_USB=yCONFIG_I2C_VIPERBOARD=m
#
# Other I2C/SMBus bus drivers
#
# CONFIG_I2C_STUB is not setCONFIG_I2C_SLAVE=yCONFIG_I2C_SLAVE_EEPROM=yCONFIG_I2C_DEBUG_CORE=y
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not setCONFIG_SPI=yCONFIG_SPI_DEBUG=yCONFIG_SPI_MASTER=y
#
# SPI Master Controller Drivers
#
# CONFIG_SPI_ALTERA is not set
# CONFIG_SPI_ATMEL is not setCONFIG_SPI_BCM2835=m
# CONFIG_SPI_BCM63XX_HSSPI is not setCONFIG_SPI_BITBANG=yCONFIG_SPI_CADENCE=yCONFIG_SPI_CLPS711X=mCONFIG_SPI_DLN2=mCONFIG_SPI_EP93XX=m
# CONFIG_SPI_GPIO is not setCONFIG_SPI_IMG_SPFI=y
# CONFIG_SPI_IMX is not setCONFIG_SPI_FSL_DSPI=yCONFIG_SPI_MESON_SPIFC=yCONFIG_SPI_OC_TINY=yCONFIG_SPI_TI_QSPI=yCONFIG_SPI_OMAP_100K=m
# CONFIG_SPI_ORION is not set
# CONFIG_SPI_PXA2XX is not set
# CONFIG_SPI_PXA2XX_PCI is not setCONFIG_SPI_RSPI=m
# CONFIG_SPI_SC18IS602 is not setCONFIG_SPI_SH=m
# CONFIG_SPI_SH_HSPI is not set
# CONFIG_SPI_SUN4I is not set
# CONFIG_SPI_TOPCLIFF_PCH is not setCONFIG_SPI_TXX9=mCONFIG_SPI_XCOMM=y
# CONFIG_SPI_XILINX is not setCONFIG_SPI_XTENSA_XTFPGA=m
# CONFIG_SPI_ZYNQMP_GQSPI is not setCONFIG_SPI_DESIGNWARE=mCONFIG_SPI_DW_PCI=m
# CONFIG_SPI_DW_MID_DMA is not setCONFIG_SPI_DW_MMIO=m
#
# SPI Protocol Masters
#CONFIG_SPI_SPIDEV=mCONFIG_SPI_TLE62X0=y
# CONFIG_SPMI is not setCONFIG_HSI=mCONFIG_HSI_BOARDINFO=y
#
# HSI controllers
#
#
# HSI clients
#CONFIG_HSI_CHAR=m
#
# PPS support
#CONFIG_PPS=y
#
# PPS clients support
#CONFIG_PPS_CLIENT_KTIMER=m
# CONFIG_PPS_CLIENT_LDISC is not setCONFIG_PPS_CLIENT_GPIO=m
#
# PPS generators support
#
#
# PTP clock support
#CONFIG_PTP_1588_CLOCK=y
#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. #
# CONFIG_PTP_1588_CLOCK_PCH is not set CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=yCONFIG_GPIOLIB=yCONFIG_GPIO_DEVRES=yCONFIG_GPIOLIB_IRQCHIP=yCONFIG_DEBUG_GPIO=y
# CONFIG_GPIO_SYSFS is not setCONFIG_GPIO_GENERIC=yCONFIG_GPIO_MAX730X=y
#
# Memory mapped GPIO drivers
#CONFIG_GPIO_CLPS711X=yCONFIG_GPIO_DWAPB=mCONFIG_GPIO_F7188X=m
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_ICH is not setCONFIG_GPIO_IT8761E=yCONFIG_GPIO_SCH=m
# CONFIG_GPIO_SCH311X is not setCONFIG_GPIO_TS5500=m
# CONFIG_GPIO_VX855 is not set
#
# I2C GPIO expanders
#
# CONFIG_GPIO_ADP5588 is not set
# CONFIG_GPIO_MAX7300 is not set
# CONFIG_GPIO_MAX732X is not setCONFIG_GPIO_PCA953X=mCONFIG_GPIO_PCF857X=m
# CONFIG_GPIO_SX150X is not set
#
# MFD GPIO expanders
#CONFIG_GPIO_ARIZONA=yCONFIG_GPIO_CRYSTAL_COVE=m
# CONFIG_GPIO_DA9052 is not setCONFIG_GPIO_DA9055=mCONFIG_GPIO_DLN2=mCONFIG_GPIO_JANZ_TTL=mCONFIG_GPIO_KEMPLD=mCONFIG_GPIO_LP3943=mCONFIG_GPIO_PALMAS=y
# CONFIG_GPIO_RC5T583 is not setCONFIG_GPIO_TIMBERDALE=y
# CONFIG_GPIO_TPS6586X is not setCONFIG_GPIO_TPS65912=y
# CONFIG_GPIO_TWL6040 is not set
#
# PCI GPIO expanders
#CONFIG_GPIO_AMD8111=y
# CONFIG_GPIO_INTEL_MID is not setCONFIG_GPIO_ML_IOH=mCONFIG_GPIO_PCH=mCONFIG_GPIO_RDC321X=y
#
# SPI GPIO expanders
#CONFIG_GPIO_MAX7301=yCONFIG_GPIO_MCP23S08=mCONFIG_GPIO_MC33880=m
#
# USB GPIO expanders
#CONFIG_GPIO_VIPERBOARD=mCONFIG_W1=y
# CONFIG_W1_CON is not set
#
# 1-wire Bus Masters
#
# CONFIG_W1_MASTER_MATROX is not setCONFIG_W1_MASTER_DS2490=mCONFIG_W1_MASTER_DS2482=yCONFIG_W1_MASTER_MXC=y
# CONFIG_W1_MASTER_DS1WM is not setCONFIG_W1_MASTER_GPIO=y
#
# 1-wire Slaves
#
# CONFIG_W1_SLAVE_THERM is not setCONFIG_W1_SLAVE_SMEM=y
# CONFIG_W1_SLAVE_DS2408 is not setCONFIG_W1_SLAVE_DS2413=mCONFIG_W1_SLAVE_DS2406=mCONFIG_W1_SLAVE_DS2423=y
# CONFIG_W1_SLAVE_DS2431 is not set
# CONFIG_W1_SLAVE_DS2433 is not setCONFIG_W1_SLAVE_DS2760=mCONFIG_W1_SLAVE_DS2780=yCONFIG_W1_SLAVE_DS2781=y
# CONFIG_W1_SLAVE_DS28E04 is not setCONFIG_W1_SLAVE_BQ27000=yCONFIG_POWER_SUPPLY=yCONFIG_POWER_SUPPLY_DEBUG=y
# CONFIG_PDA_POWER is not setCONFIG_GENERIC_ADC_BATTERY=mCONFIG_TEST_POWER=mCONFIG_BATTERY_DS2760=mCONFIG_BATTERY_DS2780=yCONFIG_BATTERY_DS2781=yCONFIG_BATTERY_DS2782=yCONFIG_BATTERY_SBS=y
CONFIG_BATTERY_BQ27x00=y
# CONFIG_BATTERY_BQ27X00_I2C is not set
# CONFIG_BATTERY_BQ27X00_PLATFORM is not setCONFIG_BATTERY_DA9030=m
# CONFIG_BATTERY_DA9052 is not setCONFIG_CHARGER_DA9150=m
# CONFIG_AXP288_FUEL_GAUGE is not setCONFIG_BATTERY_MAX17040=mCONFIG_BATTERY_MAX17042=mCONFIG_CHARGER_PCF50633=m
# CONFIG_CHARGER_ISP1704 is not setCONFIG_CHARGER_MAX8903=mCONFIG_CHARGER_LP8727=y
# CONFIG_CHARGER_LP8788 is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_MANAGER is not set
# CONFIG_CHARGER_MAX14577 is not setCONFIG_CHARGER_MAX77693=mCONFIG_CHARGER_BQ2415X=mCONFIG_CHARGER_BQ24190=m
# CONFIG_CHARGER_BQ24257 is not set
# CONFIG_CHARGER_BQ24735 is not setCONFIG_CHARGER_BQ25890=yCONFIG_CHARGER_SMB347=yCONFIG_BATTERY_GAUGE_LTC2941=mCONFIG_BATTERY_GOLDFISH=m
# CONFIG_BATTERY_RT5033 is not setCONFIG_CHARGER_RT9455=y
# CONFIG_POWER_RESET is not set
# CONFIG_POWER_AVS is not setCONFIG_HWMON=yCONFIG_HWMON_VID=y
# CONFIG_HWMON_DEBUG_CHIP is not set
#
# Native drivers
#
# CONFIG_SENSORS_AD7314 is not set
# CONFIG_SENSORS_AD7414 is not set
# CONFIG_SENSORS_AD7418 is not set CONFIG_SENSORS_ADM1021=y
# CONFIG_SENSORS_ADM1025 is not set CONFIG_SENSORS_ADM1026=y
# CONFIG_SENSORS_ADM1029 is not set CONFIG_SENSORS_ADM1031=m
# CONFIG_SENSORS_ADM9240 is not set CONFIG_SENSORS_ADT7X10=y CONFIG_SENSORS_ADT7310=y CONFIG_SENSORS_ADT7410=y CONFIG_SENSORS_ADT7411=m CONFIG_SENSORS_ADT7462=m
# CONFIG_SENSORS_ADT7470 is not set CONFIG_SENSORS_ADT7475=m CONFIG_SENSORS_ASC7621=y CONFIG_SENSORS_K8TEMP=y CONFIG_SENSORS_K10TEMP=m CONFIG_SENSORS_FAM15H_POWER=m CONFIG_SENSORS_APPLESMC=y CONFIG_SENSORS_ASB100=y CONFIG_SENSORS_ATXP1=m CONFIG_SENSORS_DS620=m CONFIG_SENSORS_DS1621=y CONFIG_SENSORS_DELL_SMM=m CONFIG_SENSORS_DA9052_ADC=m CONFIG_SENSORS_DA9055=y
# CONFIG_SENSORS_I5K_AMB is not set CONFIG_SENSORS_F71805F=y
# CONFIG_SENSORS_F71882FG is not set
# CONFIG_SENSORS_F75375S is not set
# CONFIG_SENSORS_MC13783_ADC is not set CONFIG_SENSORS_FSCHMD=m
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_G760A is not set CONFIG_SENSORS_G762=m CONFIG_SENSORS_GPIO_FAN=y CONFIG_SENSORS_HIH6130=y CONFIG_SENSORS_IIO_HWMON=y
# CONFIG_SENSORS_I5500 is not set CONFIG_SENSORS_CORETEMP=m
# CONFIG_SENSORS_IT87 is not set CONFIG_SENSORS_JC42=m CONFIG_SENSORS_POWR1220=m CONFIG_SENSORS_LINEAGE=y
# CONFIG_SENSORS_LTC2945 is not set
# CONFIG_SENSORS_LTC4151 is not set CONFIG_SENSORS_LTC4215=y CONFIG_SENSORS_LTC4222=y CONFIG_SENSORS_LTC4245=m CONFIG_SENSORS_LTC4260=y CONFIG_SENSORS_LTC4261=y CONFIG_SENSORS_MAX1111=m
# CONFIG_SENSORS_MAX16065 is not set
# CONFIG_SENSORS_MAX1619 is not set CONFIG_SENSORS_MAX1668=y CONFIG_SENSORS_MAX197=y CONFIG_SENSORS_MAX6639=y
# CONFIG_SENSORS_MAX6642 is not set
# CONFIG_SENSORS_MAX6650 is not set CONFIG_SENSORS_MAX6697=y
# CONFIG_SENSORS_HTU21 is not set CONFIG_SENSORS_MCP3021=m
# CONFIG_SENSORS_ADCXX is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM70 is not set
# CONFIG_SENSORS_LM73 is not set
# CONFIG_SENSORS_LM75 is not set CONFIG_SENSORS_LM77=m CONFIG_SENSORS_LM78=y CONFIG_SENSORS_LM80=y CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM85=y CONFIG_SENSORS_LM87=y CONFIG_SENSORS_LM95234=y
# CONFIG_SENSORS_LM95241 is not set CONFIG_SENSORS_LM95245=y CONFIG_SENSORS_PC87360=y CONFIG_SENSORS_PC87427=y CONFIG_SENSORS_NTC_THERMISTOR=y CONFIG_SENSORS_NCT6683=m CONFIG_SENSORS_NCT6775=y
# CONFIG_SENSORS_NCT7802 is not set CONFIG_SENSORS_NCT7904=m
# CONFIG_SENSORS_PCF8591 is not set CONFIG_PMBUS=y
# CONFIG_SENSORS_PMBUS is not set CONFIG_SENSORS_ADM1275=y CONFIG_SENSORS_LM25066=m CONFIG_SENSORS_LTC2978=y CONFIG_SENSORS_LTC2978_REGULATOR=y CONFIG_SENSORS_MAX16064=m CONFIG_SENSORS_MAX34440=m
# CONFIG_SENSORS_MAX8688 is not set CONFIG_SENSORS_TPS40422=m CONFIG_SENSORS_UCD9000=m CONFIG_SENSORS_UCD9200=m
# CONFIG_SENSORS_ZL6100 is not set CONFIG_SENSORS_PWM_FAN=m CONFIG_SENSORS_SHT15=m
# CONFIG_SENSORS_SHT21 is not set CONFIG_SENSORS_SHTC1=y CONFIG_SENSORS_SIS5595=m
# CONFIG_SENSORS_DME1737 is not set CONFIG_SENSORS_EMC1403=y
# CONFIG_SENSORS_EMC2103 is not set
# CONFIG_SENSORS_EMC6W201 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not set CONFIG_SENSORS_SMSC47B397=y
# CONFIG_SENSORS_SCH56XX_COMMON is not set CONFIG_SENSORS_SMM665=m
# CONFIG_SENSORS_ADC128D818 is not set CONFIG_SENSORS_ADS1015=m CONFIG_SENSORS_ADS7828=m CONFIG_SENSORS_ADS7871=m CONFIG_SENSORS_AMC6821=m
# CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=y
# CONFIG_SENSORS_TC74 is not set
# CONFIG_SENSORS_THMC50 is not set CONFIG_SENSORS_TMP102=m
# CONFIG_SENSORS_TMP103 is not set CONFIG_SENSORS_TMP401=y CONFIG_SENSORS_TMP421=m
# CONFIG_SENSORS_VIA_CPUTEMP is not set CONFIG_SENSORS_VIA686A=y CONFIG_SENSORS_VT1211=m CONFIG_SENSORS_VT8231=m CONFIG_SENSORS_W83781D=y CONFIG_SENSORS_W83791D=m CONFIG_SENSORS_W83792D=y
# CONFIG_SENSORS_W83793 is not set CONFIG_SENSORS_W83795=y
# CONFIG_SENSORS_W83795_FANCTRL is not set # CONFIG_SENSORS_W83L785TS is not set CONFIG_SENSORS_W83L786NG=m CONFIG_SENSORS_W83627HF=m CONFIG_SENSORS_W83627EHF=m CONFIG_THERMAL=y
# CONFIG_THERMAL_HWMON is not set
# CONFIG_THERMAL_WRITABLE_TRIPS is not set # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y
# CONFIG_THERMAL_GOV_BANG_BANG is not set CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
# CONFIG_THERMAL_EMULATION is not set CONFIG_RCAR_THERMAL=m
# CONFIG_INTEL_SOC_DTS_THERMAL is not set
#
# Texas Instruments thermal drivers
#CONFIG_SSB_POSSIBLE=y
#
# Sonics Silicon Backplane
#CONFIG_SSB=yCONFIG_SSB_SPROM=yCONFIG_SSB_PCIHOST_POSSIBLE=yCONFIG_SSB_PCIHOST=y
# CONFIG_SSB_B43_PCI_BRIDGE is not setCONFIG_SSB_PCMCIAHOST_POSSIBLE=yCONFIG_SSB_PCMCIAHOST=yCONFIG_SSB_SILENT=yCONFIG_SSB_DRIVER_PCICORE_POSSIBLE=yCONFIG_SSB_DRIVER_PCICORE=yCONFIG_SSB_DRIVER_GPIO=yCONFIG_BCMA_POSSIBLE=y
#
# Broadcom specific AMBA
#CONFIG_BCMA=yCONFIG_BCMA_HOST_PCI_POSSIBLE=yCONFIG_BCMA_HOST_PCI=y
# CONFIG_BCMA_HOST_SOC is not setCONFIG_BCMA_DRIVER_PCI=y
# CONFIG_BCMA_DRIVER_GMAC_CMN is not setCONFIG_BCMA_DRIVER_GPIO=yCONFIG_BCMA_DEBUG=y
#
# Multifunction device drivers
#CONFIG_MFD_CORE=y
# CONFIG_MFD_CS5535 is not setCONFIG_MFD_AS3711=y
# CONFIG_PMIC_ADP5520 is not setCONFIG_MFD_AAT2870_CORE=yCONFIG_MFD_BCM590XX=yCONFIG_MFD_AXP20X=y
# CONFIG_MFD_CROS_EC is not setCONFIG_PMIC_DA903X=yCONFIG_PMIC_DA9052=yCONFIG_MFD_DA9052_SPI=yCONFIG_MFD_DA9052_I2C=yCONFIG_MFD_DA9055=y
# CONFIG_MFD_DA9063 is not setCONFIG_MFD_DA9150=yCONFIG_MFD_DLN2=mCONFIG_MFD_MC13XXX=yCONFIG_MFD_MC13XXX_SPI=yCONFIG_MFD_MC13XXX_I2C=y
# CONFIG_HTC_PASIC3 is not set
# CONFIG_HTC_I2CPLD is not setCONFIG_LPC_ICH=yCONFIG_LPC_SCH=mCONFIG_INTEL_SOC_PMIC=yCONFIG_MFD_JANZ_CMODIO=mCONFIG_MFD_KEMPLD=m
# CONFIG_MFD_88PM800 is not setCONFIG_MFD_88PM805=y
# CONFIG_MFD_88PM860X is not setCONFIG_MFD_MAX14577=yCONFIG_MFD_MAX77693=yCONFIG_MFD_MAX77843=yCONFIG_MFD_MAX8907=m
# CONFIG_MFD_MAX8925 is not setCONFIG_MFD_MAX8997=yCONFIG_MFD_MAX8998=yCONFIG_MFD_MT6397=y
# CONFIG_MFD_MENF21BMC is not set
# CONFIG_EZX_PCAP is not setCONFIG_MFD_VIPERBOARD=mCONFIG_MFD_RETU=mCONFIG_MFD_PCF50633=mCONFIG_PCF50633_ADC=mCONFIG_PCF50633_GPIO=mCONFIG_MFD_RDC321X=yCONFIG_MFD_RTSX_PCI=mCONFIG_MFD_RT5033=yCONFIG_MFD_RTSX_USB=yCONFIG_MFD_RC5T583=yCONFIG_MFD_RN5T618=mCONFIG_MFD_SEC_CORE=yCONFIG_MFD_SI476X_CORE=yCONFIG_MFD_SM501=mCONFIG_MFD_SM501_GPIO=yCONFIG_MFD_SKY81452=y
# CONFIG_MFD_SMSC is not setCONFIG_ABX500_CORE=y
# CONFIG_AB3100_CORE is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_TI_AM335X_TSCADC is not setCONFIG_MFD_LP3943=mCONFIG_MFD_LP8788=yCONFIG_MFD_PALMAS=yCONFIG_TPS6105X=mCONFIG_TPS6507X=y
# CONFIG_MFD_TPS65090 is not setCONFIG_MFD_TPS65217=m
# CONFIG_MFD_TPS65218 is not setCONFIG_MFD_TPS6586X=y
# CONFIG_MFD_TPS65910 is not setCONFIG_MFD_TPS65912=y
# CONFIG_MFD_TPS65912_I2C is not setCONFIG_MFD_TPS65912_SPI=y
# CONFIG_MFD_TPS80031 is not set
# CONFIG_TWL4030_CORE is not setCONFIG_TWL6040_CORE=yCONFIG_MFD_WL1273_CORE=yCONFIG_MFD_LM3533=mCONFIG_MFD_TIMBERDALE=y
# CONFIG_MFD_TMIO is not setCONFIG_MFD_VX855=mCONFIG_MFD_ARIZONA=yCONFIG_MFD_ARIZONA_I2C=mCONFIG_MFD_ARIZONA_SPI=m
# CONFIG_MFD_WM5102 is not set
# CONFIG_MFD_WM5110 is not setCONFIG_MFD_WM8997=y
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM831X_SPI is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not setCONFIG_REGULATOR=yCONFIG_REGULATOR_DEBUG=yCONFIG_REGULATOR_FIXED_VOLTAGE=mCONFIG_REGULATOR_VIRTUAL_CONSUMER=mCONFIG_REGULATOR_USERSPACE_CONSUMER=y
# CONFIG_REGULATOR_ACT8865 is not set
# CONFIG_REGULATOR_AD5398 is not setCONFIG_REGULATOR_AAT2870=mCONFIG_REGULATOR_AS3711=y
# CONFIG_REGULATOR_AXP20X is not set
# CONFIG_REGULATOR_BCM590XX is not set
# CONFIG_REGULATOR_DA903X is not setCONFIG_REGULATOR_DA9052=m
# CONFIG_REGULATOR_DA9055 is not set
# CONFIG_REGULATOR_DA9210 is not setCONFIG_REGULATOR_DA9211=yCONFIG_REGULATOR_FAN53555=mCONFIG_REGULATOR_GPIO=m
# CONFIG_REGULATOR_ISL9305 is not setCONFIG_REGULATOR_ISL6271A=m
# CONFIG_REGULATOR_LP3971 is not setCONFIG_REGULATOR_LP3972=yCONFIG_REGULATOR_LP872X=m
# CONFIG_REGULATOR_LP8755 is not set
# CONFIG_REGULATOR_LP8788 is not setCONFIG_REGULATOR_LTC3589=mCONFIG_REGULATOR_MAX14577=mCONFIG_REGULATOR_MAX1586=y
# CONFIG_REGULATOR_MAX8649 is not setCONFIG_REGULATOR_MAX8660=yCONFIG_REGULATOR_MAX8907=mCONFIG_REGULATOR_MAX8952=mCONFIG_REGULATOR_MAX8973=y
# CONFIG_REGULATOR_MAX8997 is not set
# CONFIG_REGULATOR_MAX8998 is not setCONFIG_REGULATOR_MAX77693=yCONFIG_REGULATOR_MAX77843=yCONFIG_REGULATOR_MC13XXX_CORE=yCONFIG_REGULATOR_MC13783=y
# CONFIG_REGULATOR_MC13892 is not setCONFIG_REGULATOR_MT6397=y
# CONFIG_REGULATOR_PALMAS is not set
# CONFIG_REGULATOR_PCF50633 is not setCONFIG_REGULATOR_PFUZE100=mCONFIG_REGULATOR_PWM=mCONFIG_REGULATOR_QCOM_SPMI=mCONFIG_REGULATOR_RC5T583=m
# CONFIG_REGULATOR_RN5T618 is not setCONFIG_REGULATOR_RT5033=m
# CONFIG_REGULATOR_S2MPA01 is not setCONFIG_REGULATOR_S2MPS11=yCONFIG_REGULATOR_S5M8767=mCONFIG_REGULATOR_SKY81452=yCONFIG_REGULATOR_TPS51632=yCONFIG_REGULATOR_TPS6105X=mCONFIG_REGULATOR_TPS62360=mCONFIG_REGULATOR_TPS65023=m
# CONFIG_REGULATOR_TPS6507X is not setCONFIG_REGULATOR_TPS65217=m
# CONFIG_REGULATOR_TPS6524X is not set
# CONFIG_REGULATOR_TPS6586X is not set
# CONFIG_REGULATOR_TPS65912 is not setCONFIG_MEDIA_SUPPORT=y
#
# Multimedia core support
#CONFIG_MEDIA_CAMERA_SUPPORT=yCONFIG_MEDIA_ANALOG_TV_SUPPORT=y
# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not setCONFIG_MEDIA_RADIO_SUPPORT=y
# CONFIG_MEDIA_SDR_SUPPORT is not setCONFIG_MEDIA_RC_SUPPORT=y
# CONFIG_MEDIA_CONTROLLER is not setCONFIG_VIDEO_DEV=yCONFIG_VIDEO_V4L2=y
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_FIXED_MINOR_RANGES is not setCONFIG_VIDEO_PCI_SKELETON=yCONFIG_VIDEO_TUNER=yCONFIG_V4L2_MEM2MEM_DEV=yCONFIG_VIDEOBUF_GEN=yCONFIG_VIDEOBUF_DMA_SG=mCONFIG_VIDEOBUF_DMA_CONTIG=yCONFIG_VIDEOBUF2_CORE=yCONFIG_VIDEOBUF2_MEMOPS=yCONFIG_VIDEOBUF2_DMA_CONTIG=yCONFIG_VIDEOBUF2_VMALLOC=yCONFIG_VIDEOBUF2_DMA_SG=y
# CONFIG_TTPCI_EEPROM is not set
#
# Media drivers
#CONFIG_RC_CORE=y
# CONFIG_RC_MAP is not set
# CONFIG_RC_DECODERS is not setCONFIG_RC_DEVICES=yCONFIG_RC_ATI_REMOTE=mCONFIG_IR_HIX5HD2=mCONFIG_IR_IMON=mCONFIG_IR_MCEUSB=mCONFIG_IR_MESON=yCONFIG_IR_REDRAT3=mCONFIG_IR_STREAMZAP=mCONFIG_IR_IGORPLUGUSB=yCONFIG_IR_IGUANA=yCONFIG_IR_TTUSBIR=m
# CONFIG_IR_IMG is not set
# CONFIG_RC_LOOPBACK is not set
# CONFIG_IR_GPIO_CIR is not setCONFIG_RC_ST=mCONFIG_IR_SUNXI=mCONFIG_MEDIA_USB_SUPPORT=y
#
# Webcam devices
#
# CONFIG_USB_VIDEO_CLASS is not setCONFIG_USB_GSPCA=mCONFIG_USB_M5602=mCONFIG_USB_STV06XX=m
# CONFIG_USB_GL860 is not setCONFIG_USB_GSPCA_BENQ=mCONFIG_USB_GSPCA_CONEX=mCONFIG_USB_GSPCA_CPIA1=mCONFIG_USB_GSPCA_DTCS033=mCONFIG_USB_GSPCA_ETOMS=mCONFIG_USB_GSPCA_FINEPIX=mCONFIG_USB_GSPCA_JEILINJ=mCONFIG_USB_GSPCA_JL2005BCD=mCONFIG_USB_GSPCA_KINECT=m
# CONFIG_USB_GSPCA_KONICA is not set
# CONFIG_USB_GSPCA_MARS is not setCONFIG_USB_GSPCA_MR97310A=mCONFIG_USB_GSPCA_NW80X=mCONFIG_USB_GSPCA_OV519=m
# CONFIG_USB_GSPCA_OV534 is not setCONFIG_USB_GSPCA_OV534_9=m
# CONFIG_USB_GSPCA_PAC207 is not setCONFIG_USB_GSPCA_PAC7302=mCONFIG_USB_GSPCA_PAC7311=m
# CONFIG_USB_GSPCA_SE401 is not setCONFIG_USB_GSPCA_SN9C2028=mCONFIG_USB_GSPCA_SN9C20X=m
# CONFIG_USB_GSPCA_SONIXB is not setCONFIG_USB_GSPCA_SONIXJ=m
# CONFIG_USB_GSPCA_SPCA500 is not setCONFIG_USB_GSPCA_SPCA501=mCONFIG_USB_GSPCA_SPCA505=mCONFIG_USB_GSPCA_SPCA506=mCONFIG_USB_GSPCA_SPCA508=mCONFIG_USB_GSPCA_SPCA561=mCONFIG_USB_GSPCA_SPCA1528=m
# CONFIG_USB_GSPCA_SQ905 is not setCONFIG_USB_GSPCA_SQ905C=mCONFIG_USB_GSPCA_SQ930X=mCONFIG_USB_GSPCA_STK014=mCONFIG_USB_GSPCA_STK1135=mCONFIG_USB_GSPCA_STV0680=mCONFIG_USB_GSPCA_SUNPLUS=m
# CONFIG_USB_GSPCA_T613 is not setCONFIG_USB_GSPCA_TOPRO=m
# CONFIG_USB_GSPCA_TOUPTEK is not set
# CONFIG_USB_GSPCA_TV8532 is not set
# CONFIG_USB_GSPCA_VC032X is not setCONFIG_USB_GSPCA_VICAM=mCONFIG_USB_GSPCA_XIRLINK_CIT=mCONFIG_USB_GSPCA_ZC3XX=mCONFIG_USB_PWC=mCONFIG_USB_PWC_DEBUG=y
# CONFIG_USB_PWC_INPUT_EVDEV is not setCONFIG_VIDEO_CPIA2=y
# CONFIG_USB_ZR364XX is not set
# CONFIG_USB_STKWEBCAM is not set
# CONFIG_USB_S2255 is not set
#
# Analog TV USB devices
#
# CONFIG_VIDEO_PVRUSB2 is not setCONFIG_VIDEO_HDPVR=yCONFIG_VIDEO_USBVISION=yCONFIG_VIDEO_STK1160_COMMON=yCONFIG_VIDEO_STK1160=y
#
# Analog/digital TV USB devices
#
# CONFIG_VIDEO_CX231XX is not set
# CONFIG_VIDEO_TM6000 is not set
#
# Webcam, TV (analog/digital) USB devices
#CONFIG_VIDEO_EM28XX=mCONFIG_VIDEO_EM28XX_V4L2=mCONFIG_VIDEO_EM28XX_RC=mCONFIG_MEDIA_PCI_SUPPORT=y
#
# Media capture support
#
#
# Media capture/analog TV support
#
# CONFIG_VIDEO_IVTV is not setCONFIG_VIDEO_ZORAN=mCONFIG_VIDEO_ZORAN_DC30=mCONFIG_VIDEO_ZORAN_ZR36060=mCONFIG_VIDEO_ZORAN_BUZ=mCONFIG_VIDEO_ZORAN_DC10=mCONFIG_VIDEO_ZORAN_LML33=mCONFIG_VIDEO_ZORAN_LML33R10=mCONFIG_VIDEO_ZORAN_AVS6EYES=mCONFIG_VIDEO_HEXIUM_GEMINI=mCONFIG_VIDEO_HEXIUM_ORION=m
# CONFIG_VIDEO_MXB is not setCONFIG_VIDEO_TW68=m
# CONFIG_VIDEO_DT3155 is not set
#
# Media capture/analog/hybrid TV support
#CONFIG_VIDEO_CX25821=m
# CONFIG_VIDEO_CX88 is not setCONFIG_VIDEO_BT848=mCONFIG_VIDEO_SAA7134=yCONFIG_VIDEO_SAA7134_RC=yCONFIG_V4L_PLATFORM_DRIVERS=yCONFIG_VIDEO_CAFE_CCIC=mCONFIG_VIDEO_VIA_CAMERA=m
# CONFIG_VIDEO_DAVINCI_VPIF_DISPLAY is not set
# CONFIG_VIDEO_DAVINCI_VPIF_CAPTURE is not setCONFIG_VIDEO_DM6446_CCDC=y
# CONFIG_VIDEO_DM355_CCDC is not setCONFIG_VIDEO_SH_VOU=mCONFIG_VIDEO_M32R_AR=mCONFIG_SOC_CAMERA=mCONFIG_SOC_CAMERA_PLATFORM=m
# CONFIG_VIDEO_RCAR_VIN is not setCONFIG_VIDEO_MX2=m
# CONFIG_VIDEO_ATMEL_ISI is not setCONFIG_VIDEO_SAMSUNG_S5P_TV=y
# CONFIG_VIDEO_SAMSUNG_S5P_HDMI is not set
# CONFIG_VIDEO_SAMSUNG_S5P_HDMIPHY is not setCONFIG_VIDEO_SAMSUNG_S5P_SII9234=yCONFIG_VIDEO_SAMSUNG_S5P_SDO=y
# CONFIG_VIDEO_SAMSUNG_S5P_MIXER is not setCONFIG_V4L_MEM2MEM_DRIVERS=yCONFIG_VIDEO_MEM2MEM_DEINTERLACE=mCONFIG_VIDEO_SAMSUNG_S5P_G2D=m
# CONFIG_VIDEO_SAMSUNG_S5P_JPEG is not setCONFIG_VIDEO_SAMSUNG_S5P_MFC=m
# CONFIG_VIDEO_MX2_EMMAPRP is not setCONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=yCONFIG_VIDEO_STI_BDISP=yCONFIG_VIDEO_SH_VEU=y
# CONFIG_VIDEO_TI_VPE is not set
# CONFIG_V4L_TEST_DRIVERS is not set
#
# Supported MMC/SDIO adapters
#CONFIG_RADIO_ADAPTERS=yCONFIG_RADIO_TEA575X=yCONFIG_RADIO_SI470X=y
# CONFIG_USB_SI470X is not set
# CONFIG_I2C_SI470X is not set
# CONFIG_RADIO_SI4713 is not setCONFIG_USB_MR800=mCONFIG_USB_DSBR=yCONFIG_RADIO_MAXIRADIO=yCONFIG_RADIO_SHARK=yCONFIG_RADIO_SHARK2=m
# CONFIG_USB_KEENE is not setCONFIG_USB_RAREMONO=m
# CONFIG_USB_MA901 is not setCONFIG_RADIO_TEA5764=mCONFIG_RADIO_SAA7706H=m
# CONFIG_RADIO_TEF6862 is not set
# CONFIG_RADIO_TIMBERDALE is not setCONFIG_RADIO_WL1273=y
#
# Texas Instruments WL128x FM driver (ST based)
#CONFIG_VIDEO_TVEEPROM=yCONFIG_CYPRESS_FIRMWARE=mCONFIG_VIDEO_SAA7146=mCONFIG_VIDEO_SAA7146_VV=m
#
# Media ancillary drivers (tuners, sensors, i2c, frontends) #
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set CONFIG_MEDIA_ATTACH=yCONFIG_VIDEO_IR_I2C=y
#
# Encoders, decoders, sensors and other helper chips #
#
# Audio decoders, processors and mixers
#CONFIG_VIDEO_TVAUDIO=mCONFIG_VIDEO_TDA7432=y
# CONFIG_VIDEO_TDA9840 is not setCONFIG_VIDEO_TEA6415C=mCONFIG_VIDEO_TEA6420=m
# CONFIG_VIDEO_MSP3400 is not setCONFIG_VIDEO_CS5345=yCONFIG_VIDEO_CS53L32A=yCONFIG_VIDEO_TLV320AIC23B=m
# CONFIG_VIDEO_UDA1342 is not set
# CONFIG_VIDEO_WM8775 is not setCONFIG_VIDEO_WM8739=m
# CONFIG_VIDEO_VP27SMPX is not set
# CONFIG_VIDEO_SONY_BTF_MPX is not set
#
# RDS decoders
#CONFIG_VIDEO_SAA6588=m
#
# Video decoders
#
# CONFIG_VIDEO_ADV7183 is not set
# CONFIG_VIDEO_BT819 is not setCONFIG_VIDEO_BT856=yCONFIG_VIDEO_BT866=y
# CONFIG_VIDEO_KS0127 is not setCONFIG_VIDEO_ML86V7667=yCONFIG_VIDEO_SAA7110=mCONFIG_VIDEO_SAA711X=yCONFIG_VIDEO_TVP514X=y
# CONFIG_VIDEO_TVP5150 is not setCONFIG_VIDEO_TVP7002=y
# CONFIG_VIDEO_TW2804 is not set
# CONFIG_VIDEO_TW9903 is not setCONFIG_VIDEO_TW9906=yCONFIG_VIDEO_VPX3220=m
#
# Video and audio decoders
#
# CONFIG_VIDEO_SAA717X is not setCONFIG_VIDEO_CX25840=y
#
# Video encoders
#CONFIG_VIDEO_SAA7127=m
# CONFIG_VIDEO_SAA7185 is not setCONFIG_VIDEO_ADV7170=mCONFIG_VIDEO_ADV7175=yCONFIG_VIDEO_ADV7343=y
# CONFIG_VIDEO_ADV7393 is not set
# CONFIG_VIDEO_AK881X is not setCONFIG_VIDEO_THS8200=m
#
# Camera sensor devices
#CONFIG_VIDEO_OV2659=m
# CONFIG_VIDEO_OV7640 is not setCONFIG_VIDEO_OV7670=m
# CONFIG_VIDEO_VS6624 is not setCONFIG_VIDEO_MT9V011=y
# CONFIG_VIDEO_SR030PC30 is not set
#
# Flash devices
#
#
# Video improvement chips
#
# CONFIG_VIDEO_UPD64031A is not set
# CONFIG_VIDEO_UPD64083 is not set
#
# Audio/Video compression chips
#CONFIG_VIDEO_SAA6752HS=y
#
# Miscellaneous helper chips
#CONFIG_VIDEO_THS7303=y
# CONFIG_VIDEO_M52790 is not set
#
# Sensors used on soc_camera driver
#
#
# soc_camera sensor drivers # # CONFIG_SOC_CAMERA_IMX074 is not set # CONFIG_SOC_CAMERA_MT9M001 is not set CONFIG_SOC_CAMERA_MT9M111=m # CONFIG_SOC_CAMERA_MT9T031 is not set # CONFIG_SOC_CAMERA_MT9T112 is not set # CONFIG_SOC_CAMERA_MT9V022 is not set CONFIG_SOC_CAMERA_OV2640=m # CONFIG_SOC_CAMERA_OV5642 is not set CONFIG_SOC_CAMERA_OV6650=m # CONFIG_SOC_CAMERA_OV772X is not set CONFIG_SOC_CAMERA_OV9640=m # CONFIG_SOC_CAMERA_OV9740 is not set # CONFIG_SOC_CAMERA_RJ54N1 is not set # CONFIG_SOC_CAMERA_TW9910 is not set CONFIG_MEDIA_TUNER=y
#
# Customize TV tuners
#
# CONFIG_MEDIA_TUNER_SIMPLE is not set
# CONFIG_MEDIA_TUNER_TDA8290 is not setCONFIG_MEDIA_TUNER_TDA827X=m
# CONFIG_MEDIA_TUNER_TDA18271 is not setCONFIG_MEDIA_TUNER_TDA9887=yCONFIG_MEDIA_TUNER_TEA5761=yCONFIG_MEDIA_TUNER_TEA5767=y
# CONFIG_MEDIA_TUNER_MSI001 is not set
# CONFIG_MEDIA_TUNER_MT20XX is not setCONFIG_MEDIA_TUNER_MT2060=m
# CONFIG_MEDIA_TUNER_MT2063 is not setCONFIG_MEDIA_TUNER_MT2266=yCONFIG_MEDIA_TUNER_MT2131=mCONFIG_MEDIA_TUNER_QT1010=mCONFIG_MEDIA_TUNER_XC2028=yCONFIG_MEDIA_TUNER_XC5000=yCONFIG_MEDIA_TUNER_XC4000=yCONFIG_MEDIA_TUNER_MXL5005S=mCONFIG_MEDIA_TUNER_MXL5007T=mCONFIG_MEDIA_TUNER_MC44S803=yCONFIG_MEDIA_TUNER_MAX2165=mCONFIG_MEDIA_TUNER_TDA18218=mCONFIG_MEDIA_TUNER_FC0011=mCONFIG_MEDIA_TUNER_FC0012=m
# CONFIG_MEDIA_TUNER_FC0013 is not set
# CONFIG_MEDIA_TUNER_TDA18212 is not set
# CONFIG_MEDIA_TUNER_E4000 is not setCONFIG_MEDIA_TUNER_FC2580=yCONFIG_MEDIA_TUNER_M88RS6000T=mCONFIG_MEDIA_TUNER_TUA9001=y
# CONFIG_MEDIA_TUNER_SI2157 is not setCONFIG_MEDIA_TUNER_IT913X=yCONFIG_MEDIA_TUNER_R820T=m
# CONFIG_MEDIA_TUNER_MXL301RF is not set
# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set
#
# Customise DVB Frontends
#
# CONFIG_DVB_AU8522_V4L is not setCONFIG_DVB_TUNER_DIB0070=yCONFIG_DVB_TUNER_DIB0090=y
#
# Tools to develop new frontends
#CONFIG_DVB_DUMMY_FE=y
#
# Graphics support
#CONFIG_AGP=yCONFIG_AGP_AMD64=y
# CONFIG_AGP_INTEL is not setCONFIG_AGP_SIS=yCONFIG_AGP_VIA=mCONFIG_VGA_ARB=yCONFIG_VGA_ARB_MAX_GPUS=16
#
# Direct Rendering Manager
#
# CONFIG_DRM is not set
#
# Frame buffer Devices
#CONFIG_FB=mCONFIG_FIRMWARE_EDID=yCONFIG_FB_CMDLINE=yCONFIG_FB_DDC=m
# CONFIG_FB_BOOT_VESA_SUPPORT is not setCONFIG_FB_CFB_FILLRECT=mCONFIG_FB_CFB_COPYAREA=mCONFIG_FB_CFB_IMAGEBLIT=m
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not setCONFIG_FB_SYS_FILLRECT=mCONFIG_FB_SYS_COPYAREA=mCONFIG_FB_SYS_IMAGEBLIT=m
# CONFIG_FB_FOREIGN_ENDIAN is not setCONFIG_FB_SYS_FOPS=mCONFIG_FB_DEFERRED_IO=y
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not setCONFIG_FB_MODE_HELPERS=yCONFIG_FB_TILEBLITTING=y
#
# Frame buffer hardware drivers
#CONFIG_FB_PM2=mCONFIG_FB_PM2_FIFO_DISCONNECT=yCONFIG_FB_CLPS711X=mCONFIG_FB_CYBER2000=m
# CONFIG_FB_CYBER2000_DDC is not setCONFIG_FB_ARC=m
# CONFIG_FB_UVESA is not set
# CONFIG_FB_N411 is not set
# CONFIG_FB_HGA is not set
# CONFIG_FB_OPENCORES is not set
# CONFIG_FB_S1D13XXX is not setCONFIG_FB_NVIDIA=m
# CONFIG_FB_NVIDIA_I2C is not setCONFIG_FB_NVIDIA_DEBUG=y
# CONFIG_FB_NVIDIA_BACKLIGHT is not setCONFIG_FB_RIVA=m
# CONFIG_FB_RIVA_I2C is not setCONFIG_FB_RIVA_DEBUG=y
# CONFIG_FB_RIVA_BACKLIGHT is not setCONFIG_FB_I740=mCONFIG_FB_LE80578=m
# CONFIG_FB_CARILLO_RANCH is not setCONFIG_FB_MATROX=mCONFIG_FB_MATROX_MILLENIUM=yCONFIG_FB_MATROX_MYSTIQUE=yCONFIG_FB_MATROX_G=yCONFIG_FB_MATROX_I2C=m
# CONFIG_FB_MATROX_MAVEN is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not setCONFIG_FB_SAVAGE=m
# CONFIG_FB_SAVAGE_I2C is not setCONFIG_FB_SAVAGE_ACCEL=y
# CONFIG_FB_SIS is not setCONFIG_FB_VIA=m
# CONFIG_FB_VIA_DIRECT_PROCFS is not setCONFIG_FB_VIA_X_COMPATIBILITY=y
# CONFIG_FB_NEOMAGIC is not setCONFIG_FB_KYRO=mCONFIG_FB_3DFX=mCONFIG_FB_3DFX_ACCEL=yCONFIG_FB_3DFX_I2C=yCONFIG_FB_VOODOO1=m
# CONFIG_FB_VT8623 is not setCONFIG_FB_TRIDENT=m
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not setCONFIG_FB_CARMINE=m
# CONFIG_FB_CARMINE_DRAM_EVAL is not setCONFIG_CARMINE_DRAM_CUSTOM=y
# CONFIG_FB_GEODE is not set
# CONFIG_FB_TMIO is not setCONFIG_FB_SM501=mCONFIG_FB_SMSCUFX=m
# CONFIG_FB_UDL is not setCONFIG_FB_GOLDFISH=mCONFIG_FB_METRONOME=mCONFIG_FB_MB862XX=mCONFIG_FB_MB862XX_PCI_GDC=yCONFIG_FB_MB862XX_I2C=y
# CONFIG_FB_BROADSHEET is not setCONFIG_FB_AUO_K190X=mCONFIG_FB_AUO_K1900=m
# CONFIG_FB_AUO_K1901 is not setCONFIG_BACKLIGHT_LCD_SUPPORT=yCONFIG_LCD_CLASS_DEVICE=mCONFIG_LCD_L4F00242T03=mCONFIG_LCD_LMS283GF05=mCONFIG_LCD_LTV350QV=mCONFIG_LCD_ILI922X=mCONFIG_LCD_ILI9320=mCONFIG_LCD_TDO24M=mCONFIG_LCD_VGG2432A4=mCONFIG_LCD_PLATFORM=mCONFIG_LCD_S6E63M0=mCONFIG_LCD_LD9040=mCONFIG_LCD_AMS369FG06=mCONFIG_LCD_LMS501KF03=mCONFIG_LCD_HX8357=mCONFIG_BACKLIGHT_CLASS_DEVICE=yCONFIG_BACKLIGHT_GENERIC=mCONFIG_BACKLIGHT_LM3533=mCONFIG_BACKLIGHT_CARILLO_RANCH=mCONFIG_BACKLIGHT_PWM=y
# CONFIG_BACKLIGHT_DA903X is not setCONFIG_BACKLIGHT_DA9052=yCONFIG_BACKLIGHT_SAHARA=mCONFIG_BACKLIGHT_ADP8860=yCONFIG_BACKLIGHT_ADP8870=m
# CONFIG_BACKLIGHT_PCF50633 is not setCONFIG_BACKLIGHT_AAT2870=yCONFIG_BACKLIGHT_LM3630A=y
# CONFIG_BACKLIGHT_LM3639 is not setCONFIG_BACKLIGHT_LP855X=m
# CONFIG_BACKLIGHT_LP8788 is not setCONFIG_BACKLIGHT_SKY81452=y
# CONFIG_BACKLIGHT_TPS65217 is not setCONFIG_BACKLIGHT_AS3711=mCONFIG_BACKLIGHT_GPIO=mCONFIG_BACKLIGHT_LV5207LP=mCONFIG_BACKLIGHT_BD6107=yCONFIG_VGASTATE=mCONFIG_VIDEOMODE_HELPERS=y
#
# Console display driver support
#CONFIG_VGA_CONSOLE=yCONFIG_VGACON_SOFT_SCROLLBACK=yCONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64CONFIG_DUMMY_CONSOLE=yCONFIG_DUMMY_CONSOLE_COLUMNS=80CONFIG_DUMMY_CONSOLE_ROWS=25
# CONFIG_FRAMEBUFFER_CONSOLE is not setCONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not setCONFIG_LOGO_LINUX_VGA16=yCONFIG_LOGO_LINUX_CLUT224=y
# CONFIG_SOUND is not set
#
# HID support
#CONFIG_HID=y
# CONFIG_HID_BATTERY_STRENGTH is not set
# CONFIG_HIDRAW is not setCONFIG_UHID=mCONFIG_HID_GENERIC=y
#
# Special HID drivers
#
# CONFIG_HID_A4TECH is not setCONFIG_HID_ACRUX=mCONFIG_HID_ACRUX_FF=y
# CONFIG_HID_APPLE is not setCONFIG_HID_APPLEIR=mCONFIG_HID_AUREAL=mCONFIG_HID_BELKIN=mCONFIG_HID_BETOP_FF=mCONFIG_HID_CHERRY=mCONFIG_HID_CHICONY=mCONFIG_HID_CP2112=mCONFIG_HID_CYPRESS=y
# CONFIG_HID_DRAGONRISE is not setCONFIG_HID_EMS_FF=m
# CONFIG_HID_ELECOM is not setCONFIG_HID_ELO=mCONFIG_HID_EZKEY=mCONFIG_HID_HOLTEK=mCONFIG_HOLTEK_FF=yCONFIG_HID_GT683R=mCONFIG_HID_KEYTOUCH=yCONFIG_HID_KYE=m
# CONFIG_HID_UCLOGIC is not setCONFIG_HID_WALTOP=yCONFIG_HID_GYRATION=yCONFIG_HID_ICADE=mCONFIG_HID_TWINHAN=mCONFIG_HID_KENSINGTON=y
# CONFIG_HID_LCPOWER is not set
# CONFIG_HID_LENOVO is not setCONFIG_HID_LOGITECH=yCONFIG_HID_LOGITECH_HIDPP=mCONFIG_LOGITECH_FF=y
# CONFIG_LOGIRUMBLEPAD2_FF is not set
# CONFIG_LOGIG940_FF is not setCONFIG_LOGIWHEELS_FF=y
# CONFIG_HID_MAGICMOUSE is not set
# CONFIG_HID_MICROSOFT is not setCONFIG_HID_MONTEREY=yCONFIG_HID_MULTITOUCH=yCONFIG_HID_NTRIG=m
# CONFIG_HID_ORTEK is not setCONFIG_HID_PANTHERLORD=y
# CONFIG_PANTHERLORD_FF is not set
# CONFIG_HID_PENMOUNT is not set
# CONFIG_HID_PETALYNX is not set
# CONFIG_HID_PICOLCD is not setCONFIG_HID_PLANTRONICS=mCONFIG_HID_PRIMAX=y
# CONFIG_HID_ROCCAT is not setCONFIG_HID_SAITEK=y
# CONFIG_HID_SAMSUNG is not setCONFIG_HID_SONY=m
# CONFIG_SONY_FF is not setCONFIG_HID_SPEEDLINK=yCONFIG_HID_STEELSERIES=y
# CONFIG_HID_SUNPLUS is not setCONFIG_HID_RMI=y
# CONFIG_HID_GREENASIA is not setCONFIG_HID_SMARTJOYPLUS=mCONFIG_SMARTJOYPLUS_FF=yCONFIG_HID_TIVO=yCONFIG_HID_TOPSEED=yCONFIG_HID_THINGM=yCONFIG_HID_THRUSTMASTER=yCONFIG_THRUSTMASTER_FF=yCONFIG_HID_WACOM=yCONFIG_HID_WIIMOTE=y
# CONFIG_HID_XINMO is not setCONFIG_HID_ZEROPLUS=m
# CONFIG_ZEROPLUS_FF is not setCONFIG_HID_ZYDACRON=yCONFIG_HID_SENSOR_HUB=m
# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set
#
# USB HID support
#CONFIG_USB_HID=mCONFIG_HID_PID=y
# CONFIG_USB_HIDDEV is not set
#
# USB HID Boot Protocol drivers
#CONFIG_USB_KBD=mCONFIG_USB_MOUSE=y
#
# I2C HID support
#CONFIG_I2C_HID=mCONFIG_USB_OHCI_LITTLE_ENDIAN=yCONFIG_USB_SUPPORT=yCONFIG_USB_COMMON=yCONFIG_USB_ARCH_HAS_HCD=yCONFIG_USB=y
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
#
# Miscellaneous USB options
#
# CONFIG_USB_DEFAULT_PERSIST is not setCONFIG_USB_DYNAMIC_MINORS=yCONFIG_USB_OTG=y
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not setCONFIG_USB_OTG_FSM=yCONFIG_USB_ULPI_BUS=m
# CONFIG_USB_MON is not setCONFIG_USB_WUSB_CBAF=mCONFIG_USB_WUSB_CBAF_DEBUG=y
#
# USB Host Controller Drivers
#CONFIG_USB_C67X00_HCD=m
# CONFIG_USB_XHCI_HCD is not setCONFIG_USB_EHCI_HCD=yCONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not setCONFIG_USB_EHCI_PCI=yCONFIG_USB_EHCI_HCD_PLATFORM=y
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not setCONFIG_USB_ISP1362_HCD=mCONFIG_USB_FUSBH200_HCD=yCONFIG_USB_FOTG210_HCD=m
# CONFIG_USB_MAX3421_HCD is not setCONFIG_USB_OHCI_HCD=yCONFIG_USB_OHCI_HCD_PCI=yCONFIG_USB_OHCI_HCD_SSB=yCONFIG_USB_OHCI_HCD_PLATFORM=yCONFIG_USB_UHCI_HCD=y
# CONFIG_USB_U132_HCD is not set
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
# CONFIG_USB_RENESAS_USBHS_HCD is not set
# CONFIG_USB_HCD_BCMA is not setCONFIG_USB_HCD_SSB=yCONFIG_USB_HCD_TEST_MODE=yCONFIG_USB_RENESAS_USBHS=m
#
# USB Device Class drivers
#CONFIG_USB_ACM=mCONFIG_USB_PRINTER=yCONFIG_USB_WDM=mCONFIG_USB_TMC=m
#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may #
#
# also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE_DEBUG=y # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set CONFIG_USB_STORAGE_FREECOM=m CONFIG_USB_STORAGE_ISD200=m # CONFIG_USB_STORAGE_USBAT is not set CONFIG_USB_STORAGE_SDDR09=m CONFIG_USB_STORAGE_SDDR55=m CONFIG_USB_STORAGE_JUMPSHOT=m CONFIG_USB_STORAGE_ALAUDA=m CONFIG_USB_STORAGE_ONETOUCH=m CONFIG_USB_STORAGE_KARMA=y CONFIG_USB_STORAGE_CYPRESS_ATACB=m CONFIG_USB_STORAGE_ENE_UB6250=m # CONFIG_USB_UAS is not set
#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USBIP_CORE is not set
# CONFIG_USB_MUSB_HDRC is not setCONFIG_USB_DWC3=y
# CONFIG_USB_DWC3_HOST is not set
# CONFIG_USB_DWC3_GADGET is not setCONFIG_USB_DWC3_DUAL_ROLE=y
#
# Platform Glue Driver Support
#CONFIG_USB_DWC3_EXYNOS=yCONFIG_USB_DWC3_PCI=mCONFIG_USB_DWC3_KEYSTONE=mCONFIG_USB_DWC3_QCOM=m
#
# Debugging features
#
# CONFIG_USB_DWC3_DEBUG is not set
# CONFIG_USB_DWC2 is not setCONFIG_USB_CHIPIDEA=yCONFIG_USB_CHIPIDEA_PCI=mCONFIG_USB_CHIPIDEA_UDC=yCONFIG_USB_CHIPIDEA_HOST=yCONFIG_USB_CHIPIDEA_DEBUG=y
# CONFIG_USB_ISP1760 is not set
#
# USB port drivers
#CONFIG_USB_SERIAL=yCONFIG_USB_SERIAL_CONSOLE=yCONFIG_USB_SERIAL_GENERIC=y
# CONFIG_USB_SERIAL_SIMPLE is not setCONFIG_USB_SERIAL_AIRCABLE=m
# CONFIG_USB_SERIAL_ARK3116 is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_CH341 is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not setCONFIG_USB_SERIAL_CP210X=m
# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
# CONFIG_USB_SERIAL_EMPEG is not setCONFIG_USB_SERIAL_FTDI_SIO=m
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_IPAQ is not set
# CONFIG_USB_SERIAL_IR is not setCONFIG_USB_SERIAL_EDGEPORT=mCONFIG_USB_SERIAL_EDGEPORT_TI=m
# CONFIG_USB_SERIAL_F81232 is not setCONFIG_USB_SERIAL_GARMIN=yCONFIG_USB_SERIAL_IPW=yCONFIG_USB_SERIAL_IUU=yCONFIG_USB_SERIAL_KEYSPAN_PDA=mCONFIG_USB_SERIAL_KEYSPAN=y
# CONFIG_USB_SERIAL_KLSI is not set
# CONFIG_USB_SERIAL_KOBIL_SCT is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_METRO is not setCONFIG_USB_SERIAL_MOS7720=mCONFIG_USB_SERIAL_MOS7840=yCONFIG_USB_SERIAL_MXUPORT=m
# CONFIG_USB_SERIAL_NAVMAN is not setCONFIG_USB_SERIAL_PL2303=m
# CONFIG_USB_SERIAL_OTI6858 is not setCONFIG_USB_SERIAL_QCAUX=mCONFIG_USB_SERIAL_QUALCOMM=y
# CONFIG_USB_SERIAL_SPCP8X5 is not setCONFIG_USB_SERIAL_SAFE=mCONFIG_USB_SERIAL_SAFE_PADDED=yCONFIG_USB_SERIAL_SIERRAWIRELESS=yCONFIG_USB_SERIAL_SYMBOL=yCONFIG_USB_SERIAL_TI=m
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_XIRCOM is not setCONFIG_USB_SERIAL_WWAN=yCONFIG_USB_SERIAL_OPTION=yCONFIG_USB_SERIAL_OMNINET=m
# CONFIG_USB_SERIAL_OPTICON is not setCONFIG_USB_SERIAL_XSENS_MT=y
# CONFIG_USB_SERIAL_WISHBONE is not setCONFIG_USB_SERIAL_SSU100=mCONFIG_USB_SERIAL_QT2=m
# CONFIG_USB_SERIAL_DEBUG is not set
#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not setCONFIG_USB_EMI26=mCONFIG_USB_ADUTUX=y
# CONFIG_USB_SEVSEG is not setCONFIG_USB_RIO500=yCONFIG_USB_LEGOTOWER=y
# CONFIG_USB_LCD is not setCONFIG_USB_LED=mCONFIG_USB_CYPRESS_CY7C63=mCONFIG_USB_CYTHERM=y
# CONFIG_USB_IDMOUSE is not setCONFIG_USB_FTDI_ELAN=mCONFIG_USB_APPLEDISPLAY=yCONFIG_USB_SISUSBVGA=y
# CONFIG_USB_SISUSBVGA_CON is not setCONFIG_USB_LD=mCONFIG_USB_TRANCEVIBRATOR=m
# CONFIG_USB_IOWARRIOR is not setCONFIG_USB_TEST=y
# CONFIG_USB_EHSET_TEST_FIXTURE is not setCONFIG_USB_ISIGHTFW=mCONFIG_USB_YUREX=yCONFIG_USB_EZUSB_FX2=y
# CONFIG_USB_HSIC_USB3503 is not set
# CONFIG_USB_LINK_LAYER_TEST is not set
# CONFIG_USB_ATM is not set
#
# USB Physical Layer drivers
#CONFIG_USB_PHY=yCONFIG_KEYSTONE_USB_PHY=mCONFIG_NOP_USB_XCEIV=mCONFIG_AM335X_CONTROL_USB=mCONFIG_AM335X_PHY_USB=mCONFIG_USB_GPIO_VBUS=yCONFIG_TAHVO_USB=mCONFIG_TAHVO_USB_HOST_BY_DEFAULT=yCONFIG_USB_ISP1301=m
# CONFIG_USB_RCAR_PHY is not setCONFIG_USB_GADGET=y
# CONFIG_USB_GADGET_DEBUG is not set
# CONFIG_USB_GADGET_DEBUG_FILES is not setCONFIG_USB_GADGET_DEBUG_FS=yCONFIG_USB_GADGET_VBUS_DRAW=2CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
#
# USB Peripheral Controller
#
# CONFIG_USB_FOTG210_UDC is not setCONFIG_USB_GR_UDC=yCONFIG_USB_R8A66597=yCONFIG_USB_RENESAS_USBHS_UDC=mCONFIG_USB_PXA27X=mCONFIG_USB_MV_UDC=mCONFIG_USB_MV_U3D=mCONFIG_USB_M66592=mCONFIG_USB_BDC_UDC=y
#
# Platform Support
#
# CONFIG_USB_BDC_PCI is not set
# CONFIG_USB_AMD5536UDC is not set
# CONFIG_USB_NET2272 is not setCONFIG_USB_NET2280=mCONFIG_USB_GOKU=yCONFIG_USB_EG20T=yCONFIG_USB_GADGET_XILINX=yCONFIG_USB_DUMMY_HCD=yCONFIG_USB_LIBCOMPOSITE=mCONFIG_USB_F_ACM=mCONFIG_USB_F_SS_LB=mCONFIG_USB_U_SERIAL=mCONFIG_USB_U_ETHER=mCONFIG_USB_F_SERIAL=mCONFIG_USB_F_OBEX=mCONFIG_USB_F_NCM=mCONFIG_USB_F_ECM=mCONFIG_USB_F_PHONET=mCONFIG_USB_F_EEM=mCONFIG_USB_F_SUBSET=mCONFIG_USB_F_RNDIS=mCONFIG_USB_F_MASS_STORAGE=mCONFIG_USB_F_FS=mCONFIG_USB_F_HID=mCONFIG_USB_F_PRINTER=mCONFIG_USB_CONFIGFS=mCONFIG_USB_CONFIGFS_SERIAL=y
# CONFIG_USB_CONFIGFS_ACM is not set
# CONFIG_USB_CONFIGFS_OBEX is not set
# CONFIG_USB_CONFIGFS_NCM is not setCONFIG_USB_CONFIGFS_ECM=yCONFIG_USB_CONFIGFS_ECM_SUBSET=yCONFIG_USB_CONFIGFS_RNDIS=yCONFIG_USB_CONFIGFS_EEM=yCONFIG_USB_CONFIGFS_PHONET=yCONFIG_USB_CONFIGFS_MASS_STORAGE=yCONFIG_USB_CONFIGFS_F_LB_SS=yCONFIG_USB_CONFIGFS_F_FS=yCONFIG_USB_CONFIGFS_F_HID=y
# CONFIG_USB_CONFIGFS_F_UVC is not setCONFIG_USB_CONFIGFS_F_PRINTER=yCONFIG_USB_ZERO=mCONFIG_USB_ZERO_HNPTEST=yCONFIG_USB_ETH=m
# CONFIG_USB_ETH_RNDIS is not set
# CONFIG_USB_ETH_EEM is not setCONFIG_USB_G_NCM=mCONFIG_USB_GADGETFS=m
# CONFIG_USB_FUNCTIONFS is not setCONFIG_USB_MASS_STORAGE=mCONFIG_USB_GADGET_TARGET=mCONFIG_USB_G_SERIAL=mCONFIG_USB_G_PRINTER=mCONFIG_USB_CDC_COMPOSITE=mCONFIG_USB_G_ACM_MS=mCONFIG_USB_G_MULTI=m
# CONFIG_USB_G_MULTI_RNDIS is not setCONFIG_USB_G_MULTI_CDC=y
# CONFIG_USB_G_HID is not setCONFIG_USB_G_DBGP=mCONFIG_USB_G_DBGP_PRINTK=y
# CONFIG_USB_G_DBGP_SERIAL is not set
# CONFIG_USB_G_WEBCAM is not set
# CONFIG_UWB is not setCONFIG_MMC=mCONFIG_MMC_DEBUG=y
# CONFIG_MMC_CLKGATE is not set
#
# MMC/SD/SDIO Card Drivers
#CONFIG_MMC_BLOCK=mCONFIG_MMC_BLOCK_MINORS=8CONFIG_MMC_BLOCK_BOUNCE=yCONFIG_SDIO_UART=mCONFIG_MMC_TEST=m
#
# MMC/SD/SDIO Host Controller Drivers
#
# CONFIG_MMC_SDHCI is not setCONFIG_MMC_OMAP_HS=mCONFIG_MMC_WBSD=mCONFIG_MMC_TIFM_SD=m
# CONFIG_MMC_SPI is not setCONFIG_MMC_SDRICOH_CS=mCONFIG_MMC_CB710=mCONFIG_MMC_VIA_SDMMC=m
# CONFIG_MMC_DW is not set
# CONFIG_MMC_SH_MMCIF is not setCONFIG_MMC_VUB300=m
# CONFIG_MMC_USHC is not set
# CONFIG_MMC_USDHI6ROL0 is not setCONFIG_MMC_REALTEK_PCI=mCONFIG_MMC_REALTEK_USB=mCONFIG_MMC_TOSHIBA_PCI=m
# CONFIG_MMC_MTK is not setCONFIG_MEMSTICK=y
# CONFIG_MEMSTICK_DEBUG is not set
#
# MemoryStick drivers
#CONFIG_MEMSTICK_UNSAFE_RESUME=yCONFIG_MSPRO_BLOCK=yCONFIG_MS_BLOCK=m
#
# MemoryStick Host Controller Drivers
#CONFIG_MEMSTICK_TIFM_MS=mCONFIG_MEMSTICK_JMICRON_38X=yCONFIG_MEMSTICK_R592=yCONFIG_MEMSTICK_REALTEK_PCI=mCONFIG_MEMSTICK_REALTEK_USB=yCONFIG_NEW_LEDS=yCONFIG_LEDS_CLASS=y
# CONFIG_LEDS_CLASS_FLASH is not set
#
# LED drivers
#CONFIG_LEDS_LM3530=y
# CONFIG_LEDS_LM3533 is not setCONFIG_LEDS_LM3642=mCONFIG_LEDS_PCA9532=yCONFIG_LEDS_PCA9532_GPIO=yCONFIG_LEDS_GPIO=yCONFIG_LEDS_LP3944=mCONFIG_LEDS_LP55XX_COMMON=yCONFIG_LEDS_LP5521=m
# CONFIG_LEDS_LP5523 is not setCONFIG_LEDS_LP5562=y
# CONFIG_LEDS_LP8501 is not setCONFIG_LEDS_LP8788=m
# CONFIG_LEDS_LP8860 is not setCONFIG_LEDS_PCA955X=m
# CONFIG_LEDS_PCA963X is not set
# CONFIG_LEDS_DA903X is not setCONFIG_LEDS_DA9052=mCONFIG_LEDS_DAC124S085=m
# CONFIG_LEDS_PWM is not set
# CONFIG_LEDS_REGULATOR is not setCONFIG_LEDS_BD2802=y
# CONFIG_LEDS_LT3593 is not setCONFIG_LEDS_MC13783=mCONFIG_LEDS_TCA6507=yCONFIG_LEDS_TLC591XX=m
# CONFIG_LEDS_MAX8997 is not set
# CONFIG_LEDS_LM355x is not set
# CONFIG_LEDS_OT200 is not set
#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) #CONFIG_LEDS_BLINKM=y
# CONFIG_LEDS_PM8941_WLED is not set
#
# LED Triggers
#
# CONFIG_LEDS_TRIGGERS is not set
# CONFIG_ACCESSIBILITY is not setCONFIG_INFINIBAND=yCONFIG_INFINIBAND_USER_MAD=y
# CONFIG_INFINIBAND_USER_ACCESS is not setCONFIG_INFINIBAND_ADDR_TRANS=yCONFIG_INFINIBAND_MTHCA=y
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
# CONFIG_INFINIBAND_IPATH is not setCONFIG_INFINIBAND_QIB=y
# CONFIG_INFINIBAND_AMSO1100 is not setCONFIG_INFINIBAND_CXGB3=y
# CONFIG_INFINIBAND_CXGB3_DEBUG is not set
# CONFIG_INFINIBAND_CXGB4 is not set
# CONFIG_MLX4_INFINIBAND is not setCONFIG_INFINIBAND_NES=m
# CONFIG_INFINIBAND_NES_DEBUG is not setCONFIG_INFINIBAND_OCRDMA=y
# CONFIG_INFINIBAND_IPOIB is not set
# CONFIG_INFINIBAND_SRP is not setCONFIG_INFINIBAND_SRPT=m
# CONFIG_INFINIBAND_ISER is not set
# CONFIG_INFINIBAND_ISERT is not setCONFIG_EDAC_ATOMIC_SCRUB=yCONFIG_EDAC_SUPPORT=yCONFIG_EDAC=y
# CONFIG_EDAC_LEGACY_SYSFS is not setCONFIG_EDAC_DEBUG=yCONFIG_EDAC_MM_EDAC=yCONFIG_EDAC_E752X=y
# CONFIG_EDAC_I82975X is not setCONFIG_EDAC_I3000=mCONFIG_EDAC_I3200=yCONFIG_EDAC_IE31200=yCONFIG_EDAC_X38=yCONFIG_EDAC_I5400=mCONFIG_EDAC_I5000=m
# CONFIG_EDAC_I5100 is not setCONFIG_EDAC_I7300=y
# CONFIG_EDAC_XGENE is not setCONFIG_RTC_LIB=yCONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
# CONFIG_RTC_SYSTOHC is not set
# CONFIG_RTC_DEBUG is not set
#
# RTC interfaces
#CONFIG_RTC_INTF_SYSFS=y
# CONFIG_RTC_INTF_PROC is not setCONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not setCONFIG_RTC_DRV_TEST=m
#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_ABB5ZES3 is not setCONFIG_RTC_DRV_ABX80X=yCONFIG_RTC_DRV_DS1307=mCONFIG_RTC_DRV_DS1374=m
# CONFIG_RTC_DRV_DS1374_WDT is not set
# CONFIG_RTC_DRV_DS1672 is not setCONFIG_RTC_DRV_DS3232=y
# CONFIG_RTC_DRV_LP8788 is not setCONFIG_RTC_DRV_MAX6900=mCONFIG_RTC_DRV_MAX8907=m
# CONFIG_RTC_DRV_MAX8998 is not setCONFIG_RTC_DRV_MAX8997=mCONFIG_RTC_DRV_RS5C372=mCONFIG_RTC_DRV_ISL1208=y
# CONFIG_RTC_DRV_ISL12022 is not set
# CONFIG_RTC_DRV_ISL12057 is not setCONFIG_RTC_DRV_X1205=mCONFIG_RTC_DRV_PALMAS=yCONFIG_RTC_DRV_PCF2127=y
# CONFIG_RTC_DRV_PCF8523 is not setCONFIG_RTC_DRV_PCF8563=mCONFIG_RTC_DRV_PCF85063=mCONFIG_RTC_DRV_PCF8583=yCONFIG_RTC_DRV_M41T80=y
# CONFIG_RTC_DRV_M41T80_WDT is not setCONFIG_RTC_DRV_BQ32K=y
# CONFIG_RTC_DRV_TPS6586X is not set
# CONFIG_RTC_DRV_RC5T583 is not set
# CONFIG_RTC_DRV_S35390A is not setCONFIG_RTC_DRV_FM3130=y
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_EM3027 is not setCONFIG_RTC_DRV_RV3029C2=yCONFIG_RTC_DRV_S5M=y
#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_M41T93 is not setCONFIG_RTC_DRV_M41T94=y
# CONFIG_RTC_DRV_DS1305 is not setCONFIG_RTC_DRV_DS1343=y
# CONFIG_RTC_DRV_DS1347 is not setCONFIG_RTC_DRV_DS1390=m
# CONFIG_RTC_DRV_MAX6902 is not setCONFIG_RTC_DRV_R9701=mCONFIG_RTC_DRV_RS5C348=mCONFIG_RTC_DRV_DS3234=mCONFIG_RTC_DRV_PCF2123=yCONFIG_RTC_DRV_RX4581=y
# CONFIG_RTC_DRV_MCP795 is not set
#
# Platform RTC drivers
#
# CONFIG_RTC_DRV_CMOS is not set
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1685_FAMILY is not set
# CONFIG_RTC_DRV_DS1742 is not setCONFIG_RTC_DRV_DS2404=mCONFIG_RTC_DRV_DA9052=mCONFIG_RTC_DRV_DA9055=y
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not setCONFIG_RTC_DRV_M48T35=y
# CONFIG_RTC_DRV_M48T59 is not setCONFIG_RTC_DRV_MSM6242=y
# CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_RP5C01 is not setCONFIG_RTC_DRV_V3020=mCONFIG_RTC_DRV_PCF50633=m
#
# on-CPU RTC drivers
#CONFIG_RTC_DRV_GEMINI=m
# CONFIG_RTC_DRV_MC13XXX is not setCONFIG_RTC_DRV_MOXART=yCONFIG_RTC_DRV_MT6397=yCONFIG_RTC_DRV_XGENE=m
#
# HID Sensor RTC drivers
#CONFIG_RTC_DRV_HID_SENSOR_TIME=mCONFIG_DMADEVICES=yCONFIG_DMADEVICES_DEBUG=yCONFIG_DMADEVICES_VDEBUG=y
#
# DMA Devices
#
# CONFIG_INTEL_MIC_X100_DMA is not setCONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
# CONFIG_INTEL_IOATDMA is not setCONFIG_DW_DMAC_CORE=yCONFIG_DW_DMAC=mCONFIG_DW_DMAC_PCI=y
# CONFIG_HSU_DMA_PCI is not setCONFIG_RENESAS_DMA=yCONFIG_SH_DMAE_BASE=yCONFIG_SH_DMAE=mCONFIG_SUDMAC=mCONFIG_RCAR_HPB_DMAE=m
# CONFIG_RCAR_DMAC is not setCONFIG_RENESAS_USB_DMAC=yCONFIG_TIMB_DMA=mCONFIG_PCH_DMA=yCONFIG_NBPFAXI_DMA=yCONFIG_XGENE_DMA=mCONFIG_DMA_ENGINE=yCONFIG_DMA_VIRTUAL_CHANNELS=y
#
# DMA Clients
#CONFIG_ASYNC_TX_DMA=yCONFIG_DMATEST=yCONFIG_DMA_ENGINE_RAID=y
# CONFIG_AUXDISPLAY is not setCONFIG_UIO=y
# CONFIG_UIO_CIF is not setCONFIG_UIO_PDRV_GENIRQ=yCONFIG_UIO_DMEM_GENIRQ=m
# CONFIG_UIO_AEC is not set
# CONFIG_UIO_SERCOS3 is not setCONFIG_UIO_PCI_GENERIC=mCONFIG_UIO_NETX=m
# CONFIG_UIO_PRUSS is not set
# CONFIG_UIO_MF624 is not setCONFIG_VIRT_DRIVERS=yCONFIG_VIRTIO=y
#
# Virtio drivers
#CONFIG_VIRTIO_PCI=mCONFIG_VIRTIO_PCI_LEGACY=yCONFIG_VIRTIO_BALLOON=mCONFIG_VIRTIO_INPUT=y
# CONFIG_VIRTIO_MMIO is not set
#
# Microsoft Hyper-V guest support
#
# CONFIG_X86_PLATFORM_DEVICES is not set
# CONFIG_CHROME_PLATFORMS is not set
#
# Hardware Spinlock drivers
#
#
# Clock Source drivers
#CONFIG_CLKEVT_I8253=yCONFIG_I8253_LOCK=yCONFIG_CLKBLD_I8253=y
# CONFIG_ATMEL_PIT is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_SH_TIMER_TMU is not setCONFIG_EM_TIMER_STI=y
# CONFIG_MAILBOX is not set
# CONFIG_IOMMU_SUPPORT is not set
#
# Remoteproc drivers
#CONFIG_REMOTEPROC=yCONFIG_STE_MODEM_RPROC=y
#
# Rpmsg drivers
#
#
# SOC (System On Chip) specific Drivers
#
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SOC_TI is not set
# CONFIG_PM_DEVFREQ is not setCONFIG_EXTCON=m
#
# Extcon Device Drivers
#
# CONFIG_EXTCON_ADC_JACK is not set
# CONFIG_EXTCON_AXP288 is not setCONFIG_EXTCON_GPIO=m
# CONFIG_EXTCON_MAX14577 is not set
# CONFIG_EXTCON_MAX77693 is not set
# CONFIG_EXTCON_MAX77843 is not setCONFIG_EXTCON_MAX8997=mCONFIG_EXTCON_PALMAS=mCONFIG_EXTCON_RT8973A=m
# CONFIG_EXTCON_SM5502 is not set
# CONFIG_EXTCON_USB_GPIO is not set
# CONFIG_MEMORY is not setCONFIG_IIO=yCONFIG_IIO_BUFFER=y
# CONFIG_IIO_BUFFER_CB is not setCONFIG_IIO_KFIFO_BUF=yCONFIG_IIO_TRIGGERED_BUFFER=yCONFIG_IIO_TRIGGER=yCONFIG_IIO_CONSUMERS_PER_TRIGGER=2
#
# Accelerometers
#
# CONFIG_BMA180 is not setCONFIG_BMC150_ACCEL=m
# CONFIG_HID_SENSOR_ACCEL_3D is not set
# CONFIG_IIO_ST_ACCEL_3AXIS is not set
# CONFIG_KXSD9 is not setCONFIG_MMA8452=yCONFIG_KXCJK1013=yCONFIG_MMA9551_CORE=yCONFIG_MMA9551=mCONFIG_MMA9553=y
# CONFIG_STK8312 is not setCONFIG_STK8BA50=m
#
# Analog to digital converters
#CONFIG_AD7266=y
# CONFIG_AD7291 is not setCONFIG_AD7298=yCONFIG_AD7476=y
# CONFIG_AD7791 is not set
# CONFIG_AD7793 is not setCONFIG_AD7887=y
# CONFIG_AD7923 is not setCONFIG_AD799X=m
# CONFIG_AXP288_ADC is not setCONFIG_DA9150_GPADC=m
# CONFIG_CC10001_ADC is not setCONFIG_LP8788_ADC=mCONFIG_MAX1027=mCONFIG_MAX1363=yCONFIG_MCP320X=mCONFIG_MCP3422=y
# CONFIG_MEN_Z188_ADC is not set
# CONFIG_NAU7802 is not setCONFIG_TI_ADC081C=mCONFIG_TI_ADC128S052=yCONFIG_VIPERBOARD_ADC=m
# CONFIG_XILINX_XADC is not set
#
# Amplifiers
#CONFIG_AD8366=m
#
# Hid Sensor IIO Common
#CONFIG_HID_SENSOR_IIO_COMMON=mCONFIG_HID_SENSOR_IIO_TRIGGER=m
#
# SSP Sensor Common
#CONFIG_IIO_SSP_SENSORS_COMMONS=mCONFIG_IIO_SSP_SENSORHUB=yCONFIG_IIO_ST_SENSORS_I2C=yCONFIG_IIO_ST_SENSORS_SPI=yCONFIG_IIO_ST_SENSORS_CORE=y
#
# Digital to analog converters
#CONFIG_AD5064=m
# CONFIG_AD5360 is not set
# CONFIG_AD5380 is not setCONFIG_AD5421=yCONFIG_AD5446=yCONFIG_AD5449=yCONFIG_AD5504=y
# CONFIG_AD5624R_SPI is not set
# CONFIG_AD5686 is not set
# CONFIG_AD5755 is not setCONFIG_AD5764=mCONFIG_AD5791=yCONFIG_AD7303=mCONFIG_M62332=yCONFIG_MAX517=mCONFIG_MCP4725=yCONFIG_MCP4922=y
#
# Frequency Synthesizers DDS/PLL
#
#
# Clock Generator/Distribution
#CONFIG_AD9523=y
#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# CONFIG_ADF4350 is not set
#
# Digital gyroscope sensors
#CONFIG_ADIS16080=m
# CONFIG_ADIS16130 is not setCONFIG_ADIS16136=y
# CONFIG_ADIS16260 is not setCONFIG_ADXRS450=yCONFIG_BMG160=yCONFIG_HID_SENSOR_GYRO_3D=mCONFIG_IIO_ST_GYRO_3AXIS=mCONFIG_IIO_ST_GYRO_I2C_3AXIS=mCONFIG_IIO_ST_GYRO_SPI_3AXIS=mCONFIG_ITG3200=y
#
# Humidity sensors
#CONFIG_DHT11=mCONFIG_SI7005=m
# CONFIG_SI7020 is not set
#
# Inertial measurement units
#CONFIG_ADIS16400=y
# CONFIG_ADIS16480 is not setCONFIG_KMX61=yCONFIG_INV_MPU6050_IIO=yCONFIG_IIO_ADIS_LIB=yCONFIG_IIO_ADIS_LIB_BUFFER=y
#
# Light sensors
#
# CONFIG_ADJD_S311 is not setCONFIG_AL3320A=yCONFIG_APDS9300=mCONFIG_BH1750=yCONFIG_CM32181=y
# CONFIG_CM3232 is not set
# CONFIG_CM3323 is not set
# CONFIG_CM36651 is not set
# CONFIG_GP2AP020A00F is not setCONFIG_ISL29125=m
# CONFIG_HID_SENSOR_ALS is not setCONFIG_HID_SENSOR_PROX=mCONFIG_JSA1212=mCONFIG_SENSORS_LM3533=mCONFIG_LTR501=mCONFIG_STK3310=y
# CONFIG_TCS3414 is not setCONFIG_TCS3472=m
# CONFIG_SENSORS_TSL2563 is not setCONFIG_TSL4531=yCONFIG_VCNL4000=m
#
# Magnetometer sensors
#CONFIG_AK8975=y
# CONFIG_AK09911 is not set
# CONFIG_MAG3110 is not setCONFIG_HID_SENSOR_MAGNETOMETER_3D=m
# CONFIG_MMC35240 is not setCONFIG_IIO_ST_MAGN_3AXIS=yCONFIG_IIO_ST_MAGN_I2C_3AXIS=yCONFIG_IIO_ST_MAGN_SPI_3AXIS=y
# CONFIG_BMC150_MAGN is not set
#
# Inclinometer sensors
#CONFIG_HID_SENSOR_INCLINOMETER_3D=mCONFIG_HID_SENSOR_DEVICE_ROTATION=m
#
# Triggers - standalone
#CONFIG_IIO_INTERRUPT_TRIGGER=mCONFIG_IIO_SYSFS_TRIGGER=y
#
# Pressure sensors
#CONFIG_BMP280=yCONFIG_HID_SENSOR_PRESS=mCONFIG_MPL115=y
# CONFIG_MPL3115 is not setCONFIG_MS5611=yCONFIG_MS5611_I2C=mCONFIG_MS5611_SPI=mCONFIG_IIO_ST_PRESS=yCONFIG_IIO_ST_PRESS_I2C=yCONFIG_IIO_ST_PRESS_SPI=y
# CONFIG_T5403 is not set
#
# Lightning sensors
#CONFIG_AS3935=m
#
# Proximity sensors
#CONFIG_SX9500=m
#
# Temperature sensors
#
# CONFIG_MLX90614 is not set
# CONFIG_TMP006 is not set
# CONFIG_NTB is not setCONFIG_VME_BUS=y
#
# VME Bridge Drivers
#CONFIG_VME_CA91CX42=mCONFIG_VME_TSI148=y
#
# VME Board Drivers
#CONFIG_VMIVME_7805=m
#
# VME Device Drivers
#CONFIG_PWM=yCONFIG_PWM_SYSFS=yCONFIG_PWM_CLPS711X=m
# CONFIG_PWM_LP3943 is not setCONFIG_PWM_LPSS=yCONFIG_PWM_LPSS_PCI=mCONFIG_PWM_RENESAS_TPU=yCONFIG_IPACK_BUS=yCONFIG_BOARD_TPCI200=mCONFIG_SERIAL_IPOCTAL=m
# CONFIG_RESET_CONTROLLER is not setCONFIG_FMC=y
# CONFIG_FMC_TRIVIAL is not set
# CONFIG_FMC_WRITE_EEPROM is not set
# CONFIG_FMC_CHARDEV is not set
#
# PHY Subsystem
#CONFIG_GENERIC_PHY=yCONFIG_PHY_EXYNOS_MIPI_VIDEO=y
# CONFIG_PHY_PXA_28NM_HSIC is not setCONFIG_PHY_PXA_28NM_USB2=y
# CONFIG_OMAP_CONTROL_PHY is not setCONFIG_BCM_KONA_USB2_PHY=yCONFIG_PHY_ST_SPEAR1310_MIPHY=mCONFIG_PHY_ST_SPEAR1340_MIPHY=mCONFIG_PHY_TUSB1210=mCONFIG_POWERCAP=yCONFIG_INTEL_RAPL=mCONFIG_MCB=mCONFIG_MCB_PCI=mCONFIG_RAS=yCONFIG_THUNDERBOLT=m
#
# Android
#CONFIG_ANDROID=yCONFIG_ANDROID_BINDER_IPC=y
# CONFIG_LIBNVDIMM is not set
#
# Firmware Drivers
#CONFIG_EDD=m
# CONFIG_EDD_OFF is not setCONFIG_FIRMWARE_MEMMAP=yCONFIG_DELL_RBU=yCONFIG_DCDBAS=y
# CONFIG_GOOGLE_FIRMWARE is not set
#
# File systems
#CONFIG_DCACHE_WORD_ACCESS=y
# CONFIG_EXT2_FS is not setCONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not setCONFIG_EXT3_FS_XATTR=yCONFIG_EXT3_FS_POSIX_ACL=yCONFIG_EXT3_FS_SECURITY=yCONFIG_EXT4_FS=y
# CONFIG_EXT4_USE_FOR_EXT23 is not set
# CONFIG_EXT4_FS_POSIX_ACL is not setCONFIG_EXT4_FS_SECURITY=yCONFIG_EXT4_ENCRYPTION=mCONFIG_EXT4_FS_ENCRYPTION=y
# CONFIG_EXT4_DEBUG is not setCONFIG_JBD=yCONFIG_JBD_DEBUG=yCONFIG_JBD2=y
# CONFIG_JBD2_DEBUG is not setCONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not setCONFIG_JFS_FS=y
# CONFIG_JFS_POSIX_ACL is not set
# CONFIG_JFS_SECURITY is not setCONFIG_JFS_DEBUG=yCONFIG_JFS_STATISTICS=y
# CONFIG_XFS_FS is not setCONFIG_GFS2_FS=yCONFIG_OCFS2_FS=m
# CONFIG_OCFS2_FS_O2CB is not setCONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
# CONFIG_OCFS2_FS_STATS is not set
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
# CONFIG_OCFS2_DEBUG_FS is not setCONFIG_BTRFS_FS=mCONFIG_BTRFS_FS_POSIX_ACL=yCONFIG_BTRFS_FS_CHECK_INTEGRITY=yCONFIG_BTRFS_DEBUG=yCONFIG_BTRFS_ASSERT=yCONFIG_NILFS2_FS=y
# CONFIG_F2FS_FS is not set
# CONFIG_FS_DAX is not setCONFIG_FS_POSIX_ACL=yCONFIG_FILE_LOCKING=yCONFIG_FSNOTIFY=yCONFIG_DNOTIFY=y
# CONFIG_INOTIFY_USER is not set
# CONFIG_FANOTIFY is not setCONFIG_QUOTA=y
# CONFIG_QUOTA_NETLINK_INTERFACE is not setCONFIG_PRINT_QUOTA_WARNING=y
# CONFIG_QUOTA_DEBUG is not setCONFIG_QUOTA_TREE=mCONFIG_QFMT_V1=mCONFIG_QFMT_V2=mCONFIG_QUOTACTL=yCONFIG_QUOTACTL_COMPAT=y
# CONFIG_AUTOFS4_FS is not setCONFIG_FUSE_FS=yCONFIG_CUSE=y
# CONFIG_OVERLAY_FS is not set
#
# Caches
#CONFIG_FSCACHE=m
# CONFIG_FSCACHE_STATS is not setCONFIG_FSCACHE_HISTOGRAM=yCONFIG_FSCACHE_DEBUG=yCONFIG_FSCACHE_OBJECT_LIST=yCONFIG_CACHEFILES=m
# CONFIG_CACHEFILES_DEBUG is not set
# CONFIG_CACHEFILES_HISTOGRAM is not set
#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not setCONFIG_UDF_FS=mCONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#CONFIG_FAT_FS=m
# CONFIG_MSDOS_FS is not setCONFIG_VFAT_FS=mCONFIG_FAT_DEFAULT_CODEPAGE=437CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set
#
# Pseudo filesystems
#CONFIG_PROC_FS=y
# CONFIG_PROC_KCORE is not set
# CONFIG_PROC_SYSCTL is not set
# CONFIG_PROC_PAGE_MONITOR is not setCONFIG_PROC_CHILDREN=yCONFIG_KERNFS=yCONFIG_SYSFS=y
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not setCONFIG_CONFIGFS_FS=yCONFIG_MISC_FILESYSTEMS=yCONFIG_ADFS_FS=y
# CONFIG_ADFS_FS_RW is not setCONFIG_AFFS_FS=mCONFIG_ECRYPT_FS=mCONFIG_ECRYPT_FS_MESSAGING=y
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not setCONFIG_EFS_FS=y
# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not setCONFIG_VXFS_FS=mCONFIG_MINIX_FS=y
# CONFIG_OMFS_FS is not setCONFIG_HPFS_FS=mCONFIG_QNX4FS_FS=yCONFIG_QNX6FS_FS=yCONFIG_QNX6FS_DEBUG=yCONFIG_ROMFS_FS=mCONFIG_ROMFS_BACKED_BY_BLOCK=yCONFIG_ROMFS_ON_BLOCK=yCONFIG_PSTORE=yCONFIG_PSTORE_CONSOLE=yCONFIG_PSTORE_PMSG=yCONFIG_PSTORE_FTRACE=y
# CONFIG_PSTORE_RAM is not setCONFIG_SYSV_FS=mCONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not setCONFIG_UFS_DEBUG=y
# CONFIG_NETWORK_FILESYSTEMS is not setCONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-1"CONFIG_NLS_CODEPAGE_437=mCONFIG_NLS_CODEPAGE_737=mCONFIG_NLS_CODEPAGE_775=mCONFIG_NLS_CODEPAGE_850=m
# CONFIG_NLS_CODEPAGE_852 is not setCONFIG_NLS_CODEPAGE_855=mCONFIG_NLS_CODEPAGE_857=y
# CONFIG_NLS_CODEPAGE_860 is not setCONFIG_NLS_CODEPAGE_861=mCONFIG_NLS_CODEPAGE_862=yCONFIG_NLS_CODEPAGE_863=mCONFIG_NLS_CODEPAGE_864=y
# CONFIG_NLS_CODEPAGE_865 is not setCONFIG_NLS_CODEPAGE_866=yCONFIG_NLS_CODEPAGE_869=mCONFIG_NLS_CODEPAGE_936=y
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not setCONFIG_NLS_CODEPAGE_949=mCONFIG_NLS_CODEPAGE_874=yCONFIG_NLS_ISO8859_8=yCONFIG_NLS_CODEPAGE_1250=y
# CONFIG_NLS_CODEPAGE_1251 is not setCONFIG_NLS_ASCII=yCONFIG_NLS_ISO8859_1=yCONFIG_NLS_ISO8859_2=mCONFIG_NLS_ISO8859_3=m
# CONFIG_NLS_ISO8859_4 is not setCONFIG_NLS_ISO8859_5=y
# CONFIG_NLS_ISO8859_6 is not setCONFIG_NLS_ISO8859_7=yCONFIG_NLS_ISO8859_9=mCONFIG_NLS_ISO8859_13=m
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not setCONFIG_NLS_KOI8_R=yCONFIG_NLS_KOI8_U=mCONFIG_NLS_MAC_ROMAN=mCONFIG_NLS_MAC_CELTIC=m
# CONFIG_NLS_MAC_CENTEURO is not setCONFIG_NLS_MAC_CROATIAN=m
# CONFIG_NLS_MAC_CYRILLIC is not setCONFIG_NLS_MAC_GAELIC=mCONFIG_NLS_MAC_GREEK=m
# CONFIG_NLS_MAC_ICELAND is not set
# CONFIG_NLS_MAC_INUIT is not setCONFIG_NLS_MAC_ROMANIAN=mCONFIG_NLS_MAC_TURKISH=mCONFIG_NLS_UTF8=yCONFIG_DLM=m
# CONFIG_DLM_DEBUG is not set
#
# Kernel hacking
#CONFIG_TRACE_IRQFLAGS_SUPPORT=y
#
# printk and dmesg options # # CONFIG_PRINTK_TIME is not set CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y CONFIG_DYNAMIC_DEBUG=y
#
# Compile-time checks and compiler options
#CONFIG_ENABLE_WARN_DEPRECATED=yCONFIG_ENABLE_MUST_CHECK=yCONFIG_FRAME_WARN=2048CONFIG_STRIP_ASM_SYMS=yCONFIG_READABLE_ASM=y
# CONFIG_UNUSED_SYMBOLS is not set
# CONFIG_PAGE_OWNER is not setCONFIG_DEBUG_FS=yCONFIG_HEADERS_CHECK=y
# CONFIG_DEBUG_SECTION_MISMATCH is not setCONFIG_ARCH_WANT_FRAME_POINTERS=yCONFIG_FRAME_POINTER=yCONFIG_DEBUG_FORCE_WEAK_PER_CPU=yCONFIG_MAGIC_SYSRQ=yCONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1CONFIG_DEBUG_KERNEL=y
#
# Memory Debugging
#CONFIG_PAGE_EXTENSION=yCONFIG_DEBUG_PAGEALLOC=yCONFIG_DEBUG_OBJECTS=yCONFIG_DEBUG_OBJECTS_SELFTEST=yCONFIG_DEBUG_OBJECTS_FREE=yCONFIG_DEBUG_OBJECTS_WORK=y
# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not setCONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=yCONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
# CONFIG_DEBUG_SLAB is not setCONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_VM is not setCONFIG_DEBUG_VIRTUAL=yCONFIG_DEBUG_MEMORY_INIT=yCONFIG_DEBUG_PER_CPU_MAPS=yCONFIG_HAVE_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACKOVERFLOW is not setCONFIG_HAVE_ARCH_KMEMCHECK=yCONFIG_DEBUG_SHIRQ=y
#
# Debug Lockups and Hangs
#CONFIG_LOCKUP_DETECTOR=yCONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not setCONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not setCONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
# CONFIG_DETECT_HUNG_TASK is not set
# CONFIG_PANIC_ON_OOPS is not setCONFIG_PANIC_ON_OOPS_VALUE=0CONFIG_PANIC_TIMEOUT=0CONFIG_SCHED_DEBUG=yCONFIG_SCHED_INFO=y
# CONFIG_SCHEDSTATS is not setCONFIG_SCHED_STACK_END_CHECK=yCONFIG_DEBUG_TIMEKEEPING=y
# CONFIG_TIMER_STATS is not setCONFIG_DEBUG_PREEMPT=y
#
# Lock Debugging (spinlocks, mutexes, etc...)
#
# CONFIG_DEBUG_RT_MUTEXES is not setCONFIG_DEBUG_SPINLOCK=yCONFIG_DEBUG_MUTEXES=yCONFIG_DEBUG_WW_MUTEX_SLOWPATH=yCONFIG_DEBUG_LOCK_ALLOC=yCONFIG_PROVE_LOCKING=yCONFIG_LOCKDEP=yCONFIG_LOCK_STAT=y
# CONFIG_DEBUG_LOCKDEP is not setCONFIG_DEBUG_ATOMIC_SLEEP=yCONFIG_DEBUG_LOCKING_API_SELFTESTS=yCONFIG_LOCK_TORTURE_TEST=yCONFIG_TRACE_IRQFLAGS=yCONFIG_STACKTRACE=yCONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_PI_LIST is not setCONFIG_DEBUG_SG=y
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
#
# RCU Debugging
#CONFIG_PROVE_RCU=y
# CONFIG_PROVE_RCU_REPEATEDLY is not set
# CONFIG_SPARSE_RCU_POINTER is not setCONFIG_TORTURE_TEST=y
# CONFIG_RCU_TORTURE_TEST is not setCONFIG_RCU_CPU_STALL_TIMEOUT=21
# CONFIG_RCU_CPU_STALL_INFO is not setCONFIG_RCU_TRACE=y
# CONFIG_RCU_EQS_DEBUG is not setCONFIG_NOTIFIER_ERROR_INJECTION=m
# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not setCONFIG_PM_NOTIFIER_ERROR_INJECT=mCONFIG_FAULT_INJECTION=yCONFIG_FAILSLAB=y
# CONFIG_FAIL_PAGE_ALLOC is not setCONFIG_FAIL_MAKE_REQUEST=y
# CONFIG_FAIL_IO_TIMEOUT is not set
# CONFIG_FAIL_MMC_REQUEST is not setCONFIG_FAULT_INJECTION_DEBUG_FS=y
# CONFIG_LATENCYTOP is not setCONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not setCONFIG_USER_STACKTRACE_SUPPORT=yCONFIG_NOP_TRACER=yCONFIG_HAVE_FUNCTION_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_TRACER=yCONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=yCONFIG_HAVE_DYNAMIC_FTRACE=yCONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=yCONFIG_HAVE_FTRACE_MCOUNT_RECORD=yCONFIG_HAVE_SYSCALL_TRACEPOINTS=yCONFIG_HAVE_FENTRY=yCONFIG_HAVE_C_RECORDMCOUNT=yCONFIG_TRACER_MAX_TRACE=yCONFIG_TRACE_CLOCK=yCONFIG_RING_BUFFER=yCONFIG_EVENT_TRACING=yCONFIG_CONTEXT_SWITCH_TRACER=yCONFIG_RING_BUFFER_ALLOW_SWAP=yCONFIG_TRACING=yCONFIG_GENERIC_TRACER=yCONFIG_TRACING_SUPPORT=yCONFIG_FTRACE=yCONFIG_FUNCTION_TRACER=y
# CONFIG_FUNCTION_GRAPH_TRACER is not setCONFIG_IRQSOFF_TRACER=y
# CONFIG_PREEMPT_TRACER is not setCONFIG_SCHED_TRACER=y
# CONFIG_FTRACE_SYSCALLS is not setCONFIG_TRACER_SNAPSHOT=yCONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=yCONFIG_BRANCH_PROFILE_NONE=yCONFIG_STACK_TRACER=y
# CONFIG_BLK_DEV_IO_TRACE is not setCONFIG_UPROBE_EVENT=yCONFIG_PROBE_EVENTS=yCONFIG_DYNAMIC_FTRACE=yCONFIG_DYNAMIC_FTRACE_WITH_REGS=yCONFIG_FUNCTION_PROFILER=yCONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_MMIOTRACE is not setCONFIG_TRACEPOINT_BENCHMARK=yCONFIG_RING_BUFFER_STARTUP_TEST=y
# CONFIG_TRACE_ENUM_MAP_FILE is not set
#
# Runtime Testing
#
# CONFIG_LKDTM is not setCONFIG_TEST_LIST_SORT=y
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_RBTREE_TEST is not setCONFIG_INTERVAL_TREE_TEST=mCONFIG_PERCPU_TEST=mCONFIG_ATOMIC64_SELFTEST=yCONFIG_TEST_HEXDUMP=y
# CONFIG_TEST_STRING_HELPERS is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not setCONFIG_BUILD_DOCSRC=y
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_TEST_LKM is not setCONFIG_TEST_USER_COPY=mCONFIG_TEST_BPF=mCONFIG_TEST_FIRMWARE=y
# CONFIG_TEST_UDELAY is not set
# CONFIG_MEMTEST is not setCONFIG_SAMPLES=yCONFIG_SAMPLE_TRACE_EVENTS=m
# CONFIG_SAMPLE_KOBJECT is not set
# CONFIG_SAMPLE_HW_BREAKPOINT is not set
# CONFIG_SAMPLE_KFIFO is not setCONFIG_SAMPLE_LIVEPATCH=mCONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not setCONFIG_STRICT_DEVMEM=yCONFIG_X86_VERBOSE_BOOTUP=yCONFIG_EARLY_PRINTK=yCONFIG_EARLY_PRINTK_DBGP=y
# CONFIG_X86_PTDUMP is not setCONFIG_DEBUG_RODATA=yCONFIG_DEBUG_RODATA_TEST=y
# CONFIG_DEBUG_SET_MODULE_RONX is not setCONFIG_DEBUG_NX_TEST=mCONFIG_DOUBLEFAULT=yCONFIG_DEBUG_TLBFLUSH=yCONFIG_IOMMU_DEBUG=yCONFIG_IOMMU_STRESS=yCONFIG_HAVE_MMIOTRACE_SUPPORT=yCONFIG_IO_DELAY_TYPE_0X80=0CONFIG_IO_DELAY_TYPE_0XED=1CONFIG_IO_DELAY_TYPE_UDELAY=2CONFIG_IO_DELAY_TYPE_NONE=3
# CONFIG_IO_DELAY_0X80 is not set
# CONFIG_IO_DELAY_0XED is not setCONFIG_IO_DELAY_UDELAY=y
# CONFIG_IO_DELAY_NONE is not setCONFIG_DEFAULT_IO_DELAY_TYPE=2CONFIG_DEBUG_BOOT_PARAMS=y
# CONFIG_CPA_DEBUG is not setCONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_NMI_SELFTEST is not set
# CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set
# CONFIG_X86_DEBUG_FPU is not set
# CONFIG_PUNIT_ATOM_DEBUG is not set
#
# Security options
#CONFIG_KEYS=yCONFIG_PERSISTENT_KEYRINGS=yCONFIG_ENCRYPTED_KEYS=m
# CONFIG_SECURITY_DMESG_RESTRICT is not setCONFIG_SECURITY=y
# CONFIG_SECURITYFS is not setCONFIG_SECURITY_NETWORK=y
# CONFIG_SECURITY_NETWORK_XFRM is not setCONFIG_SECURITY_PATH=y
# CONFIG_SECURITY_APPARMOR is not set
# CONFIG_SECURITY_YAMA is not set
# CONFIG_INTEGRITY is not setCONFIG_DEFAULT_SECURITY_DAC=yCONFIG_DEFAULT_SECURITY=""CONFIG_XOR_BLOCKS=mCONFIG_CRYPTO=y
#
# Crypto core or helper
#CONFIG_CRYPTO_FIPS=yCONFIG_CRYPTO_ALGAPI=yCONFIG_CRYPTO_ALGAPI2=yCONFIG_CRYPTO_AEAD=yCONFIG_CRYPTO_AEAD2=yCONFIG_CRYPTO_BLKCIPHER=yCONFIG_CRYPTO_BLKCIPHER2=yCONFIG_CRYPTO_HASH=yCONFIG_CRYPTO_HASH2=yCONFIG_CRYPTO_RNG=yCONFIG_CRYPTO_RNG2=yCONFIG_CRYPTO_RNG_DEFAULT=yCONFIG_CRYPTO_PCOMP=yCONFIG_CRYPTO_PCOMP2=yCONFIG_CRYPTO_AKCIPHER2=yCONFIG_CRYPTO_AKCIPHER=mCONFIG_CRYPTO_RSA=mCONFIG_CRYPTO_MANAGER=yCONFIG_CRYPTO_MANAGER2=yCONFIG_CRYPTO_USER=m
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not setCONFIG_CRYPTO_GF128MUL=yCONFIG_CRYPTO_NULL=yCONFIG_CRYPTO_PCRYPT=mCONFIG_CRYPTO_WORKQUEUE=yCONFIG_CRYPTO_CRYPTD=y
# CONFIG_CRYPTO_MCRYPTD is not setCONFIG_CRYPTO_AUTHENC=mCONFIG_CRYPTO_TEST=mCONFIG_CRYPTO_ABLK_HELPER=yCONFIG_CRYPTO_GLUE_HELPER_X86=y
#
# Authenticated Encryption with Associated Data
#CONFIG_CRYPTO_CCM=m
# CONFIG_CRYPTO_GCM is not setCONFIG_CRYPTO_CHACHA20POLY1305=mCONFIG_CRYPTO_SEQIV=mCONFIG_CRYPTO_ECHAINIV=y
#
# Block modes
#CONFIG_CRYPTO_CBC=yCONFIG_CRYPTO_CTR=mCONFIG_CRYPTO_CTS=mCONFIG_CRYPTO_ECB=yCONFIG_CRYPTO_LRW=yCONFIG_CRYPTO_PCBC=yCONFIG_CRYPTO_XTS=y
#
# Hash modes
#CONFIG_CRYPTO_CMAC=mCONFIG_CRYPTO_HMAC=yCONFIG_CRYPTO_XCBC=mCONFIG_CRYPTO_VMAC=m
#
# Digest
#CONFIG_CRYPTO_CRC32C=yCONFIG_CRYPTO_CRC32C_INTEL=m
# CONFIG_CRYPTO_CRC32 is not setCONFIG_CRYPTO_CRC32_PCLMUL=yCONFIG_CRYPTO_CRCT10DIF=yCONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
# CONFIG_CRYPTO_GHASH is not setCONFIG_CRYPTO_POLY1305=m
# CONFIG_CRYPTO_MD4 is not setCONFIG_CRYPTO_MD5=yCONFIG_CRYPTO_MICHAEL_MIC=mCONFIG_CRYPTO_RMD128=m
# CONFIG_CRYPTO_RMD160 is not setCONFIG_CRYPTO_RMD256=mCONFIG_CRYPTO_RMD320=mCONFIG_CRYPTO_SHA1=yCONFIG_CRYPTO_SHA1_SSSE3=yCONFIG_CRYPTO_SHA256_SSSE3=mCONFIG_CRYPTO_SHA512_SSSE3=y
# CONFIG_CRYPTO_SHA1_MB is not setCONFIG_CRYPTO_SHA256=yCONFIG_CRYPTO_SHA512=yCONFIG_CRYPTO_TGR192=yCONFIG_CRYPTO_WP512=mCONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=y
#
# Ciphers
#CONFIG_CRYPTO_AES=yCONFIG_CRYPTO_AES_X86_64=mCONFIG_CRYPTO_AES_NI_INTEL=mCONFIG_CRYPTO_ANUBIS=yCONFIG_CRYPTO_ARC4=y
# CONFIG_CRYPTO_BLOWFISH is not setCONFIG_CRYPTO_BLOWFISH_COMMON=yCONFIG_CRYPTO_BLOWFISH_X86_64=yCONFIG_CRYPTO_CAMELLIA=mCONFIG_CRYPTO_CAMELLIA_X86_64=yCONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=yCONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=mCONFIG_CRYPTO_CAST_COMMON=yCONFIG_CRYPTO_CAST5=m
# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not setCONFIG_CRYPTO_CAST6=yCONFIG_CRYPTO_CAST6_AVX_X86_64=mCONFIG_CRYPTO_DES=m
# CONFIG_CRYPTO_DES3_EDE_X86_64 is not setCONFIG_CRYPTO_FCRYPT=mCONFIG_CRYPTO_KHAZAD=mCONFIG_CRYPTO_SALSA20=y
# CONFIG_CRYPTO_SALSA20_X86_64 is not setCONFIG_CRYPTO_CHACHA20=mCONFIG_CRYPTO_SEED=y
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set
# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set
# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set
# CONFIG_CRYPTO_TEA is not setCONFIG_CRYPTO_TWOFISH=mCONFIG_CRYPTO_TWOFISH_COMMON=yCONFIG_CRYPTO_TWOFISH_X86_64=y
# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set
# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set
#
# Compression
#
# CONFIG_CRYPTO_DEFLATE is not setCONFIG_CRYPTO_ZLIB=y
# CONFIG_CRYPTO_LZO is not set
# CONFIG_CRYPTO_842 is not setCONFIG_CRYPTO_LZ4=mCONFIG_CRYPTO_LZ4HC=m
#
# Random Number Generation
#CONFIG_CRYPTO_ANSI_CPRNG=yCONFIG_CRYPTO_DRBG_MENU=yCONFIG_CRYPTO_DRBG_HMAC=y
# CONFIG_CRYPTO_DRBG_HASH is not setCONFIG_CRYPTO_DRBG_CTR=yCONFIG_CRYPTO_DRBG=yCONFIG_CRYPTO_JITTERENTROPY=yCONFIG_CRYPTO_USER_API=y
# CONFIG_CRYPTO_USER_API_HASH is not setCONFIG_CRYPTO_USER_API_SKCIPHER=yCONFIG_CRYPTO_USER_API_RNG=y
# CONFIG_CRYPTO_USER_API_AEAD is not setCONFIG_CRYPTO_HASH_INFO=y
# CONFIG_CRYPTO_HW is not setCONFIG_ASYMMETRIC_KEY_TYPE=yCONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=yCONFIG_PUBLIC_KEY_ALGO_RSA=yCONFIG_X509_CERTIFICATE_PARSER=y
# CONFIG_PKCS7_MESSAGE_PARSER is not setCONFIG_HAVE_KVM=yCONFIG_HAVE_KVM_IRQCHIP=yCONFIG_HAVE_KVM_IRQFD=yCONFIG_HAVE_KVM_IRQ_ROUTING=yCONFIG_HAVE_KVM_EVENTFD=yCONFIG_KVM_APIC_ARCHITECTURE=yCONFIG_KVM_MMIO=yCONFIG_KVM_ASYNC_PF=yCONFIG_HAVE_KVM_MSI=yCONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=yCONFIG_KVM_VFIO=yCONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=yCONFIG_KVM_COMPAT=yCONFIG_VIRTUALIZATION=yCONFIG_KVM=yCONFIG_KVM_AMD=y
# CONFIG_KVM_MMU_AUDIT is not setCONFIG_BINARY_PRINTF=y
#
# Library routines
#CONFIG_RAID6_PQ=mCONFIG_BITREVERSE=y
# CONFIG_HAVE_ARCH_BITREVERSE is not setCONFIG_RATIONAL=yCONFIG_GENERIC_STRNCPY_FROM_USER=yCONFIG_GENERIC_STRNLEN_USER=yCONFIG_GENERIC_NET_UTILS=yCONFIG_GENERIC_FIND_FIRST_BIT=yCONFIG_GENERIC_PCI_IOMAP=yCONFIG_GENERIC_IOMAP=yCONFIG_GENERIC_IO=yCONFIG_PERCPU_RWSEM=yCONFIG_ARCH_USE_CMPXCHG_LOCKREF=yCONFIG_ARCH_HAS_FAST_MULTIPLIER=yCONFIG_CRC_CCITT=yCONFIG_CRC16=yCONFIG_CRC_T10DIF=yCONFIG_CRC_ITU_T=mCONFIG_CRC32=yCONFIG_CRC32_SELFTEST=y
# CONFIG_CRC32_SLICEBY8 is not setCONFIG_CRC32_SLICEBY4=y
# CONFIG_CRC32_SARWATE is not set
# CONFIG_CRC32_BIT is not setCONFIG_CRC7=yCONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
# CONFIG_RANDOM32_SELFTEST is not setCONFIG_ZLIB_INFLATE=yCONFIG_ZLIB_DEFLATE=yCONFIG_LZO_COMPRESS=yCONFIG_LZO_DECOMPRESS=yCONFIG_LZ4_COMPRESS=mCONFIG_LZ4HC_COMPRESS=mCONFIG_LZ4_DECOMPRESS=y
# CONFIG_XZ_DEC is not set
# CONFIG_XZ_DEC_BCJ is not setCONFIG_DECOMPRESS_GZIP=yCONFIG_DECOMPRESS_BZIP2=yCONFIG_DECOMPRESS_LZ4=yCONFIG_GENERIC_ALLOCATOR=yCONFIG_TEXTSEARCH=yCONFIG_TEXTSEARCH_KMP=yCONFIG_TEXTSEARCH_BM=yCONFIG_TEXTSEARCH_FSM=yCONFIG_INTERVAL_TREE=yCONFIG_ASSOCIATIVE_ARRAY=yCONFIG_HAS_IOMEM=yCONFIG_HAS_IOPORT_MAP=yCONFIG_HAS_DMA=yCONFIG_CHECK_SIGNATURE=yCONFIG_CPUMASK_OFFSTACK=yCONFIG_CPU_RMAP=yCONFIG_DQL=yCONFIG_GLOB=yCONFIG_GLOB_SELFTEST=yCONFIG_NLATTR=yCONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=yCONFIG_AVERAGE=yCONFIG_CLZ_TAB=yCONFIG_CORDIC=mCONFIG_DDR=yCONFIG_MPILIB=yCONFIG_OID_REGISTRY=yCONFIG_ARCH_HAS_SG_CHAIN=yCONFIG_ARCH_HAS_PMEM_API=yCONFIG_FORCE_SUCCESSFUL_BUILD=yCONFIG_FORCE_MINIMAL_CONFIG=yCONFIG_FORCE_MINIMAL_CONFIG_64=yCONFIG_FORCE_MINIMAL_CONFIG_PHYS=y
Quoted 37 lines · Ingo Molnar
So this looks mostly problem free on my boxen, except this warning triggers:
Adding 3911820k swap on
/dev/sda2. Priority:-1 extents:1 across:3911820k
capability: warning: `dbus-daemon' uses 32-bit capabilities (legacy support in use)------------[ cut here ]------------ WARNING: CPU: 1 PID: 2445 at arch/x86/entry/common.c:311 syscall_return_slowpath+0x4c/0x270() syscall 6 left IRQs disabled Modules linked in: CPU: 1 PID: 2445 Comm: distccd Not tainted 4.2.0-rc1-01597-gaecd781-dirty #18 0000000000000000 00000000776afac2 ffff880035413e58 ffffffff81c8915f 0000000000000000 ffff880035413eb0 ffff880035413e98 ffffffff810a8d82 ffff880035413e78 ffff880035413f58 0000000020020002 ffff880035410000 Call Trace: [<ffffffff81c8915f>] dump_stack+0x4f/0x7b [<ffffffff810a8d82>] warn_slowpath_common+0xa2/0xc0 [<ffffffff810a8df5>] warn_slowpath_fmt+0x55/0x70 [<ffffffff81001ddc>] syscall_return_slowpath+0x4c/0x270 [<ffffffff81c96471>] int_ret_from_sys_call+0x25/0x9f ---[ end trace 083efc734e089d37 ]---device: 'vcs2':
device_add
PM: Adding info for No Bus:vcs2
device: 'vcsa2':device_addwith ancient user-space, running the attached .config.
The system booted up fine otherwise. The warning corresponds to:
if (WARN(irqs_disabled(), "syscall %ld left IRQs disabled", regs->orig_ax)) local_irq_enable();and this was just the regular startup of the distccd daemon during bootup, nothing particularly fancy.
Note that 'distccd' is a 32-bit ELF binary - and this is a 64-bit kernel.
Quoted 7 lines
Syscall 6 would be:
arch/x86/entry/syscalls/syscall_32.tbl:6i386 closesys_closeThanks,
Ingo
It's irq state confusion in these lovely macros:
#ifndef CONFIG_AUDITSYSCALL
# define sysexit_audit ia32_ret_from_sys_call # define sysretl_audit ia32_ret_from_sys_call #endif
Frankly, I'm amazed that the old code seems to have worked. I should have a patch for you later today.
--Andy
Signature · 2 lines
Andy Lutomirski AMA Capital Management, LLC
Andy Lutomirski
maintainerPATCH 1/1 x86/entry/64: Fix warning on compat syscalls with CONFIG_AUDITSYSCALL=n
int_ret_from_sys_call now expects IRQs to be enabled. I got this right in the real sysexit_audit and sysretl_audit asm paths, but I missed it in the #defined-away versions when CONFIG_AUDITSYSCALL=n. This is a straightforward fix for CONFIG_AUDITSYSCALL=n
--- arch/x86/entry/entry_64_compat.S | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/x86/entry/entry_64_compat.S +6 -2
@@ -22,8 +22,8 @@ #define __AUDIT_ARCH_LE 0x40000000 #ifndef CONFIG_AUDITSYSCALL -# define sysexit_audit ia32_ret_from_sys_call -# define sysretl_audit ia32_ret_from_sys_call +# define sysexit_audit ia32_ret_from_sys_call_irqs_off +# define sysretl_audit ia32_ret_from_sys_call_irqs_off #endif .section .entry.text, "ax"
@@ -466,6 +466,10 @@ ia32_badarg: /* And exit again. */ jmp retint_user +ia32_ret_from_sys_call_irqs_off: + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) + ia32_ret_from_sys_call: xorl %eax, %eax /* Do not leak kernel information */ movq %rax, R11(%rsp)
Signature · 1 line
2.4.3
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL =n
x86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL=n
Commit-ID: 0c6541b605747fc39dc6b1715e1f3a3dca1cace5 Gitweb: http://git.kernel.org/tip/0c6541b605747fc39dc6b1715e1f3a3dca1cace5 Author: Andy Lutomirski <[email protected]> AuthorDate: Tue, 7 Jul 2015 10:55:28 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 8 Jul 2015 11:53:44 +0200
x86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL=n
int_ret_from_sys_call now expects IRQs to be enabled. I got this right in the real sysexit_audit and sysretl_audit asm paths, but I missed it in the #defined-away versions when CONFIG_AUDITSYSCALL=n. This is a straightforward fix for CONFIG_AUDITSYSCALL=n
--- arch/x86/entry/entry_64_compat.S | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/x86/entry/entry_64_compat.S +6 -2
@@ -22,8 +22,8 @@ #define __AUDIT_ARCH_LE 0x40000000 #ifndef CONFIG_AUDITSYSCALL -# define sysexit_audit ia32_ret_from_sys_call -# define sysretl_audit ia32_ret_from_sys_call +# define sysexit_audit ia32_ret_from_sys_call_irqs_off +# define sysretl_audit ia32_ret_from_sys_call_irqs_off #endif .section .entry.text, "ax"
@@ -466,6 +466,10 @@ ia32_badarg: /* And exit again. */ jmp retint_user +ia32_ret_from_sys_call_irqs_off: + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) + ia32_ret_from_sys_call: xorl %eax, %eax /* Do not leak kernel information */ movq %rax, R11(%rsp)
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL =n
In reply to Andy Lutomirskix86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL=n
Commit-ID: 8f7f06b87acd2e017d6c536f59e10045dd8d0578 Gitweb: http://git.kernel.org/tip/8f7f06b87acd2e017d6c536f59e10045dd8d0578 Author: Andy Lutomirski <[email protected]> AuthorDate: Tue, 7 Jul 2015 10:55:28 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 8 Jul 2015 21:10:25 +0200
x86/entry/64: Fix IRQ state confusion and related warning on compat syscalls with CONFIG_AUDITSYSCALL=n
int_ret_from_sys_call now expects IRQs to be enabled. I got this right in the real sysexit_audit and sysretl_audit asm paths, but I missed it in the #defined-away versions when CONFIG_AUDITSYSCALL=n. This is a straightforward fix for CONFIG_AUDITSYSCALL=n
--- arch/x86/entry/entry_64_compat.S | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
arch/x86/entry/entry_64_compat.S +6 -2
@@ -22,8 +22,8 @@ #define __AUDIT_ARCH_LE 0x40000000 #ifndef CONFIG_AUDITSYSCALL -# define sysexit_audit ia32_ret_from_sys_call -# define sysretl_audit ia32_ret_from_sys_call +# define sysexit_audit ia32_ret_from_sys_call_irqs_off +# define sysretl_audit ia32_ret_from_sys_call_irqs_off #endif .section .entry.text, "ax"
@@ -466,6 +466,10 @@ ia32_badarg: /* And exit again. */ jmp retint_user +ia32_ret_from_sys_call_irqs_off: + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) + ia32_ret_from_sys_call: xorl %eax, %eax /* Do not leak kernel information */ movq %rax, R11(%rsp)
Re: [tip:x86/asm] x86/entry: Add enter_from_user_mode() and use it in syscalls
In reply to tip-bot for Andy LutomirskiQuoted 70 lines · tip-bot for Andy Lutomirski
Commit-ID: feed36cde0a10adb957445a37e48f957f30b2273 Gitweb: http://git.kernel.org/tip/feed36cde0a10adb957445a37e48f957f30b2273 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:25 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200x86/entry: Add
enter_from_user_mode()and use it in syscallsChanging the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in
CONTEXT_USERwhen we enter from user mode and wire it up for syscall entries.Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if
CONFIG_CONTEXT_TRACING(adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler thanuser_exit), which will enable us to get rid of the extra call.Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/853b42420066ec3fb856779cdc223a6dcb5d355b.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/common.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)arch/x86/entry/common.c +9
-0@@ -28,6 +28,15 @@#define CREATE_TRACE_POINTS #include <trace/events/syscalls.h> +#ifdef CONFIG_CONTEXT_TRACKING +/* Called on entry from user mode with IRQs off. */ +__visible void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit (); +} +#endif +static void do_audit_syscall_entry (struct pt_regs *regs,u32 arch) {#ifdef CONFIG_X86_64 @@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) work =ACCESS_ONCE (current_thread_info ()->flags) & _TIF_WORK_SYSCALL_ENTRY;
arch/x86/entry/common.c unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) · line 84
Quoted 10 lines
arch/x86/entry/common.c +2
-1+#ifdef CONFIG_CONTEXT_TRACKING /* * If TIF_NOHZ is set, we are required to call user_exit() before * doing anything that could touch RCU. */ if (work & _TIF_NOHZ) { -user_exit (); +enter_from_user_mode (); work &= ~_TIF_NOHZ;
We should move the sanity check to user_exit/enter() and use user_exit/enter() only when we actually enter/exit user. Here it's the case but syscall_trace_leave() and do_notify_resume() are special case that should probably use exception_enter/exit() unless your patchset have changed things such that there is only one call to user_exit() once we completed everything before resuming userspace. I need to review the rest of the patchset to discover that :-)
Quoted 5 lines
arch/x86/entry/common.c +1
-0} +#endif #ifdef CONFIG_SECCOMP /*
Re: [tip:x86/asm] x86/entry: Add enter_from_user_mode() and use it in syscalls
Quoted 72 lines · Frederic Weisbecker
Quoted 71 lines · tip-bot for Andy Lutomirski
Commit-ID: feed36cde0a10adb957445a37e48f957f30b2273 Gitweb: http://git.kernel.org/tip/feed36cde0a10adb957445a37e48f957f30b2273 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:25 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200x86/entry: Add
enter_from_user_mode()and use it in syscallsChanging the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in
CONTEXT_USERwhen we enter from user mode and wire it up for syscall entries.Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if
CONFIG_CONTEXT_TRACING(adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler thanuser_exit), which will enable us to get rid of the extra call.Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/853b42420066ec3fb856779cdc223a6dcb5d355b.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/common.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)arch/x86/entry/common.c +9
-0@@ -28,6 +28,15 @@#define CREATE_TRACE_POINTS #include <trace/events/syscalls.h> +#ifdef CONFIG_CONTEXT_TRACKING +/* Called on entry from user mode with IRQs off. */ +__visible void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit (); +} +#endif +static void do_audit_syscall_entry (struct pt_regs *regs,u32 arch) {#ifdef CONFIG_X86_64 @@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) work =ACCESS_ONCE (current_thread_info ()->flags) & _TIF_WORK_SYSCALL_ENTRY;
Quoted 12 lines
arch/x86/entry/common.c unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) · line 84
Quoted 9 lines
arch/x86/entry/common.c +2
-1+#ifdef CONFIG_CONTEXT_TRACKING /* * If TIF_NOHZ is set, we are required to call user_exit() before * doing anything that could touch RCU. */ if (work & _TIF_NOHZ) { -user_exit (); +enter_from_user_mode (); work &= ~_TIF_NOHZ;We should move the sanity check to user_exit/enter() and use user_exit/enter() only when we actually enter/exit user.
I agree, but I don't know what other arches to.
Quoted 5 lines
Here it's the case but
syscall_trace_leave()
anddo_notify_resume()are special case that should probably use exception_enter/exit() unless your patchset have changed things such that there is only one call touser_exit()once we completed everything before resuming userspace. I need to review the rest of the patchset to discover that :-)
syscall_trace_leave and do_notify_resume may be so screwed up that your suggestion wouldn't even work. However, the next set of patches (out for review but currently stalled pending Brian Gerst's vm86 work) remove those functions entirely.
--Andy
Re: [tip:x86/asm] x86/entry: Add new, comprehensible entry and exit handlers written in C
In reply to tip-bot for Andy LutomirskiQuoted 122 lines · tip-bot for Andy Lutomirski
Commit-ID: c5c46f59e4e7c1ab244b8d38f2b61d317df90bba Gitweb: http://git.kernel.org/tip/c5c46f59e4e7c1ab244b8d38f2b61d317df90bba Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:26 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200x86/entry: Add new, comprehensible entry and exit handlers written in C
The current x86 entry and exit code, written in a mixture of assembly and C code, is incomprehensible due to being open-coded in a lot of places without coherent documentation.
It appears to work primary by luck and duct tape: i.e. obvious runtime failures were fixed on-demand, without re-thinking the design.
Due to those reasons our confidence level in that code is low, and it is very difficult to incrementally improve.
Add new code written in C, in preparation for simply deleting the old entry code.
prepare_exit_to_usermode()is a new function that will handle all slow path exits to user mode. It is called with IRQs disabled and it leaves us in a state in which it is safe to immediately return to user mode. IRQs must not be re-enabled at any point afterprepare_exit_to_usermode()returns and user mode is actually entered. (We can, of course, fail to enter user mode and treat that failure as a fresh entry to kernel mode.)All callers of
do_notify_resume()will be migrated to callprepare_exit_to_usermode()instead;prepare_exit_to_usermode()needs to do everything thatdo_notify_resume()does today, but it also takes care of scheduling and context tracking. Unlikedo_notify_resume(), it does not need to be called in a loop.
syscall_return_slowpath()is exactly what it sounds like: it will be called on any syscall exit slow path. It will replacesyscall_trace_leave()and it callsprepare_exit_to_usermode()on the way out.Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/c57c8b87661a4152801d7d3786eac2d1a2f209dd.1435952415.git.luto@kernel.org open here[ Improved the changelog a bit. ]Signed-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/common.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-)arch/x86/entry/common.c +44
-0@@ -207,6 +207,7 @@ long syscall_trace_enter(struct pt_regs *regs)return syscall_trace_enter_phase2 (regs, arch, phase1_result); } +/* Deprecated. */ void syscall_trace_leave (struct pt_regs *regs) {bool step;@@ -237,8 +238,117 @@ void syscall_trace_leave(struct pt_regs *regs)user_enter (); } +static struct thread_info *pt_regs_to_thread_info (struct pt_regs *regs) +{ +unsigned long top_of_stack = + (unsigned long )(regs +1 ) +TOP_OF_KERNEL_STACK_PADDING ; +return (struct thread_info *)(top_of_stack -THREAD_SIZE ); +} + +/* Called with IRQs disabled. */ +__visible void prepare_exit_to_usermode(struct pt_regs *regs) +{ +if (WARN_ON (!irqs_disabled ())) +local_irq_disable (); + +/* +* In order to return to user mode, we need to have IRQs off with +* none of _TIF_SIGPENDING, _TIF_NOTIFY_RESUME, _TIF_USER_RETURN_NOTIFY, +* _TIF_UPROBE, or _TIF_NEED_RESCHED set. Several of these flags +* can be set at any time on preemptable kernels if we have IRQs on, +* so we need to loop. Disabling preemption wouldn't help: doing the +* work to clear some of the flags can sleep. +*/ +while (true) { +u32 cached_flags = +READ_ONCE (pt_regs_to_thread_info (regs)->flags); + +if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | + _TIF_UPROBE | _TIF_NEED_RESCHED))) +break ; + +/* We have work to do. */ +local_irq_enable (); + +if (cached_flags & _TIF_NEED_RESCHED) +schedule (); + +if (cached_flags & _TIF_UPROBE) +uprobe_notify_resume (regs); + +/* deal with pending signal delivery */ +if (cached_flags & _TIF_SIGPENDING) +do_signal (regs); + +if (cached_flags & _TIF_NOTIFY_RESUME) {
arch/x86/entry/common.c void syscall_trace_leave(struct pt_regs *regs) · line 293
Quoted 10 lines
arch/x86/entry/common.c +10
-0+clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); + } + +if (cached_flags & _TIF_USER_RETURN_NOTIFY) +fire_user_return_notifiers (); + +/* Disable IRQs and retry */ +local_irq_disable (); + }
I dreamed so many times about this loop in C!
arch/x86/entry/common.c void syscall_trace_leave(struct pt_regs *regs) · line 295
Quoted 2 lines
arch/x86/entry/common.c +2
-0+ +user_enter ();
So now we are sure that we have only one call to user_enter() before resuming userspace, once we've completed everything, rescheduling, signals, etc... No more context tracking hacky round on signals and rescheduling?
That's great. I need to check if other archs still need schedule_user().
Thanks a lot!
Re: [tip:x86/asm] x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
In reply to tip-bot for Andy LutomirskiQuoted 41 lines · tip-bot for Andy Lutomirski
Commit-ID: 0333a209cbf600e980fc55c24878a56f25f48b65 Gitweb: http://git.kernel.org/tip/0333a209cbf600e980fc55c24878a56f25f48b65 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:34 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:10 +0200x86/irq,
context_tracking: Document how IRQ context tracking works and add an RCU assertionSigned-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Paul E. McKenney <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/e8bdc4ed0193fb2fd130f3d6b7b8023e2ec1ab62.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)arch/x86/kernel/irq.c +2
-0@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq; +/* +* NB: Unlike exception entries, IRQ entries do not reliably
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 230
Quoted 10 lines
arch/x86/kernel/irq.c +10
-0+* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +
Now is it a problem to take interrupts in kernel mode with CONTEXT_USER? I'm not sure it's worth trying to make it not happen.
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 234
Quoted 4 lines
arch/x86/kernel/irq.c +2
-0entering_irq (); +/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" );
Why do we need to check that?
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 238
Quoted 4 lines
arch/x86/kernel/irq.c +1
-0+ irq =__this_cpu_read (vector_irq[vector]);if (!handle_irq (irq, regs)) {
Thanks.
Re: [tip:x86/asm] x86/entry: Add enter_from_user_mode() and use it in syscalls
In reply to Andy LutomirskiQuoted 86 lines · Andy Lutomirski
Quoted 72 lines · Frederic Weisbecker
Quoted 71 lines · tip-bot for Andy Lutomirski
Commit-ID: feed36cde0a10adb957445a37e48f957f30b2273 Gitweb: http://git.kernel.org/tip/feed36cde0a10adb957445a37e48f957f30b2273 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:25 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:06 +0200x86/entry: Add
enter_from_user_mode()and use it in syscallsChanging the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in
CONTEXT_USERwhen we enter from user mode and wire it up for syscall entries.Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if
CONFIG_CONTEXT_TRACING(adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler thanuser_exit), which will enable us to get rid of the extra call.Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/853b42420066ec3fb856779cdc223a6dcb5d355b.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/common.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)arch/x86/entry/common.c +9
-0@@ -28,6 +28,15 @@#define CREATE_TRACE_POINTS #include <trace/events/syscalls.h> +#ifdef CONFIG_CONTEXT_TRACKING +/* Called on entry from user mode with IRQs off. */ +__visible void enter_from_user_mode(void) +{ +CT_WARN_ON (ct_state () !=CONTEXT_USER ); +user_exit (); +} +#endif +static void do_audit_syscall_entry (struct pt_regs *regs,u32 arch) {#ifdef CONFIG_X86_64 @@ -65,14 +74,16 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) work =ACCESS_ONCE (current_thread_info ()->flags) & _TIF_WORK_SYSCALL_ENTRY;Quoted 12 lines
arch/x86/entry/common.c unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) · line 84
Quoted 9 lines
arch/x86/entry/common.c +2
-1+#ifdef CONFIG_CONTEXT_TRACKING /* * If TIF_NOHZ is set, we are required to call user_exit() before * doing anything that could touch RCU. */ if (work & _TIF_NOHZ) { -user_exit (); +enter_from_user_mode (); work &= ~_TIF_NOHZ;We should move the sanity check to user_exit/enter() and use user_exit/enter() only when we actually enter/exit user.
Quoted 1 line
I agree, but I don't know what other arches to.
Right, I'll need to check that carefully, once I fully understand your patchset.
Quoted 11 lines
Quoted 6 lines
Here it's the case but
syscall_trace_leave()
anddo_notify_resume()are special case that should probably use exception_enter/exit() unless your patchset have changed things such that there is only one call touser_exit()once we completed everything before resuming userspace. I need to review the rest of the patchset to discover that :-)
syscall_trace_leaveanddo_notify_resumemay be so screwed up that your suggestion wouldn't even work. However, the next set of patches (out for review but currently stalled pending Brian Gerst's vm86 work) remove those functions entirely.
Ok so I'm probably confused. I need to check the resulting code.
Quoted 2 lines
--Andy
Re: [tip:x86/asm] x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
In reply to Frederic WeisbeckerQuoted 40 lines · Frederic Weisbecker
Quoted 39 lines · tip-bot for Andy Lutomirski
Commit-ID: 0333a209cbf600e980fc55c24878a56f25f48b65 Gitweb: http://git.kernel.org/tip/0333a209cbf600e980fc55c24878a56f25f48b65 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:34 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:10 +0200x86/irq,
context_tracking: Document how IRQ context tracking works and add an RCU assertionSigned-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Paul E. McKenney <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/e8bdc4ed0193fb2fd130f3d6b7b8023e2ec1ab62.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)arch/x86/kernel/irq.c +0
-0@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq;
Quoted 15 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 230
Quoted 12 lines
arch/x86/kernel/irq.c +12
-0+/* +* NB: Unlike exception entries, IRQ entries do not reliably +* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +Now is it a problem to take interrupts in kernel mode with
CONTEXT_USER? I'm not sure it's worth trying to make it not happen.
It's not currently a problem, but it would be nice if we could do the equivalent of:
if (user_mode(regs)) {
user_exit(); (or enter_from_user_mode or whatever)
} else {
// don't bother -- already in CONTEXT_KERNEL
}
i.e. the same thing that do_general_protection, etc do in -tip. That would get rid of any need to store the previous context.
Currently we can't because of syscalls and maybe because of KVM. KVM has a weird fake interrupt thing.
Quoted 7 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 234
Quoted 5 lines
arch/x86/kernel/irq.c +2
-0entering_irq (); +/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" );Why do we need to check that?
Sanity check. If we're changing a bunch of context tracking details, I want to assert that it actually works.
--Andy
Re: [tip:x86/asm] x86/entry: Add new, comprehensible entry and exit handlers written in C
In reply to Frederic WeisbeckerQuoted 27 lines · Frederic Weisbecker
Quoted 26 lines · tip-bot for Andy Lutomirski
arch/x86/entry/common.c +26
-0+while (true) { +u32 cached_flags = +READ_ONCE (pt_regs_to_thread_info (regs)->flags); + +if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | + _TIF_UPROBE | _TIF_NEED_RESCHED))) +break ; + +/* We have work to do. */ +local_irq_enable (); + +if (cached_flags & _TIF_NEED_RESCHED) +schedule (); + +if (cached_flags & _TIF_UPROBE) +uprobe_notify_resume (regs); + +/* deal with pending signal delivery */ +if (cached_flags & _TIF_SIGPENDING) +do_signal (regs); + +if (cached_flags & _TIF_NOTIFY_RESUME) { +clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); + } +
Quoted 8 lines
arch/x86/entry/common.c void syscall_trace_leave(struct pt_regs *regs) · line 293
Quoted 6 lines
arch/x86/entry/common.c +6
-0+if (cached_flags & _TIF_USER_RETURN_NOTIFY) +fire_user_return_notifiers (); + +/* Disable IRQs and retry */ +local_irq_disable (); + }I dreamed so many times about this loop in C!
So this made me look at it again, and now I'm worried.
There's that "early break", but it doesn't check _TIF_USER_RETURN_NOTIFY. So if *only* USER_RETURN_NOTIFY is set, we're screwed.
It migth be that that doesn't happen for some reason, but I'm not seeing what that reason would be.
The other thing that worries me is that this depends on all the handler routines to clear the flags (except for tracehook_notify_resume()). Which they hopefully do. But that means that just looking at this locally, it's not at all obvious that it works right.
So wouldn't it be much nicer to do:
u32 cached_flags = READ_ONCE(pt_regs_to_thread_info(regs)->flags);
cached_flags &= _TIF_SIGPENDING | _TIF_NOTIFY_RESUME |_TIF_USER_RETURN_NOTIFY | _TIF_UPROBE | _TIF_NEED_RESCHED;
if (!cached_flags)
break;
atomic_clear_mask(cached_flags, &pt_regs_to_thread_info(regs)->flags);and then have those bit tests after that?
Linus
Re: [tip:x86/asm] x86/entry: Add new, comprehensible entry and exit handlers written in C
Quoted 37 lines · Linus Torvalds
Quoted 27 lines · Frederic Weisbecker
Quoted 26 lines · tip-bot for Andy Lutomirski
arch/x86/entry/common.c +26
-0+while (true) { +u32 cached_flags = +READ_ONCE (pt_regs_to_thread_info (regs)->flags); + +if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | + _TIF_UPROBE | _TIF_NEED_RESCHED))) +break ; + +/* We have work to do. */ +local_irq_enable (); + +if (cached_flags & _TIF_NEED_RESCHED) +schedule (); + +if (cached_flags & _TIF_UPROBE) +uprobe_notify_resume (regs); + +/* deal with pending signal delivery */ +if (cached_flags & _TIF_SIGPENDING) +do_signal (regs); + +if (cached_flags & _TIF_NOTIFY_RESUME) { +clear_thread_flag (TIF_NOTIFY_RESUME ); +tracehook_notify_resume (regs); + } +Quoted 8 lines
arch/x86/entry/common.c void syscall_trace_leave(struct pt_regs *regs) · line 293
Quoted 6 lines
arch/x86/entry/common.c +6
-0+if (cached_flags & _TIF_USER_RETURN_NOTIFY) +fire_user_return_notifiers (); + +/* Disable IRQs and retry */ +local_irq_disable (); + }I dreamed so many times about this loop in C!
Quoted 5 lines
So this made me look at it again, and now I'm worried.
There's that "early break", but it doesn't check
_TIF_USER_RETURN_NOTIFY. So if *only*USER_RETURN_NOTIFYis set, we're screwed.
Crap, that's a bug. I'll send a patch.
Quoted 9 lines
It migth be that that doesn't happen for some reason, but I'm not seeing what that reason would be.
The other thing that worries me is that this depends on all the handler routines to clear the flags (except for
tracehook_notify_resume()). Which they hopefully do. But that means that just looking at this locally, it's not at all obvious that it works right.
The old do_notify_resume work loop worked more or less the same way, so we should be okay here. See below.
Quoted 8 lines
So wouldn't it be much nicer to do:
u32
cached_flags= READ_ONCE(pt_regs_to_thread_info(regs)->flags);
cached_flags&=_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_USER_RETURN_NOTIFY|_TIF_UPROBE|_TIF_NEED_RESCHED;
Quoted 7 lines
if (!cached_flags) break; atomic_clear_mask(cached_flags, &pt_regs_to_thread_info(regs)->flags);and then have those bit tests after that?
Yes, but it would be a slowdown unless we converted all the various handlers stopped clearing the bits separately (two atomics instead of one). And to do that, we'd probably want to change all the arches,
Signal handling has all the recalc_sigpending stuff. schedule() had better clear TIF_NEED_RESCHED. fire_user_return_notifiers is totally absurd but it does clear the bit. uprobes clears the bit directly.
I'd be all for changing this, but coordinating with the generic code could be annoying.
--Andy
Andy Lutomirski
maintainerPATCH 1/1 x86/entry: Fix _TIF_USER_RETURN_NOTIFY check in prepare_exit_to_usermode
Linus noticed that the early return check was missing _TIF_USER_RETURN_NOTIFY. If the only work flag was _TIF_USER_RETURN_NOTIFY, we'd skip user return notifiers. Fix it. (This is the only missing bit.)
This fixes double faults on a KVM host. It's the same issue as last time, except that this time it's very easy to trigger. Apparently no one uses -next as a KVM host.
(I'm still not quite sure what it is that KVM does that blows up so
badly if we miss a user return notifier. My best guess is that KVM lets KERNEL_GS_BASE (i.e. the user's gs base) be negative and fixes it up in a user return notifier. If we actually end up in user mode with a negative gs base, we blow up pretty badly.)
--- arch/x86/entry/common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +2 -1
@@ -264,7 +264,8 @@ __visible void prepare_exit_to_usermode(struct pt_regs *regs)READ_ONCE (pt_regs_to_thread_info (regs)->flags);if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | - _TIF_UPROBE | _TIF_NEED_RESCHED))) + _TIF_UPROBE | _TIF_NEED_RESCHED | + _TIF_USER_RETURN_NOTIFY)))break ;/* We have work to do. */
Signature · 1 line
2.4.3
tip-bot for Andy Lutomirski
merge bot[tip:x86/asm] x86/entry: Fix _TIF_USER_RETURN_NOTIFY check in prepare_exit_to_usermode
x86/entry: Fix _TIF_USER_RETURN_NOTIFY check in prepare_exit_to_usermode
Commit-ID: d132803e6c611d50c19baedc8ae520203a2baca7 Gitweb: http://git.kernel.org/tip/d132803e6c611d50c19baedc8ae520203a2baca7 Author: Andy Lutomirski <[email protected]> AuthorDate: Wed, 15 Jul 2015 14:25:16 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 17 Jul 2015 16:08:22 +0200
x86/entry: Fix _TIF_USER_RETURN_NOTIFY check in prepare_exit_to_usermode
Linus noticed that the early return check was missing _TIF_USER_RETURN_NOTIFY. If the only work flag was _TIF_USER_RETURN_NOTIFY, we'd skip user return notifiers. Fix it. (This is the only missing bit.)
This fixes double faults on a KVM host. It's the same issue as last time, except that this time it's very easy to trigger. Apparently no one uses -next as a KVM host.
( I'm still not quite sure what it is that KVM does that blows up
so badly if we miss a user return notifier. My best guess is that KVM lets KERNEL_GS_BASE (i.e. the user's gs base) be negative and fixes it up in a user return notifier. If we actually end up in user mode with a negative gs base, we blow up pretty badly. )
--- arch/x86/entry/common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/entry/common.c +2 -1
@@ -264,7 +264,8 @@ __visible void prepare_exit_to_usermode(struct pt_regs *regs)READ_ONCE (pt_regs_to_thread_info (regs)->flags);if (!(cached_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | - _TIF_UPROBE | _TIF_NEED_RESCHED))) + _TIF_UPROBE | _TIF_NEED_RESCHED | + _TIF_USER_RETURN_NOTIFY)))break ;/* We have work to do. */
Re: [tip:x86/asm] x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
In reply to Andy LutomirskiQuoted 57 lines · Andy Lutomirski
Quoted 40 lines · Frederic Weisbecker
Quoted 39 lines · tip-bot for Andy Lutomirski
Commit-ID: 0333a209cbf600e980fc55c24878a56f25f48b65 Gitweb: http://git.kernel.org/tip/0333a209cbf600e980fc55c24878a56f25f48b65 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:34 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:10 +0200x86/irq,
context_tracking: Document how IRQ context tracking works and add an RCU assertionSigned-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Paul E. McKenney <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/e8bdc4ed0193fb2fd130f3d6b7b8023e2ec1ab62.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)arch/x86/kernel/irq.c +0
-0@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq;Quoted 15 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 230
Quoted 12 lines
arch/x86/kernel/irq.c +12
-0+/* +* NB: Unlike exception entries, IRQ entries do not reliably +* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +Now is it a problem to take interrupts in kernel mode with
CONTEXT_USER? I'm not sure it's worth trying to make it not happen.
Quoted 8 lines
It's not currently a problem, but it would be nice if we could do the equivalent of:
if (
user_mode(regs)) {
user_exit(); (orenter_from_user_modeor whatever)
} else {
// don't bother -- already inCONTEXT_KERNEL
}
This was the initial implementation of context tracking but it was terribly buggy. What if we enter the kernel, we haven't yet got a change to call context_tracking_user_exit() and we get an exception in the kernel entry path? user_mode(regs) will return the wrong value and bad things happen.
This is why context tracking needs its own tracking state, because we are always out of sync with the real processor context anyway.
Quoted 10 lines
i.e. the same thing that
do_general_protection, etc do in -tip. That would get rid of any need to store the previous context.Currently we can't because of syscalls and maybe because of KVM. KVM has a weird fake interrupt thing.
Quoted 3 lines
Quoted 3 lines
arch/x86/kernel/irq.c +0
-0entering_irq ();
Quoted 7 lines
Quoted 4 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 234
Quoted 2 lines
arch/x86/kernel/irq.c +2
-0+/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" );Why do we need to check that?
Sanity check. If we're changing a bunch of context tracking details, I want to assert that it actually works.
But we call rcu_irq_enter() right before.
It's more or less like doing:
local_irq_disable();
WARN_ON(!irqs_disabled());
Re: [tip:x86/asm] x86/irq, context_tracking: Document how IRQ context tracking works and add an RCU assertion
Quoted 93 lines · Frederic Weisbecker
Quoted 57 lines · Andy Lutomirski
Quoted 40 lines · Frederic Weisbecker
Quoted 39 lines · tip-bot for Andy Lutomirski
Commit-ID: 0333a209cbf600e980fc55c24878a56f25f48b65 Gitweb: http://git.kernel.org/tip/0333a209cbf600e980fc55c24878a56f25f48b65 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:34 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:10 +0200x86/irq,
context_tracking: Document how IRQ context tracking works and add an RCU assertionSigned-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Paul E. McKenney <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/e8bdc4ed0193fb2fd130f3d6b7b8023e2ec1ab62.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/kernel/irq.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)arch/x86/kernel/irq.c +0
-0@@ -216,8 +216,23 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)unsigned vector = ~regs->orig_ax;unsigned irq;Quoted 15 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 230
Quoted 12 lines
arch/x86/kernel/irq.c +12
-0+/* +* NB: Unlike exception entries, IRQ entries do not reliably +* handle context tracking in the low-level entry code. This is +* because syscall entries execute briefly with IRQs on before +* updating context tracking state, so we can take an IRQ from +* kernel mode with CONTEXT_USER. The low-level entry code only +* updates the context if we came from user mode, so we won't +* switch to CONTEXT_KERNEL. We'll fix that once the syscall +* code is cleaned up enough that we can cleanly defer enabling +* IRQs. +*/ +Now is it a problem to take interrupts in kernel mode with
CONTEXT_USER? I'm not sure it's worth trying to make it not happen.Quoted 8 lines
It's not currently a problem, but it would be nice if we could do the equivalent of:
if (
user_mode(regs)) {
user_exit(); (orenter_from_user_modeor whatever)
} else {
// don't bother -- already inCONTEXT_KERNEL
}This was the initial implementation of context tracking but it was terribly buggy. What if we enter the kernel, we haven't yet got a change to call
context_tracking_user_exit()and we get an exception in the kernel entry path?user_mode(regs)will return the wrong value and bad things happen.This is why context tracking needs its own tracking state, because we are always out of sync with the real processor context anyway.
Quoted 10 lines
i.e. the same thing that
do_general_protection, etc do in -tip. That would get rid of any need to store the previous context.Currently we can't because of syscalls and maybe because of KVM. KVM has a weird fake interrupt thing.
Quoted 3 lines
Quoted 3 lines
arch/x86/kernel/irq.c +0
-0entering_irq ();Quoted 7 lines
Quoted 4 lines
arch/x86/kernel/irq.c __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) · line 234
Quoted 2 lines
arch/x86/kernel/irq.c +2
-0+/* entering_irq() tells RCU that we're not quiescent. Check it. */ +rcu_lockdep_assert (rcu_is_watching (),"IRQ failed to wake up RCU" );Why do we need to check that?
Sanity check. If we're changing a bunch of context tracking details, I want to assert that it actually works.
Quoted 6 lines
But we call
rcu_irq_enter()right before.It's more or less like doing:
local_irq_disable();
WARN_ON(!irqs_disabled());
If we end up in a world where RCU sometimes uses context-tracking state and sometimes uses its own state (for example, for architecture that do not support context tracking), such a check might make more sense. It would be all too easy for someone to accidentailly manage to disable both somehow, and things would sort of work but have strange undebuggable failure cases. Sometimes.
Thanx, Paul
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to tip-bot for Andy LutomirskiQuoted 38 lines · tip-bot for Andy Lutomirski
Commit-ID: 02bc7768fe447ae305e924b931fa629073a4a1b9 Gitweb: http://git.kernel.org/tip/02bc7768fe447ae305e924b931fa629073a4a1b9 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:31 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/60e90901eee611e59e958bfdbbe39969b4f88fe5.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)arch/x86/entry/entry_64.S +0
-0@@ -508,7 +508,16 @@ END(irq_entries_start) testb $3, CS(%rsp)
arch/x86/entry/entry_64.S END(irq_entries_start) · line 519
Quoted 10 lines
arch/x86/entry/entry_64.S +8
-0jz 1f + + /* + * IRQ from user mode. Switch to kernel gsbase and inform context + * tracking that we're in kernel mode. + */ SWAPGS +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif
There have been a lot of patches going there lately so I couldn't follow everything and since you just started a discussion on context tracking, I just had a look on the latest change.
So it seems we're now calling user_exit() on IRQ entry. This is not something we want. We already have everything we need with rcu_irq_enter() and vtime_account_irq_enter(). user_exit() brings a lot of overhead here that we don't need. Plus this is called unconditionally since CONFIG_CONTEXT_TRACKING=y on most distros now.
We really want the context tracking code to be called on syscall slow path only (and exceptions with static keys but an exception slow path would be desired as well).
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 54 lines · Frederic Weisbecker
Quoted 38 lines · tip-bot for Andy Lutomirski
Commit-ID: 02bc7768fe447ae305e924b931fa629073a4a1b9 Gitweb: http://git.kernel.org/tip/02bc7768fe447ae305e924b931fa629073a4a1b9 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:31 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/60e90901eee611e59e958bfdbbe39969b4f88fe5.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)arch/x86/entry/entry_64.S +0
-0@@ -508,7 +508,16 @@ END(irq_entries_start) testb $3, CS(%rsp)arch/x86/entry/entry_64.S END(irq_entries_start) · line 519
Quoted 10 lines
arch/x86/entry/entry_64.S +8
-0jz 1f + + /* + * IRQ from user mode. Switch to kernel gsbase and inform context + * tracking that we're in kernel mode. + */ SWAPGS +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endifThere have been a lot of patches going there lately so I couldn't follow everything and since you just started a discussion on context tracking, I just had a look on the latest change.
Quoted 8 lines
So it seems we're now calling
user_exit()on IRQ entry. This is not something we want. We already have everything we need withrcu_irq_enter()andvtime_account_irq_enter().user_exit()brings a lot of overhead here that we don't need. Plus this is called unconditionally sinceCONFIG_CONTEXT_TRACKING=yon most distros now.We really want the context tracking code to be called on syscall slow path only (and exceptions with static keys but an exception slow path would be desired as well).
Can you explain to me what context tracking does that rcu_irq_enter and vtime_account_irq_enter don't do that's expensive? Frankly, I'd rather drop everything except the context tracking callback.
We also need this for the deletion of exception_enter from the trap entries to be correct.
Like I said in the other thread, there are too many hooks for arch code to juggle. Grumble.
--Andy
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to tip-bot for Andy LutomirskiQuoted 36 lines · tip-bot for Andy Lutomirski
Commit-ID: 02bc7768fe447ae305e924b931fa629073a4a1b9 Gitweb: http://git.kernel.org/tip/02bc7768fe447ae305e924b931fa629073a4a1b9 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:31 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/60e90901eee611e59e958bfdbbe39969b4f88fe5.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)arch/x86/entry/entry_64.S +0
-0
arch/x86/entry/entry_64.S ENTRY(error_entry) · line 1060
Quoted 6 lines
arch/x86/entry/entry_64.S +3
-0@@ -1088,7 +1055,12 @@ ENTRY(error_entry) SWAPGS .Lerror_entry_from_usermode_after_swapgs: +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endif
This makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't call user_exit() before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.
In early context tracking days we have relied on CS. But I changed that because of such issue. The only reliable source for soft context tracking is the soft context tracking itself.
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy LutomirskiQuoted 3 lines · Andy Lutomirski
Can you explain to me what context tracking does that
rcu_irq_enterandvtime_account_irq_enterdon't do that's expensive? Frankly, I'd rather drop everything except the context tracking callback.
Irqs have their own hooks in the generic code. irq_enter() and irq_exit(). And those take care of RCU and time accounting already. So arch code really doesn't need to care about that.
context tracking exists for the sole purpose of tracking states that don't have generic hooks. Those are syscalls and exceptions.
Besides, rcu_user_exit() is more costly than rcu_irq_enter() which have been designed for the very purpose of providing a fast RCU tracking for non sleepable code (which needs rcu_user_exit()).
Quoted 3 lines
We also need this for the deletion of
exception_enterfrom the trap entries to be correct.
I'm not sure we can really delete exception_enter(). See my other email.
Quoted 2 lines
Like I said in the other thread, there are too many hooks for arch code to juggle. Grumble.
Well, archs don't need to care about irq hooks. They only need to track syscalls and exception.
I've been thinking about pushing down syscalls and exceptions to generic handlers. It might work for syscalls btw. But many exceptions have only arch handlers, or significant amount of work is done on the arch level which might make use of RCU (eg: breakpoint handlers on x86).
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Frederic WeisbeckerQuoted 52 lines · Frederic Weisbecker
Quoted 36 lines · tip-bot for Andy Lutomirski
Commit-ID: 02bc7768fe447ae305e924b931fa629073a4a1b9 Gitweb: http://git.kernel.org/tip/02bc7768fe447ae305e924b931fa629073a4a1b9 Author: Andy Lutomirski <[email protected]> AuthorDate: Fri, 3 Jul 2015 12:44:31 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 7 Jul 2015 10:59:08 +0200x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Signed-off-by Andy Lutomirski <[email protected]>Cc Andy Lutomirski <[email protected]>Cc Borislav Petkov <[email protected]>Cc Brian Gerst <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Denys Vlasenko <[email protected]>Cc Frederic Weisbecker <[email protected]>Cc H. Peter Anvin <[email protected]>Cc Kees Cook <[email protected]>Cc Linus Torvalds <[email protected]>Cc Oleg Nesterov <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Rik van Riel <[email protected]>Cc Thomas Gleixner <[email protected]>Link http://lkml.kernel.org/r/60e90901eee611e59e958bfdbbe39969b4f88fe5.1435952415.git.luto@kernel.org open hereSigned-off-by Ingo Molnar <[email protected]>--- arch/x86/entry/entry_64.S | 64 +++++++++++----------------------------- arch/x86/entry/entry_64_compat.S | 5 ++++ 2 files changed, 23 insertions(+), 46 deletions(-)arch/x86/entry/entry_64.S +0
-0arch/x86/entry/entry_64.S ENTRY(error_entry) · line 1060
Quoted 6 lines
arch/x86/entry/entry_64.S +3
-0@@ -1088,7 +1055,12 @@ ENTRY(error_entry) SWAPGS .Lerror_entry_from_usermode_after_swapgs: +#ifdef CONFIG_CONTEXT_TRACKING + call enter_from_user_mode +#endifThis makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Quoted 7 lines
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call
user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't calluser_exit()before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.
#DB doesn't go through this patch -- it uses the paranoid entry path and ist_enter. But I see your point. I think that, if we have a problem like this in practice, then we should fix it.
But the old code had the same issue. If we got an exception (the most likely one is probably a vmalloc fault) during user_exit and we then hit exception_enter, the result would probably be bad.
Quoted 3 lines
In early context tracking days we have relied on CS. But I changed that because of such issue. The only reliable source for soft context tracking is the soft context tracking itself.
I don't see why the soft state is more reliable. The only bad case is where the entry itself (HW entry up to user_exit) is not atomic enough, but that path should be at least as atomic as user_exit itself is.
--Andy
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Frederic WeisbeckerQuoted 8 lines · Frederic Weisbecker
Quoted 3 lines · Andy Lutomirski
Can you explain to me what context tracking does that
rcu_irq_enterandvtime_account_irq_enterdon't do that's expensive? Frankly, I'd rather drop everything except the context tracking callback.Irqs have their own hooks in the generic code.
irq_enter()andirq_exit(). And those take care of RCU and time accounting already. So arch code really doesn't need to care about that.
I'd love to have irq_enter_from_user and irq_enter_from_kernel instead.
Quoted 8 lines
context tracking exists for the sole purpose of tracking states that don't have generic hooks. Those are syscalls and exceptions.
Besides,
rcu_user_exit()is more costly thanrcu_irq_enter()which have been designed for the very purpose of providing a fast RCU tracking for non sleepable code (which needsrcu_user_exit()).
So rcu_user_exit is slower because it's okay to sleep after calling it?
Would it be possible to defer the overhead until we actually try to sleep rather than doing it on entry? (I have no idea what's going on under the hood.)
Anyway, irq_enter_from_user would solve this problem completely.
Quoted 5 lines
I've been thinking about pushing down syscalls and exceptions to generic handlers. It might work for syscalls btw. But many exceptions have only arch handlers, or significant amount of work is done on the arch level which might make use of RCU (eg: breakpoint handlers on x86).
I'm trying to port the meat of the x86 syscall code to C. Maybe the result will generalize. The exit code is already in C (in -tip).
--Andy
Signature · 2 lines
Andy Lutomirski AMA Capital Management, LLC
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy LutomirskiQuoted 18 lines · Andy Lutomirski
Quoted 9 lines · Frederic Weisbecker
This makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Quoted 7 lines
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call
user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't calluser_exit()before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.
Quoted 3 lines
#DB doesn't go through this patch -- it uses the paranoid entry path and
ist_enter. But I see your point. I think that, if we have a problem like this in practice, then we should fix it.
Whatever hack we do to prevent from exceptions happening in between real kernel entry to tracked kernel entry is going to be far less robust than relying strictly on soft context tracking.
The resulting bugs are rare and very hard to reproduce and diagnose.
Quoted 4 lines
But the old code had the same issue. If we got an exception (the most likely one is probably a vmalloc fault) during
user_exitand we then hitexception_enter, the result would probably be bad.
We have a recursion protection in context tracking that should protect against exceptions triggering in the middle of half-set states.
Quoted 9 lines
Quoted 4 lines
In early context tracking days we have relied on CS. But I changed that because of such issue. The only reliable source for soft context tracking is the soft context tracking itself.
I don't see why the soft state is more reliable. The only bad case is where the entry itself (HW entry up to
user_exit) is not atomic enough, but that path should be at least as atomic asuser_exititself is.
Note it's not only about entry code up to user_exit() but also about user_enter() up to iret.
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
Heh if only we had something like local_exception_save()!
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 20 lines · Frederic Weisbecker
Quoted 18 lines · Andy Lutomirski
Quoted 16 lines · Frederic Weisbecker
This makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call
user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't calluser_exit()before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.
Quoted 8 lines
Quoted 3 lines
#DB doesn't go through this patch -- it uses the paranoid entry path and
ist_enter. But I see your point. I think that, if we have a problem like this in practice, then we should fix it.Whatever hack we do to prevent from exceptions happening in between real kernel entry to tracked kernel entry is going to be far less robust than relying strictly on soft context tracking.
Why?
Any exception that doesn't leave the context tracking state exactly the way it found it is buggy. That means that we need to make sure that context tracking itself is safe wrt exceptions and that we need to make sure that any exception that can happen early in entry is itself safe.
The latter is annoying, but the entry code needs to deal with it anyway. For example, any exception early in NMI is currently really bad. Non-IST exceptions very early in SYSCALL are fatal. Non-paranoid exceptions outside swapgs are fatal. Etc.
Quoted 1 line
The resulting bugs are rare and very hard to reproduce and diagnose.
That's why I stuck assertions all over the place. I know of exactly one case that will trip the assertion, and it's a false positive and I plan on fixing it soon.
Quoted 8 lines
Quoted 5 lines
But the old code had the same issue. If we got an exception (the most likely one is probably a vmalloc fault) during
user_exitand we then hitexception_enter, the result would probably be bad.We have a recursion protection in context tracking that should protect against exceptions triggering in the middle of half-set states.
I sure hope so. It would be nice to mark it with with nokprobes, etc if needed, too.
Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
In early context tracking days we have relied on CS. But I changed that because of such issue. The only reliable source for soft context tracking is the soft context tracking itself.
Quoted 8 lines
Quoted 4 lines
I don't see why the soft state is more reliable. The only bad case is where the entry itself (HW entry up to
user_exit) is not atomic enough, but that path should be at least as atomic asuser_exititself is.Note it's not only about entry code up to
user_exit()but also aboutuser_enter()up to iret.
We already need to block interrupts there, and the code for exit back to userspace is very clean in -tip.
Quoted 3 lines
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
By that argument, we're doomed. Non-IST exceptions outside swapgs are fatal.
Quoted 2 lines
Heh if only we had something like
local_exception_save()!
What would that mean?
Exceptions aren't magic asynchronous things. They happen only when you do something that can trigger an exception.
--Andy
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy LutomirskiQuoted 11 lines · Andy Lutomirski
Quoted 8 lines · Frederic Weisbecker
Quoted 3 lines · Andy Lutomirski
Can you explain to me what context tracking does that
rcu_irq_enterandvtime_account_irq_enterdon't do that's expensive? Frankly, I'd rather drop everything except the context tracking callback.Irqs have their own hooks in the generic code.
irq_enter()andirq_exit(). And those take care of RCU and time accounting already. So arch code really doesn't need to care about that.I'd love to have
irq_enter_from_userandirq_enter_from_kernelinstead.
RCU would need to know about irq_enter_from_user(), but could blithely ignore irq_enter_from_kernel(). Unless irq_enter_from_kernel() is called from the idle loop, in which case RCU would need to know. All that aside, the overhead of rcu_irq_enter() when called from non-idle kernel mode should be relatively small. So just telling RCU about all the interrupts is actually not a bad strategy.
Quoted 7 lines
Quoted 6 lines
context tracking exists for the sole purpose of tracking states that don't have generic hooks. Those are syscalls and exceptions.
Besides,
rcu_user_exit()is more costly thanrcu_irq_enter()which have been designed for the very purpose of providing a fast RCU tracking for non sleepable code (which needsrcu_user_exit()).
Quoted 5 lines
So
rcu_user_exitis slower because it's okay to sleep after calling it?Would it be possible to defer the overhead until we actually try to sleep rather than doing it on entry? (I have no idea what's going on under the hood.)
Nor do I, at least not until someone tells me what .config they are using. NO_HZ_FULL, NO_HZ_FULL_SYSIDLE, and RCU_FAST_NO_HZ make a difference in this case.
Quoted 10 lines
Anyway,
irq_enter_from_userwould solve this problem completely.Quoted 5 lines
I've been thinking about pushing down syscalls and exceptions to generic handlers. It might work for syscalls btw. But many exceptions have only arch handlers, or significant amount of work is done on the arch level which might make use of RCU (eg: breakpoint handlers on x86).
I'm trying to port the meat of the x86 syscall code to C. Maybe the result will generalize. The exit code is already in C (in -tip).
That does sound like a good thing!
Thanx, Paul
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy LutomirskiQuoted 11 lines · Andy Lutomirski
Quoted 8 lines · Frederic Weisbecker
Quoted 3 lines · Andy Lutomirski
Can you explain to me what context tracking does that
rcu_irq_enterandvtime_account_irq_enterdon't do that's expensive? Frankly, I'd rather drop everything except the context tracking callback.Irqs have their own hooks in the generic code.
irq_enter()andirq_exit(). And those take care of RCU and time accounting already. So arch code really doesn't need to care about that.I'd love to have
irq_enter_from_userandirq_enter_from_kernelinstead.
I don't get why we need that. Vtime internals already keeps track of where we are. Again mixing up hard and soft tracking is asking for troubles.
Quoted 10 lines
Quoted 9 lines
context tracking exists for the sole purpose of tracking states that don't have generic hooks. Those are syscalls and exceptions.
Besides,
rcu_user_exit()is more costly thanrcu_irq_enter()which have been designed for the very purpose of providing a fast RCU tracking for non sleepable code (which needsrcu_user_exit()).
Quoted 5 lines
So
rcu_user_exitis slower because it's okay to sleep after calling it?Would it be possible to defer the overhead until we actually try to sleep rather than doing it on entry? (I have no idea what's going on under the hood.)
That's a question for Paul.
Quoted 1 line
Anyway,
irq_enter_from_userwould solve this problem completely.
How?
Quoted 8 lines
Quoted 5 lines
I've been thinking about pushing down syscalls and exceptions to generic handlers. It might work for syscalls btw. But many exceptions have only arch handlers, or significant amount of work is done on the arch level which might make use of RCU (eg: breakpoint handlers on x86).
I'm trying to port the meat of the x86 syscall code to C. Maybe the result will generalize. The exit code is already in C (in -tip).
But please don't change such semantics along the way, it really doesn't help to review the x86 low level changes if it's mixed up with fundamental context tracking changes.
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
In reply to Andy LutomirskiQuoted 30 lines · Andy Lutomirski
Quoted 20 lines · Frederic Weisbecker
Quoted 18 lines · Andy Lutomirski
Quoted 16 lines · Frederic Weisbecker
This makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call
user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't calluser_exit()before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.Quoted 8 lines
Quoted 3 lines
#DB doesn't go through this patch -- it uses the paranoid entry path and
ist_enter. But I see your point. I think that, if we have a problem like this in practice, then we should fix it.Whatever hack we do to prevent from exceptions happening in between real kernel entry to tracked kernel entry is going to be far less robust than relying strictly on soft context tracking.
Quoted 7 lines
Why?
Any exception that doesn't leave the context tracking state exactly the way it found it is buggy. That means that we need to make sure that context tracking itself is safe wrt exceptions and that we need to make sure that any exception that can happen early in entry is itself safe.
Right, and doing it the way we did previously was safe wrt. that.
Can't we have exceptions slow path just like the way we do it in syscalls?
Then the exception slow path would just do:
if TIF_NOHZ
ctx = exception_enter()
exception_handler()
if TIF_NOHZ
exception_exit(ctx)
Right now we are calling unconditionally the context tracking code, which is not good.
Quoted 5 lines
The latter is annoying, but the entry code needs to deal with it anyway. For example, any exception early in NMI is currently really bad. Non-IST exceptions very early in SYSCALL are fatal. Non-paranoid exceptions outside swapgs are fatal. Etc.
Sure but that doesn't mean I'm happy with introducing new fragile path like those. Especially as we have a way to fix without more overhead.
Quoted 13 lines
Quoted 2 lines
The resulting bugs are rare and very hard to reproduce and diagnose.
That's why I stuck assertions all over the place. I know of exactly one case that will trip the assertion, and it's a false positive and I plan on fixing it soon.
Quoted 6 lines
Quoted 5 lines
But the old code had the same issue. If we got an exception (the most likely one is probably a vmalloc fault) during
user_exitand we then hitexception_enter, the result would probably be bad.
Quoted 5 lines
Quoted 2 lines
We have a recursion protection in context tracking that should protect against exceptions triggering in the middle of half-set states.
I sure hope so. It would be nice to mark it with with nokprobes, etc if needed, too.
Sure.
Quoted 5 lines
Quoted 3 lines
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
By that argument, we're doomed. Non-IST exceptions outside swapgs are fatal.
Does that concern only error_entry() exceptions?
Quoted 7 lines
Quoted 2 lines
Heh if only we had something like
local_exception_save()!What would that mean?
Exceptions aren't magic asynchronous things. They happen only when you do something that can trigger an exception.
Sure but, did you really never wish to have such an API? :-p
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 43 lines · Frederic Weisbecker
Quoted 30 lines · Andy Lutomirski
Quoted 20 lines · Frederic Weisbecker
Quoted 18 lines · Andy Lutomirski
Quoted 16 lines · Frederic Weisbecker
This makes me very nervous as well!
It means that instead of using the context tracking save/restore model that we had with exception_enter/exception_exit(), now we rely on the CS register.
I don't think we can do that because our "context tracking" is a soft tracking whereas CS is hard tracking and both are not atomically synchronized together.
Imagine this situation: we are running in userspace. Context tracking knows it, everything is fine. Now we do a syscall, we enter in kernel entry code but we trigger an exception (DEBUG for example) before we got a chance to call
user_exit(), which means that the context tracking code still thinks we are in userspace, so we look at CS from the exception entry code and it says the exception happened in the kernel. Hence we don't calluser_exit()before calling the exception handler. There is the bug because the exception handler may use RCU which still thinks we run in userspace.Quoted 8 lines
Quoted 3 lines
#DB doesn't go through this patch -- it uses the paranoid entry path and
ist_enter. But I see your point. I think that, if we have a problem like this in practice, then we should fix it.Whatever hack we do to prevent from exceptions happening in between real kernel entry to tracked kernel entry is going to be far less robust than relying strictly on soft context tracking.
Quoted 7 lines
Why?
Any exception that doesn't leave the context tracking state exactly the way it found it is buggy. That means that we need to make sure that context tracking itself is safe wrt exceptions and that we need to make sure that any exception that can happen early in entry is itself safe.
Right, and doing it the way we did previously was safe wrt. that.
Can't we have exceptions slow path just like the way we do it in syscalls?
Quoted 7 lines
Then the exception slow path would just do:
if
TIF_NOHZ
ctx =exception_enter()
exception_handler()
ifTIF_NOHZ
exception_exit(ctx)
What's the purpose of TIF_NOHZ right now? For syscalls, it makes sense, but is there any case in which TIF_NOHZ is set on one CPU but not on another CPU? It might make sense to get the performance back using static keys instead of TIF_NOHZ.
If we switched back to exception_enter, we'd have to remember the previous state, and, with a single exception right now, I think that's unnecessary.
I think there are only three states we can be in at exception entry:
user (and user_mode(regs)), kernel (and kernel_mode(regs)), or NMI-like. In the user case, the new code is correct. In the kernel case, the new code is also correct. In the NMI case (if we're nested in an NMI or similar entry)) then it is and was the responsibility of the NMI-like entry to call rcu_nmi_enter(), and things that nest inside that shouldn't touch context tracking (with the possible exception of calling rcu_nmi_enter() again).
In current -tip, there's a slight hole in this due to syscalls, and I'll fix it.
Quoted 9 lines
Quoted 6 lines
The latter is annoying, but the entry code needs to deal with it anyway. For example, any exception early in NMI is currently really bad. Non-IST exceptions very early in SYSCALL are fatal. Non-paranoid exceptions outside swapgs are fatal. Etc.
Sure but that doesn't mean I'm happy with introducing new fragile path like those. Especially as we have a way to fix without more overhead.
I think my approach can work with even less overhead: there are fewer branches due to checking the previous state.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
By that argument, we're doomed. Non-IST exceptions outside swapgs are fatal.
Does that concern only
error_entry()exceptions?
Yes, but the set of paranoid_entry exceptions is shrinking. In -tip, there are:
NMI: NMI is special and will call rcu_nmi_enter(). Nothing's changing here.
MCE: Once upon a time, MCE was simply buggy. As of 4.0 (IIRC) MCE from kernel mode calls rcu_nmi_enter().
BP: This is going away, I think. #BP should stop being special by 4.4.
DB: That's the only weird case. Patches to prevent instruction breakpoints in entry code are already in -tip. The only thing left is kernel watchpoints, and we need to do something about that.
Quoted 10 lines
Quoted 8 lines
Quoted 3 lines
Heh if only we had something like
local_exception_save()!What would that mean?
Exceptions aren't magic asynchronous things. They happen only when you do something that can trigger an exception.
Sure but, did you really never wish to have such an API? :-p
:)
Signature · 2 lines
Andy Lutomirski AMA Capital Management, LLC
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 13 lines · Andy Lutomirski
Quoted 11 lines · Frederic Weisbecker
Right, and doing it the way we did previously was safe wrt. that.
Can't we have exceptions slow path just like the way we do it in syscalls?
Then the exception slow path would just do:
if
TIF_NOHZ
ctx =exception_enter()
exception_handler()
ifTIF_NOHZ
exception_exit(ctx)
Quoted 4 lines
What's the purpose of
TIF_NOHZright now? For syscalls, it makes sense, but is there any case in whichTIF_NOHZis set on one CPU but not on another CPU? It might make sense to get the performance back using static keys instead ofTIF_NOHZ.
Sure if we can manage to do that. The nice thing about TIF flags is that they are a single check that is always there.
Quoted 8 lines
If we switched back to
exception_enter, we'd have to remember the previous state, and, with a single exception right now, I think that's unnecessary.I think there are only three states we can be in at exception entry:
user (anduser_mode(regs)), kernel (andkernel_mode(regs)), or NMI-like.
But we can have user && (!user_mode(regs)) if exception happens on exception entry code.
Quoted 8 lines
In the user case, the new code is correct. In the kernel case, the new code is also correct. In the NMI case (if we're nested in an NMI or similar entry)) then it is and was the responsibility of the NMI-like entry to call
rcu_nmi_enter(), and things that nest inside that shouldn't touch context tracking (with the possible exception of callingrcu_nmi_enter()again).In current -tip, there's a slight hole in this due to syscalls, and I'll fix it.
There must be a check for context tracking enabled anyway. So why can't we just just do in exception entry code:
if (exception_slow_path()) {
exception_enter()
exception_handler()
exception_exit()
} else {
normal stuff
}Especially if we can manage to implement static keys in ASM, this will sum up to a single one.
Quoted 23 lines
Quoted 7 lines
Quoted 4 lines
The latter is annoying, but the entry code needs to deal with it anyway. For example, any exception early in NMI is currently really bad. Non-IST exceptions very early in SYSCALL are fatal. Non-paranoid exceptions outside swapgs are fatal. Etc.
Sure but that doesn't mean I'm happy with introducing new fragile path like those. Especially as we have a way to fix without more overhead.
I think my approach can work with even less overhead: there are fewer branches due to checking the previous state.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
By that argument, we're doomed. Non-IST exceptions outside swapgs are fatal.
Does that concern only
error_entry()exceptions?Yes, but the set of
paranoid_entryexceptions is shrinking. In -tip, there are:NMI: NMI is special and will call
rcu_nmi_enter(). Nothing's changing here.
Quoted 8 lines
MCE: Once upon a time, MCE was simply buggy. As of 4.0 (IIRC) MCE from kernel mode calls
rcu_nmi_enter().BP: This is going away, I think. #BP should stop being special by 4.4.
DB: That's the only weird case. Patches to prevent instruction breakpoints in entry code are already in -tip. The only thing left is kernel watchpoints, and we need to do something about that.
So now we can't set a breakpoint on syscall entry anymore?
I'm still nervous with all that.
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 14 lines · Frederic Weisbecker
Quoted 13 lines · Andy Lutomirski
Quoted 11 lines · Frederic Weisbecker
Right, and doing it the way we did previously was safe wrt. that.
Can't we have exceptions slow path just like the way we do it in syscalls?
Then the exception slow path would just do:
if
TIF_NOHZ
ctx =exception_enter()
exception_handler()
ifTIF_NOHZ
exception_exit(ctx)
Quoted 8 lines
Quoted 4 lines
What's the purpose of
TIF_NOHZright now? For syscalls, it makes sense, but is there any case in whichTIF_NOHZis set on one CPU but not on another CPU? It might make sense to get the performance back using static keys instead ofTIF_NOHZ.Sure if we can manage to do that. The nice thing about TIF flags is that they are a single check that is always there.
True, although my patch loses that benefit for the fast compat entries due to the syscall arg fault stuff (what a mess!).
Quoted 11 lines
Quoted 8 lines
If we switched back to
exception_enter, we'd have to remember the previous state, and, with a single exception right now, I think that's unnecessary.I think there are only three states we can be in at exception entry:
user (anduser_mode(regs)), kernel (andkernel_mode(regs)), or NMI-like.But we can have user && (!user_mode(regs)) if exception happens on exception entry code.
I sure hope not, unless it nests inside an NMI-like thing. It's conceivable that this might happen due to perf NMIs causing a failed MSR read or similar. We might need to relax the assertions to check that we're either in kernel or NMI context. If so, that's straightforward. Meanwhile no one has reported this happening.
Quoted 21 lines
Quoted 9 lines
In the user case, the new code is correct. In the kernel case, the new code is also correct. In the NMI case (if we're nested in an NMI or similar entry)) then it is and was the responsibility of the NMI-like entry to call
rcu_nmi_enter(), and things that nest inside that shouldn't touch context tracking (with the possible exception of callingrcu_nmi_enter()again).In current -tip, there's a slight hole in this due to syscalls, and I'll fix it.
There must be a check for context tracking enabled anyway. So why can't we just just do in exception entry code:
if (exception_slow_path()) { exception_enter() exception_handler() exception_exit() } else { normal stuff }
Quoted 2 lines
Especially if we can manage to implement static keys in ASM, this will sum up to a single one.
There isn't really an exception slow path. There's already a branch for user vs kernel (in the CPL sense), and with my patches, there's no additional branch for previous context tracking state.
Quoted 29 lines
Quoted 29 lines
Quoted 8 lines
Quoted 5 lines
The latter is annoying, but the entry code needs to deal with it anyway. For example, any exception early in NMI is currently really bad. Non-IST exceptions very early in SYSCALL are fatal. Non-paranoid exceptions outside swapgs are fatal. Etc.
Sure but that doesn't mean I'm happy with introducing new fragile path like those. Especially as we have a way to fix without more overhead.
I think my approach can work with even less overhead: there are fewer branches due to checking the previous state.
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines
Also as long as there is at least one instruction between entry to the kernel and context tracking noting it, there is a risk for an exception. Hence entry code will never be atomic enough to avoid this kind of bugs.
By that argument, we're doomed. Non-IST exceptions outside swapgs are fatal.
Does that concern only
error_entry()exceptions?Yes, but the set of
paranoid_entryexceptions is shrinking. In -tip, there are:NMI: NMI is special and will call
rcu_nmi_enter(). Nothing's changing here.MCE: Once upon a time, MCE was simply buggy. As of 4.0 (IIRC) MCE from kernel mode calls
rcu_nmi_enter().BP: This is going away, I think. #BP should stop being special by 4.4.
Quoted 7 lines
Quoted 3 lines
DB: That's the only weird case. Patches to prevent instruction breakpoints in entry code are already in -tip. The only thing left is kernel watchpoints, and we need to do something about that.
So now we can't set a breakpoint on syscall entry anymore?
I'm still nervous with all that.
We haven't done anything that would make breakpoints on syscall entry less safe than they were, but we now disallow the breakpoints. In the future, we might take advantage of that change.
Signature · 2 lines
Andy Lutomirski AMA Capital Management, LLC
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 9 lines · Andy Lutomirski
Quoted 8 lines · Frederic Weisbecker
Quoted 7 lines
If we switched back to
exception_enter, we'd have to remember the previous state, and, with a single exception right now, I think that's unnecessary.I think there are only three states we can be in at exception entry:
user (anduser_mode(regs)), kernel (andkernel_mode(regs)), or NMI-like.
Quoted 8 lines
Quoted 2 lines
But we can have user && (!user_mode(regs)) if exception happens on exception entry code.
I sure hope not, unless it nests inside an NMI-like thing. It's conceivable that this might happen due to perf NMIs causing a failed MSR read or similar. We might need to relax the assertions to check that we're either in kernel or NMI context. If so, that's straightforward. Meanwhile no one has reported this happening.
But we can still have #DB on entry code right? We blocked breakpoints on entry code (I still don't get why and it looks to me like an overkill) but we still have watchpoints.
Quoted 22 lines
Quoted 22 lines
Quoted 10 lines
In the user case, the new code is correct. In the kernel case, the new code is also correct. In the NMI case (if we're nested in an NMI or similar entry)) then it is and was the responsibility of the NMI-like entry to call
rcu_nmi_enter(), and things that nest inside that shouldn't touch context tracking (with the possible exception of callingrcu_nmi_enter()again).In current -tip, there's a slight hole in this due to syscalls, and I'll fix it.
There must be a check for context tracking enabled anyway. So why can't we just just do in exception entry code:
if (exception_slow_path()) { exception_enter() exception_handler() exception_exit() } else { normal stuff }
Quoted 6 lines
Quoted 2 lines
Especially if we can manage to implement static keys in ASM, this will sum up to a single one.
There isn't really an exception slow path. There's already a branch for user vs kernel (in the CPL sense), and with my patches, there's no additional branch for previous context tracking state.
But an exception slow path based on static key would the most lightweight thing for context tracking off-case (which is 99.9999% of usecases) and we would keep it robust (ie: no need to enumerate all the fragile non-possibility for an exception in entry code to get it safe).
Quoted 7 lines
Quoted 3 lines
So now we can't set a breakpoint on syscall entry anymore?
I'm still nervous with all that.
We haven't done anything that would make breakpoints on syscall entry less safe than they were, but we now disallow the breakpoints. In the future, we might take advantage of that change.
I still don't get the reason of that.
Re: [tip:x86/asm] x86/asm/entry/64: Migrate error and IRQ exit work to C and remove old assembly code
Quoted 11 lines · Frederic Weisbecker
Quoted 6 lines · Andy Lutomirski
I sure hope not, unless it nests inside an NMI-like thing. It's conceivable that this might happen due to perf NMIs causing a failed MSR read or similar. We might need to relax the assertions to check that we're either in kernel or NMI context. If so, that's straightforward. Meanwhile no one has reported this happening.
But we can still have #DB on entry code right? We blocked breakpoints on entry code (I still don't get why and it looks to me like an overkill) but we still have watchpoints.
The actual reason is buried in the many threads about NMIs. Basically, we want to start using RET to return from exceptions to contexts with IF=0, but we can't do that if we need RF to work correctly, and we need RF to work correctly if we allow breakpoints in entry asm (otherwise we risk random infinite loops). So we're disallowing breakpoints in entry asm.
Quoted 5 lines
But an exception slow path based on static key would the most lightweight thing for context tracking off-case (which is 99.9999% of usecases) and we would keep it robust (ie: no need to enumerate all the fragile non-possibility for an exception in entry code to get it safe).
IRQs work more or less like this in -tip (restructured, but this gets the gist):
if (user_mode(regs)) {
swapgs;
enter_from_user_mode;
do_IRQ;
prepare_exit_to_usermode;
swapgs;
iret;
} else {
do_IRQ;
check for preemption;
iret;
}
In 4.2 and before, the enter_from_user_mode wasn't there, and instead of calling prepare_exit_to_usermode in a known context (CONTEXT_KERNEL), we went through the maze of retint_user in an unknown context. That meant that we needed things like SCHEDULE_USER (which had a bug at some point), do_notify_resume (probably had tons of bugs), etc, and somehow we still needed to end up in CONTEXT_USER at the end.
I think the new state of affairs is much nicer. It means that we finally actually know what state we're in throughout the entry asm. The only real downsides that I can see are:
1. There's an unnecessary pair of branches due to rcu_irq_enter and rcu_irq_exit when an IRQ hits user mode.
2. If user_exit is indeed much more expensive than rcu_irq_enter, then we pay that cost.
If you have suggestions for how to make this faster without making it uglier, please let me know. :)
--Andy
Re: [PATCH v5 08/17] x86/entry: Add enter_from_user_mode and use it in syscalls
In reply to Andy LutomirskiQuoted 10 lines · Andy Lutomirski
Changing the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in
CONTEXT_USERwhen we enter from user mode and wire it up for syscall entries.Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
Quoted 6 lines
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if
CONFIG_CONTEXT_TRACING(adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler thanuser_exit), which will enable us to get rid of the extra call.
Hey Andy,
I see the following warning in today's -next:
[ 2162.706868] ------------[ cut here ]------------ [ 2162.708021] WARNING: CPU: 4 PID: 28801 at arch/x86/entry/common.c:44 enter_from_user_mode+0x1c/0x50() [ 2162.709466] Modules linked in: [ 2162.709998] CPU: 4 PID: 28801 Comm: trinity-c375 Tainted: G B 4.4.0-rc5-next-20151221-sasha-00020-g840272e-dirty #2753 [ 2162.711847] 0000000000000000 00000000f17e6fcd ffff880292d5fe08 ffffffffa4045334 [ 2162.713108] 0000000041b58ab3 ffffffffaf66686b ffffffffa4045289 ffff880292d5fdc0 [ 2162.714544] 0000000000000000 00000000f17e6fcd ffffffffa23cf466 0000000000000004 [ 2162.715793] Call Trace: [ 2162.716229] dump_stack (lib/dump_stack.c:52) [ 2162.719021] warn_slowpath_common (kernel/panic.c:484) [ 2162.721014] warn_slowpath_null (kernel/panic.c:518) [ 2162.721950] enter_from_user_mode (arch/x86/entry/common.c:44 (discriminator 7) include/linux/context_tracking_state.h:30 (discriminator 7) include/linux/context_tracking.h:30 (discriminator 7) arch/x86/entry/common.c:45 (discriminator 7)) [ 2162.722911] syscall_trace_enter_phase1 (arch/x86/entry/common.c:94) [ 2162.726914] tracesys (arch/x86/entry/entry_64.S:241) [ 2162.727704] ---[ end trace 1e5b49c361cbfe8b ]--- [ 2162.728468] BUG: scheduling while atomic: trinity-c375/28801/0x00000401 [ 2162.729517] Modules linked in: [ 2162.730020] Preemption disabled param_attr_store (kernel/params.c:625) [ 2162.731304] [ 2162.731579] CPU: 4 PID: 28801 Comm: trinity-c375 Tainted: G B W 4.4.0-rc5-next-20151221-sasha-00020-g840272e-dirty #2753 [ 2162.733432] 0000000000000000 00000000f17e6fcd ffff880292d5fe20 ffffffffa4045334 [ 2162.734778] 0000000041b58ab3 ffffffffaf66686b ffffffffa4045289 ffff880292d5fde0 [ 2162.736036] fffffffface198f9 00000000f17e6fcd ffff880292d5fe50 0000000000000282 [ 2162.737309] Call Trace: [ 2162.737718] dump_stack (lib/dump_stack.c:52) [ 2162.740566] __schedule_bug (kernel/sched/core.c:3102) [ 2162.741498] __schedule (./arch/x86/include/asm/preempt.h:27 kernel/sched/core.c:3116 kernel/sched/core.c:3225) [ 2162.742391] schedule (kernel/sched/core.c:3312 (discriminator 1)) [ 2162.743221] exit_to_usermode_loop (arch/x86/entry/common.c:246) [ 2162.744331] syscall_return_slowpath (arch/x86/entry/common.c:282 include/linux/context_tracking_state.h:30 include/linux/context_tracking.h:24 arch/x86/entry/common.c:284 arch/x86/entry/common.c:344) [ 2162.745364] int_ret_from_sys_call (arch/x86/entry/entry_64.S:282)
Thanks,
Sasha
Re: [PATCH v5 08/17] x86/entry: Add enter_from_user_mode and use it in syscalls
Quoted 18 lines · Sasha Levin
Quoted 10 lines · Andy Lutomirski
Changing the x86 context tracking hooks is dangerous because there are no good checks that we track our context correctly. Add a helper to check that we're actually in
CONTEXT_USERwhen we enter from user mode and wire it up for syscall entries.Subsequent patches will wire this up for all non-NMI entries as well. NMIs are their own special beast and cannot currently switch overall context tracking state. Instead, they have their own special RCU hooks.
Quoted 6 lines
This is a tiny speedup if !CONFIG_CONTEXT_TRACKING (removes a branch) and a tiny slowdown if
CONFIG_CONTEXT_TRACING(adds a layer of indirection). Eventually, we should fix up the core context tracking code to supply a function that does what we want (and can be much simpler thanuser_exit), which will enable us to get rid of the extra call.
Quoted 3 lines
Hey Andy,
I see the following warning in today's -next:
Weird. I wonder if you might have hit this while switching context tracking on a runtime. (Can you even do that?)
--Andy
Quoted 36 lines
[ 2162.706868] ------------[ cut here ]------------ [ 2162.708021] WARNING: CPU: 4 PID: 28801 at arch/x86/entry/common.c:44 enter_from_user_mode+0x1c/0x50() [ 2162.709466] Modules linked in: [ 2162.709998] CPU: 4 PID: 28801 Comm: trinity-c375 Tainted: G B 4.4.0-rc5-next-20151221-sasha-00020-g840272e-dirty #2753 [ 2162.711847] 0000000000000000 00000000f17e6fcd ffff880292d5fe08 ffffffffa4045334 [ 2162.713108] 0000000041b58ab3 ffffffffaf66686b ffffffffa4045289 ffff880292d5fdc0 [ 2162.714544] 0000000000000000 00000000f17e6fcd ffffffffa23cf466 0000000000000004 [ 2162.715793] Call Trace: [ 2162.716229] dump_stack (lib/dump_stack.c:52) [ 2162.719021] warn_slowpath_common (kernel/panic.c:484) [ 2162.721014] warn_slowpath_null (kernel/panic.c:518) [ 2162.721950] enter_from_user_mode (arch/x86/entry/common.c:44 (discriminator 7) include/linux/context_tracking_state.h:30 (discriminator 7) include/linux/context_tracking.h:30 (discriminator 7) arch/x86/entry/common.c:45 (discriminator 7)) [ 2162.722911] syscall_trace_enter_phase1 (arch/x86/entry/common.c:94) [ 2162.726914] tracesys (arch/x86/entry/entry_64.S:241) [ 2162.727704] ---[ end trace 1e5b49c361cbfe8b ]--- [ 2162.728468] BUG: scheduling while atomic: trinity-c375/28801/0x00000401 [ 2162.729517] Modules linked in: [ 2162.730020] Preemption disabled param_attr_store (kernel/params.c:625) [ 2162.731304] [ 2162.731579] CPU: 4 PID: 28801 Comm: trinity-c375 Tainted: G B W 4.4.0-rc5-next-20151221-sasha-00020-g840272e-dirty #2753 [ 2162.733432] 0000000000000000 00000000f17e6fcd ffff880292d5fe20 ffffffffa4045334 [ 2162.734778] 0000000041b58ab3 ffffffffaf66686b ffffffffa4045289 ffff880292d5fde0 [ 2162.736036] fffffffface198f9 00000000f17e6fcd ffff880292d5fe50 0000000000000282 [ 2162.737309] Call Trace: [ 2162.737718] dump_stack (lib/dump_stack.c:52) [ 2162.740566] __schedule_bug (kernel/sched/core.c:3102) [ 2162.741498] __schedule (./arch/x86/include/asm/preempt.h:27 kernel/sched/core.c:3116 kernel/sched/core.c:3225) [ 2162.742391] schedule (kernel/sched/core.c:3312 (discriminator 1)) [ 2162.743221] exit_to_usermode_loop (arch/x86/entry/common.c:246) [ 2162.744331] syscall_return_slowpath (arch/x86/entry/common.c:282 include/linux/context_tracking_state.h:30 include/linux/context_tracking.h:24 arch/x86/entry/common.c:284 arch/x86/entry/common.c:344) [ 2162.745364] int_ret_from_sys_call (arch/x86/entry/entry_64.S:282)Thanks,
Sasha
Signature · 2 lines
Andy Lutomirski AMA Capital Management, LLC