KVM: PPC: Generic KVM PV guest support
authorAlexander Graf <agraf@suse.de>
Thu, 29 Jul 2010 12:47:57 +0000 (14:47 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:50:50 +0000 (10:50 +0200)
We have all the hypervisor pieces in place now, but the guest parts are still
missing.

This patch implements basic awareness of KVM when running Linux as guest. It
doesn't do anything with it yet though.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/kvm.c
arch/powerpc/kernel/kvm_emul.S [new file with mode: 0644]
arch/powerpc/platforms/Kconfig

index 3a6955dc71918c10140e2a27744465c7b35a0bf7..be257b0aae36b8cc810dfe3b9511e4b4404956b9 100644 (file)
@@ -127,7 +127,7 @@ ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC),)
 obj-y                          += ppc_save_regs.o
 endif
 
-obj-$(CONFIG_KVM_GUEST)                += kvm.o
+obj-$(CONFIG_KVM_GUEST)                += kvm.o kvm_emul.o
 
 # Disable GCOV in odd or sensitive code
 GCOV_PROFILE_prom_init.o := n
index 1221bcdff52fb3df7260146437030f37f5f5c082..37486cafb69d13dcba6d0d4d96ca7635fa0248a5 100644 (file)
@@ -465,6 +465,21 @@ int main(void)
        DEFINE(VCPU_FAULT_ESR, offsetof(struct kvm_vcpu, arch.fault_esr));
 #endif /* CONFIG_PPC_BOOK3S */
 #endif
+
+#ifdef CONFIG_KVM_GUEST
+       DEFINE(KVM_MAGIC_SCRATCH1, offsetof(struct kvm_vcpu_arch_shared,
+                                           scratch1));
+       DEFINE(KVM_MAGIC_SCRATCH2, offsetof(struct kvm_vcpu_arch_shared,
+                                           scratch2));
+       DEFINE(KVM_MAGIC_SCRATCH3, offsetof(struct kvm_vcpu_arch_shared,
+                                           scratch3));
+       DEFINE(KVM_MAGIC_INT, offsetof(struct kvm_vcpu_arch_shared,
+                                      int_pending));
+       DEFINE(KVM_MAGIC_MSR, offsetof(struct kvm_vcpu_arch_shared, msr));
+       DEFINE(KVM_MAGIC_CRITICAL, offsetof(struct kvm_vcpu_arch_shared,
+                                           critical));
+#endif
+
 #ifdef CONFIG_44x
        DEFINE(PGD_T_LOG2, PGD_T_LOG2);
        DEFINE(PTE_T_LOG2, PTE_T_LOG2);
index 4f85505e46533000c9c5eb576cd16df554b2c499..a5ece71ecdd24916a2d2e00edfd070c1af7bc502 100644 (file)
@@ -30,6 +30,9 @@
 #include <asm/cacheflush.h>
 #include <asm/disassemble.h>
 
+#define KVM_MAGIC_PAGE         (-4096L)
+#define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x)
+
 unsigned long kvm_hypercall(unsigned long *in,
                            unsigned long *out,
                            unsigned long nr)
diff --git a/arch/powerpc/kernel/kvm_emul.S b/arch/powerpc/kernel/kvm_emul.S
new file mode 100644 (file)
index 0000000..5cfa2ae
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ * Copyright SUSE Linux Products GmbH 2010
+ *
+ * Authors: Alexander Graf <agraf@suse.de>
+ */
+
+#include <asm/ppc_asm.h>
+#include <asm/kvm_asm.h>
+#include <asm/reg.h>
+#include <asm/page.h>
+#include <asm/asm-offsets.h>
+
+/* Hypercall entry point. Will be patched with device tree instructions. */
+
+.global kvm_hypercall_start
+kvm_hypercall_start:
+       li      r3, -1
+       nop
+       nop
+       nop
+       blr
+
+#define KVM_MAGIC_PAGE         (-4096)
index 81c9208025fa42833b5472da2ccd75845c8b3cc0..956154f32cfe9af29cceb30b340b575bc5011a94 100644 (file)
@@ -21,6 +21,16 @@ source "arch/powerpc/platforms/44x/Kconfig"
 source "arch/powerpc/platforms/40x/Kconfig"
 source "arch/powerpc/platforms/amigaone/Kconfig"
 
+config KVM_GUEST
+       bool "KVM Guest support"
+       default y
+       ---help---
+         This option enables various optimizations for running under the KVM
+         hypervisor. Overhead for the kernel when not running inside KVM should
+         be minimal.
+
+         In case of doubt, say Y
+
 config PPC_NATIVE
        bool
        depends on 6xx || PPC64