aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm/intercept.c
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2015-11-04 10:22:19 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-02-10 07:12:52 -0500
commitf6af84e7e7eb0558d5ad3882007956eb5b748ffd (patch)
treeb082b83acc3b40c892f6ad15307823f60596b192 /arch/s390/kvm/intercept.c
parent659773227506f7b971cfd52e1aa146c896405187 (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.c41
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
139static void __extract_prog_irq(struct kvm_vcpu *vcpu, 139static 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
224static int handle_prog(struct kvm_vcpu *vcpu) 225static 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/**