diff options
author | David Howells <dhowells@redhat.com> | 2010-04-06 14:35:09 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-07 08:38:05 -0700 |
commit | 08dc179b9b00cfbed006ae6f5d0e471ef79dc69c (patch) | |
tree | e16cc9ee894fdd78e6a427abc68060067c34f0fc | |
parent | ea56f411ec2d4d8689eb7f3bcd24e860acf87c47 (diff) |
frv: fix kernel/user segment handling in NOMMU mode
In NOMMU mode, the FRV segment handling is broken because KERNEL_DS ==
USER_DS. This causes tests of the following sort:
/* don't pin down non-user-based iovecs */
if (segment_eq(get_fs(), KERNEL_DS))
return NULL;
to malfunction.
To fix this, make USER_DS the top of RAM instead of the top of the non-IO
address space, and make KERNEL_DS one more than the top of the non-IO
address space.
Also get rid of FRV's __addr_ok() as nothing uses it.
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/frv/include/asm/segment.h | 6 | ||||
-rw-r--r-- | arch/frv/include/asm/uaccess.h | 2 |
2 files changed, 3 insertions, 5 deletions
diff --git a/arch/frv/include/asm/segment.h b/arch/frv/include/asm/segment.h index e3616a6f941d..a2320a4a0042 100644 --- a/arch/frv/include/asm/segment.h +++ b/arch/frv/include/asm/segment.h @@ -21,12 +21,12 @@ typedef struct { #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) -#define KERNEL_DS MAKE_MM_SEG(0xdfffffffUL) - #ifdef CONFIG_MMU #define USER_DS MAKE_MM_SEG(TASK_SIZE - 1) +#define KERNEL_DS MAKE_MM_SEG(0xdfffffffUL) #else -#define USER_DS KERNEL_DS +#define USER_DS MAKE_MM_SEG(memory_end) +#define KERNEL_DS MAKE_MM_SEG(0xe0000000UL) #endif #define get_ds() (KERNEL_DS) diff --git a/arch/frv/include/asm/uaccess.h b/arch/frv/include/asm/uaccess.h index 53650c958f41..0b67ec5b4414 100644 --- a/arch/frv/include/asm/uaccess.h +++ b/arch/frv/include/asm/uaccess.h @@ -27,8 +27,6 @@ #define VERIFY_READ 0 #define VERIFY_WRITE 1 -#define __addr_ok(addr) ((unsigned long)(addr) < get_addr_limit()) - /* * check that a range of addresses falls within the current address limit */ |