e08d703cc2
Modify the user space access functions to support the ColdFire V4e cores running with MMU enabled. The ColdFire processors do not support the "moves" instruction used by the traditional 680x0 processors for moving data into and out of another address space. They only support the notion of a single address space, and you use the usual "move" instruction to access that. Create a new config symbol (CONFIG_CPU_HAS_ADDRESS_SPACES) to mark the CPU types that support separate address spaces, and thus also support the sfc/dfc registers and the "moves" instruction that go along with that. The code is almost identical for user space access, so lets just use a define to choose either the "move" or "moves" in the assembler code. Signed-off-by: Greg Ungerer <gerg@uclinux.org> Acked-by: Matt Waddel <mwaddel@yahoo.com> Acked-by: Kurt Mahan <kmahan@xmission.com> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
63 lines
1.2 KiB
C
63 lines
1.2 KiB
C
#ifndef _M68K_SEGMENT_H
|
|
#define _M68K_SEGMENT_H
|
|
|
|
/* define constants */
|
|
/* Address spaces (FC0-FC2) */
|
|
#define USER_DATA (1)
|
|
#ifndef __USER_DS
|
|
#define __USER_DS (USER_DATA)
|
|
#endif
|
|
#define USER_PROGRAM (2)
|
|
#define SUPER_DATA (5)
|
|
#ifndef __KERNEL_DS
|
|
#define __KERNEL_DS (SUPER_DATA)
|
|
#endif
|
|
#define SUPER_PROGRAM (6)
|
|
#define CPU_SPACE (7)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
typedef struct {
|
|
unsigned long seg;
|
|
} mm_segment_t;
|
|
|
|
#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)
|
|
|
|
/*
|
|
* Get/set the SFC/DFC registers for MOVES instructions
|
|
*/
|
|
|
|
static inline mm_segment_t get_fs(void)
|
|
{
|
|
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
|
|
mm_segment_t _v;
|
|
__asm__ ("movec %/dfc,%0":"=r" (_v.seg):);
|
|
|
|
return _v;
|
|
#else
|
|
return USER_DS;
|
|
#endif
|
|
}
|
|
|
|
static inline mm_segment_t get_ds(void)
|
|
{
|
|
/* return the supervisor data space code */
|
|
return KERNEL_DS;
|
|
}
|
|
|
|
static inline void set_fs(mm_segment_t val)
|
|
{
|
|
#ifdef CONFIG_CPU_HAS_ADDRESS_SPACES
|
|
__asm__ __volatile__ ("movec %0,%/sfc\n\t"
|
|
"movec %0,%/dfc\n\t"
|
|
: /* no outputs */ : "r" (val.seg) : "memory");
|
|
#endif
|
|
}
|
|
|
|
#define segment_eq(a,b) ((a).seg == (b).seg)
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* _M68K_SEGMENT_H */
|