Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752080AbcDBSwg (ORCPT ); Sat, 2 Apr 2016 14:52:36 -0400 Received: from mail.skyhub.de ([78.46.96.112]:48903 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751660AbcDBSwe (ORCPT ); Sat, 2 Apr 2016 14:52:34 -0400 Date: Sat, 2 Apr 2016 20:52:27 +0200 From: Borislav Petkov To: Andy Lutomirski Cc: X86 ML , Paolo Bonzini , Peter Zijlstra , KVM list , Arjan van de Ven , xen-devel , linux-kernel@vger.kernel.org, Linus Torvalds , Andrew Morton Subject: Re: [PATCH v5 4/9] x86/traps: Enable all exception handler callbacks early Message-ID: <20160402185227.GB2538@pd.tnic> References: <20fc047d926150cb08cb9b9f2923519b07ec1a15.1459605520.git.luto@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20fc047d926150cb08cb9b9f2923519b07ec1a15.1459605520.git.luto@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2273 Lines: 79 On Sat, Apr 02, 2016 at 07:01:35AM -0700, Andy Lutomirski wrote: > Now that early_fixup_exception has pt_regs, we can just call > fixup_exception from it. This will make fancy exception handlers > work early. > > Signed-off-by: Andy Lutomirski > --- > arch/x86/mm/extable.c | 19 ++----------------- > 1 file changed, 2 insertions(+), 17 deletions(-) > > diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c > index 8997022abebc..50dfe438bd91 100644 > --- a/arch/x86/mm/extable.c > +++ b/arch/x86/mm/extable.c > @@ -95,10 +95,6 @@ extern unsigned int early_recursion_flag; > /* Restricted version used during very early boot */ > void __init early_fixup_exception(struct pt_regs *regs, int trapnr) > { > - const struct exception_table_entry *e; > - unsigned long new_ip; > - ex_handler_t handler; > - > /* Ignore early NMIs. */ > if (trapnr == X86_TRAP_NMI) > return; > @@ -109,19 +105,8 @@ void __init early_fixup_exception(struct pt_regs *regs, int trapnr) > if (regs->cs != __KERNEL_CS) > goto fail; > > - e = search_exception_tables(regs->ip); > - if (!e) > - goto fail; > - > - new_ip = ex_fixup_addr(e); > - handler = ex_fixup_handler(e); > - > - /* special handling not supported during early boot */ > - if (handler != ex_handler_default) > - goto fail; Hold on, what happened to the uaccess handling not being supported during early boot? So before Tony changed it, the original code had: /* Restricted version used during very early boot */ int __init early_fixup_exception(unsigned long *ip) { ... - if (fixup->fixup - fixup->insn >= 0x7ffffff0 - 4) { - /* uaccess handling not supported during early boot */ - return 0; - } I'm guessing that wasn't supported early, probably because some stuff wasn't initialized yet. Our normal, late fixup is by doing: current_thread_info()->uaccess_err = 1; and I'm assuming we can't do that early. current_thread_info is probably not setup yet... > - > - regs->ip = new_ip; > - return; > + if (fixup_exception(regs, trapnr)) > + return; So why can we do it now, all of a sudden? /me is scratching head. -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply.