2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2002 Jeff Dike ( jdike @ karaya . com )
* Licensed under the GPL
*/
# ifndef __UM_UACCESS_H
# define __UM_UACCESS_H
uml: header untangling
Untangle UML headers somewhat and add some includes where they were
needed explicitly, but gotten accidentally via some other header.
arch/um/include/um_uaccess.h loses asm/fixmap.h because it uses no
fixmap stuff and gains elf.h, because it needs FIXADDR_USER_*, and
archsetjmp.h, because it needs jmp_buf.
pmd_alloc_one is uninlined because it needs mm_struct, and that's
inconvenient to provide in asm-um/pgtable-3level.h.
elf_core_copy_fpregs is also uninlined from elf-i386.h and
elf-x86_64.h, which duplicated the code anyway, to
arch/um/kernel/process.c, so that the reference to current_thread
doesn't pull sched.h or anything related into asm/elf.h.
arch/um/sys-i386/ldt.c, arch/um/kernel/tlb.c and
arch/um/kernel/skas/uaccess.c got sched.h because they dereference
task_structs. Its includes of linux and asm headers got turned from
"" to <>.
arch/um/sys-i386/bug.c gets asm/errno.h because it needs errno
constants.
asm/elf-i386 gets asm/user.h because it needs user_regs_struct.
asm/fixmap.h gets page.h because it needs PAGE_SIZE and PAGE_MASK and
system.h for BUG_ON.
asm/pgtable doesn't need sched.h.
asm/processor-generic.h defined mm_segment_t, but didn't use it. So,
that definition is moved to uaccess.h, which defines a bunch of
mm_segment_t-related stuff. thread_info.h uses mm_segment_t, and
includes uaccess.h, which causes a recursion. So, the definition is
placed above the include of thread_info. in uaccess.h. thread_info.h
also gets page.h because it needs PAGE_SIZE.
ObCheckpatchViolationJustification - I'm not adding a typedef; I'm
moving mm_segment_t from one place to another.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-02-05 09:30:53 +03:00
# include <asm/errno.h>
# include <asm/processor.h>
/* thread_info has a mm_segment_t in it, so put the definition up here */
typedef struct {
unsigned long seg ;
} mm_segment_t ;
# include "linux/thread_info.h"
2005-04-17 02:20:36 +04:00
# define VERIFY_READ 0
# define VERIFY_WRITE 1
/*
* The fs value determines whether argument validity checking should be
* performed or not . If get_fs ( ) = = USER_DS , checking is performed , with
* get_fs ( ) = = KERNEL_DS , checking is bypassed .
*
* For historical reasons , these macros are grossly misnamed .
*/
# define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
# define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
# define USER_DS MAKE_MM_SEG(TASK_SIZE)
# define get_ds() (KERNEL_DS)
# define get_fs() (current_thread_info()->addr_limit)
# define set_fs(x) (current_thread_info()->addr_limit = (x))
# define segment_eq(a, b) ((a).seg == (b).seg)
# include "um_uaccess.h"
# define __copy_from_user(to, from, n) copy_from_user(to, from, n)
# define __copy_to_user(to, from, n) copy_to_user(to, from, n)
# define __copy_to_user_inatomic __copy_to_user
# define __copy_from_user_inatomic __copy_from_user
# define __get_user(x, ptr) \
( { \
2006-06-04 13:51:48 +04:00
const __typeof__ ( * ( ptr ) ) __user * __private_ptr = ( ptr ) ; \
2006-03-27 13:14:27 +04:00
__typeof__ ( x ) __private_val ; \
int __private_ret = - EFAULT ; \
( x ) = ( __typeof__ ( * ( __private_ptr ) ) ) 0 ; \
2006-06-04 13:51:48 +04:00
if ( __copy_from_user ( ( __force void * ) & __private_val , ( __private_ptr ) , \
2006-03-27 13:14:27 +04:00
sizeof ( * ( __private_ptr ) ) ) = = 0 ) { \
( x ) = ( __typeof__ ( * ( __private_ptr ) ) ) __private_val ; \
__private_ret = 0 ; \
} \
__private_ret ; \
2005-04-17 02:20:36 +04:00
} )
# define get_user(x, ptr) \
( { \
const __typeof__ ( ( * ( ptr ) ) ) __user * private_ptr = ( ptr ) ; \
( access_ok ( VERIFY_READ , private_ptr , sizeof ( * private_ptr ) ) ? \
2006-03-31 14:30:15 +04:00
__get_user ( x , private_ptr ) : ( ( x ) = ( __typeof__ ( * ptr ) ) 0 , - EFAULT ) ) ; \
2005-04-17 02:20:36 +04:00
} )
# define __put_user(x, ptr) \
( { \
2006-06-04 13:51:48 +04:00
__typeof__ ( * ( ptr ) ) __user * __private_ptr = ptr ; \
2005-04-17 02:20:36 +04:00
__typeof__ ( * ( __private_ptr ) ) __private_val ; \
int __private_ret = - EFAULT ; \
__private_val = ( __typeof__ ( * ( __private_ptr ) ) ) ( x ) ; \
if ( __copy_to_user ( ( __private_ptr ) , & __private_val , \
sizeof ( * ( __private_ptr ) ) ) = = 0 ) { \
__private_ret = 0 ; \
} \
__private_ret ; \
} )
# define put_user(x, ptr) \
( { \
__typeof__ ( * ( ptr ) ) __user * private_ptr = ( ptr ) ; \
( access_ok ( VERIFY_WRITE , private_ptr , sizeof ( * private_ptr ) ) ? \
__put_user ( x , private_ptr ) : - EFAULT ) ; \
} )
2007-10-16 12:26:56 +04:00
# define strlen_user(str) strnlen_user(str, ~0U >> 1)
2005-04-17 02:20:36 +04:00
struct exception_table_entry
{
unsigned long insn ;
unsigned long fixup ;
} ;
# endif