diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2015-11-04 10:22:19 -0500 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2016-02-10 07:12:52 -0500 |
commit | f6af84e7e7eb0558d5ad3882007956eb5b748ffd (patch) | |
tree | b082b83acc3b40c892f6ad15307823f60596b192 /arch/s390/kvm/intercept.c | |
parent | 659773227506f7b971cfd52e1aa146c896405187 (diff) |
KVM: s390: clean up prog irq injection on prog irq icpts
__extract_prog_irq() is used only once for getting the program check data
in one place. Let's combine it with an injection function to avoid a memset
and to prevent misuse on injection by simplifying the interface to only
have the VCPU as parameter.
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm/intercept.c')
-rw-r--r-- | arch/s390/kvm/intercept.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 44bb923a6482..6b4e5b5ff06c 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -136,11 +136,11 @@ static int handle_instruction(struct kvm_vcpu *vcpu) | |||
136 | return -EOPNOTSUPP; | 136 | return -EOPNOTSUPP; |
137 | } | 137 | } |
138 | 138 | ||
139 | static void __extract_prog_irq(struct kvm_vcpu *vcpu, | 139 | static int inject_prog_on_prog_intercept(struct kvm_vcpu *vcpu) |
140 | struct kvm_s390_pgm_info *pgm_info) | ||
141 | { | 140 | { |
142 | memset(pgm_info, 0, sizeof(struct kvm_s390_pgm_info)); | 141 | struct kvm_s390_pgm_info pgm_info = { |
143 | pgm_info->code = vcpu->arch.sie_block->iprcc; | 142 | .code = vcpu->arch.sie_block->iprcc, |
143 | }; | ||
144 | 144 | ||
145 | switch (vcpu->arch.sie_block->iprcc & ~PGM_PER) { | 145 | switch (vcpu->arch.sie_block->iprcc & ~PGM_PER) { |
146 | case PGM_AFX_TRANSLATION: | 146 | case PGM_AFX_TRANSLATION: |
@@ -153,7 +153,7 @@ static void __extract_prog_irq(struct kvm_vcpu *vcpu, | |||
153 | case PGM_PRIMARY_AUTHORITY: | 153 | case PGM_PRIMARY_AUTHORITY: |
154 | case PGM_SECONDARY_AUTHORITY: | 154 | case PGM_SECONDARY_AUTHORITY: |
155 | case PGM_SPACE_SWITCH: | 155 | case PGM_SPACE_SWITCH: |
156 | pgm_info->trans_exc_code = vcpu->arch.sie_block->tecmc; | 156 | pgm_info.trans_exc_code = vcpu->arch.sie_block->tecmc; |
157 | break; | 157 | break; |
158 | case PGM_ALEN_TRANSLATION: | 158 | case PGM_ALEN_TRANSLATION: |
159 | case PGM_ALE_SEQUENCE: | 159 | case PGM_ALE_SEQUENCE: |
@@ -161,7 +161,7 @@ static void __extract_prog_irq(struct kvm_vcpu *vcpu, | |||
161 | case PGM_ASTE_SEQUENCE: | 161 | case PGM_ASTE_SEQUENCE: |
162 | case PGM_ASTE_VALIDITY: | 162 | case PGM_ASTE_VALIDITY: |
163 | case PGM_EXTENDED_AUTHORITY: | 163 | case PGM_EXTENDED_AUTHORITY: |
164 | pgm_info->exc_access_id = vcpu->arch.sie_block->eai; | 164 | pgm_info.exc_access_id = vcpu->arch.sie_block->eai; |
165 | break; | 165 | break; |
166 | case PGM_ASCE_TYPE: | 166 | case PGM_ASCE_TYPE: |
167 | case PGM_PAGE_TRANSLATION: | 167 | case PGM_PAGE_TRANSLATION: |
@@ -169,32 +169,33 @@ static void __extract_prog_irq(struct kvm_vcpu *vcpu, | |||
169 | case PGM_REGION_SECOND_TRANS: | 169 | case PGM_REGION_SECOND_TRANS: |
170 | case PGM_REGION_THIRD_TRANS: | 170 | case PGM_REGION_THIRD_TRANS: |
171 | case PGM_SEGMENT_TRANSLATION: | 171 | case PGM_SEGMENT_TRANSLATION: |
172 | pgm_info->trans_exc_code = vcpu->arch.sie_block->tecmc; | 172 | pgm_info.trans_exc_code = vcpu->arch.sie_block->tecmc; |
173 | pgm_info->exc_access_id = vcpu->arch.sie_block->eai; | 173 | pgm_info.exc_access_id = vcpu->arch.sie_block->eai; |
174 | pgm_info->op_access_id = vcpu->arch.sie_block->oai; | 174 | pgm_info.op_access_id = vcpu->arch.sie_block->oai; |
175 | break; | 175 | break; |
176 | case PGM_MONITOR: | 176 | case PGM_MONITOR: |
177 | pgm_info->mon_class_nr = vcpu->arch.sie_block->mcn; | 177 | pgm_info.mon_class_nr = vcpu->arch.sie_block->mcn; |
178 | pgm_info->mon_code = vcpu->arch.sie_block->tecmc; | 178 | pgm_info.mon_code = vcpu->arch.sie_block->tecmc; |
179 | break; | 179 | break; |
180 | case PGM_VECTOR_PROCESSING: | 180 | case PGM_VECTOR_PROCESSING: |
181 | case PGM_DATA: | 181 | case PGM_DATA: |
182 | pgm_info->data_exc_code = vcpu->arch.sie_block->dxc; | 182 | pgm_info.data_exc_code = vcpu->arch.sie_block->dxc; |
183 | break; | 183 | break; |
184 | case PGM_PROTECTION: | 184 | case PGM_PROTECTION: |
185 | pgm_info->trans_exc_code = vcpu->arch.sie_block->tecmc; | 185 | pgm_info.trans_exc_code = vcpu->arch.sie_block->tecmc; |
186 | pgm_info->exc_access_id = vcpu->arch.sie_block->eai; | 186 | pgm_info.exc_access_id = vcpu->arch.sie_block->eai; |
187 | break; | 187 | break; |
188 | default: | 188 | default: |
189 | break; | 189 | break; |
190 | } | 190 | } |
191 | 191 | ||
192 | if (vcpu->arch.sie_block->iprcc & PGM_PER) { | 192 | if (vcpu->arch.sie_block->iprcc & PGM_PER) { |
193 | pgm_info->per_code = vcpu->arch.sie_block->perc; | 193 | pgm_info.per_code = vcpu->arch.sie_block->perc; |
194 | pgm_info->per_atmid = vcpu->arch.sie_block->peratmid; | 194 | pgm_info.per_atmid = vcpu->arch.sie_block->peratmid; |
195 | pgm_info->per_address = vcpu->arch.sie_block->peraddr; | 195 | pgm_info.per_address = vcpu->arch.sie_block->peraddr; |
196 | pgm_info->per_access_id = vcpu->arch.sie_block->peraid; | 196 | pgm_info.per_access_id = vcpu->arch.sie_block->peraid; |
197 | } | 197 | } |
198 | return kvm_s390_inject_prog_irq(vcpu, &pgm_info); | ||
198 | } | 199 | } |
199 | 200 | ||
200 | /* | 201 | /* |
@@ -223,7 +224,6 @@ static int handle_itdb(struct kvm_vcpu *vcpu) | |||
223 | 224 | ||
224 | static int handle_prog(struct kvm_vcpu *vcpu) | 225 | static int handle_prog(struct kvm_vcpu *vcpu) |
225 | { | 226 | { |
226 | struct kvm_s390_pgm_info pgm_info; | ||
227 | psw_t psw; | 227 | psw_t psw; |
228 | int rc; | 228 | int rc; |
229 | 229 | ||
@@ -249,8 +249,7 @@ static int handle_prog(struct kvm_vcpu *vcpu) | |||
249 | if (rc) | 249 | if (rc) |
250 | return rc; | 250 | return rc; |
251 | 251 | ||
252 | __extract_prog_irq(vcpu, &pgm_info); | 252 | return inject_prog_on_prog_intercept(vcpu); |
253 | return kvm_s390_inject_prog_irq(vcpu, &pgm_info); | ||
254 | } | 253 | } |
255 | 254 | ||
256 | /** | 255 | /** |