static void clean_dcache_guest_page(void *va, size_t size)
 {
-       __clean_dcache_guest_page(hyp_fixmap_map(__hyp_pa(va)), size);
-       hyp_fixmap_unmap();
+       size += va - PTR_ALIGN_DOWN(va, PAGE_SIZE);
+       va = PTR_ALIGN_DOWN(va, PAGE_SIZE);
+       size = PAGE_ALIGN(size);
+
+       while (size) {
+               __clean_dcache_guest_page(hyp_fixmap_map(__hyp_pa(va)),
+                                         PAGE_SIZE);
+               hyp_fixmap_unmap();
+               va += PAGE_SIZE;
+               size -= PAGE_SIZE;
+       }
 }
 
 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();
+       size += va - PTR_ALIGN_DOWN(va, PAGE_SIZE);
+       va = PTR_ALIGN_DOWN(va, PAGE_SIZE);
+       size = PAGE_ALIGN(size);
+
+       while (size) {
+               __invalidate_icache_guest_page(hyp_fixmap_map(__hyp_pa(va)),
+                                              PAGE_SIZE);
+               hyp_fixmap_unmap();
+               va += PAGE_SIZE;
+               size -= PAGE_SIZE;
+       }
 }
 
 int kvm_guest_prepare_stage2(struct pkvm_hyp_vm *vm, void *pgd)