diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-init.S b/arch/arm64/kvm/hyp/nvhe/hyp-init.S index a6d67c2bb5ae..e7b375ec6460 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-init.S +++ b/arch/arm64/kvm/hyp/nvhe/hyp-init.S @@ -95,6 +95,9 @@ SYM_CODE_START_LOCAL(___kvm_hyp_init) ldr x1, [x0, #NVHE_INIT_HCR_EL2] msr hcr_el2, x1 + ldr x1, [x0, #NVHE_INIT_HFGWTR_EL2] + msr_s SYS_HFGWTR_EL2, x1 + ldr x1, [x0, #NVHE_INIT_VTTBR] msr vttbr_el2, x1 diff --git a/arch/arm64/kvm/hyp/nvhe/modules.c b/arch/arm64/kvm/hyp/nvhe/modules.c index 257a43a0b2f7..138e0d68e95a 100644 --- a/arch/arm64/kvm/hyp/nvhe/modules.c +++ b/arch/arm64/kvm/hyp/nvhe/modules.c @@ -29,9 +29,12 @@ static void __update_hcr_el2(unsigned long set_mask, unsigned long clear_mask) static void __update_hfgwtr_el2(unsigned long set_mask, unsigned long clear_mask) { - /* TODO (b/282917063): need to check whether FEAT_FGT is supported - * before we can access HFGWTR_EL2. */ - return; + struct kvm_nvhe_init_params *params = this_cpu_ptr(&kvm_init_params); + + params->hfgwtr_el2 |= set_mask; + params->hfgwtr_el2 &= ~clear_mask; + __kvm_flush_dcache_to_poc(params, sizeof(*params)); + write_sysreg_s(params->hfgwtr_el2, SYS_HFGWTR_EL2); } static atomic_t early_lm_pages;