diff options
Diffstat (limited to 'arch/s390/kvm/intercept.c')
-rw-r--r-- | arch/s390/kvm/intercept.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 9c7d70715862..07c6e81163bf 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -22,22 +22,6 @@ | |||
22 | #include "trace.h" | 22 | #include "trace.h" |
23 | #include "trace-s390.h" | 23 | #include "trace-s390.h" |
24 | 24 | ||
25 | |||
26 | static const intercept_handler_t instruction_handlers[256] = { | ||
27 | [0x01] = kvm_s390_handle_01, | ||
28 | [0x82] = kvm_s390_handle_lpsw, | ||
29 | [0x83] = kvm_s390_handle_diag, | ||
30 | [0xaa] = kvm_s390_handle_aa, | ||
31 | [0xae] = kvm_s390_handle_sigp, | ||
32 | [0xb2] = kvm_s390_handle_b2, | ||
33 | [0xb6] = kvm_s390_handle_stctl, | ||
34 | [0xb7] = kvm_s390_handle_lctl, | ||
35 | [0xb9] = kvm_s390_handle_b9, | ||
36 | [0xe3] = kvm_s390_handle_e3, | ||
37 | [0xe5] = kvm_s390_handle_e5, | ||
38 | [0xeb] = kvm_s390_handle_eb, | ||
39 | }; | ||
40 | |||
41 | u8 kvm_s390_get_ilen(struct kvm_vcpu *vcpu) | 25 | u8 kvm_s390_get_ilen(struct kvm_vcpu *vcpu) |
42 | { | 26 | { |
43 | struct kvm_s390_sie_block *sie_block = vcpu->arch.sie_block; | 27 | struct kvm_s390_sie_block *sie_block = vcpu->arch.sie_block; |
@@ -129,16 +113,39 @@ static int handle_validity(struct kvm_vcpu *vcpu) | |||
129 | 113 | ||
130 | static int handle_instruction(struct kvm_vcpu *vcpu) | 114 | static int handle_instruction(struct kvm_vcpu *vcpu) |
131 | { | 115 | { |
132 | intercept_handler_t handler; | ||
133 | |||
134 | vcpu->stat.exit_instruction++; | 116 | vcpu->stat.exit_instruction++; |
135 | trace_kvm_s390_intercept_instruction(vcpu, | 117 | trace_kvm_s390_intercept_instruction(vcpu, |
136 | vcpu->arch.sie_block->ipa, | 118 | vcpu->arch.sie_block->ipa, |
137 | vcpu->arch.sie_block->ipb); | 119 | vcpu->arch.sie_block->ipb); |
138 | handler = instruction_handlers[vcpu->arch.sie_block->ipa >> 8]; | 120 | |
139 | if (handler) | 121 | switch (vcpu->arch.sie_block->ipa >> 8) { |
140 | return handler(vcpu); | 122 | case 0x01: |
141 | return -EOPNOTSUPP; | 123 | return kvm_s390_handle_01(vcpu); |
124 | case 0x82: | ||
125 | return kvm_s390_handle_lpsw(vcpu); | ||
126 | case 0x83: | ||
127 | return kvm_s390_handle_diag(vcpu); | ||
128 | case 0xaa: | ||
129 | return kvm_s390_handle_aa(vcpu); | ||
130 | case 0xae: | ||
131 | return kvm_s390_handle_sigp(vcpu); | ||
132 | case 0xb2: | ||
133 | return kvm_s390_handle_b2(vcpu); | ||
134 | case 0xb6: | ||
135 | return kvm_s390_handle_stctl(vcpu); | ||
136 | case 0xb7: | ||
137 | return kvm_s390_handle_lctl(vcpu); | ||
138 | case 0xb9: | ||
139 | return kvm_s390_handle_b9(vcpu); | ||
140 | case 0xe3: | ||
141 | return kvm_s390_handle_e3(vcpu); | ||
142 | case 0xe5: | ||
143 | return kvm_s390_handle_e5(vcpu); | ||
144 | case 0xeb: | ||
145 | return kvm_s390_handle_eb(vcpu); | ||
146 | default: | ||
147 | return -EOPNOTSUPP; | ||
148 | } | ||
142 | } | 149 | } |
143 | 150 | ||
144 | static int inject_prog_on_prog_intercept(struct kvm_vcpu *vcpu) | 151 | static int inject_prog_on_prog_intercept(struct kvm_vcpu *vcpu) |