kvm.c (e644dae645e167d154c0526358940986682a72b0) kvm.c (2e1ae9c07df5956ebab19144aa0da58ea37c9f69)
1/*
2 * Copyright (C) 2010 SUSE Linux Products GmbH. All rights reserved.
3 * Copyright 2010-2011 Freescale Semiconductor, Inc.
4 *
5 * Authors:
6 * Alexander Graf <agraf@suse.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 17 unchanged lines hidden (view full) ---

26#include <linux/slab.h>
27#include <linux/of.h>
28
29#include <asm/reg.h>
30#include <asm/sections.h>
31#include <asm/cacheflush.h>
32#include <asm/disassemble.h>
33#include <asm/ppc-opcode.h>
1/*
2 * Copyright (C) 2010 SUSE Linux Products GmbH. All rights reserved.
3 * Copyright 2010-2011 Freescale Semiconductor, Inc.
4 *
5 * Authors:
6 * Alexander Graf <agraf@suse.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 17 unchanged lines hidden (view full) ---

26#include <linux/slab.h>
27#include <linux/of.h>
28
29#include <asm/reg.h>
30#include <asm/sections.h>
31#include <asm/cacheflush.h>
32#include <asm/disassemble.h>
33#include <asm/ppc-opcode.h>
34#include <asm/epapr_hcalls.h>
34
35#define KVM_MAGIC_PAGE (-4096L)
36#define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x)
37
38#define KVM_INST_LWZ 0x80000000
39#define KVM_INST_STW 0x90000000
40#define KVM_INST_LD 0xe8000000
41#define KVM_INST_STD 0xf8000000

--- 679 unchanged lines hidden (view full) ---

721 unsigned long register r6 asm("r6") = in[3];
722 unsigned long register r7 asm("r7") = in[4];
723 unsigned long register r8 asm("r8") = in[5];
724 unsigned long register r9 asm("r9") = in[6];
725 unsigned long register r10 asm("r10") = in[7];
726 unsigned long register r11 asm("r11") = nr;
727 unsigned long register r12 asm("r12");
728
35
36#define KVM_MAGIC_PAGE (-4096L)
37#define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x)
38
39#define KVM_INST_LWZ 0x80000000
40#define KVM_INST_STW 0x90000000
41#define KVM_INST_LD 0xe8000000
42#define KVM_INST_STD 0xf8000000

--- 679 unchanged lines hidden (view full) ---

722 unsigned long register r6 asm("r6") = in[3];
723 unsigned long register r7 asm("r7") = in[4];
724 unsigned long register r8 asm("r8") = in[5];
725 unsigned long register r9 asm("r9") = in[6];
726 unsigned long register r10 asm("r10") = in[7];
727 unsigned long register r11 asm("r11") = nr;
728 unsigned long register r12 asm("r12");
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"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11),
732 "=r"(r12)
733 : "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "r"(r8),
734 "r"(r9), "r"(r10), "r"(r11)
735 : "memory", "cc", "xer", "ctr", "lr");
736
737 out[0] = r4;

--- 4 unchanged lines hidden (view full) ---

742 out[5] = r9;
743 out[6] = r10;
744 out[7] = r11;
745
746 return r3;
747}
748EXPORT_SYMBOL_GPL(kvm_hypercall);
749
731 : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6),
732 "=r"(r7), "=r"(r8), "=r"(r9), "=r"(r10), "=r"(r11),
733 "=r"(r12)
734 : "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7), "r"(r8),
735 "r"(r9), "r"(r10), "r"(r11)
736 : "memory", "cc", "xer", "ctr", "lr");
737
738 out[0] = r4;

--- 4 unchanged lines hidden (view full) ---

743 out[5] = r9;
744 out[6] = r10;
745 out[7] = r11;
746
747 return r3;
748}
749EXPORT_SYMBOL_GPL(kvm_hypercall);
750
750static 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
773static __init void kvm_free_tmp(void)
774{
775 unsigned long start, end;
776
777 start = (ulong)&kvm_tmp[kvm_tmp_index + (PAGE_SIZE - 1)] & PAGE_MASK;
778 end = (ulong)&kvm_tmp[ARRAY_SIZE(kvm_tmp)] & PAGE_MASK;
779
780 /* Free the tmp space we don't need */

--- 5 unchanged lines hidden (view full) ---

786 }
787}
788
789static int __init kvm_guest_init(void)
790{
791 if (!kvm_para_available())
792 goto free_tmp;
793
751static __init void kvm_free_tmp(void)
752{
753 unsigned long start, end;
754
755 start = (ulong)&kvm_tmp[kvm_tmp_index + (PAGE_SIZE - 1)] & PAGE_MASK;
756 end = (ulong)&kvm_tmp[ARRAY_SIZE(kvm_tmp)] & PAGE_MASK;
757
758 /* Free the tmp space we don't need */

--- 5 unchanged lines hidden (view full) ---

764 }
765}
766
767static int __init kvm_guest_init(void)
768{
769 if (!kvm_para_available())
770 goto free_tmp;
771
794 if (kvm_para_setup())
772 if (!epapr_paravirt_enabled)
795 goto free_tmp;
796
797 if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE))
798 kvm_use_magic_page();
799
800#ifdef CONFIG_PPC_BOOK3S_64
801 /* Enable napping */
802 powersave_nap = 1;
803#endif
804
805free_tmp:
806 kvm_free_tmp();
807
808 return 0;
809}
810
811postcore_initcall(kvm_guest_init);
773 goto free_tmp;
774
775 if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE))
776 kvm_use_magic_page();
777
778#ifdef CONFIG_PPC_BOOK3S_64
779 /* Enable napping */
780 powersave_nap = 1;
781#endif
782
783free_tmp:
784 kvm_free_tmp();
785
786 return 0;
787}
788
789postcore_initcall(kvm_guest_init);