diff options
author | Liu Yu-B13201 <Yu.Liu@freescale.com> | 2012-03-15 06:52:13 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-05-30 05:43:10 -0400 |
commit | 2e1ae9c07df5956ebab19144aa0da58ea37c9f69 (patch) | |
tree | 5ec9b74d22b72af3691897921ca6bce76ea7d4aa /arch/powerpc/kernel/kvm.c | |
parent | b48b2c3e50433ff6f7e46186daa7f986bd960215 (diff) |
KVM: PPC: Factor out guest epapr initialization
epapr paravirtualization support is now a Kconfig
selectable option
Signed-off-by: Liu Yu <yu.liu@freescale.com>
[stuart.yoder@freescale.com: misc minor fixes, description update]
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kernel/kvm.c')
-rw-r--r-- | arch/powerpc/kernel/kvm.c | 28 |
1 files changed, 3 insertions, 25 deletions
diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c index 62bdf2389669..1c13307e0308 100644 --- a/arch/powerpc/kernel/kvm.c +++ b/arch/powerpc/kernel/kvm.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/cacheflush.h> | 31 | #include <asm/cacheflush.h> |
32 | #include <asm/disassemble.h> | 32 | #include <asm/disassemble.h> |
33 | #include <asm/ppc-opcode.h> | 33 | #include <asm/ppc-opcode.h> |
34 | #include <asm/epapr_hcalls.h> | ||
34 | 35 | ||
35 | #define KVM_MAGIC_PAGE (-4096L) | 36 | #define KVM_MAGIC_PAGE (-4096L) |
36 | #define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x) | 37 | #define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x) |
@@ -726,7 +727,7 @@ unsigned long kvm_hypercall(unsigned long *in, | |||
726 | unsigned long register r11 asm("r11") = nr; | 727 | unsigned long register r11 asm("r11") = nr; |
727 | unsigned long register r12 asm("r12"); | 728 | unsigned long register r12 asm("r12"); |
728 | 729 | ||
729 | asm volatile("bl kvm_hypercall_start" | 730 | asm volatile("bl epapr_hypercall_start" |
730 | : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6), | 731 | : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6), |
731 | "=r"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11), | 732 | "=r"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11), |
732 | "=r"(r12) | 733 | "=r"(r12) |
@@ -747,29 +748,6 @@ unsigned long kvm_hypercall(unsigned long *in, | |||
747 | } | 748 | } |
748 | EXPORT_SYMBOL_GPL(kvm_hypercall); | 749 | EXPORT_SYMBOL_GPL(kvm_hypercall); |
749 | 750 | ||
750 | static int kvm_para_setup(void) | ||
751 | { | ||
752 | extern u32 kvm_hypercall_start; | ||
753 | struct device_node *hyper_node; | ||
754 | u32 *insts; | ||
755 | int len, i; | ||
756 | |||
757 | hyper_node = of_find_node_by_path("/hypervisor"); | ||
758 | if (!hyper_node) | ||
759 | return -1; | ||
760 | |||
761 | insts = (u32*)of_get_property(hyper_node, "hcall-instructions", &len); | ||
762 | if (len % 4) | ||
763 | return -1; | ||
764 | if (len > (4 * 4)) | ||
765 | return -1; | ||
766 | |||
767 | for (i = 0; i < (len / 4); i++) | ||
768 | kvm_patch_ins(&(&kvm_hypercall_start)[i], insts[i]); | ||
769 | |||
770 | return 0; | ||
771 | } | ||
772 | |||
773 | static __init void kvm_free_tmp(void) | 751 | static __init void kvm_free_tmp(void) |
774 | { | 752 | { |
775 | unsigned long start, end; | 753 | unsigned long start, end; |
@@ -791,7 +769,7 @@ static int __init kvm_guest_init(void) | |||
791 | if (!kvm_para_available()) | 769 | if (!kvm_para_available()) |
792 | goto free_tmp; | 770 | goto free_tmp; |
793 | 771 | ||
794 | if (kvm_para_setup()) | 772 | if (!epapr_paravirt_enabled) |
795 | goto free_tmp; | 773 | goto free_tmp; |
796 | 774 | ||
797 | if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE)) | 775 | if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE)) |