@@ -1663,15 +1663,24 @@ static bool is_feature_id_reg(u32 encoding)
1663
1663
* Return true if the register's (Op0, Op1, CRn, CRm, Op2) is
1664
1664
* (3, 0, 0, crm, op2), where 1<=crm<8, 0<=op2<8, which is the range of ID
1665
1665
* 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.
1666
1669
*/
1667
1670
static inline bool is_vm_ftr_id_reg (u32 id )
1668
1671
{
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 :
1670
1677
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 );
1671
1682
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
+ }
1675
1684
}
1676
1685
1677
1686
static inline bool is_vcpu_ftr_id_reg (u32 id )
@@ -2540,45 +2549,37 @@ static void init_imp_id_regs(void)
2540
2549
boot_cpu_aidr_val = read_sysreg (aidr_el1 );
2541
2550
}
2542
2551
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 )
2545
2553
{
2546
2554
switch (reg_to_encoding (r )) {
2547
2555
case SYS_MIDR_EL1 :
2548
- * val = boot_cpu_midr_val ;
2549
- break ;
2556
+ return boot_cpu_midr_val ;
2550
2557
case SYS_REVIDR_EL1 :
2551
- * val = boot_cpu_revidr_val ;
2552
- break ;
2558
+ return boot_cpu_revidr_val ;
2553
2559
case SYS_AIDR_EL1 :
2554
- * val = boot_cpu_aidr_val ;
2555
- break ;
2560
+ return boot_cpu_aidr_val ;
2556
2561
default :
2557
- WARN_ON_ONCE ( 1 );
2558
- return - EINVAL ;
2562
+ KVM_BUG_ON ( 1 , vcpu -> kvm );
2563
+ return 0 ;
2559
2564
}
2560
-
2561
- return 0 ;
2562
2565
}
2563
2566
2564
2567
static int set_imp_id_reg (struct kvm_vcpu * vcpu , const struct sys_reg_desc * r ,
2565
2568
u64 val )
2566
2569
{
2567
2570
u64 expected ;
2568
- int ret ;
2569
2571
2570
- ret = get_imp_id_reg (vcpu , r , & expected );
2571
- if (ret )
2572
- return ret ;
2572
+ expected = read_id_reg (vcpu , r );
2573
2573
2574
2574
return (expected == val ) ? 0 : - EINVAL ;
2575
2575
}
2576
2576
2577
2577
#define IMPLEMENTATION_ID (reg ) { \
2578
2578
SYS_DESC(SYS_##reg), \
2579
2579
.access = access_imp_id_reg, \
2580
- .get_user = get_imp_id_reg, \
2580
+ .get_user = get_id_reg, \
2581
2581
.set_user = set_imp_id_reg, \
2582
+ .reset = reset_imp_id_reg, \
2582
2583
}
2583
2584
2584
2585
/*
0 commit comments