@@ -216,6 +216,82 @@ static void locate_register(const struct kvm_vcpu *vcpu, enum vcpu_sysreg reg,
216216 }
217217}
218218
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+
219295u64 vcpu_read_sys_reg (const struct kvm_vcpu * vcpu , enum vcpu_sysreg reg )
220296{
221297 struct sr_loc loc = {};
@@ -246,13 +322,13 @@ u64 vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, enum vcpu_sysreg reg)
246322
247323 if (loc .loc & SR_LOC_LOADED ) {
248324 enum vcpu_sysreg map_reg = reg ;
249- u64 val = 0x8badf00d8badf00d ;
250325
251326 if (loc .loc & SR_LOC_MAPPED )
252327 map_reg = loc .map_reg ;
253328
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+
256332 if (reg >= __SANITISED_REG_START__ )
257333 val = kvm_vcpu_apply_reg_masks (vcpu , reg , val );
258334
@@ -304,7 +380,7 @@ void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, enum vcpu_sysreg reg)
304380 else
305381 xlated_val = val ;
306382
307- __vcpu_write_sys_reg_to_cpu ( xlated_val , map_reg );
383+ write_sr_to_cpu ( map_reg , xlated_val );
308384
309385 /*
310386 * Fall through to write the backing store anyway, which
0 commit comments