diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index 8880ef93a435..9c99d2c53bf2 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -146,6 +146,27 @@ static void prepare_host_vtcr(void) id_aa64mmfr1_el1_sys_val, phys_shift); } +static int prepopulate_host_stage2(void) +{ + struct memblock_region *reg; + u64 addr = 0; + int i, ret; + + for (i = 0; i < hyp_memblock_nr; i++) { + reg = &hyp_memory[i]; + ret = host_stage2_idmap_locked(addr, reg->base - addr, PKVM_HOST_MMIO_PROT, false); + if (ret) + return ret; + ret = host_stage2_idmap_locked(reg->base, reg->size, PKVM_HOST_MEM_PROT, false); + if (ret) + return ret; + addr = reg->base + reg->size; + } + + return host_stage2_idmap_locked(addr, BIT(host_mmu.pgt.ia_bits) - addr, PKVM_HOST_MMIO_PROT, + false); +} + int kvm_host_prepare_stage2(void *pgt_pool_base) { struct kvm_s2_mmu *mmu = &host_mmu.arch.mmu; @@ -172,7 +193,7 @@ int kvm_host_prepare_stage2(void *pgt_pool_base) mmu->pgt = &host_mmu.pgt; atomic64_set(&mmu->vmid.id, 0); - return 0; + return prepopulate_host_stage2(); } static bool guest_stage2_force_pte_cb(u64 addr, u64 end,