Set the NVIS/NVOS fields to populate NIS/NOS and expose TLBIDIDR_EL1 to the guest. Signed-off-by: Jinqian Yang <yangjinqian1@huawei.com> Signed-off-by: Tian Zheng <zhengtian10@huawei.com> --- arch/arm64/include/asm/kvm_host.h | 3 +++ arch/arm64/kvm/sys_regs.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 57e83079c907..ff0463feb290 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -503,6 +503,9 @@ enum vcpu_sysreg { CNTHV_CTL_EL2, CNTHV_CVAL_EL2, + /* TLBI Domains Identification Register (EL1) */ + KABI_EXTEND_ENUM(TLBIDIDR_EL1) + NR_SYS_REGS /* Nothing after this line! */ }; diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index c94b24311525..fce0f1481252 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -276,6 +276,17 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu, return true; } +static bool access_tlbididr(struct kvm_vcpu *vcpu, + struct sys_reg_params *p, + const struct sys_reg_desc *r) +{ + if (p->is_write) + return ignore_write(vcpu, p); + + p->regval = vcpu_read_sys_reg(vcpu, r->reg); + return true; +} + static bool access_actlr(struct kvm_vcpu *vcpu, struct sys_reg_params *p, const struct sys_reg_desc *r) @@ -715,6 +726,22 @@ static u64 reset_amair_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) return amair; } +static u64 reset_tlbididr_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) +{ + if (!system_supports_tlbid()) + return 0; + + u64 tlbididr = read_sysreg_s(SYS_TLBIDIDR_EL1); + u64 nvis = FIELD_GET(TLBIDIDR_EL1_NVIS_MASK, tlbididr); + u64 nvos = FIELD_GET(TLBIDIDR_EL1_NVOS_MASK, tlbididr); + + tlbididr = FIELD_PREP(TLBIDIDR_EL1_NIS_MASK, nvis); + tlbididr |= FIELD_PREP(TLBIDIDR_EL1_NOS_MASK, nvos); + + vcpu_write_sys_reg(vcpu, tlbididr, TLBIDIDR_EL1); + return tlbididr; +} + static u64 reset_actlr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) { u64 actlr = read_sysreg(actlr_el1); @@ -2616,6 +2643,7 @@ static const struct sys_reg_desc sys_reg_descs[] = { { SYS_DESC(SYS_LORN_EL1), trap_loregion }, { SYS_DESC(SYS_LORC_EL1), trap_loregion }, { SYS_DESC(SYS_MPAMIDR_EL1), workaround_bad_mpam_abi }, + { SYS_DESC(SYS_TLBIDIDR_EL1), access_tlbididr, reset_tlbididr_el1, TLBIDIDR_EL1 }, { SYS_DESC(SYS_LORID_EL1), trap_loregion }, { SYS_DESC(SYS_MPAM1_EL1), workaround_bad_mpam_abi }, -- 2.33.0