Blame view

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