Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp461720pxb; Wed, 18 Aug 2021 06:29:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyxV2BQzVis71HUX/1JEpErvL7KwMkFRTzHHS89QpLa1cXco5p50AtngdvReVWppaxiW5v3 X-Received: by 2002:a05:6402:2883:: with SMTP id eg3mr10059211edb.278.1629293376740; Wed, 18 Aug 2021 06:29:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629293376; cv=none; d=google.com; s=arc-20160816; b=KpnAgxz01v9mLf1p9pBiSHfcyb/ZhTNDSe3ZrpMQaxX9km6gBTYH2m8javBv87zE2d jdUcVY85vtVuTUq8KEM08/TiUBifsllG1ntUUYnyuRIsE7ruBaYjdj2VHGWCubl4JF79 tzhLzzZuj02MXKPuS9uX13Ggkn6tSfxWI69BdJOrmUKsjERaqBvCyOomNQwCMRW0LQFE PWksW/+1cE9pz4X9LEy06mp2VxLiqigN7sKyBHvm5FnbKqd7AYpBClkNfrdvMb/j36cD PiixIHVXfm8zKc+iv91D3l/NfkqJPUX7MuHwHPyhjCQpl8fgyoVvW5pRfhu7o8lv+g5r 2wLw== 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 :dkim-signature; bh=/Us6PgsGjcf1zf2Qzp84CakpAKu5TSkt+kXCKpLkn+w=; b=pARy5/4vCzYyPJ8k6gij+RUozGkB7FxMdHCLkt6lmGPOyw/gouMZDyoDSDESniObT9 g4U604KUeMTHehoeLgkKBDochzzvc0/9LWomZRxv35Jc/xDlUP6WFVUWncQJCS+Y59Fv /8YX0fD/zJPq4nt/lrs6hjQhvKe9lck+HNZnU16yC+dN6cZC68kQIsDoOvneikHjVlMX L9Srv9KQo6sYuaFsV2gaIptH4dk6ZbamR84WW8reyjPDwa7kMCOqC1LWn3Dlw5GR0ZqQ Zvqx/jTG6UGBGrkO6ViiHiaxlm8zq53oZadT9eHob0NFkSmk1F40vzyIiJXh4uI7HXG8 rh2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=aiunP4yb; 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=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j24si5763833edp.316.2021.08.18.06.29.12; Wed, 18 Aug 2021 06:29:36 -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; dkim=pass header.i=@ibm.com header.s=pp1 header.b=aiunP4yb; 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=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238489AbhHRN1h (ORCPT + 99 others); Wed, 18 Aug 2021 09:27:37 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:1872 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237104AbhHRN1H (ORCPT ); Wed, 18 Aug 2021 09:27:07 -0400 Received: from pps.filterd (m0187473.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 17ID3Tqu060906; Wed, 18 Aug 2021 09:26:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=/Us6PgsGjcf1zf2Qzp84CakpAKu5TSkt+kXCKpLkn+w=; b=aiunP4ybIDAjGFJeD4sawXE4A5MxJuO9o8+xoZyqNuBmsfK6Q9RK2cYw8+wDqxA8oexA 63mFNYo2QNCiKkGi0BzKHoR1Ui91KKlhGm6JUHZZfQbN68NrTIquldTRWBSlPxljDOPC 6uYeXt0lSr0JuII/AtsNvot9jdsVp5wjT0qZBF61IonzaA1XCay5MEpJwU3b7+fp+obC x9OFAIHPSCPsRTYzPWT9jNyZtHWoIVuGxVVM1oaXipGbasmeA9BeVixKxRPzgQA87MGG wlBbZC1TXUJ/fdfEvtd2bw9NN9q7pGLfEny+HgeLKXzTtNd372vT8do9/6lD7v8W7RPg /g== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3agcvs5e24-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 18 Aug 2021 09:26:32 -0400 Received: from m0187473.ppops.net (m0187473.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 17ID4Wxx064623; Wed, 18 Aug 2021 09:26:32 -0400 Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0a-001b2d01.pphosted.com with ESMTP id 3agcvs5e0w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 18 Aug 2021 09:26:32 -0400 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 17IDDB9j022040; Wed, 18 Aug 2021 13:26:30 GMT Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by ppma06ams.nl.ibm.com with ESMTP id 3ae53hxnv3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 18 Aug 2021 13:26:30 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 17IDQP4r55050684 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 18 Aug 2021 13:26:25 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C82E54C05C; Wed, 18 Aug 2021 13:26:25 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3BB994C066; Wed, 18 Aug 2021 13:26:25 +0000 (GMT) Received: from p-imbrenda.bredband2.com (unknown [9.145.14.177]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 18 Aug 2021 13:26:25 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: cohuck@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com, thuth@redhat.com, pasic@linux.ibm.com, david@redhat.com, linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, Ulrich.Weigand@de.ibm.com Subject: [PATCH v4 07/14] KVM: s390: pv: handle secure storage violations for protected guests Date: Wed, 18 Aug 2021 15:26:13 +0200 Message-Id: <20210818132620.46770-8-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210818132620.46770-1-imbrenda@linux.ibm.com> References: <20210818132620.46770-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: hUxZqGNqURg6q2NVlrludc3XP07QYVS1 X-Proofpoint-GUID: AtYcuVf5-M109wmp0YEfV8gGZ9QCwYIr X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.391,18.0.790 definitions=2021-08-18_04:2021-08-17,2021-08-18 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 suspectscore=0 mlxscore=0 mlxlogscore=869 phishscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2107140000 definitions=main-2108180082 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With upcoming patches, protected guests will be able to trigger secure storage violations in normal operation. This patch adds handling of secure storage violations for protected guests. Pages that trigger the exception will be made non-secure before attempting to use them again. Signed-off-by: Claudio Imbrenda Acked-by: Janosch Frank --- arch/s390/include/asm/uv.h | 1 + arch/s390/kernel/uv.c | 43 ++++++++++++++++++++++++++++++++++++++ arch/s390/mm/fault.c | 10 +++++++++ 3 files changed, 54 insertions(+) diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h index 3236293d5a31..c8bd72be8974 100644 --- a/arch/s390/include/asm/uv.h +++ b/arch/s390/include/asm/uv.h @@ -356,6 +356,7 @@ static inline int is_prot_virt_host(void) } int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb); +int gmap_destroy_page(struct gmap *gmap, unsigned long gaddr); int uv_destroy_owned_page(unsigned long paddr); int uv_convert_from_secure(unsigned long paddr); int uv_convert_owned_from_secure(unsigned long paddr); diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c index 05f8bf61d20a..89ba36a5b4bb 100644 --- a/arch/s390/kernel/uv.c +++ b/arch/s390/kernel/uv.c @@ -349,6 +349,49 @@ int gmap_convert_to_secure(struct gmap *gmap, unsigned long gaddr) } EXPORT_SYMBOL_GPL(gmap_convert_to_secure); +int gmap_destroy_page(struct gmap *gmap, unsigned long gaddr) +{ + struct vm_area_struct *vma; + unsigned long uaddr; + struct page *page; + int rc; + + rc = -EFAULT; + mmap_read_lock(gmap->mm); + + uaddr = __gmap_translate(gmap, gaddr); + if (IS_ERR_VALUE(uaddr)) + goto out; + vma = find_vma(gmap->mm, uaddr); + if (!vma) + goto out; + /* + * Huge pages should not be able to become secure + */ + if (is_vm_hugetlb_page(vma)) + goto out; + + rc = 0; + /* we take an extra reference here */ + page = follow_page(vma, uaddr, FOLL_WRITE | FOLL_GET); + if (IS_ERR_OR_NULL(page)) + goto out; + rc = uv_destroy_owned_page(page_to_phys(page)); + /* + * Fault handlers can race; it is possible that one CPU will destroy + * and import the page, at which point the second CPU handling the + * same fault will not be able to destroy. In that case we do not + * want to terminate the process, we instead try to export the page. + */ + if (rc) + rc = uv_convert_owned_from_secure(page_to_phys(page)); + put_page(page); +out: + mmap_read_unlock(gmap->mm); + return rc; +} +EXPORT_SYMBOL_GPL(gmap_destroy_page); + /* * To be called with the page locked or with an extra reference! This will * prevent gmap_make_secure from touching the page concurrently. Having 2 diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index e33c43b38afe..eb68b4f36927 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c @@ -850,6 +850,16 @@ NOKPROBE_SYMBOL(do_non_secure_storage_access); void do_secure_storage_violation(struct pt_regs *regs) { + unsigned long gaddr = regs->int_parm_long & __FAIL_ADDR_MASK; + struct gmap *gmap = (struct gmap *)S390_lowcore.gmap; + + /* + * If the VM has been rebooted, its address space might still contain + * secure pages from the previous boot. + * Clear the page so it can be reused. + */ + if (!gmap_destroy_page(gmap, gaddr)) + return; /* * Either KVM messed up the secure guest mapping or the same * page is mapped into multiple secure guests. -- 2.31.1