Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp3600515ybg; Mon, 28 Oct 2019 15:41:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqy+bmGvoYGgRPDywRcQ/+Gq/DnMrm2W4xVkRI2wXf+wK/8/pPdZ8dBVltyj9kEak0zLfdvg X-Received: by 2002:a05:6402:105a:: with SMTP id e26mr21942498edu.229.1572302516204; Mon, 28 Oct 2019 15:41:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572302516; cv=none; d=google.com; s=arc-20160816; b=oSI3ipiyIBEooELUP6k1Tp0IQDUR5kvmh8n8Yn0ImUIiQ0VR/kj2P5hdS9Bc1LNtMM ZJ6JU82ijbdZ8A3s/kp+Tjstp72x2VErV1doxvtt0t7cX+EGnEdEBgRT7wIYpryIE8aO j3Mamf4Mz5uDM9dOhab2WGkvy+Y0dJAdmdiwCYb0Fs9EUT1qaY8wYOstNbJbSwh9qxj5 3qVDfoDgpTEvbBLULV/B26HaazYOVWcOlKlZAjVRZtBZIfmUNEvmAOy+lxxSAyydi8J8 WNpnPkRu8BNIf1aeUTdwgqPZCpCmD/FHtwnawZuEiB97ccik884D5wkOb0NT1iwvZ+wC TW/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=NVCIP2Y0FaP81garcAfyxxfbZUUjykee7L8pT194F60=; b=ZxCy4IVArWVjNljKAv40Oz41EyyPePIx8CiGG8ipBINv6mg4yAn4rFM9pvfQBXfFMx AnFGQjLbjUcgQQyWjKhCxSeeVCe/DPSGdE8GxrMVcREec6A1ZVJXRSpFMuwQ54sQBwHG XkKoGXLuS8uCuf/ULHQhP+BZHazckMFXNBZXJZ3R6yrMEm5MErMZnGF9jVVMnwS7c5WO 6Xme4QsIW0FdHmlIU799CluGkQ0c6R3xSB+W9qCRAZqYn1Qj66UUyCNJkNgTNBa1Q3qL 92DHARJnI16xvBCYt978X0LBIfCfToqrRo805687zYVuwKf0/dpOkBsFYkDnQWVPxFud roOQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id q5si6808887ejb.174.2019.10.28.15.41.32; Mon, 28 Oct 2019 15:41:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S2388943AbfJ1VET (ORCPT + 99 others); Mon, 28 Oct 2019 17:04:19 -0400 Received: from mga11.intel.com ([192.55.52.93]:5917 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388873AbfJ1VES (ORCPT ); Mon, 28 Oct 2019 17:04:18 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Oct 2019 14:04:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,241,1569308400"; d="scan'208";a="224759429" Received: from shrehore-mobl1.ti.intel.com (HELO localhost) ([10.251.82.5]) by fmsmga004.fm.intel.com with ESMTP; 28 Oct 2019 14:04:10 -0700 From: Jarkko Sakkinen To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-sgx@vger.kernel.org Cc: akpm@linux-foundation.org, dave.hansen@intel.com, sean.j.christopherson@intel.com, nhorman@redhat.com, npmccallum@redhat.com, serge.ayoun@intel.com, shay.katz-zamir@intel.com, haitao.huang@intel.com, andriy.shevchenko@linux.intel.com, tglx@linutronix.de, kai.svahn@intel.com, bp@alien8.de, josh@joshtriplett.org, luto@kernel.org, kai.huang@intel.com, rientjes@google.com, cedric.xing@intel.com, puiterwijk@redhat.com, Jarkko Sakkinen Subject: [PATCH v23 04/24] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Date: Mon, 28 Oct 2019 23:03:04 +0200 Message-Id: <20191028210324.12475-5-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191028210324.12475-1-jarkko.sakkinen@linux.intel.com> References: <20191028210324.12475-1-jarkko.sakkinen@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Christopherson Include SGX bit to the PF error codes and throw SIGSEGV with PF_SGX when a #PF with SGX set happens. CPU throws a #PF with the SGX bit in the event of Enclave Page Cache Map (EPCM) conflict. The EPCM is a CPU-internal table, which describes the properties for a enclave page. Enclaves are measured and signed software entities, which SGX hosts. [1] Although the primary purpose of the EPCM conflict checks is to prevent malicious accesses to an enclave, an illegit access can happen also for legit reasons. All SGX reserved memory, including EPCM is encrypted with a transient key that does not survive from the power transition. Throwing a SIGSEGV allows user space software react when this happens (e.g. rec-create the enclave, which was invalidated). [1] Intel SDM: 36.5.1 Enclave Page Cache Map (EPCM) Signed-off-by: Sean Christopherson Signed-off-by: Jarkko Sakkinen --- arch/x86/include/asm/traps.h | 1 + arch/x86/mm/fault.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h index b25e633033c3..81472cae4024 100644 --- a/arch/x86/include/asm/traps.h +++ b/arch/x86/include/asm/traps.h @@ -171,5 +171,6 @@ enum x86_pf_error_code { X86_PF_RSVD = 1 << 3, X86_PF_INSTR = 1 << 4, X86_PF_PK = 1 << 5, + X86_PF_SGX = 1 << 15, }; #endif /* _ASM_X86_TRAPS_H */ diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9ceacd1156db..b1f0060b263f 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -1178,6 +1178,19 @@ access_error(unsigned long error_code, struct vm_area_struct *vma) if (error_code & X86_PF_PK) return 1; + /* + * Access is blocked by the Enclave Page Cache Map (EPCM), i.e. the + * access is allowed by the PTE but not the EPCM. This usually happens + * when the EPCM is yanked out from under us, e.g. by hardware after a + * suspend/resume cycle. In any case, software, i.e. the kernel, can't + * fix the source of the fault as the EPCM can't be directly modified by + * software. Handle the fault as an access error in order to signal + * userspace so that userspace can rebuild their enclave(s), even though + * userspace may not have actually violated access permissions. + */ + if (unlikely(error_code & X86_PF_SGX)) + return 1; + /* * Make sure to check the VMA so that we do not perform * faults just to hit a X86_PF_PK as soon as we fill in a -- 2.20.1