icache inval for guests
diff --git a/arch/arm64/kvm/hyp/nvhe/cache.S b/arch/arm64/kvm/hyp/nvhe/cache.S index 958734f..4c447f2 100644 --- a/arch/arm64/kvm/hyp/nvhe/cache.S +++ b/arch/arm64/kvm/hyp/nvhe/cache.S
@@ -11,3 +11,13 @@ dcache_by_line_op civac, sy, x0, x1, x2, x3 ret SYM_FUNC_END_PI(dcache_clean_inval_poc) + +SYM_FUNC_START_PI(icache_inval_pou) +alternative_if ARM64_HAS_CACHE_DIC + isb + ret +alternative_else_nop_endif + + invalidate_icache_by_line x0, x1, x2, x3 + ret +SYM_FUNC_END_PI(icache_inval_pou)
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index e4dd1c8..e1fdaa4 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -240,6 +240,12 @@ static void clean_dcache_guest_page(void *va, size_t size) hyp_fixmap_unmap(); } +static void invalidate_icache_guest_page(void *va, size_t size) +{ + __invalidate_icache_guest_page(hyp_fixmap_map(__hyp_pa(va)), size); + hyp_fixmap_unmap(); +} + int kvm_guest_prepare_stage2(struct kvm_shadow_vm *vm, void *pgd) { struct kvm_s2_mmu *mmu = &vm->arch.mmu; @@ -267,6 +273,7 @@ int kvm_guest_prepare_stage2(struct kvm_shadow_vm *vm, void *pgd) .get_page = guest_s2_get_page, .put_page = guest_s2_put_page, .dcache_clean_inval_poc = clean_dcache_guest_page, + .icache_inval_pou = invalidate_icache_guest_page, }; __guest_lock(vm);