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 | ||
