diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 18:47:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 18:47:52 -0400 |
commit | d3f12d36f148f101c568bdbce795e41cd9ceadf3 (patch) | |
tree | 4d58ff7605a530fb052c95378d507e2350755825 /arch/s390 | |
parent | 39b566eedbe9e35d38502cc5e62ef7abf1aff9c9 (diff) | |
parent | 16175a796d061833aacfbd9672235f2d2725df65 (diff) |
Merge branch 'kvm-updates/2.6.30' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/2.6.30' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (113 commits)
KVM: VMX: Don't allow uninhibited access to EFER on i386
KVM: Correct deassign device ioctl to IOW
KVM: ppc: e500: Fix the bug that KVM is unstable in SMP
KVM: ppc: e500: Fix the bug that mas0 update to wrong value when read TLB entry
KVM: Fix missing smp tlb flush in invlpg
KVM: Get support IRQ routing entry counts
KVM: fix sparse warnings: Should it be static?
KVM: fix sparse warnings: context imbalance
KVM: is_long_mode() should check for EFER.LMA
KVM: VMX: Update necessary state when guest enters long mode
KVM: ia64: Fix the build errors due to lack of macros related to MSI.
ia64: Move the macro definitions related to MSI to one header file.
KVM: fix kvm_vm_ioctl_deassign_device
KVM: define KVM_CAP_DEVICE_DEASSIGNMENT
KVM: ppc: Add emulation of E500 register mmucsr0
KVM: Report IRQ injection status for MSI delivered interrupts
KVM: MMU: Fix another largepage memory leak
KVM: SVM: set accessed bit for VMCB segment selectors
KVM: Report IRQ injection status to userspace.
KVM: MMU: remove assertion in kvm_mmu_alloc_page
...
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/kvm.h | 7 | ||||
-rw-r--r-- | arch/s390/include/asm/kvm_host.h | 3 | ||||
-rw-r--r-- | arch/s390/kvm/Kconfig | 3 | ||||
-rw-r--r-- | arch/s390/kvm/intercept.c | 2 | ||||
-rw-r--r-- | arch/s390/kvm/interrupt.c | 7 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 4 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 2 | ||||
-rw-r--r-- | arch/s390/kvm/priv.c | 18 | ||||
-rw-r--r-- | arch/s390/kvm/sigp.c | 2 |
9 files changed, 35 insertions, 13 deletions
diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h index e1f54654e3ae..0b2f829f6d50 100644 --- a/arch/s390/include/asm/kvm.h +++ b/arch/s390/include/asm/kvm.h | |||
@@ -42,4 +42,11 @@ struct kvm_fpu { | |||
42 | __u64 fprs[16]; | 42 | __u64 fprs[16]; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | struct kvm_debug_exit_arch { | ||
46 | }; | ||
47 | |||
48 | /* for KVM_SET_GUEST_DEBUG */ | ||
49 | struct kvm_guest_debug_arch { | ||
50 | }; | ||
51 | |||
45 | #endif | 52 | #endif |
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 3c55e4107dcc..c6e674f5fca9 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
@@ -21,9 +21,6 @@ | |||
21 | /* memory slots that does not exposed to userspace */ | 21 | /* memory slots that does not exposed to userspace */ |
22 | #define KVM_PRIVATE_MEM_SLOTS 4 | 22 | #define KVM_PRIVATE_MEM_SLOTS 4 |
23 | 23 | ||
24 | struct kvm_guest_debug { | ||
25 | }; | ||
26 | |||
27 | struct sca_entry { | 24 | struct sca_entry { |
28 | atomic_t scn; | 25 | atomic_t scn; |
29 | __u64 reserved; | 26 | __u64 reserved; |
diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index e051cad1f1e0..3e260b7e37b2 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig | |||
@@ -4,6 +4,9 @@ | |||
4 | config HAVE_KVM | 4 | config HAVE_KVM |
5 | bool | 5 | bool |
6 | 6 | ||
7 | config HAVE_KVM_IRQCHIP | ||
8 | bool | ||
9 | |||
7 | menuconfig VIRTUALIZATION | 10 | menuconfig VIRTUALIZATION |
8 | bool "Virtualization" | 11 | bool "Virtualization" |
9 | default y | 12 | default y |
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 61236102203e..9d19803111ba 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -103,7 +103,7 @@ static int handle_lctl(struct kvm_vcpu *vcpu) | |||
103 | static intercept_handler_t instruction_handlers[256] = { | 103 | static intercept_handler_t instruction_handlers[256] = { |
104 | [0x83] = kvm_s390_handle_diag, | 104 | [0x83] = kvm_s390_handle_diag, |
105 | [0xae] = kvm_s390_handle_sigp, | 105 | [0xae] = kvm_s390_handle_sigp, |
106 | [0xb2] = kvm_s390_handle_priv, | 106 | [0xb2] = kvm_s390_handle_b2, |
107 | [0xb7] = handle_lctl, | 107 | [0xb7] = handle_lctl, |
108 | [0xeb] = handle_lctlg, | 108 | [0xeb] = handle_lctlg, |
109 | }; | 109 | }; |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index f4fe28a2521a..0189356fe209 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -555,9 +555,14 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
555 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)", | 555 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)", |
556 | s390int->parm); | 556 | s390int->parm); |
557 | break; | 557 | break; |
558 | case KVM_S390_SIGP_SET_PREFIX: | ||
559 | inti->prefix.address = s390int->parm; | ||
560 | inti->type = s390int->type; | ||
561 | VCPU_EVENT(vcpu, 3, "inject: set prefix to %x (from user)", | ||
562 | s390int->parm); | ||
563 | break; | ||
558 | case KVM_S390_SIGP_STOP: | 564 | case KVM_S390_SIGP_STOP: |
559 | case KVM_S390_RESTART: | 565 | case KVM_S390_RESTART: |
560 | case KVM_S390_SIGP_SET_PREFIX: | ||
561 | case KVM_S390_INT_EMERGENCY: | 566 | case KVM_S390_INT_EMERGENCY: |
562 | VCPU_EVENT(vcpu, 3, "inject: type %x", s390int->type); | 567 | VCPU_EVENT(vcpu, 3, "inject: type %x", s390int->type); |
563 | inti->type = s390int->type; | 568 | inti->type = s390int->type; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 0d33893e1e89..cbfe91e10120 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -422,8 +422,8 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, | |||
422 | return -EINVAL; /* not implemented yet */ | 422 | return -EINVAL; /* not implemented yet */ |
423 | } | 423 | } |
424 | 424 | ||
425 | int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, | 425 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
426 | struct kvm_debug_guest *dbg) | 426 | struct kvm_guest_debug *dbg) |
427 | { | 427 | { |
428 | return -EINVAL; /* not implemented yet */ | 428 | return -EINVAL; /* not implemented yet */ |
429 | } | 429 | } |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 3893cf12eacf..00bbe69b78da 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -50,7 +50,7 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
50 | int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); | 50 | int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); |
51 | 51 | ||
52 | /* implemented in priv.c */ | 52 | /* implemented in priv.c */ |
53 | int kvm_s390_handle_priv(struct kvm_vcpu *vcpu); | 53 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); |
54 | 54 | ||
55 | /* implemented in sigp.c */ | 55 | /* implemented in sigp.c */ |
56 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); | 56 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 3605df45dd41..4b88834b8dd8 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -304,12 +304,24 @@ static intercept_handler_t priv_handlers[256] = { | |||
304 | [0xb1] = handle_stfl, | 304 | [0xb1] = handle_stfl, |
305 | }; | 305 | }; |
306 | 306 | ||
307 | int kvm_s390_handle_priv(struct kvm_vcpu *vcpu) | 307 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu) |
308 | { | 308 | { |
309 | intercept_handler_t handler; | 309 | intercept_handler_t handler; |
310 | 310 | ||
311 | /* | ||
312 | * a lot of B2 instructions are priviledged. We first check for | ||
313 | * the priviledges ones, that we can handle in the kernel. If the | ||
314 | * kernel can handle this instruction, we check for the problem | ||
315 | * state bit and (a) handle the instruction or (b) send a code 2 | ||
316 | * program check. | ||
317 | * Anything else goes to userspace.*/ | ||
311 | handler = priv_handlers[vcpu->arch.sie_block->ipa & 0x00ff]; | 318 | handler = priv_handlers[vcpu->arch.sie_block->ipa & 0x00ff]; |
312 | if (handler) | 319 | if (handler) { |
313 | return handler(vcpu); | 320 | if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) |
321 | return kvm_s390_inject_program_int(vcpu, | ||
322 | PGM_PRIVILEGED_OPERATION); | ||
323 | else | ||
324 | return handler(vcpu); | ||
325 | } | ||
314 | return -ENOTSUPP; | 326 | return -ENOTSUPP; |
315 | } | 327 | } |
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 2a01b9e02801..f27dbedf0866 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
@@ -153,8 +153,6 @@ static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) | |||
153 | 153 | ||
154 | switch (parameter & 0xff) { | 154 | switch (parameter & 0xff) { |
155 | case 0: | 155 | case 0: |
156 | printk(KERN_WARNING "kvm: request to switch to ESA/390 mode" | ||
157 | " not supported"); | ||
158 | rc = 3; /* not operational */ | 156 | rc = 3; /* not operational */ |
159 | break; | 157 | break; |
160 | case 1: | 158 | case 1: |