@@ -216,6 +216,82 @@ static void locate_register(const struct kvm_vcpu *vcpu, enum vcpu_sysreg reg,
216
216
}
217
217
}
218
218
219
+ static u64 read_sr_from_cpu (enum vcpu_sysreg reg )
220
+ {
221
+ u64 val = 0x8badf00d8badf00d ;
222
+
223
+ switch (reg ) {
224
+ case SCTLR_EL1 : val = read_sysreg_s (SYS_SCTLR_EL12 ); break ;
225
+ case CPACR_EL1 : val = read_sysreg_s (SYS_CPACR_EL12 ); break ;
226
+ case TTBR0_EL1 : val = read_sysreg_s (SYS_TTBR0_EL12 ); break ;
227
+ case TTBR1_EL1 : val = read_sysreg_s (SYS_TTBR1_EL12 ); break ;
228
+ case TCR_EL1 : val = read_sysreg_s (SYS_TCR_EL12 ); break ;
229
+ case TCR2_EL1 : val = read_sysreg_s (SYS_TCR2_EL12 ); break ;
230
+ case PIR_EL1 : val = read_sysreg_s (SYS_PIR_EL12 ); break ;
231
+ case PIRE0_EL1 : val = read_sysreg_s (SYS_PIRE0_EL12 ); break ;
232
+ case POR_EL1 : val = read_sysreg_s (SYS_POR_EL12 ); break ;
233
+ case ESR_EL1 : val = read_sysreg_s (SYS_ESR_EL12 ); break ;
234
+ case AFSR0_EL1 : val = read_sysreg_s (SYS_AFSR0_EL12 ); break ;
235
+ case AFSR1_EL1 : val = read_sysreg_s (SYS_AFSR1_EL12 ); break ;
236
+ case FAR_EL1 : val = read_sysreg_s (SYS_FAR_EL12 ); break ;
237
+ case MAIR_EL1 : val = read_sysreg_s (SYS_MAIR_EL12 ); break ;
238
+ case VBAR_EL1 : val = read_sysreg_s (SYS_VBAR_EL12 ); break ;
239
+ case CONTEXTIDR_EL1 : val = read_sysreg_s (SYS_CONTEXTIDR_EL12 );break ;
240
+ case AMAIR_EL1 : val = read_sysreg_s (SYS_AMAIR_EL12 ); break ;
241
+ case CNTKCTL_EL1 : val = read_sysreg_s (SYS_CNTKCTL_EL12 ); break ;
242
+ case ELR_EL1 : val = read_sysreg_s (SYS_ELR_EL12 ); break ;
243
+ case SPSR_EL1 : val = read_sysreg_s (SYS_SPSR_EL12 ); break ;
244
+ case ZCR_EL1 : val = read_sysreg_s (SYS_ZCR_EL12 ); break ;
245
+ case SCTLR2_EL1 : val = read_sysreg_s (SYS_SCTLR2_EL12 ); break ;
246
+ case TPIDR_EL0 : val = read_sysreg_s (SYS_TPIDR_EL0 ); break ;
247
+ case TPIDRRO_EL0 : val = read_sysreg_s (SYS_TPIDRRO_EL0 ); break ;
248
+ case TPIDR_EL1 : val = read_sysreg_s (SYS_TPIDR_EL1 ); break ;
249
+ case PAR_EL1 : val = read_sysreg_par (); break ;
250
+ case DACR32_EL2 : val = read_sysreg_s (SYS_DACR32_EL2 ); break ;
251
+ case IFSR32_EL2 : val = read_sysreg_s (SYS_IFSR32_EL2 ); break ;
252
+ case DBGVCR32_EL2 : val = read_sysreg_s (SYS_DBGVCR32_EL2 ); break ;
253
+ default : WARN_ON_ONCE (1 );
254
+ }
255
+
256
+ return val ;
257
+ }
258
+
259
+ static void write_sr_to_cpu (enum vcpu_sysreg reg , u64 val )
260
+ {
261
+ switch (reg ) {
262
+ case SCTLR_EL1 : write_sysreg_s (val , SYS_SCTLR_EL12 ); break ;
263
+ case CPACR_EL1 : write_sysreg_s (val , SYS_CPACR_EL12 ); break ;
264
+ case TTBR0_EL1 : write_sysreg_s (val , SYS_TTBR0_EL12 ); break ;
265
+ case TTBR1_EL1 : write_sysreg_s (val , SYS_TTBR1_EL12 ); break ;
266
+ case TCR_EL1 : write_sysreg_s (val , SYS_TCR_EL12 ); break ;
267
+ case TCR2_EL1 : write_sysreg_s (val , SYS_TCR2_EL12 ); break ;
268
+ case PIR_EL1 : write_sysreg_s (val , SYS_PIR_EL12 ); break ;
269
+ case PIRE0_EL1 : write_sysreg_s (val , SYS_PIRE0_EL12 ); break ;
270
+ case POR_EL1 : write_sysreg_s (val , SYS_POR_EL12 ); break ;
271
+ case ESR_EL1 : write_sysreg_s (val , SYS_ESR_EL12 ); break ;
272
+ case AFSR0_EL1 : write_sysreg_s (val , SYS_AFSR0_EL12 ); break ;
273
+ case AFSR1_EL1 : write_sysreg_s (val , SYS_AFSR1_EL12 ); break ;
274
+ case FAR_EL1 : write_sysreg_s (val , SYS_FAR_EL12 ); break ;
275
+ case MAIR_EL1 : write_sysreg_s (val , SYS_MAIR_EL12 ); break ;
276
+ case VBAR_EL1 : write_sysreg_s (val , SYS_VBAR_EL12 ); break ;
277
+ case CONTEXTIDR_EL1 : write_sysreg_s (val , SYS_CONTEXTIDR_EL12 );break ;
278
+ case AMAIR_EL1 : write_sysreg_s (val , SYS_AMAIR_EL12 ); break ;
279
+ case CNTKCTL_EL1 : write_sysreg_s (val , SYS_CNTKCTL_EL12 ); break ;
280
+ case ELR_EL1 : write_sysreg_s (val , SYS_ELR_EL12 ); break ;
281
+ case SPSR_EL1 : write_sysreg_s (val , SYS_SPSR_EL12 ); break ;
282
+ case ZCR_EL1 : write_sysreg_s (val , SYS_ZCR_EL12 ); break ;
283
+ case SCTLR2_EL1 : write_sysreg_s (val , SYS_SCTLR2_EL12 ); break ;
284
+ case TPIDR_EL0 : write_sysreg_s (val , SYS_TPIDR_EL0 ); break ;
285
+ case TPIDRRO_EL0 : write_sysreg_s (val , SYS_TPIDRRO_EL0 ); break ;
286
+ case TPIDR_EL1 : write_sysreg_s (val , SYS_TPIDR_EL1 ); break ;
287
+ case PAR_EL1 : write_sysreg_s (val , SYS_PAR_EL1 ); break ;
288
+ case DACR32_EL2 : write_sysreg_s (val , SYS_DACR32_EL2 ); break ;
289
+ case IFSR32_EL2 : write_sysreg_s (val , SYS_IFSR32_EL2 ); break ;
290
+ case DBGVCR32_EL2 : write_sysreg_s (val , SYS_DBGVCR32_EL2 ); break ;
291
+ default : WARN_ON_ONCE (1 );
292
+ }
293
+ }
294
+
219
295
u64 vcpu_read_sys_reg (const struct kvm_vcpu * vcpu , enum vcpu_sysreg reg )
220
296
{
221
297
struct sr_loc loc = {};
@@ -246,13 +322,13 @@ u64 vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, enum vcpu_sysreg reg)
246
322
247
323
if (loc .loc & SR_LOC_LOADED ) {
248
324
enum vcpu_sysreg map_reg = reg ;
249
- u64 val = 0x8badf00d8badf00d ;
250
325
251
326
if (loc .loc & SR_LOC_MAPPED )
252
327
map_reg = loc .map_reg ;
253
328
254
- if (!(loc .loc & SR_LOC_XLATED ) &&
255
- __vcpu_read_sys_reg_from_cpu (map_reg , & val )) {
329
+ if (!(loc .loc & SR_LOC_XLATED )) {
330
+ u64 val = read_sr_from_cpu (map_reg );
331
+
256
332
if (reg >= __SANITISED_REG_START__ )
257
333
val = kvm_vcpu_apply_reg_masks (vcpu , reg , val );
258
334
@@ -304,7 +380,7 @@ void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, enum vcpu_sysreg reg)
304
380
else
305
381
xlated_val = val ;
306
382
307
- __vcpu_write_sys_reg_to_cpu ( xlated_val , map_reg );
383
+ write_sr_to_cpu ( map_reg , xlated_val );
308
384
309
385
/*
310
386
* Fall through to write the backing store anyway, which
0 commit comments