From: Carsten Otte <cotte@de.ibm.com>
To: Avi Kivity <avi@redhat.com>, Marcelo Tossati <mtosatti@redhat.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>,
Heiko Carstens <heiko.carstens@de.ibm.com>,
Martin Schwidefsky <schwidefsky@de.ibm.com>,
Cornelia Huck <cornelia.huck@de.ibm.com>,
KVM <kvm@vger.kernel.org>,
Joachim von Buttlar <joachim_von_buttlar@de.ibm.com>,
Jens Freimann <jfrei@de.ibm.com>,
Constantin Werner <constantin.werner@de.ibm.com>
Subject: [patch 10/12] [PATCH] kvm-s390: storage key interface
Date: Thu, 01 Dec 2011 13:57:42 +0100 [thread overview]
Message-ID: <20111201130409.869732882@de.ibm.com> (raw)
In-Reply-To: 20111201125732.085553111@de.ibm.com
[-- Attachment #1: skey.patch --]
[-- Type: text/plain, Size: 5037 bytes --]
This patch introduces an interface to access the guest visible
storage keys. It supports three operations that model the behavior
that SSKE/ISKE/RRBE instructions would have if they were issued by
the guest. These instructions are all documented in the z architecture
principles of operation book.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
---
Index: linux-2.5-cecsim/arch/s390/include/asm/kvm_host.h
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/include/asm/kvm_host.h
+++ linux-2.5-cecsim/arch/s390/include/asm/kvm_host.h
@@ -25,6 +25,9 @@
#define KVM_PRIVATE_MEM_SLOTS 4
#define KVM_SIE_PAGE_OFFSET 1
+#define KVM_S390_KEYOP_SSKE 0x01
+#define KVM_S390_KEYOP_ISKE 0x02
+#define KVM_S390_KEYOP_RRBE 0x03
struct sca_entry {
atomic_t scn;
Index: linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
===================================================================
--- linux-2.5-cecsim.orig/arch/s390/kvm/kvm-s390.c
+++ linux-2.5-cecsim/arch/s390/kvm/kvm-s390.c
@@ -112,13 +112,144 @@ void kvm_arch_exit(void)
{
}
+pte_t *ptep_for_addr(unsigned long addr)
+{
+ struct vm_area_struct *vma;
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *rc;
+
+ down_read(¤t->mm->mmap_sem);
+
+ rc = NULL;
+ vma = find_vma(current->mm, addr);
+ if (!vma)
+ goto up_out;
+
+ pgd = pgd_offset(current->mm, addr);
+ pud = pud_alloc(current->mm, pgd, addr);
+ if (!pud)
+ goto up_out;
+
+ pmd = pmd_alloc(current->mm, pud, addr);
+ if (!pmd)
+ goto up_out;
+
+ if (!pmd_present(*pmd) &&
+ __pte_alloc(current->mm, vma, pmd, addr))
+ goto up_out;
+
+ rc = pte_offset(pmd, addr);
+up_out:
+ up_read(¤t->mm->mmap_sem);
+ return rc;
+}
+
+static long kvm_s390_keyop(struct kvm_s390_keyop *kop)
+{
+ unsigned long addr = kop->user_addr;
+ pte_t *ptep;
+ pgste_t pgste;
+ int r;
+ unsigned long skey;
+ unsigned long bits;
+
+ /* make sure this process is a hypervisor */
+ r = -EINVAL;
+ if (!mm_has_pgste(current->mm))
+ goto out;
+
+ r = -ENXIO;
+ if (addr >= PGDIR_SIZE)
+ goto out;
+
+ spin_lock(¤t->mm->page_table_lock);
+ ptep = ptep_for_addr(addr);
+ if (!ptep)
+ goto out_unlock;
+
+ pgste = pgste_get_lock(ptep);
+
+ switch (kop->operation) {
+ case KVM_S390_KEYOP_SSKE:
+ pgste = pgste_update_all(ptep, pgste);
+ /* set the real key back w/o rc bits */
+ skey = kop->key & (_PAGE_ACC_BITS | _PAGE_FP_BIT);
+ if (pte_present(*ptep))
+ page_set_storage_key(pte_val(*ptep), skey, 1);
+ /* put acc+f plus guest refereced and changed into the pgste */
+ pgste_val(pgste) &= ~(RCP_ACC_BITS | RCP_FP_BIT | RCP_GR_BIT
+ | RCP_GC_BIT);
+ bits = (kop->key & (_PAGE_ACC_BITS | _PAGE_FP_BIT));
+ pgste_val(pgste) |= bits << 56;
+ bits = (kop->key & (_PAGE_CHANGED | _PAGE_REFERENCED));
+ pgste_val(pgste) |= bits << 48;
+ r = 0;
+ break;
+ case KVM_S390_KEYOP_ISKE:
+ if (pte_present(*ptep)) {
+ skey = page_get_storage_key(pte_val(*ptep));
+ kop->key = skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT);
+ } else {
+ skey = 0;
+ kop->key = (pgste_val(pgste) >> 56) &
+ (_PAGE_ACC_BITS | _PAGE_FP_BIT);
+ }
+ kop->key |= skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
+ kop->key |= (pgste_val(pgste) >> 48) &
+ (_PAGE_CHANGED | _PAGE_REFERENCED);
+ r = 0;
+ break;
+ case KVM_S390_KEYOP_RRBE:
+ pgste = pgste_update_all(ptep, pgste);
+ kop->key = 0;
+ if (pgste_val(pgste) & RCP_GR_BIT)
+ kop->key |= _PAGE_REFERENCED;
+ pgste_val(pgste) &= ~RCP_GR_BIT;
+ r = 0;
+ break;
+ default:
+ r = -EINVAL;
+ }
+ pgste_set_unlock(ptep, pgste);
+
+out_unlock:
+ spin_unlock(¤t->mm->page_table_lock);
+out:
+ return r;
+}
+
/* Section: device related */
long kvm_arch_dev_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg)
{
- if (ioctl == KVM_S390_ENABLE_SIE)
- return s390_enable_sie();
- return -EINVAL;
+ void __user *argp = (void __user *)arg;
+ int r;
+
+ switch (ioctl) {
+ case KVM_S390_ENABLE_SIE:
+ r = s390_enable_sie();
+ break;
+ case KVM_S390_KEYOP: {
+ struct kvm_s390_keyop kop;
+ r = -EFAULT;
+ if (copy_from_user(&kop, argp, sizeof(struct kvm_s390_keyop)))
+ break;
+ r = kvm_s390_keyop(&kop);
+ if (r)
+ break;
+ r = -EFAULT;
+ if (copy_to_user(argp, &kop, sizeof(struct kvm_s390_keyop)))
+ break;
+ r = 0;
+ break;
+ }
+ default:
+ r = -ENOTTY;
+ }
+
+ return r;
}
int kvm_dev_ioctl_check_extension(long ext)
Index: linux-2.5-cecsim/include/linux/kvm.h
===================================================================
--- linux-2.5-cecsim.orig/include/linux/kvm.h
+++ linux-2.5-cecsim/include/linux/kvm.h
@@ -445,6 +445,13 @@ struct kvm_ppc_pvinfo {
#define KVM_GET_MSR_INDEX_LIST _IOWR(KVMIO, 0x02, struct kvm_msr_list)
#define KVM_S390_ENABLE_SIE _IO(KVMIO, 0x06)
+
+struct kvm_s390_keyop {
+ __u64 user_addr;
+ __u8 key;
+ __u8 operation;
+};
+#define KVM_S390_KEYOP _IOWR(KVMIO, 0x09, struct kvm_s390_keyop)
/*
* Check if a kvm extension is available. Argument is extension number,
* return is 1 (yes) or 0 (no, sorry).
next prev parent reply other threads:[~2011-12-01 13:04 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-01 12:57 [patch 00/12] User controlled virtual machines Carsten Otte
2011-12-01 12:57 ` [patch 01/12] [PATCH] kvm-s390: ioctl to switch to user " Carsten Otte
2011-12-01 13:15 ` Avi Kivity
2011-12-01 13:31 ` Avi Kivity
2011-12-01 14:20 ` Martin Schwidefsky
2011-12-01 12:57 ` [patch 02/12] [PATCH] kvm-s390-ucontrol: per vcpu address spaces Carsten Otte
2011-12-01 13:19 ` Avi Kivity
2011-12-01 12:57 ` [patch 03/12] [PATCH] kvm-s390-ucontrol: export page faults to user Carsten Otte
2011-12-01 12:57 ` [patch 04/12] [PATCH] kvm-s390-ucontrol: export SIE control block " Carsten Otte
2011-12-01 13:25 ` Avi Kivity
2011-12-01 13:26 ` Avi Kivity
2011-12-01 13:59 ` Carsten Otte
2011-12-01 14:04 ` Avi Kivity
2011-12-01 12:57 ` [patch 05/12] [PATCH] kvm-s390-ucontrol: disable in-kernel handling of SIE intercepts Carsten Otte
2011-12-01 12:57 ` [patch 06/12] [PATCH] kvm-s390-ucontrol: disable in-kernel irq stack Carsten Otte
2011-12-01 12:57 ` [patch 07/12] [PATCH] kvm-s390-ucontrol: interface to inject faults on a vcpu page table Carsten Otte
2011-12-01 12:57 ` [patch 08/12] [PATCH] kvm-s390-ucontrol: disable sca Carsten Otte
2011-12-01 12:57 ` [patch 09/12] [PATCH] kvm-s390: fix assumption for KVM_MAX_VCPUS Carsten Otte
2011-12-01 12:57 ` Carsten Otte [this message]
2011-12-01 12:57 ` [patch 11/12] [PATCH] kvm-s390-ucontrol: announce capability for user controlled vms Carsten Otte
2011-12-01 12:57 ` [patch 12/12] From: Carsten Otte <cotte@de.ibm.com> Carsten Otte
2011-12-01 13:10 ` [patch 00/12] User controlled virtual machines Avi Kivity
2011-12-01 13:33 ` Avi Kivity
2011-12-02 11:52 ` Carsten Otte
-- strict thread matches above, loose matches on Subject: below --
2011-12-08 9:12 [patch 00/12] Ucontrol patchset V2 Carsten Otte
2011-12-08 9:12 ` [patch 10/12] [PATCH] kvm-s390: storage key interface Carsten Otte
2011-12-09 11:23 [patch 00/12] Ucontrol patches V3 Carsten Otte
2011-12-09 11:23 ` [patch 10/12] [PATCH] kvm-s390: storage key interface Carsten Otte
2011-12-09 12:04 ` Heiko Carstens
[not found] ` <OFEDB7DC8E.0D8BE463-ONC1257961.004633DF-C1257961.0046C1E7@de.ibm.com>
2011-12-09 13:37 ` Carsten Otte
2011-12-09 12:49 [patch 00/12] Ucontrol patchset V4 Carsten Otte
2011-12-09 12:49 ` [patch 10/12] [PATCH] kvm-s390: storage key interface Carsten Otte
2011-12-09 13:46 ` Heiko Carstens
2011-12-10 11:36 ` Carsten Otte
2011-12-10 12:35 [patch 00/12] Ucontrol patchset V5 Carsten Otte
2011-12-10 12:35 ` [patch 10/12] [PATCH] kvm-s390: storage key interface Carsten Otte
2011-12-11 21:57 ` Heiko Carstens
2011-12-12 10:06 ` Martin Schwidefsky
2011-12-14 12:23 [patch 00/12] Ucontrol patchset V6 Carsten Otte
2011-12-14 12:23 ` [patch 10/12] [PATCH] kvm-s390: storage key interface Carsten Otte
2011-12-15 10:28 ` Carsten Otte
2011-12-15 16:11 ` Heiko Carstens
2011-12-15 16:49 ` Christian Borntraeger
2011-12-15 17:18 ` Heiko Carstens
2011-12-15 17:14 ` Martin Schwidefsky
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=20111201130409.869732882@de.ibm.com \
--to=cotte@de.ibm.com \
--cc=avi@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=constantin.werner@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=heiko.carstens@de.ibm.com \
--cc=jfrei@de.ibm.com \
--cc=joachim_von_buttlar@de.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=schwidefsky@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.