Skip to content

Commit b4043e7

Browse files
Sebastian Ottoupton
authored andcommitted
KVM: arm64: Maintain per-VM copy of implementation ID regs
Get ready to allow changes to the implementation ID registers by tracking the VM-wide values. Signed-off-by: Sebastian Ott <sebott@redhat.com> Link: https://lore.kernel.org/r/20250225005401.679536-3-oliver.upton@linux.dev Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent 4cd4856 commit b4043e7

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ struct kvm_arch {
373373
#define KVM_ARM_ID_REG_NUM (IDREG_IDX(sys_reg(3, 0, 0, 7, 7)) + 1)
374374
u64 id_regs[KVM_ARM_ID_REG_NUM];
375375

376+
u64 midr_el1;
377+
u64 revidr_el1;
378+
u64 aidr_el1;
376379
u64 ctr_el0;
377380

378381
/* Masks for VNCR-backed and general EL2 sysregs */
@@ -1459,6 +1462,12 @@ static inline u64 *__vm_id_reg(struct kvm_arch *ka, u32 reg)
14591462
return &ka->id_regs[IDREG_IDX(reg)];
14601463
case SYS_CTR_EL0:
14611464
return &ka->ctr_el0;
1465+
case SYS_MIDR_EL1:
1466+
return &ka->midr_el1;
1467+
case SYS_REVIDR_EL1:
1468+
return &ka->revidr_el1;
1469+
case SYS_AIDR_EL1:
1470+
return &ka->aidr_el1;
14621471
default:
14631472
WARN_ON_ONCE(1);
14641473
return NULL;

arch/arm64/kvm/sys_regs.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
16671670
static 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

16771686
static 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

25642567
static 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

Comments
 (0)