Commit feb1ee75 authored by Greg Ungerer's avatar Greg Ungerer

m68k: use addr_limit checking for m68k CPUs that do no support address spaces

The ColdFire CPU family, and the original 68000, do not support separate
address spaces like the other 680x0 CPU types. Modify the set_fs()/get_fs()
functions and macros to use a thread_info addr_limit for address space
checking. This is pretty much what all other architectures that do not
support separate setable address spaces do.
Signed-off-by: default avatarAlexander Stein <alexander.stein@systec-electronic.com>
Signed-off-by: default avatarGreg Ungerer <gerg@uclinux.org>
Acked-by: default avatarMatt Waddel <mwaddel@yahoo.com>
Acked-by: default avatarKurt Mahan <kmahan@xmission.com>
parent e08d703c
...@@ -22,23 +22,26 @@ typedef struct { ...@@ -22,23 +22,26 @@ typedef struct {
} mm_segment_t; } mm_segment_t;
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
#define USER_DS MAKE_MM_SEG(__USER_DS)
#define KERNEL_DS MAKE_MM_SEG(__KERNEL_DS)
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
/* /*
* Get/set the SFC/DFC registers for MOVES instructions * Get/set the SFC/DFC registers for MOVES instructions
*/ */
#define USER_DS MAKE_MM_SEG(__USER_DS)
#define KERNEL_DS MAKE_MM_SEG(__KERNEL_DS)
static inline mm_segment_t get_fs(void) static inline mm_segment_t get_fs(void)
{ {
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
mm_segment_t _v; mm_segment_t _v;
__asm__ ("movec %/dfc,%0":"=r" (_v.seg):); __asm__ ("movec %/dfc,%0":"=r" (_v.seg):);
return _v; return _v;
#else }
return USER_DS;
#endif static inline void set_fs(mm_segment_t val)
{
__asm__ __volatile__ ("movec %0,%/sfc\n\t"
"movec %0,%/dfc\n\t"
: /* no outputs */ : "r" (val.seg) : "memory");
} }
static inline mm_segment_t get_ds(void) static inline mm_segment_t get_ds(void)
...@@ -47,14 +50,13 @@ static inline mm_segment_t get_ds(void) ...@@ -47,14 +50,13 @@ static inline mm_segment_t get_ds(void)
return KERNEL_DS; return KERNEL_DS;
} }
static inline void set_fs(mm_segment_t val) #else
{ #define USER_DS MAKE_MM_SEG(TASK_SIZE)
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
__asm__ __volatile__ ("movec %0,%/sfc\n\t" #define get_ds() (KERNEL_DS)
"movec %0,%/dfc\n\t" #define get_fs() (current_thread_info()->addr_limit)
: /* no outputs */ : "r" (val.seg) : "memory"); #define set_fs(x) (current_thread_info()->addr_limit = (x))
#endif #endif
}
#define segment_eq(a,b) ((a).seg == (b).seg) #define segment_eq(a,b) ((a).seg == (b).seg)
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <asm/types.h> #include <asm/types.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/segment.h>
/* /*
* On machines with 4k pages we default to an 8k thread size, though we * On machines with 4k pages we default to an 8k thread size, though we
...@@ -26,6 +27,7 @@ struct thread_info { ...@@ -26,6 +27,7 @@ struct thread_info {
struct task_struct *task; /* main task structure */ struct task_struct *task; /* main task structure */
unsigned long flags; unsigned long flags;
struct exec_domain *exec_domain; /* execution domain */ struct exec_domain *exec_domain; /* execution domain */
mm_segment_t addr_limit; /* thread address space */
int preempt_count; /* 0 => preemptable, <0 => BUG */ int preempt_count; /* 0 => preemptable, <0 => BUG */
__u32 cpu; /* should always be 0 on m68k */ __u32 cpu; /* should always be 0 on m68k */
unsigned long tp_value; /* thread pointer */ unsigned long tp_value; /* thread pointer */
...@@ -39,6 +41,7 @@ struct thread_info { ...@@ -39,6 +41,7 @@ struct thread_info {
{ \ { \
.task = &tsk, \ .task = &tsk, \
.exec_domain = &default_exec_domain, \ .exec_domain = &default_exec_domain, \
.addr_limit = KERNEL_DS, \
.preempt_count = INIT_PREEMPT_COUNT, \ .preempt_count = INIT_PREEMPT_COUNT, \
.restart_block = { \ .restart_block = { \
.fn = do_no_restart_syscall, \ .fn = do_no_restart_syscall, \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment