• G
    m68k: modify user space access functions to support ColdFire CPUs · e08d703c
    Greg Ungerer 提交于
    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: NGreg Ungerer <gerg@uclinux.org>
    Acked-by: NMatt Waddel <mwaddel@yahoo.com>
    Acked-by: NKurt Mahan <kmahan@xmission.com>
    Acked-by: NGeert Uytterhoeven <geert@linux-m68k.org>
    e08d703c
segment.h 1.2 KB
#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 */
反馈
建议
客服 返回
顶部