blob: 9945ff483eaf7e469638a9e1477960230977d8e9 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002#ifndef _ALPHA_CACHEFLUSH_H
3#define _ALPHA_CACHEFLUSH_H
4
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <linux/mm.h>
6
Linus Torvalds1da177e2005-04-16 15:20:36 -07007/* Note that the following two definitions are _highly_ dependent
8 on the contexts in which they are used in the kernel. I personally
9 think it is criminal how loosely defined these macros are. */
10
11/* We need to flush the kernel's icache after loading modules. The
12 only other use of this macro is in load_aout_interp which is not
13 used on Alpha.
14
15 Note that this definition should *not* be used for userspace
16 icache flushing. While functional, it is _way_ overkill. The
17 icache is tagged with ASNs and it suffices to allocate a new ASN
18 for the process. */
19#ifndef CONFIG_SMP
20#define flush_icache_range(start, end) imb()
21#else
22#define flush_icache_range(start, end) smp_imb()
23extern void smp_imb(void);
24#endif
25
26/* We need to flush the userspace icache after setting breakpoints in
27 ptrace.
28
29 Instead of indiscriminately using imb, take advantage of the fact
30 that icache entries are tagged with the ASN and load a new mm context. */
31/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
32
33#ifndef CONFIG_SMP
Tejun Heob97f8972010-09-14 09:00:22 -040034#include <linux/sched.h>
35
Linus Torvalds1da177e2005-04-16 15:20:36 -070036extern void __load_new_mm_context(struct mm_struct *);
37static inline void
Christoph Hellwig885f7f82020-06-07 21:42:22 -070038flush_icache_user_page(struct vm_area_struct *vma, struct page *page,
Linus Torvalds1da177e2005-04-16 15:20:36 -070039 unsigned long addr, int len)
40{
41 if (vma->vm_flags & VM_EXEC) {
42 struct mm_struct *mm = vma->vm_mm;
43 if (current->active_mm == mm)
44 __load_new_mm_context(mm);
45 else
46 mm->context[smp_processor_id()] = 0;
47 }
48}
Christoph Hellwig885f7f82020-06-07 21:42:22 -070049#define flush_icache_user_page flush_icache_user_page
Christoph Hellwig43c74ca32020-06-07 21:41:48 -070050#else /* CONFIG_SMP */
Christoph Hellwig885f7f82020-06-07 21:42:22 -070051extern void flush_icache_user_page(struct vm_area_struct *vma,
Linus Torvalds1da177e2005-04-16 15:20:36 -070052 struct page *page, unsigned long addr, int len);
Christoph Hellwig885f7f82020-06-07 21:42:22 -070053#define flush_icache_user_page flush_icache_user_page
Christoph Hellwig43c74ca32020-06-07 21:41:48 -070054#endif /* CONFIG_SMP */
Linus Torvalds1da177e2005-04-16 15:20:36 -070055
Ryota Ozakia335b2e2011-02-10 13:56:28 +090056/* This is used only in __do_fault and do_swap_page. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070057#define flush_icache_page(vma, page) \
Christoph Hellwig885f7f82020-06-07 21:42:22 -070058 flush_icache_user_page((vma), (page), 0, 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Christoph Hellwig43c74ca32020-06-07 21:41:48 -070060#include <asm-generic/cacheflush.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
62#endif /* _ALPHA_CACHEFLUSH_H */