From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9302CC43219 for ; Wed, 1 May 2019 01:35:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6742821743 for ; Wed, 1 May 2019 01:35:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727430AbfEABfY (ORCPT ); Tue, 30 Apr 2019 21:35:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:57002 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726115AbfEABfX (ORCPT ); Tue, 30 Apr 2019 21:35:23 -0400 Received: from oasis.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EC08A21734; Wed, 1 May 2019 01:35:19 +0000 (UTC) Date: Tue, 30 Apr 2019 21:35:17 -0400 From: Steven Rostedt To: Linus Torvalds Cc: Andy Lutomirski , Peter Zijlstra , Nicolai Stange , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , "the arch/x86 maintainers" , Josh Poimboeuf , Jiri Kosina , Miroslav Benes , Petr Mladek , Joe Lawrence , Shuah Khan , Konrad Rzeszutek Wilk , Tim Chen , Sebastian Andrzej Siewior , Mimi Zohar , Juergen Gross , Nick Desaulniers , Nayna Jain , Masahiro Yamada , Joerg Roedel , Linux List Kernel Mailing , live-patching@vger.kernel.org, "open list:KERNEL SELFTEST FRAMEWORK" Subject: Re: [RFC][PATCH v2] ftrace/x86: Emulate call function while updating in breakpoint handler Message-ID: <20190430213517.7bcfaf8e@oasis.local.home> In-Reply-To: <20190430175334.423821c0@gandalf.local.home> References: <20190428133826.3e142cfd@oasis.local.home> <20190430135602.GD2589@hirez.programming.kicks-ass.net> <20190430130359.330e895b@gandalf.local.home> <20190430132024.0f03f5b8@gandalf.local.home> <20190430134913.4e29ce72@gandalf.local.home> <20190430175334.423821c0@gandalf.local.home> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 30 Apr 2019 17:53:34 -0400 Steven Rostedt wrote: > + if (ftrace_location(ip)) { > + /* A breakpoint at the beginning of the function was hit */ > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_irqoff; > + /* Tell lockdep here we are enabling interrupts */ > + trace_hardirqs_on(); This isn't good enough. The return from interrupt does call lockdep saying interrupts are disabled. Need to add the lockdep tracking in the asm as well. Probably easier to move it from inline asm to ftrace_X.S and use the lockdep TRACE_ON/OFF macros. -- Steve > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_irqon; > + } > + return 1; > + } else if (is_ftrace_caller(ip)) { > + /* An ftrace trampoline is being updated */ > + if (!ftrace_update_func_call) { > + /* If it's a jump, just need to skip it */ > + regs->ip += MCOUNT_INSN_SIZE -1; > + return 1; > + } > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_update_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqoff; > + trace_hardirqs_on(); > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqon; > + } > + return 1; > + } > > - return 1; > + return 0; > } From mboxrd@z Thu Jan 1 00:00:00 1970 From: rostedt at goodmis.org (Steven Rostedt) Date: Tue, 30 Apr 2019 21:35:17 -0400 Subject: [RFC][PATCH v2] ftrace/x86: Emulate call function while updating in breakpoint handler In-Reply-To: <20190430175334.423821c0@gandalf.local.home> References: <20190428133826.3e142cfd@oasis.local.home> <20190430135602.GD2589@hirez.programming.kicks-ass.net> <20190430130359.330e895b@gandalf.local.home> <20190430132024.0f03f5b8@gandalf.local.home> <20190430134913.4e29ce72@gandalf.local.home> <20190430175334.423821c0@gandalf.local.home> Message-ID: <20190430213517.7bcfaf8e@oasis.local.home> On Tue, 30 Apr 2019 17:53:34 -0400 Steven Rostedt wrote: > + if (ftrace_location(ip)) { > + /* A breakpoint at the beginning of the function was hit */ > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_irqoff; > + /* Tell lockdep here we are enabling interrupts */ > + trace_hardirqs_on(); This isn't good enough. The return from interrupt does call lockdep saying interrupts are disabled. Need to add the lockdep tracking in the asm as well. Probably easier to move it from inline asm to ftrace_X.S and use the lockdep TRACE_ON/OFF macros. -- Steve > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_irqon; > + } > + return 1; > + } else if (is_ftrace_caller(ip)) { > + /* An ftrace trampoline is being updated */ > + if (!ftrace_update_func_call) { > + /* If it's a jump, just need to skip it */ > + regs->ip += MCOUNT_INSN_SIZE -1; > + return 1; > + } > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_update_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqoff; > + trace_hardirqs_on(); > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqon; > + } > + return 1; > + } > > - return 1; > + return 0; > } From mboxrd@z Thu Jan 1 00:00:00 1970 From: rostedt@goodmis.org (Steven Rostedt) Date: Tue, 30 Apr 2019 21:35:17 -0400 Subject: [RFC][PATCH v2] ftrace/x86: Emulate call function while updating in breakpoint handler In-Reply-To: <20190430175334.423821c0@gandalf.local.home> References: <20190428133826.3e142cfd@oasis.local.home> <20190430135602.GD2589@hirez.programming.kicks-ass.net> <20190430130359.330e895b@gandalf.local.home> <20190430132024.0f03f5b8@gandalf.local.home> <20190430134913.4e29ce72@gandalf.local.home> <20190430175334.423821c0@gandalf.local.home> Message-ID: <20190430213517.7bcfaf8e@oasis.local.home> Content-Type: text/plain; charset="UTF-8" Message-ID: <20190501013517.u9c6DZQwv83J27e39rTpS1ANr9IhNhQBgRubeuo3Ex8@z> On Tue, 30 Apr 2019 17:53:34 -0400 Steven Rostedt wrote: > + if (ftrace_location(ip)) { > + /* A breakpoint at the beginning of the function was hit */ > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_irqoff; > + /* Tell lockdep here we are enabling interrupts */ > + trace_hardirqs_on(); This isn't good enough. The return from interrupt does call lockdep saying interrupts are disabled. Need to add the lockdep tracking in the asm as well. Probably easier to move it from inline asm to ftrace_X.S and use the lockdep TRACE_ON/OFF macros. -- Steve > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_irqon; > + } > + return 1; > + } else if (is_ftrace_caller(ip)) { > + /* An ftrace trampoline is being updated */ > + if (!ftrace_update_func_call) { > + /* If it's a jump, just need to skip it */ > + regs->ip += MCOUNT_INSN_SIZE -1; > + return 1; > + } > + if (in_nmi()) { > + /* NMIs have their own trampoline */ > + this_cpu_write(ftrace_bp_call_nmi_return, (void *)ip + MCOUNT_INSN_SIZE); > + regs->ip = (unsigned long) ftrace_emulate_call_update_nmi; > + return 1; > + } > + this_cpu_write(ftrace_bp_call_return, (void *)ip + MCOUNT_INSN_SIZE); > + if (regs->flags & X86_EFLAGS_IF) { > + regs->flags &= ~X86_EFLAGS_IF; > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqoff; > + trace_hardirqs_on(); > + } else { > + regs->ip = (unsigned long) ftrace_emulate_call_update_irqon; > + } > + return 1; > + } > > - return 1; > + return 0; > }