Path: blob/master/arch/sparc/include/asm/cacheflush_64.h
26481 views
/* SPDX-License-Identifier: GPL-2.0 */1#ifndef _SPARC64_CACHEFLUSH_H2#define _SPARC64_CACHEFLUSH_H34#include <asm/page.h>56#ifndef __ASSEMBLY__78#include <linux/mm.h>910/* Cache flush operations. */11#define flushw_all() __asm__ __volatile__("flushw")1213void __flushw_user(void);14#define flushw_user() __flushw_user()1516#define flush_user_windows flushw_user17#define flush_register_windows flushw_all1819/* These are the same regardless of whether this is an SMP kernel or not. */20#define flush_cache_mm(__mm) \21do { if ((__mm) == current->mm) flushw_user(); } while(0)22#define flush_cache_dup_mm(mm) flush_cache_mm(mm)23#define flush_cache_range(vma, start, end) \24flush_cache_mm((vma)->vm_mm)25#define flush_cache_page(vma, page, pfn) \26flush_cache_mm((vma)->vm_mm)2728/*29* On spitfire, the icache doesn't snoop local stores and we don't30* use block commit stores (which invalidate icache lines) during31* module load, so we need this.32*/33void flush_icache_range(unsigned long start, unsigned long end);34void __flush_icache_page(unsigned long);3536void __flush_dcache_page(void *addr, int flush_icache);37void flush_dcache_folio_impl(struct folio *folio);38#ifdef CONFIG_SMP39void smp_flush_dcache_folio_impl(struct folio *folio, int cpu);40void flush_dcache_folio_all(struct mm_struct *mm, struct folio *folio);41#else42#define smp_flush_dcache_folio_impl(folio, cpu) flush_dcache_folio_impl(folio)43#define flush_dcache_folio_all(mm, folio) flush_dcache_folio_impl(folio)44#endif4546void __flush_dcache_range(unsigned long start, unsigned long end);47#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 148void flush_dcache_folio(struct folio *folio);49#define flush_dcache_folio flush_dcache_folio50static inline void flush_dcache_page(struct page *page)51{52flush_dcache_folio(page_folio(page));53}5455void flush_ptrace_access(struct vm_area_struct *, struct page *,56unsigned long uaddr, void *kaddr,57unsigned long len, int write);5859#define copy_to_user_page(vma, page, vaddr, dst, src, len) \60do { \61flush_cache_page(vma, vaddr, page_to_pfn(page)); \62memcpy(dst, src, len); \63flush_ptrace_access(vma, page, vaddr, src, len, 0); \64} while (0)6566#define copy_from_user_page(vma, page, vaddr, dst, src, len) \67do { \68flush_cache_page(vma, vaddr, page_to_pfn(page)); \69memcpy(dst, src, len); \70flush_ptrace_access(vma, page, vaddr, dst, len, 1); \71} while (0)7273#define flush_dcache_mmap_lock(mapping) do { } while (0)74#define flush_dcache_mmap_unlock(mapping) do { } while (0)7576#define flush_cache_vmap(start, end) do { } while (0)77#define flush_cache_vmap_early(start, end) do { } while (0)78#define flush_cache_vunmap(start, end) do { } while (0)7980#endif /* !__ASSEMBLY__ */8182#endif /* _SPARC64_CACHEFLUSH_H */838485