Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

m68k: merge the mmu and non-mmu versions of mmu_context.h

Simple merge of the mmu and non-mmu versions of mmu_context.h

Signed-off-by: Greg Ungerer <gerg@uclinux.org>

+173 -190
+173 -3
arch/m68k/include/asm/mmu_context.h
··· 1 - #ifdef __uClinux__ 2 - #include "mmu_context_no.h" 1 + #ifndef __M68K_MMU_CONTEXT_H 2 + #define __M68K_MMU_CONTEXT_H 3 + 4 + #include <asm-generic/mm_hooks.h> 5 + 6 + static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) 7 + { 8 + } 9 + 10 + #ifdef CONFIG_MMU 11 + #ifndef CONFIG_SUN3 12 + 13 + #include <asm/setup.h> 14 + #include <asm/page.h> 15 + #include <asm/pgalloc.h> 16 + 17 + static inline int init_new_context(struct task_struct *tsk, 18 + struct mm_struct *mm) 19 + { 20 + mm->context = virt_to_phys(mm->pgd); 21 + return 0; 22 + } 23 + 24 + #define destroy_context(mm) do { } while(0) 25 + 26 + static inline void switch_mm_0230(struct mm_struct *mm) 27 + { 28 + unsigned long crp[2] = { 29 + 0x80000000 | _PAGE_TABLE, mm->context 30 + }; 31 + unsigned long tmp; 32 + 33 + asm volatile (".chip 68030"); 34 + 35 + /* flush MC68030/MC68020 caches (they are virtually addressed) */ 36 + asm volatile ( 37 + "movec %%cacr,%0;" 38 + "orw %1,%0; " 39 + "movec %0,%%cacr" 40 + : "=d" (tmp) : "di" (FLUSH_I_AND_D)); 41 + 42 + /* Switch the root pointer. For a 030-only kernel, 43 + * avoid flushing the whole ATC, we only need to 44 + * flush the user entries. The 68851 does this by 45 + * itself. Avoid a runtime check here. 46 + */ 47 + asm volatile ( 48 + #ifdef CPU_M68030_ONLY 49 + "pmovefd %0,%%crp; " 50 + "pflush #0,#4" 3 51 #else 4 - #include "mmu_context_mm.h" 52 + "pmove %0,%%crp" 5 53 #endif 54 + : : "m" (crp[0])); 55 + 56 + asm volatile (".chip 68k"); 57 + } 58 + 59 + static inline void switch_mm_0460(struct mm_struct *mm) 60 + { 61 + asm volatile (".chip 68040"); 62 + 63 + /* flush address translation cache (user entries) */ 64 + asm volatile ("pflushan"); 65 + 66 + /* switch the root pointer */ 67 + asm volatile ("movec %0,%%urp" : : "r" (mm->context)); 68 + 69 + if (CPU_IS_060) { 70 + unsigned long tmp; 71 + 72 + /* clear user entries in the branch cache */ 73 + asm volatile ( 74 + "movec %%cacr,%0; " 75 + "orl %1,%0; " 76 + "movec %0,%%cacr" 77 + : "=d" (tmp): "di" (0x00200000)); 78 + } 79 + 80 + asm volatile (".chip 68k"); 81 + } 82 + 83 + static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 84 + { 85 + if (prev != next) { 86 + if (CPU_IS_020_OR_030) 87 + switch_mm_0230(next); 88 + else 89 + switch_mm_0460(next); 90 + } 91 + } 92 + 93 + #define deactivate_mm(tsk,mm) do { } while (0) 94 + 95 + static inline void activate_mm(struct mm_struct *prev_mm, 96 + struct mm_struct *next_mm) 97 + { 98 + next_mm->context = virt_to_phys(next_mm->pgd); 99 + 100 + if (CPU_IS_020_OR_030) 101 + switch_mm_0230(next_mm); 102 + else 103 + switch_mm_0460(next_mm); 104 + } 105 + 106 + #else /* CONFIG_SUN3 */ 107 + #include <asm/sun3mmu.h> 108 + #include <linux/sched.h> 109 + 110 + extern unsigned long get_free_context(struct mm_struct *mm); 111 + extern void clear_context(unsigned long context); 112 + 113 + /* set the context for a new task to unmapped */ 114 + static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) 115 + { 116 + mm->context = SUN3_INVALID_CONTEXT; 117 + return 0; 118 + } 119 + 120 + /* find the context given to this process, and if it hasn't already 121 + got one, go get one for it. */ 122 + static inline void get_mmu_context(struct mm_struct *mm) 123 + { 124 + if(mm->context == SUN3_INVALID_CONTEXT) 125 + mm->context = get_free_context(mm); 126 + } 127 + 128 + /* flush context if allocated... */ 129 + static inline void destroy_context(struct mm_struct *mm) 130 + { 131 + if(mm->context != SUN3_INVALID_CONTEXT) 132 + clear_context(mm->context); 133 + } 134 + 135 + static inline void activate_context(struct mm_struct *mm) 136 + { 137 + get_mmu_context(mm); 138 + sun3_put_context(mm->context); 139 + } 140 + 141 + static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 142 + { 143 + activate_context(tsk->mm); 144 + } 145 + 146 + #define deactivate_mm(tsk,mm) do { } while (0) 147 + 148 + static inline void activate_mm(struct mm_struct *prev_mm, 149 + struct mm_struct *next_mm) 150 + { 151 + activate_context(next_mm); 152 + } 153 + 154 + #endif 155 + #else /* !CONFIG_MMU */ 156 + 157 + static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) 158 + { 159 + return 0; 160 + } 161 + 162 + 163 + static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 164 + { 165 + } 166 + 167 + #define destroy_context(mm) do { } while (0) 168 + #define deactivate_mm(tsk,mm) do { } while (0) 169 + 170 + static inline void activate_mm(struct mm_struct *prev_mm, struct mm_struct *next_mm) 171 + { 172 + } 173 + 174 + #endif /* CONFIG_MMU */ 175 + #endif /* __M68K_MMU_CONTEXT_H */
-154
arch/m68k/include/asm/mmu_context_mm.h
··· 1 - #ifndef __M68K_MMU_CONTEXT_H 2 - #define __M68K_MMU_CONTEXT_H 3 - 4 - #include <asm-generic/mm_hooks.h> 5 - 6 - static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) 7 - { 8 - } 9 - 10 - #ifndef CONFIG_SUN3 11 - 12 - #include <asm/setup.h> 13 - #include <asm/page.h> 14 - #include <asm/pgalloc.h> 15 - 16 - static inline int init_new_context(struct task_struct *tsk, 17 - struct mm_struct *mm) 18 - { 19 - mm->context = virt_to_phys(mm->pgd); 20 - return 0; 21 - } 22 - 23 - #define destroy_context(mm) do { } while(0) 24 - 25 - static inline void switch_mm_0230(struct mm_struct *mm) 26 - { 27 - unsigned long crp[2] = { 28 - 0x80000000 | _PAGE_TABLE, mm->context 29 - }; 30 - unsigned long tmp; 31 - 32 - asm volatile (".chip 68030"); 33 - 34 - /* flush MC68030/MC68020 caches (they are virtually addressed) */ 35 - asm volatile ( 36 - "movec %%cacr,%0;" 37 - "orw %1,%0; " 38 - "movec %0,%%cacr" 39 - : "=d" (tmp) : "di" (FLUSH_I_AND_D)); 40 - 41 - /* Switch the root pointer. For a 030-only kernel, 42 - * avoid flushing the whole ATC, we only need to 43 - * flush the user entries. The 68851 does this by 44 - * itself. Avoid a runtime check here. 45 - */ 46 - asm volatile ( 47 - #ifdef CPU_M68030_ONLY 48 - "pmovefd %0,%%crp; " 49 - "pflush #0,#4" 50 - #else 51 - "pmove %0,%%crp" 52 - #endif 53 - : : "m" (crp[0])); 54 - 55 - asm volatile (".chip 68k"); 56 - } 57 - 58 - static inline void switch_mm_0460(struct mm_struct *mm) 59 - { 60 - asm volatile (".chip 68040"); 61 - 62 - /* flush address translation cache (user entries) */ 63 - asm volatile ("pflushan"); 64 - 65 - /* switch the root pointer */ 66 - asm volatile ("movec %0,%%urp" : : "r" (mm->context)); 67 - 68 - if (CPU_IS_060) { 69 - unsigned long tmp; 70 - 71 - /* clear user entries in the branch cache */ 72 - asm volatile ( 73 - "movec %%cacr,%0; " 74 - "orl %1,%0; " 75 - "movec %0,%%cacr" 76 - : "=d" (tmp): "di" (0x00200000)); 77 - } 78 - 79 - asm volatile (".chip 68k"); 80 - } 81 - 82 - static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 83 - { 84 - if (prev != next) { 85 - if (CPU_IS_020_OR_030) 86 - switch_mm_0230(next); 87 - else 88 - switch_mm_0460(next); 89 - } 90 - } 91 - 92 - #define deactivate_mm(tsk,mm) do { } while (0) 93 - 94 - static inline void activate_mm(struct mm_struct *prev_mm, 95 - struct mm_struct *next_mm) 96 - { 97 - next_mm->context = virt_to_phys(next_mm->pgd); 98 - 99 - if (CPU_IS_020_OR_030) 100 - switch_mm_0230(next_mm); 101 - else 102 - switch_mm_0460(next_mm); 103 - } 104 - 105 - #else /* CONFIG_SUN3 */ 106 - #include <asm/sun3mmu.h> 107 - #include <linux/sched.h> 108 - 109 - extern unsigned long get_free_context(struct mm_struct *mm); 110 - extern void clear_context(unsigned long context); 111 - 112 - /* set the context for a new task to unmapped */ 113 - static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) 114 - { 115 - mm->context = SUN3_INVALID_CONTEXT; 116 - return 0; 117 - } 118 - 119 - /* find the context given to this process, and if it hasn't already 120 - got one, go get one for it. */ 121 - static inline void get_mmu_context(struct mm_struct *mm) 122 - { 123 - if(mm->context == SUN3_INVALID_CONTEXT) 124 - mm->context = get_free_context(mm); 125 - } 126 - 127 - /* flush context if allocated... */ 128 - static inline void destroy_context(struct mm_struct *mm) 129 - { 130 - if(mm->context != SUN3_INVALID_CONTEXT) 131 - clear_context(mm->context); 132 - } 133 - 134 - static inline void activate_context(struct mm_struct *mm) 135 - { 136 - get_mmu_context(mm); 137 - sun3_put_context(mm->context); 138 - } 139 - 140 - static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 141 - { 142 - activate_context(tsk->mm); 143 - } 144 - 145 - #define deactivate_mm(tsk,mm) do { } while (0) 146 - 147 - static inline void activate_mm(struct mm_struct *prev_mm, 148 - struct mm_struct *next_mm) 149 - { 150 - activate_context(next_mm); 151 - } 152 - 153 - #endif 154 - #endif
-33
arch/m68k/include/asm/mmu_context_no.h
··· 1 - #ifndef __M68KNOMMU_MMU_CONTEXT_H 2 - #define __M68KNOMMU_MMU_CONTEXT_H 3 - 4 - #include <asm/setup.h> 5 - #include <asm/page.h> 6 - #include <asm/pgalloc.h> 7 - #include <asm-generic/mm_hooks.h> 8 - 9 - static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) 10 - { 11 - } 12 - 13 - static inline int 14 - init_new_context(struct task_struct *tsk, struct mm_struct *mm) 15 - { 16 - // mm->context = virt_to_phys(mm->pgd); 17 - return(0); 18 - } 19 - 20 - #define destroy_context(mm) do { } while(0) 21 - 22 - static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) 23 - { 24 - } 25 - 26 - #define deactivate_mm(tsk,mm) do { } while (0) 27 - 28 - static inline void activate_mm(struct mm_struct *prev_mm, 29 - struct mm_struct *next_mm) 30 - { 31 - } 32 - 33 - #endif