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); |