@@ -1663,15 +1663,24 @@ static bool is_feature_id_reg(u32 encoding)
16631663 * Return true if the register's (Op0, Op1, CRn, CRm, Op2) is
16641664 * (3, 0, 0, crm, op2), where 1<=crm<8, 0<=op2<8, which is the range of ID
16651665 * registers KVM maintains on a per-VM basis.
1666+ *
1667+ * Additionally, the implementation ID registers and CTR_EL0 are handled as
1668+ * per-VM registers.
16661669 */
16671670static inline bool is_vm_ftr_id_reg (u32 id )
16681671{
1669- if (id == SYS_CTR_EL0 )
1672+ switch (id ) {
1673+ case SYS_CTR_EL0 :
1674+ case SYS_MIDR_EL1 :
1675+ case SYS_REVIDR_EL1 :
1676+ case SYS_AIDR_EL1 :
16701677 return true;
1678+ default :
1679+ return (sys_reg_Op0 (id ) == 3 && sys_reg_Op1 (id ) == 0 &&
1680+ sys_reg_CRn (id ) == 0 && sys_reg_CRm (id ) >= 1 &&
1681+ sys_reg_CRm (id ) < 8 );
16711682
1672- return (sys_reg_Op0 (id ) == 3 && sys_reg_Op1 (id ) == 0 &&
1673- sys_reg_CRn (id ) == 0 && sys_reg_CRm (id ) >= 1 &&
1674- sys_reg_CRm (id ) < 8 );
1683+ }
16751684}
16761685
16771686static inline bool is_vcpu_ftr_id_reg (u32 id )
@@ -2540,45 +2549,37 @@ static void init_imp_id_regs(void)
25402549 boot_cpu_aidr_val = read_sysreg (aidr_el1 );
25412550}
25422551
2543- static int get_imp_id_reg (struct kvm_vcpu * vcpu , const struct sys_reg_desc * r ,
2544- u64 * val )
2552+ static u64 reset_imp_id_reg (struct kvm_vcpu * vcpu , const struct sys_reg_desc * r )
25452553{
25462554 switch (reg_to_encoding (r )) {
25472555 case SYS_MIDR_EL1 :
2548- * val = boot_cpu_midr_val ;
2549- break ;
2556+ return boot_cpu_midr_val ;
25502557 case SYS_REVIDR_EL1 :
2551- * val = boot_cpu_revidr_val ;
2552- break ;
2558+ return boot_cpu_revidr_val ;
25532559 case SYS_AIDR_EL1 :
2554- * val = boot_cpu_aidr_val ;
2555- break ;
2560+ return boot_cpu_aidr_val ;
25562561 default :
2557- WARN_ON_ONCE ( 1 );
2558- return - EINVAL ;
2562+ KVM_BUG_ON ( 1 , vcpu -> kvm );
2563+ return 0 ;
25592564 }
2560-
2561- return 0 ;
25622565}
25632566
25642567static int set_imp_id_reg (struct kvm_vcpu * vcpu , const struct sys_reg_desc * r ,
25652568 u64 val )
25662569{
25672570 u64 expected ;
2568- int ret ;
25692571
2570- ret = get_imp_id_reg (vcpu , r , & expected );
2571- if (ret )
2572- return ret ;
2572+ expected = read_id_reg (vcpu , r );
25732573
25742574 return (expected == val ) ? 0 : - EINVAL ;
25752575}
25762576
25772577#define IMPLEMENTATION_ID (reg ) { \
25782578 SYS_DESC(SYS_##reg), \
25792579 .access = access_imp_id_reg, \
2580- .get_user = get_imp_id_reg, \
2580+ .get_user = get_id_reg, \
25812581 .set_user = set_imp_id_reg, \
2582+ .reset = reset_imp_id_reg, \
25822583}
25832584
25842585/*
0 commit comments