Linux Audio

Check our new training course

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