lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <207acd23-4acb-3fd1-7c92-9f48c79fa059@oracle.com>
Date:   Thu, 7 May 2020 15:55:40 +0200
From:   Alexandre Chartre <alexandre.chartre@...cle.com>
To:     Thomas Gleixner <tglx@...utronix.de>,
        LKML <linux-kernel@...r.kernel.org>
Cc:     x86@...nel.org, "Paul E. McKenney" <paulmck@...nel.org>,
        Andy Lutomirski <luto@...nel.org>,
        Frederic Weisbecker <frederic@...nel.org>,
        Paolo Bonzini <pbonzini@...hat.com>,
        Sean Christopherson <sean.j.christopherson@...el.com>,
        Masami Hiramatsu <mhiramat@...nel.org>,
        Petr Mladek <pmladek@...e.com>,
        Steven Rostedt <rostedt@...dmis.org>,
        Joel Fernandes <joel@...lfernandes.org>,
        Boris Ostrovsky <boris.ostrovsky@...cle.com>,
        Juergen Gross <jgross@...e.com>,
        Brian Gerst <brgerst@...il.com>,
        Mathieu Desnoyers <mathieu.desnoyers@...icios.com>,
        Josh Poimboeuf <jpoimboe@...hat.com>,
        Will Deacon <will@...nel.org>
Subject: Re: [patch V4 part 2 05/18] x86/entry: Move irq tracing on syscall
 entry to C-code


On 5/5/20 3:41 PM, Thomas Gleixner wrote:
> Now that the C entry points are safe, move the irq flags tracing code into
> the entry helper:
> 
>      - Invoke lockdep before calling into context tracking
> 
>      - Use the safe trace_hardirqs_on_prepare() trace function after context
>        tracking established state and RCU is watching.
> 
> Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
> ---
>   arch/x86/entry/common.c          |   21 +++++++++++++++++++--
>   arch/x86/entry/entry_32.S        |   12 ------------
>   arch/x86/entry/entry_64.S        |    2 --
>   arch/x86/entry/entry_64_compat.S |   18 ------------------
>   4 files changed, 19 insertions(+), 34 deletions(-)
> 
> --- a/arch/x86/entry/common.c
> +++ b/arch/x86/entry/common.c
> @@ -40,19 +40,36 @@
>   #include <trace/events/syscalls.h>
>   
>   #ifdef CONFIG_CONTEXT_TRACKING
> -/* Called on entry from user mode with IRQs off. */
> +/**
> + * enter_from_user_mode - Establish state when coming from user mode
> + *
> + * Syscall entry disables interrupts, but user mode is traced as interrupts
> + * enabled. Also with NO_HZ_FULL RCU might be idle.
> + *
> + * 1) Tell lockdep that interrupts are disabled
> + * 2) Invoke context tracking if enabled to reactivate RCU
> + * 3) Trace interrupts off state
> + */
>   __visible noinstr void enter_from_user_mode(void)
>   {
>   	enum ctx_state state = ct_state();
>   
> +	lockdep_hardirqs_off(CALLER_ADDR0);
>   	user_exit_irqoff();
>   
>   	instr_begin();
>   	CT_WARN_ON(state != CONTEXT_USER);
> +	trace_hardirqs_off_prepare();
>   	instr_end();
>   }
>   #else
> -static inline void enter_from_user_mode(void) {}
> +static __always_inline void enter_from_user_mode(void)
> +{
> +	lockdep_hardirqs_off(CALLER_ADDR0);
> +	instr_begin();
> +	trace_hardirqs_off_prepare();
> +	instr_end();
> +}
>   #endif
>   
>   static noinstr void exit_to_user_mode(void)
> --- a/arch/x86/entry/entry_32.S
> +++ b/arch/x86/entry/entry_32.S
> @@ -967,12 +967,6 @@ SYM_FUNC_START(entry_SYSENTER_32)
>   	jnz	.Lsysenter_fix_flags
>   .Lsysenter_flags_fixed:
>   
> -	/*
> -	 * User mode is traced as though IRQs are on, and SYSENTER
> -	 * turned them off.
> -	 */
> -	TRACE_IRQS_OFF
> -
>   	movl	%esp, %eax
>   	call	do_fast_syscall_32
>   	/* XEN PV guests always use IRET path */
> @@ -1082,12 +1076,6 @@ SYM_FUNC_START(entry_INT80_32)
>   
>   	SAVE_ALL pt_regs_ax=$-ENOSYS switch_stacks=1	/* save rest */
>   
> -	/*
> -	 * User mode is traced as though IRQs are on, and the interrupt gate
> -	 * turned them off.
> -	 */
> -	TRACE_IRQS_OFF
> -
>   	movl	%esp, %eax
>   	call	do_int80_syscall_32
>   .Lsyscall_32_done:
> --- a/arch/x86/entry/entry_64.S
> +++ b/arch/x86/entry/entry_64.S
> @@ -167,8 +167,6 @@ SYM_INNER_LABEL(entry_SYSCALL_64_after_h
>   
>   	PUSH_AND_CLEAR_REGS rax=$-ENOSYS
>   
> -	TRACE_IRQS_OFF
> -
>   	/* IRQs are off. */
>   	movq	%rax, %rdi
>   	movq	%rsp, %rsi
> --- a/arch/x86/entry/entry_64_compat.S
> +++ b/arch/x86/entry/entry_64_compat.S
> @@ -129,12 +129,6 @@ SYM_FUNC_START(entry_SYSENTER_compat)
>   	jnz	.Lsysenter_fix_flags
>   .Lsysenter_flags_fixed:
>   
> -	/*
> -	 * User mode is traced as though IRQs are on, and SYSENTER
> -	 * turned them off.
> -	 */
> -	TRACE_IRQS_OFF
> -
>   	movq	%rsp, %rdi
>   	call	do_fast_syscall_32
>   	/* XEN PV guests always use IRET path */
> @@ -247,12 +241,6 @@ SYM_INNER_LABEL(entry_SYSCALL_compat_aft
>   	pushq   $0			/* pt_regs->r15 = 0 */
>   	xorl	%r15d, %r15d		/* nospec   r15 */
>   
> -	/*
> -	 * User mode is traced as though IRQs are on, and SYSENTER
> -	 * turned them off.
> -	 */
> -	TRACE_IRQS_OFF
> -
>   	movq	%rsp, %rdi
>   	call	do_fast_syscall_32
>   	/* XEN PV guests always use IRET path */
> @@ -403,12 +391,6 @@ SYM_CODE_START(entry_INT80_compat)
>   	xorl	%r15d, %r15d		/* nospec   r15 */
>   	cld
>   
> -	/*
> -	 * User mode is traced as though IRQs are on, and the interrupt
> -	 * gate turned them off.
> -	 */
> -	TRACE_IRQS_OFF
> -
>   	movq	%rsp, %rdi
>   	call	do_int80_syscall_32
>   .Lsyscall_32_done:
> 

enter_from_user_mode() is also called with the CALL_enter_from_user_mode macro,
which is used in interrupt_entry() and identry. Don't you need to also remove
the TRACE_IRQS_OFF there now?

alex.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