]> git.ipfire.org Git - thirdparty/linux.git/blame - arch/alpha/include/asm/cacheflush.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[thirdparty/linux.git] / arch / alpha / include / asm / cacheflush.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef _ALPHA_CACHEFLUSH_H
3#define _ALPHA_CACHEFLUSH_H
4
1da177e4
LT
5#include <linux/mm.h>
6
7/* Caches aren't brain-dead on the Alpha. */
8#define flush_cache_all() do { } while (0)
9#define flush_cache_mm(mm) do { } while (0)
ec8c0446 10#define flush_cache_dup_mm(mm) do { } while (0)
1da177e4
LT
11#define flush_cache_range(vma, start, end) do { } while (0)
12#define flush_cache_page(vma, vmaddr, pfn) do { } while (0)
2d4dc890 13#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
1da177e4
LT
14#define flush_dcache_page(page) do { } while (0)
15#define flush_dcache_mmap_lock(mapping) do { } while (0)
16#define flush_dcache_mmap_unlock(mapping) do { } while (0)
17#define flush_cache_vmap(start, end) do { } while (0)
18#define flush_cache_vunmap(start, end) do { } while (0)
19
20/* Note that the following two definitions are _highly_ dependent
21 on the contexts in which they are used in the kernel. I personally
22 think it is criminal how loosely defined these macros are. */
23
24/* We need to flush the kernel's icache after loading modules. The
25 only other use of this macro is in load_aout_interp which is not
26 used on Alpha.
27
28 Note that this definition should *not* be used for userspace
29 icache flushing. While functional, it is _way_ overkill. The
30 icache is tagged with ASNs and it suffices to allocate a new ASN
31 for the process. */
32#ifndef CONFIG_SMP
33#define flush_icache_range(start, end) imb()
34#else
35#define flush_icache_range(start, end) smp_imb()
36extern void smp_imb(void);
37#endif
38
39/* We need to flush the userspace icache after setting breakpoints in
40 ptrace.
41
42 Instead of indiscriminately using imb, take advantage of the fact
43 that icache entries are tagged with the ASN and load a new mm context. */
44/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
45
46#ifndef CONFIG_SMP
b97f897d
TH
47#include <linux/sched.h>
48
1da177e4
LT
49extern void __load_new_mm_context(struct mm_struct *);
50static inline void
51flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
52 unsigned long addr, int len)
53{
54 if (vma->vm_flags & VM_EXEC) {
55 struct mm_struct *mm = vma->vm_mm;
56 if (current->active_mm == mm)
57 __load_new_mm_context(mm);
58 else
59 mm->context[smp_processor_id()] = 0;
60 }
61}
62#else
63extern void flush_icache_user_range(struct vm_area_struct *vma,
64 struct page *page, unsigned long addr, int len);
65#endif
66
a335b2e1 67/* This is used only in __do_fault and do_swap_page. */
1da177e4
LT
68#define flush_icache_page(vma, page) \
69 flush_icache_user_range((vma), (page), 0, 0)
70
71#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
72do { memcpy(dst, src, len); \
73 flush_icache_user_range(vma, page, vaddr, len); \
74} while (0)
75#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
76 memcpy(dst, src, len)
77
78#endif /* _ALPHA_CACHEFLUSH_H */