diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-30 18:36:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-30 18:36:45 -0400 |
commit | 1bc87b00556e8f7ba30a1010471951c5b8f71114 (patch) | |
tree | e73c2d187e2dff0df97ed82e32b45e362b923117 /arch/powerpc | |
parent | acff987d94cbdb4049f3706bed1f1792f8ef6837 (diff) | |
parent | f1c1da2bde712812a3e0f9a7a7ebe7a916a4b5f4 (diff) |
Merge branch 'kvm-updates/3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
* 'kvm-updates/3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm: (75 commits)
KVM: SVM: Keep intercepting task switching with NPT enabled
KVM: s390: implement sigp external call
KVM: s390: fix register setting
KVM: s390: fix return value of kvm_arch_init_vm
KVM: s390: check cpu_id prior to using it
KVM: emulate lapic tsc deadline timer for guest
x86: TSC deadline definitions
KVM: Fix simultaneous NMIs
KVM: x86 emulator: convert push %sreg/pop %sreg to direct decode
KVM: x86 emulator: switch lds/les/lss/lfs/lgs to direct decode
KVM: x86 emulator: streamline decode of segment registers
KVM: x86 emulator: simplify OpMem64 decode
KVM: x86 emulator: switch src decode to decode_operand()
KVM: x86 emulator: qualify OpReg inhibit_byte_regs hack
KVM: x86 emulator: switch OpImmUByte decode to decode_imm()
KVM: x86 emulator: free up some flag bits near src, dst
KVM: x86 emulator: switch src2 to generic decode_operand()
KVM: x86 emulator: expand decode flags to 64 bits
KVM: x86 emulator: split dst decode to a generic decode_operand()
KVM: x86 emulator: move memop, memopp into emulation context
...
Diffstat (limited to 'arch/powerpc')
25 files changed, 963 insertions, 456 deletions
diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h index a4f6c85431f8..08fe69edcd10 100644 --- a/arch/powerpc/include/asm/kvm.h +++ b/arch/powerpc/include/asm/kvm.h | |||
@@ -149,6 +149,12 @@ struct kvm_regs { | |||
149 | #define KVM_SREGS_E_UPDATE_DBSR (1 << 3) | 149 | #define KVM_SREGS_E_UPDATE_DBSR (1 << 3) |
150 | 150 | ||
151 | /* | 151 | /* |
152 | * Book3S special bits to indicate contents in the struct by maintaining | ||
153 | * backwards compatibility with older structs. If adding a new field, | ||
154 | * please make sure to add a flag for that new field */ | ||
155 | #define KVM_SREGS_S_HIOR (1 << 0) | ||
156 | |||
157 | /* | ||
152 | * In KVM_SET_SREGS, reserved/pad fields must be left untouched from a | 158 | * In KVM_SET_SREGS, reserved/pad fields must be left untouched from a |
153 | * previous KVM_GET_REGS. | 159 | * previous KVM_GET_REGS. |
154 | * | 160 | * |
@@ -173,6 +179,8 @@ struct kvm_sregs { | |||
173 | __u64 ibat[8]; | 179 | __u64 ibat[8]; |
174 | __u64 dbat[8]; | 180 | __u64 dbat[8]; |
175 | } ppc32; | 181 | } ppc32; |
182 | __u64 flags; /* KVM_SREGS_S_ */ | ||
183 | __u64 hior; | ||
176 | } s; | 184 | } s; |
177 | struct { | 185 | struct { |
178 | union { | 186 | union { |
@@ -276,6 +284,11 @@ struct kvm_guest_debug_arch { | |||
276 | #define KVM_INTERRUPT_UNSET -2U | 284 | #define KVM_INTERRUPT_UNSET -2U |
277 | #define KVM_INTERRUPT_SET_LEVEL -3U | 285 | #define KVM_INTERRUPT_SET_LEVEL -3U |
278 | 286 | ||
287 | #define KVM_CPU_440 1 | ||
288 | #define KVM_CPU_E500V2 2 | ||
289 | #define KVM_CPU_3S_32 3 | ||
290 | #define KVM_CPU_3S_64 4 | ||
291 | |||
279 | /* for KVM_CAP_SPAPR_TCE */ | 292 | /* for KVM_CAP_SPAPR_TCE */ |
280 | struct kvm_create_spapr_tce { | 293 | struct kvm_create_spapr_tce { |
281 | __u64 liobn; | 294 | __u64 liobn; |
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 98da010252a3..a384ffdf33de 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
@@ -90,6 +90,8 @@ struct kvmppc_vcpu_book3s { | |||
90 | #endif | 90 | #endif |
91 | int context_id[SID_CONTEXTS]; | 91 | int context_id[SID_CONTEXTS]; |
92 | 92 | ||
93 | bool hior_sregs; /* HIOR is set by SREGS, not PVR */ | ||
94 | |||
93 | struct hlist_head hpte_hash_pte[HPTEG_HASH_NUM_PTE]; | 95 | struct hlist_head hpte_hash_pte[HPTEG_HASH_NUM_PTE]; |
94 | struct hlist_head hpte_hash_pte_long[HPTEG_HASH_NUM_PTE_LONG]; | 96 | struct hlist_head hpte_hash_pte_long[HPTEG_HASH_NUM_PTE_LONG]; |
95 | struct hlist_head hpte_hash_vpte[HPTEG_HASH_NUM_VPTE]; | 97 | struct hlist_head hpte_hash_vpte[HPTEG_HASH_NUM_VPTE]; |
@@ -139,15 +141,14 @@ extern void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr); | |||
139 | extern int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu); | 141 | extern int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu); |
140 | extern pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); | 142 | extern pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn); |
141 | 143 | ||
142 | extern void kvmppc_handler_lowmem_trampoline(void); | 144 | extern void kvmppc_entry_trampoline(void); |
143 | extern void kvmppc_handler_trampoline_enter(void); | ||
144 | extern void kvmppc_rmcall(ulong srr0, ulong srr1); | ||
145 | extern void kvmppc_hv_entry_trampoline(void); | 145 | extern void kvmppc_hv_entry_trampoline(void); |
146 | extern void kvmppc_load_up_fpu(void); | 146 | extern void kvmppc_load_up_fpu(void); |
147 | extern void kvmppc_load_up_altivec(void); | 147 | extern void kvmppc_load_up_altivec(void); |
148 | extern void kvmppc_load_up_vsx(void); | 148 | extern void kvmppc_load_up_vsx(void); |
149 | extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst); | 149 | extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst); |
150 | extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst); | 150 | extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst); |
151 | extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd); | ||
151 | 152 | ||
152 | static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) | 153 | static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) |
153 | { | 154 | { |
@@ -382,6 +383,39 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) | |||
382 | } | 383 | } |
383 | #endif | 384 | #endif |
384 | 385 | ||
386 | static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | ||
387 | unsigned long pte_index) | ||
388 | { | ||
389 | unsigned long rb, va_low; | ||
390 | |||
391 | rb = (v & ~0x7fUL) << 16; /* AVA field */ | ||
392 | va_low = pte_index >> 3; | ||
393 | if (v & HPTE_V_SECONDARY) | ||
394 | va_low = ~va_low; | ||
395 | /* xor vsid from AVA */ | ||
396 | if (!(v & HPTE_V_1TB_SEG)) | ||
397 | va_low ^= v >> 12; | ||
398 | else | ||
399 | va_low ^= v >> 24; | ||
400 | va_low &= 0x7ff; | ||
401 | if (v & HPTE_V_LARGE) { | ||
402 | rb |= 1; /* L field */ | ||
403 | if (cpu_has_feature(CPU_FTR_ARCH_206) && | ||
404 | (r & 0xff000)) { | ||
405 | /* non-16MB large page, must be 64k */ | ||
406 | /* (masks depend on page size) */ | ||
407 | rb |= 0x1000; /* page encoding in LP field */ | ||
408 | rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ | ||
409 | rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ | ||
410 | } | ||
411 | } else { | ||
412 | /* 4kB page */ | ||
413 | rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */ | ||
414 | } | ||
415 | rb |= (v >> 54) & 0x300; /* B field */ | ||
416 | return rb; | ||
417 | } | ||
418 | |||
385 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly | 419 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly |
386 | * instruction for the OSI hypercalls */ | 420 | * instruction for the OSI hypercalls */ |
387 | #define OSI_SC_MAGIC_R3 0x113724FA | 421 | #define OSI_SC_MAGIC_R3 0x113724FA |
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index ef7b3688c3b6..1f2f5b6156bd 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
@@ -75,6 +75,8 @@ struct kvmppc_host_state { | |||
75 | ulong scratch0; | 75 | ulong scratch0; |
76 | ulong scratch1; | 76 | ulong scratch1; |
77 | u8 in_guest; | 77 | u8 in_guest; |
78 | u8 restore_hid5; | ||
79 | u8 napping; | ||
78 | 80 | ||
79 | #ifdef CONFIG_KVM_BOOK3S_64_HV | 81 | #ifdef CONFIG_KVM_BOOK3S_64_HV |
80 | struct kvm_vcpu *kvm_vcpu; | 82 | struct kvm_vcpu *kvm_vcpu; |
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index cc22b282d755..bf8af5d5d5dc 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
@@ -198,21 +198,29 @@ struct kvm_arch { | |||
198 | */ | 198 | */ |
199 | struct kvmppc_vcore { | 199 | struct kvmppc_vcore { |
200 | int n_runnable; | 200 | int n_runnable; |
201 | int n_blocked; | 201 | int n_busy; |
202 | int num_threads; | 202 | int num_threads; |
203 | int entry_exit_count; | 203 | int entry_exit_count; |
204 | int n_woken; | 204 | int n_woken; |
205 | int nap_count; | 205 | int nap_count; |
206 | int napping_threads; | ||
206 | u16 pcpu; | 207 | u16 pcpu; |
207 | u8 vcore_running; | 208 | u8 vcore_state; |
208 | u8 in_guest; | 209 | u8 in_guest; |
209 | struct list_head runnable_threads; | 210 | struct list_head runnable_threads; |
210 | spinlock_t lock; | 211 | spinlock_t lock; |
212 | wait_queue_head_t wq; | ||
211 | }; | 213 | }; |
212 | 214 | ||
213 | #define VCORE_ENTRY_COUNT(vc) ((vc)->entry_exit_count & 0xff) | 215 | #define VCORE_ENTRY_COUNT(vc) ((vc)->entry_exit_count & 0xff) |
214 | #define VCORE_EXIT_COUNT(vc) ((vc)->entry_exit_count >> 8) | 216 | #define VCORE_EXIT_COUNT(vc) ((vc)->entry_exit_count >> 8) |
215 | 217 | ||
218 | /* Values for vcore_state */ | ||
219 | #define VCORE_INACTIVE 0 | ||
220 | #define VCORE_RUNNING 1 | ||
221 | #define VCORE_EXITING 2 | ||
222 | #define VCORE_SLEEPING 3 | ||
223 | |||
216 | struct kvmppc_pte { | 224 | struct kvmppc_pte { |
217 | ulong eaddr; | 225 | ulong eaddr; |
218 | u64 vpage; | 226 | u64 vpage; |
@@ -258,14 +266,6 @@ struct kvm_vcpu_arch { | |||
258 | ulong host_stack; | 266 | ulong host_stack; |
259 | u32 host_pid; | 267 | u32 host_pid; |
260 | #ifdef CONFIG_PPC_BOOK3S | 268 | #ifdef CONFIG_PPC_BOOK3S |
261 | ulong host_msr; | ||
262 | ulong host_r2; | ||
263 | void *host_retip; | ||
264 | ulong trampoline_lowmem; | ||
265 | ulong trampoline_enter; | ||
266 | ulong highmem_handler; | ||
267 | ulong rmcall; | ||
268 | ulong host_paca_phys; | ||
269 | struct kvmppc_slb slb[64]; | 269 | struct kvmppc_slb slb[64]; |
270 | int slb_max; /* 1 + index of last valid entry in slb[] */ | 270 | int slb_max; /* 1 + index of last valid entry in slb[] */ |
271 | int slb_nr; /* total number of entries in SLB */ | 271 | int slb_nr; /* total number of entries in SLB */ |
@@ -389,6 +389,9 @@ struct kvm_vcpu_arch { | |||
389 | u8 dcr_is_write; | 389 | u8 dcr_is_write; |
390 | u8 osi_needed; | 390 | u8 osi_needed; |
391 | u8 osi_enabled; | 391 | u8 osi_enabled; |
392 | u8 papr_enabled; | ||
393 | u8 sane; | ||
394 | u8 cpu_type; | ||
392 | u8 hcall_needed; | 395 | u8 hcall_needed; |
393 | 396 | ||
394 | u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */ | 397 | u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */ |
@@ -408,11 +411,13 @@ struct kvm_vcpu_arch { | |||
408 | struct dtl *dtl; | 411 | struct dtl *dtl; |
409 | struct dtl *dtl_end; | 412 | struct dtl *dtl_end; |
410 | 413 | ||
414 | wait_queue_head_t *wqp; | ||
411 | struct kvmppc_vcore *vcore; | 415 | struct kvmppc_vcore *vcore; |
412 | int ret; | 416 | int ret; |
413 | int trap; | 417 | int trap; |
414 | int state; | 418 | int state; |
415 | int ptid; | 419 | int ptid; |
420 | bool timer_running; | ||
416 | wait_queue_head_t cpu_run; | 421 | wait_queue_head_t cpu_run; |
417 | 422 | ||
418 | struct kvm_vcpu_arch_shared *shared; | 423 | struct kvm_vcpu_arch_shared *shared; |
@@ -428,8 +433,9 @@ struct kvm_vcpu_arch { | |||
428 | #endif | 433 | #endif |
429 | }; | 434 | }; |
430 | 435 | ||
431 | #define KVMPPC_VCPU_BUSY_IN_HOST 0 | 436 | /* Values for vcpu->arch.state */ |
432 | #define KVMPPC_VCPU_BLOCKED 1 | 437 | #define KVMPPC_VCPU_STOPPED 0 |
438 | #define KVMPPC_VCPU_BUSY_IN_HOST 1 | ||
433 | #define KVMPPC_VCPU_RUNNABLE 2 | 439 | #define KVMPPC_VCPU_RUNNABLE 2 |
434 | 440 | ||
435 | #endif /* __POWERPC_KVM_HOST_H__ */ | 441 | #endif /* __POWERPC_KVM_HOST_H__ */ |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index d121f49d62b8..46efd1a265c9 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
@@ -66,6 +66,7 @@ extern int kvmppc_emulate_instruction(struct kvm_run *run, | |||
66 | extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu); | 66 | extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu); |
67 | extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu); | 67 | extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu); |
68 | extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb); | 68 | extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb); |
69 | extern int kvmppc_sanity_check(struct kvm_vcpu *vcpu); | ||
69 | 70 | ||
70 | /* Core-specific hooks */ | 71 | /* Core-specific hooks */ |
71 | 72 | ||
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 5f078bc2063e..69f7ffe7f674 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <asm/compat.h> | 44 | #include <asm/compat.h> |
45 | #include <asm/mmu.h> | 45 | #include <asm/mmu.h> |
46 | #include <asm/hvcall.h> | 46 | #include <asm/hvcall.h> |
47 | #include <asm/xics.h> | ||
47 | #endif | 48 | #endif |
48 | #ifdef CONFIG_PPC_ISERIES | 49 | #ifdef CONFIG_PPC_ISERIES |
49 | #include <asm/iseries/alpaca.h> | 50 | #include <asm/iseries/alpaca.h> |
@@ -449,8 +450,6 @@ int main(void) | |||
449 | #ifdef CONFIG_PPC_BOOK3S | 450 | #ifdef CONFIG_PPC_BOOK3S |
450 | DEFINE(VCPU_KVM, offsetof(struct kvm_vcpu, kvm)); | 451 | DEFINE(VCPU_KVM, offsetof(struct kvm_vcpu, kvm)); |
451 | DEFINE(VCPU_VCPUID, offsetof(struct kvm_vcpu, vcpu_id)); | 452 | DEFINE(VCPU_VCPUID, offsetof(struct kvm_vcpu, vcpu_id)); |
452 | DEFINE(VCPU_HOST_RETIP, offsetof(struct kvm_vcpu, arch.host_retip)); | ||
453 | DEFINE(VCPU_HOST_MSR, offsetof(struct kvm_vcpu, arch.host_msr)); | ||
454 | DEFINE(VCPU_PURR, offsetof(struct kvm_vcpu, arch.purr)); | 453 | DEFINE(VCPU_PURR, offsetof(struct kvm_vcpu, arch.purr)); |
455 | DEFINE(VCPU_SPURR, offsetof(struct kvm_vcpu, arch.spurr)); | 454 | DEFINE(VCPU_SPURR, offsetof(struct kvm_vcpu, arch.spurr)); |
456 | DEFINE(VCPU_DSCR, offsetof(struct kvm_vcpu, arch.dscr)); | 455 | DEFINE(VCPU_DSCR, offsetof(struct kvm_vcpu, arch.dscr)); |
@@ -458,14 +457,12 @@ int main(void) | |||
458 | DEFINE(VCPU_UAMOR, offsetof(struct kvm_vcpu, arch.uamor)); | 457 | DEFINE(VCPU_UAMOR, offsetof(struct kvm_vcpu, arch.uamor)); |
459 | DEFINE(VCPU_CTRL, offsetof(struct kvm_vcpu, arch.ctrl)); | 458 | DEFINE(VCPU_CTRL, offsetof(struct kvm_vcpu, arch.ctrl)); |
460 | DEFINE(VCPU_DABR, offsetof(struct kvm_vcpu, arch.dabr)); | 459 | DEFINE(VCPU_DABR, offsetof(struct kvm_vcpu, arch.dabr)); |
461 | DEFINE(VCPU_TRAMPOLINE_LOWMEM, offsetof(struct kvm_vcpu, arch.trampoline_lowmem)); | ||
462 | DEFINE(VCPU_TRAMPOLINE_ENTER, offsetof(struct kvm_vcpu, arch.trampoline_enter)); | ||
463 | DEFINE(VCPU_HIGHMEM_HANDLER, offsetof(struct kvm_vcpu, arch.highmem_handler)); | ||
464 | DEFINE(VCPU_RMCALL, offsetof(struct kvm_vcpu, arch.rmcall)); | ||
465 | DEFINE(VCPU_HFLAGS, offsetof(struct kvm_vcpu, arch.hflags)); | 460 | DEFINE(VCPU_HFLAGS, offsetof(struct kvm_vcpu, arch.hflags)); |
466 | DEFINE(VCPU_DEC, offsetof(struct kvm_vcpu, arch.dec)); | 461 | DEFINE(VCPU_DEC, offsetof(struct kvm_vcpu, arch.dec)); |
467 | DEFINE(VCPU_DEC_EXPIRES, offsetof(struct kvm_vcpu, arch.dec_expires)); | 462 | DEFINE(VCPU_DEC_EXPIRES, offsetof(struct kvm_vcpu, arch.dec_expires)); |
468 | DEFINE(VCPU_PENDING_EXC, offsetof(struct kvm_vcpu, arch.pending_exceptions)); | 463 | DEFINE(VCPU_PENDING_EXC, offsetof(struct kvm_vcpu, arch.pending_exceptions)); |
464 | DEFINE(VCPU_CEDED, offsetof(struct kvm_vcpu, arch.ceded)); | ||
465 | DEFINE(VCPU_PRODDED, offsetof(struct kvm_vcpu, arch.prodded)); | ||
469 | DEFINE(VCPU_VPA, offsetof(struct kvm_vcpu, arch.vpa)); | 466 | DEFINE(VCPU_VPA, offsetof(struct kvm_vcpu, arch.vpa)); |
470 | DEFINE(VCPU_MMCR, offsetof(struct kvm_vcpu, arch.mmcr)); | 467 | DEFINE(VCPU_MMCR, offsetof(struct kvm_vcpu, arch.mmcr)); |
471 | DEFINE(VCPU_PMC, offsetof(struct kvm_vcpu, arch.pmc)); | 468 | DEFINE(VCPU_PMC, offsetof(struct kvm_vcpu, arch.pmc)); |
@@ -481,6 +478,7 @@ int main(void) | |||
481 | DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_count)); | 478 | DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_count)); |
482 | DEFINE(VCORE_NAP_COUNT, offsetof(struct kvmppc_vcore, nap_count)); | 479 | DEFINE(VCORE_NAP_COUNT, offsetof(struct kvmppc_vcore, nap_count)); |
483 | DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest)); | 480 | DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest)); |
481 | DEFINE(VCORE_NAPPING_THREADS, offsetof(struct kvmppc_vcore, napping_threads)); | ||
484 | DEFINE(VCPU_SVCPU, offsetof(struct kvmppc_vcpu_book3s, shadow_vcpu) - | 482 | DEFINE(VCPU_SVCPU, offsetof(struct kvmppc_vcpu_book3s, shadow_vcpu) - |
485 | offsetof(struct kvmppc_vcpu_book3s, vcpu)); | 483 | offsetof(struct kvmppc_vcpu_book3s, vcpu)); |
486 | DEFINE(VCPU_SLB_E, offsetof(struct kvmppc_slb, orige)); | 484 | DEFINE(VCPU_SLB_E, offsetof(struct kvmppc_slb, orige)); |
@@ -537,6 +535,8 @@ int main(void) | |||
537 | HSTATE_FIELD(HSTATE_SCRATCH0, scratch0); | 535 | HSTATE_FIELD(HSTATE_SCRATCH0, scratch0); |
538 | HSTATE_FIELD(HSTATE_SCRATCH1, scratch1); | 536 | HSTATE_FIELD(HSTATE_SCRATCH1, scratch1); |
539 | HSTATE_FIELD(HSTATE_IN_GUEST, in_guest); | 537 | HSTATE_FIELD(HSTATE_IN_GUEST, in_guest); |
538 | HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5); | ||
539 | HSTATE_FIELD(HSTATE_NAPPING, napping); | ||
540 | 540 | ||
541 | #ifdef CONFIG_KVM_BOOK3S_64_HV | 541 | #ifdef CONFIG_KVM_BOOK3S_64_HV |
542 | HSTATE_FIELD(HSTATE_KVM_VCPU, kvm_vcpu); | 542 | HSTATE_FIELD(HSTATE_KVM_VCPU, kvm_vcpu); |
@@ -549,6 +549,7 @@ int main(void) | |||
549 | HSTATE_FIELD(HSTATE_DSCR, host_dscr); | 549 | HSTATE_FIELD(HSTATE_DSCR, host_dscr); |
550 | HSTATE_FIELD(HSTATE_DABR, dabr); | 550 | HSTATE_FIELD(HSTATE_DABR, dabr); |
551 | HSTATE_FIELD(HSTATE_DECEXP, dec_expires); | 551 | HSTATE_FIELD(HSTATE_DECEXP, dec_expires); |
552 | DEFINE(IPI_PRIORITY, IPI_PRIORITY); | ||
552 | #endif /* CONFIG_KVM_BOOK3S_64_HV */ | 553 | #endif /* CONFIG_KVM_BOOK3S_64_HV */ |
553 | 554 | ||
554 | #else /* CONFIG_PPC_BOOK3S */ | 555 | #else /* CONFIG_PPC_BOOK3S */ |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 41b02c792aa3..29ddd8b1c274 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -427,16 +427,6 @@ slb_miss_user_pseries: | |||
427 | b . /* prevent spec. execution */ | 427 | b . /* prevent spec. execution */ |
428 | #endif /* __DISABLED__ */ | 428 | #endif /* __DISABLED__ */ |
429 | 429 | ||
430 | /* KVM's trampoline code needs to be close to the interrupt handlers */ | ||
431 | |||
432 | #ifdef CONFIG_KVM_BOOK3S_64_HANDLER | ||
433 | #ifdef CONFIG_KVM_BOOK3S_PR | ||
434 | #include "../kvm/book3s_rmhandlers.S" | ||
435 | #else | ||
436 | #include "../kvm/book3s_hv_rmhandlers.S" | ||
437 | #endif | ||
438 | #endif | ||
439 | |||
440 | .align 7 | 430 | .align 7 |
441 | .globl __end_interrupts | 431 | .globl __end_interrupts |
442 | __end_interrupts: | 432 | __end_interrupts: |
diff --git a/arch/powerpc/kvm/44x.c b/arch/powerpc/kvm/44x.c index da3a1225c0ac..ca1f88b3dc59 100644 --- a/arch/powerpc/kvm/44x.c +++ b/arch/powerpc/kvm/44x.c | |||
@@ -78,6 +78,8 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu) | |||
78 | for (i = 0; i < ARRAY_SIZE(vcpu_44x->shadow_refs); i++) | 78 | for (i = 0; i < ARRAY_SIZE(vcpu_44x->shadow_refs); i++) |
79 | vcpu_44x->shadow_refs[i].gtlb_index = -1; | 79 | vcpu_44x->shadow_refs[i].gtlb_index = -1; |
80 | 80 | ||
81 | vcpu->arch.cpu_type = KVM_CPU_440; | ||
82 | |||
81 | return 0; | 83 | return 0; |
82 | } | 84 | } |
83 | 85 | ||
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile index 08428e2c188d..3688aeecc4b2 100644 --- a/arch/powerpc/kvm/Makefile +++ b/arch/powerpc/kvm/Makefile | |||
@@ -43,18 +43,22 @@ kvm-book3s_64-objs-$(CONFIG_KVM_BOOK3S_64_PR) := \ | |||
43 | fpu.o \ | 43 | fpu.o \ |
44 | book3s_paired_singles.o \ | 44 | book3s_paired_singles.o \ |
45 | book3s_pr.o \ | 45 | book3s_pr.o \ |
46 | book3s_pr_papr.o \ | ||
46 | book3s_emulate.o \ | 47 | book3s_emulate.o \ |
47 | book3s_interrupts.o \ | 48 | book3s_interrupts.o \ |
48 | book3s_mmu_hpte.o \ | 49 | book3s_mmu_hpte.o \ |
49 | book3s_64_mmu_host.o \ | 50 | book3s_64_mmu_host.o \ |
50 | book3s_64_mmu.o \ | 51 | book3s_64_mmu.o \ |
51 | book3s_32_mmu.o | 52 | book3s_32_mmu.o |
53 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_PR) := \ | ||
54 | book3s_rmhandlers.o | ||
52 | 55 | ||
53 | kvm-book3s_64-objs-$(CONFIG_KVM_BOOK3S_64_HV) := \ | 56 | kvm-book3s_64-objs-$(CONFIG_KVM_BOOK3S_64_HV) := \ |
54 | book3s_hv.o \ | 57 | book3s_hv.o \ |
55 | book3s_hv_interrupts.o \ | 58 | book3s_hv_interrupts.o \ |
56 | book3s_64_mmu_hv.o | 59 | book3s_64_mmu_hv.o |
57 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HV) := \ | 60 | kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HV) := \ |
61 | book3s_hv_rmhandlers.o \ | ||
58 | book3s_hv_rm_mmu.o \ | 62 | book3s_hv_rm_mmu.o \ |
59 | book3s_64_vio_hv.o \ | 63 | book3s_64_vio_hv.o \ |
60 | book3s_hv_builtin.o | 64 | book3s_hv_builtin.o |
diff --git a/arch/powerpc/kvm/book3s_32_sr.S b/arch/powerpc/kvm/book3s_32_sr.S index 3608471ad2d8..7e06a6fc8d07 100644 --- a/arch/powerpc/kvm/book3s_32_sr.S +++ b/arch/powerpc/kvm/book3s_32_sr.S | |||
@@ -31,7 +31,7 @@ | |||
31 | * R1 = host R1 | 31 | * R1 = host R1 |
32 | * R2 = host R2 | 32 | * R2 = host R2 |
33 | * R3 = shadow vcpu | 33 | * R3 = shadow vcpu |
34 | * all other volatile GPRS = free | 34 | * all other volatile GPRS = free except R4, R6 |
35 | * SVCPU[CR] = guest CR | 35 | * SVCPU[CR] = guest CR |
36 | * SVCPU[XER] = guest XER | 36 | * SVCPU[XER] = guest XER |
37 | * SVCPU[CTR] = guest CTR | 37 | * SVCPU[CTR] = guest CTR |
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c index c6d3e194b6b4..b871721c0050 100644 --- a/arch/powerpc/kvm/book3s_64_mmu.c +++ b/arch/powerpc/kvm/book3s_64_mmu.c | |||
@@ -128,7 +128,13 @@ static hva_t kvmppc_mmu_book3s_64_get_pteg( | |||
128 | dprintk("MMU: page=0x%x sdr1=0x%llx pteg=0x%llx vsid=0x%llx\n", | 128 | dprintk("MMU: page=0x%x sdr1=0x%llx pteg=0x%llx vsid=0x%llx\n", |
129 | page, vcpu_book3s->sdr1, pteg, slbe->vsid); | 129 | page, vcpu_book3s->sdr1, pteg, slbe->vsid); |
130 | 130 | ||
131 | r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT); | 131 | /* When running a PAPR guest, SDR1 contains a HVA address instead |
132 | of a GPA */ | ||
133 | if (vcpu_book3s->vcpu.arch.papr_enabled) | ||
134 | r = pteg; | ||
135 | else | ||
136 | r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT); | ||
137 | |||
132 | if (kvm_is_error_hva(r)) | 138 | if (kvm_is_error_hva(r)) |
133 | return r; | 139 | return r; |
134 | return r | (pteg & ~PAGE_MASK); | 140 | return r | (pteg & ~PAGE_MASK); |
diff --git a/arch/powerpc/kvm/book3s_64_slb.S b/arch/powerpc/kvm/book3s_64_slb.S index 04e7d3bbfe8b..f2e6e48ea463 100644 --- a/arch/powerpc/kvm/book3s_64_slb.S +++ b/arch/powerpc/kvm/book3s_64_slb.S | |||
@@ -53,7 +53,7 @@ slb_exit_skip_ ## num: | |||
53 | * R1 = host R1 | 53 | * R1 = host R1 |
54 | * R2 = host R2 | 54 | * R2 = host R2 |
55 | * R3 = shadow vcpu | 55 | * R3 = shadow vcpu |
56 | * all other volatile GPRS = free | 56 | * all other volatile GPRS = free except R4, R6 |
57 | * SVCPU[CR] = guest CR | 57 | * SVCPU[CR] = guest CR |
58 | * SVCPU[XER] = guest XER | 58 | * SVCPU[XER] = guest XER |
59 | * SVCPU[CTR] = guest CTR | 59 | * SVCPU[CTR] = guest CTR |
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c index 466846557089..0c9dc62532d0 100644 --- a/arch/powerpc/kvm/book3s_emulate.c +++ b/arch/powerpc/kvm/book3s_emulate.c | |||
@@ -63,6 +63,25 @@ | |||
63 | * function pointers, so let's just disable the define. */ | 63 | * function pointers, so let's just disable the define. */ |
64 | #undef mfsrin | 64 | #undef mfsrin |
65 | 65 | ||
66 | enum priv_level { | ||
67 | PRIV_PROBLEM = 0, | ||
68 | PRIV_SUPER = 1, | ||
69 | PRIV_HYPER = 2, | ||
70 | }; | ||
71 | |||
72 | static bool spr_allowed(struct kvm_vcpu *vcpu, enum priv_level level) | ||
73 | { | ||
74 | /* PAPR VMs only access supervisor SPRs */ | ||
75 | if (vcpu->arch.papr_enabled && (level > PRIV_SUPER)) | ||
76 | return false; | ||
77 | |||
78 | /* Limit user space to its own small SPR set */ | ||
79 | if ((vcpu->arch.shared->msr & MSR_PR) && level > PRIV_PROBLEM) | ||
80 | return false; | ||
81 | |||
82 | return true; | ||
83 | } | ||
84 | |||
66 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | 85 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, |
67 | unsigned int inst, int *advance) | 86 | unsigned int inst, int *advance) |
68 | { | 87 | { |
@@ -296,6 +315,8 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | |||
296 | 315 | ||
297 | switch (sprn) { | 316 | switch (sprn) { |
298 | case SPRN_SDR1: | 317 | case SPRN_SDR1: |
318 | if (!spr_allowed(vcpu, PRIV_HYPER)) | ||
319 | goto unprivileged; | ||
299 | to_book3s(vcpu)->sdr1 = spr_val; | 320 | to_book3s(vcpu)->sdr1 = spr_val; |
300 | break; | 321 | break; |
301 | case SPRN_DSISR: | 322 | case SPRN_DSISR: |
@@ -390,6 +411,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | |||
390 | case SPRN_PMC4_GEKKO: | 411 | case SPRN_PMC4_GEKKO: |
391 | case SPRN_WPAR_GEKKO: | 412 | case SPRN_WPAR_GEKKO: |
392 | break; | 413 | break; |
414 | unprivileged: | ||
393 | default: | 415 | default: |
394 | printk(KERN_INFO "KVM: invalid SPR write: %d\n", sprn); | 416 | printk(KERN_INFO "KVM: invalid SPR write: %d\n", sprn); |
395 | #ifndef DEBUG_SPR | 417 | #ifndef DEBUG_SPR |
@@ -421,6 +443,8 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | |||
421 | break; | 443 | break; |
422 | } | 444 | } |
423 | case SPRN_SDR1: | 445 | case SPRN_SDR1: |
446 | if (!spr_allowed(vcpu, PRIV_HYPER)) | ||
447 | goto unprivileged; | ||
424 | kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->sdr1); | 448 | kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->sdr1); |
425 | break; | 449 | break; |
426 | case SPRN_DSISR: | 450 | case SPRN_DSISR: |
@@ -449,6 +473,10 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | |||
449 | case SPRN_HID5: | 473 | case SPRN_HID5: |
450 | kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[5]); | 474 | kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[5]); |
451 | break; | 475 | break; |
476 | case SPRN_CFAR: | ||
477 | case SPRN_PURR: | ||
478 | kvmppc_set_gpr(vcpu, rt, 0); | ||
479 | break; | ||
452 | case SPRN_GQR0: | 480 | case SPRN_GQR0: |
453 | case SPRN_GQR1: | 481 | case SPRN_GQR1: |
454 | case SPRN_GQR2: | 482 | case SPRN_GQR2: |
@@ -476,6 +504,7 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | |||
476 | kvmppc_set_gpr(vcpu, rt, 0); | 504 | kvmppc_set_gpr(vcpu, rt, 0); |
477 | break; | 505 | break; |
478 | default: | 506 | default: |
507 | unprivileged: | ||
479 | printk(KERN_INFO "KVM: invalid SPR read: %d\n", sprn); | 508 | printk(KERN_INFO "KVM: invalid SPR read: %d\n", sprn); |
480 | #ifndef DEBUG_SPR | 509 | #ifndef DEBUG_SPR |
481 | emulated = EMULATE_FAIL; | 510 | emulated = EMULATE_FAIL; |
diff --git a/arch/powerpc/kvm/book3s_exports.c b/arch/powerpc/kvm/book3s_exports.c index 88c8f26add02..f7f63a00ab1f 100644 --- a/arch/powerpc/kvm/book3s_exports.c +++ b/arch/powerpc/kvm/book3s_exports.c | |||
@@ -23,9 +23,7 @@ | |||
23 | #ifdef CONFIG_KVM_BOOK3S_64_HV | 23 | #ifdef CONFIG_KVM_BOOK3S_64_HV |
24 | EXPORT_SYMBOL_GPL(kvmppc_hv_entry_trampoline); | 24 | EXPORT_SYMBOL_GPL(kvmppc_hv_entry_trampoline); |
25 | #else | 25 | #else |
26 | EXPORT_SYMBOL_GPL(kvmppc_handler_trampoline_enter); | 26 | EXPORT_SYMBOL_GPL(kvmppc_entry_trampoline); |
27 | EXPORT_SYMBOL_GPL(kvmppc_handler_lowmem_trampoline); | ||
28 | EXPORT_SYMBOL_GPL(kvmppc_rmcall); | ||
29 | EXPORT_SYMBOL_GPL(kvmppc_load_up_fpu); | 27 | EXPORT_SYMBOL_GPL(kvmppc_load_up_fpu); |
30 | #ifdef CONFIG_ALTIVEC | 28 | #ifdef CONFIG_ALTIVEC |
31 | EXPORT_SYMBOL_GPL(kvmppc_load_up_altivec); | 29 | EXPORT_SYMBOL_GPL(kvmppc_load_up_altivec); |
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index cc0d7f1b19ab..4644c7986d80 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -62,6 +62,8 @@ | |||
62 | /* #define EXIT_DEBUG_SIMPLE */ | 62 | /* #define EXIT_DEBUG_SIMPLE */ |
63 | /* #define EXIT_DEBUG_INT */ | 63 | /* #define EXIT_DEBUG_INT */ |
64 | 64 | ||
65 | static void kvmppc_end_cede(struct kvm_vcpu *vcpu); | ||
66 | |||
65 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 67 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
66 | { | 68 | { |
67 | local_paca->kvm_hstate.kvm_vcpu = vcpu; | 69 | local_paca->kvm_hstate.kvm_vcpu = vcpu; |
@@ -72,40 +74,10 @@ void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) | |||
72 | { | 74 | { |
73 | } | 75 | } |
74 | 76 | ||
75 | static void kvmppc_vcpu_blocked(struct kvm_vcpu *vcpu); | ||
76 | static void kvmppc_vcpu_unblocked(struct kvm_vcpu *vcpu); | ||
77 | |||
78 | void kvmppc_vcpu_block(struct kvm_vcpu *vcpu) | ||
79 | { | ||
80 | u64 now; | ||
81 | unsigned long dec_nsec; | ||
82 | |||
83 | now = get_tb(); | ||
84 | if (now >= vcpu->arch.dec_expires && !kvmppc_core_pending_dec(vcpu)) | ||
85 | kvmppc_core_queue_dec(vcpu); | ||
86 | if (vcpu->arch.pending_exceptions) | ||
87 | return; | ||
88 | if (vcpu->arch.dec_expires != ~(u64)0) { | ||
89 | dec_nsec = (vcpu->arch.dec_expires - now) * NSEC_PER_SEC / | ||
90 | tb_ticks_per_sec; | ||
91 | hrtimer_start(&vcpu->arch.dec_timer, ktime_set(0, dec_nsec), | ||
92 | HRTIMER_MODE_REL); | ||
93 | } | ||
94 | |||
95 | kvmppc_vcpu_blocked(vcpu); | ||
96 | |||
97 | kvm_vcpu_block(vcpu); | ||
98 | vcpu->stat.halt_wakeup++; | ||
99 | |||
100 | if (vcpu->arch.dec_expires != ~(u64)0) | ||
101 | hrtimer_try_to_cancel(&vcpu->arch.dec_timer); | ||
102 | |||
103 | kvmppc_vcpu_unblocked(vcpu); | ||
104 | } | ||
105 | |||
106 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr) | 77 | void kvmppc_set_msr(struct kvm_vcpu *vcpu, u64 msr) |
107 | { | 78 | { |
108 | vcpu->arch.shregs.msr = msr; | 79 | vcpu->arch.shregs.msr = msr; |
80 | kvmppc_end_cede(vcpu); | ||
109 | } | 81 | } |
110 | 82 | ||
111 | void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr) | 83 | void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr) |
@@ -257,15 +229,6 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu) | |||
257 | 229 | ||
258 | switch (req) { | 230 | switch (req) { |
259 | case H_CEDE: | 231 | case H_CEDE: |
260 | vcpu->arch.shregs.msr |= MSR_EE; | ||
261 | vcpu->arch.ceded = 1; | ||
262 | smp_mb(); | ||
263 | if (!vcpu->arch.prodded) | ||
264 | kvmppc_vcpu_block(vcpu); | ||
265 | else | ||
266 | vcpu->arch.prodded = 0; | ||
267 | smp_mb(); | ||
268 | vcpu->arch.ceded = 0; | ||
269 | break; | 232 | break; |
270 | case H_PROD: | 233 | case H_PROD: |
271 | target = kvmppc_get_gpr(vcpu, 4); | 234 | target = kvmppc_get_gpr(vcpu, 4); |
@@ -388,20 +351,6 @@ static int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
388 | break; | 351 | break; |
389 | } | 352 | } |
390 | 353 | ||
391 | |||
392 | if (!(r & RESUME_HOST)) { | ||
393 | /* To avoid clobbering exit_reason, only check for signals if | ||
394 | * we aren't already exiting to userspace for some other | ||
395 | * reason. */ | ||
396 | if (signal_pending(tsk)) { | ||
397 | vcpu->stat.signal_exits++; | ||
398 | run->exit_reason = KVM_EXIT_INTR; | ||
399 | r = -EINTR; | ||
400 | } else { | ||
401 | kvmppc_core_deliver_interrupts(vcpu); | ||
402 | } | ||
403 | } | ||
404 | |||
405 | return r; | 354 | return r; |
406 | } | 355 | } |
407 | 356 | ||
@@ -479,13 +428,9 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
479 | kvmppc_mmu_book3s_hv_init(vcpu); | 428 | kvmppc_mmu_book3s_hv_init(vcpu); |
480 | 429 | ||
481 | /* | 430 | /* |
482 | * Some vcpus may start out in stopped state. If we initialize | 431 | * We consider the vcpu stopped until we see the first run ioctl for it. |
483 | * them to busy-in-host state they will stop other vcpus in the | ||
484 | * vcore from running. Instead we initialize them to blocked | ||
485 | * state, effectively considering them to be stopped until we | ||
486 | * see the first run ioctl for them. | ||
487 | */ | 432 | */ |
488 | vcpu->arch.state = KVMPPC_VCPU_BLOCKED; | 433 | vcpu->arch.state = KVMPPC_VCPU_STOPPED; |
489 | 434 | ||
490 | init_waitqueue_head(&vcpu->arch.cpu_run); | 435 | init_waitqueue_head(&vcpu->arch.cpu_run); |
491 | 436 | ||
@@ -496,6 +441,7 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
496 | if (vcore) { | 441 | if (vcore) { |
497 | INIT_LIST_HEAD(&vcore->runnable_threads); | 442 | INIT_LIST_HEAD(&vcore->runnable_threads); |
498 | spin_lock_init(&vcore->lock); | 443 | spin_lock_init(&vcore->lock); |
444 | init_waitqueue_head(&vcore->wq); | ||
499 | } | 445 | } |
500 | kvm->arch.vcores[core] = vcore; | 446 | kvm->arch.vcores[core] = vcore; |
501 | } | 447 | } |
@@ -506,10 +452,12 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
506 | 452 | ||
507 | spin_lock(&vcore->lock); | 453 | spin_lock(&vcore->lock); |
508 | ++vcore->num_threads; | 454 | ++vcore->num_threads; |
509 | ++vcore->n_blocked; | ||
510 | spin_unlock(&vcore->lock); | 455 | spin_unlock(&vcore->lock); |
511 | vcpu->arch.vcore = vcore; | 456 | vcpu->arch.vcore = vcore; |
512 | 457 | ||
458 | vcpu->arch.cpu_type = KVM_CPU_3S_64; | ||
459 | kvmppc_sanity_check(vcpu); | ||
460 | |||
513 | return vcpu; | 461 | return vcpu; |
514 | 462 | ||
515 | free_vcpu: | 463 | free_vcpu: |
@@ -524,30 +472,31 @@ void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) | |||
524 | kfree(vcpu); | 472 | kfree(vcpu); |
525 | } | 473 | } |
526 | 474 | ||
527 | static void kvmppc_vcpu_blocked(struct kvm_vcpu *vcpu) | 475 | static void kvmppc_set_timer(struct kvm_vcpu *vcpu) |
528 | { | 476 | { |
529 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | 477 | unsigned long dec_nsec, now; |
530 | 478 | ||
531 | spin_lock(&vc->lock); | 479 | now = get_tb(); |
532 | vcpu->arch.state = KVMPPC_VCPU_BLOCKED; | 480 | if (now > vcpu->arch.dec_expires) { |
533 | ++vc->n_blocked; | 481 | /* decrementer has already gone negative */ |
534 | if (vc->n_runnable > 0 && | 482 | kvmppc_core_queue_dec(vcpu); |
535 | vc->n_runnable + vc->n_blocked == vc->num_threads) { | 483 | kvmppc_core_deliver_interrupts(vcpu); |
536 | vcpu = list_first_entry(&vc->runnable_threads, struct kvm_vcpu, | 484 | return; |
537 | arch.run_list); | ||
538 | wake_up(&vcpu->arch.cpu_run); | ||
539 | } | 485 | } |
540 | spin_unlock(&vc->lock); | 486 | dec_nsec = (vcpu->arch.dec_expires - now) * NSEC_PER_SEC |
487 | / tb_ticks_per_sec; | ||
488 | hrtimer_start(&vcpu->arch.dec_timer, ktime_set(0, dec_nsec), | ||
489 | HRTIMER_MODE_REL); | ||
490 | vcpu->arch.timer_running = 1; | ||
541 | } | 491 | } |
542 | 492 | ||
543 | static void kvmppc_vcpu_unblocked(struct kvm_vcpu *vcpu) | 493 | static void kvmppc_end_cede(struct kvm_vcpu *vcpu) |
544 | { | 494 | { |
545 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | 495 | vcpu->arch.ceded = 0; |
546 | 496 | if (vcpu->arch.timer_running) { | |
547 | spin_lock(&vc->lock); | 497 | hrtimer_try_to_cancel(&vcpu->arch.dec_timer); |
548 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; | 498 | vcpu->arch.timer_running = 0; |
549 | --vc->n_blocked; | 499 | } |
550 | spin_unlock(&vc->lock); | ||
551 | } | 500 | } |
552 | 501 | ||
553 | extern int __kvmppc_vcore_entry(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); | 502 | extern int __kvmppc_vcore_entry(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu); |
@@ -562,6 +511,7 @@ static void kvmppc_remove_runnable(struct kvmppc_vcore *vc, | |||
562 | return; | 511 | return; |
563 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; | 512 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; |
564 | --vc->n_runnable; | 513 | --vc->n_runnable; |
514 | ++vc->n_busy; | ||
565 | /* decrement the physical thread id of each following vcpu */ | 515 | /* decrement the physical thread id of each following vcpu */ |
566 | v = vcpu; | 516 | v = vcpu; |
567 | list_for_each_entry_continue(v, &vc->runnable_threads, arch.run_list) | 517 | list_for_each_entry_continue(v, &vc->runnable_threads, arch.run_list) |
@@ -575,15 +525,20 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu) | |||
575 | struct paca_struct *tpaca; | 525 | struct paca_struct *tpaca; |
576 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | 526 | struct kvmppc_vcore *vc = vcpu->arch.vcore; |
577 | 527 | ||
528 | if (vcpu->arch.timer_running) { | ||
529 | hrtimer_try_to_cancel(&vcpu->arch.dec_timer); | ||
530 | vcpu->arch.timer_running = 0; | ||
531 | } | ||
578 | cpu = vc->pcpu + vcpu->arch.ptid; | 532 | cpu = vc->pcpu + vcpu->arch.ptid; |
579 | tpaca = &paca[cpu]; | 533 | tpaca = &paca[cpu]; |
580 | tpaca->kvm_hstate.kvm_vcpu = vcpu; | 534 | tpaca->kvm_hstate.kvm_vcpu = vcpu; |
581 | tpaca->kvm_hstate.kvm_vcore = vc; | 535 | tpaca->kvm_hstate.kvm_vcore = vc; |
536 | tpaca->kvm_hstate.napping = 0; | ||
537 | vcpu->cpu = vc->pcpu; | ||
582 | smp_wmb(); | 538 | smp_wmb(); |
583 | #ifdef CONFIG_PPC_ICP_NATIVE | 539 | #ifdef CONFIG_PPC_ICP_NATIVE |
584 | if (vcpu->arch.ptid) { | 540 | if (vcpu->arch.ptid) { |
585 | tpaca->cpu_start = 0x80; | 541 | tpaca->cpu_start = 0x80; |
586 | tpaca->kvm_hstate.in_guest = KVM_GUEST_MODE_GUEST; | ||
587 | wmb(); | 542 | wmb(); |
588 | xics_wake_cpu(cpu); | 543 | xics_wake_cpu(cpu); |
589 | ++vc->n_woken; | 544 | ++vc->n_woken; |
@@ -631,9 +586,10 @@ static int on_primary_thread(void) | |||
631 | */ | 586 | */ |
632 | static int kvmppc_run_core(struct kvmppc_vcore *vc) | 587 | static int kvmppc_run_core(struct kvmppc_vcore *vc) |
633 | { | 588 | { |
634 | struct kvm_vcpu *vcpu, *vnext; | 589 | struct kvm_vcpu *vcpu, *vcpu0, *vnext; |
635 | long ret; | 590 | long ret; |
636 | u64 now; | 591 | u64 now; |
592 | int ptid; | ||
637 | 593 | ||
638 | /* don't start if any threads have a signal pending */ | 594 | /* don't start if any threads have a signal pending */ |
639 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | 595 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) |
@@ -652,29 +608,50 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
652 | goto out; | 608 | goto out; |
653 | } | 609 | } |
654 | 610 | ||
611 | /* | ||
612 | * Assign physical thread IDs, first to non-ceded vcpus | ||
613 | * and then to ceded ones. | ||
614 | */ | ||
615 | ptid = 0; | ||
616 | vcpu0 = NULL; | ||
617 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { | ||
618 | if (!vcpu->arch.ceded) { | ||
619 | if (!ptid) | ||
620 | vcpu0 = vcpu; | ||
621 | vcpu->arch.ptid = ptid++; | ||
622 | } | ||
623 | } | ||
624 | if (!vcpu0) | ||
625 | return 0; /* nothing to run */ | ||
626 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | ||
627 | if (vcpu->arch.ceded) | ||
628 | vcpu->arch.ptid = ptid++; | ||
629 | |||
655 | vc->n_woken = 0; | 630 | vc->n_woken = 0; |
656 | vc->nap_count = 0; | 631 | vc->nap_count = 0; |
657 | vc->entry_exit_count = 0; | 632 | vc->entry_exit_count = 0; |
658 | vc->vcore_running = 1; | 633 | vc->vcore_state = VCORE_RUNNING; |
659 | vc->in_guest = 0; | 634 | vc->in_guest = 0; |
660 | vc->pcpu = smp_processor_id(); | 635 | vc->pcpu = smp_processor_id(); |
636 | vc->napping_threads = 0; | ||
661 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | 637 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) |
662 | kvmppc_start_thread(vcpu); | 638 | kvmppc_start_thread(vcpu); |
663 | vcpu = list_first_entry(&vc->runnable_threads, struct kvm_vcpu, | ||
664 | arch.run_list); | ||
665 | 639 | ||
640 | preempt_disable(); | ||
666 | spin_unlock(&vc->lock); | 641 | spin_unlock(&vc->lock); |
667 | 642 | ||
668 | preempt_disable(); | ||
669 | kvm_guest_enter(); | 643 | kvm_guest_enter(); |
670 | __kvmppc_vcore_entry(NULL, vcpu); | 644 | __kvmppc_vcore_entry(NULL, vcpu0); |
671 | 645 | ||
672 | /* wait for secondary threads to finish writing their state to memory */ | ||
673 | spin_lock(&vc->lock); | 646 | spin_lock(&vc->lock); |
647 | /* disable sending of IPIs on virtual external irqs */ | ||
648 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | ||
649 | vcpu->cpu = -1; | ||
650 | /* wait for secondary threads to finish writing their state to memory */ | ||
674 | if (vc->nap_count < vc->n_woken) | 651 | if (vc->nap_count < vc->n_woken) |
675 | kvmppc_wait_for_nap(vc); | 652 | kvmppc_wait_for_nap(vc); |
676 | /* prevent other vcpu threads from doing kvmppc_start_thread() now */ | 653 | /* prevent other vcpu threads from doing kvmppc_start_thread() now */ |
677 | vc->vcore_running = 2; | 654 | vc->vcore_state = VCORE_EXITING; |
678 | spin_unlock(&vc->lock); | 655 | spin_unlock(&vc->lock); |
679 | 656 | ||
680 | /* make sure updates to secondary vcpu structs are visible now */ | 657 | /* make sure updates to secondary vcpu structs are visible now */ |
@@ -690,22 +667,26 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
690 | if (now < vcpu->arch.dec_expires && | 667 | if (now < vcpu->arch.dec_expires && |
691 | kvmppc_core_pending_dec(vcpu)) | 668 | kvmppc_core_pending_dec(vcpu)) |
692 | kvmppc_core_dequeue_dec(vcpu); | 669 | kvmppc_core_dequeue_dec(vcpu); |
693 | if (!vcpu->arch.trap) { | 670 | |
694 | if (signal_pending(vcpu->arch.run_task)) { | 671 | ret = RESUME_GUEST; |
695 | vcpu->arch.kvm_run->exit_reason = KVM_EXIT_INTR; | 672 | if (vcpu->arch.trap) |
696 | vcpu->arch.ret = -EINTR; | 673 | ret = kvmppc_handle_exit(vcpu->arch.kvm_run, vcpu, |
697 | } | 674 | vcpu->arch.run_task); |
698 | continue; /* didn't get to run */ | 675 | |
699 | } | ||
700 | ret = kvmppc_handle_exit(vcpu->arch.kvm_run, vcpu, | ||
701 | vcpu->arch.run_task); | ||
702 | vcpu->arch.ret = ret; | 676 | vcpu->arch.ret = ret; |
703 | vcpu->arch.trap = 0; | 677 | vcpu->arch.trap = 0; |
678 | |||
679 | if (vcpu->arch.ceded) { | ||
680 | if (ret != RESUME_GUEST) | ||
681 | kvmppc_end_cede(vcpu); | ||
682 | else | ||
683 | kvmppc_set_timer(vcpu); | ||
684 | } | ||
704 | } | 685 | } |
705 | 686 | ||
706 | spin_lock(&vc->lock); | 687 | spin_lock(&vc->lock); |
707 | out: | 688 | out: |
708 | vc->vcore_running = 0; | 689 | vc->vcore_state = VCORE_INACTIVE; |
709 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, | 690 | list_for_each_entry_safe(vcpu, vnext, &vc->runnable_threads, |
710 | arch.run_list) { | 691 | arch.run_list) { |
711 | if (vcpu->arch.ret != RESUME_GUEST) { | 692 | if (vcpu->arch.ret != RESUME_GUEST) { |
@@ -717,82 +698,130 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
717 | return 1; | 698 | return 1; |
718 | } | 699 | } |
719 | 700 | ||
720 | static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | 701 | /* |
702 | * Wait for some other vcpu thread to execute us, and | ||
703 | * wake us up when we need to handle something in the host. | ||
704 | */ | ||
705 | static void kvmppc_wait_for_exec(struct kvm_vcpu *vcpu, int wait_state) | ||
721 | { | 706 | { |
722 | int ptid; | ||
723 | int wait_state; | ||
724 | struct kvmppc_vcore *vc; | ||
725 | DEFINE_WAIT(wait); | 707 | DEFINE_WAIT(wait); |
726 | 708 | ||
727 | /* No need to go into the guest when all we do is going out */ | 709 | prepare_to_wait(&vcpu->arch.cpu_run, &wait, wait_state); |
728 | if (signal_pending(current)) { | 710 | if (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE) |
729 | kvm_run->exit_reason = KVM_EXIT_INTR; | 711 | schedule(); |
730 | return -EINTR; | 712 | finish_wait(&vcpu->arch.cpu_run, &wait); |
713 | } | ||
714 | |||
715 | /* | ||
716 | * All the vcpus in this vcore are idle, so wait for a decrementer | ||
717 | * or external interrupt to one of the vcpus. vc->lock is held. | ||
718 | */ | ||
719 | static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc) | ||
720 | { | ||
721 | DEFINE_WAIT(wait); | ||
722 | struct kvm_vcpu *v; | ||
723 | int all_idle = 1; | ||
724 | |||
725 | prepare_to_wait(&vc->wq, &wait, TASK_INTERRUPTIBLE); | ||
726 | vc->vcore_state = VCORE_SLEEPING; | ||
727 | spin_unlock(&vc->lock); | ||
728 | list_for_each_entry(v, &vc->runnable_threads, arch.run_list) { | ||
729 | if (!v->arch.ceded || v->arch.pending_exceptions) { | ||
730 | all_idle = 0; | ||
731 | break; | ||
732 | } | ||
731 | } | 733 | } |
734 | if (all_idle) | ||
735 | schedule(); | ||
736 | finish_wait(&vc->wq, &wait); | ||
737 | spin_lock(&vc->lock); | ||
738 | vc->vcore_state = VCORE_INACTIVE; | ||
739 | } | ||
732 | 740 | ||
733 | /* On PPC970, check that we have an RMA region */ | 741 | static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) |
734 | if (!vcpu->kvm->arch.rma && cpu_has_feature(CPU_FTR_ARCH_201)) | 742 | { |
735 | return -EPERM; | 743 | int n_ceded; |
744 | int prev_state; | ||
745 | struct kvmppc_vcore *vc; | ||
746 | struct kvm_vcpu *v, *vn; | ||
736 | 747 | ||
737 | kvm_run->exit_reason = 0; | 748 | kvm_run->exit_reason = 0; |
738 | vcpu->arch.ret = RESUME_GUEST; | 749 | vcpu->arch.ret = RESUME_GUEST; |
739 | vcpu->arch.trap = 0; | 750 | vcpu->arch.trap = 0; |
740 | 751 | ||
741 | flush_fp_to_thread(current); | ||
742 | flush_altivec_to_thread(current); | ||
743 | flush_vsx_to_thread(current); | ||
744 | |||
745 | /* | 752 | /* |
746 | * Synchronize with other threads in this virtual core | 753 | * Synchronize with other threads in this virtual core |
747 | */ | 754 | */ |
748 | vc = vcpu->arch.vcore; | 755 | vc = vcpu->arch.vcore; |
749 | spin_lock(&vc->lock); | 756 | spin_lock(&vc->lock); |
750 | /* This happens the first time this is called for a vcpu */ | 757 | vcpu->arch.ceded = 0; |
751 | if (vcpu->arch.state == KVMPPC_VCPU_BLOCKED) | ||
752 | --vc->n_blocked; | ||
753 | vcpu->arch.state = KVMPPC_VCPU_RUNNABLE; | ||
754 | ptid = vc->n_runnable; | ||
755 | vcpu->arch.run_task = current; | 758 | vcpu->arch.run_task = current; |
756 | vcpu->arch.kvm_run = kvm_run; | 759 | vcpu->arch.kvm_run = kvm_run; |
757 | vcpu->arch.ptid = ptid; | 760 | prev_state = vcpu->arch.state; |
761 | vcpu->arch.state = KVMPPC_VCPU_RUNNABLE; | ||
758 | list_add_tail(&vcpu->arch.run_list, &vc->runnable_threads); | 762 | list_add_tail(&vcpu->arch.run_list, &vc->runnable_threads); |
759 | ++vc->n_runnable; | 763 | ++vc->n_runnable; |
760 | 764 | ||
761 | wait_state = TASK_INTERRUPTIBLE; | 765 | /* |
762 | while (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE) { | 766 | * This happens the first time this is called for a vcpu. |
763 | if (signal_pending(current)) { | 767 | * If the vcore is already running, we may be able to start |
764 | if (!vc->vcore_running) { | 768 | * this thread straight away and have it join in. |
765 | kvm_run->exit_reason = KVM_EXIT_INTR; | 769 | */ |
766 | vcpu->arch.ret = -EINTR; | 770 | if (prev_state == KVMPPC_VCPU_STOPPED) { |
767 | break; | 771 | if (vc->vcore_state == VCORE_RUNNING && |
768 | } | 772 | VCORE_EXIT_COUNT(vc) == 0) { |
769 | /* have to wait for vcore to stop executing guest */ | 773 | vcpu->arch.ptid = vc->n_runnable - 1; |
770 | wait_state = TASK_UNINTERRUPTIBLE; | 774 | kvmppc_start_thread(vcpu); |
771 | smp_send_reschedule(vc->pcpu); | ||
772 | } | 775 | } |
773 | 776 | ||
774 | if (!vc->vcore_running && | 777 | } else if (prev_state == KVMPPC_VCPU_BUSY_IN_HOST) |
775 | vc->n_runnable + vc->n_blocked == vc->num_threads) { | 778 | --vc->n_busy; |
776 | /* we can run now */ | ||
777 | if (kvmppc_run_core(vc)) | ||
778 | continue; | ||
779 | } | ||
780 | 779 | ||
781 | if (vc->vcore_running == 1 && VCORE_EXIT_COUNT(vc) == 0) | 780 | while (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE && |
782 | kvmppc_start_thread(vcpu); | 781 | !signal_pending(current)) { |
782 | if (vc->n_busy || vc->vcore_state != VCORE_INACTIVE) { | ||
783 | spin_unlock(&vc->lock); | ||
784 | kvmppc_wait_for_exec(vcpu, TASK_INTERRUPTIBLE); | ||
785 | spin_lock(&vc->lock); | ||
786 | continue; | ||
787 | } | ||
788 | n_ceded = 0; | ||
789 | list_for_each_entry(v, &vc->runnable_threads, arch.run_list) | ||
790 | n_ceded += v->arch.ceded; | ||
791 | if (n_ceded == vc->n_runnable) | ||
792 | kvmppc_vcore_blocked(vc); | ||
793 | else | ||
794 | kvmppc_run_core(vc); | ||
795 | |||
796 | list_for_each_entry_safe(v, vn, &vc->runnable_threads, | ||
797 | arch.run_list) { | ||
798 | kvmppc_core_deliver_interrupts(v); | ||
799 | if (signal_pending(v->arch.run_task)) { | ||
800 | kvmppc_remove_runnable(vc, v); | ||
801 | v->stat.signal_exits++; | ||
802 | v->arch.kvm_run->exit_reason = KVM_EXIT_INTR; | ||
803 | v->arch.ret = -EINTR; | ||
804 | wake_up(&v->arch.cpu_run); | ||
805 | } | ||
806 | } | ||
807 | } | ||
783 | 808 | ||
784 | /* wait for other threads to come in, or wait for vcore */ | 809 | if (signal_pending(current)) { |
785 | prepare_to_wait(&vcpu->arch.cpu_run, &wait, wait_state); | 810 | if (vc->vcore_state == VCORE_RUNNING || |
786 | spin_unlock(&vc->lock); | 811 | vc->vcore_state == VCORE_EXITING) { |
787 | schedule(); | 812 | spin_unlock(&vc->lock); |
788 | finish_wait(&vcpu->arch.cpu_run, &wait); | 813 | kvmppc_wait_for_exec(vcpu, TASK_UNINTERRUPTIBLE); |
789 | spin_lock(&vc->lock); | 814 | spin_lock(&vc->lock); |
815 | } | ||
816 | if (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE) { | ||
817 | kvmppc_remove_runnable(vc, vcpu); | ||
818 | vcpu->stat.signal_exits++; | ||
819 | kvm_run->exit_reason = KVM_EXIT_INTR; | ||
820 | vcpu->arch.ret = -EINTR; | ||
821 | } | ||
790 | } | 822 | } |
791 | 823 | ||
792 | if (vcpu->arch.state == KVMPPC_VCPU_RUNNABLE) | ||
793 | kvmppc_remove_runnable(vc, vcpu); | ||
794 | spin_unlock(&vc->lock); | 824 | spin_unlock(&vc->lock); |
795 | |||
796 | return vcpu->arch.ret; | 825 | return vcpu->arch.ret; |
797 | } | 826 | } |
798 | 827 | ||
@@ -800,6 +829,26 @@ int kvmppc_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
800 | { | 829 | { |
801 | int r; | 830 | int r; |
802 | 831 | ||
832 | if (!vcpu->arch.sane) { | ||
833 | run->exit_reason = KVM_EXIT_INTERNAL_ERROR; | ||
834 | return -EINVAL; | ||
835 | } | ||
836 | |||
837 | /* No need to go into the guest when all we'll do is come back out */ | ||
838 | if (signal_pending(current)) { | ||
839 | run->exit_reason = KVM_EXIT_INTR; | ||
840 | return -EINTR; | ||
841 | } | ||
842 | |||
843 | /* On PPC970, check that we have an RMA region */ | ||
844 | if (!vcpu->kvm->arch.rma && cpu_has_feature(CPU_FTR_ARCH_201)) | ||
845 | return -EPERM; | ||
846 | |||
847 | flush_fp_to_thread(current); | ||
848 | flush_altivec_to_thread(current); | ||
849 | flush_vsx_to_thread(current); | ||
850 | vcpu->arch.wqp = &vcpu->arch.vcore->wq; | ||
851 | |||
803 | do { | 852 | do { |
804 | r = kvmppc_run_vcpu(run, vcpu); | 853 | r = kvmppc_run_vcpu(run, vcpu); |
805 | 854 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index fcfe6b055558..bacb0cfa3602 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
@@ -110,39 +110,6 @@ long kvmppc_h_enter(struct kvm_vcpu *vcpu, unsigned long flags, | |||
110 | return H_SUCCESS; | 110 | return H_SUCCESS; |
111 | } | 111 | } |
112 | 112 | ||
113 | static unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | ||
114 | unsigned long pte_index) | ||
115 | { | ||
116 | unsigned long rb, va_low; | ||
117 | |||
118 | rb = (v & ~0x7fUL) << 16; /* AVA field */ | ||
119 | va_low = pte_index >> 3; | ||
120 | if (v & HPTE_V_SECONDARY) | ||
121 | va_low = ~va_low; | ||
122 | /* xor vsid from AVA */ | ||
123 | if (!(v & HPTE_V_1TB_SEG)) | ||
124 | va_low ^= v >> 12; | ||
125 | else | ||
126 | va_low ^= v >> 24; | ||
127 | va_low &= 0x7ff; | ||
128 | if (v & HPTE_V_LARGE) { | ||
129 | rb |= 1; /* L field */ | ||
130 | if (cpu_has_feature(CPU_FTR_ARCH_206) && | ||
131 | (r & 0xff000)) { | ||
132 | /* non-16MB large page, must be 64k */ | ||
133 | /* (masks depend on page size) */ | ||
134 | rb |= 0x1000; /* page encoding in LP field */ | ||
135 | rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ | ||
136 | rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ | ||
137 | } | ||
138 | } else { | ||
139 | /* 4kB page */ | ||
140 | rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */ | ||
141 | } | ||
142 | rb |= (v >> 54) & 0x300; /* B field */ | ||
143 | return rb; | ||
144 | } | ||
145 | |||
146 | #define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) | 113 | #define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) |
147 | 114 | ||
148 | static inline int try_lock_tlbie(unsigned int *lock) | 115 | static inline int try_lock_tlbie(unsigned int *lock) |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index de2950135e6e..f422231d9235 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -20,7 +20,10 @@ | |||
20 | #include <asm/ppc_asm.h> | 20 | #include <asm/ppc_asm.h> |
21 | #include <asm/kvm_asm.h> | 21 | #include <asm/kvm_asm.h> |
22 | #include <asm/reg.h> | 22 | #include <asm/reg.h> |
23 | #include <asm/mmu.h> | ||
23 | #include <asm/page.h> | 24 | #include <asm/page.h> |
25 | #include <asm/ptrace.h> | ||
26 | #include <asm/hvcall.h> | ||
24 | #include <asm/asm-offsets.h> | 27 | #include <asm/asm-offsets.h> |
25 | #include <asm/exception-64s.h> | 28 | #include <asm/exception-64s.h> |
26 | 29 | ||
@@ -49,7 +52,7 @@ kvmppc_skip_Hinterrupt: | |||
49 | b . | 52 | b . |
50 | 53 | ||
51 | /* | 54 | /* |
52 | * Call kvmppc_handler_trampoline_enter in real mode. | 55 | * Call kvmppc_hv_entry in real mode. |
53 | * Must be called with interrupts hard-disabled. | 56 | * Must be called with interrupts hard-disabled. |
54 | * | 57 | * |
55 | * Input Registers: | 58 | * Input Registers: |
@@ -89,6 +92,12 @@ _GLOBAL(kvmppc_hv_entry_trampoline) | |||
89 | kvm_start_guest: | 92 | kvm_start_guest: |
90 | ld r1,PACAEMERGSP(r13) | 93 | ld r1,PACAEMERGSP(r13) |
91 | subi r1,r1,STACK_FRAME_OVERHEAD | 94 | subi r1,r1,STACK_FRAME_OVERHEAD |
95 | ld r2,PACATOC(r13) | ||
96 | |||
97 | /* were we napping due to cede? */ | ||
98 | lbz r0,HSTATE_NAPPING(r13) | ||
99 | cmpwi r0,0 | ||
100 | bne kvm_end_cede | ||
92 | 101 | ||
93 | /* get vcpu pointer */ | 102 | /* get vcpu pointer */ |
94 | ld r4, HSTATE_KVM_VCPU(r13) | 103 | ld r4, HSTATE_KVM_VCPU(r13) |
@@ -276,15 +285,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
276 | cmpwi r0,0 | 285 | cmpwi r0,0 |
277 | beq 20b | 286 | beq 20b |
278 | 287 | ||
279 | /* Set LPCR. Set the MER bit if there is a pending external irq. */ | 288 | /* Set LPCR and RMOR. */ |
280 | 10: ld r8,KVM_LPCR(r9) | 289 | 10: ld r8,KVM_LPCR(r9) |
281 | ld r0,VCPU_PENDING_EXC(r4) | 290 | mtspr SPRN_LPCR,r8 |
282 | li r7,(1 << BOOK3S_IRQPRIO_EXTERNAL) | ||
283 | oris r7,r7,(1 << BOOK3S_IRQPRIO_EXTERNAL_LEVEL)@h | ||
284 | and. r0,r0,r7 | ||
285 | beq 11f | ||
286 | ori r8,r8,LPCR_MER | ||
287 | 11: mtspr SPRN_LPCR,r8 | ||
288 | ld r8,KVM_RMOR(r9) | 291 | ld r8,KVM_RMOR(r9) |
289 | mtspr SPRN_RMOR,r8 | 292 | mtspr SPRN_RMOR,r8 |
290 | isync | 293 | isync |
@@ -448,19 +451,50 @@ toc_tlbie_lock: | |||
448 | mtctr r6 | 451 | mtctr r6 |
449 | mtxer r7 | 452 | mtxer r7 |
450 | 453 | ||
451 | /* Move SRR0 and SRR1 into the respective regs */ | 454 | kvmppc_cede_reentry: /* r4 = vcpu, r13 = paca */ |
452 | ld r6, VCPU_SRR0(r4) | 455 | ld r6, VCPU_SRR0(r4) |
453 | ld r7, VCPU_SRR1(r4) | 456 | ld r7, VCPU_SRR1(r4) |
454 | mtspr SPRN_SRR0, r6 | ||
455 | mtspr SPRN_SRR1, r7 | ||
456 | |||
457 | ld r10, VCPU_PC(r4) | 457 | ld r10, VCPU_PC(r4) |
458 | ld r11, VCPU_MSR(r4) /* r11 = vcpu->arch.msr & ~MSR_HV */ | ||
458 | 459 | ||
459 | ld r11, VCPU_MSR(r4) /* r10 = vcpu->arch.msr & ~MSR_HV */ | ||
460 | rldicl r11, r11, 63 - MSR_HV_LG, 1 | 460 | rldicl r11, r11, 63 - MSR_HV_LG, 1 |
461 | rotldi r11, r11, 1 + MSR_HV_LG | 461 | rotldi r11, r11, 1 + MSR_HV_LG |
462 | ori r11, r11, MSR_ME | 462 | ori r11, r11, MSR_ME |
463 | 463 | ||
464 | /* Check if we can deliver an external or decrementer interrupt now */ | ||
465 | ld r0,VCPU_PENDING_EXC(r4) | ||
466 | li r8,(1 << BOOK3S_IRQPRIO_EXTERNAL) | ||
467 | oris r8,r8,(1 << BOOK3S_IRQPRIO_EXTERNAL_LEVEL)@h | ||
468 | and r0,r0,r8 | ||
469 | cmpdi cr1,r0,0 | ||
470 | andi. r0,r11,MSR_EE | ||
471 | beq cr1,11f | ||
472 | BEGIN_FTR_SECTION | ||
473 | mfspr r8,SPRN_LPCR | ||
474 | ori r8,r8,LPCR_MER | ||
475 | mtspr SPRN_LPCR,r8 | ||
476 | isync | ||
477 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | ||
478 | beq 5f | ||
479 | li r0,BOOK3S_INTERRUPT_EXTERNAL | ||
480 | 12: mr r6,r10 | ||
481 | mr r10,r0 | ||
482 | mr r7,r11 | ||
483 | li r11,(MSR_ME << 1) | 1 /* synthesize MSR_SF | MSR_ME */ | ||
484 | rotldi r11,r11,63 | ||
485 | b 5f | ||
486 | 11: beq 5f | ||
487 | mfspr r0,SPRN_DEC | ||
488 | cmpwi r0,0 | ||
489 | li r0,BOOK3S_INTERRUPT_DECREMENTER | ||
490 | blt 12b | ||
491 | |||
492 | /* Move SRR0 and SRR1 into the respective regs */ | ||
493 | 5: mtspr SPRN_SRR0, r6 | ||
494 | mtspr SPRN_SRR1, r7 | ||
495 | li r0,0 | ||
496 | stb r0,VCPU_CEDED(r4) /* cancel cede */ | ||
497 | |||
464 | fast_guest_return: | 498 | fast_guest_return: |
465 | mtspr SPRN_HSRR0,r10 | 499 | mtspr SPRN_HSRR0,r10 |
466 | mtspr SPRN_HSRR1,r11 | 500 | mtspr SPRN_HSRR1,r11 |
@@ -574,21 +608,20 @@ kvmppc_interrupt: | |||
574 | /* See if this is something we can handle in real mode */ | 608 | /* See if this is something we can handle in real mode */ |
575 | cmpwi r12,BOOK3S_INTERRUPT_SYSCALL | 609 | cmpwi r12,BOOK3S_INTERRUPT_SYSCALL |
576 | beq hcall_try_real_mode | 610 | beq hcall_try_real_mode |
577 | hcall_real_cont: | ||
578 | 611 | ||
579 | /* Check for mediated interrupts (could be done earlier really ...) */ | 612 | /* Check for mediated interrupts (could be done earlier really ...) */ |
580 | BEGIN_FTR_SECTION | 613 | BEGIN_FTR_SECTION |
581 | cmpwi r12,BOOK3S_INTERRUPT_EXTERNAL | 614 | cmpwi r12,BOOK3S_INTERRUPT_EXTERNAL |
582 | bne+ 1f | 615 | bne+ 1f |
583 | ld r5,VCPU_KVM(r9) | ||
584 | ld r5,KVM_LPCR(r5) | ||
585 | andi. r0,r11,MSR_EE | 616 | andi. r0,r11,MSR_EE |
586 | beq 1f | 617 | beq 1f |
618 | mfspr r5,SPRN_LPCR | ||
587 | andi. r0,r5,LPCR_MER | 619 | andi. r0,r5,LPCR_MER |
588 | bne bounce_ext_interrupt | 620 | bne bounce_ext_interrupt |
589 | 1: | 621 | 1: |
590 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | 622 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) |
591 | 623 | ||
624 | hcall_real_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ | ||
592 | /* Save DEC */ | 625 | /* Save DEC */ |
593 | mfspr r5,SPRN_DEC | 626 | mfspr r5,SPRN_DEC |
594 | mftb r6 | 627 | mftb r6 |
@@ -682,7 +715,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_201) | |||
682 | slbia | 715 | slbia |
683 | ptesync | 716 | ptesync |
684 | 717 | ||
685 | hdec_soon: | 718 | hdec_soon: /* r9 = vcpu, r12 = trap, r13 = paca */ |
686 | BEGIN_FTR_SECTION | 719 | BEGIN_FTR_SECTION |
687 | b 32f | 720 | b 32f |
688 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | 721 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) |
@@ -700,6 +733,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
700 | addi r0,r3,0x100 | 733 | addi r0,r3,0x100 |
701 | stwcx. r0,0,r6 | 734 | stwcx. r0,0,r6 |
702 | bne 41b | 735 | bne 41b |
736 | lwsync | ||
703 | 737 | ||
704 | /* | 738 | /* |
705 | * At this point we have an interrupt that we have to pass | 739 | * At this point we have an interrupt that we have to pass |
@@ -713,18 +747,39 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
713 | * interrupt, since the other threads will already be on their | 747 | * interrupt, since the other threads will already be on their |
714 | * way here in that case. | 748 | * way here in that case. |
715 | */ | 749 | */ |
750 | cmpwi r3,0x100 /* Are we the first here? */ | ||
751 | bge 43f | ||
752 | cmpwi r3,1 /* Are any other threads in the guest? */ | ||
753 | ble 43f | ||
716 | cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER | 754 | cmpwi r12,BOOK3S_INTERRUPT_HV_DECREMENTER |
717 | beq 40f | 755 | beq 40f |
718 | cmpwi r3,0x100 /* Are we the first here? */ | ||
719 | bge 40f | ||
720 | cmpwi r3,1 | ||
721 | ble 40f | ||
722 | li r0,0 | 756 | li r0,0 |
723 | mtspr SPRN_HDEC,r0 | 757 | mtspr SPRN_HDEC,r0 |
724 | 40: | 758 | 40: |
759 | /* | ||
760 | * Send an IPI to any napping threads, since an HDEC interrupt | ||
761 | * doesn't wake CPUs up from nap. | ||
762 | */ | ||
763 | lwz r3,VCORE_NAPPING_THREADS(r5) | ||
764 | lwz r4,VCPU_PTID(r9) | ||
765 | li r0,1 | ||
766 | sldi r0,r0,r4 | ||
767 | andc. r3,r3,r0 /* no sense IPI'ing ourselves */ | ||
768 | beq 43f | ||
769 | mulli r4,r4,PACA_SIZE /* get paca for thread 0 */ | ||
770 | subf r6,r4,r13 | ||
771 | 42: andi. r0,r3,1 | ||
772 | beq 44f | ||
773 | ld r8,HSTATE_XICS_PHYS(r6) /* get thread's XICS reg addr */ | ||
774 | li r0,IPI_PRIORITY | ||
775 | li r7,XICS_QIRR | ||
776 | stbcix r0,r7,r8 /* trigger the IPI */ | ||
777 | 44: srdi. r3,r3,1 | ||
778 | addi r6,r6,PACA_SIZE | ||
779 | bne 42b | ||
725 | 780 | ||
726 | /* Secondary threads wait for primary to do partition switch */ | 781 | /* Secondary threads wait for primary to do partition switch */ |
727 | ld r4,VCPU_KVM(r9) /* pointer to struct kvm */ | 782 | 43: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */ |
728 | ld r5,HSTATE_KVM_VCORE(r13) | 783 | ld r5,HSTATE_KVM_VCORE(r13) |
729 | lwz r3,VCPU_PTID(r9) | 784 | lwz r3,VCPU_PTID(r9) |
730 | cmpwi r3,0 | 785 | cmpwi r3,0 |
@@ -1077,7 +1132,6 @@ hcall_try_real_mode: | |||
1077 | hcall_real_fallback: | 1132 | hcall_real_fallback: |
1078 | li r12,BOOK3S_INTERRUPT_SYSCALL | 1133 | li r12,BOOK3S_INTERRUPT_SYSCALL |
1079 | ld r9, HSTATE_KVM_VCPU(r13) | 1134 | ld r9, HSTATE_KVM_VCPU(r13) |
1080 | ld r11, VCPU_MSR(r9) | ||
1081 | 1135 | ||
1082 | b hcall_real_cont | 1136 | b hcall_real_cont |
1083 | 1137 | ||
@@ -1139,7 +1193,7 @@ hcall_real_table: | |||
1139 | .long 0 /* 0xd4 */ | 1193 | .long 0 /* 0xd4 */ |
1140 | .long 0 /* 0xd8 */ | 1194 | .long 0 /* 0xd8 */ |
1141 | .long 0 /* 0xdc */ | 1195 | .long 0 /* 0xdc */ |
1142 | .long 0 /* 0xe0 */ | 1196 | .long .kvmppc_h_cede - hcall_real_table |
1143 | .long 0 /* 0xe4 */ | 1197 | .long 0 /* 0xe4 */ |
1144 | .long 0 /* 0xe8 */ | 1198 | .long 0 /* 0xe8 */ |
1145 | .long 0 /* 0xec */ | 1199 | .long 0 /* 0xec */ |
@@ -1168,7 +1222,8 @@ bounce_ext_interrupt: | |||
1168 | mtspr SPRN_SRR0,r10 | 1222 | mtspr SPRN_SRR0,r10 |
1169 | mtspr SPRN_SRR1,r11 | 1223 | mtspr SPRN_SRR1,r11 |
1170 | li r10,BOOK3S_INTERRUPT_EXTERNAL | 1224 | li r10,BOOK3S_INTERRUPT_EXTERNAL |
1171 | LOAD_REG_IMMEDIATE(r11,MSR_SF | MSR_ME); | 1225 | li r11,(MSR_ME << 1) | 1 /* synthesize MSR_SF | MSR_ME */ |
1226 | rotldi r11,r11,63 | ||
1172 | b fast_guest_return | 1227 | b fast_guest_return |
1173 | 1228 | ||
1174 | _GLOBAL(kvmppc_h_set_dabr) | 1229 | _GLOBAL(kvmppc_h_set_dabr) |
@@ -1177,6 +1232,178 @@ _GLOBAL(kvmppc_h_set_dabr) | |||
1177 | li r3,0 | 1232 | li r3,0 |
1178 | blr | 1233 | blr |
1179 | 1234 | ||
1235 | _GLOBAL(kvmppc_h_cede) | ||
1236 | ori r11,r11,MSR_EE | ||
1237 | std r11,VCPU_MSR(r3) | ||
1238 | li r0,1 | ||
1239 | stb r0,VCPU_CEDED(r3) | ||
1240 | sync /* order setting ceded vs. testing prodded */ | ||
1241 | lbz r5,VCPU_PRODDED(r3) | ||
1242 | cmpwi r5,0 | ||
1243 | bne 1f | ||
1244 | li r0,0 /* set trap to 0 to say hcall is handled */ | ||
1245 | stw r0,VCPU_TRAP(r3) | ||
1246 | li r0,H_SUCCESS | ||
1247 | std r0,VCPU_GPR(r3)(r3) | ||
1248 | BEGIN_FTR_SECTION | ||
1249 | b 2f /* just send it up to host on 970 */ | ||
1250 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | ||
1251 | |||
1252 | /* | ||
1253 | * Set our bit in the bitmask of napping threads unless all the | ||
1254 | * other threads are already napping, in which case we send this | ||
1255 | * up to the host. | ||
1256 | */ | ||
1257 | ld r5,HSTATE_KVM_VCORE(r13) | ||
1258 | lwz r6,VCPU_PTID(r3) | ||
1259 | lwz r8,VCORE_ENTRY_EXIT(r5) | ||
1260 | clrldi r8,r8,56 | ||
1261 | li r0,1 | ||
1262 | sld r0,r0,r6 | ||
1263 | addi r6,r5,VCORE_NAPPING_THREADS | ||
1264 | 31: lwarx r4,0,r6 | ||
1265 | or r4,r4,r0 | ||
1266 | popcntw r7,r4 | ||
1267 | cmpw r7,r8 | ||
1268 | bge 2f | ||
1269 | stwcx. r4,0,r6 | ||
1270 | bne 31b | ||
1271 | li r0,1 | ||
1272 | stb r0,HSTATE_NAPPING(r13) | ||
1273 | /* order napping_threads update vs testing entry_exit_count */ | ||
1274 | lwsync | ||
1275 | mr r4,r3 | ||
1276 | lwz r7,VCORE_ENTRY_EXIT(r5) | ||
1277 | cmpwi r7,0x100 | ||
1278 | bge 33f /* another thread already exiting */ | ||
1279 | |||
1280 | /* | ||
1281 | * Although not specifically required by the architecture, POWER7 | ||
1282 | * preserves the following registers in nap mode, even if an SMT mode | ||
1283 | * switch occurs: SLB entries, PURR, SPURR, AMOR, UAMOR, AMR, SPRG0-3, | ||
1284 | * DAR, DSISR, DABR, DABRX, DSCR, PMCx, MMCRx, SIAR, SDAR. | ||
1285 | */ | ||
1286 | /* Save non-volatile GPRs */ | ||
1287 | std r14, VCPU_GPR(r14)(r3) | ||
1288 | std r15, VCPU_GPR(r15)(r3) | ||
1289 | std r16, VCPU_GPR(r16)(r3) | ||
1290 | std r17, VCPU_GPR(r17)(r3) | ||
1291 | std r18, VCPU_GPR(r18)(r3) | ||
1292 | std r19, VCPU_GPR(r19)(r3) | ||
1293 | std r20, VCPU_GPR(r20)(r3) | ||
1294 | std r21, VCPU_GPR(r21)(r3) | ||
1295 | std r22, VCPU_GPR(r22)(r3) | ||
1296 | std r23, VCPU_GPR(r23)(r3) | ||
1297 | std r24, VCPU_GPR(r24)(r3) | ||
1298 | std r25, VCPU_GPR(r25)(r3) | ||
1299 | std r26, VCPU_GPR(r26)(r3) | ||
1300 | std r27, VCPU_GPR(r27)(r3) | ||
1301 | std r28, VCPU_GPR(r28)(r3) | ||
1302 | std r29, VCPU_GPR(r29)(r3) | ||
1303 | std r30, VCPU_GPR(r30)(r3) | ||
1304 | std r31, VCPU_GPR(r31)(r3) | ||
1305 | |||
1306 | /* save FP state */ | ||
1307 | bl .kvmppc_save_fp | ||
1308 | |||
1309 | /* | ||
1310 | * Take a nap until a decrementer or external interrupt occurs, | ||
1311 | * with PECE1 (wake on decr) and PECE0 (wake on external) set in LPCR | ||
1312 | */ | ||
1313 | li r0,0x80 | ||
1314 | stb r0,PACAPROCSTART(r13) | ||
1315 | mfspr r5,SPRN_LPCR | ||
1316 | ori r5,r5,LPCR_PECE0 | LPCR_PECE1 | ||
1317 | mtspr SPRN_LPCR,r5 | ||
1318 | isync | ||
1319 | li r0, 0 | ||
1320 | std r0, HSTATE_SCRATCH0(r13) | ||
1321 | ptesync | ||
1322 | ld r0, HSTATE_SCRATCH0(r13) | ||
1323 | 1: cmpd r0, r0 | ||
1324 | bne 1b | ||
1325 | nap | ||
1326 | b . | ||
1327 | |||
1328 | kvm_end_cede: | ||
1329 | /* Woken by external or decrementer interrupt */ | ||
1330 | ld r1, HSTATE_HOST_R1(r13) | ||
1331 | ld r2, PACATOC(r13) | ||
1332 | |||
1333 | /* If we're a secondary thread and we got here by an IPI, ack it */ | ||
1334 | ld r4,HSTATE_KVM_VCPU(r13) | ||
1335 | lwz r3,VCPU_PTID(r4) | ||
1336 | cmpwi r3,0 | ||
1337 | beq 27f | ||
1338 | mfspr r3,SPRN_SRR1 | ||
1339 | rlwinm r3,r3,44-31,0x7 /* extract wake reason field */ | ||
1340 | cmpwi r3,4 /* was it an external interrupt? */ | ||
1341 | bne 27f | ||
1342 | ld r5, HSTATE_XICS_PHYS(r13) | ||
1343 | li r0,0xff | ||
1344 | li r6,XICS_QIRR | ||
1345 | li r7,XICS_XIRR | ||
1346 | lwzcix r8,r5,r7 /* ack the interrupt */ | ||
1347 | sync | ||
1348 | stbcix r0,r5,r6 /* clear it */ | ||
1349 | stwcix r8,r5,r7 /* EOI it */ | ||
1350 | 27: | ||
1351 | /* load up FP state */ | ||
1352 | bl kvmppc_load_fp | ||
1353 | |||
1354 | /* Load NV GPRS */ | ||
1355 | ld r14, VCPU_GPR(r14)(r4) | ||
1356 | ld r15, VCPU_GPR(r15)(r4) | ||
1357 | ld r16, VCPU_GPR(r16)(r4) | ||
1358 | ld r17, VCPU_GPR(r17)(r4) | ||
1359 | ld r18, VCPU_GPR(r18)(r4) | ||
1360 | ld r19, VCPU_GPR(r19)(r4) | ||
1361 | ld r20, VCPU_GPR(r20)(r4) | ||
1362 | ld r21, VCPU_GPR(r21)(r4) | ||
1363 | ld r22, VCPU_GPR(r22)(r4) | ||
1364 | ld r23, VCPU_GPR(r23)(r4) | ||
1365 | ld r24, VCPU_GPR(r24)(r4) | ||
1366 | ld r25, VCPU_GPR(r25)(r4) | ||
1367 | ld r26, VCPU_GPR(r26)(r4) | ||
1368 | ld r27, VCPU_GPR(r27)(r4) | ||
1369 | ld r28, VCPU_GPR(r28)(r4) | ||
1370 | ld r29, VCPU_GPR(r29)(r4) | ||
1371 | ld r30, VCPU_GPR(r30)(r4) | ||
1372 | ld r31, VCPU_GPR(r31)(r4) | ||
1373 | |||
1374 | /* clear our bit in vcore->napping_threads */ | ||
1375 | 33: ld r5,HSTATE_KVM_VCORE(r13) | ||
1376 | lwz r3,VCPU_PTID(r4) | ||
1377 | li r0,1 | ||
1378 | sld r0,r0,r3 | ||
1379 | addi r6,r5,VCORE_NAPPING_THREADS | ||
1380 | 32: lwarx r7,0,r6 | ||
1381 | andc r7,r7,r0 | ||
1382 | stwcx. r7,0,r6 | ||
1383 | bne 32b | ||
1384 | li r0,0 | ||
1385 | stb r0,HSTATE_NAPPING(r13) | ||
1386 | |||
1387 | /* see if any other thread is already exiting */ | ||
1388 | lwz r0,VCORE_ENTRY_EXIT(r5) | ||
1389 | cmpwi r0,0x100 | ||
1390 | blt kvmppc_cede_reentry /* if not go back to guest */ | ||
1391 | |||
1392 | /* some threads are exiting, so go to the guest exit path */ | ||
1393 | b hcall_real_fallback | ||
1394 | |||
1395 | /* cede when already previously prodded case */ | ||
1396 | 1: li r0,0 | ||
1397 | stb r0,VCPU_PRODDED(r3) | ||
1398 | sync /* order testing prodded vs. clearing ceded */ | ||
1399 | stb r0,VCPU_CEDED(r3) | ||
1400 | li r3,H_SUCCESS | ||
1401 | blr | ||
1402 | |||
1403 | /* we've ceded but we want to give control to the host */ | ||
1404 | 2: li r3,H_TOO_HARD | ||
1405 | blr | ||
1406 | |||
1180 | secondary_too_late: | 1407 | secondary_too_late: |
1181 | ld r5,HSTATE_KVM_VCORE(r13) | 1408 | ld r5,HSTATE_KVM_VCORE(r13) |
1182 | HMT_LOW | 1409 | HMT_LOW |
@@ -1194,14 +1421,20 @@ secondary_too_late: | |||
1194 | slbmte r6,r5 | 1421 | slbmte r6,r5 |
1195 | 1: addi r11,r11,16 | 1422 | 1: addi r11,r11,16 |
1196 | .endr | 1423 | .endr |
1197 | b 50f | ||
1198 | 1424 | ||
1199 | secondary_nap: | 1425 | secondary_nap: |
1200 | /* Clear any pending IPI */ | 1426 | /* Clear any pending IPI - assume we're a secondary thread */ |
1201 | 50: ld r5, HSTATE_XICS_PHYS(r13) | 1427 | ld r5, HSTATE_XICS_PHYS(r13) |
1428 | li r7, XICS_XIRR | ||
1429 | lwzcix r3, r5, r7 /* ack any pending interrupt */ | ||
1430 | rlwinm. r0, r3, 0, 0xffffff /* any pending? */ | ||
1431 | beq 37f | ||
1432 | sync | ||
1202 | li r0, 0xff | 1433 | li r0, 0xff |
1203 | li r6, XICS_QIRR | 1434 | li r6, XICS_QIRR |
1204 | stbcix r0, r5, r6 | 1435 | stbcix r0, r5, r6 /* clear the IPI */ |
1436 | stwcix r3, r5, r7 /* EOI it */ | ||
1437 | 37: sync | ||
1205 | 1438 | ||
1206 | /* increment the nap count and then go to nap mode */ | 1439 | /* increment the nap count and then go to nap mode */ |
1207 | ld r4, HSTATE_KVM_VCORE(r13) | 1440 | ld r4, HSTATE_KVM_VCORE(r13) |
@@ -1211,13 +1444,12 @@ secondary_nap: | |||
1211 | addi r3, r3, 1 | 1444 | addi r3, r3, 1 |
1212 | stwcx. r3, 0, r4 | 1445 | stwcx. r3, 0, r4 |
1213 | bne 51b | 1446 | bne 51b |
1214 | isync | ||
1215 | 1447 | ||
1448 | li r3, LPCR_PECE0 | ||
1216 | mfspr r4, SPRN_LPCR | 1449 | mfspr r4, SPRN_LPCR |
1217 | li r0, LPCR_PECE | 1450 | rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 |
1218 | andc r4, r4, r0 | ||
1219 | ori r4, r4, LPCR_PECE0 /* exit nap on interrupt */ | ||
1220 | mtspr SPRN_LPCR, r4 | 1451 | mtspr SPRN_LPCR, r4 |
1452 | isync | ||
1221 | li r0, 0 | 1453 | li r0, 0 |
1222 | std r0, HSTATE_SCRATCH0(r13) | 1454 | std r0, HSTATE_SCRATCH0(r13) |
1223 | ptesync | 1455 | ptesync |
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S index c54b0e30cf3f..0a8515a5c042 100644 --- a/arch/powerpc/kvm/book3s_interrupts.S +++ b/arch/powerpc/kvm/book3s_interrupts.S | |||
@@ -29,27 +29,11 @@ | |||
29 | #define ULONG_SIZE 8 | 29 | #define ULONG_SIZE 8 |
30 | #define FUNC(name) GLUE(.,name) | 30 | #define FUNC(name) GLUE(.,name) |
31 | 31 | ||
32 | #define GET_SHADOW_VCPU_R13 | ||
33 | |||
34 | #define DISABLE_INTERRUPTS \ | ||
35 | mfmsr r0; \ | ||
36 | rldicl r0,r0,48,1; \ | ||
37 | rotldi r0,r0,16; \ | ||
38 | mtmsrd r0,1; \ | ||
39 | |||
40 | #elif defined(CONFIG_PPC_BOOK3S_32) | 32 | #elif defined(CONFIG_PPC_BOOK3S_32) |
41 | 33 | ||
42 | #define ULONG_SIZE 4 | 34 | #define ULONG_SIZE 4 |
43 | #define FUNC(name) name | 35 | #define FUNC(name) name |
44 | 36 | ||
45 | #define GET_SHADOW_VCPU_R13 \ | ||
46 | lwz r13, (THREAD + THREAD_KVM_SVCPU)(r2) | ||
47 | |||
48 | #define DISABLE_INTERRUPTS \ | ||
49 | mfmsr r0; \ | ||
50 | rlwinm r0,r0,0,17,15; \ | ||
51 | mtmsr r0; \ | ||
52 | |||
53 | #endif /* CONFIG_PPC_BOOK3S_XX */ | 37 | #endif /* CONFIG_PPC_BOOK3S_XX */ |
54 | 38 | ||
55 | 39 | ||
@@ -108,44 +92,17 @@ kvm_start_entry: | |||
108 | 92 | ||
109 | kvm_start_lightweight: | 93 | kvm_start_lightweight: |
110 | 94 | ||
111 | GET_SHADOW_VCPU_R13 | ||
112 | PPC_LL r3, VCPU_HIGHMEM_HANDLER(r4) | ||
113 | PPC_STL r3, HSTATE_VMHANDLER(r13) | ||
114 | |||
115 | PPC_LL r10, VCPU_SHADOW_MSR(r4) /* r10 = vcpu->arch.shadow_msr */ | ||
116 | |||
117 | DISABLE_INTERRUPTS | ||
118 | |||
119 | #ifdef CONFIG_PPC_BOOK3S_64 | 95 | #ifdef CONFIG_PPC_BOOK3S_64 |
120 | /* Some guests may need to have dcbz set to 32 byte length. | ||
121 | * | ||
122 | * Usually we ensure that by patching the guest's instructions | ||
123 | * to trap on dcbz and emulate it in the hypervisor. | ||
124 | * | ||
125 | * If we can, we should tell the CPU to use 32 byte dcbz though, | ||
126 | * because that's a lot faster. | ||
127 | */ | ||
128 | |||
129 | PPC_LL r3, VCPU_HFLAGS(r4) | 96 | PPC_LL r3, VCPU_HFLAGS(r4) |
130 | rldicl. r3, r3, 0, 63 /* CR = ((r3 & 1) == 0) */ | 97 | rldicl r3, r3, 0, 63 /* r3 &= 1 */ |
131 | beq no_dcbz32_on | 98 | stb r3, HSTATE_RESTORE_HID5(r13) |
132 | |||
133 | mfspr r3,SPRN_HID5 | ||
134 | ori r3, r3, 0x80 /* XXX HID5_dcbz32 = 0x80 */ | ||
135 | mtspr SPRN_HID5,r3 | ||
136 | |||
137 | no_dcbz32_on: | ||
138 | |||
139 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 99 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
140 | 100 | ||
141 | PPC_LL r6, VCPU_RMCALL(r4) | 101 | PPC_LL r4, VCPU_SHADOW_MSR(r4) /* get shadow_msr */ |
142 | mtctr r6 | ||
143 | |||
144 | PPC_LL r3, VCPU_TRAMPOLINE_ENTER(r4) | ||
145 | LOAD_REG_IMMEDIATE(r4, MSR_KERNEL & ~(MSR_IR | MSR_DR)) | ||
146 | 102 | ||
147 | /* Jump to segment patching handler and into our guest */ | 103 | /* Jump to segment patching handler and into our guest */ |
148 | bctr | 104 | bl FUNC(kvmppc_entry_trampoline) |
105 | nop | ||
149 | 106 | ||
150 | /* | 107 | /* |
151 | * This is the handler in module memory. It gets jumped at from the | 108 | * This is the handler in module memory. It gets jumped at from the |
@@ -170,21 +127,6 @@ kvmppc_handler_highmem: | |||
170 | /* R7 = vcpu */ | 127 | /* R7 = vcpu */ |
171 | PPC_LL r7, GPR4(r1) | 128 | PPC_LL r7, GPR4(r1) |
172 | 129 | ||
173 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
174 | |||
175 | PPC_LL r5, VCPU_HFLAGS(r7) | ||
176 | rldicl. r5, r5, 0, 63 /* CR = ((r5 & 1) == 0) */ | ||
177 | beq no_dcbz32_off | ||
178 | |||
179 | li r4, 0 | ||
180 | mfspr r5,SPRN_HID5 | ||
181 | rldimi r5,r4,6,56 | ||
182 | mtspr SPRN_HID5,r5 | ||
183 | |||
184 | no_dcbz32_off: | ||
185 | |||
186 | #endif /* CONFIG_PPC_BOOK3S_64 */ | ||
187 | |||
188 | PPC_STL r14, VCPU_GPR(r14)(r7) | 130 | PPC_STL r14, VCPU_GPR(r14)(r7) |
189 | PPC_STL r15, VCPU_GPR(r15)(r7) | 131 | PPC_STL r15, VCPU_GPR(r15)(r7) |
190 | PPC_STL r16, VCPU_GPR(r16)(r7) | 132 | PPC_STL r16, VCPU_GPR(r16)(r7) |
@@ -204,67 +146,6 @@ no_dcbz32_off: | |||
204 | PPC_STL r30, VCPU_GPR(r30)(r7) | 146 | PPC_STL r30, VCPU_GPR(r30)(r7) |
205 | PPC_STL r31, VCPU_GPR(r31)(r7) | 147 | PPC_STL r31, VCPU_GPR(r31)(r7) |
206 | 148 | ||
207 | /* Restore host msr -> SRR1 */ | ||
208 | PPC_LL r6, VCPU_HOST_MSR(r7) | ||
209 | |||
210 | /* | ||
211 | * For some interrupts, we need to call the real Linux | ||
212 | * handler, so it can do work for us. This has to happen | ||
213 | * as if the interrupt arrived from the kernel though, | ||
214 | * so let's fake it here where most state is restored. | ||
215 | * | ||
216 | * Call Linux for hardware interrupts/decrementer | ||
217 | * r3 = address of interrupt handler (exit reason) | ||
218 | */ | ||
219 | |||
220 | cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL | ||
221 | beq call_linux_handler | ||
222 | cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER | ||
223 | beq call_linux_handler | ||
224 | cmpwi r12, BOOK3S_INTERRUPT_PERFMON | ||
225 | beq call_linux_handler | ||
226 | |||
227 | /* Back to EE=1 */ | ||
228 | mtmsr r6 | ||
229 | sync | ||
230 | b kvm_return_point | ||
231 | |||
232 | call_linux_handler: | ||
233 | |||
234 | /* | ||
235 | * If we land here we need to jump back to the handler we | ||
236 | * came from. | ||
237 | * | ||
238 | * We have a page that we can access from real mode, so let's | ||
239 | * jump back to that and use it as a trampoline to get back into the | ||
240 | * interrupt handler! | ||
241 | * | ||
242 | * R3 still contains the exit code, | ||
243 | * R5 VCPU_HOST_RETIP and | ||
244 | * R6 VCPU_HOST_MSR | ||
245 | */ | ||
246 | |||
247 | /* Restore host IP -> SRR0 */ | ||
248 | PPC_LL r5, VCPU_HOST_RETIP(r7) | ||
249 | |||
250 | /* XXX Better move to a safe function? | ||
251 | * What if we get an HTAB flush in between mtsrr0 and mtsrr1? */ | ||
252 | |||
253 | mtlr r12 | ||
254 | |||
255 | PPC_LL r4, VCPU_TRAMPOLINE_LOWMEM(r7) | ||
256 | mtsrr0 r4 | ||
257 | LOAD_REG_IMMEDIATE(r3, MSR_KERNEL & ~(MSR_IR | MSR_DR)) | ||
258 | mtsrr1 r3 | ||
259 | |||
260 | RFI | ||
261 | |||
262 | .global kvm_return_point | ||
263 | kvm_return_point: | ||
264 | |||
265 | /* Jump back to lightweight entry if we're supposed to */ | ||
266 | /* go back into the guest */ | ||
267 | |||
268 | /* Pass the exit number as 3rd argument to kvmppc_handle_exit */ | 149 | /* Pass the exit number as 3rd argument to kvmppc_handle_exit */ |
269 | mr r5, r12 | 150 | mr r5, r12 |
270 | 151 | ||
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 0c0d3f274437..d417511abfb1 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -150,16 +150,22 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr) | |||
150 | #ifdef CONFIG_PPC_BOOK3S_64 | 150 | #ifdef CONFIG_PPC_BOOK3S_64 |
151 | if ((pvr >= 0x330000) && (pvr < 0x70330000)) { | 151 | if ((pvr >= 0x330000) && (pvr < 0x70330000)) { |
152 | kvmppc_mmu_book3s_64_init(vcpu); | 152 | kvmppc_mmu_book3s_64_init(vcpu); |
153 | to_book3s(vcpu)->hior = 0xfff00000; | 153 | if (!to_book3s(vcpu)->hior_sregs) |
154 | to_book3s(vcpu)->hior = 0xfff00000; | ||
154 | to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL; | 155 | to_book3s(vcpu)->msr_mask = 0xffffffffffffffffULL; |
156 | vcpu->arch.cpu_type = KVM_CPU_3S_64; | ||
155 | } else | 157 | } else |
156 | #endif | 158 | #endif |
157 | { | 159 | { |
158 | kvmppc_mmu_book3s_32_init(vcpu); | 160 | kvmppc_mmu_book3s_32_init(vcpu); |
159 | to_book3s(vcpu)->hior = 0; | 161 | if (!to_book3s(vcpu)->hior_sregs) |
162 | to_book3s(vcpu)->hior = 0; | ||
160 | to_book3s(vcpu)->msr_mask = 0xffffffffULL; | 163 | to_book3s(vcpu)->msr_mask = 0xffffffffULL; |
164 | vcpu->arch.cpu_type = KVM_CPU_3S_32; | ||
161 | } | 165 | } |
162 | 166 | ||
167 | kvmppc_sanity_check(vcpu); | ||
168 | |||
163 | /* If we are in hypervisor level on 970, we can tell the CPU to | 169 | /* If we are in hypervisor level on 970, we can tell the CPU to |
164 | * treat DCBZ as 32 bytes store */ | 170 | * treat DCBZ as 32 bytes store */ |
165 | vcpu->arch.hflags &= ~BOOK3S_HFLAG_DCBZ32; | 171 | vcpu->arch.hflags &= ~BOOK3S_HFLAG_DCBZ32; |
@@ -646,7 +652,27 @@ program_interrupt: | |||
646 | break; | 652 | break; |
647 | } | 653 | } |
648 | case BOOK3S_INTERRUPT_SYSCALL: | 654 | case BOOK3S_INTERRUPT_SYSCALL: |
649 | if (vcpu->arch.osi_enabled && | 655 | if (vcpu->arch.papr_enabled && |
656 | (kvmppc_get_last_inst(vcpu) == 0x44000022) && | ||
657 | !(vcpu->arch.shared->msr & MSR_PR)) { | ||
658 | /* SC 1 papr hypercalls */ | ||
659 | ulong cmd = kvmppc_get_gpr(vcpu, 3); | ||
660 | int i; | ||
661 | |||
662 | if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) { | ||
663 | r = RESUME_GUEST; | ||
664 | break; | ||
665 | } | ||
666 | |||
667 | run->papr_hcall.nr = cmd; | ||
668 | for (i = 0; i < 9; ++i) { | ||
669 | ulong gpr = kvmppc_get_gpr(vcpu, 4 + i); | ||
670 | run->papr_hcall.args[i] = gpr; | ||
671 | } | ||
672 | run->exit_reason = KVM_EXIT_PAPR_HCALL; | ||
673 | vcpu->arch.hcall_needed = 1; | ||
674 | r = RESUME_HOST; | ||
675 | } else if (vcpu->arch.osi_enabled && | ||
650 | (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) && | 676 | (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) && |
651 | (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) { | 677 | (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) { |
652 | /* MOL hypercalls */ | 678 | /* MOL hypercalls */ |
@@ -770,6 +796,9 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, | |||
770 | } | 796 | } |
771 | } | 797 | } |
772 | 798 | ||
799 | if (sregs->u.s.flags & KVM_SREGS_S_HIOR) | ||
800 | sregs->u.s.hior = to_book3s(vcpu)->hior; | ||
801 | |||
773 | return 0; | 802 | return 0; |
774 | } | 803 | } |
775 | 804 | ||
@@ -806,6 +835,11 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
806 | /* Flush the MMU after messing with the segments */ | 835 | /* Flush the MMU after messing with the segments */ |
807 | kvmppc_mmu_pte_flush(vcpu, 0, 0); | 836 | kvmppc_mmu_pte_flush(vcpu, 0, 0); |
808 | 837 | ||
838 | if (sregs->u.s.flags & KVM_SREGS_S_HIOR) { | ||
839 | to_book3s(vcpu)->hior_sregs = true; | ||
840 | to_book3s(vcpu)->hior = sregs->u.s.hior; | ||
841 | } | ||
842 | |||
809 | return 0; | 843 | return 0; |
810 | } | 844 | } |
811 | 845 | ||
@@ -841,8 +875,6 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
841 | if (!p) | 875 | if (!p) |
842 | goto uninit_vcpu; | 876 | goto uninit_vcpu; |
843 | 877 | ||
844 | vcpu->arch.host_retip = kvm_return_point; | ||
845 | vcpu->arch.host_msr = mfmsr(); | ||
846 | #ifdef CONFIG_PPC_BOOK3S_64 | 878 | #ifdef CONFIG_PPC_BOOK3S_64 |
847 | /* default to book3s_64 (970fx) */ | 879 | /* default to book3s_64 (970fx) */ |
848 | vcpu->arch.pvr = 0x3C0301; | 880 | vcpu->arch.pvr = 0x3C0301; |
@@ -853,16 +885,6 @@ struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | |||
853 | kvmppc_set_pvr(vcpu, vcpu->arch.pvr); | 885 | kvmppc_set_pvr(vcpu, vcpu->arch.pvr); |
854 | vcpu->arch.slb_nr = 64; | 886 | vcpu->arch.slb_nr = 64; |
855 | 887 | ||
856 | /* remember where some real-mode handlers are */ | ||
857 | vcpu->arch.trampoline_lowmem = __pa(kvmppc_handler_lowmem_trampoline); | ||
858 | vcpu->arch.trampoline_enter = __pa(kvmppc_handler_trampoline_enter); | ||
859 | vcpu->arch.highmem_handler = (ulong)kvmppc_handler_highmem; | ||
860 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
861 | vcpu->arch.rmcall = *(ulong*)kvmppc_rmcall; | ||
862 | #else | ||
863 | vcpu->arch.rmcall = (ulong)kvmppc_rmcall; | ||
864 | #endif | ||
865 | |||
866 | vcpu->arch.shadow_msr = MSR_USER64; | 888 | vcpu->arch.shadow_msr = MSR_USER64; |
867 | 889 | ||
868 | err = kvmppc_mmu_init(vcpu); | 890 | err = kvmppc_mmu_init(vcpu); |
@@ -908,6 +930,12 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
908 | #endif | 930 | #endif |
909 | ulong ext_msr; | 931 | ulong ext_msr; |
910 | 932 | ||
933 | /* Check if we can run the vcpu at all */ | ||
934 | if (!vcpu->arch.sane) { | ||
935 | kvm_run->exit_reason = KVM_EXIT_INTERNAL_ERROR; | ||
936 | return -EINVAL; | ||
937 | } | ||
938 | |||
911 | /* No need to go into the guest when all we do is going out */ | 939 | /* No need to go into the guest when all we do is going out */ |
912 | if (signal_pending(current)) { | 940 | if (signal_pending(current)) { |
913 | kvm_run->exit_reason = KVM_EXIT_INTR; | 941 | kvm_run->exit_reason = KVM_EXIT_INTR; |
diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c new file mode 100644 index 000000000000..b9589324797b --- /dev/null +++ b/arch/powerpc/kvm/book3s_pr_papr.c | |||
@@ -0,0 +1,158 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011. Freescale Inc. All rights reserved. | ||
3 | * | ||
4 | * Authors: | ||
5 | * Alexander Graf <agraf@suse.de> | ||
6 | * Paul Mackerras <paulus@samba.org> | ||
7 | * | ||
8 | * Description: | ||
9 | * | ||
10 | * Hypercall handling for running PAPR guests in PR KVM on Book 3S | ||
11 | * processors. | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License, version 2, as | ||
15 | * published by the Free Software Foundation. | ||
16 | */ | ||
17 | |||
18 | #include <asm/uaccess.h> | ||
19 | #include <asm/kvm_ppc.h> | ||
20 | #include <asm/kvm_book3s.h> | ||
21 | |||
22 | static unsigned long get_pteg_addr(struct kvm_vcpu *vcpu, long pte_index) | ||
23 | { | ||
24 | struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); | ||
25 | unsigned long pteg_addr; | ||
26 | |||
27 | pte_index <<= 4; | ||
28 | pte_index &= ((1 << ((vcpu_book3s->sdr1 & 0x1f) + 11)) - 1) << 7 | 0x70; | ||
29 | pteg_addr = vcpu_book3s->sdr1 & 0xfffffffffffc0000ULL; | ||
30 | pteg_addr |= pte_index; | ||
31 | |||
32 | return pteg_addr; | ||
33 | } | ||
34 | |||
35 | static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu) | ||
36 | { | ||
37 | long flags = kvmppc_get_gpr(vcpu, 4); | ||
38 | long pte_index = kvmppc_get_gpr(vcpu, 5); | ||
39 | unsigned long pteg[2 * 8]; | ||
40 | unsigned long pteg_addr, i, *hpte; | ||
41 | |||
42 | pte_index &= ~7UL; | ||
43 | pteg_addr = get_pteg_addr(vcpu, pte_index); | ||
44 | |||
45 | copy_from_user(pteg, (void __user *)pteg_addr, sizeof(pteg)); | ||
46 | hpte = pteg; | ||
47 | |||
48 | if (likely((flags & H_EXACT) == 0)) { | ||
49 | pte_index &= ~7UL; | ||
50 | for (i = 0; ; ++i) { | ||
51 | if (i == 8) | ||
52 | return H_PTEG_FULL; | ||
53 | if ((*hpte & HPTE_V_VALID) == 0) | ||
54 | break; | ||
55 | hpte += 2; | ||
56 | } | ||
57 | } else { | ||
58 | i = kvmppc_get_gpr(vcpu, 5) & 7UL; | ||
59 | hpte += i * 2; | ||
60 | } | ||
61 | |||
62 | hpte[0] = kvmppc_get_gpr(vcpu, 6); | ||
63 | hpte[1] = kvmppc_get_gpr(vcpu, 7); | ||
64 | copy_to_user((void __user *)pteg_addr, pteg, sizeof(pteg)); | ||
65 | kvmppc_set_gpr(vcpu, 3, H_SUCCESS); | ||
66 | kvmppc_set_gpr(vcpu, 4, pte_index | i); | ||
67 | |||
68 | return EMULATE_DONE; | ||
69 | } | ||
70 | |||
71 | static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu) | ||
72 | { | ||
73 | unsigned long flags= kvmppc_get_gpr(vcpu, 4); | ||
74 | unsigned long pte_index = kvmppc_get_gpr(vcpu, 5); | ||
75 | unsigned long avpn = kvmppc_get_gpr(vcpu, 6); | ||
76 | unsigned long v = 0, pteg, rb; | ||
77 | unsigned long pte[2]; | ||
78 | |||
79 | pteg = get_pteg_addr(vcpu, pte_index); | ||
80 | copy_from_user(pte, (void __user *)pteg, sizeof(pte)); | ||
81 | |||
82 | if ((pte[0] & HPTE_V_VALID) == 0 || | ||
83 | ((flags & H_AVPN) && (pte[0] & ~0x7fUL) != avpn) || | ||
84 | ((flags & H_ANDCOND) && (pte[0] & avpn) != 0)) { | ||
85 | kvmppc_set_gpr(vcpu, 3, H_NOT_FOUND); | ||
86 | return EMULATE_DONE; | ||
87 | } | ||
88 | |||
89 | copy_to_user((void __user *)pteg, &v, sizeof(v)); | ||
90 | |||
91 | rb = compute_tlbie_rb(pte[0], pte[1], pte_index); | ||
92 | vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false); | ||
93 | |||
94 | kvmppc_set_gpr(vcpu, 3, H_SUCCESS); | ||
95 | kvmppc_set_gpr(vcpu, 4, pte[0]); | ||
96 | kvmppc_set_gpr(vcpu, 5, pte[1]); | ||
97 | |||
98 | return EMULATE_DONE; | ||
99 | } | ||
100 | |||
101 | static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu) | ||
102 | { | ||
103 | unsigned long flags = kvmppc_get_gpr(vcpu, 4); | ||
104 | unsigned long pte_index = kvmppc_get_gpr(vcpu, 5); | ||
105 | unsigned long avpn = kvmppc_get_gpr(vcpu, 6); | ||
106 | unsigned long rb, pteg, r, v; | ||
107 | unsigned long pte[2]; | ||
108 | |||
109 | pteg = get_pteg_addr(vcpu, pte_index); | ||
110 | copy_from_user(pte, (void __user *)pteg, sizeof(pte)); | ||
111 | |||
112 | if ((pte[0] & HPTE_V_VALID) == 0 || | ||
113 | ((flags & H_AVPN) && (pte[0] & ~0x7fUL) != avpn)) { | ||
114 | kvmppc_set_gpr(vcpu, 3, H_NOT_FOUND); | ||
115 | return EMULATE_DONE; | ||
116 | } | ||
117 | |||
118 | v = pte[0]; | ||
119 | r = pte[1]; | ||
120 | r &= ~(HPTE_R_PP0 | HPTE_R_PP | HPTE_R_N | HPTE_R_KEY_HI | | ||
121 | HPTE_R_KEY_LO); | ||
122 | r |= (flags << 55) & HPTE_R_PP0; | ||
123 | r |= (flags << 48) & HPTE_R_KEY_HI; | ||
124 | r |= flags & (HPTE_R_PP | HPTE_R_N | HPTE_R_KEY_LO); | ||
125 | |||
126 | pte[1] = r; | ||
127 | |||
128 | rb = compute_tlbie_rb(v, r, pte_index); | ||
129 | vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false); | ||
130 | copy_to_user((void __user *)pteg, pte, sizeof(pte)); | ||
131 | |||
132 | kvmppc_set_gpr(vcpu, 3, H_SUCCESS); | ||
133 | |||
134 | return EMULATE_DONE; | ||
135 | } | ||
136 | |||
137 | int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd) | ||
138 | { | ||
139 | switch (cmd) { | ||
140 | case H_ENTER: | ||
141 | return kvmppc_h_pr_enter(vcpu); | ||
142 | case H_REMOVE: | ||
143 | return kvmppc_h_pr_remove(vcpu); | ||
144 | case H_PROTECT: | ||
145 | return kvmppc_h_pr_protect(vcpu); | ||
146 | case H_BULK_REMOVE: | ||
147 | /* We just flush all PTEs, so user space can | ||
148 | handle the HPT modifications */ | ||
149 | kvmppc_mmu_pte_flush(vcpu, 0, 0); | ||
150 | break; | ||
151 | case H_CEDE: | ||
152 | kvm_vcpu_block(vcpu); | ||
153 | vcpu->stat.halt_wakeup++; | ||
154 | return EMULATE_DONE; | ||
155 | } | ||
156 | |||
157 | return EMULATE_FAIL; | ||
158 | } | ||
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S index c1f877c4a884..34187585c507 100644 --- a/arch/powerpc/kvm/book3s_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_rmhandlers.S | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/ppc_asm.h> | 20 | #include <asm/ppc_asm.h> |
21 | #include <asm/kvm_asm.h> | 21 | #include <asm/kvm_asm.h> |
22 | #include <asm/reg.h> | 22 | #include <asm/reg.h> |
23 | #include <asm/mmu.h> | ||
23 | #include <asm/page.h> | 24 | #include <asm/page.h> |
24 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
25 | 26 | ||
@@ -35,10 +36,10 @@ | |||
35 | 36 | ||
36 | #if defined(CONFIG_PPC_BOOK3S_64) | 37 | #if defined(CONFIG_PPC_BOOK3S_64) |
37 | 38 | ||
38 | #define LOAD_SHADOW_VCPU(reg) GET_PACA(reg) | ||
39 | #define MSR_NOIRQ MSR_KERNEL & ~(MSR_IR | MSR_DR) | ||
40 | #define FUNC(name) GLUE(.,name) | 39 | #define FUNC(name) GLUE(.,name) |
40 | #define MTMSR_EERI(reg) mtmsrd (reg),1 | ||
41 | 41 | ||
42 | .globl kvmppc_skip_interrupt | ||
42 | kvmppc_skip_interrupt: | 43 | kvmppc_skip_interrupt: |
43 | /* | 44 | /* |
44 | * Here all GPRs are unchanged from when the interrupt happened | 45 | * Here all GPRs are unchanged from when the interrupt happened |
@@ -51,6 +52,7 @@ kvmppc_skip_interrupt: | |||
51 | rfid | 52 | rfid |
52 | b . | 53 | b . |
53 | 54 | ||
55 | .globl kvmppc_skip_Hinterrupt | ||
54 | kvmppc_skip_Hinterrupt: | 56 | kvmppc_skip_Hinterrupt: |
55 | /* | 57 | /* |
56 | * Here all GPRs are unchanged from when the interrupt happened | 58 | * Here all GPRs are unchanged from when the interrupt happened |
@@ -65,8 +67,8 @@ kvmppc_skip_Hinterrupt: | |||
65 | 67 | ||
66 | #elif defined(CONFIG_PPC_BOOK3S_32) | 68 | #elif defined(CONFIG_PPC_BOOK3S_32) |
67 | 69 | ||
68 | #define MSR_NOIRQ MSR_KERNEL | ||
69 | #define FUNC(name) name | 70 | #define FUNC(name) name |
71 | #define MTMSR_EERI(reg) mtmsr (reg) | ||
70 | 72 | ||
71 | .macro INTERRUPT_TRAMPOLINE intno | 73 | .macro INTERRUPT_TRAMPOLINE intno |
72 | 74 | ||
@@ -167,40 +169,24 @@ kvmppc_handler_skip_ins: | |||
167 | #endif | 169 | #endif |
168 | 170 | ||
169 | /* | 171 | /* |
170 | * This trampoline brings us back to a real mode handler | 172 | * Call kvmppc_handler_trampoline_enter in real mode |
171 | * | ||
172 | * Input Registers: | ||
173 | * | ||
174 | * R5 = SRR0 | ||
175 | * R6 = SRR1 | ||
176 | * LR = real-mode IP | ||
177 | * | 173 | * |
174 | * On entry, r4 contains the guest shadow MSR | ||
178 | */ | 175 | */ |
179 | .global kvmppc_handler_lowmem_trampoline | 176 | _GLOBAL(kvmppc_entry_trampoline) |
180 | kvmppc_handler_lowmem_trampoline: | 177 | mfmsr r5 |
181 | 178 | LOAD_REG_ADDR(r7, kvmppc_handler_trampoline_enter) | |
182 | mtsrr0 r5 | 179 | toreal(r7) |
180 | |||
181 | li r9, MSR_RI | ||
182 | ori r9, r9, MSR_EE | ||
183 | andc r9, r5, r9 /* Clear EE and RI in MSR value */ | ||
184 | li r6, MSR_IR | MSR_DR | ||
185 | ori r6, r6, MSR_EE | ||
186 | andc r6, r5, r6 /* Clear EE, DR and IR in MSR value */ | ||
187 | MTMSR_EERI(r9) /* Clear EE and RI in MSR */ | ||
188 | mtsrr0 r7 /* before we set srr0/1 */ | ||
183 | mtsrr1 r6 | 189 | mtsrr1 r6 |
184 | blr | ||
185 | kvmppc_handler_lowmem_trampoline_end: | ||
186 | |||
187 | /* | ||
188 | * Call a function in real mode | ||
189 | * | ||
190 | * Input Registers: | ||
191 | * | ||
192 | * R3 = function | ||
193 | * R4 = MSR | ||
194 | * R5 = scratch register | ||
195 | * | ||
196 | */ | ||
197 | _GLOBAL(kvmppc_rmcall) | ||
198 | LOAD_REG_IMMEDIATE(r5, MSR_NOIRQ) | ||
199 | mtmsr r5 /* Disable relocation and interrupts, so mtsrr | ||
200 | doesn't get interrupted */ | ||
201 | sync | ||
202 | mtsrr0 r3 | ||
203 | mtsrr1 r4 | ||
204 | RFI | 190 | RFI |
205 | 191 | ||
206 | #if defined(CONFIG_PPC_BOOK3S_32) | 192 | #if defined(CONFIG_PPC_BOOK3S_32) |
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S index aed32e517212..0676ae249b9f 100644 --- a/arch/powerpc/kvm/book3s_segment.S +++ b/arch/powerpc/kvm/book3s_segment.S | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #define GET_SHADOW_VCPU(reg) \ | 24 | #define GET_SHADOW_VCPU(reg) \ |
25 | mr reg, r13 | 25 | mr reg, r13 |
26 | #define MTMSR_EERI(reg) mtmsrd (reg),1 | ||
26 | 27 | ||
27 | #elif defined(CONFIG_PPC_BOOK3S_32) | 28 | #elif defined(CONFIG_PPC_BOOK3S_32) |
28 | 29 | ||
@@ -30,6 +31,7 @@ | |||
30 | tophys(reg, r2); \ | 31 | tophys(reg, r2); \ |
31 | lwz reg, (THREAD + THREAD_KVM_SVCPU)(reg); \ | 32 | lwz reg, (THREAD + THREAD_KVM_SVCPU)(reg); \ |
32 | tophys(reg, reg) | 33 | tophys(reg, reg) |
34 | #define MTMSR_EERI(reg) mtmsr (reg) | ||
33 | 35 | ||
34 | #endif | 36 | #endif |
35 | 37 | ||
@@ -57,10 +59,12 @@ kvmppc_handler_trampoline_enter: | |||
57 | /* Required state: | 59 | /* Required state: |
58 | * | 60 | * |
59 | * MSR = ~IR|DR | 61 | * MSR = ~IR|DR |
60 | * R13 = PACA | ||
61 | * R1 = host R1 | 62 | * R1 = host R1 |
62 | * R2 = host R2 | 63 | * R2 = host R2 |
63 | * R10 = guest MSR | 64 | * R4 = guest shadow MSR |
65 | * R5 = normal host MSR | ||
66 | * R6 = current host MSR (EE, IR, DR off) | ||
67 | * LR = highmem guest exit code | ||
64 | * all other volatile GPRS = free | 68 | * all other volatile GPRS = free |
65 | * SVCPU[CR] = guest CR | 69 | * SVCPU[CR] = guest CR |
66 | * SVCPU[XER] = guest XER | 70 | * SVCPU[XER] = guest XER |
@@ -71,15 +75,15 @@ kvmppc_handler_trampoline_enter: | |||
71 | /* r3 = shadow vcpu */ | 75 | /* r3 = shadow vcpu */ |
72 | GET_SHADOW_VCPU(r3) | 76 | GET_SHADOW_VCPU(r3) |
73 | 77 | ||
78 | /* Save guest exit handler address and MSR */ | ||
79 | mflr r0 | ||
80 | PPC_STL r0, HSTATE_VMHANDLER(r3) | ||
81 | PPC_STL r5, HSTATE_HOST_MSR(r3) | ||
82 | |||
74 | /* Save R1/R2 in the PACA (64-bit) or shadow_vcpu (32-bit) */ | 83 | /* Save R1/R2 in the PACA (64-bit) or shadow_vcpu (32-bit) */ |
75 | PPC_STL r1, HSTATE_HOST_R1(r3) | 84 | PPC_STL r1, HSTATE_HOST_R1(r3) |
76 | PPC_STL r2, HSTATE_HOST_R2(r3) | 85 | PPC_STL r2, HSTATE_HOST_R2(r3) |
77 | 86 | ||
78 | /* Move SRR0 and SRR1 into the respective regs */ | ||
79 | PPC_LL r9, SVCPU_PC(r3) | ||
80 | mtsrr0 r9 | ||
81 | mtsrr1 r10 | ||
82 | |||
83 | /* Activate guest mode, so faults get handled by KVM */ | 87 | /* Activate guest mode, so faults get handled by KVM */ |
84 | li r11, KVM_GUEST_MODE_GUEST | 88 | li r11, KVM_GUEST_MODE_GUEST |
85 | stb r11, HSTATE_IN_GUEST(r3) | 89 | stb r11, HSTATE_IN_GUEST(r3) |
@@ -87,17 +91,46 @@ kvmppc_handler_trampoline_enter: | |||
87 | /* Switch to guest segment. This is subarch specific. */ | 91 | /* Switch to guest segment. This is subarch specific. */ |
88 | LOAD_GUEST_SEGMENTS | 92 | LOAD_GUEST_SEGMENTS |
89 | 93 | ||
94 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
95 | /* Some guests may need to have dcbz set to 32 byte length. | ||
96 | * | ||
97 | * Usually we ensure that by patching the guest's instructions | ||
98 | * to trap on dcbz and emulate it in the hypervisor. | ||
99 | * | ||
100 | * If we can, we should tell the CPU to use 32 byte dcbz though, | ||
101 | * because that's a lot faster. | ||
102 | */ | ||
103 | lbz r0, HSTATE_RESTORE_HID5(r3) | ||
104 | cmpwi r0, 0 | ||
105 | beq no_dcbz32_on | ||
106 | |||
107 | mfspr r0,SPRN_HID5 | ||
108 | ori r0, r0, 0x80 /* XXX HID5_dcbz32 = 0x80 */ | ||
109 | mtspr SPRN_HID5,r0 | ||
110 | no_dcbz32_on: | ||
111 | |||
112 | #endif /* CONFIG_PPC_BOOK3S_64 */ | ||
113 | |||
90 | /* Enter guest */ | 114 | /* Enter guest */ |
91 | 115 | ||
92 | PPC_LL r4, SVCPU_CTR(r3) | 116 | PPC_LL r8, SVCPU_CTR(r3) |
93 | PPC_LL r5, SVCPU_LR(r3) | 117 | PPC_LL r9, SVCPU_LR(r3) |
94 | lwz r6, SVCPU_CR(r3) | 118 | lwz r10, SVCPU_CR(r3) |
95 | lwz r7, SVCPU_XER(r3) | 119 | lwz r11, SVCPU_XER(r3) |
120 | |||
121 | mtctr r8 | ||
122 | mtlr r9 | ||
123 | mtcr r10 | ||
124 | mtxer r11 | ||
96 | 125 | ||
97 | mtctr r4 | 126 | /* Move SRR0 and SRR1 into the respective regs */ |
98 | mtlr r5 | 127 | PPC_LL r9, SVCPU_PC(r3) |
99 | mtcr r6 | 128 | /* First clear RI in our current MSR value */ |
100 | mtxer r7 | 129 | li r0, MSR_RI |
130 | andc r6, r6, r0 | ||
131 | MTMSR_EERI(r6) | ||
132 | mtsrr0 r9 | ||
133 | mtsrr1 r4 | ||
101 | 134 | ||
102 | PPC_LL r0, SVCPU_R0(r3) | 135 | PPC_LL r0, SVCPU_R0(r3) |
103 | PPC_LL r1, SVCPU_R1(r3) | 136 | PPC_LL r1, SVCPU_R1(r3) |
@@ -213,11 +246,16 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) | |||
213 | beq ld_last_inst | 246 | beq ld_last_inst |
214 | cmpwi r12, BOOK3S_INTERRUPT_PROGRAM | 247 | cmpwi r12, BOOK3S_INTERRUPT_PROGRAM |
215 | beq ld_last_inst | 248 | beq ld_last_inst |
249 | cmpwi r12, BOOK3S_INTERRUPT_SYSCALL | ||
250 | beq ld_last_prev_inst | ||
216 | cmpwi r12, BOOK3S_INTERRUPT_ALIGNMENT | 251 | cmpwi r12, BOOK3S_INTERRUPT_ALIGNMENT |
217 | beq- ld_last_inst | 252 | beq- ld_last_inst |
218 | 253 | ||
219 | b no_ld_last_inst | 254 | b no_ld_last_inst |
220 | 255 | ||
256 | ld_last_prev_inst: | ||
257 | addi r3, r3, -4 | ||
258 | |||
221 | ld_last_inst: | 259 | ld_last_inst: |
222 | /* Save off the guest instruction we're at */ | 260 | /* Save off the guest instruction we're at */ |
223 | 261 | ||
@@ -254,6 +292,43 @@ no_ld_last_inst: | |||
254 | /* Switch back to host MMU */ | 292 | /* Switch back to host MMU */ |
255 | LOAD_HOST_SEGMENTS | 293 | LOAD_HOST_SEGMENTS |
256 | 294 | ||
295 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
296 | |||
297 | lbz r5, HSTATE_RESTORE_HID5(r13) | ||
298 | cmpwi r5, 0 | ||
299 | beq no_dcbz32_off | ||
300 | |||
301 | li r4, 0 | ||
302 | mfspr r5,SPRN_HID5 | ||
303 | rldimi r5,r4,6,56 | ||
304 | mtspr SPRN_HID5,r5 | ||
305 | |||
306 | no_dcbz32_off: | ||
307 | |||
308 | #endif /* CONFIG_PPC_BOOK3S_64 */ | ||
309 | |||
310 | /* | ||
311 | * For some interrupts, we need to call the real Linux | ||
312 | * handler, so it can do work for us. This has to happen | ||
313 | * as if the interrupt arrived from the kernel though, | ||
314 | * so let's fake it here where most state is restored. | ||
315 | * | ||
316 | * Having set up SRR0/1 with the address where we want | ||
317 | * to continue with relocation on (potentially in module | ||
318 | * space), we either just go straight there with rfi[d], | ||
319 | * or we jump to an interrupt handler with bctr if there | ||
320 | * is an interrupt to be handled first. In the latter | ||
321 | * case, the rfi[d] at the end of the interrupt handler | ||
322 | * will get us back to where we want to continue. | ||
323 | */ | ||
324 | |||
325 | cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL | ||
326 | beq 1f | ||
327 | cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER | ||
328 | beq 1f | ||
329 | cmpwi r12, BOOK3S_INTERRUPT_PERFMON | ||
330 | 1: mtctr r12 | ||
331 | |||
257 | /* Register usage at this point: | 332 | /* Register usage at this point: |
258 | * | 333 | * |
259 | * R1 = host R1 | 334 | * R1 = host R1 |
@@ -264,13 +339,15 @@ no_ld_last_inst: | |||
264 | * | 339 | * |
265 | */ | 340 | */ |
266 | 341 | ||
267 | /* RFI into the highmem handler */ | 342 | PPC_LL r6, HSTATE_HOST_MSR(r13) |
268 | mfmsr r7 | ||
269 | ori r7, r7, MSR_IR|MSR_DR|MSR_RI|MSR_ME /* Enable paging */ | ||
270 | mtsrr1 r7 | ||
271 | /* Load highmem handler address */ | ||
272 | PPC_LL r8, HSTATE_VMHANDLER(r13) | 343 | PPC_LL r8, HSTATE_VMHANDLER(r13) |
344 | |||
345 | /* Restore host msr -> SRR1 */ | ||
346 | mtsrr1 r6 | ||
347 | /* Load highmem handler address */ | ||
273 | mtsrr0 r8 | 348 | mtsrr0 r8 |
274 | 349 | ||
350 | /* RFI into the highmem handler, or jump to interrupt handler */ | ||
351 | beqctr | ||
275 | RFI | 352 | RFI |
276 | kvmppc_handler_trampoline_exit_end: | 353 | kvmppc_handler_trampoline_exit_end: |
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index ee45fa01220e..bb6c988f010a 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -316,6 +316,11 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
316 | { | 316 | { |
317 | int ret; | 317 | int ret; |
318 | 318 | ||
319 | if (!vcpu->arch.sane) { | ||
320 | kvm_run->exit_reason = KVM_EXIT_INTERNAL_ERROR; | ||
321 | return -EINVAL; | ||
322 | } | ||
323 | |||
319 | local_irq_disable(); | 324 | local_irq_disable(); |
320 | kvm_guest_enter(); | 325 | kvm_guest_enter(); |
321 | ret = __kvmppc_vcpu_run(kvm_run, vcpu); | 326 | ret = __kvmppc_vcpu_run(kvm_run, vcpu); |
@@ -618,6 +623,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
618 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | 623 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) |
619 | { | 624 | { |
620 | int i; | 625 | int i; |
626 | int r; | ||
621 | 627 | ||
622 | vcpu->arch.pc = 0; | 628 | vcpu->arch.pc = 0; |
623 | vcpu->arch.shared->msr = 0; | 629 | vcpu->arch.shared->msr = 0; |
@@ -634,7 +640,9 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
634 | 640 | ||
635 | kvmppc_init_timing_stats(vcpu); | 641 | kvmppc_init_timing_stats(vcpu); |
636 | 642 | ||
637 | return kvmppc_core_vcpu_setup(vcpu); | 643 | r = kvmppc_core_vcpu_setup(vcpu); |
644 | kvmppc_sanity_check(vcpu); | ||
645 | return r; | ||
638 | } | 646 | } |
639 | 647 | ||
640 | int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | 648 | int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) |
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c index 797a7447c268..26d20903f2bc 100644 --- a/arch/powerpc/kvm/e500.c +++ b/arch/powerpc/kvm/e500.c | |||
@@ -73,6 +73,8 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu) | |||
73 | /* Since booke kvm only support one core, update all vcpus' PIR to 0 */ | 73 | /* Since booke kvm only support one core, update all vcpus' PIR to 0 */ |
74 | vcpu->vcpu_id = 0; | 74 | vcpu->vcpu_id = 0; |
75 | 75 | ||
76 | vcpu->arch.cpu_type = KVM_CPU_E500V2; | ||
77 | |||
76 | return 0; | 78 | return 0; |
77 | } | 79 | } |
78 | 80 | ||
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index a107c9be0fb1..0d843c6ba315 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c | |||
@@ -39,12 +39,8 @@ | |||
39 | 39 | ||
40 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *v) | 40 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *v) |
41 | { | 41 | { |
42 | #ifndef CONFIG_KVM_BOOK3S_64_HV | ||
43 | return !(v->arch.shared->msr & MSR_WE) || | 42 | return !(v->arch.shared->msr & MSR_WE) || |
44 | !!(v->arch.pending_exceptions); | 43 | !!(v->arch.pending_exceptions); |
45 | #else | ||
46 | return !(v->arch.ceded) || !!(v->arch.pending_exceptions); | ||
47 | #endif | ||
48 | } | 44 | } |
49 | 45 | ||
50 | int kvmppc_kvm_pv(struct kvm_vcpu *vcpu) | 46 | int kvmppc_kvm_pv(struct kvm_vcpu *vcpu) |
@@ -95,6 +91,31 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu) | |||
95 | return r; | 91 | return r; |
96 | } | 92 | } |
97 | 93 | ||
94 | int kvmppc_sanity_check(struct kvm_vcpu *vcpu) | ||
95 | { | ||
96 | int r = false; | ||
97 | |||
98 | /* We have to know what CPU to virtualize */ | ||
99 | if (!vcpu->arch.pvr) | ||
100 | goto out; | ||
101 | |||
102 | /* PAPR only works with book3s_64 */ | ||
103 | if ((vcpu->arch.cpu_type != KVM_CPU_3S_64) && vcpu->arch.papr_enabled) | ||
104 | goto out; | ||
105 | |||
106 | #ifdef CONFIG_KVM_BOOK3S_64_HV | ||
107 | /* HV KVM can only do PAPR mode for now */ | ||
108 | if (!vcpu->arch.papr_enabled) | ||
109 | goto out; | ||
110 | #endif | ||
111 | |||
112 | r = true; | ||
113 | |||
114 | out: | ||
115 | vcpu->arch.sane = r; | ||
116 | return r ? 0 : -EINVAL; | ||
117 | } | ||
118 | |||
98 | int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu) | 119 | int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu) |
99 | { | 120 | { |
100 | enum emulation_result er; | 121 | enum emulation_result er; |
@@ -188,6 +209,8 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
188 | case KVM_CAP_PPC_BOOKE_SREGS: | 209 | case KVM_CAP_PPC_BOOKE_SREGS: |
189 | #else | 210 | #else |
190 | case KVM_CAP_PPC_SEGSTATE: | 211 | case KVM_CAP_PPC_SEGSTATE: |
212 | case KVM_CAP_PPC_HIOR: | ||
213 | case KVM_CAP_PPC_PAPR: | ||
191 | #endif | 214 | #endif |
192 | case KVM_CAP_PPC_UNSET_IRQ: | 215 | case KVM_CAP_PPC_UNSET_IRQ: |
193 | case KVM_CAP_PPC_IRQ_LEVEL: | 216 | case KVM_CAP_PPC_IRQ_LEVEL: |
@@ -258,6 +281,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) | |||
258 | { | 281 | { |
259 | struct kvm_vcpu *vcpu; | 282 | struct kvm_vcpu *vcpu; |
260 | vcpu = kvmppc_core_vcpu_create(kvm, id); | 283 | vcpu = kvmppc_core_vcpu_create(kvm, id); |
284 | vcpu->arch.wqp = &vcpu->wq; | ||
261 | if (!IS_ERR(vcpu)) | 285 | if (!IS_ERR(vcpu)) |
262 | kvmppc_create_vcpu_debugfs(vcpu, id); | 286 | kvmppc_create_vcpu_debugfs(vcpu, id); |
263 | return vcpu; | 287 | return vcpu; |
@@ -289,8 +313,8 @@ static void kvmppc_decrementer_func(unsigned long data) | |||
289 | 313 | ||
290 | kvmppc_core_queue_dec(vcpu); | 314 | kvmppc_core_queue_dec(vcpu); |
291 | 315 | ||
292 | if (waitqueue_active(&vcpu->wq)) { | 316 | if (waitqueue_active(vcpu->arch.wqp)) { |
293 | wake_up_interruptible(&vcpu->wq); | 317 | wake_up_interruptible(vcpu->arch.wqp); |
294 | vcpu->stat.halt_wakeup++; | 318 | vcpu->stat.halt_wakeup++; |
295 | } | 319 | } |
296 | } | 320 | } |
@@ -543,13 +567,15 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
543 | 567 | ||
544 | int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq) | 568 | int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq) |
545 | { | 569 | { |
546 | if (irq->irq == KVM_INTERRUPT_UNSET) | 570 | if (irq->irq == KVM_INTERRUPT_UNSET) { |
547 | kvmppc_core_dequeue_external(vcpu, irq); | 571 | kvmppc_core_dequeue_external(vcpu, irq); |
548 | else | 572 | return 0; |
549 | kvmppc_core_queue_external(vcpu, irq); | 573 | } |
574 | |||
575 | kvmppc_core_queue_external(vcpu, irq); | ||
550 | 576 | ||
551 | if (waitqueue_active(&vcpu->wq)) { | 577 | if (waitqueue_active(vcpu->arch.wqp)) { |
552 | wake_up_interruptible(&vcpu->wq); | 578 | wake_up_interruptible(vcpu->arch.wqp); |
553 | vcpu->stat.halt_wakeup++; | 579 | vcpu->stat.halt_wakeup++; |
554 | } else if (vcpu->cpu != -1) { | 580 | } else if (vcpu->cpu != -1) { |
555 | smp_send_reschedule(vcpu->cpu); | 581 | smp_send_reschedule(vcpu->cpu); |
@@ -571,11 +597,18 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, | |||
571 | r = 0; | 597 | r = 0; |
572 | vcpu->arch.osi_enabled = true; | 598 | vcpu->arch.osi_enabled = true; |
573 | break; | 599 | break; |
600 | case KVM_CAP_PPC_PAPR: | ||
601 | r = 0; | ||
602 | vcpu->arch.papr_enabled = true; | ||
603 | break; | ||
574 | default: | 604 | default: |
575 | r = -EINVAL; | 605 | r = -EINVAL; |
576 | break; | 606 | break; |
577 | } | 607 | } |
578 | 608 | ||
609 | if (!r) | ||
610 | r = kvmppc_sanity_check(vcpu); | ||
611 | |||
579 | return r; | 612 | return r; |
580 | } | 613 | } |
581 | 614 | ||