OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [include/] [asm-armnommu/] [segment.h] - Rev 1633

Go to most recent revision | Compare with Previous | Blame | View Log

#ifndef __ASM_ARM_SEGMENT_H
#define __ASM_ARM_SEGMENT_H
 
#define KERNEL_CS   0x0
#define KERNEL_DS   0x0
 
#define USER_CS     0x1
#define USER_DS     0x1
 
#ifndef __ASSEMBLY__
 
#ifdef NO_INLINE
#define __INLINE__
#else
#define __INLINE__ inline
#endif
 
#include <linux/sched.h>
 
/*
 * A better way to do this might be to pass to put/get user a flag
 * indicating the possibility of kernel memory accesses...  That
 * would allow gcc to optimize the following routines a bit better
 * than that which is possible at the moment.
 */
#define IS_USER_SEG (current->tss.fs != KERNEL_DS)
 
/*
 * Uh, these should become the main single-value transfer routines..
 * They automatically use the right size if we just have the right
 * pointer type..
 */
#define put_user(x,ptr) __put_user((unsigned long)(x),(ptr),sizeof(*(ptr)))
#define get_user(ptr) ((__typeof__(*(ptr)))__get_user((ptr),sizeof(*(ptr))))
 
/*
 * This is a silly but good way to make sure that
 * the __put_user function is indeed always optimized,
 * and that we use the correct sizes..
 */
extern int bad_user_access_length(void);
 
#ifdef __KERNEL__
 
#include <asm/proc/segment.h>
 
/*
 * these are depreciated..
 */
static __INLINE__ unsigned char get_user_byte(const char *addr)
{
	return __get_user(addr, 1);
}
 
#define get_fs_byte(addr) get_user_byte((char *)(addr))
 
static __INLINE__ unsigned short get_user_word(const short *addr)
{
	return __get_user(addr, 2);
}
 
#define get_fs_word(addr) get_user_word((short *)(addr))
 
static __INLINE__ unsigned long get_user_long(const long *addr)
{
	return __get_user(addr, 4);
}
 
#define get_fs_long(addr) get_user_long((long *)(addr))
 
static __INLINE__ void put_user_byte(char val,char *addr)
{
	__put_user(val, addr, 1);
}
 
#define put_fs_byte(x,addr) put_user_byte((x),(char *)(addr))
 
static __INLINE__ void put_user_word(short val,short *addr)
{
	__put_user(val, addr, 2);
}
 
#define put_fs_word(x,addr) put_user_word((x),(short *)(addr))
 
static __INLINE__ void put_user_long(long val,long *addr)
{
	__put_user(val, addr, 4);
}
 
#define put_fs_long(x,addr) put_user_long((x),(long *)(addr))
 
 
extern void memcpy_fromfs(void * to, const void * from, unsigned long n);
extern void __memcpy_tofs(void * to, const void * from, unsigned long n);
static __INLINE__ void memcpy_tofs(void *to, const void *from, unsigned long n)
{
	if(IS_USER_SEG)
		__memcpy_tofs(to, from, n);
	else
		memcpy(to, from, n);
}
 
static inline unsigned long get_fs(void)
{
	return current->tss.fs;
}
 
static inline unsigned long get_ds(void)
{
	return KERNEL_DS;
}
 
static inline void set_fs(unsigned long val)
{
	current->tss.fs = val;
}
 
#endif /* __KERNEL__ */
 
#endif /* __ASSEMBLY__ */
 
#endif /* __ASM_ARM_SEGMENT_H */
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.