All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: KVM <kvm@vger.kernel.org>,
	Janosch Frank <frankja@linux.vnet.ibm.com>,
	David Hildenbrand <david@redhat.com>,
	Claudio Imbrenda <imbrenda@linux.ibm.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Michael Mueller <mimu@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Ulrich Weigand <uweigand@de.ibm.com>,
	linux-s390 <linux-s390@vger.kernel.org>,
	Heiko Carstens <heiko.carstens@de.ibm.com>
Subject: [GIT PULL 04/36] s390/mm: add (non)secure page access exceptions handlers
Date: Mon,  9 Mar 2020 09:50:54 +0100	[thread overview]
Message-ID: <20200309085126.3334302-5-borntraeger@de.ibm.com> (raw)
In-Reply-To: <20200309085126.3334302-1-borntraeger@de.ibm.com>

From: Vasily Gorbik <gor@linux.ibm.com>

Add exceptions handlers performing transparent transition of non-secure
pages to secure (import) upon guest access and secure pages to
non-secure (export) upon hypervisor access.

Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
[frankja@linux.ibm.com: adding checks for failures]
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
[imbrenda@linux.ibm.com:  adding a check for gmap fault]
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
[borntraeger@de.ibm.com: patch merging, splitting, fixing]
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 arch/s390/kernel/entry.h     |  2 +
 arch/s390/kernel/pgm_check.S |  4 +-
 arch/s390/mm/fault.c         | 78 ++++++++++++++++++++++++++++++++++++
 3 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h
index 1d3927e01a5f..faca269d5f27 100644
--- a/arch/s390/kernel/entry.h
+++ b/arch/s390/kernel/entry.h
@@ -24,6 +24,8 @@ asmlinkage void do_syscall_trace_exit(struct pt_regs *regs);
 
 void do_protection_exception(struct pt_regs *regs);
 void do_dat_exception(struct pt_regs *regs);
+void do_secure_storage_access(struct pt_regs *regs);
+void do_non_secure_storage_access(struct pt_regs *regs);
 
 void addressing_exception(struct pt_regs *regs);
 void data_exception(struct pt_regs *regs);
diff --git a/arch/s390/kernel/pgm_check.S b/arch/s390/kernel/pgm_check.S
index eee3a482195a..2c27907a5ffc 100644
--- a/arch/s390/kernel/pgm_check.S
+++ b/arch/s390/kernel/pgm_check.S
@@ -78,8 +78,8 @@ PGM_CHECK(do_dat_exception)		/* 39 */
 PGM_CHECK(do_dat_exception)		/* 3a */
 PGM_CHECK(do_dat_exception)		/* 3b */
 PGM_CHECK_DEFAULT			/* 3c */
-PGM_CHECK_DEFAULT			/* 3d */
-PGM_CHECK_DEFAULT			/* 3e */
+PGM_CHECK(do_secure_storage_access)	/* 3d */
+PGM_CHECK(do_non_secure_storage_access)	/* 3e */
 PGM_CHECK_DEFAULT			/* 3f */
 PGM_CHECK(monitor_event_exception)	/* 40 */
 PGM_CHECK_DEFAULT			/* 41 */
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index 7b0bb475c166..7bd86ebc882f 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -38,6 +38,7 @@
 #include <asm/irq.h>
 #include <asm/mmu_context.h>
 #include <asm/facility.h>
+#include <asm/uv.h>
 #include "../kernel/entry.h"
 
 #define __FAIL_ADDR_MASK -4096L
@@ -816,3 +817,80 @@ static int __init pfault_irq_init(void)
 early_initcall(pfault_irq_init);
 
 #endif /* CONFIG_PFAULT */
