Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1813110pxk; Fri, 2 Oct 2020 21:55:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzvEpn4FoYkOxHwEz+TIOEbnMujU/6xPqfxFZenj5DOzTPqoWadBAfb6h17FJFq9qOgCe8T X-Received: by 2002:a17:906:9941:: with SMTP id zm1mr5122214ejb.288.1601700912622; Fri, 02 Oct 2020 21:55:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601700912; cv=none; d=google.com; s=arc-20160816; b=vsUl3IcJIi+UZfpe8enGUdppiyeppUuFLxyc3Md8XtXzXXDhCx8GmiIMxp8Up1TUOU 3r8gX87ZIEe9gNqzXs8BpindLc1wunFhkeI+ImTb19soakGmn69Gnrj8cV0upARaKXD0 zVyKJFuEJhzQwMMEU0/cMUJuTel7gJChMynCmHfuvQ4wNg6Fg6U49W4XfXLveJnLwHrQ qL/kEV7ID5h8F8ZkQzxJQ8BVhCNt0sZPBA3FEQsDnKxfBFEKrCFE282rFfi83utKw54I g6kJcxbWdewAOCPfbLhArC6d+TWRF6eSUuF6iC3kbgJRH+EddxyJmLnXjX365hZ2J2FE RKkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=eApaqNIKv29khrie85q/cjagTYlFu0Jq0ocs3l/RwXI=; b=VIed6SX8yUBu//OyW9c/dQofxB8PxH8nNq1S3QvyUp9E4s0G+KCpKmIKhJ4mkZpeOg j2PTim856k4oHXGad87jX5AcOWM7NWNGWVx1+6J1MpzOQuSK9em2FgjDOfMuh0o1wVTo ByGPaZw/tZP/cWX3s9r4AttOMa3kNweovOYoocC9lGbWwlYJn0OhonodHRvj1CrynqCD 82DMREXZJrNsb66dXdD5gC9zJsnWyVSyc+EE9O1v5QOOMcuwdfBxmPN/TGnyGsfGU4Hd B4YcIZPyYZL84BeVMtqd3Y0pHscIiA6hFkg2Svap6wuy5W7cC3oQtXiRHfW5BVJe3+J3 Cb2w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cx10si2650994edb.135.2020.10.02.21.54.50; Fri, 02 Oct 2020 21:55:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726036AbgJCEwW (ORCPT + 99 others); Sat, 3 Oct 2020 00:52:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:52938 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725816AbgJCEvw (ORCPT ); Sat, 3 Oct 2020 00:51:52 -0400 Received: from localhost (83-245-197-237.elisa-laajakaista.fi [83.245.197.237]) (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 698792311A; Sat, 3 Oct 2020 04:51:50 +0000 (UTC) From: Jarkko Sakkinen To: x86@kernel.org, linux-sgx@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Sean Christopherson , Andy Lutomirski , Jethro Beekman , Jarkko Sakkinen , akpm@linux-foundation.org, andriy.shevchenko@linux.intel.com, asapek@google.com, bp@alien8.de, cedric.xing@intel.com, chenalexchen@google.com, conradparker@google.com, cyhanish@google.com, dave.hansen@intel.com, haitao.huang@intel.com, kai.huang@intel.com, kai.svahn@intel.com, kmoy@google.com, ludloff@google.com, luto@kernel.org, nhorman@redhat.com, npmccallum@redhat.com, puiterwijk@redhat.com, rientjes@google.com, tglx@linutronix.de, yaozhangx@google.com, mikko.ylinen@intel.com Subject: [PATCH v39 20/24] x86/traps: Attempt to fixup exceptions in vDSO before signaling Date: Sat, 3 Oct 2020 07:50:55 +0300 Message-Id: <20201003045059.665934-21-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201003045059.665934-1-jarkko.sakkinen@linux.intel.com> References: <20201003045059.665934-1-jarkko.sakkinen@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Christopherson vDSO functions can now leverage an exception fixup mechanism similar to kernel exception fixup. For vDSO exception fixup, the initial user is Intel's Software Guard Extensions (SGX), which will wrap the low-level transitions to/from the enclave, i.e. EENTER and ERESUME instructions, in a vDSO function and leverage fixup to intercept exceptions that would otherwise generate a signal. This allows the vDSO wrapper to return the fault information directly to its caller, obviating the need for SGX applications and libraries to juggle signal handlers. Attempt to fixup vDSO exceptions immediately prior to populating and sending signal information. Except for the delivery mechanism, an exception in a vDSO function should be treated like any other exception in userspace, e.g. any fault that is successfully handled by the kernel should not be directly visible to userspace. Although it's debatable whether or not all exceptions are of interest to enclaves, defer to the vDSO fixup to decide whether to do fixup or generate a signal. Future users of vDSO fixup, if there ever are any, will undoubtedly have different requirements than SGX enclaves, e.g. the fixup vs. signal logic can be made function specific if/when necessary. Suggested-by: Andy Lutomirski Acked-by: Jethro Beekman Signed-off-by: Sean Christopherson Signed-off-by: Jarkko Sakkinen --- arch/x86/kernel/traps.c | 10 ++++++++++ arch/x86/mm/fault.c | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index e2c6fd4dde8e..13dbc59c6bc5 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -60,6 +60,7 @@ #include #include #include +#include #ifdef CONFIG_X86_64 #include @@ -117,6 +118,9 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, const char *str, tsk->thread.error_code = error_code; tsk->thread.trap_nr = trapnr; die(str, regs, error_code); + } else { + if (fixup_vdso_exception(regs, trapnr, error_code, 0)) + return 0; } /* @@ -550,6 +554,9 @@ DEFINE_IDTENTRY_ERRORCODE(exc_general_protection) tsk->thread.error_code = error_code; tsk->thread.trap_nr = X86_TRAP_GP; + if (fixup_vdso_exception(regs, X86_TRAP_GP, error_code, 0)) + return; + show_signal(tsk, SIGSEGV, "", desc, regs, error_code); force_sig(SIGSEGV); goto exit; @@ -1031,6 +1038,9 @@ static void math_error(struct pt_regs *regs, int trapnr) if (!si_code) goto exit; + if (fixup_vdso_exception(regs, trapnr, 0, 0)) + return; + force_sig_fault(SIGFPE, si_code, (void __user *)uprobe_get_trap_addr(regs)); exit: diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 24ab833ede41..bda67aba6553 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -30,6 +30,7 @@ #include /* exception stack */ #include /* VMALLOC_START, ... */ #include /* kvm_handle_async_pf */ +#include /* fixup_vdso_exception() */ #define CREATE_TRACE_POINTS #include @@ -822,6 +823,9 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, sanitize_error_code(address, &error_code); + if (fixup_vdso_exception(regs, X86_TRAP_PF, error_code, address)) + return; + if (likely(show_unhandled_signals)) show_signal_msg(regs, error_code, address, tsk); @@ -941,6 +945,9 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, sanitize_error_code(address, &error_code); + if (fixup_vdso_exception(regs, X86_TRAP_PF, error_code, address)) + return; + set_signal_archinfo(address, error_code); #ifdef CONFIG_MEMORY_FAILURE -- 2.25.1