1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
4 #include <linux/cache.h>
5 #include <linux/highmem.h>
9 void flush_icache_page(struct vm_area_struct
*vma
, struct page
*page
)
13 start
= (unsigned long) kmap_atomic(page
);
15 cache_wbinv_range(start
, start
+ PAGE_SIZE
);
17 kunmap_atomic((void *)start
);
20 void flush_icache_user_range(struct vm_area_struct
*vma
, struct page
*page
,
21 unsigned long vaddr
, int len
)
25 kaddr
= (unsigned long) kmap_atomic(page
) + (vaddr
& ~PAGE_MASK
);
27 cache_wbinv_range(kaddr
, kaddr
+ len
);
29 kunmap_atomic((void *)kaddr
);
32 void update_mmu_cache(struct vm_area_struct
*vma
, unsigned long address
,
35 unsigned long addr
, pfn
;
39 if (!(vma
->vm_flags
& VM_EXEC
))
43 if (unlikely(!pfn_valid(pfn
)))
46 page
= pfn_to_page(pfn
);
47 if (page
== ZERO_PAGE(0))
50 va
= page_address(page
);
51 addr
= (unsigned long) va
;
53 if (va
== NULL
&& PageHighMem(page
))
54 addr
= (unsigned long) kmap_atomic(page
);
56 cache_wbinv_range(addr
, addr
+ PAGE_SIZE
);
58 if (va
== NULL
&& PageHighMem(page
))
59 kunmap_atomic((void *) addr
);