Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp692836ybt; Mon, 6 Jul 2020 20:43:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx0AfxU4lkGSa57bv9a1v7HLhXtpv8jwHxFUgplNLY4Jt2YWIMS7Zn/7I5vprais0+33Ohw X-Received: by 2002:aa7:c808:: with SMTP id a8mr58152499edt.259.1594093417101; Mon, 06 Jul 2020 20:43:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594093417; cv=none; d=google.com; s=arc-20160816; b=WnEeHsQJqVedja6Dl7lzeJ2o1ZYrLCpEjinSoBnc7yfST709mhEcWfXuLX2LNmP7HV lzmMvgd+msCUQDRZU99+JOVRtaBzxSsCUymTNuGK/0H9vxVuHKfgt6IlutaveCZch2xH vkGsd07Pncl70mCDUghEzEjH0D1qrWpOKyuWexwYt7eOP2o+lT126Z2w9N4DPQuBJbrX P80VTZb5DUKzqYwueS87pKyDgKuA10mowj5cj0TAipCeaZYYWLd0lD82516AOO40vDVM liRknzxJSvqlzgJkZ7A3vDnRWgHFTnmYYMO8OwdrPqHJpCAZaE+P3kT9ujGgi67hVREH efwQ== 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 :ironport-sdr:ironport-sdr; bh=uUzhNx5dRPDfl9Tcb2IIwYhCe8HiuH+EwRSHwsveclg=; b=lWNYLZfnI4Ho2c4KS6ichIVvK1YNS85oX409xHMzo7hlXJhs+yPS7unjHX9uuUSx+W ECqPO2YUlTfqntvEtNhBuFUbUadI2GoMekhrjCYzRmZyugL1g8accOGB0/UHtPjCPaJu 7QodIB0+kw2jpVw8QvWA9VD0xkNqHj6SiVp9E/RhePGJgGzfecoe3F0/6QBO9rBF3cDY X6yAFtnBrz9ucxNaiEjGCPoqwjyZyY2wmiuuZAeKEuzQOGk1EPl5fnNFZ2h4MFqSyP8q fPsmiNa0UkwhE0AySjoXBXlKOS7DWL7FGuGecliziIz551ngDh/fv2NIf1qB68c4lAUP jkJg== 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 ss20si13646368ejb.700.2020.07.06.20.43.13; Mon, 06 Jul 2020 20:43:37 -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 S1728128AbgGGDkE (ORCPT + 99 others); Mon, 6 Jul 2020 23:40:04 -0400 Received: from mga07.intel.com ([134.134.136.100]:36383 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727995AbgGGDkE (ORCPT ); Mon, 6 Jul 2020 23:40:04 -0400 IronPort-SDR: hQQYLRByDry7EB+7N0uFc0tpuR1nxeOr7xjPkD81k0Aak5niWMESgi8FpkorFUS+VvoVbJHNgu N+ZtJ7/cljHw== X-IronPort-AV: E=McAfee;i="6000,8403,9674"; a="212506318" X-IronPort-AV: E=Sophos;i="5.75,321,1589266800"; d="scan'208";a="212506318" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2020 20:40:04 -0700 IronPort-SDR: hHcW9QrB98Kv5wQtBy3s1zY0CJGdPoksCXtarw6VJ0Cw6vAcBeGtoUGoJ6N3Kypf4F2Y2jTCCR aH5JPKk0kH4A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,321,1589266800"; d="scan'208";a="427314540" Received: from apiccion-mobl1.ger.corp.intel.com (HELO localhost) ([10.249.45.178]) by orsmga004.jf.intel.com with ESMTP; 06 Jul 2020 20:39:53 -0700 From: Jarkko Sakkinen To: x86@kernel.org, linux-sgx@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Sean Christopherson , linux-mm@kvack.org, Andrew Morton , Matthew Wilcox , Jethro Beekman , Jarkko Sakkinen , 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, josh@joshtriplett.org, 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 Subject: [PATCH v35 10/24] mm: Add vm_ops->mprotect() Date: Tue, 7 Jul 2020 06:37:33 +0300 Message-Id: <20200707033747.142828-11-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200707033747.142828-1-jarkko.sakkinen@linux.intel.com> References: <20200707033747.142828-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 Add vm_ops()->mprotect() for additional constraints for a VMA. Intel Software Guard eXtensions (SGX) will use this callback to add two constraints: 1. Verify that the address range does not have holes: each page address must be filled with an enclave page. 2. Verify that VMA permissions won't surpass the permissions of any enclave page within the address range. Enclave cryptographically sealed permissions for each page address that set the upper limit for possible VMA permissions. Not respecting this can cause #GP's to be emitted. Cc: linux-mm@kvack.org Cc: Andrew Morton Cc: Matthew Wilcox Acked-by: Jethro Beekman Signed-off-by: Sean Christopherson Signed-off-by: Jarkko Sakkinen --- include/linux/mm.h | 2 ++ mm/mprotect.c | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index dc7b87310c10..fc0e3ef28873 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -542,6 +542,8 @@ struct vm_operations_struct { void (*close)(struct vm_area_struct * area); int (*split)(struct vm_area_struct * area, unsigned long addr); int (*mremap)(struct vm_area_struct * area); + int (*mprotect)(struct vm_area_struct *vma, unsigned long start, + unsigned long end, unsigned long prot); vm_fault_t (*fault)(struct vm_fault *vmf); vm_fault_t (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size); diff --git a/mm/mprotect.c b/mm/mprotect.c index ce8b8a5eacbb..e23dfd8d18bc 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -603,13 +603,20 @@ static int do_mprotect_pkey(unsigned long start, size_t len, goto out; } + tmp = vma->vm_end; + if (tmp > end) + tmp = end; + error = security_file_mprotect(vma, reqprot, prot); if (error) goto out; - tmp = vma->vm_end; - if (tmp > end) - tmp = end; + if (vma->vm_ops && vma->vm_ops->mprotect) { + error = vma->vm_ops->mprotect(vma, nstart, tmp, prot); + if (error) + goto out; + } + error = mprotect_fixup(vma, &prev, nstart, tmp, newflags); if (error) goto out; -- 2.25.1