uaccess.h revision c745a8a11fa1df6078bfc61fc29492ed43f71c2b
1867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 2867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copyright 2010 Tilera Corporation. All Rights Reserved. 3867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 4867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is free software; you can redistribute it and/or 5867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * modify it under the terms of the GNU General Public License 6867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * as published by the Free Software Foundation, version 2. 7867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 8867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This program is distributed in the hope that it will be useful, but 9867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * WITHOUT ANY WARRANTY; without even the implied warranty of 10867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * NON INFRINGEMENT. See the GNU General Public License for 12867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * more details. 13867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 14867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 15867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef _ASM_TILE_UACCESS_H 16867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define _ASM_TILE_UACCESS_H 17867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 18867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 19867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * User space memory access functions 20867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 21867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/sched.h> 22867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <linux/mm.h> 23867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <asm-generic/uaccess-unaligned.h> 24867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <asm/processor.h> 25867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#include <asm/page.h> 26867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 27867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define VERIFY_READ 0 28867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define VERIFY_WRITE 1 29867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 30867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 31867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * The fs value determines whether argument validity checking should be 32867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * performed or not. If get_fs() == USER_DS, checking is performed, with 33867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * get_fs() == KERNEL_DS, checking is bypassed. 34867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 35867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * For historical reasons, these macros are grossly misnamed. 36867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 37867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define MAKE_MM_SEG(a) ((mm_segment_t) { (a) }) 38867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 39867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define KERNEL_DS MAKE_MM_SEG(-1UL) 40867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define USER_DS MAKE_MM_SEG(PAGE_OFFSET) 41867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 42867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define get_ds() (KERNEL_DS) 43867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define get_fs() (current_thread_info()->addr_limit) 44867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define set_fs(x) (current_thread_info()->addr_limit = (x)) 45867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 46867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define segment_eq(a, b) ((a).seg == (b).seg) 47867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 48867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifndef __tilegx__ 49867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 50867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * We could allow mapping all 16 MB at 0xfc000000, but we set up a 51867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * special hack in arch_setup_additional_pages() to auto-create a mapping 52867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * for the first 16 KB, and it would seem strange to have different 53867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * user-accessible semantics for memory at 0xfc000000 and above 0xfc004000. 54867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 55867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline int is_arch_mappable_range(unsigned long addr, 56867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long size) 57867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 58867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return (addr >= MEM_USER_INTRPT && 59867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf addr < (MEM_USER_INTRPT + INTRPT_SIZE) && 60867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf size <= (MEM_USER_INTRPT + INTRPT_SIZE) - addr); 61867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 62867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define is_arch_mappable_range is_arch_mappable_range 63867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else 64867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define is_arch_mappable_range(addr, size) 0 65867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 66867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 67867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 68867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Test whether a block of memory is a valid user space address. 69867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns 0 if the range is valid, nonzero otherwise. 70867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 71867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfint __range_ok(unsigned long addr, unsigned long size); 72867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 73867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 74867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * access_ok: - Checks if a user space pointer is valid 75867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that 76867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe 77867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to write to a block, it is always safe to read from it. 78867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @addr: User space pointer to start of block to check 79867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @size: Size of block to check 80867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 81867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 82867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 83867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Checks if a pointer to a block of memory in user space is valid. 84867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 85867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns true (nonzero) if the memory block may be valid, false (zero) 86867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * if it is definitely invalid. 87867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 88867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Note that, depending on architecture, this function probably just 89867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * checks that the pointer is in the user space range - after calling 90867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * this function, memory access functions may still return -EFAULT. 91867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 920707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalf#define access_ok(type, addr, size) ({ \ 930707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalf __chk_user_ptr(addr); \ 940707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalf likely(__range_ok((unsigned long)(addr), (size)) == 0); \ 950707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalf}) 96867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 97867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 98867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * The exception table consists of pairs of addresses: the first is the 99867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * address of an instruction that is allowed to fault, and the second is 100867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the address at which the program should continue. No registers are 101867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * modified, so it is entirely up to the continuation code to figure out 102867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * what to do. 103867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 104867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * All the routines below use bits of fixup code that are out of line 105867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * with the main instruction path. This means when everything is well, 106867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * we don't even have to jump over them. Further, they do not intrude 107867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * on our cache or tlb entries. 108867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 109867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 110867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstruct exception_table_entry { 111867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long insn, fixup; 112867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}; 113867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 114867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern int fixup_exception(struct pt_regs *regs); 115867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 116867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 117867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * We return the __get_user_N function results in a structure, 118867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * thus in r0 and r1. If "err" is zero, "val" is the result 119867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * of the read; otherwise, "err" is -EFAULT. 120867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 121867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * We rarely need 8-byte values on a 32-bit architecture, but 122867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * we size the structure to accommodate. In practice, for the 123867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the smaller reads, we can zero the high word for free, and 124867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the caller will ignore it by virtue of casting anyway. 125867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 126867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstruct __get_user { 127867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long long val; 128867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int err; 129867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}; 130867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 131867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 132867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * FIXME: we should express these as inline extended assembler, since 133867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * they're fundamentally just a variable dereference and some 134867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * supporting exception_table gunk. Note that (a la i386) we can 135867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * extend the copy_to_user and copy_from_user routines to call into 136867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * such extended assembler routines, though we will have to use a 137867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * different return code in that case (1, 2, or 4, rather than -EFAULT). 138867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 1390707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern struct __get_user __get_user_1(const void __user *); 1400707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern struct __get_user __get_user_2(const void __user *); 1410707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern struct __get_user __get_user_4(const void __user *); 1420707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern struct __get_user __get_user_8(const void __user *); 1430707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern int __put_user_1(long, void __user *); 1440707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern int __put_user_2(long, void __user *); 1450707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern int __put_user_4(long, void __user *); 1460707ad30d10110aebc01a5a64fb63f4b32d20b73Chris Metcalfextern int __put_user_8(long long, void __user *); 147867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 148867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* Unimplemented routines to cause linker failures */ 149867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern struct __get_user __get_user_bad(void); 150867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern int __put_user_bad(void); 151867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 152867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 153867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Careful: we have to cast the result to the type of the pointer 154867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * for sign reasons. 155867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 156867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 157867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __get_user: - Get a simple variable from user space, with less checking. 158867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @x: Variable to store result. 159867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr: Source address, in user space. 160867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 161867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 162867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 163867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This macro copies a single simple variable from user space to kernel 164867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * space. It supports simple types like char and int, but not larger 165867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data types like structures or arrays. 166867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 167867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr must have pointer-to-simple-variable type, and the result of 168867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * dereferencing @ptr must be assignable to @x without a cast. 169867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 170867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns zero on success, or -EFAULT on error. 171867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On error, the variable @x is set to zero. 172867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 173867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the pointer with access_ok() before calling this 174867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * function. 175867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 176867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __get_user(x, ptr) \ 177867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ struct __get_user __ret; \ 178867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) const __user *__gu_addr = (ptr); \ 179867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __chk_user_ptr(__gu_addr); \ 180867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf switch (sizeof(*(__gu_addr))) { \ 181867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 1: \ 182867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret = __get_user_1(__gu_addr); \ 183867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 184867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 2: \ 185867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret = __get_user_2(__gu_addr); \ 186867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 187867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 4: \ 188867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret = __get_user_4(__gu_addr); \ 189867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 190867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 8: \ 191867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret = __get_user_8(__gu_addr); \ 192867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 193867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf default: \ 194867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret = __get_user_bad(); \ 195867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 196867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf } \ 197867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf (x) = (__typeof__(*__gu_addr)) (__typeof__(*__gu_addr - *__gu_addr)) \ 198867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret.val; \ 199867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __ret.err; \ 200867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 201867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 202867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 203867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __put_user: - Write a simple value into user space, with less checking. 204867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @x: Value to copy to user space. 205867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr: Destination address, in user space. 206867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 207867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 208867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 209867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This macro copies a single simple value from kernel space to user 210867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * space. It supports simple types like char and int, but not larger 211867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data types like structures or arrays. 212867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 213867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr must have pointer-to-simple-variable type, and @x must be assignable 214867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to the result of dereferencing @ptr. 215867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 216867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the pointer with access_ok() before calling this 217867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * function. 218867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 219867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns zero on success, or -EFAULT on error. 220867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 221867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Implementation note: The "case 8" logic of casting to the type of 222867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the result of subtracting the value from itself is basically a way 223867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * of keeping all integer types the same, but casting any pointers to 224867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * ptrdiff_t, i.e. also an integer type. This way there are no 225867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * questionable casts seen by the compiler on an ILP32 platform. 226867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 227867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __put_user(x, ptr) \ 228867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 229867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int __pu_err = 0; \ 230867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ 231867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf typeof(*__pu_addr) __pu_val = (x); \ 232867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __chk_user_ptr(__pu_addr); \ 233867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf switch (sizeof(__pu_val)) { \ 234867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 1: \ 235867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err = __put_user_1((long)__pu_val, __pu_addr); \ 236867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 237867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 2: \ 238867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err = __put_user_2((long)__pu_val, __pu_addr); \ 239867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 240867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 4: \ 241867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err = __put_user_4((long)__pu_val, __pu_addr); \ 242867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 243867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf case 8: \ 244867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err = \ 245867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __put_user_8((__typeof__(__pu_val - __pu_val))__pu_val,\ 246867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_addr); \ 247867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 248867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf default: \ 249867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err = __put_user_bad(); \ 250867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf break; \ 251867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf } \ 252867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __pu_err; \ 253867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 254867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 255867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 256867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * The versions of get_user and put_user without initial underscores 257867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * check the address of their arguments to make sure they are not 258867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * in kernel space. 259867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 260867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define put_user(x, ptr) \ 261867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 262867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) __user *__Pu_addr = (ptr); \ 263867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf access_ok(VERIFY_WRITE, (__Pu_addr), sizeof(*(__Pu_addr))) ? \ 264867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __put_user((x), (__Pu_addr)) : \ 265867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf -EFAULT; \ 266867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 267867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 268867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define get_user(x, ptr) \ 269867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 270867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) const __user *__Gu_addr = (ptr); \ 271867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf access_ok(VERIFY_READ, (__Gu_addr), sizeof(*(__Gu_addr))) ? \ 272867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __get_user((x), (__Gu_addr)) : \ 273867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf ((x) = 0, -EFAULT); \ 274867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 275867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 276867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 277867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_to_user() - copy data into user space, with less checking. 278867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in user space. 279867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @from: Source address, in kernel space. 280867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 281867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 282867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 283867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 284867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from kernel space to user space. Caller must check 285867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified block with access_ok() before calling this function. 286867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 287867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 288867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 289867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 290867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * An alternate version - __copy_to_user_inatomic() - is designed 291867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to be called from atomic context, typically bracketed by calls 292867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to pagefault_disable() and pagefault_enable(). 293867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 294867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_to_user_inatomic( 295867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *to, const void *from, unsigned long n); 296867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 297867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 298867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_to_user(void __user *to, const void *from, unsigned long n) 299867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 300867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 301867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __copy_to_user_inatomic(to, from, n); 302867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 303867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 304867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 305867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfcopy_to_user(void __user *to, const void *from, unsigned long n) 306867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 307867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, to, n)) 308867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_to_user(to, from, n); 309867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 310867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 311867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 312867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 313867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_from_user() - copy data from user space, with less checking. 314867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in kernel space. 315867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @from: Source address, in user space. 316867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 317867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 318867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 319867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 320867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from user space to kernel space. Caller must check 321867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified block with access_ok() before calling this function. 322867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 323867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 324867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 325867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 326867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If some data could not be copied, this function will pad the copied 327867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data to the requested size using zero bytes. 328867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 329867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * An alternate version - __copy_from_user_inatomic() - is designed 330867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to be called from atomic context, typically bracketed by calls 331867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to pagefault_disable() and pagefault_enable(). This version 332867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * does *NOT* pad with zeros. 333867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 334867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_from_user_inatomic( 335867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void *to, const void __user *from, unsigned long n); 336867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_from_user_zeroing( 337867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void *to, const void __user *from, unsigned long n); 338867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 339867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 340867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_from_user(void *to, const void __user *from, unsigned long n) 341867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 342867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 343867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __copy_from_user_zeroing(to, from, n); 344867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 345867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 346867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 347867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf_copy_from_user(void *to, const void __user *from, unsigned long n) 348867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 349867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_READ, from, n)) 350867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_from_user(to, from, n); 351867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf else 352867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf memset(to, 0, n); 353867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 354867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 355867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 356867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef CONFIG_DEBUG_COPY_FROM_USER 357867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern void copy_from_user_overflow(void) 358867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __compiletime_warning("copy_from_user() size is not provably correct"); 359867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 360867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check copy_from_user(void *to, 361867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf const void __user *from, 362867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long n) 363867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 364867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int sz = __compiletime_object_size(to); 365867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 366867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (likely(sz == -1 || sz >= n)) 367867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = _copy_from_user(to, from, n); 368867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf else 369867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf copy_from_user_overflow(); 370867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 371867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 372867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 373867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else 374867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define copy_from_user _copy_from_user 375867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 376867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 377867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef __tilegx__ 378867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 379867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_in_user() - copy data within user space, with less checking. 380867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in user space. 381867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @from: Source address, in kernel space. 382867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 383867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 384867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 385867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 386867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from user space to user space. Caller must check 387867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified blocks with access_ok() before calling this function. 388867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 389867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 390867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 391867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 392c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalfextern unsigned long __copy_in_user_inatomic( 393867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *to, const void __user *from, unsigned long n); 394867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 395867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 396867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_in_user(void __user *to, const void __user *from, unsigned long n) 397867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 398867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_sleep(); 399c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf return __copy_in_user_inatomic(to, from, n); 400867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 401867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 402867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 403867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfcopy_in_user(void __user *to, const void __user *from, unsigned long n) 404867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 405867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, to, n) && access_ok(VERIFY_READ, from, n)) 406867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_in_user(to, from, n); 407867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 408867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 409867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 410867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 411867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 412867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 413867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * strlen_user: - Get the size of a string in user space. 414867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @str: The string to measure. 415867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 416867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 417867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 418867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Get the size of a NUL-terminated string in user space. 419867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 420867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns the size of the string INCLUDING the terminating NUL. 421867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On exception, returns 0. 422867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 423867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If there is a limit on the length of a valid string, you may wish to 424867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * consider using strnlen_user() instead. 425867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 426867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern long strnlen_user_asm(const char __user *str, long n); 427867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check strnlen_user(const char __user *str, long n) 428867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 429867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 430867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return strnlen_user_asm(str, n); 431867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 432867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define strlen_user(str) strnlen_user(str, LONG_MAX) 433867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 434867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 435867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking. 436867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @dst: Destination address, in kernel space. This buffer must be at 437867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * least @count bytes long. 438867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @src: Source address, in user space. 439867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @count: Maximum number of bytes to copy, including the trailing NUL. 440867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 441867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copies a NUL-terminated string from userspace to kernel space. 442867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the specified block with access_ok() before calling 443867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * this function. 444867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 445867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, returns the length of the string (not including the trailing 446867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * NUL). 447867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 448867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If access to userspace fails, returns -EFAULT (some data may have been 449867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * copied). 450867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 451867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If @count is smaller than the length of the string, copies @count bytes 452867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * and returns @count. 453867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 454867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern long strncpy_from_user_asm(char *dst, const char __user *src, long); 455867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check __strncpy_from_user( 456867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf char *dst, const char __user *src, long count) 457867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 458867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 459867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return strncpy_from_user_asm(dst, src, count); 460867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 461867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check strncpy_from_user( 462867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf char *dst, const char __user *src, long count) 463867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 464867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_READ, src, 1)) 465867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __strncpy_from_user(dst, src, count); 466867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return -EFAULT; 467867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 468867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 469867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 470867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * clear_user: - Zero a block of memory in user space. 471867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 472867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to zero. 473867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 474867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Zero a block of memory in user space. 475867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 476867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be cleared. 477867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 478867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 479867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long clear_user_asm(void __user *mem, unsigned long len); 480867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __clear_user( 481867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 482867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 483867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 484867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return clear_user_asm(mem, len); 485867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 486867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check clear_user( 487867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 488867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 489867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 490867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __clear_user(mem, len); 491867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 492867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 493867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 494867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 495867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * flush_user: - Flush a block of memory in user space from cache. 496867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 497867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to flush. 498867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 499867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be flushed. 500867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 501867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 502867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long flush_user_asm(void __user *mem, unsigned long len); 503867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __flush_user( 504867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 505867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 506867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int retval; 507867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 508867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 509867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf retval = flush_user_asm(mem, len); 510867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf mb_incoherent(); 511867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return retval; 512867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 513867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 514867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check flush_user( 515867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 516867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 517867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 518867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __flush_user(mem, len); 519867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 520867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 521867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 522867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 523867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * inv_user: - Invalidate a block of memory in user space from cache. 524867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 525867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to invalidate. 526867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 527867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be invalidated. 528867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 529867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 530867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Note that on Tile64, the "inv" operation is in fact a 531867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * "flush and invalidate", so cache write-backs will occur prior 532867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to the cache being marked invalid. 533867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 534867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long inv_user_asm(void __user *mem, unsigned long len); 535867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __inv_user( 536867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 537867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 538867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int retval; 539867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 540867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 541867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf retval = inv_user_asm(mem, len); 542867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf mb_incoherent(); 543867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return retval; 544867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 545867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check inv_user( 546867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 547867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 548867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 549867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __inv_user(mem, len); 550867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 551867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 552867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 553867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 554867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * finv_user: - Flush-inval a block of memory in user space from cache. 555867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 556867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to invalidate. 557867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 558867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be flush-invalidated. 559867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 560867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 561867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long finv_user_asm(void __user *mem, unsigned long len); 562867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __finv_user( 563867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 564867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 565867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int retval; 566867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 567867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 568867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf retval = finv_user_asm(mem, len); 569867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf mb_incoherent(); 570867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return retval; 571867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 572867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check finv_user( 573867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 574867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 575867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 576867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __finv_user(mem, len); 577867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 578867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 579867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 580867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* _ASM_TILE_UACCESS_H */ 581