+
+#if IS_ENABLED(CONFIG_PGSTE)
+void do_secure_storage_access(struct pt_regs *regs)
+{
+	unsigned long addr = regs->int_parm_long & __FAIL_ADDR_MASK;
+	struct vm_area_struct *vma;
+	struct mm_struct *mm;
+	struct page *page;
+	int rc;
+
+	switch (get_fault_type(regs)) {
+	case USER_FAULT:
+		mm = current->mm;
+		down_read(&mm->mmap_sem);
+		vma = find_vma(mm, addr);
+		if (!vma) {
+			up_read(&mm->mmap_sem);
+			do_fault_error(regs, VM_READ | VM_WRITE, VM_FAULT_BADMAP);
+			break;
+		}
+		page = follow_page(vma, addr, FOLL_WRITE | FOLL_GET);
+		if (IS_ERR_OR_NULL(page)) {
+			up_read(&mm->mmap_sem);
+			break;
+		}
+		if (arch_make_page_accessible(page))
+			send_sig(SIGSEGV, current, 0);
+		put_page(page);
+		up_read(&mm->mmap_sem);
+		break;
+	case KERNEL_FAULT:
+		page = phys_to_page(addr);
+		if (unlikely(!try_get_page(page)))
+			break;
+		rc = arch_make_page_accessible(page);
+		put_page(page);
+		if (rc)
+			BUG();
+		break;
+	case VDSO_FAULT:
+		/* fallthrough */
+	case GMAP_FAULT:
+		/* fallthrough */
+	default:
+		do_fault_error(regs, VM_READ | VM_WRITE, VM_FAULT_BADMAP);
+		WARN_ON_ONCE(1);
+	}
+}
+NOKPROBE_SYMBOL(do_secure_storage_access);
+
+void do_non_secure_storage_access(struct pt_regs *regs)
+{
+	unsigned long gaddr = regs->int_parm_long & __FAIL_ADDR_MASK;
+	struct gmap *gmap = (struct gmap *)S390_lowcore.gmap;
+
+	if (get_fault_type(regs) != GMAP_FAULT) {
+		do_fault_error(regs, VM_READ | VM_WRITE, VM_FAULT_BADMAP);
+		WARN_ON_ONCE(1);
+		return;
+	}
+
+	if (gmap_convert_to_secure(gmap, gaddr) == -EINVAL)
+		send_sig(SIGSEGV, current, 0);
+}
+NOKPROBE_SYMBOL(do_non_secure_storage_access);
+
+#else
+void do_secure_storage_access(struct pt_regs *regs)
+{
+	default_trap_handler(regs);
+}
+
+void do_non_secure_storage_access(struct pt_regs *regs)
+{
+	default_trap_handler(regs);
+}
+#endif
-- 
2.24.1

  parent reply	other threads:[~2020-03-09  8:51 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-09  8:50 [GIT PULL 00/36] KVM: s390: Features and Enhancements for 5.7 part1 Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 01/36] s390/protvirt: introduce host side setup Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 02/36] s390/protvirt: add ultravisor initialization Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 03/36] s390/mm: provide memory management functions for protected KVM guests Christian Borntraeger
2020-03-09  8:50 ` Christian Borntraeger [this message]
2020-03-09  8:50 ` [GIT PULL 05/36] s390/protvirt: Add sysfs firmware interface for Ultravisor information Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 06/36] KVM: s390/interrupt: do not pin adapter interrupt pages Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 07/36] KVM: s390: protvirt: Add UV debug trace Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 08/36] KVM: s390: add new variants of UV CALL Christian Borntraeger
2020-03-09  8:50 ` [GIT PULL 09/36] KVM: s390: protvirt: Add initial vm and cpu lifecycle handling Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 10/36] KVM: s390: protvirt: Secure memory is not mergeable Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 11/36] KVM: s390/mm: Make pages accessible before destroying the guest Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 12/36] KVM: s390: protvirt: Handle SE notification interceptions Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 13/36] KVM: s390: protvirt: Instruction emulation Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 14/36] KVM: s390: protvirt: Implement interrupt injection Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 15/36] KVM: s390: protvirt: Add SCLP interrupt handling Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 16/36] KVM: s390: protvirt: Handle spec exception loops Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 17/36] KVM: s390: protvirt: Add new gprs location handling Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 18/36] KVM: S390: protvirt: Introduce instruction data area bounce buffer Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 19/36] KVM: s390: protvirt: handle secure guest prefix pages Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 20/36] KVM: s390/mm: handle guest unpin events Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 21/36] KVM: s390: protvirt: Write sthyi data to instruction data area Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 22/36] KVM: s390: protvirt: STSI handling Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 23/36] KVM: s390: protvirt: disallow one_reg Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 24/36] KVM: s390: protvirt: Do only reset registers that are accessible Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 25/36] KVM: s390: protvirt: Only sync fmt4 registers Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 26/36] KVM: s390: protvirt: Add program exception injection Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 27/36] KVM: s390: protvirt: UV calls in support of diag308 0, 1 Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 28/36] KVM: s390: protvirt: Report CPU state to Ultravisor Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 29/36] KVM: s390: protvirt: Support cmd 5 operation state Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 30/36] KVM: s390: protvirt: Mask PSW interrupt bits for interception 104 and 112 Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 31/36] KVM: s390: protvirt: do not inject interrupts after start Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 32/36] KVM: s390: protvirt: Add UV cpu reset calls Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 33/36] DOCUMENTATION: Protected virtual machine introduction and IPL Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 34/36] KVM: s390: protvirt: introduce and enable KVM_CAP_S390_PROTECTED Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 35/36] KVM: s390: protvirt: Add KVM api documentation Christian Borntraeger
2020-03-09  8:51 ` [GIT PULL 36/36] KVM: s390: introduce module parameter kvm.use_gisa Christian Borntraeger
2020-03-10 16:21 ` [GIT PULL 00/36] KVM: s390: Features and Enhancements for 5.7 part1 Christian Borntraeger
2020-03-14 15:58 ` Christian Borntraeger
2020-03-15 18:15   ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200309085126.3334302-5-borntraeger@de.ibm.com \
    --to=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=frankja@linux.vnet.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mimu@linux.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=uweigand@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.