aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r--arch/powerpc/kvm/book3s.c26
-rw-r--r--arch/powerpc/kvm/book3s_32_mmu.c3
-rw-r--r--arch/powerpc/kvm/book3s_emulate.c4
-rw-r--r--arch/powerpc/kvm/book3s_rmhandlers.S4
4 files changed, 34 insertions, 3 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index f8ac26599f6d..61ae0faf0d24 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -40,6 +40,13 @@
40static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr, 40static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr,
41 ulong msr); 41 ulong msr);
42 42
43/* Some compatibility defines */
44#ifdef CONFIG_PPC_BOOK3S_32
45#define MSR_USER32 MSR_USER
46#define MSR_USER64 MSR_USER
47#define HW_PAGE_SIZE PAGE_SIZE
48#endif
49
43struct kvm_stats_debugfs_item debugfs_entries[] = { 50struct kvm_stats_debugfs_item debugfs_entries[] = {
44 { "exits", VCPU_STAT(sum_exits) }, 51 { "exits", VCPU_STAT(sum_exits) },
45 { "mmio", VCPU_STAT(mmio_exits) }, 52 { "mmio", VCPU_STAT(mmio_exits) },
@@ -348,11 +355,14 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
348{ 355{
349 vcpu->arch.hflags &= ~BOOK3S_HFLAG_SLB; 356 vcpu->arch.hflags &= ~BOOK3S_HFLAG_SLB;
350 vcpu->arch.pvr = pvr; 357 vcpu->arch.pvr = pvr;
358#ifdef CONFIG_PPC_BOOK3S_64
351 if ((pvr >= 0x330000) && (pvr < 0x70330000)) { 359 if ((pvr >= 0x330000) && (pvr < 0x70330000)) {
352 kvmppc_mmu_book3s_64_init(vcpu); 360 kvmppc_mmu_book3s_64_init(vcpu);
353 to_book3s(vcpu)->hior = 0xfff00000; 361 to_book3s(vcpu)->hior = 0xfff00000;
354 to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL; 362 to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL;
355 } else { 363 } else
364#endif
365 {
356 kvmppc_mmu_book3s_32_init(vcpu); 366 kvmppc_mmu_book3s_32_init(vcpu);
357 to_book3s(vcpu)->hior = 0; 367 to_book3s(vcpu)->hior = 0;
358 to_book3s(vcpu)->msr_mask = 0xffffffffULL; 368 to_book3s(vcpu)->msr_mask = 0xffffffffULL;
@@ -369,6 +379,11 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
369 really needs them in a VM on Cell and force disable them. */ 379 really needs them in a VM on Cell and force disable them. */
370 if (!strcmp(cur_cpu_spec->platform, "ppc-cell-be")) 380 if (!strcmp(cur_cpu_spec->platform, "ppc-cell-be"))
371 to_book3s(vcpu)->msr_mask &= ~(MSR_FE0 | MSR_FE1); 381 to_book3s(vcpu)->msr_mask &= ~(MSR_FE0 | MSR_FE1);
382
383#ifdef CONFIG_PPC_BOOK3S_32
384 /* 32 bit Book3S always has 32 byte dcbz */
385 vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32;
386#endif
372} 387}
373 388
374/* Book3s_32 CPUs always have 32 bytes cache line size, which Linux assumes. To 389/* Book3s_32 CPUs always have 32 bytes cache line size, which Linux assumes. To
@@ -1212,8 +1227,13 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
1212 1227
1213 vcpu->arch.host_retip = kvm_return_point; 1228 vcpu->arch.host_retip = kvm_return_point;
1214 vcpu->arch.host_msr = mfmsr(); 1229 vcpu->arch.host_msr = mfmsr();
1230#ifdef CONFIG_PPC_BOOK3S_64
1215 /* default to book3s_64 (970fx) */ 1231 /* default to book3s_64 (970fx) */
1216 vcpu->arch.pvr = 0x3C0301; 1232 vcpu->arch.pvr = 0x3C0301;
1233#else
1234 /* default to book3s_32 (750) */
1235 vcpu->arch.pvr = 0x84202;
1236#endif
1217 kvmppc_set_pvr(vcpu, vcpu->arch.pvr); 1237 kvmppc_set_pvr(vcpu, vcpu->arch.pvr);
1218 vcpu_book3s->slb_nr = 64; 1238 vcpu_book3s->slb_nr = 64;
1219 1239
@@ -1221,7 +1241,11 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id)
1221 vcpu->arch.trampoline_lowmem = kvmppc_trampoline_lowmem; 1241 vcpu->arch.trampoline_lowmem = kvmppc_trampoline_lowmem;
1222 vcpu->arch.trampoline_enter = kvmppc_trampoline_enter; 1242 vcpu->arch.trampoline_enter = kvmppc_trampoline_enter;
1223 vcpu->arch.highmem_handler = (ulong)kvmppc_handler_highmem; 1243 vcpu->arch.highmem_handler = (ulong)kvmppc_handler_highmem;
1244#ifdef CONFIG_PPC_BOOK3S_64
1224 vcpu->arch.rmcall = *(ulong*)kvmppc_rmcall; 1245 vcpu->arch.rmcall = *(ulong*)kvmppc_rmcall;
1246#else
1247 vcpu->arch.rmcall = (ulong)kvmppc_rmcall;
1248#endif
1225 1249
1226 vcpu->arch.shadow_msr = MSR_USER64; 1250 vcpu->arch.shadow_msr = MSR_USER64;
1227 1251
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 7071e22b42ff..48efb37500a1 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -45,6 +45,9 @@
45 45
46#define PTEG_FLAG_ACCESSED 0x00000100 46#define PTEG_FLAG_ACCESSED 0x00000100
47#define PTEG_FLAG_DIRTY 0x00000080 47#define PTEG_FLAG_DIRTY 0x00000080
48#ifndef SID_SHIFT
49#define SID_SHIFT 28
50#endif
48 51
49static inline bool check_debug_ip(struct kvm_vcpu *vcpu) 52static inline bool check_debug_ip(struct kvm_vcpu *vcpu)
50{ 53{
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index daa829b8f1f1..3f7afb5f3483 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -59,6 +59,10 @@
59#define SPRN_GQR6 918 59#define SPRN_GQR6 918
60#define SPRN_GQR7 919 60#define SPRN_GQR7 919
61 61
62/* Book3S_32 defines mfsrin(v) - but that messes up our abstract
63 * function pointers, so let's just disable the define. */
64#undef mfsrin
65
62int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, 66int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
63 unsigned int inst, int *advance) 67 unsigned int inst, int *advance)
64{ 68{
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S
index 8a1c4bdb58b3..506d5c316c96 100644
--- a/arch/powerpc/kvm/book3s_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_rmhandlers.S
@@ -242,10 +242,10 @@ define_load_up(vsx)
242 242
243.global kvmppc_trampoline_lowmem 243.global kvmppc_trampoline_lowmem
244kvmppc_trampoline_lowmem: 244kvmppc_trampoline_lowmem:
245 .long kvmppc_handler_lowmem_trampoline - _stext 245 .long kvmppc_handler_lowmem_trampoline - CONFIG_KERNEL_START
246 246
247.global kvmppc_trampoline_enter 247.global kvmppc_trampoline_enter
248kvmppc_trampoline_enter: 248kvmppc_trampoline_enter:
249 .long kvmppc_handler_trampoline_enter - _stext 249 .long kvmppc_handler_trampoline_enter - CONFIG_KERNEL_START
250 250
251#include "book3s_segment.S" 251#include "book3s_segment.S"