Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.15-rc3 102 lines 2.8 kB view raw
1/* 2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) 3 * Licensed under the GPL 4 */ 5 6#ifndef __UM_UACCESS_H 7#define __UM_UACCESS_H 8 9#include "linux/sched.h" 10 11#define VERIFY_READ 0 12#define VERIFY_WRITE 1 13 14/* 15 * The fs value determines whether argument validity checking should be 16 * performed or not. If get_fs() == USER_DS, checking is performed, with 17 * get_fs() == KERNEL_DS, checking is bypassed. 18 * 19 * For historical reasons, these macros are grossly misnamed. 20 */ 21 22#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) 23 24#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) 25#define USER_DS MAKE_MM_SEG(TASK_SIZE) 26 27#define get_ds() (KERNEL_DS) 28#define get_fs() (current_thread_info()->addr_limit) 29#define set_fs(x) (current_thread_info()->addr_limit = (x)) 30 31#define segment_eq(a, b) ((a).seg == (b).seg) 32 33#include "um_uaccess.h" 34 35#define __copy_from_user(to, from, n) copy_from_user(to, from, n) 36 37#define __copy_to_user(to, from, n) copy_to_user(to, from, n) 38 39#define __copy_to_user_inatomic __copy_to_user 40#define __copy_from_user_inatomic __copy_from_user 41 42#define __get_user(x, ptr) \ 43({ \ 44 const __typeof__(ptr) __private_ptr = ptr; \ 45 __typeof__(*(__private_ptr)) __private_val; \ 46 int __private_ret = -EFAULT; \ 47 (x) = (__typeof__(*(__private_ptr)))0; \ 48 if (__copy_from_user(&__private_val, (__private_ptr), \ 49 sizeof(*(__private_ptr))) == 0) {\ 50 (x) = (__typeof__(*(__private_ptr))) __private_val; \ 51 __private_ret = 0; \ 52 } \ 53 __private_ret; \ 54}) 55 56#define get_user(x, ptr) \ 57({ \ 58 const __typeof__((*(ptr))) __user *private_ptr = (ptr); \ 59 (access_ok(VERIFY_READ, private_ptr, sizeof(*private_ptr)) ? \ 60 __get_user(x, private_ptr) : ((x) = 0, -EFAULT)); \ 61}) 62 63#define __put_user(x, ptr) \ 64({ \ 65 __typeof__(ptr) __private_ptr = ptr; \ 66 __typeof__(*(__private_ptr)) __private_val; \ 67 int __private_ret = -EFAULT; \ 68 __private_val = (__typeof__(*(__private_ptr))) (x); \ 69 if (__copy_to_user((__private_ptr), &__private_val, \ 70 sizeof(*(__private_ptr))) == 0) { \ 71 __private_ret = 0; \ 72 } \ 73 __private_ret; \ 74}) 75 76#define put_user(x, ptr) \ 77({ \ 78 __typeof__(*(ptr)) __user *private_ptr = (ptr); \ 79 (access_ok(VERIFY_WRITE, private_ptr, sizeof(*private_ptr)) ? \ 80 __put_user(x, private_ptr) : -EFAULT); \ 81}) 82 83#define strlen_user(str) strnlen_user(str, ~0UL >> 1) 84 85struct exception_table_entry 86{ 87 unsigned long insn; 88 unsigned long fixup; 89}; 90 91#endif 92 93/* 94 * Overrides for Emacs so that we follow Linus's tabbing style. 95 * Emacs will notice this stuff at the end of the file and automatically 96 * adjust the settings for this buffer only. This must remain at the end 97 * of the file. 98 * --------------------------------------------------------------------------- 99 * Local variables: 100 * c-file-style: "linux" 101 * End: 102 */