diff options
| author | Christian Borntraeger <borntraeger@de.ibm.com> | 2018-02-06 05:19:28 -0500 |
|---|---|---|
| committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2018-02-14 08:53:43 -0500 |
| commit | cb7485da3ed1ac4ef6c71d4b2b715f8b87f118c8 (patch) | |
| tree | 508cea52e7bec2e5b263f0e212237e52c54008c1 | |
| parent | 6db4263fec9e550e0cdaed732f4af77a44c10f5f (diff) | |
KVM: s390: use switch vs jump table in intercept.c
Instead of having huge jump tables for function selection,
let's use normal switch/case statements for the instruction
handlers in intercept.c We can now also get rid of
intercept_handler_t.
This allows the compiler to make the right decision depending
on the situation (e.g. avoid jump-tables for thunks).
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
| -rw-r--r-- | arch/s390/kvm/intercept.c | 51 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.h | 2 |
2 files changed, 29 insertions, 24 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) |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index bd31b37b0e6f..3c0a975c2477 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
| @@ -19,8 +19,6 @@ | |||
| 19 | #include <asm/processor.h> | 19 | #include <asm/processor.h> |
| 20 | #include <asm/sclp.h> | 20 | #include <asm/sclp.h> |
| 21 | 21 | ||
| 22 | typedef int (*intercept_handler_t)(struct kvm_vcpu *vcpu); | ||
| 23 | |||
| 24 | /* Transactional Memory Execution related macros */ | 22 | /* Transactional Memory Execution related macros */ |
| 25 | #define IS_TE_ENABLED(vcpu) ((vcpu->arch.sie_block->ecb & ECB_TE)) | 23 | #define IS_TE_ENABLED(vcpu) ((vcpu->arch.sie_block->ecb & ECB_TE)) |
| 26 | #define TDB_FORMAT1 1 | 24 | #define TDB_FORMAT1 1 |
