diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-28 19:20:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-28 19:20:49 -0400 |
commit | 27d68a36c4f1ca2fc6be82620843493462c08c51 (patch) | |
tree | a06b451e19c25a77595c918ca81bbb30f0ec9ebf | |
parent | 76a22271fd14e3fe7660f8646db12f0780fa4fd2 (diff) | |
parent | 583e7f5d36547f0d84caf71d43b71f0530a47766 (diff) |
Merge branch 'nommu' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'nommu' of master.kernel.org:/home/rmk/linux-2.6-arm:
[ARM] nommu: backtrace code must not reference a discarded section
[ARM] nommu: Initial uCLinux support for MMU-based CPUs
[ARM] nommu: prevent Xscale-based machines being selected
[ARM] nommu: export flush_dcache_page()
[ARM] nommu: remove fault-armv, mmap and mm-armv files from nommu build
[ARM] Remove TABLE_SIZE, and several unused function prototypes
[ARM] nommu: Provide a simple flush_dcache_page implementation
[ARM] nommu: add arch/arm/Kconfig-nommu to Kconfig files
[ARM] nommu: add stubs for ioremap and friends
[ARM] nommu: avoid selecting TLB and CPU specific copy code
[ARM] nommu: uaccess tweaks
[ARM] nommu: adjust headers for !MMU ARM systems
[ARM] nommu: we need the TLS register emulation for nommu mode
37 files changed, 675 insertions, 172 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 3d1a3fb7d5fc..f123c7c9fc98 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -188,23 +188,27 @@ config ARCH_IMX | |||
188 | 188 | ||
189 | config ARCH_IOP3XX | 189 | config ARCH_IOP3XX |
190 | bool "IOP3xx-based" | 190 | bool "IOP3xx-based" |
191 | depends on MMU | ||
191 | select PCI | 192 | select PCI |
192 | help | 193 | help |
193 | Support for Intel's IOP3XX (XScale) family of processors. | 194 | Support for Intel's IOP3XX (XScale) family of processors. |
194 | 195 | ||
195 | config ARCH_IXP4XX | 196 | config ARCH_IXP4XX |
196 | bool "IXP4xx-based" | 197 | bool "IXP4xx-based" |
198 | depends on MMU | ||
197 | help | 199 | help |
198 | Support for Intel's IXP4XX (XScale) family of processors. | 200 | Support for Intel's IXP4XX (XScale) family of processors. |
199 | 201 | ||
200 | config ARCH_IXP2000 | 202 | config ARCH_IXP2000 |
201 | bool "IXP2400/2800-based" | 203 | bool "IXP2400/2800-based" |
204 | depends on MMU | ||
202 | select PCI | 205 | select PCI |
203 | help | 206 | help |
204 | Support for Intel's IXP2400/2800 (XScale) family of processors. | 207 | Support for Intel's IXP2400/2800 (XScale) family of processors. |
205 | 208 | ||
206 | config ARCH_IXP23XX | 209 | config ARCH_IXP23XX |
207 | bool "IXP23XX-based" | 210 | bool "IXP23XX-based" |
211 | depends on MMU | ||
208 | select PCI | 212 | select PCI |
209 | help | 213 | help |
210 | Support for Intel's IXP23xx (XScale) family of processors. | 214 | Support for Intel's IXP23xx (XScale) family of processors. |
@@ -229,6 +233,7 @@ config ARCH_PNX4008 | |||
229 | 233 | ||
230 | config ARCH_PXA | 234 | config ARCH_PXA |
231 | bool "PXA2xx-based" | 235 | bool "PXA2xx-based" |
236 | depends on MMU | ||
232 | select ARCH_MTD_XIP | 237 | select ARCH_MTD_XIP |
233 | help | 238 | help |
234 | Support for Intel's PXA2XX processor line. | 239 | Support for Intel's PXA2XX processor line. |
@@ -339,6 +344,10 @@ config XSCALE_PMU | |||
339 | depends on CPU_XSCALE && !XSCALE_PMU_TIMER | 344 | depends on CPU_XSCALE && !XSCALE_PMU_TIMER |
340 | default y | 345 | default y |
341 | 346 | ||
347 | if !MMU | ||
348 | source "arch/arm/Kconfig-nommu" | ||
349 | endif | ||
350 | |||
342 | endmenu | 351 | endmenu |
343 | 352 | ||
344 | source "arch/arm/common/Kconfig" | 353 | source "arch/arm/common/Kconfig" |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index f8bb7abd3e9b..da69e660574b 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -109,11 +109,13 @@ EXPORT_SYMBOL(memchr); | |||
109 | EXPORT_SYMBOL(__memzero); | 109 | EXPORT_SYMBOL(__memzero); |
110 | 110 | ||
111 | /* user mem (segment) */ | 111 | /* user mem (segment) */ |
112 | EXPORT_SYMBOL(__strnlen_user); | ||
113 | EXPORT_SYMBOL(__strncpy_from_user); | ||
114 | |||
115 | #ifdef CONFIG_MMU | ||
112 | EXPORT_SYMBOL(__copy_from_user); | 116 | EXPORT_SYMBOL(__copy_from_user); |
113 | EXPORT_SYMBOL(__copy_to_user); | 117 | EXPORT_SYMBOL(__copy_to_user); |
114 | EXPORT_SYMBOL(__clear_user); | 118 | EXPORT_SYMBOL(__clear_user); |
115 | EXPORT_SYMBOL(__strnlen_user); | ||
116 | EXPORT_SYMBOL(__strncpy_from_user); | ||
117 | 119 | ||
118 | EXPORT_SYMBOL(__get_user_1); | 120 | EXPORT_SYMBOL(__get_user_1); |
119 | EXPORT_SYMBOL(__get_user_2); | 121 | EXPORT_SYMBOL(__get_user_2); |
@@ -123,6 +125,7 @@ EXPORT_SYMBOL(__put_user_1); | |||
123 | EXPORT_SYMBOL(__put_user_2); | 125 | EXPORT_SYMBOL(__put_user_2); |
124 | EXPORT_SYMBOL(__put_user_4); | 126 | EXPORT_SYMBOL(__put_user_4); |
125 | EXPORT_SYMBOL(__put_user_8); | 127 | EXPORT_SYMBOL(__put_user_8); |
128 | #endif | ||
126 | 129 | ||
127 | /* crypto hash */ | 130 | /* crypto hash */ |
128 | EXPORT_SYMBOL(sha_transform); | 131 | EXPORT_SYMBOL(sha_transform); |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 2b254e88595c..2df9688a7028 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -80,6 +80,10 @@ SECTIONS | |||
80 | *(.exit.text) | 80 | *(.exit.text) |
81 | *(.exit.data) | 81 | *(.exit.data) |
82 | *(.exitcall.exit) | 82 | *(.exitcall.exit) |
83 | #ifndef CONFIG_MMU | ||
84 | *(.fixup) | ||
85 | *(__ex_table) | ||
86 | #endif | ||
83 | } | 87 | } |
84 | 88 | ||
85 | .text : { /* Real text segment */ | 89 | .text : { /* Real text segment */ |
@@ -87,7 +91,9 @@ SECTIONS | |||
87 | *(.text) | 91 | *(.text) |
88 | SCHED_TEXT | 92 | SCHED_TEXT |
89 | LOCK_TEXT | 93 | LOCK_TEXT |
94 | #ifdef CONFIG_MMU | ||
90 | *(.fixup) | 95 | *(.fixup) |
96 | #endif | ||
91 | *(.gnu.warning) | 97 | *(.gnu.warning) |
92 | *(.rodata) | 98 | *(.rodata) |
93 | *(.rodata.*) | 99 | *(.rodata.*) |
@@ -142,7 +148,9 @@ SECTIONS | |||
142 | */ | 148 | */ |
143 | . = ALIGN(32); | 149 | . = ALIGN(32); |
144 | __start___ex_table = .; | 150 | __start___ex_table = .; |
151 | #ifdef CONFIG_MMU | ||
145 | *(__ex_table) | 152 | *(__ex_table) |
153 | #endif | ||
146 | __stop___ex_table = .; | 154 | __stop___ex_table = .; |
147 | 155 | ||
148 | /* | 156 | /* |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 7b726b627ea5..30351cd4560d 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -6,28 +6,31 @@ | |||
6 | 6 | ||
7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | 7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ |
8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ | 8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ |
9 | copy_page.o delay.o findbit.o memchr.o memcpy.o \ | 9 | delay.o findbit.o memchr.o memcpy.o \ |
10 | memmove.o memset.o memzero.o setbit.o \ | 10 | memmove.o memset.o memzero.o setbit.o \ |
11 | strncpy_from_user.o strnlen_user.o \ | 11 | strncpy_from_user.o strnlen_user.o \ |
12 | strchr.o strrchr.o \ | 12 | strchr.o strrchr.o \ |
13 | testchangebit.o testclearbit.o testsetbit.o \ | 13 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | getuser.o putuser.o clear_user.o \ | ||
15 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
16 | ucmpdi2.o lib1funcs.o div64.o sha1.o \ | 15 | ucmpdi2.o lib1funcs.o div64.o sha1.o \ |
17 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o | 16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o |
18 | 17 | ||
18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o | ||
19 | |||
19 | # the code in uaccess.S is not preemption safe and | 20 | # the code in uaccess.S is not preemption safe and |
20 | # probably faster on ARMv3 only | 21 | # probably faster on ARMv3 only |
21 | ifeq ($(CONFIG_PREEMPT),y) | 22 | ifeq ($(CONFIG_PREEMPT),y) |
22 | lib-y += copy_from_user.o copy_to_user.o | 23 | mmu-y += copy_from_user.o copy_to_user.o |
23 | else | 24 | else |
24 | ifneq ($(CONFIG_CPU_32v3),y) | 25 | ifneq ($(CONFIG_CPU_32v3),y) |
25 | lib-y += copy_from_user.o copy_to_user.o | 26 | mmu-y += copy_from_user.o copy_to_user.o |
26 | else | 27 | else |
27 | lib-y += uaccess.o | 28 | mmu-y += uaccess.o |
28 | endif | 29 | endif |
29 | endif | 30 | endif |
30 | 31 | ||
32 | lib-$(CONFIG_MMU) += $(mmu-y) | ||
33 | |||
31 | ifeq ($(CONFIG_CPU_32v3),y) | 34 | ifeq ($(CONFIG_CPU_32v3),y) |
32 | lib-y += io-readsw-armv3.o io-writesw-armv3.o | 35 | lib-y += io-readsw-armv3.o io-writesw-armv3.o |
33 | else | 36 | else |
diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S index 058b80d72aa1..91f993f2e9db 100644 --- a/arch/arm/lib/backtrace.S +++ b/arch/arm/lib/backtrace.S | |||
@@ -97,16 +97,13 @@ ENTRY(c_backtrace) | |||
97 | b 1007f | 97 | b 1007f |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * Fixup for LDMDB | 100 | * Fixup for LDMDB. Note that this must not be in the fixup section. |
101 | */ | 101 | */ |
102 | .section .fixup,"ax" | ||
103 | .align 0 | ||
104 | 1007: ldr r0, =.Lbad | 102 | 1007: ldr r0, =.Lbad |
105 | mov r1, frame | 103 | mov r1, frame |
106 | bl printk | 104 | bl printk |
107 | ldmfd sp!, {r4 - r8, pc} | 105 | ldmfd sp!, {r4 - r8, pc} |
108 | .ltorg | 106 | .ltorg |
109 | .previous | ||
110 | 107 | ||
111 | .section __ex_table,"a" | 108 | .section __ex_table,"a" |
112 | .align 3 | 109 | .align 3 |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index ecf5e232a6fc..c4bca753165b 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -15,8 +15,8 @@ config CPU_ARM610 | |||
15 | select CPU_32v3 | 15 | select CPU_32v3 |
16 | select CPU_CACHE_V3 | 16 | select CPU_CACHE_V3 |
17 | select CPU_CACHE_VIVT | 17 | select CPU_CACHE_VIVT |
18 | select CPU_COPY_V3 | 18 | select CPU_COPY_V3 if MMU |
19 | select CPU_TLB_V3 | 19 | select CPU_TLB_V3 if MMU |
20 | help | 20 | help |
21 | The ARM610 is the successor to the ARM3 processor | 21 | The ARM610 is the successor to the ARM3 processor |
22 | and was produced by VLSI Technology Inc. | 22 | and was produced by VLSI Technology Inc. |
@@ -31,8 +31,8 @@ config CPU_ARM710 | |||
31 | select CPU_32v3 | 31 | select CPU_32v3 |
32 | select CPU_CACHE_V3 | 32 | select CPU_CACHE_V3 |
33 | select CPU_CACHE_VIVT | 33 | select CPU_CACHE_VIVT |
34 | select CPU_COPY_V3 | 34 | select CPU_COPY_V3 if MMU |
35 | select CPU_TLB_V3 | 35 | select CPU_TLB_V3 if MMU |
36 | help | 36 | help |
37 | A 32-bit RISC microprocessor based on the ARM7 processor core | 37 | A 32-bit RISC microprocessor based on the ARM7 processor core |
38 | designed by Advanced RISC Machines Ltd. The ARM710 is the | 38 | designed by Advanced RISC Machines Ltd. The ARM710 is the |
@@ -50,8 +50,8 @@ config CPU_ARM720T | |||
50 | select CPU_ABRT_LV4T | 50 | select CPU_ABRT_LV4T |
51 | select CPU_CACHE_V4 | 51 | select CPU_CACHE_V4 |
52 | select CPU_CACHE_VIVT | 52 | select CPU_CACHE_VIVT |
53 | select CPU_COPY_V4WT | 53 | select CPU_COPY_V4WT if MMU |
54 | select CPU_TLB_V4WT | 54 | select CPU_TLB_V4WT if MMU |
55 | help | 55 | help |
56 | A 32-bit RISC processor with 8kByte Cache, Write Buffer and | 56 | A 32-bit RISC processor with 8kByte Cache, Write Buffer and |
57 | MMU built around an ARM7TDMI core. | 57 | MMU built around an ARM7TDMI core. |
@@ -68,8 +68,8 @@ config CPU_ARM920T | |||
68 | select CPU_ABRT_EV4T | 68 | select CPU_ABRT_EV4T |
69 | select CPU_CACHE_V4WT | 69 | select CPU_CACHE_V4WT |
70 | select CPU_CACHE_VIVT | 70 | select CPU_CACHE_VIVT |
71 | select CPU_COPY_V4WB | 71 | select CPU_COPY_V4WB if MMU |
72 | select CPU_TLB_V4WBI | 72 | select CPU_TLB_V4WBI if MMU |
73 | help | 73 | help |
74 | The ARM920T is licensed to be produced by numerous vendors, | 74 | The ARM920T is licensed to be produced by numerous vendors, |
75 | and is used in the Maverick EP9312 and the Samsung S3C2410. | 75 | and is used in the Maverick EP9312 and the Samsung S3C2410. |
@@ -89,8 +89,8 @@ config CPU_ARM922T | |||
89 | select CPU_ABRT_EV4T | 89 | select CPU_ABRT_EV4T |
90 | select CPU_CACHE_V4WT | 90 | select CPU_CACHE_V4WT |
91 | select CPU_CACHE_VIVT | 91 | select CPU_CACHE_VIVT |
92 | select CPU_COPY_V4WB | 92 | select CPU_COPY_V4WB if MMU |
93 | select CPU_TLB_V4WBI | 93 | select CPU_TLB_V4WBI if MMU |
94 | help | 94 | help |
95 | The ARM922T is a version of the ARM920T, but with smaller | 95 | The ARM922T is a version of the ARM920T, but with smaller |
96 | instruction and data caches. It is used in Altera's | 96 | instruction and data caches. It is used in Altera's |
@@ -108,8 +108,8 @@ config CPU_ARM925T | |||
108 | select CPU_ABRT_EV4T | 108 | select CPU_ABRT_EV4T |
109 | select CPU_CACHE_V4WT | 109 | select CPU_CACHE_V4WT |
110 | select CPU_CACHE_VIVT | 110 | select CPU_CACHE_VIVT |
111 | select CPU_COPY_V4WB | 111 | select CPU_COPY_V4WB if MMU |
112 | select CPU_TLB_V4WBI | 112 | select CPU_TLB_V4WBI if MMU |
113 | help | 113 | help |
114 | The ARM925T is a mix between the ARM920T and ARM926T, but with | 114 | The ARM925T is a mix between the ARM920T and ARM926T, but with |
115 | different instruction and data caches. It is used in TI's OMAP | 115 | different instruction and data caches. It is used in TI's OMAP |
@@ -126,8 +126,8 @@ config CPU_ARM926T | |||
126 | select CPU_32v5 | 126 | select CPU_32v5 |
127 | select CPU_ABRT_EV5TJ | 127 | select CPU_ABRT_EV5TJ |
128 | select CPU_CACHE_VIVT | 128 | select CPU_CACHE_VIVT |
129 | select CPU_COPY_V4WB | 129 | select CPU_COPY_V4WB if MMU |
130 | select CPU_TLB_V4WBI | 130 | select CPU_TLB_V4WBI if MMU |
131 | help | 131 | help |
132 | This is a variant of the ARM920. It has slightly different | 132 | This is a variant of the ARM920. It has slightly different |
133 | instruction sequences for cache and TLB operations. Curiously, | 133 | instruction sequences for cache and TLB operations. Curiously, |
@@ -144,8 +144,8 @@ config CPU_ARM1020 | |||
144 | select CPU_ABRT_EV4T | 144 | select CPU_ABRT_EV4T |
145 | select CPU_CACHE_V4WT | 145 | select CPU_CACHE_V4WT |
146 | select CPU_CACHE_VIVT | 146 | select CPU_CACHE_VIVT |
147 | select CPU_COPY_V4WB | 147 | select CPU_COPY_V4WB if MMU |
148 | select CPU_TLB_V4WBI | 148 | select CPU_TLB_V4WBI if MMU |
149 | help | 149 | help |
150 | The ARM1020 is the 32K cached version of the ARM10 processor, | 150 | The ARM1020 is the 32K cached version of the ARM10 processor, |
151 | with an addition of a floating-point unit. | 151 | with an addition of a floating-point unit. |
@@ -161,8 +161,8 @@ config CPU_ARM1020E | |||
161 | select CPU_ABRT_EV4T | 161 | select CPU_ABRT_EV4T |
162 | select CPU_CACHE_V4WT | 162 | select CPU_CACHE_V4WT |
163 | select CPU_CACHE_VIVT | 163 | select CPU_CACHE_VIVT |
164 | select CPU_COPY_V4WB | 164 | select CPU_COPY_V4WB if MMU |
165 | select CPU_TLB_V4WBI | 165 | select CPU_TLB_V4WBI if MMU |
166 | depends on n | 166 | depends on n |
167 | 167 | ||
168 | # ARM1022E | 168 | # ARM1022E |
@@ -172,8 +172,8 @@ config CPU_ARM1022 | |||
172 | select CPU_32v5 | 172 | select CPU_32v5 |
173 | select CPU_ABRT_EV4T | 173 | select CPU_ABRT_EV4T |
174 | select CPU_CACHE_VIVT | 174 | select CPU_CACHE_VIVT |
175 | select CPU_COPY_V4WB # can probably do better | 175 | select CPU_COPY_V4WB if MMU # can probably do better |
176 | select CPU_TLB_V4WBI | 176 | select CPU_TLB_V4WBI if MMU |
177 | help | 177 | help |
178 | The ARM1022E is an implementation of the ARMv5TE architecture | 178 | The ARM1022E is an implementation of the ARMv5TE architecture |
179 | based upon the ARM10 integer core with a 16KiB L1 Harvard cache, | 179 | based upon the ARM10 integer core with a 16KiB L1 Harvard cache, |
@@ -189,8 +189,8 @@ config CPU_ARM1026 | |||
189 | select CPU_32v5 | 189 | select CPU_32v5 |
190 | select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10 | 190 | select CPU_ABRT_EV5T # But need Jazelle, but EV5TJ ignores bit 10 |
191 | select CPU_CACHE_VIVT | 191 | select CPU_CACHE_VIVT |
192 | select CPU_COPY_V4WB # can probably do better | 192 | select CPU_COPY_V4WB if MMU # can probably do better |
193 | select CPU_TLB_V4WBI | 193 | select CPU_TLB_V4WBI if MMU |
194 | help | 194 | help |
195 | The ARM1026EJ-S is an implementation of the ARMv5TEJ architecture | 195 | The ARM1026EJ-S is an implementation of the ARMv5TEJ architecture |
196 | based upon the ARM10 integer core. | 196 | based upon the ARM10 integer core. |
@@ -207,8 +207,8 @@ config CPU_SA110 | |||
207 | select CPU_ABRT_EV4 | 207 | select CPU_ABRT_EV4 |
208 | select CPU_CACHE_V4WB | 208 | select CPU_CACHE_V4WB |
209 | select CPU_CACHE_VIVT | 209 | select CPU_CACHE_VIVT |
210 | select CPU_COPY_V4WB | 210 | select CPU_COPY_V4WB if MMU |
211 | select CPU_TLB_V4WB | 211 | select CPU_TLB_V4WB if MMU |
212 | help | 212 | help |
213 | The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and | 213 | The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and |
214 | is available at five speeds ranging from 100 MHz to 233 MHz. | 214 | is available at five speeds ranging from 100 MHz to 233 MHz. |
@@ -227,7 +227,7 @@ config CPU_SA1100 | |||
227 | select CPU_ABRT_EV4 | 227 | select CPU_ABRT_EV4 |
228 | select CPU_CACHE_V4WB | 228 | select CPU_CACHE_V4WB |
229 | select CPU_CACHE_VIVT | 229 | select CPU_CACHE_VIVT |
230 | select CPU_TLB_V4WB | 230 | select CPU_TLB_V4WB if MMU |
231 | 231 | ||
232 | # XScale | 232 | # XScale |
233 | config CPU_XSCALE | 233 | config CPU_XSCALE |
@@ -237,7 +237,7 @@ config CPU_XSCALE | |||
237 | select CPU_32v5 | 237 | select CPU_32v5 |
238 | select CPU_ABRT_EV5T | 238 | select CPU_ABRT_EV5T |
239 | select CPU_CACHE_VIVT | 239 | select CPU_CACHE_VIVT |
240 | select CPU_TLB_V4WBI | 240 | select CPU_TLB_V4WBI if MMU |
241 | 241 | ||
242 | # XScale Core Version 3 | 242 | # XScale Core Version 3 |
243 | config CPU_XSC3 | 243 | config CPU_XSC3 |
@@ -247,7 +247,7 @@ config CPU_XSC3 | |||
247 | select CPU_32v5 | 247 | select CPU_32v5 |
248 | select CPU_ABRT_EV5T | 248 | select CPU_ABRT_EV5T |
249 | select CPU_CACHE_VIVT | 249 | select CPU_CACHE_VIVT |
250 | select CPU_TLB_V4WBI | 250 | select CPU_TLB_V4WBI if MMU |
251 | select IO_36 | 251 | select IO_36 |
252 | 252 | ||
253 | # ARMv6 | 253 | # ARMv6 |
@@ -258,8 +258,8 @@ config CPU_V6 | |||
258 | select CPU_ABRT_EV6 | 258 | select CPU_ABRT_EV6 |
259 | select CPU_CACHE_V6 | 259 | select CPU_CACHE_V6 |
260 | select CPU_CACHE_VIPT | 260 | select CPU_CACHE_VIPT |
261 | select CPU_COPY_V6 | 261 | select CPU_COPY_V6 if MMU |
262 | select CPU_TLB_V6 | 262 | select CPU_TLB_V6 if MMU |
263 | 263 | ||
264 | # ARMv6k | 264 | # ARMv6k |
265 | config CPU_32v6K | 265 | config CPU_32v6K |
@@ -277,17 +277,17 @@ config CPU_32v6K | |||
277 | # This defines the compiler instruction set which depends on the machine type. | 277 | # This defines the compiler instruction set which depends on the machine type. |
278 | config CPU_32v3 | 278 | config CPU_32v3 |
279 | bool | 279 | bool |
280 | select TLS_REG_EMUL if SMP | 280 | select TLS_REG_EMUL if SMP || !MMU |
281 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 281 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
282 | 282 | ||
283 | config CPU_32v4 | 283 | config CPU_32v4 |
284 | bool | 284 | bool |
285 | select TLS_REG_EMUL if SMP | 285 | select TLS_REG_EMUL if SMP || !MMU |
286 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 286 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
287 | 287 | ||
288 | config CPU_32v5 | 288 | config CPU_32v5 |
289 | bool | 289 | bool |
290 | select TLS_REG_EMUL if SMP | 290 | select TLS_REG_EMUL if SMP || !MMU |
291 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 291 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
292 | 292 | ||
293 | config CPU_32v6 | 293 | config CPU_32v6 |
@@ -334,6 +334,7 @@ config CPU_CACHE_VIVT | |||
334 | config CPU_CACHE_VIPT | 334 | config CPU_CACHE_VIPT |
335 | bool | 335 | bool |
336 | 336 | ||
337 | if MMU | ||
337 | # The copy-page model | 338 | # The copy-page model |
338 | config CPU_COPY_V3 | 339 | config CPU_COPY_V3 |
339 | bool | 340 | bool |
@@ -372,6 +373,8 @@ config CPU_TLB_V4WBI | |||
372 | config CPU_TLB_V6 | 373 | config CPU_TLB_V6 |
373 | bool | 374 | bool |
374 | 375 | ||
376 | endif | ||
377 | |||
375 | # | 378 | # |
376 | # CPU supports 36-bit I/O | 379 | # CPU supports 36-bit I/O |
377 | # | 380 | # |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 07a538505784..21a2770226ee 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -2,10 +2,16 @@ | |||
2 | # Makefile for the linux arm-specific parts of the memory manager. | 2 | # Makefile for the linux arm-specific parts of the memory manager. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := consistent.o extable.o fault-armv.o \ | 5 | obj-y := consistent.o extable.o fault.o init.o \ |
6 | fault.o flush.o init.o ioremap.o mmap.o \ | 6 | iomap.o |
7 | |||
8 | obj-$(CONFIG_MMU) += fault-armv.o flush.o ioremap.o mmap.o \ | ||
7 | mm-armv.o | 9 | mm-armv.o |
8 | 10 | ||
11 | ifneq ($(CONFIG_MMU),y) | ||
12 | obj-y += nommu.o | ||
13 | endif | ||
14 | |||
9 | obj-$(CONFIG_MODULES) += proc-syms.o | 15 | obj-$(CONFIG_MODULES) += proc-syms.o |
10 | 16 | ||
11 | obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o | 17 | obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 9ea1f87a7079..989fd681c822 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -26,8 +26,6 @@ | |||
26 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
27 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
28 | 28 | ||
29 | #define TABLE_SIZE (2 * PTRS_PER_PTE * sizeof(pte_t)) | ||
30 | |||
31 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 29 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
32 | 30 | ||
33 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 31 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
diff --git a/arch/arm/mm/iomap.c b/arch/arm/mm/iomap.c new file mode 100644 index 000000000000..62066f3020c8 --- /dev/null +++ b/arch/arm/mm/iomap.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/iomap.c | ||
3 | * | ||
4 | * Map IO port and PCI memory spaces so that {read,write}[bwl] can | ||
5 | * be used to access this memory. | ||
6 | */ | ||
7 | #include <linux/module.h> | ||
8 | #include <linux/pci.h> | ||
9 | #include <linux/ioport.h> | ||
10 | |||
11 | #include <asm/io.h> | ||
12 | |||
13 | #ifdef __io | ||
14 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
15 | { | ||
16 | return __io(port); | ||
17 | } | ||
18 | EXPORT_SYMBOL(ioport_map); | ||
19 | |||
20 | void ioport_unmap(void __iomem *addr) | ||
21 | { | ||
22 | } | ||
23 | EXPORT_SYMBOL(ioport_unmap); | ||
24 | #endif | ||
25 | |||
26 | #ifdef CONFIG_PCI | ||
27 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
28 | { | ||
29 | unsigned long start = pci_resource_start(dev, bar); | ||
30 | unsigned long len = pci_resource_len(dev, bar); | ||
31 | unsigned long flags = pci_resource_flags(dev, bar); | ||
32 | |||
33 | if (!len || !start) | ||
34 | return NULL; | ||
35 | if (maxlen && len > maxlen) | ||
36 | len = maxlen; | ||
37 | if (flags & IORESOURCE_IO) | ||
38 | return ioport_map(start, len); | ||
39 | if (flags & IORESOURCE_MEM) { | ||
40 | if (flags & IORESOURCE_CACHEABLE) | ||
41 | return ioremap(start, len); | ||
42 | return ioremap_nocache(start, len); | ||
43 | } | ||
44 | return NULL; | ||
45 | } | ||
46 | EXPORT_SYMBOL(pci_iomap); | ||
47 | |||
48 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | ||
49 | { | ||
50 | if ((unsigned long)addr >= VMALLOC_START && | ||
51 | (unsigned long)addr < VMALLOC_END) | ||
52 | iounmap(addr); | ||
53 | } | ||
54 | EXPORT_SYMBOL(pci_iounmap); | ||
55 | #endif | ||
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index c1f7180c7bed..7691cfdba567 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -176,50 +176,3 @@ void __iounmap(void __iomem *addr) | |||
176 | vunmap((void *)(PAGE_MASK & (unsigned long)addr)); | 176 | vunmap((void *)(PAGE_MASK & (unsigned long)addr)); |
177 | } | 177 | } |
178 | EXPORT_SYMBOL(__iounmap); | 178 | EXPORT_SYMBOL(__iounmap); |
179 | |||
180 | #ifdef __io | ||
181 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
182 | { | ||
183 | return __io(port); | ||
184 | } | ||
185 | EXPORT_SYMBOL(ioport_map); | ||
186 | |||
187 | void ioport_unmap(void __iomem *addr) | ||
188 | { | ||
189 | } | ||
190 | EXPORT_SYMBOL(ioport_unmap); | ||
191 | #endif | ||
192 | |||
193 | #ifdef CONFIG_PCI | ||
194 | #include <linux/pci.h> | ||
195 | #include <linux/ioport.h> | ||
196 | |||
197 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
198 | { | ||
199 | unsigned long start = pci_resource_start(dev, bar); | ||
200 | unsigned long len = pci_resource_len(dev, bar); | ||
201 | unsigned long flags = pci_resource_flags(dev, bar); | ||
202 | |||
203 | if (!len || !start) | ||
204 | return NULL; | ||
205 | if (maxlen && len > maxlen) | ||
206 | len = maxlen; | ||
207 | if (flags & IORESOURCE_IO) | ||
208 | return ioport_map(start, len); | ||
209 | if (flags & IORESOURCE_MEM) { | ||
210 | if (flags & IORESOURCE_CACHEABLE) | ||
211 | return ioremap(start, len); | ||
212 | return ioremap_nocache(start, len); | ||
213 | } | ||
214 | return NULL; | ||
215 | } | ||
216 | EXPORT_SYMBOL(pci_iomap); | ||
217 | |||
218 | void pci_iounmap(struct pci_dev *dev, void __iomem *addr) | ||
219 | { | ||
220 | if ((unsigned long)addr >= VMALLOC_START && | ||
221 | (unsigned long)addr < VMALLOC_END) | ||
222 | iounmap(addr); | ||
223 | } | ||
224 | EXPORT_SYMBOL(pci_iounmap); | ||
225 | #endif | ||
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c new file mode 100644 index 000000000000..1464ed817b5d --- /dev/null +++ b/arch/arm/mm/nommu.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/nommu.c | ||
3 | * | ||
4 | * ARM uCLinux supporting functions. | ||
5 | */ | ||
6 | #include <linux/module.h> | ||
7 | #include <linux/mm.h> | ||
8 | #include <linux/pagemap.h> | ||
9 | |||
10 | #include <asm/cacheflush.h> | ||
11 | #include <asm/io.h> | ||
12 | #include <asm/page.h> | ||
13 | |||
14 | void flush_dcache_page(struct page *page) | ||
15 | { | ||
16 | __cpuc_flush_dcache_page(page_address(page)); | ||
17 | } | ||
18 | EXPORT_SYMBOL(flush_dcache_page); | ||
19 | |||
20 | void __iomem *__ioremap_pfn(unsigned long pfn, unsigned long offset, | ||
21 | size_t size, unsigned long flags) | ||
22 | { | ||
23 | if (pfn >= (0x100000000ULL >> PAGE_SHIFT)) | ||
24 | return NULL; | ||
25 | return (void __iomem *) (offset + (pfn << PAGE_SHIFT)); | ||
26 | } | ||
27 | EXPORT_SYMBOL(__ioremap_pfn); | ||
28 | |||
29 | void __iomem *__ioremap(unsigned long phys_addr, size_t size, | ||
30 | unsigned long flags) | ||
31 | { | ||
32 | return (void __iomem *)phys_addr; | ||
33 | } | ||
34 | EXPORT_SYMBOL(__ioremap); | ||
35 | |||
36 | void __iounmap(void __iomem *addr) | ||
37 | { | ||
38 | } | ||
39 | EXPORT_SYMBOL(__iounmap); | ||
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 959588884fa5..b9abbafca812 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -101,7 +102,9 @@ ENTRY(cpu_arm1020_reset) | |||
101 | mov ip, #0 | 102 | mov ip, #0 |
102 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
103 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 104 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
105 | #ifdef CONFIG_MMU | ||
104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 106 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
107 | #endif | ||
105 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 108 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
106 | bic ip, ip, #0x000f @ ............wcam | 109 | bic ip, ip, #0x000f @ ............wcam |
107 | bic ip, ip, #0x1100 @ ...i...s........ | 110 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -359,6 +362,7 @@ ENTRY(cpu_arm1020_dcache_clean_area) | |||
359 | */ | 362 | */ |
360 | .align 5 | 363 | .align 5 |
361 | ENTRY(cpu_arm1020_switch_mm) | 364 | ENTRY(cpu_arm1020_switch_mm) |
365 | #ifdef CONFIG_MMU | ||
362 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 366 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
363 | mcr p15, 0, r3, c7, c10, 4 | 367 | mcr p15, 0, r3, c7, c10, 4 |
364 | mov r1, #0xF @ 16 segments | 368 | mov r1, #0xF @ 16 segments |
@@ -383,6 +387,7 @@ ENTRY(cpu_arm1020_switch_mm) | |||
383 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 387 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
384 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 388 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
385 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 389 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
390 | #endif /* CONFIG_MMU */ | ||
386 | mov pc, lr | 391 | mov pc, lr |
387 | 392 | ||
388 | /* | 393 | /* |
@@ -392,6 +397,7 @@ ENTRY(cpu_arm1020_switch_mm) | |||
392 | */ | 397 | */ |
393 | .align 5 | 398 | .align 5 |
394 | ENTRY(cpu_arm1020_set_pte) | 399 | ENTRY(cpu_arm1020_set_pte) |
400 | #ifdef CONFIG_MMU | ||
395 | str r1, [r0], #-2048 @ linux version | 401 | str r1, [r0], #-2048 @ linux version |
396 | 402 | ||
397 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 403 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -421,6 +427,7 @@ ENTRY(cpu_arm1020_set_pte) | |||
421 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 427 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
422 | #endif | 428 | #endif |
423 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 429 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
430 | #endif /* CONFIG_MMU */ | ||
424 | mov pc, lr | 431 | mov pc, lr |
425 | 432 | ||
426 | __INIT | 433 | __INIT |
@@ -430,7 +437,9 @@ __arm1020_setup: | |||
430 | mov r0, #0 | 437 | mov r0, #0 |
431 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 438 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
432 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 439 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
440 | #ifdef CONFIG_MMU | ||
433 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 441 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
442 | #endif | ||
434 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 443 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
435 | ldr r5, arm1020_cr1_clear | 444 | ldr r5, arm1020_cr1_clear |
436 | bic r0, r0, r5 | 445 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index be6d081ff2b7..bcd5ee022e00 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -101,7 +102,9 @@ ENTRY(cpu_arm1020e_reset) | |||
101 | mov ip, #0 | 102 | mov ip, #0 |
102 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
103 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 104 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
105 | #ifdef CONFIG_MMU | ||
104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 106 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
107 | #endif | ||
105 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 108 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
106 | bic ip, ip, #0x000f @ ............wcam | 109 | bic ip, ip, #0x000f @ ............wcam |
107 | bic ip, ip, #0x1100 @ ...i...s........ | 110 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -344,6 +347,7 @@ ENTRY(cpu_arm1020e_dcache_clean_area) | |||
344 | */ | 347 | */ |
345 | .align 5 | 348 | .align 5 |
346 | ENTRY(cpu_arm1020e_switch_mm) | 349 | ENTRY(cpu_arm1020e_switch_mm) |
350 | #ifdef CONFIG_MMU | ||
347 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 351 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
348 | mcr p15, 0, r3, c7, c10, 4 | 352 | mcr p15, 0, r3, c7, c10, 4 |
349 | mov r1, #0xF @ 16 segments | 353 | mov r1, #0xF @ 16 segments |
@@ -367,6 +371,7 @@ ENTRY(cpu_arm1020e_switch_mm) | |||
367 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 371 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
368 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 372 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
369 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 373 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
374 | #endif | ||
370 | mov pc, lr | 375 | mov pc, lr |
371 | 376 | ||
372 | /* | 377 | /* |
@@ -376,6 +381,7 @@ ENTRY(cpu_arm1020e_switch_mm) | |||
376 | */ | 381 | */ |
377 | .align 5 | 382 | .align 5 |
378 | ENTRY(cpu_arm1020e_set_pte) | 383 | ENTRY(cpu_arm1020e_set_pte) |
384 | #ifdef CONFIG_MMU | ||
379 | str r1, [r0], #-2048 @ linux version | 385 | str r1, [r0], #-2048 @ linux version |
380 | 386 | ||
381 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 387 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -403,6 +409,7 @@ ENTRY(cpu_arm1020e_set_pte) | |||
403 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 409 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
404 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 410 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
405 | #endif | 411 | #endif |
412 | #endif /* CONFIG_MMU */ | ||
406 | mov pc, lr | 413 | mov pc, lr |
407 | 414 | ||
408 | __INIT | 415 | __INIT |
@@ -412,7 +419,9 @@ __arm1020e_setup: | |||
412 | mov r0, #0 | 419 | mov r0, #0 |
413 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 420 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
414 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 421 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
422 | #ifdef CONFIG_MMU | ||
415 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 423 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
424 | #endif | ||
416 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 425 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
417 | ldr r5, arm1020e_cr1_clear | 426 | ldr r5, arm1020e_cr1_clear |
418 | bic r0, r0, r5 | 427 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index f778545d57a2..b0ccff4fadd2 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -90,7 +91,9 @@ ENTRY(cpu_arm1022_reset) | |||
90 | mov ip, #0 | 91 | mov ip, #0 |
91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
92 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 93 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
94 | #ifdef CONFIG_MMU | ||
93 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 95 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
96 | #endif | ||
94 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 97 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
95 | bic ip, ip, #0x000f @ ............wcam | 98 | bic ip, ip, #0x000f @ ............wcam |
96 | bic ip, ip, #0x1100 @ ...i...s........ | 99 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -333,6 +336,7 @@ ENTRY(cpu_arm1022_dcache_clean_area) | |||
333 | */ | 336 | */ |
334 | .align 5 | 337 | .align 5 |
335 | ENTRY(cpu_arm1022_switch_mm) | 338 | ENTRY(cpu_arm1022_switch_mm) |
339 | #ifdef CONFIG_MMU | ||
336 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 340 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
337 | mov r1, #(CACHE_DSEGMENTS - 1) << 5 @ 16 segments | 341 | mov r1, #(CACHE_DSEGMENTS - 1) << 5 @ 16 segments |
338 | 1: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries | 342 | 1: orr r3, r1, #(CACHE_DENTRIES - 1) << 26 @ 64 entries |
@@ -349,6 +353,7 @@ ENTRY(cpu_arm1022_switch_mm) | |||
349 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 353 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
350 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 354 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
351 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 355 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
356 | #endif | ||
352 | mov pc, lr | 357 | mov pc, lr |
353 | 358 | ||
354 | /* | 359 | /* |
@@ -358,6 +363,7 @@ ENTRY(cpu_arm1022_switch_mm) | |||
358 | */ | 363 | */ |
359 | .align 5 | 364 | .align 5 |
360 | ENTRY(cpu_arm1022_set_pte) | 365 | ENTRY(cpu_arm1022_set_pte) |
366 | #ifdef CONFIG_MMU | ||
361 | str r1, [r0], #-2048 @ linux version | 367 | str r1, [r0], #-2048 @ linux version |
362 | 368 | ||
363 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 369 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -385,6 +391,7 @@ ENTRY(cpu_arm1022_set_pte) | |||
385 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 391 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
386 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 392 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
387 | #endif | 393 | #endif |
394 | #endif /* CONFIG_MMU */ | ||
388 | mov pc, lr | 395 | mov pc, lr |
389 | 396 | ||
390 | __INIT | 397 | __INIT |
@@ -394,7 +401,9 @@ __arm1022_setup: | |||
394 | mov r0, #0 | 401 | mov r0, #0 |
395 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 402 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
396 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 403 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
404 | #ifdef CONFIG_MMU | ||
397 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 405 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
406 | #endif | ||
398 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 407 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
399 | ldr r5, arm1022_cr1_clear | 408 | ldr r5, arm1022_cr1_clear |
400 | bic r0, r0, r5 | 409 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 148c111fde73..abe850c9a641 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2000 ARM Limited | 4 | * Copyright (C) 2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -90,7 +91,9 @@ ENTRY(cpu_arm1026_reset) | |||
90 | mov ip, #0 | 91 | mov ip, #0 |
91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
92 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 93 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
94 | #ifdef CONFIG_MMU | ||
93 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 95 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
96 | #endif | ||
94 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 97 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
95 | bic ip, ip, #0x000f @ ............wcam | 98 | bic ip, ip, #0x000f @ ............wcam |
96 | bic ip, ip, #0x1100 @ ...i...s........ | 99 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -327,6 +330,7 @@ ENTRY(cpu_arm1026_dcache_clean_area) | |||
327 | */ | 330 | */ |
328 | .align 5 | 331 | .align 5 |
329 | ENTRY(cpu_arm1026_switch_mm) | 332 | ENTRY(cpu_arm1026_switch_mm) |
333 | #ifdef CONFIG_MMU | ||
330 | mov r1, #0 | 334 | mov r1, #0 |
331 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 335 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
332 | 1: mrc p15, 0, r15, c7, c14, 3 @ test, clean, invalidate | 336 | 1: mrc p15, 0, r15, c7, c14, 3 @ test, clean, invalidate |
@@ -338,6 +342,7 @@ ENTRY(cpu_arm1026_switch_mm) | |||
338 | mcr p15, 0, r1, c7, c10, 4 @ drain WB | 342 | mcr p15, 0, r1, c7, c10, 4 @ drain WB |
339 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 343 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
340 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs | 344 | mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs |
345 | #endif | ||
341 | mov pc, lr | 346 | mov pc, lr |
342 | 347 | ||
343 | /* | 348 | /* |
@@ -347,6 +352,7 @@ ENTRY(cpu_arm1026_switch_mm) | |||
347 | */ | 352 | */ |
348 | .align 5 | 353 | .align 5 |
349 | ENTRY(cpu_arm1026_set_pte) | 354 | ENTRY(cpu_arm1026_set_pte) |
355 | #ifdef CONFIG_MMU | ||
350 | str r1, [r0], #-2048 @ linux version | 356 | str r1, [r0], #-2048 @ linux version |
351 | 357 | ||
352 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 358 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -374,6 +380,7 @@ ENTRY(cpu_arm1026_set_pte) | |||
374 | #ifndef CONFIG_CPU_DCACHE_DISABLE | 380 | #ifndef CONFIG_CPU_DCACHE_DISABLE |
375 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 381 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
376 | #endif | 382 | #endif |
383 | #endif /* CONFIG_MMU */ | ||
377 | mov pc, lr | 384 | mov pc, lr |
378 | 385 | ||
379 | 386 | ||
@@ -384,8 +391,10 @@ __arm1026_setup: | |||
384 | mov r0, #0 | 391 | mov r0, #0 |
385 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 392 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
386 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 393 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
394 | #ifdef CONFIG_MMU | ||
387 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 395 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
388 | mcr p15, 0, r4, c2, c0 @ load page table pointer | 396 | mcr p15, 0, r4, c2, c0 @ load page table pointer |
397 | #endif | ||
389 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 398 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
390 | mov r0, #4 @ explicitly disable writeback | 399 | mov r0, #4 @ explicitly disable writeback |
391 | mcr p15, 7, r0, c15, c0, 0 | 400 | mcr p15, 7, r0, c15, c0, 0 |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index 540359b475d0..7a705edfa4b2 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-arm6,7.S | 2 | * linux/arch/arm/mm/proc-arm6,7.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2000 Russell King | 4 | * Copyright (C) 1997-2000 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -199,10 +200,12 @@ ENTRY(cpu_arm7_do_idle) | |||
199 | */ | 200 | */ |
200 | ENTRY(cpu_arm6_switch_mm) | 201 | ENTRY(cpu_arm6_switch_mm) |
201 | ENTRY(cpu_arm7_switch_mm) | 202 | ENTRY(cpu_arm7_switch_mm) |
203 | #ifdef CONFIG_MMU | ||
202 | mov r1, #0 | 204 | mov r1, #0 |
203 | mcr p15, 0, r1, c7, c0, 0 @ flush cache | 205 | mcr p15, 0, r1, c7, c0, 0 @ flush cache |
204 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr | 206 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr |
205 | mcr p15, 0, r1, c5, c0, 0 @ flush TLBs | 207 | mcr p15, 0, r1, c5, c0, 0 @ flush TLBs |
208 | #endif | ||
206 | mov pc, lr | 209 | mov pc, lr |
207 | 210 | ||
208 | /* | 211 | /* |
@@ -214,6 +217,7 @@ ENTRY(cpu_arm7_switch_mm) | |||
214 | .align 5 | 217 | .align 5 |
215 | ENTRY(cpu_arm6_set_pte) | 218 | ENTRY(cpu_arm6_set_pte) |
216 | ENTRY(cpu_arm7_set_pte) | 219 | ENTRY(cpu_arm7_set_pte) |
220 | #ifdef CONFIG_MMU | ||
217 | str r1, [r0], #-2048 @ linux version | 221 | str r1, [r0], #-2048 @ linux version |
218 | 222 | ||
219 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 223 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -232,6 +236,7 @@ ENTRY(cpu_arm7_set_pte) | |||
232 | movne r2, #0 | 236 | movne r2, #0 |
233 | 237 | ||
234 | str r2, [r0] @ hardware version | 238 | str r2, [r0] @ hardware version |
239 | #endif /* CONFIG_MMU */ | ||
235 | mov pc, lr | 240 | mov pc, lr |
236 | 241 | ||
237 | /* | 242 | /* |
@@ -243,7 +248,9 @@ ENTRY(cpu_arm6_reset) | |||
243 | ENTRY(cpu_arm7_reset) | 248 | ENTRY(cpu_arm7_reset) |
244 | mov r1, #0 | 249 | mov r1, #0 |
245 | mcr p15, 0, r1, c7, c0, 0 @ flush cache | 250 | mcr p15, 0, r1, c7, c0, 0 @ flush cache |
251 | #ifdef CONFIG_MMU | ||
246 | mcr p15, 0, r1, c5, c0, 0 @ flush TLB | 252 | mcr p15, 0, r1, c5, c0, 0 @ flush TLB |
253 | #endif | ||
247 | mov r1, #0x30 | 254 | mov r1, #0x30 |
248 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc | 255 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc |
249 | mov pc, r0 | 256 | mov pc, r0 |
@@ -253,19 +260,27 @@ ENTRY(cpu_arm7_reset) | |||
253 | .type __arm6_setup, #function | 260 | .type __arm6_setup, #function |
254 | __arm6_setup: mov r0, #0 | 261 | __arm6_setup: mov r0, #0 |
255 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 | 262 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 |
263 | #ifdef CONFIG_MMU | ||
256 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 | 264 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 |
257 | mov r0, #0x3d @ . ..RS BLDP WCAM | 265 | mov r0, #0x3d @ . ..RS BLDP WCAM |
258 | orr r0, r0, #0x100 @ . ..01 0011 1101 | 266 | orr r0, r0, #0x100 @ . ..01 0011 1101 |
267 | #else | ||
268 | mov r0, #0x3c @ . ..RS BLDP WCA. | ||
269 | #endif | ||
259 | mov pc, lr | 270 | mov pc, lr |
260 | .size __arm6_setup, . - __arm6_setup | 271 | .size __arm6_setup, . - __arm6_setup |
261 | 272 | ||
262 | .type __arm7_setup, #function | 273 | .type __arm7_setup, #function |
263 | __arm7_setup: mov r0, #0 | 274 | __arm7_setup: mov r0, #0 |
264 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 | 275 | mcr p15, 0, r0, c7, c0 @ flush caches on v3 |
276 | #ifdef CONFIG_MMU | ||
265 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 | 277 | mcr p15, 0, r0, c5, c0 @ flush TLBs on v3 |
266 | mcr p15, 0, r0, c3, c0 @ load domain access register | 278 | mcr p15, 0, r0, c3, c0 @ load domain access register |
267 | mov r0, #0x7d @ . ..RS BLDP WCAM | 279 | mov r0, #0x7d @ . ..RS BLDP WCAM |
268 | orr r0, r0, #0x100 @ . ..01 0111 1101 | 280 | orr r0, r0, #0x100 @ . ..01 0111 1101 |
281 | #else | ||
282 | mov r0, #0x7c @ . ..RS BLDP WCA. | ||
283 | #endif | ||
269 | mov pc, lr | 284 | mov pc, lr |
270 | .size __arm7_setup, . - __arm7_setup | 285 | .size __arm7_setup, . - __arm7_setup |
271 | 286 | ||
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 26f00ee2ad9a..86102467d37f 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) | 4 | * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) |
5 | * Rob Scott (rscott@mtrob.fdns.net) | 5 | * Rob Scott (rscott@mtrob.fdns.net) |
6 | * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. | 6 | * Copyright (C) 2000 ARM Limited, Deep Blue Solutions Ltd. |
7 | * hacked for non-paged-MM by Hyok S. Choi, 2004. | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
@@ -29,6 +30,7 @@ | |||
29 | * out of 'proc-arm6,7.S' per RMK discussion | 30 | * out of 'proc-arm6,7.S' per RMK discussion |
30 | * 07-25-2000 SJH Added idle function. | 31 | * 07-25-2000 SJH Added idle function. |
31 | * 08-25-2000 DBS Updated for integration of ARM Ltd version. | 32 | * 08-25-2000 DBS Updated for integration of ARM Ltd version. |
33 | * 04-20-2004 HSC modified for non-paged memory management mode. | ||
32 | */ | 34 | */ |
33 | #include <linux/linkage.h> | 35 | #include <linux/linkage.h> |
34 | #include <linux/init.h> | 36 | #include <linux/init.h> |
@@ -75,10 +77,12 @@ ENTRY(cpu_arm720_do_idle) | |||
75 | * the new. | 77 | * the new. |
76 | */ | 78 | */ |
77 | ENTRY(cpu_arm720_switch_mm) | 79 | ENTRY(cpu_arm720_switch_mm) |
80 | #ifdef CONFIG_MMU | ||
78 | mov r1, #0 | 81 | mov r1, #0 |
79 | mcr p15, 0, r1, c7, c7, 0 @ invalidate cache | 82 | mcr p15, 0, r1, c7, c7, 0 @ invalidate cache |
80 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr | 83 | mcr p15, 0, r0, c2, c0, 0 @ update page table ptr |
81 | mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) | 84 | mcr p15, 0, r1, c8, c7, 0 @ flush TLB (v4) |
85 | #endif | ||
82 | mov pc, lr | 86 | mov pc, lr |
83 | 87 | ||
84 | /* | 88 | /* |
@@ -89,6 +93,7 @@ ENTRY(cpu_arm720_switch_mm) | |||
89 | */ | 93 | */ |
90 | .align 5 | 94 | .align 5 |
91 | ENTRY(cpu_arm720_set_pte) | 95 | ENTRY(cpu_arm720_set_pte) |
96 | #ifdef CONFIG_MMU | ||
92 | str r1, [r0], #-2048 @ linux version | 97 | str r1, [r0], #-2048 @ linux version |
93 | 98 | ||
94 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 99 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -107,6 +112,7 @@ ENTRY(cpu_arm720_set_pte) | |||
107 | movne r2, #0 | 112 | movne r2, #0 |
108 | 113 | ||
109 | str r2, [r0] @ hardware version | 114 | str r2, [r0] @ hardware version |
115 | #endif | ||
110 | mov pc, lr | 116 | mov pc, lr |
111 | 117 | ||
112 | /* | 118 | /* |
@@ -117,7 +123,9 @@ ENTRY(cpu_arm720_set_pte) | |||
117 | ENTRY(cpu_arm720_reset) | 123 | ENTRY(cpu_arm720_reset) |
118 | mov ip, #0 | 124 | mov ip, #0 |
119 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache | 125 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache |
126 | #ifdef CONFIG_MMU | ||
120 | mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) | 127 | mcr p15, 0, ip, c8, c7, 0 @ flush TLB (v4) |
128 | #endif | ||
121 | mrc p15, 0, ip, c1, c0, 0 @ get ctrl register | 129 | mrc p15, 0, ip, c1, c0, 0 @ get ctrl register |
122 | bic ip, ip, #0x000f @ ............wcam | 130 | bic ip, ip, #0x000f @ ............wcam |
123 | bic ip, ip, #0x2100 @ ..v....s........ | 131 | bic ip, ip, #0x2100 @ ..v....s........ |
@@ -130,7 +138,9 @@ ENTRY(cpu_arm720_reset) | |||
130 | __arm710_setup: | 138 | __arm710_setup: |
131 | mov r0, #0 | 139 | mov r0, #0 |
132 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches | 140 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches |
141 | #ifdef CONFIG_MMU | ||
133 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) | 142 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) |
143 | #endif | ||
134 | mrc p15, 0, r0, c1, c0 @ get control register | 144 | mrc p15, 0, r0, c1, c0 @ get control register |
135 | ldr r5, arm710_cr1_clear | 145 | ldr r5, arm710_cr1_clear |
136 | bic r0, r0, r5 | 146 | bic r0, r0, r5 |
@@ -156,7 +166,9 @@ arm710_cr1_set: | |||
156 | __arm720_setup: | 166 | __arm720_setup: |
157 | mov r0, #0 | 167 | mov r0, #0 |
158 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches | 168 | mcr p15, 0, r0, c7, c7, 0 @ invalidate caches |
169 | #ifdef CONFIG_MMU | ||
159 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) | 170 | mcr p15, 0, r0, c8, c7, 0 @ flush TLB (v4) |
171 | #endif | ||
160 | mrc p15, 0, r0, c1, c0 @ get control register | 172 | mrc p15, 0, r0, c1, c0 @ get control register |
161 | ldr r5, arm720_cr1_clear | 173 | ldr r5, arm720_cr1_clear |
162 | bic r0, r0, r5 | 174 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index a17f79e0199c..31dc839ba07c 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999,2000 ARM Limited | 4 | * Copyright (C) 1999,2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -97,7 +98,9 @@ ENTRY(cpu_arm920_reset) | |||
97 | mov ip, #0 | 98 | mov ip, #0 |
98 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 99 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
99 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 100 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
101 | #ifdef CONFIG_MMU | ||
100 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 102 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
103 | #endif | ||
101 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 104 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
102 | bic ip, ip, #0x000f @ ............wcam | 105 | bic ip, ip, #0x000f @ ............wcam |
103 | bic ip, ip, #0x1100 @ ...i...s........ | 106 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -317,6 +320,7 @@ ENTRY(cpu_arm920_dcache_clean_area) | |||
317 | */ | 320 | */ |
318 | .align 5 | 321 | .align 5 |
319 | ENTRY(cpu_arm920_switch_mm) | 322 | ENTRY(cpu_arm920_switch_mm) |
323 | #ifdef CONFIG_MMU | ||
320 | mov ip, #0 | 324 | mov ip, #0 |
321 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 325 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
322 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 326 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -337,6 +341,7 @@ ENTRY(cpu_arm920_switch_mm) | |||
337 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
338 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
339 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
344 | #endif | ||
340 | mov pc, lr | 345 | mov pc, lr |
341 | 346 | ||
342 | /* | 347 | /* |
@@ -346,6 +351,7 @@ ENTRY(cpu_arm920_switch_mm) | |||
346 | */ | 351 | */ |
347 | .align 5 | 352 | .align 5 |
348 | ENTRY(cpu_arm920_set_pte) | 353 | ENTRY(cpu_arm920_set_pte) |
354 | #ifdef CONFIG_MMU | ||
349 | str r1, [r0], #-2048 @ linux version | 355 | str r1, [r0], #-2048 @ linux version |
350 | 356 | ||
351 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 357 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -372,6 +378,7 @@ ENTRY(cpu_arm920_set_pte) | |||
372 | mov r0, r0 | 378 | mov r0, r0 |
373 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 379 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
374 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 380 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
381 | #endif /* CONFIG_MMU */ | ||
375 | mov pc, lr | 382 | mov pc, lr |
376 | 383 | ||
377 | __INIT | 384 | __INIT |
@@ -381,7 +388,9 @@ __arm920_setup: | |||
381 | mov r0, #0 | 388 | mov r0, #0 |
382 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 389 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
383 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 390 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
391 | #ifdef CONFIG_MMU | ||
384 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 392 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
393 | #endif | ||
385 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 394 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
386 | ldr r5, arm920_cr1_clear | 395 | ldr r5, arm920_cr1_clear |
387 | bic r0, r0, r5 | 396 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index bbde4a024a48..9e57c34f5c09 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 1999,2000 ARM Limited | 4 | * Copyright (C) 1999,2000 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * Copyright (C) 2001 Altera Corporation | 6 | * Copyright (C) 2001 Altera Corporation |
7 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
@@ -99,7 +100,9 @@ ENTRY(cpu_arm922_reset) | |||
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
101 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 102 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
103 | #ifdef CONFIG_MMU | ||
102 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 104 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
105 | #endif | ||
103 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 106 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
104 | bic ip, ip, #0x000f @ ............wcam | 107 | bic ip, ip, #0x000f @ ............wcam |
105 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -321,6 +324,7 @@ ENTRY(cpu_arm922_dcache_clean_area) | |||
321 | */ | 324 | */ |
322 | .align 5 | 325 | .align 5 |
323 | ENTRY(cpu_arm922_switch_mm) | 326 | ENTRY(cpu_arm922_switch_mm) |
327 | #ifdef CONFIG_MMU | ||
324 | mov ip, #0 | 328 | mov ip, #0 |
325 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 329 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
326 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 330 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -341,6 +345,7 @@ ENTRY(cpu_arm922_switch_mm) | |||
341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 345 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 346 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 347 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
348 | #endif | ||
344 | mov pc, lr | 349 | mov pc, lr |
345 | 350 | ||
346 | /* | 351 | /* |
@@ -350,6 +355,7 @@ ENTRY(cpu_arm922_switch_mm) | |||
350 | */ | 355 | */ |
351 | .align 5 | 356 | .align 5 |
352 | ENTRY(cpu_arm922_set_pte) | 357 | ENTRY(cpu_arm922_set_pte) |
358 | #ifdef CONFIG_MMU | ||
353 | str r1, [r0], #-2048 @ linux version | 359 | str r1, [r0], #-2048 @ linux version |
354 | 360 | ||
355 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 361 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -376,6 +382,7 @@ ENTRY(cpu_arm922_set_pte) | |||
376 | mov r0, r0 | 382 | mov r0, r0 |
377 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 383 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
378 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 384 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
385 | #endif /* CONFIG_MMU */ | ||
379 | mov pc, lr | 386 | mov pc, lr |
380 | 387 | ||
381 | __INIT | 388 | __INIT |
@@ -385,7 +392,9 @@ __arm922_setup: | |||
385 | mov r0, #0 | 392 | mov r0, #0 |
386 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 393 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
387 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 394 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
395 | #ifdef CONFIG_MMU | ||
388 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 396 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
397 | #endif | ||
389 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 398 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
390 | ldr r5, arm922_cr1_clear | 399 | ldr r5, arm922_cr1_clear |
391 | bic r0, r0, r5 | 400 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 224ce226a01b..8d47c9f3f931 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
@@ -9,6 +9,8 @@ | |||
9 | * Update for Linux-2.6 and cache flush improvements | 9 | * Update for Linux-2.6 and cache flush improvements |
10 | * Copyright (C) 2004 Nokia Corporation by Tony Lindgren <tony@atomide.com> | 10 | * Copyright (C) 2004 Nokia Corporation by Tony Lindgren <tony@atomide.com> |
11 | * | 11 | * |
12 | * hacked for non-paged-MM by Hyok S. Choi, 2004. | ||
13 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | 14 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License as published by | 15 | * it under the terms of the GNU General Public License as published by |
14 | * the Free Software Foundation; either version 2 of the License, or | 16 | * the Free Software Foundation; either version 2 of the License, or |
@@ -122,7 +124,9 @@ ENTRY(cpu_arm925_reset) | |||
122 | mov ip, #0 | 124 | mov ip, #0 |
123 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 125 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
124 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 126 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
127 | #ifdef CONFIG_MMU | ||
125 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 128 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
129 | #endif | ||
126 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 130 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
127 | bic ip, ip, #0x000f @ ............wcam | 131 | bic ip, ip, #0x000f @ ............wcam |
128 | bic ip, ip, #0x1100 @ ...i...s........ | 132 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -369,6 +373,7 @@ ENTRY(cpu_arm925_dcache_clean_area) | |||
369 | */ | 373 | */ |
370 | .align 5 | 374 | .align 5 |
371 | ENTRY(cpu_arm925_switch_mm) | 375 | ENTRY(cpu_arm925_switch_mm) |
376 | #ifdef CONFIG_MMU | ||
372 | mov ip, #0 | 377 | mov ip, #0 |
373 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 378 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
374 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 379 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -383,6 +388,7 @@ ENTRY(cpu_arm925_switch_mm) | |||
383 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 388 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
384 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 389 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
385 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 390 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
391 | #endif | ||
386 | mov pc, lr | 392 | mov pc, lr |
387 | 393 | ||
388 | /* | 394 | /* |
@@ -392,6 +398,7 @@ ENTRY(cpu_arm925_switch_mm) | |||
392 | */ | 398 | */ |
393 | .align 5 | 399 | .align 5 |
394 | ENTRY(cpu_arm925_set_pte) | 400 | ENTRY(cpu_arm925_set_pte) |
401 | #ifdef CONFIG_MMU | ||
395 | str r1, [r0], #-2048 @ linux version | 402 | str r1, [r0], #-2048 @ linux version |
396 | 403 | ||
397 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 404 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -420,6 +427,7 @@ ENTRY(cpu_arm925_set_pte) | |||
420 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 427 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
421 | #endif | 428 | #endif |
422 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 429 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
430 | #endif /* CONFIG_MMU */ | ||
423 | mov pc, lr | 431 | mov pc, lr |
424 | 432 | ||
425 | __INIT | 433 | __INIT |
@@ -438,7 +446,9 @@ __arm925_setup: | |||
438 | mov r0, #0 | 446 | mov r0, #0 |
439 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 447 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
440 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 448 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
449 | #ifdef CONFIG_MMU | ||
441 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 450 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
451 | #endif | ||
442 | 452 | ||
443 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 453 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
444 | mov r0, #4 @ disable write-back on caches explicitly | 454 | mov r0, #4 @ disable write-back on caches explicitly |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 4e2a087cf388..cb4d8f33d2a3 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999-2001 ARM Limited | 4 | * Copyright (C) 1999-2001 ARM Limited |
5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd. |
6 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
6 | * | 7 | * |
7 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
@@ -85,7 +86,9 @@ ENTRY(cpu_arm926_reset) | |||
85 | mov ip, #0 | 86 | mov ip, #0 |
86 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 87 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
87 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 88 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
89 | #ifdef CONFIG_MMU | ||
88 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 90 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
91 | #endif | ||
89 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 92 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
90 | bic ip, ip, #0x000f @ ............wcam | 93 | bic ip, ip, #0x000f @ ............wcam |
91 | bic ip, ip, #0x1100 @ ...i...s........ | 94 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -329,6 +332,7 @@ ENTRY(cpu_arm926_dcache_clean_area) | |||
329 | */ | 332 | */ |
330 | .align 5 | 333 | .align 5 |
331 | ENTRY(cpu_arm926_switch_mm) | 334 | ENTRY(cpu_arm926_switch_mm) |
335 | #ifdef CONFIG_MMU | ||
332 | mov ip, #0 | 336 | mov ip, #0 |
333 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 337 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
334 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache | 338 | mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache |
@@ -341,6 +345,7 @@ ENTRY(cpu_arm926_switch_mm) | |||
341 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 345 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
342 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 346 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
343 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 347 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
348 | #endif | ||
344 | mov pc, lr | 349 | mov pc, lr |
345 | 350 | ||
346 | /* | 351 | /* |
@@ -350,6 +355,7 @@ ENTRY(cpu_arm926_switch_mm) | |||
350 | */ | 355 | */ |
351 | .align 5 | 356 | .align 5 |
352 | ENTRY(cpu_arm926_set_pte) | 357 | ENTRY(cpu_arm926_set_pte) |
358 | #ifdef CONFIG_MMU | ||
353 | str r1, [r0], #-2048 @ linux version | 359 | str r1, [r0], #-2048 @ linux version |
354 | 360 | ||
355 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 361 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -378,6 +384,7 @@ ENTRY(cpu_arm926_set_pte) | |||
378 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 384 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
379 | #endif | 385 | #endif |
380 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 386 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
387 | #endif | ||
381 | mov pc, lr | 388 | mov pc, lr |
382 | 389 | ||
383 | __INIT | 390 | __INIT |
@@ -387,7 +394,9 @@ __arm926_setup: | |||
387 | mov r0, #0 | 394 | mov r0, #0 |
388 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 395 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
389 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 396 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
397 | #ifdef CONFIG_MMU | ||
390 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 398 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
399 | #endif | ||
391 | 400 | ||
392 | 401 | ||
393 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 402 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index a2dd5ae1077d..5a760a2c629c 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-sa110.S | 2 | * linux/arch/arm/mm/proc-sa110.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2002 Russell King | 4 | * Copyright (C) 1997-2002 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -67,7 +68,9 @@ ENTRY(cpu_sa110_reset) | |||
67 | mov ip, #0 | 68 | mov ip, #0 |
68 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 69 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
69 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 70 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
71 | #ifdef CONFIG_MMU | ||
70 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 72 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
73 | #endif | ||
71 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 74 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
72 | bic ip, ip, #0x000f @ ............wcam | 75 | bic ip, ip, #0x000f @ ............wcam |
73 | bic ip, ip, #0x1100 @ ...i...s........ | 76 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -130,11 +133,15 @@ ENTRY(cpu_sa110_dcache_clean_area) | |||
130 | */ | 133 | */ |
131 | .align 5 | 134 | .align 5 |
132 | ENTRY(cpu_sa110_switch_mm) | 135 | ENTRY(cpu_sa110_switch_mm) |
136 | #ifdef CONFIG_MMU | ||
133 | str lr, [sp, #-4]! | 137 | str lr, [sp, #-4]! |
134 | bl v4wb_flush_kern_cache_all @ clears IP | 138 | bl v4wb_flush_kern_cache_all @ clears IP |
135 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 139 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
136 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 140 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
137 | ldr pc, [sp], #4 | 141 | ldr pc, [sp], #4 |
142 | #else | ||
143 | mov pc, lr | ||
144 | #endif | ||
138 | 145 | ||
139 | /* | 146 | /* |
140 | * cpu_sa110_set_pte(ptep, pte) | 147 | * cpu_sa110_set_pte(ptep, pte) |
@@ -143,6 +150,7 @@ ENTRY(cpu_sa110_switch_mm) | |||
143 | */ | 150 | */ |
144 | .align 5 | 151 | .align 5 |
145 | ENTRY(cpu_sa110_set_pte) | 152 | ENTRY(cpu_sa110_set_pte) |
153 | #ifdef CONFIG_MMU | ||
146 | str r1, [r0], #-2048 @ linux version | 154 | str r1, [r0], #-2048 @ linux version |
147 | 155 | ||
148 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 156 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -164,6 +172,7 @@ ENTRY(cpu_sa110_set_pte) | |||
164 | mov r0, r0 | 172 | mov r0, r0 |
165 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 173 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
166 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 174 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
175 | #endif | ||
167 | mov pc, lr | 176 | mov pc, lr |
168 | 177 | ||
169 | __INIT | 178 | __INIT |
@@ -173,7 +182,9 @@ __sa110_setup: | |||
173 | mov r10, #0 | 182 | mov r10, #0 |
174 | mcr p15, 0, r10, c7, c7 @ invalidate I,D caches on v4 | 183 | mcr p15, 0, r10, c7, c7 @ invalidate I,D caches on v4 |
175 | mcr p15, 0, r10, c7, c10, 4 @ drain write buffer on v4 | 184 | mcr p15, 0, r10, c7, c10, 4 @ drain write buffer on v4 |
185 | #ifdef CONFIG_MMU | ||
176 | mcr p15, 0, r10, c8, c7 @ invalidate I,D TLBs on v4 | 186 | mcr p15, 0, r10, c8, c7 @ invalidate I,D TLBs on v4 |
187 | #endif | ||
177 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 188 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
178 | ldr r5, sa110_cr1_clear | 189 | ldr r5, sa110_cr1_clear |
179 | bic r0, r0, r5 | 190 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 777ad99c1439..0a2107ad4c32 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-sa1100.S | 2 | * linux/arch/arm/mm/proc-sa1100.S |
3 | * | 3 | * |
4 | * Copyright (C) 1997-2002 Russell King | 4 | * Copyright (C) 1997-2002 Russell King |
5 | * hacked for non-paged-MM by Hyok S. Choi, 2003. | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -77,7 +78,9 @@ ENTRY(cpu_sa1100_reset) | |||
77 | mov ip, #0 | 78 | mov ip, #0 |
78 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 79 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
79 | mcr p15, 0, ip, c7, c10, 4 @ drain WB | 80 | mcr p15, 0, ip, c7, c10, 4 @ drain WB |
81 | #ifdef CONFIG_MMU | ||
80 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 82 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
83 | #endif | ||
81 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register | 84 | mrc p15, 0, ip, c1, c0, 0 @ ctrl register |
82 | bic ip, ip, #0x000f @ ............wcam | 85 | bic ip, ip, #0x000f @ ............wcam |
83 | bic ip, ip, #0x1100 @ ...i...s........ | 86 | bic ip, ip, #0x1100 @ ...i...s........ |
@@ -142,12 +145,16 @@ ENTRY(cpu_sa1100_dcache_clean_area) | |||
142 | */ | 145 | */ |
143 | .align 5 | 146 | .align 5 |
144 | ENTRY(cpu_sa1100_switch_mm) | 147 | ENTRY(cpu_sa1100_switch_mm) |
148 | #ifdef CONFIG_MMU | ||
145 | str lr, [sp, #-4]! | 149 | str lr, [sp, #-4]! |
146 | bl v4wb_flush_kern_cache_all @ clears IP | 150 | bl v4wb_flush_kern_cache_all @ clears IP |
147 | mcr p15, 0, ip, c9, c0, 0 @ invalidate RB | 151 | mcr p15, 0, ip, c9, c0, 0 @ invalidate RB |
148 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer | 152 | mcr p15, 0, r0, c2, c0, 0 @ load page table pointer |
149 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 153 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
150 | ldr pc, [sp], #4 | 154 | ldr pc, [sp], #4 |
155 | #else | ||
156 | mov pc, lr | ||
157 | #endif | ||
151 | 158 | ||
152 | /* | 159 | /* |
153 | * cpu_sa1100_set_pte(ptep, pte) | 160 | * cpu_sa1100_set_pte(ptep, pte) |
@@ -156,6 +163,7 @@ ENTRY(cpu_sa1100_switch_mm) | |||
156 | */ | 163 | */ |
157 | .align 5 | 164 | .align 5 |
158 | ENTRY(cpu_sa1100_set_pte) | 165 | ENTRY(cpu_sa1100_set_pte) |
166 | #ifdef CONFIG_MMU | ||
159 | str r1, [r0], #-2048 @ linux version | 167 | str r1, [r0], #-2048 @ linux version |
160 | 168 | ||
161 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | 169 | eor r1, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY |
@@ -177,6 +185,7 @@ ENTRY(cpu_sa1100_set_pte) | |||
177 | mov r0, r0 | 185 | mov r0, r0 |
178 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 186 | mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
179 | mcr p15, 0, r0, c7, c10, 4 @ drain WB | 187 | mcr p15, 0, r0, c7, c10, 4 @ drain WB |
188 | #endif | ||
180 | mov pc, lr | 189 | mov pc, lr |
181 | 190 | ||
182 | __INIT | 191 | __INIT |
@@ -186,7 +195,9 @@ __sa1100_setup: | |||
186 | mov r0, #0 | 195 | mov r0, #0 |
187 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 | 196 | mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4 |
188 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 | 197 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4 |
198 | #ifdef CONFIG_MMU | ||
189 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 | 199 | mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4 |
200 | #endif | ||
190 | mrc p15, 0, r0, c1, c0 @ get control register v4 | 201 | mrc p15, 0, r0, c1, c0 @ get control register v4 |
191 | ldr r5, sa1100_cr1_clear | 202 | ldr r5, sa1100_cr1_clear |
192 | bic r0, r0, r5 | 203 | bic r0, r0, r5 |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 09b1a41a6de8..ca13d4d05f65 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mm/proc-v6.S | 2 | * linux/arch/arm/mm/proc-v6.S |
3 | * | 3 | * |
4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. |
5 | * Modified by Catalin Marinas for noMMU support | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -88,6 +89,7 @@ ENTRY(cpu_v6_dcache_clean_area) | |||
88 | * - we are not using split page tables | 89 | * - we are not using split page tables |
89 | */ | 90 | */ |
90 | ENTRY(cpu_v6_switch_mm) | 91 | ENTRY(cpu_v6_switch_mm) |
92 | #ifdef CONFIG_MMU | ||
91 | mov r2, #0 | 93 | mov r2, #0 |
92 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | 94 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id |
93 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
@@ -97,6 +99,7 @@ ENTRY(cpu_v6_switch_mm) | |||
97 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer | 99 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer |
98 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | 100 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 |
99 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | 101 | mcr p15, 0, r1, c13, c0, 1 @ set context ID |
102 | #endif | ||
100 | mov pc, lr | 103 | mov pc, lr |
101 | 104 | ||
102 | /* | 105 | /* |
@@ -119,6 +122,7 @@ ENTRY(cpu_v6_switch_mm) | |||
119 | * 1111 0 1 1 r/w r/w | 122 | * 1111 0 1 1 r/w r/w |
120 | */ | 123 | */ |
121 | ENTRY(cpu_v6_set_pte) | 124 | ENTRY(cpu_v6_set_pte) |
125 | #ifdef CONFIG_MMU | ||
122 | str r1, [r0], #-2048 @ linux version | 126 | str r1, [r0], #-2048 @ linux version |
123 | 127 | ||
124 | bic r2, r1, #0x000003f0 | 128 | bic r2, r1, #0x000003f0 |
@@ -145,6 +149,7 @@ ENTRY(cpu_v6_set_pte) | |||
145 | 149 | ||
146 | str r2, [r0] | 150 | str r2, [r0] |
147 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | 151 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte |
152 | #endif | ||
148 | mov pc, lr | 153 | mov pc, lr |
149 | 154 | ||
150 | 155 | ||
@@ -194,12 +199,14 @@ __v6_setup: | |||
194 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | 199 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache |
195 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache | 200 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache |
196 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 201 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
202 | #ifdef CONFIG_MMU | ||
197 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | 203 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs |
198 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register | 204 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register |
199 | #ifdef CONFIG_SMP | 205 | #ifdef CONFIG_SMP |
200 | orr r4, r4, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable | 206 | orr r4, r4, #TTB_RGN_WBWA|TTB_S @ mark PTWs shared, outer cacheable |
201 | #endif | 207 | #endif |
202 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 | 208 | mcr p15, 0, r4, c2, c0, 1 @ load TTB1 |
209 | #endif /* CONFIG_MMU */ | ||
203 | #ifdef CONFIG_VFP | 210 | #ifdef CONFIG_VFP |
204 | mrc p15, 0, r0, c1, c0, 2 | 211 | mrc p15, 0, r0, c1, c0, 2 |
205 | orr r0, r0, #(0xf << 20) | 212 | orr r0, r0, #(0xf << 20) |
diff --git a/include/asm-arm/bugs.h b/include/asm-arm/bugs.h index 4c80ec519d45..ca54eb0f12d7 100644 --- a/include/asm-arm/bugs.h +++ b/include/asm-arm/bugs.h | |||
@@ -10,8 +10,12 @@ | |||
10 | #ifndef __ASM_BUGS_H | 10 | #ifndef __ASM_BUGS_H |
11 | #define __ASM_BUGS_H | 11 | #define __ASM_BUGS_H |
12 | 12 | ||
13 | #ifdef CONFIG_MMU | ||
13 | extern void check_writebuffer_bugs(void); | 14 | extern void check_writebuffer_bugs(void); |
14 | 15 | ||
15 | #define check_bugs() check_writebuffer_bugs() | 16 | #define check_bugs() check_writebuffer_bugs() |
17 | #else | ||
18 | #define check_bugs() do { } while (0) | ||
19 | #endif | ||
16 | 20 | ||
17 | #endif | 21 | #endif |
diff --git a/include/asm-arm/domain.h b/include/asm-arm/domain.h index f8ea2de4848e..4c2885abbe6c 100644 --- a/include/asm-arm/domain.h +++ b/include/asm-arm/domain.h | |||
@@ -50,6 +50,8 @@ | |||
50 | #define domain_val(dom,type) ((type) << (2*(dom))) | 50 | #define domain_val(dom,type) ((type) << (2*(dom))) |
51 | 51 | ||
52 | #ifndef __ASSEMBLY__ | 52 | #ifndef __ASSEMBLY__ |
53 | |||
54 | #ifdef CONFIG_MMU | ||
53 | #define set_domain(x) \ | 55 | #define set_domain(x) \ |
54 | do { \ | 56 | do { \ |
55 | __asm__ __volatile__( \ | 57 | __asm__ __volatile__( \ |
@@ -66,5 +68,10 @@ | |||
66 | set_domain(thread->cpu_domain); \ | 68 | set_domain(thread->cpu_domain); \ |
67 | } while (0) | 69 | } while (0) |
68 | 70 | ||
71 | #else | ||
72 | #define set_domain(x) do { } while (0) | ||
73 | #define modify_domain(dom,type) do { } while (0) | ||
74 | #endif | ||
75 | |||
69 | #endif | 76 | #endif |
70 | #endif /* !__ASSEMBLY__ */ | 77 | #endif /* !__ASSEMBLY__ */ |
diff --git a/include/asm-arm/mach/map.h b/include/asm-arm/mach/map.h index e8ea67c97c73..cef5364ed5fe 100644 --- a/include/asm-arm/mach/map.h +++ b/include/asm-arm/mach/map.h | |||
@@ -16,8 +16,6 @@ struct map_desc { | |||
16 | unsigned int type; | 16 | unsigned int type; |
17 | }; | 17 | }; |
18 | 18 | ||
19 | struct meminfo; | ||
20 | |||
21 | #define MT_DEVICE 0 | 19 | #define MT_DEVICE 0 |
22 | #define MT_CACHECLEAN 1 | 20 | #define MT_CACHECLEAN 1 |
23 | #define MT_MINICLEAN 2 | 21 | #define MT_MINICLEAN 2 |
@@ -28,7 +26,8 @@ struct meminfo; | |||
28 | #define MT_IXP2000_DEVICE 7 | 26 | #define MT_IXP2000_DEVICE 7 |
29 | #define MT_NONSHARED_DEVICE 8 | 27 | #define MT_NONSHARED_DEVICE 8 |
30 | 28 | ||
31 | extern void create_memmap_holes(struct meminfo *); | 29 | #ifdef CONFIG_MMU |
32 | extern void memtable_init(struct meminfo *); | ||
33 | extern void iotable_init(struct map_desc *, int); | 30 | extern void iotable_init(struct map_desc *, int); |
34 | extern void setup_io_desc(void); | 31 | #else |
32 | #define iotable_init(map,num) do { } while (0) | ||
33 | #endif | ||
diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h index 731e321a57d1..94f973b704f1 100644 --- a/include/asm-arm/memory.h +++ b/include/asm-arm/memory.h | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/include/asm-arm/memory.h | 2 | * linux/include/asm-arm/memory.h |
3 | * | 3 | * |
4 | * Copyright (C) 2000-2002 Russell King | 4 | * Copyright (C) 2000-2002 Russell King |
5 | * modification for nommu, Hyok S. Choi, 2004 | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
@@ -26,6 +27,8 @@ | |||
26 | #include <asm/arch/memory.h> | 27 | #include <asm/arch/memory.h> |
27 | #include <asm/sizes.h> | 28 | #include <asm/sizes.h> |
28 | 29 | ||
30 | #ifdef CONFIG_MMU | ||
31 | |||
29 | #ifndef TASK_SIZE | 32 | #ifndef TASK_SIZE |
30 | /* | 33 | /* |
31 | * TASK_SIZE - the maximum size of a user space task. | 34 | * TASK_SIZE - the maximum size of a user space task. |
@@ -48,6 +51,60 @@ | |||
48 | #endif | 51 | #endif |
49 | 52 | ||
50 | /* | 53 | /* |
54 | * The module space lives between the addresses given by TASK_SIZE | ||
55 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. | ||
56 | */ | ||
57 | #define MODULE_END (PAGE_OFFSET) | ||
58 | #define MODULE_START (MODULE_END - 16*1048576) | ||
59 | |||
60 | #if TASK_SIZE > MODULE_START | ||
61 | #error Top of user space clashes with start of module space | ||
62 | #endif | ||
63 | |||
64 | /* | ||
65 | * The XIP kernel gets mapped at the bottom of the module vm area. | ||
66 | * Since we use sections to map it, this macro replaces the physical address | ||
67 | * with its virtual address while keeping offset from the base section. | ||
68 | */ | ||
69 | #define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) | ||
70 | |||
71 | #else /* CONFIG_MMU */ | ||
72 | |||
73 | /* | ||
74 | * The limitation of user task size can grow up to the end of free ram region. | ||
75 | * It is difficult to define and perhaps will never meet the original meaning | ||
76 | * of this define that was meant to. | ||
77 | * Fortunately, there is no reference for this in noMMU mode, for now. | ||
78 | */ | ||
79 | #ifndef TASK_SIZE | ||
80 | #define TASK_SIZE (CONFIG_DRAM_SIZE) | ||
81 | #endif | ||
82 | |||
83 | #ifndef TASK_UNMAPPED_BASE | ||
84 | #define TASK_UNMAPPED_BASE UL(0x00000000) | ||
85 | #endif | ||
86 | |||
87 | #ifndef PHYS_OFFSET | ||
88 | #define PHYS_OFFSET (CONFIG_DRAM_BASE) | ||
89 | #endif | ||
90 | |||
91 | #ifndef END_MEM | ||
92 | #define END_MEM (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE) | ||
93 | #endif | ||
94 | |||
95 | #ifndef PAGE_OFFSET | ||
96 | #define PAGE_OFFSET (PHYS_OFFSET) | ||
97 | #endif | ||
98 | |||
99 | /* | ||
100 | * The module can be at any place in ram in nommu mode. | ||
101 | */ | ||
102 | #define MODULE_END (END_MEM) | ||
103 | #define MODULE_START (PHYS_OFFSET) | ||
104 | |||
105 | #endif /* !CONFIG_MMU */ | ||
106 | |||
107 | /* | ||
51 | * Size of DMA-consistent memory region. Must be multiple of 2M, | 108 | * Size of DMA-consistent memory region. Must be multiple of 2M, |
52 | * between 2MB and 14MB inclusive. | 109 | * between 2MB and 14MB inclusive. |
53 | */ | 110 | */ |
@@ -71,24 +128,6 @@ | |||
71 | #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) | 128 | #define __phys_to_pfn(paddr) ((paddr) >> PAGE_SHIFT) |
72 | #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) | 129 | #define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) |
73 | 130 | ||
74 | /* | ||
75 | * The module space lives between the addresses given by TASK_SIZE | ||
76 | * and PAGE_OFFSET - it must be within 32MB of the kernel text. | ||
77 | */ | ||
78 | #define MODULE_END (PAGE_OFFSET) | ||
79 | #define MODULE_START (MODULE_END - 16*1048576) | ||
80 | |||
81 | #if TASK_SIZE > MODULE_START | ||
82 | #error Top of user space clashes with start of module space | ||
83 | #endif | ||
84 | |||
85 | /* | ||
86 | * The XIP kernel gets mapped at the bottom of the module vm area. | ||
87 | * Since we use sections to map it, this macro replaces the physical address | ||
88 | * with its virtual address while keeping offset from the base section. | ||
89 | */ | ||
90 | #define XIP_VIRT_ADDR(physaddr) (MODULE_START + ((physaddr) & 0x000fffff)) | ||
91 | |||
92 | #ifndef __ASSEMBLY__ | 131 | #ifndef __ASSEMBLY__ |
93 | 132 | ||
94 | /* | 133 | /* |
diff --git a/include/asm-arm/mmu.h b/include/asm-arm/mmu.h index a457cb71984f..23dde52e0945 100644 --- a/include/asm-arm/mmu.h +++ b/include/asm-arm/mmu.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __ARM_MMU_H | 1 | #ifndef __ARM_MMU_H |
2 | #define __ARM_MMU_H | 2 | #define __ARM_MMU_H |
3 | 3 | ||
4 | #ifdef CONFIG_MMU | ||
5 | |||
4 | typedef struct { | 6 | typedef struct { |
5 | #if __LINUX_ARM_ARCH__ >= 6 | 7 | #if __LINUX_ARM_ARCH__ >= 6 |
6 | unsigned int id; | 8 | unsigned int id; |
@@ -13,4 +15,18 @@ typedef struct { | |||
13 | #define ASID(mm) (0) | 15 | #define ASID(mm) (0) |
14 | #endif | 16 | #endif |
15 | 17 | ||
18 | #else | ||
19 | |||
20 | /* | ||
21 | * From nommu.h: | ||
22 | * Copyright (C) 2002, David McCullough <davidm@snapgear.com> | ||
23 | * modified for 2.6 by Hyok S. Choi <hyok.choi@samsung.com> | ||
24 | */ | ||
25 | typedef struct { | ||
26 | struct vm_list_struct *vmlist; | ||
27 | unsigned long end_brk; | ||
28 | } mm_context_t; | ||
29 | |||
30 | #endif | ||
31 | |||
16 | #endif | 32 | #endif |
diff --git a/include/asm-arm/mmu_context.h b/include/asm-arm/mmu_context.h index 81c59facea3b..9fadb01e030d 100644 --- a/include/asm-arm/mmu_context.h +++ b/include/asm-arm/mmu_context.h | |||
@@ -82,6 +82,7 @@ static inline void | |||
82 | switch_mm(struct mm_struct *prev, struct mm_struct *next, | 82 | switch_mm(struct mm_struct *prev, struct mm_struct *next, |
83 | struct task_struct *tsk) | 83 | struct task_struct *tsk) |
84 | { | 84 | { |
85 | #ifdef CONFIG_MMU | ||
85 | unsigned int cpu = smp_processor_id(); | 86 | unsigned int cpu = smp_processor_id(); |
86 | 87 | ||
87 | if (prev != next) { | 88 | if (prev != next) { |
@@ -91,6 +92,7 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
91 | if (cache_is_vivt()) | 92 | if (cache_is_vivt()) |
92 | cpu_clear(cpu, prev->cpu_vm_mask); | 93 | cpu_clear(cpu, prev->cpu_vm_mask); |
93 | } | 94 | } |
95 | #endif | ||
94 | } | 96 | } |
95 | 97 | ||
96 | #define deactivate_mm(tsk,mm) do { } while (0) | 98 | #define deactivate_mm(tsk,mm) do { } while (0) |
diff --git a/include/asm-arm/page-nommu.h b/include/asm-arm/page-nommu.h new file mode 100644 index 000000000000..a1bcad060480 --- /dev/null +++ b/include/asm-arm/page-nommu.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/page-nommu.h | ||
3 | * | ||
4 | * Copyright (C) 2004 Hyok S. Choi | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef _ASMARM_PAGE_NOMMU_H | ||
11 | #define _ASMARM_PAGE_NOMMU_H | ||
12 | |||
13 | #if !defined(CONFIG_SMALL_TASKS) && PAGE_SHIFT < 13 | ||
14 | #define KTHREAD_SIZE (8192) | ||
15 | #else | ||
16 | #define KTHREAD_SIZE PAGE_SIZE | ||
17 | #endif | ||
18 | |||
19 | #define get_user_page(vaddr) __get_free_page(GFP_KERNEL) | ||
20 | #define free_user_page(page, addr) free_page(addr) | ||
21 | |||
22 | #define clear_page(page) memset((page), 0, PAGE_SIZE) | ||
23 | #define copy_page(to,from) memcpy((to), (from), PAGE_SIZE) | ||
24 | |||
25 | #define clear_user_page(page, vaddr, pg) clear_page(page) | ||
26 | #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) | ||
27 | |||
28 | /* | ||
29 | * These are used to make use of C type-checking.. | ||
30 | */ | ||
31 | typedef unsigned long pte_t; | ||
32 | typedef unsigned long pmd_t; | ||
33 | typedef unsigned long pgd_t[2]; | ||
34 | typedef unsigned long pgprot_t; | ||
35 | |||
36 | #define pte_val(x) (x) | ||
37 | #define pmd_val(x) (x) | ||
38 | #define pgd_val(x) ((x)[0]) | ||
39 | #define pgprot_val(x) (x) | ||
40 | |||
41 | #define __pte(x) (x) | ||
42 | #define __pmd(x) (x) | ||
43 | #define __pgprot(x) (x) | ||
44 | |||
45 | /* to align the pointer to the (next) page boundary */ | ||
46 | #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) | ||
47 | |||
48 | extern unsigned long memory_start; | ||
49 | extern unsigned long memory_end; | ||
50 | |||
51 | #endif | ||
diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h index 66cfeb5290ea..63d12f0244c5 100644 --- a/include/asm-arm/page.h +++ b/include/asm-arm/page.h | |||
@@ -23,6 +23,12 @@ | |||
23 | 23 | ||
24 | #ifndef __ASSEMBLY__ | 24 | #ifndef __ASSEMBLY__ |
25 | 25 | ||
26 | #ifndef CONFIG_MMU | ||
27 | |||
28 | #include "page-nommu.h" | ||
29 | |||
30 | #else | ||
31 | |||
26 | #include <asm/glue.h> | 32 | #include <asm/glue.h> |
27 | 33 | ||
28 | /* | 34 | /* |
@@ -171,6 +177,8 @@ typedef unsigned long pgprot_t; | |||
171 | /* the upper-most page table pointer */ | 177 | /* the upper-most page table pointer */ |
172 | extern pmd_t *top_pmd; | 178 | extern pmd_t *top_pmd; |
173 | 179 | ||
180 | #endif /* CONFIG_MMU */ | ||
181 | |||
174 | #include <asm/memory.h> | 182 | #include <asm/memory.h> |
175 | 183 | ||
176 | #endif /* !__ASSEMBLY__ */ | 184 | #endif /* !__ASSEMBLY__ */ |
diff --git a/include/asm-arm/pgalloc.h b/include/asm-arm/pgalloc.h index c4ac2e67768d..4d4394552911 100644 --- a/include/asm-arm/pgalloc.h +++ b/include/asm-arm/pgalloc.h | |||
@@ -16,6 +16,10 @@ | |||
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/tlbflush.h> | 17 | #include <asm/tlbflush.h> |
18 | 18 | ||
19 | #define check_pgt_cache() do { } while (0) | ||
20 | |||
21 | #ifdef CONFIG_MMU | ||
22 | |||
19 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | 23 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) |
20 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | 24 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) |
21 | 25 | ||
@@ -32,8 +36,6 @@ extern void free_pgd_slow(pgd_t *pgd); | |||
32 | #define pgd_alloc(mm) get_pgd_slow(mm) | 36 | #define pgd_alloc(mm) get_pgd_slow(mm) |
33 | #define pgd_free(pgd) free_pgd_slow(pgd) | 37 | #define pgd_free(pgd) free_pgd_slow(pgd) |
34 | 38 | ||
35 | #define check_pgt_cache() do { } while (0) | ||
36 | |||
37 | /* | 39 | /* |
38 | * Allocate one PTE table. | 40 | * Allocate one PTE table. |
39 | * | 41 | * |
@@ -126,4 +128,6 @@ pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep) | |||
126 | __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); | 128 | __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); |
127 | } | 129 | } |
128 | 130 | ||
131 | #endif /* CONFIG_MMU */ | ||
132 | |||
129 | #endif | 133 | #endif |
diff --git a/include/asm-arm/pgtable-nommu.h b/include/asm-arm/pgtable-nommu.h new file mode 100644 index 000000000000..b13322dccf41 --- /dev/null +++ b/include/asm-arm/pgtable-nommu.h | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/pgtable-nommu.h | ||
3 | * | ||
4 | * Copyright (C) 1995-2002 Russell King | ||
5 | * Copyright (C) 2004 Hyok S. Choi | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #ifndef _ASMARM_PGTABLE_NOMMU_H | ||
12 | #define _ASMARM_PGTABLE_NOMMU_H | ||
13 | |||
14 | #ifndef __ASSEMBLY__ | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <asm/processor.h> | ||
19 | #include <asm/page.h> | ||
20 | #include <asm/io.h> | ||
21 | |||
22 | /* | ||
23 | * Trivial page table functions. | ||
24 | */ | ||
25 | #define pgd_present(pgd) (1) | ||
26 | #define pgd_none(pgd) (0) | ||
27 | #define pgd_bad(pgd) (0) | ||
28 | #define pgd_clear(pgdp) | ||
29 | #define kern_addr_valid(addr) (1) | ||
30 | #define pmd_offset(a, b) ((void *)0) | ||
31 | /* FIXME */ | ||
32 | /* | ||
33 | * PMD_SHIFT determines the size of the area a second-level page table can map | ||
34 | * PGDIR_SHIFT determines what a third-level page table entry can map | ||
35 | */ | ||
36 | #define PGDIR_SHIFT 21 | ||
37 | |||
38 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
39 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | ||
40 | /* FIXME */ | ||
41 | |||
42 | #define PAGE_NONE __pgprot(0) | ||
43 | #define PAGE_SHARED __pgprot(0) | ||
44 | #define PAGE_COPY __pgprot(0) | ||
45 | #define PAGE_READONLY __pgprot(0) | ||
46 | #define PAGE_KERNEL __pgprot(0) | ||
47 | |||
48 | //extern void paging_init(struct meminfo *, struct machine_desc *); | ||
49 | #define swapper_pg_dir ((pgd_t *) 0) | ||
50 | |||
51 | #define __swp_type(x) (0) | ||
52 | #define __swp_offset(x) (0) | ||
53 | #define __swp_entry(typ,off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) | ||
54 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | ||
55 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | ||
56 | |||
57 | |||
58 | typedef pte_t *pte_addr_t; | ||
59 | |||
60 | static inline int pte_file(pte_t pte) { return 0; } | ||
61 | |||
62 | /* | ||
63 | * ZERO_PAGE is a global shared page that is always zero: used | ||
64 | * for zero-mapped memory areas etc.. | ||
65 | */ | ||
66 | #define ZERO_PAGE(vaddr) (virt_to_page(0)) | ||
67 | |||
68 | /* | ||
69 | * Mark the prot value as uncacheable and unbufferable. | ||
70 | */ | ||
71 | #define pgprot_noncached(prot) __pgprot(0) | ||
72 | #define pgprot_writecombine(prot) __pgprot(0) | ||
73 | |||
74 | |||
75 | /* | ||
76 | * These would be in other places but having them here reduces the diffs. | ||
77 | */ | ||
78 | extern unsigned int kobjsize(const void *objp); | ||
79 | extern int is_in_rom(unsigned long); | ||
80 | |||
81 | /* | ||
82 | * No page table caches to initialise. | ||
83 | */ | ||
84 | #define pgtable_cache_init() do { } while (0) | ||
85 | #define io_remap_page_range remap_page_range | ||
86 | #define io_remap_pfn_range remap_pfn_range | ||
87 | |||
88 | #define MK_IOSPACE_PFN(space, pfn) (pfn) | ||
89 | #define GET_IOSPACE(pfn) 0 | ||
90 | #define GET_PFN(pfn) (pfn) | ||
91 | |||
92 | |||
93 | /* | ||
94 | * All 32bit addresses are effectively valid for vmalloc... | ||
95 | * Sort of meaningless for non-VM targets. | ||
96 | */ | ||
97 | #define VMALLOC_START 0 | ||
98 | #define VMALLOC_END 0xffffffff | ||
99 | |||
100 | #define FIRST_USER_ADDRESS (0) | ||
101 | |||
102 | #else | ||
103 | |||
104 | /* | ||
105 | * dummy tlb and user structures. | ||
106 | */ | ||
107 | #define v3_tlb_fns (0) | ||
108 | #define v4_tlb_fns (0) | ||
109 | #define v4wb_tlb_fns (0) | ||
110 | #define v4wbi_tlb_fns (0) | ||
111 | #define v6_tlb_fns (0) | ||
112 | |||
113 | #define v3_user_fns (0) | ||
114 | #define v4_user_fns (0) | ||
115 | #define v4_mc_user_fns (0) | ||
116 | #define v4wb_user_fns (0) | ||
117 | #define v4wt_user_fns (0) | ||
118 | #define v6_user_fns (0) | ||
119 | #define xscale_mc_user_fns (0) | ||
120 | |||
121 | #endif /*__ASSEMBLY__*/ | ||
122 | |||
123 | #endif /* _ASMARM_PGTABLE_H */ | ||
diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index e85c08d78dda..8d3919c6458c 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h | |||
@@ -11,9 +11,15 @@ | |||
11 | #define _ASMARM_PGTABLE_H | 11 | #define _ASMARM_PGTABLE_H |
12 | 12 | ||
13 | #include <asm-generic/4level-fixup.h> | 13 | #include <asm-generic/4level-fixup.h> |
14 | #include <asm/proc-fns.h> | ||
15 | |||
16 | #ifndef CONFIG_MMU | ||
17 | |||
18 | #include "pgtable-nommu.h" | ||
19 | |||
20 | #else | ||
14 | 21 | ||
15 | #include <asm/memory.h> | 22 | #include <asm/memory.h> |
16 | #include <asm/proc-fns.h> | ||
17 | #include <asm/arch/vmalloc.h> | 23 | #include <asm/arch/vmalloc.h> |
18 | 24 | ||
19 | /* | 25 | /* |
@@ -378,4 +384,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
378 | 384 | ||
379 | #endif /* !__ASSEMBLY__ */ | 385 | #endif /* !__ASSEMBLY__ */ |
380 | 386 | ||
387 | #endif /* CONFIG_MMU */ | ||
388 | |||
381 | #endif /* _ASMARM_PGTABLE_H */ | 389 | #endif /* _ASMARM_PGTABLE_H */ |
diff --git a/include/asm-arm/proc-fns.h b/include/asm-arm/proc-fns.h index e9310895e79d..1bde92cdaebd 100644 --- a/include/asm-arm/proc-fns.h +++ b/include/asm-arm/proc-fns.h | |||
@@ -165,6 +165,8 @@ | |||
165 | 165 | ||
166 | #include <asm/memory.h> | 166 | #include <asm/memory.h> |
167 | 167 | ||
168 | #ifdef CONFIG_MMU | ||
169 | |||
168 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) | 170 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) |
169 | 171 | ||
170 | #define cpu_get_pgd() \ | 172 | #define cpu_get_pgd() \ |
@@ -176,6 +178,8 @@ | |||
176 | (pgd_t *)phys_to_virt(pg); \ | 178 | (pgd_t *)phys_to_virt(pg); \ |
177 | }) | 179 | }) |
178 | 180 | ||
181 | #endif | ||
182 | |||
179 | #endif /* __ASSEMBLY__ */ | 183 | #endif /* __ASSEMBLY__ */ |
180 | #endif /* __KERNEL__ */ | 184 | #endif /* __KERNEL__ */ |
181 | #endif /* __ASM_PROCFNS_H */ | 185 | #endif /* __ASM_PROCFNS_H */ |
diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h index f909dc75301a..87aba57a66c4 100644 --- a/include/asm-arm/uaccess.h +++ b/include/asm-arm/uaccess.h | |||
@@ -41,15 +41,24 @@ struct exception_table_entry | |||
41 | extern int fixup_exception(struct pt_regs *regs); | 41 | extern int fixup_exception(struct pt_regs *regs); |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * These two are intentionally not defined anywhere - if the kernel | ||
45 | * code generates any references to them, that's a bug. | ||
46 | */ | ||
47 | extern int __get_user_bad(void); | ||
48 | extern int __put_user_bad(void); | ||
49 | |||
50 | /* | ||
44 | * Note that this is actually 0x1,0000,0000 | 51 | * Note that this is actually 0x1,0000,0000 |
45 | */ | 52 | */ |
46 | #define KERNEL_DS 0x00000000 | 53 | #define KERNEL_DS 0x00000000 |
47 | #define USER_DS TASK_SIZE | ||
48 | |||
49 | #define get_ds() (KERNEL_DS) | 54 | #define get_ds() (KERNEL_DS) |
55 | |||
56 | #ifdef CONFIG_MMU | ||
57 | |||
58 | #define USER_DS TASK_SIZE | ||
50 | #define get_fs() (current_thread_info()->addr_limit) | 59 | #define get_fs() (current_thread_info()->addr_limit) |
51 | 60 | ||
52 | static inline void set_fs (mm_segment_t fs) | 61 | static inline void set_fs(mm_segment_t fs) |
53 | { | 62 | { |
54 | current_thread_info()->addr_limit = fs; | 63 | current_thread_info()->addr_limit = fs; |
55 | modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); | 64 | modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); |
@@ -75,8 +84,6 @@ static inline void set_fs (mm_segment_t fs) | |||
75 | : "cc"); \ | 84 | : "cc"); \ |
76 | flag; }) | 85 | flag; }) |
77 | 86 | ||
78 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | ||
79 | |||
80 | /* | 87 | /* |
81 | * Single-value transfer routines. They automatically use the right | 88 | * Single-value transfer routines. They automatically use the right |
82 | * size if we just have the right pointer type. Note that the functions | 89 | * size if we just have the right pointer type. Note that the functions |
@@ -87,20 +94,10 @@ static inline void set_fs (mm_segment_t fs) | |||
87 | * fixup code, but there are a few places where it intrudes on the | 94 | * fixup code, but there are a few places where it intrudes on the |
88 | * main code path. When we only write to user space, there is no | 95 | * main code path. When we only write to user space, there is no |
89 | * problem. | 96 | * problem. |
90 | * | ||
91 | * The "__xxx" versions of the user access functions do not verify the | ||
92 | * address space - it must have been done previously with a separate | ||
93 | * "access_ok()" call. | ||
94 | * | ||
95 | * The "xxx_error" versions set the third argument to EFAULT if an | ||
96 | * error occurs, and leave it unchanged on success. Note that these | ||
97 | * versions are void (ie, don't return a value as such). | ||
98 | */ | 97 | */ |
99 | |||
100 | extern int __get_user_1(void *); | 98 | extern int __get_user_1(void *); |
101 | extern int __get_user_2(void *); | 99 | extern int __get_user_2(void *); |
102 | extern int __get_user_4(void *); | 100 | extern int __get_user_4(void *); |
103 | extern int __get_user_bad(void); | ||
104 | 101 | ||
105 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ | 102 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ |
106 | __asm__ __volatile__ ( \ | 103 | __asm__ __volatile__ ( \ |
@@ -131,6 +128,74 @@ extern int __get_user_bad(void); | |||
131 | __e; \ | 128 | __e; \ |
132 | }) | 129 | }) |
133 | 130 | ||
131 | extern int __put_user_1(void *, unsigned int); | ||
132 | extern int __put_user_2(void *, unsigned int); | ||
133 | extern int __put_user_4(void *, unsigned int); | ||
134 | extern int __put_user_8(void *, unsigned long long); | ||
135 | |||
136 | #define __put_user_x(__r2,__p,__e,__s) \ | ||
137 | __asm__ __volatile__ ( \ | ||
138 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ | ||
139 | "bl __put_user_" #__s \ | ||
140 | : "=&r" (__e) \ | ||
141 | : "0" (__p), "r" (__r2) \ | ||
142 | : "ip", "lr", "cc") | ||
143 | |||
144 | #define put_user(x,p) \ | ||
145 | ({ \ | ||
146 | const register typeof(*(p)) __r2 asm("r2") = (x); \ | ||
147 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ | ||
148 | register int __e asm("r0"); \ | ||
149 | switch (sizeof(*(__p))) { \ | ||
150 | case 1: \ | ||
151 | __put_user_x(__r2, __p, __e, 1); \ | ||
152 | break; \ | ||
153 | case 2: \ | ||
154 | __put_user_x(__r2, __p, __e, 2); \ | ||
155 | break; \ | ||
156 | case 4: \ | ||
157 | __put_user_x(__r2, __p, __e, 4); \ | ||
158 | break; \ | ||
159 | case 8: \ | ||
160 | __put_user_x(__r2, __p, __e, 8); \ | ||
161 | break; \ | ||
162 | default: __e = __put_user_bad(); break; \ | ||
163 | } \ | ||
164 | __e; \ | ||
165 | }) | ||
166 | |||
167 | #else /* CONFIG_MMU */ | ||
168 | |||
169 | /* | ||
170 | * uClinux has only one addr space, so has simplified address limits. | ||
171 | */ | ||
172 | #define USER_DS KERNEL_DS | ||
173 | |||
174 | #define segment_eq(a,b) (1) | ||
175 | #define __addr_ok(addr) (1) | ||
176 | #define __range_ok(addr,size) (0) | ||
177 | #define get_fs() (KERNEL_DS) | ||
178 | |||
179 | static inline void set_fs(mm_segment_t fs) | ||
180 | { | ||
181 | } | ||
182 | |||
183 | #define get_user(x,p) __get_user(x,p) | ||
184 | #define put_user(x,p) __put_user(x,p) | ||
185 | |||
186 | #endif /* CONFIG_MMU */ | ||
187 | |||
188 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | ||
189 | |||
190 | /* | ||
191 | * The "__xxx" versions of the user access functions do not verify the | ||
192 | * address space - it must have been done previously with a separate | ||
193 | * "access_ok()" call. | ||
194 | * | ||
195 | * The "xxx_error" versions set the third argument to EFAULT if an | ||
196 | * error occurs, and leave it unchanged on success. Note that these | ||
197 | * versions are void (ie, don't return a value as such). | ||
198 | */ | ||
134 | #define __get_user(x,ptr) \ | 199 | #define __get_user(x,ptr) \ |
135 | ({ \ | 200 | ({ \ |
136 | long __gu_err = 0; \ | 201 | long __gu_err = 0; \ |
@@ -212,43 +277,6 @@ do { \ | |||
212 | : "r" (addr), "i" (-EFAULT) \ | 277 | : "r" (addr), "i" (-EFAULT) \ |
213 | : "cc") | 278 | : "cc") |
214 | 279 | ||
215 | extern int __put_user_1(void *, unsigned int); | ||
216 | extern int __put_user_2(void *, unsigned int); | ||
217 | extern int __put_user_4(void *, unsigned int); | ||
218 | extern int __put_user_8(void *, unsigned long long); | ||
219 | extern int __put_user_bad(void); | ||
220 | |||
221 | #define __put_user_x(__r2,__p,__e,__s) \ | ||
222 | __asm__ __volatile__ ( \ | ||
223 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ | ||
224 | "bl __put_user_" #__s \ | ||
225 | : "=&r" (__e) \ | ||
226 | : "0" (__p), "r" (__r2) \ | ||
227 | : "ip", "lr", "cc") | ||
228 | |||
229 | #define put_user(x,p) \ | ||
230 | ({ \ | ||
231 | const register typeof(*(p)) __r2 asm("r2") = (x); \ | ||
232 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ | ||
233 | register int __e asm("r0"); \ | ||
234 | switch (sizeof(*(__p))) { \ | ||
235 | case 1: \ | ||
236 | __put_user_x(__r2, __p, __e, 1); \ | ||
237 | break; \ | ||
238 | case 2: \ | ||
239 | __put_user_x(__r2, __p, __e, 2); \ | ||
240 | break; \ | ||
241 | case 4: \ | ||
242 | __put_user_x(__r2, __p, __e, 4); \ | ||
243 | break; \ | ||
244 | case 8: \ | ||
245 | __put_user_x(__r2, __p, __e, 8); \ | ||
246 | break; \ | ||
247 | default: __e = __put_user_bad(); break; \ | ||
248 | } \ | ||
249 | __e; \ | ||
250 | }) | ||
251 | |||
252 | #define __put_user(x,ptr) \ | 280 | #define __put_user(x,ptr) \ |
253 | ({ \ | 281 | ({ \ |
254 | long __pu_err = 0; \ | 282 | long __pu_err = 0; \ |
@@ -354,9 +382,16 @@ do { \ | |||
354 | : "cc") | 382 | : "cc") |
355 | 383 | ||
356 | 384 | ||
385 | #ifdef CONFIG_MMU | ||
357 | extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); | 386 | extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); |
358 | extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); | 387 | extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); |
359 | extern unsigned long __clear_user(void __user *addr, unsigned long n); | 388 | extern unsigned long __clear_user(void __user *addr, unsigned long n); |
389 | #else | ||
390 | #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) | ||
391 | #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) | ||
392 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) | ||
393 | #endif | ||
394 | |||
360 | extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); | 395 | extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); |
361 | extern unsigned long __strnlen_user(const char __user *s, long n); | 396 | extern unsigned long __strnlen_user(const char __user *s, long n); |
362 | 397 | ||