From: Christoffer Dall <c.dall@virtualopensystems.com>
To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Cc: peter.maydell@linaro.org, marc.zyngier@arm.com,
Christoffer Dall <c.dall@virtualopensystems.com>
Subject: [RFC PATCH 3/3] KVM: ARM: Split KVM_CREATE_IRQCHIP and KVM_INIT_IRQCHIP
Date: Sat, 13 Oct 2012 20:04:25 -0400 [thread overview]
Message-ID: <1350173065-35350-4-git-send-email-c.dall@virtualopensystems.com> (raw)
In-Reply-To: <1350173065-35350-1-git-send-email-c.dall@virtualopensystems.com>
We need this two factor initialization step to support a sane user space
initialization of the emulated model. We simply follow the names of the
ioctls for the internal vgic implementation steps and check if we have
everything we need on the host side when we create the vgic and set up
the rest on init.
Signed-off-by: Christoffer Dall <c.dall@virtualopensystems.com>
---
arch/arm/include/asm/kvm_vgic.h | 6 ++++++
arch/arm/kvm/arm.c | 6 ++++++
arch/arm/kvm/vgic.c | 40 +++++++++++++++++++++++++++++++--------
3 files changed, 44 insertions(+), 8 deletions(-)
diff --git a/arch/arm/include/asm/kvm_vgic.h b/arch/arm/include/asm/kvm_vgic.h
index a688132..8bd1426 100644
--- a/arch/arm/include/asm/kvm_vgic.h
+++ b/arch/arm/include/asm/kvm_vgic.h
@@ -243,6 +243,7 @@ struct kvm_exit_mmio;
#ifdef CONFIG_KVM_ARM_VGIC
int kvm_vgic_hyp_init(void);
int kvm_vgic_set_addr(struct kvm *kvm, unsigned long type, u64 addr);
+int kvm_vgic_create(struct kvm *kvm);
int kvm_vgic_init(struct kvm *kvm);
void kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu);
void kvm_vgic_sync_to_cpu(struct kvm_vcpu *vcpu);
@@ -267,6 +268,11 @@ static inline int kvm_vgic_set_addr(struct kvm *kvm, unsigned long type, u64 add
return 0;
}
+static inline int kvm_vgic_create(struct kvm *kvm)
+{
+ return 0;
+}
+
static inline int kvm_vgic_init(struct kvm *kvm)
{
return 0;
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 67c8cc2..c0af87e 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -890,6 +890,12 @@ long kvm_arch_vm_ioctl(struct file *filp,
#ifdef CONFIG_KVM_ARM_VGIC
case KVM_CREATE_IRQCHIP: {
if (vgic_present)
+ return kvm_vgic_create(kvm);
+ else
+ return -EINVAL;
+ }
+ case KVM_INIT_IRQCHIP: {
+ if (vgic_present)
return kvm_vgic_init(kvm);
else
return -EINVAL;
diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c
index 1e4be2d..78d590c 100644
--- a/arch/arm/kvm/vgic.c
+++ b/arch/arm/kvm/vgic.c
@@ -1084,12 +1084,12 @@ out_free_irq:
int kvm_vgic_init(struct kvm *kvm)
{
int ret, i;
- struct resource vcpu_res;
mutex_lock(&kvm->lock);
- if (of_address_to_resource(vgic_node, 3, &vcpu_res)) {
- kvm_err("Cannot obtain VCPU resource\n");
+ if (vgic_guest_dist_base == VGIC_ADDR_UNDEF ||
+ vgic_guest_cpu_base == VGIC_ADDR_UNDEF) {
+ kvm_err("Need to set vgic cpu and dist addresses first\n");
ret = -ENXIO;
goto out;
}
@@ -1101,11 +1101,12 @@ int kvm_vgic_init(struct kvm *kvm)
spin_lock_init(&kvm->arch.vgic.lock);
kvm->arch.vgic.vctrl_base = vgic_vctrl_base;
- kvm->arch.vgic.vgic_dist_base = VGIC_DIST_BASE;
+ kvm->arch.vgic.vgic_dist_base = vgic_guest_dist_base;
kvm->arch.vgic.vgic_dist_size = VGIC_DIST_SIZE;
- ret = kvm_phys_addr_ioremap(kvm, VGIC_CPU_BASE,
- vcpu_res.start, VGIC_CPU_SIZE);
+ ret = kvm_phys_addr_ioremap(kvm, vgic_guest_cpu_base,
+ vgic_vcpu_base, VGIC_CPU_SIZE);
+
if (ret) {
kvm_err("Unable to remap VGIC CPU to VCPU\n");
goto out;
@@ -1113,13 +1114,36 @@ int kvm_vgic_init(struct kvm *kvm)
for (i = 32; i < VGIC_NR_IRQS; i += 4)
vgic_set_target_reg(kvm, 0, i);
-
out:
mutex_unlock(&kvm->lock);
-
if (!ret)
kvm_timer_init(kvm);
+ return ret;
+}
+
+int kvm_vgic_create(struct kvm *kvm)
+{
+ int ret;
+ struct resource vcpu_res;
+
+ mutex_lock(&kvm->lock);
+ if (of_address_to_resource(vgic_node, 3, &vcpu_res)) {
+ kvm_err("Cannot obtain VCPU resource\n");
+ ret = -ENXIO;
+ goto out;
+ }
+
+ if (atomic_read(&kvm->online_vcpus) || kvm->arch.vgic.vctrl_base) {
+ ret = -EEXIST;
+ goto out;
+ }
+
+
+ vgic_vcpu_base = vcpu_res.start;
+ ret = 0;
+out:
+ mutex_unlock(&kvm->lock);
return ret;
}
--
1.7.9.5
next prev parent reply other threads:[~2012-10-14 0:04 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-14 0:04 [RFC PATCH 0/3] KVM: ARM: Get rid of hardcoded VGIC addresses Christoffer Dall
2012-10-14 0:04 ` [RFC PATCH 1/3] KVM: ARM: Introduce KVM_INIT_IRQCHIP ioctl Christoffer Dall
2012-10-17 20:21 ` Peter Maydell
2012-10-17 20:23 ` Christoffer Dall
2012-10-17 20:31 ` Peter Maydell
2012-10-17 20:39 ` Christoffer Dall
2012-10-18 12:20 ` Avi Kivity
2012-10-19 18:42 ` Christoffer Dall
2012-10-14 0:04 ` [RFC PATCH 2/3] KVM: ARM: Introduce KVM_SET_DEVICE_ADDRESS ioctl Christoffer Dall
2012-10-17 20:29 ` Peter Maydell
2012-10-19 18:46 ` Christoffer Dall
2012-10-19 20:24 ` Peter Maydell
2012-10-19 20:27 ` Christoffer Dall
2012-10-19 20:33 ` Christoffer Dall
2012-10-14 0:04 ` Christoffer Dall [this message]
2012-10-18 11:15 ` [RFC PATCH 3/3] KVM: ARM: Split KVM_CREATE_IRQCHIP and KVM_INIT_IRQCHIP Peter Maydell
2012-10-17 20:38 ` [kvmarm] [RFC PATCH 0/3] KVM: ARM: Get rid of hardcoded VGIC addresses Alexander Graf
2012-10-17 20:38 ` Alexander Graf
2012-10-17 20:39 ` Christoffer Dall
2012-10-17 20:39 ` Christoffer Dall
2012-10-17 21:19 ` Benjamin Herrenschmidt
2012-10-17 21:19 ` Benjamin Herrenschmidt
2012-10-17 22:10 ` Paul Mackerras
2012-10-17 22:10 ` Paul Mackerras
2012-10-17 23:58 ` Benjamin Herrenschmidt
2012-10-17 23:58 ` Benjamin Herrenschmidt
2012-10-18 13:48 ` Christoffer Dall
2012-10-18 13:48 ` Christoffer Dall
2012-10-18 13:49 ` Alexander Graf
2012-10-18 13:49 ` Alexander Graf
2012-10-18 15:25 ` Avi Kivity
2012-10-18 15:25 ` Avi Kivity
2012-10-23 10:48 ` Jan Kiszka
2012-10-23 10:48 ` Jan Kiszka
2012-10-23 10:52 ` Peter Maydell
2012-10-23 10:52 ` Peter Maydell
2012-10-23 11:00 ` Jan Kiszka
2012-10-23 11:00 ` Jan Kiszka
2012-10-23 11:04 ` Peter Maydell
2012-10-23 11:04 ` Peter Maydell
2012-10-23 11:08 ` Jan Kiszka
2012-10-23 11:08 ` Jan Kiszka
2012-10-24 0:50 ` Paul Mackerras
2012-10-24 0:50 ` Paul Mackerras
2012-10-25 11:57 ` Jan Kiszka
2012-10-25 11:57 ` Jan Kiszka
2012-10-25 16:14 ` Paolo Bonzini
2012-10-25 16:14 ` Paolo Bonzini
2012-10-25 16:32 ` Jan Kiszka
2012-10-25 16:32 ` Jan Kiszka
2012-10-25 18:27 ` Paolo Bonzini
2012-10-25 18:27 ` Paolo Bonzini
2012-10-25 19:40 ` Benjamin Herrenschmidt
2012-10-25 19:40 ` Benjamin Herrenschmidt
2012-10-26 9:58 ` Paolo Bonzini
2012-10-26 9:58 ` Paolo Bonzini
2012-10-26 10:09 ` Peter Maydell
2012-10-26 10:09 ` Peter Maydell
2012-10-26 10:15 ` Paolo Bonzini
2012-10-26 10:15 ` Paolo Bonzini
2012-10-26 10:22 ` Jan Kiszka
2012-10-26 10:22 ` Jan Kiszka
2012-10-26 10:44 ` Benjamin Herrenschmidt
2012-10-26 10:44 ` Benjamin Herrenschmidt
2012-10-26 11:00 ` Jan Kiszka
2012-10-26 11:00 ` Jan Kiszka
2012-10-26 11:09 ` Benjamin Herrenschmidt
2012-10-26 11:09 ` Benjamin Herrenschmidt
2012-10-26 11:57 ` Paolo Bonzini
2012-10-26 11:57 ` Paolo Bonzini
2012-10-26 12:08 ` Peter Maydell
2012-10-26 12:08 ` Peter Maydell
2012-10-26 12:41 ` Jan Kiszka
2012-10-26 12:41 ` Jan Kiszka
2012-10-26 20:21 ` Benjamin Herrenschmidt
2012-10-26 20:21 ` Benjamin Herrenschmidt
2012-10-26 11:17 ` Peter Maydell
2012-10-26 11:17 ` Peter Maydell
2012-10-26 11:39 ` Benjamin Herrenschmidt
2012-10-26 11:39 ` Benjamin Herrenschmidt
2012-10-26 12:39 ` Jan Kiszka
2012-10-26 12:39 ` Jan Kiszka
2012-10-26 20:45 ` Benjamin Herrenschmidt
2012-10-26 20:45 ` Benjamin Herrenschmidt
2012-10-26 22:03 ` Benjamin Herrenschmidt
2012-10-26 22:03 ` Benjamin Herrenschmidt
2012-10-27 8:06 ` Jan Kiszka
2012-10-27 8:06 ` Jan Kiszka
2012-10-27 10:01 ` Peter Maydell
2012-10-27 10:01 ` Peter Maydell
2012-10-28 22:19 ` Benjamin Herrenschmidt
2012-10-28 22:19 ` Benjamin Herrenschmidt
2012-10-26 10:37 ` Benjamin Herrenschmidt
2012-10-26 10:37 ` Benjamin Herrenschmidt
2012-10-26 10:40 ` Paolo Bonzini
2012-10-26 10:40 ` Paolo Bonzini
2012-10-26 10:47 ` Benjamin Herrenschmidt
2012-10-26 10:47 ` Benjamin Herrenschmidt
2012-10-26 11:47 ` Paolo Bonzini
2012-10-26 11:47 ` Paolo Bonzini
2012-10-25 19:39 ` Benjamin Herrenschmidt
2012-10-25 19:39 ` Benjamin Herrenschmidt
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=1350173065-35350-4-git-send-email-c.dall@virtualopensystems.com \
--to=c.dall@virtualopensystems.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=marc.zyngier@arm.com \
--cc=peter.maydell@linaro.org \
/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.