aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/kernel/process.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds_cb1@t-online.de>2008-04-23 15:06:15 -0400
committerBryan Wu <cooloney@kernel.org>2008-04-23 15:06:15 -0400
commitd5adb029efad3c51db376d620319abe65d1efc21 (patch)
tree660caff4c28e904f00a040c0ed4a17d5010c6f20 /arch/blackfin/kernel/process.c
parent1ebc723cf04b55e7aeeec2e758293575d29a9c2b (diff)
[Blackfin] arch: This allows XIP to work with FD-PIC.
Previously, init failed to do anything meaningful; it turns out that the reason is that FD-PIC has a readonly data section which can be located in the XIP filesystem, and various address checks in the kernel reject such addresses for syscall arguments. Hence, init's execve ("/bin/sh", ...) failed with error code EFAULT. There's room for improvement here: in case people want to have filesystems on flash rather than in main memory, _access_ok should be modified to allow this. This bug fix is also dedicated to Michael Hennerich. Signed-off-by: Bernd Schmidt <bernds_cb1@t-online.de> Signed-off-by: Bryan Wu <cooloney@kernel.org>
Diffstat (limited to 'arch/blackfin/kernel/process.c')
-rw-r--r--arch/blackfin/kernel/process.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c
index fb94cbeafad6..be9fdd00d7cb 100644
--- a/arch/blackfin/kernel/process.c
+++ b/arch/blackfin/kernel/process.c
@@ -324,6 +324,12 @@ int _access_ok(unsigned long addr, unsigned long size)
324 return 1; 324 return 1;
325 if (addr >= memory_mtd_end && (addr + size) <= physical_mem_end) 325 if (addr >= memory_mtd_end && (addr + size) <= physical_mem_end)
326 return 1; 326 return 1;
327
328#ifdef CONFIG_ROMFS_MTD_FS
329 /* For XIP, allow user space to use pointers within the ROMFS. */
330 if (addr >= memory_mtd_start && (addr + size) <= memory_mtd_end)
331 return 1;
332#endif
327#else 333#else
328 if (addr >= memory_start && (addr + size) <= physical_mem_end) 334 if (addr >= memory_start && (addr + size) <= physical_mem_end)
329 return 1; 335 return 1;