diff options
| -rw-r--r-- | arch/powerpc/include/asm/kvm_book3s.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/kvm_book3s_64.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/kvm_host.h | 14 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/asm-offsets.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_hv.c | 200 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 292 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_builtin.c | 104 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_interrupts.S | 39 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_ras.c | 5 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_rm_mmu.c | 110 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 245 | ||||
| -rw-r--r-- | arch/powerpc/kvm/powerpc.c | 10 |
13 files changed, 70 insertions, 955 deletions
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 6acf0c2a0f99..942c7b1678e3 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
| @@ -170,8 +170,6 @@ extern void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long addr, | |||
| 170 | unsigned long *nb_ret); | 170 | unsigned long *nb_ret); |
| 171 | extern void kvmppc_unpin_guest_page(struct kvm *kvm, void *addr, | 171 | extern void kvmppc_unpin_guest_page(struct kvm *kvm, void *addr, |
| 172 | unsigned long gpa, bool dirty); | 172 | unsigned long gpa, bool dirty); |
| 173 | extern long kvmppc_virtmode_h_enter(struct kvm_vcpu *vcpu, unsigned long flags, | ||
| 174 | long pte_index, unsigned long pteh, unsigned long ptel); | ||
| 175 | extern long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, | 173 | extern long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, |
| 176 | long pte_index, unsigned long pteh, unsigned long ptel, | 174 | long pte_index, unsigned long pteh, unsigned long ptel, |
| 177 | pgd_t *pgdir, bool realmode, unsigned long *idx_ret); | 175 | pgd_t *pgdir, bool realmode, unsigned long *idx_ret); |
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index a37f1a4a5b0b..2d81e202bdcc 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h | |||
| @@ -37,7 +37,6 @@ static inline void svcpu_put(struct kvmppc_book3s_shadow_vcpu *svcpu) | |||
| 37 | 37 | ||
| 38 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 38 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
| 39 | #define KVM_DEFAULT_HPT_ORDER 24 /* 16MB HPT by default */ | 39 | #define KVM_DEFAULT_HPT_ORDER 24 /* 16MB HPT by default */ |
| 40 | extern unsigned long kvm_rma_pages; | ||
| 41 | #endif | 40 | #endif |
| 42 | 41 | ||
| 43 | #define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */ | 42 | #define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */ |
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 7cf94a5e8411..5686a429d4b7 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
| @@ -180,11 +180,6 @@ struct kvmppc_spapr_tce_table { | |||
| 180 | struct page *pages[0]; | 180 | struct page *pages[0]; |
| 181 | }; | 181 | }; |
| 182 | 182 | ||
| 183 | struct kvm_rma_info { | ||
| 184 | atomic_t use_count; | ||
| 185 | unsigned long base_pfn; | ||
| 186 | }; | ||
| 187 | |||
| 188 | /* XICS components, defined in book3s_xics.c */ | 183 | /* XICS components, defined in book3s_xics.c */ |
| 189 | struct kvmppc_xics; | 184 | struct kvmppc_xics; |
| 190 | struct kvmppc_icp; | 185 | struct kvmppc_icp; |
| @@ -214,16 +209,9 @@ struct revmap_entry { | |||
| 214 | #define KVMPPC_RMAP_PRESENT 0x100000000ul | 209 | #define KVMPPC_RMAP_PRESENT 0x100000000ul |
| 215 | #define KVMPPC_RMAP_INDEX 0xfffffffful | 210 | #define KVMPPC_RMAP_INDEX 0xfffffffful |
| 216 | 211 | ||
| 217 | /* Low-order bits in memslot->arch.slot_phys[] */ | ||
| 218 | #define KVMPPC_PAGE_ORDER_MASK 0x1f | ||
| 219 | #define KVMPPC_PAGE_NO_CACHE HPTE_R_I /* 0x20 */ | ||
| 220 | #define KVMPPC_PAGE_WRITETHRU HPTE_R_W /* 0x40 */ | ||
| 221 | #define KVMPPC_GOT_PAGE 0x80 | ||
| 222 | |||
| 223 | struct kvm_arch_memory_slot { | 212 | struct kvm_arch_memory_slot { |
| 224 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 213 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
| 225 | unsigned long *rmap; | 214 | unsigned long *rmap; |
| 226 | unsigned long *slot_phys; | ||
| 227 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ | 215 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ |
| 228 | }; | 216 | }; |
| 229 | 217 | ||
| @@ -242,14 +230,12 @@ struct kvm_arch { | |||
| 242 | struct kvm_rma_info *rma; | 230 | struct kvm_rma_info *rma; |
| 243 | unsigned long vrma_slb_v; | 231 | unsigned long vrma_slb_v; |
| 244 | int rma_setup_done; | 232 | int rma_setup_done; |
| 245 | int using_mmu_notifiers; | ||
| 246 | u32 hpt_order; | 233 | u32 hpt_order; |
| 247 | atomic_t vcpus_running; | 234 | atomic_t vcpus_running; |
| 248 | u32 online_vcores; | 235 | u32 online_vcores; |
| 249 | unsigned long hpt_npte; | 236 | unsigned long hpt_npte; |
| 250 | unsigned long hpt_mask; | 237 | unsigned long hpt_mask; |
| 251 | atomic_t hpte_mod_interest; | 238 | atomic_t hpte_mod_interest; |
| 252 | spinlock_t slot_phys_lock; | ||
| 253 | cpumask_t need_tlb_flush; | 239 | cpumask_t need_tlb_flush; |
| 254 | int hpt_cma_alloc; | 240 | int hpt_cma_alloc; |
| 255 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ | 241 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index a6dcdb6d13c1..46bf652c9169 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
| @@ -170,8 +170,6 @@ extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | |||
| 170 | unsigned long ioba, unsigned long tce); | 170 | unsigned long ioba, unsigned long tce); |
| 171 | extern long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, | 171 | extern long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn, |
| 172 | unsigned long ioba); | 172 | unsigned long ioba); |
| 173 | extern struct kvm_rma_info *kvm_alloc_rma(void); | ||
| 174 | extern void kvm_release_rma(struct kvm_rma_info *ri); | ||
| 175 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); | 173 | extern struct page *kvm_alloc_hpt(unsigned long nr_pages); |
| 176 | extern void kvm_release_hpt(struct page *page, unsigned long nr_pages); | 174 | extern void kvm_release_hpt(struct page *page, unsigned long nr_pages); |
| 177 | extern int kvmppc_core_init_vm(struct kvm *kvm); | 175 | extern int kvmppc_core_init_vm(struct kvm *kvm); |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 9d7dede2847c..815212e9d7ba 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
| @@ -489,7 +489,6 @@ int main(void) | |||
| 489 | DEFINE(KVM_HOST_LPID, offsetof(struct kvm, arch.host_lpid)); | 489 | DEFINE(KVM_HOST_LPID, offsetof(struct kvm, arch.host_lpid)); |
| 490 | DEFINE(KVM_HOST_LPCR, offsetof(struct kvm, arch.host_lpcr)); | 490 | DEFINE(KVM_HOST_LPCR, offsetof(struct kvm, arch.host_lpcr)); |
| 491 | DEFINE(KVM_HOST_SDR1, offsetof(struct kvm, arch.host_sdr1)); | 491 | DEFINE(KVM_HOST_SDR1, offsetof(struct kvm, arch.host_sdr1)); |
| 492 | DEFINE(KVM_TLBIE_LOCK, offsetof(struct kvm, arch.tlbie_lock)); | ||
| 493 | DEFINE(KVM_NEED_FLUSH, offsetof(struct kvm, arch.need_tlb_flush.bits)); | 492 | DEFINE(KVM_NEED_FLUSH, offsetof(struct kvm, arch.need_tlb_flush.bits)); |
| 494 | DEFINE(KVM_ENABLED_HCALLS, offsetof(struct kvm, arch.enabled_hcalls)); | 493 | DEFINE(KVM_ENABLED_HCALLS, offsetof(struct kvm, arch.enabled_hcalls)); |
| 495 | DEFINE(KVM_LPCR, offsetof(struct kvm, arch.lpcr)); | 494 | DEFINE(KVM_LPCR, offsetof(struct kvm, arch.lpcr)); |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 311e4a38dd8b..534acb3c6c3d 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
| @@ -39,9 +39,6 @@ | |||
| 39 | 39 | ||
| 40 | #include "trace_hv.h" | 40 | #include "trace_hv.h" |
| 41 | 41 | ||
| 42 | /* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */ | ||
| 43 | #define MAX_LPID_970 63 | ||
| 44 | |||
| 45 | /* Power architecture requires HPT is at least 256kB */ | 42 | /* Power architecture requires HPT is at least 256kB */ |
| 46 | #define PPC_MIN_HPT_ORDER 18 | 43 | #define PPC_MIN_HPT_ORDER 18 |
| 47 | 44 | ||
| @@ -231,14 +228,9 @@ int kvmppc_mmu_hv_init(void) | |||
| 231 | if (!cpu_has_feature(CPU_FTR_HVMODE)) | 228 | if (!cpu_has_feature(CPU_FTR_HVMODE)) |
| 232 | return -EINVAL; | 229 | return -EINVAL; |
| 233 | 230 | ||
| 234 | /* POWER7 has 10-bit LPIDs, PPC970 and e500mc have 6-bit LPIDs */ | 231 | /* POWER7 has 10-bit LPIDs (12-bit in POWER8) */ |
| 235 | if (cpu_has_feature(CPU_FTR_ARCH_206)) { | 232 | host_lpid = mfspr(SPRN_LPID); |
| 236 | host_lpid = mfspr(SPRN_LPID); /* POWER7 */ | 233 | rsvd_lpid = LPID_RSVD; |
| 237 | rsvd_lpid = LPID_RSVD; | ||
| 238 | } else { | ||
| 239 | host_lpid = 0; /* PPC970 */ | ||
| 240 | rsvd_lpid = MAX_LPID_970; | ||
| 241 | } | ||
| 242 | 234 | ||
| 243 | kvmppc_init_lpid(rsvd_lpid + 1); | 235 | kvmppc_init_lpid(rsvd_lpid + 1); |
| 244 | 236 | ||
| @@ -261,130 +253,12 @@ static void kvmppc_mmu_book3s_64_hv_reset_msr(struct kvm_vcpu *vcpu) | |||
| 261 | kvmppc_set_msr(vcpu, msr); | 253 | kvmppc_set_msr(vcpu, msr); |
| 262 | } | 254 | } |
| 263 | 255 | ||
| 264 | /* | ||
| 265 | * This is called to get a reference to a guest page if there isn't | ||
| 266 | * one already in the memslot->arch.slot_phys[] array. | ||
| 267 | */ | ||
| 268 | static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn, | ||
| 269 | struct kvm_memory_slot *memslot, | ||
| 270 | unsigned long psize) | ||
| 271 | { | ||
| 272 | unsigned long start; | ||
| 273 | long np, err; | ||
| 274 | struct page *page, *hpage, *pages[1]; | ||
| 275 | unsigned long s, pgsize; | ||
| 276 | unsigned long *physp; | ||
| 277 | unsigned int is_io, got, pgorder; | ||
| 278 | struct vm_area_struct *vma; | ||
| 279 | unsigned long pfn, i, npages; | ||
| 280 | |||
| 281 | physp = memslot->arch.slot_phys; | ||
| 282 | if (!physp) | ||
| 283 | return -EINVAL; | ||
| 284 | if (physp[gfn - memslot->ba | ||
