1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __i386_UACCESS_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __i386_UACCESS_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * User space memory access functions 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/errno.h> 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/thread_info.h> 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/prefetch.h> 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/string.h> 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/page.h> 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VERIFY_READ 0 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VERIFY_WRITE 1 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The fs value determines whether argument validity checking should be 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * performed or not. If get_fs() == USER_DS, checking is performed, with 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * get_fs() == KERNEL_DS, checking is bypassed. 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For historical reasons, these macros are grossly misnamed. 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL) 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define USER_DS MAKE_MM_SEG(PAGE_OFFSET) 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_ds() (KERNEL_DS) 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_fs() (current_thread_info()->addr_limit) 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_fs(x) (current_thread_info()->addr_limit = (x)) 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define segment_eq(a,b) ((a).seg == (b).seg) 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * movsl can be slow when source and dest are not both 8-byte aligned 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_X86_INTEL_USERCOPY 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct movsl_mask { 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int mask; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} ____cacheline_aligned_in_smp movsl_mask; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __addr_ok(addr) ((unsigned long __force)(addr) < (current_thread_info()->addr_limit.seg)) 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Test whether a block of memory is a valid user space address. 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns 0 if the range is valid, nonzero otherwise. 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is equivalent to the following test: 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (u33)addr + (u33)size >= (u33)current->addr_limit.seg 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This needs 33-bit arithmetic. We have a carry... 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __range_ok(addr,size) ({ \ 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flag,roksum; \ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __chk_user_ptr(addr); \ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=&r" (flag), "=r" (roksum) \ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru flag; }) 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * access_ok: - Checks if a user space pointer is valid 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to write to a block, it is always safe to read from it. 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @addr: User space pointer to start of block to check 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @size: Size of block to check 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Checks if a pointer to a block of memory in user space is valid. 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns true (nonzero) if the memory block may be valid, false (zero) 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if it is definitely invalid. 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note that, depending on architecture, this function probably just 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * checks that the pointer is in the user space range - after calling 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * this function, memory access functions may still return -EFAULT. 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define access_ok(type,addr,size) (likely(__range_ok(addr,size) == 0)) 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The exception table consists of pairs of addresses: the first is the 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * address of an instruction that is allowed to fault, and the second is 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the address at which the program should continue. No registers are 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modified, so it is entirely up to the continuation code to figure out 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * what to do. 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * All the routines below use bits of fixup code that are out of line 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with the main instruction path. This means when everything is well, 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we don't even have to jump over them. Further, they do not intrude 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * on our cache or tlb entries. 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct exception_table_entry 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long insn, fixup; 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int fixup_exception(struct pt_regs *regs); 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These are the main single-value transfer routines. They automatically 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * use the right size if we just have the right pointer type. 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This gets kind of ugly. We want to return _two_ values in "get_user()" 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and yet we don't want to do any pointers, because that is too much 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * of a performance impact. Thus we have a few rather ugly macros here, 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and hide all the ugliness from the user. 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The "__xxx" versions of the user access functions are versions that 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * do not verify the address space, that must have been done previously 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with a separate "access_ok()" call (this is used when we do multiple 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * accesses to the same area of user memory). 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __get_user_1(void); 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __get_user_2(void); 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __get_user_4(void); 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __get_user_x(size,ret,x,ptr) \ 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__("call __get_user_" #size \ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"=a" (ret),"=d" (x) \ 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru :"0" (ptr)) 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Careful: we have to cast the result to the type of the pointer for sign reasons */ 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * get_user: - Get a simple variable from user space. 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @x: Variable to store result. 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr: Source address, in user space. 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This macro copies a single simple variable from user space to kernel 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space. It supports simple types like char and int, but not larger 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data types like structures or arrays. 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr must have pointer-to-simple-variable type, and the result of 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * dereferencing @ptr must be assignable to @x without a cast. 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns zero on success, or -EFAULT on error. 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On error, the variable @x is set to zero. 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define get_user(x,ptr) \ 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ int __ret_gu; \ 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long __val_gu; \ 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __chk_user_ptr(ptr); \ 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch(sizeof (*(ptr))) { \ 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: __get_user_x(2,__ret_gu,__val_gu,ptr); break; \ 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: __get_user_x(4,__ret_gu,__val_gu,ptr); break; \ 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: __get_user_x(X,__ret_gu,__val_gu,ptr); break; \ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (x) = (__typeof__(*(ptr)))__val_gu; \ 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret_gu; \ 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __put_user_bad(void); 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Strange magic calling convention: pointer in %ecx, 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * value in %eax(:%edx), return value in %eax, no clobbers. 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __put_user_1(void); 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __put_user_2(void); 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __put_user_4(void); 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __put_user_8(void); 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_1(x, ptr) __asm__ __volatile__("call __put_user_1":"=a" (__ret_pu):"0" ((typeof(*(ptr)))(x)), "c" (ptr)) 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_2(x, ptr) __asm__ __volatile__("call __put_user_2":"=a" (__ret_pu):"0" ((typeof(*(ptr)))(x)), "c" (ptr)) 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_4(x, ptr) __asm__ __volatile__("call __put_user_4":"=a" (__ret_pu):"0" ((typeof(*(ptr)))(x)), "c" (ptr)) 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_8(x, ptr) __asm__ __volatile__("call __put_user_8":"=a" (__ret_pu):"A" ((typeof(*(ptr)))(x)), "c" (ptr)) 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_X(x, ptr) __asm__ __volatile__("call __put_user_X":"=a" (__ret_pu):"c" (ptr)) 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * put_user: - Write a simple value into user space. 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @x: Value to copy to user space. 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr: Destination address, in user space. 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This macro copies a single simple value from kernel space to user 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space. It supports simple types like char and int, but not larger 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data types like structures or arrays. 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr must have pointer-to-simple-variable type, and @x must be assignable 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to the result of dereferencing @ptr. 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns zero on success, or -EFAULT on error. 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_X86_WP_WORKS_OK 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define put_user(x,ptr) \ 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ int __ret_pu; \ 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __typeof__(*(ptr)) __pu_val; \ 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __chk_user_ptr(ptr); \ 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pu_val = x; \ 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch(sizeof(*(ptr))) { \ 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: __put_user_1(__pu_val, ptr); break; \ 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: __put_user_2(__pu_val, ptr); break; \ 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: __put_user_4(__pu_val, ptr); break; \ 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 8: __put_user_8(__pu_val, ptr); break; \ 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default:__put_user_X(__pu_val, ptr); break; \ 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret_pu; \ 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define put_user(x,ptr) \ 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int __ret_pu; \ 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __typeof__(*(ptr)) __pus_tmp = x; \ 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret_pu=0; \ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if(unlikely(__copy_to_user_ll(ptr, &__pus_tmp, \ 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru sizeof(*(ptr))) != 0)) \ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret_pu=-EFAULT; \ 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ret_pu; \ 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }) 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __get_user: - Get a simple variable from user space, with less checking. 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @x: Variable to store result. 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr: Source address, in user space. 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This macro copies a single simple variable from user space to kernel 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space. It supports simple types like char and int, but not larger 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data types like structures or arrays. 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr must have pointer-to-simple-variable type, and the result of 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * dereferencing @ptr must be assignable to @x without a cast. 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Caller must check the pointer with access_ok() before calling this 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * function. 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns zero on success, or -EFAULT on error. 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On error, the variable @x is set to zero. 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __get_user(x,ptr) \ 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_nocheck((x),(ptr),sizeof(*(ptr))) 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __put_user: - Write a simple value into user space, with less checking. 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @x: Value to copy to user space. 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr: Destination address, in user space. 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This macro copies a single simple value from kernel space to user 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space. It supports simple types like char and int, but not larger 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data types like structures or arrays. 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr must have pointer-to-simple-variable type, and @x must be assignable 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to the result of dereferencing @ptr. 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Caller must check the pointer with access_ok() before calling this 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * function. 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns zero on success, or -EFAULT on error. 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user(x,ptr) \ 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_nocheck(x,ptr,size) \ 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long __pu_err; \ 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __put_user_size((x),(ptr),(size),__pu_err,-EFAULT); \ 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pu_err; \ 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_u64(x, addr, err) \ 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "1: movl %%eax,0(%2)\n" \ 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "2: movl %%edx,4(%2)\n" \ 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "3:\n" \ 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section .fixup,\"ax\"\n" \ 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "4: movl %3,%0\n" \ 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " jmp 3b\n" \ 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous\n" \ 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section __ex_table,\"a\"\n" \ 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .align 4\n" \ 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .long 1b,4b\n" \ 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .long 2b,4b\n" \ 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous" \ 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=r"(err) \ 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "A" (x), "r" (addr), "i"(-EFAULT), "0"(err)) 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_X86_WP_WORKS_OK 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_size(x,ptr,size,retval,errret) \ 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru retval = 0; \ 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __chk_user_ptr(ptr); \ 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (size) { \ 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: __put_user_asm(x,ptr,retval,"b","b","iq",errret);break; \ 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: __put_user_asm(x,ptr,retval,"w","w","ir",errret);break; \ 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: __put_user_asm(x,ptr,retval,"l","","ir",errret); break; \ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 8: __put_user_u64((__typeof__(*ptr))(x),ptr,retval); break;\ 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: __put_user_bad(); \ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_size(x,ptr,size,retval,errret) \ 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __typeof__(*(ptr)) __pus_tmp = x; \ 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru retval = 0; \ 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if(unlikely(__copy_to_user_ll(ptr, &__pus_tmp, size) != 0)) \ 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru retval = errret; \ 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct __large_struct { unsigned long buf[100]; }; 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __m(x) (*(struct __large_struct __user *)(x)) 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Tell gcc we read from memory instead of writing: this is because 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we do not write to any memory gcc knows about, so there are no 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * aliasing issues. 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "1: mov"itype" %"rtype"1,%2\n" \ 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "2:\n" \ 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section .fixup,\"ax\"\n" \ 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "3: movl %3,%0\n" \ 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " jmp 2b\n" \ 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous\n" \ 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section __ex_table,\"a\"\n" \ 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .align 4\n" \ 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .long 1b,3b\n" \ 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous" \ 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=r"(err) \ 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : ltype (x), "m"(__m(addr)), "i"(errret), "0"(err)) 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __get_user_nocheck(x,ptr,size) \ 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long __gu_err; \ 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long __gu_val; \ 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(__gu_val,(ptr),(size),__gu_err,-EFAULT);\ 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (x) = (__typeof__(*(ptr)))__gu_val; \ 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __gu_err; \ 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern long __get_user_bad(void); 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __get_user_size(x,ptr,size,retval,errret) \ 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudo { \ 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru retval = 0; \ 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __chk_user_ptr(ptr); \ 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (size) { \ 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: __get_user_asm(x,ptr,retval,"b","b","=q",errret);break; \ 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: __get_user_asm(x,ptr,retval,"w","w","=r",errret);break; \ 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: __get_user_asm(x,ptr,retval,"l","","=r",errret);break; \ 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru default: (x) = __get_user_bad(); \ 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } \ 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __asm__ __volatile__( \ 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "1: mov"itype" %2,%"rtype"1\n" \ 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "2:\n" \ 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section .fixup,\"ax\"\n" \ 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru "3: movl %3,%0\n" \ 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " xor"itype" %"rtype"1,%"rtype"1\n" \ 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " jmp 2b\n" \ 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous\n" \ 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".section __ex_table,\"a\"\n" \ 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .align 4\n" \ 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru " .long 1b,3b\n" \ 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ".previous" \ 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "=r"(err), ltype (x) \ 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru : "m"(__m(addr)), "i"(errret), "0"(err)) 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __copy_to_user_ll(void __user *to, 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void *from, unsigned long n); 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __copy_from_user_ll(void *to, 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n); 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __copy_from_user_ll_nozero(void *to, 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n); 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __copy_from_user_ll_nocache(void *to, 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n); 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __copy_from_user_ll_nocache_nozero(void *to, 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n); 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __copy_to_user_inatomic: - Copy a block of data into user space, with less checking. 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @to: Destination address, in user space. 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @from: Source address, in kernel space. 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @n: Number of bytes to copy. 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copy data from kernel space to user space. Caller must check 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the specified block with access_ok() before calling this function. 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The caller should also make sure he pins the user space address 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * so that the we don't result in page fault and sleep. 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Here we special-case 1, 2 and 4-byte copy_*_user invocations. On a fault 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we return the initial request size (1, 2 or 4), as copy_*_user should do. 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * If a store crosses a page boundary and gets a fault, the x86 will not write 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * anything, so this is accurate. 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long __must_check 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__copy_to_user_inatomic(void __user *to, const void *from, unsigned long n) 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__builtin_constant_p(n)) { 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ret; 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n) { 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __put_user_size(*(u8 *)from, (u8 __user *)to, 1, ret, 1); 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __put_user_size(*(u16 *)from, (u16 __user *)to, 2, ret, 2); 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __put_user_size(*(u32 *)from, (u32 __user *)to, 4, ret, 4); 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_to_user_ll(to, from, n); 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __copy_to_user: - Copy a block of data into user space, with less checking. 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @to: Destination address, in user space. 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @from: Source address, in kernel space. 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @n: Number of bytes to copy. 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copy data from kernel space to user space. Caller must check 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the specified block with access_ok() before calling this function. 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns number of bytes that could not be copied. 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On success, this will be zero. 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long __must_check 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__copy_to_user(void __user *to, const void *from, unsigned long n) 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru might_sleep(); 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_to_user_inatomic(to, from, n); 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Avoid zeroing the tail if the copy fails.. 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * If 'n' is constant and 1, 2, or 4, we do still zero on a failure, 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * but as the zeroing behaviour is only significant when n is not 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * constant, that shouldn't be a problem. 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__builtin_constant_p(n)) { 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ret; 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n) { 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u8 *)to, from, 1, ret, 1); 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u16 *)to, from, 2, ret, 2); 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u32 *)to, from, 4, ret, 4); 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_from_user_ll_nozero(to, from, n); 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __copy_from_user: - Copy a block of data from user space, with less checking. 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @to: Destination address, in kernel space. 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @from: Source address, in user space. 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @n: Number of bytes to copy. 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copy data from user space to kernel space. Caller must check 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the specified block with access_ok() before calling this function. 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns number of bytes that could not be copied. 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On success, this will be zero. 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * If some data could not be copied, this function will pad the copied 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * data to the requested size using zero bytes. 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 504c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * An alternate version - __copy_from_user_inatomic() - may be called from 505c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * atomic context and will fail rather than sleep. In this case the 506c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * uncopied bytes will *NOT* be padded with zeros. See fs/filemap.h 507c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * for explanation of why this is needed. 508c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 509c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long 510c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__copy_from_user(void *to, const void __user *from, unsigned long n) 511c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 512c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru might_sleep(); 513c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__builtin_constant_p(n)) { 514c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ret; 515c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 516c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n) { 517c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 518c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u8 *)to, from, 1, ret, 1); 519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u16 *)to, from, 2, ret, 2); 522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: 524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u32 *)to, from, 4, ret, 4); 525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_from_user_ll(to, from, n); 529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ARCH_HAS_NOCACHE_UACCESS 532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long __copy_from_user_nocache(void *to, 534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n) 535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru might_sleep(); 537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (__builtin_constant_p(n)) { 538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ret; 539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (n) { 541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 1: 542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u8 *)to, from, 1, ret, 1); 543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 2: 545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u16 *)to, from, 2, ret, 2); 546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case 4: 548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __get_user_size(*(u32 *)to, from, 4, ret, 4); 549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_from_user_ll_nocache(to, from, n); 553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline unsigned long 556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru__copy_from_user_inatomic_nocache(void *to, const void __user *from, unsigned long n) 557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __copy_from_user_ll_nocache_nozero(to, from, n); 559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check copy_to_user(void __user *to, 562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void *from, unsigned long n); 563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check copy_from_user(void *to, 564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const void __user *from, unsigned long n); 565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querulong __must_check strncpy_from_user(char *dst, const char __user *src, 566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru long count); 567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querulong __must_check __strncpy_from_user(char *dst, 568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char __user *src, long count); 569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * strlen_user: - Get the size of a string in user space. 572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @str: The string to measure. 573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Context: User context only. This function may sleep. 575c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 576c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Get the size of a NUL-terminated string in user space. 577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Returns the size of the string INCLUDING the terminating NUL. 579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On exception, returns 0. 580c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 581c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * If there is a limit on the length of a valid string, you may wish to 582c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * consider using strnlen_user() instead. 583c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 584c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define strlen_user(str) strnlen_user(str, LONG_MAX) 585c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 586c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querulong strnlen_user(const char __user *str, long n); 587c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check clear_user(void __user *mem, unsigned long len); 588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long __must_check __clear_user(void __user *mem, unsigned long len); 589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __i386_UACCESS_H */ 591