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/* 11747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * Support macros for __get_user(). 11847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * 11947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * Implementation note: The "case 8" logic of casting to the type of 12047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * the result of subtracting the value from itself is basically a way 12147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * of keeping all integer types the same, but casting any pointers to 12247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * ptrdiff_t, i.e. also an integer type. This way there are no 12347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * questionable casts seen by the compiler on an ILP32 platform. 12447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * 12547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * Note that __get_user() and __put_user() assume proper alignment. 126867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 127867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 12847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#ifdef __LP64__ 12947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define _ASM_PTR ".quad" 130d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf#define _ASM_ALIGN ".align 8" 13147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#else 13247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define _ASM_PTR ".long" 133d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf#define _ASM_ALIGN ".align 4" 13447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#endif 13547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 13647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_asm(OP, x, ptr, ret) \ 13747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf asm volatile("1: {" #OP " %1, %2; movei %0, 0 }\n" \ 13847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".pushsection .fixup,\"ax\"\n" \ 13947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "0: { movei %1, 0; movei %0, %3 }\n" \ 14047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "j 9f\n" \ 14147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".section __ex_table,\"a\"\n" \ 142d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf _ASM_ALIGN "\n" \ 14347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf _ASM_PTR " 1b, 0b\n" \ 14447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".popsection\n" \ 14547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "9:" \ 14647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "=r" (ret), "=r" (x) \ 14747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "r" (ptr), "i" (-EFAULT)) 14847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 14947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#ifdef __tilegx__ 15047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_1(x, ptr, ret) __get_user_asm(ld1u, x, ptr, ret) 15147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_2(x, ptr, ret) __get_user_asm(ld2u, x, ptr, ret) 1526699c8cda36f296e315068ed9bbe4f03e6ed4044Chris Metcalf#define __get_user_4(x, ptr, ret) __get_user_asm(ld4s, x, ptr, ret) 15347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_8(x, ptr, ret) __get_user_asm(ld, x, ptr, ret) 15447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#else 15547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_1(x, ptr, ret) __get_user_asm(lb_u, x, ptr, ret) 15647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_2(x, ptr, ret) __get_user_asm(lh_u, x, ptr, ret) 15747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_4(x, ptr, ret) __get_user_asm(lw, x, ptr, ret) 15847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#ifdef __LITTLE_ENDIAN 15947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __lo32(a, b) a 16047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __hi32(a, b) b 16147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#else 16247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __lo32(a, b) b 16347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __hi32(a, b) a 16447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#endif 16547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __get_user_8(x, ptr, ret) \ 16647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ({ \ 16747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf unsigned int __a, __b; \ 16847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf asm volatile("1: { lw %1, %3; addi %2, %3, 4 }\n" \ 16947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "2: { lw %2, %2; movei %0, 0 }\n" \ 17047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".pushsection .fixup,\"ax\"\n" \ 17147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "0: { movei %1, 0; movei %2, 0 }\n" \ 17247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "{ movei %0, %4; j 9f }\n" \ 17347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".section __ex_table,\"a\"\n" \ 174d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf ".align 4\n" \ 17547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".word 1b, 0b\n" \ 17647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".word 2b, 0b\n" \ 17747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".popsection\n" \ 17847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "9:" \ 17947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "=r" (ret), "=r" (__a), "=&r" (__b) \ 18047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "r" (ptr), "i" (-EFAULT)); \ 18147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf (x) = (__typeof(x))(__typeof((x)-(x))) \ 18247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf (((u64)__hi32(__a, __b) << 32) | \ 18347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __lo32(__a, __b)); \ 18447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf }) 18547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#endif 18647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 18747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalfextern int __get_user_bad(void) 18847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __attribute__((warning("sizeof __get_user argument not 1, 2, 4 or 8"))); 189867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 190867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 191867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __get_user: - Get a simple variable from user space, with less checking. 192867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @x: Variable to store result. 193867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr: Source address, in user space. 194867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 195867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 196867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 197867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This macro copies a single simple variable from user space to kernel 198867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * space. It supports simple types like char and int, but not larger 199867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data types like structures or arrays. 200867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 201867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr must have pointer-to-simple-variable type, and the result of 202867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * dereferencing @ptr must be assignable to @x without a cast. 203867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 204867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns zero on success, or -EFAULT on error. 205867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On error, the variable @x is set to zero. 206867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 207867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the pointer with access_ok() before calling this 208867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * function. 209867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 210867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __get_user(x, ptr) \ 21147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ({ \ 21247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf int __ret; \ 21347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __chk_user_ptr(ptr); \ 21447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf switch (sizeof(*(ptr))) { \ 21547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 1: __get_user_1(x, ptr, __ret); break; \ 21647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 2: __get_user_2(x, ptr, __ret); break; \ 21747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 4: __get_user_4(x, ptr, __ret); break; \ 21847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 8: __get_user_8(x, ptr, __ret); break; \ 21947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf default: __ret = __get_user_bad(); break; \ 22047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf } \ 22147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __ret; \ 22247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf }) 22347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 22447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf/* Support macros for __put_user(). */ 22547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 22647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_asm(OP, x, ptr, ret) \ 22747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf asm volatile("1: {" #OP " %1, %2; movei %0, 0 }\n" \ 22847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".pushsection .fixup,\"ax\"\n" \ 22947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "0: { movei %0, %3; j 9f }\n" \ 23047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".section __ex_table,\"a\"\n" \ 231d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf _ASM_ALIGN "\n" \ 23247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf _ASM_PTR " 1b, 0b\n" \ 23347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".popsection\n" \ 23447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "9:" \ 23547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "=r" (ret) \ 23647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "r" (ptr), "r" (x), "i" (-EFAULT)) 23747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 23847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#ifdef __tilegx__ 23947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_1(x, ptr, ret) __put_user_asm(st1, x, ptr, ret) 24047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_2(x, ptr, ret) __put_user_asm(st2, x, ptr, ret) 24147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_4(x, ptr, ret) __put_user_asm(st4, x, ptr, ret) 24247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_8(x, ptr, ret) __put_user_asm(st, x, ptr, ret) 24347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#else 24447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_1(x, ptr, ret) __put_user_asm(sb, x, ptr, ret) 24547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_2(x, ptr, ret) __put_user_asm(sh, x, ptr, ret) 24647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_4(x, ptr, ret) __put_user_asm(sw, x, ptr, ret) 24747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#define __put_user_8(x, ptr, ret) \ 24847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ({ \ 24947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf u64 __x = (__typeof((x)-(x)))(x); \ 25047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf int __lo = (int) __x, __hi = (int) (__x >> 32); \ 25147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf asm volatile("1: { sw %1, %2; addi %0, %1, 4 }\n" \ 25247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "2: { sw %0, %3; movei %0, 0 }\n" \ 25347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".pushsection .fixup,\"ax\"\n" \ 25447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "0: { movei %0, %4; j 9f }\n" \ 25547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".section __ex_table,\"a\"\n" \ 256d4d9eab4ade468b6a97b6853fdd72e8f21474324Chris Metcalf ".align 4\n" \ 25747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".word 1b, 0b\n" \ 25847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".word 2b, 0b\n" \ 25947d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf ".popsection\n" \ 26047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "9:" \ 26147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "=&r" (ret) \ 26247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf : "r" (ptr), "r" (__lo32(__lo, __hi)), \ 26347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf "r" (__hi32(__lo, __hi)), "i" (-EFAULT)); \ 26447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf }) 26547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf#endif 26647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf 26747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalfextern int __put_user_bad(void) 26847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __attribute__((warning("sizeof __put_user argument not 1, 2, 4 or 8"))); 269867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 270867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 271867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __put_user: - Write a simple value into user space, with less checking. 272867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @x: Value to copy to user space. 273867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr: Destination address, in user space. 274867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 275867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 276867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 277867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * This macro copies a single simple value from kernel space to user 278867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * space. It supports simple types like char and int, but not larger 279867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data types like structures or arrays. 280867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 281867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @ptr must have pointer-to-simple-variable type, and @x must be assignable 282867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to the result of dereferencing @ptr. 283867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 284867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the pointer with access_ok() before calling this 285867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * function. 286867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 287867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns zero on success, or -EFAULT on error. 288867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 289867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define __put_user(x, ptr) \ 290867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 29147d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf int __ret; \ 29247d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __chk_user_ptr(ptr); \ 29347d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf switch (sizeof(*(ptr))) { \ 29447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 1: __put_user_1(x, ptr, __ret); break; \ 29547d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 2: __put_user_2(x, ptr, __ret); break; \ 29647d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 4: __put_user_4(x, ptr, __ret); break; \ 29747d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf case 8: __put_user_8(x, ptr, __ret); break; \ 29847d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf default: __ret = __put_user_bad(); break; \ 299867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf } \ 30047d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf __ret; \ 301867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 302867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 303867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/* 304867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * The versions of get_user and put_user without initial underscores 305867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * check the address of their arguments to make sure they are not 306867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * in kernel space. 307867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 308867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define put_user(x, ptr) \ 309867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 310867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) __user *__Pu_addr = (ptr); \ 311867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf access_ok(VERIFY_WRITE, (__Pu_addr), sizeof(*(__Pu_addr))) ? \ 312867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __put_user((x), (__Pu_addr)) : \ 313867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf -EFAULT; \ 314867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 315867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 316867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define get_user(x, ptr) \ 317867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf({ \ 318867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __typeof__(*(ptr)) const __user *__Gu_addr = (ptr); \ 319867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf access_ok(VERIFY_READ, (__Gu_addr), sizeof(*(__Gu_addr))) ? \ 320867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __get_user((x), (__Gu_addr)) : \ 321867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf ((x) = 0, -EFAULT); \ 322867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf}) 323867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 324867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 325867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_to_user() - copy data into user space, with less checking. 326867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in user space. 327867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @from: Source address, in kernel space. 328867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 329867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 330867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 331867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 332867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from kernel space to user space. Caller must check 333867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified block with access_ok() before calling this function. 334867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 335867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 336867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 337867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 338867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * An alternate version - __copy_to_user_inatomic() - is designed 339867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to be called from atomic context, typically bracketed by calls 340867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to pagefault_disable() and pagefault_enable(). 341867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 342867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_to_user_inatomic( 343867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *to, const void *from, unsigned long n); 344867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 345867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 346867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_to_user(void __user *to, const void *from, unsigned long n) 347867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 348867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 349867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __copy_to_user_inatomic(to, from, n); 350867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 351867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 352867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 353867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfcopy_to_user(void __user *to, const void *from, unsigned long n) 354867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 355867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, to, n)) 356867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_to_user(to, from, n); 357867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 358867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 359867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 360867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 361867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_from_user() - copy data from user space, with less checking. 362867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in kernel space. 363867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @from: Source address, in user space. 364867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 365867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 366867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 367867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 368867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from user space to kernel space. Caller must check 369867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified block with access_ok() before calling this function. 370867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 371867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 372867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 373867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 374867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If some data could not be copied, this function will pad the copied 375867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * data to the requested size using zero bytes. 376867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 377867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * An alternate version - __copy_from_user_inatomic() - is designed 378867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to be called from atomic context, typically bracketed by calls 379867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * to pagefault_disable() and pagefault_enable(). This version 380867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * does *NOT* pad with zeros. 381867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 382867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_from_user_inatomic( 383867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void *to, const void __user *from, unsigned long n); 384867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long __must_check __copy_from_user_zeroing( 385867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void *to, const void __user *from, unsigned long n); 386867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 387867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 388867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_from_user(void *to, const void __user *from, unsigned long n) 389867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 390867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 391867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __copy_from_user_zeroing(to, from, n); 392867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 393867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 394867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 395867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf_copy_from_user(void *to, const void __user *from, unsigned long n) 396867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 397867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_READ, from, n)) 398867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_from_user(to, from, n); 399867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf else 400867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf memset(to, 0, n); 401867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 402867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 403867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 404446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS 405446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd/* 406446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd * There are still unprovable places in the generic code as of 2.6.34, so this 407446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd * option is not really compatible with -Werror, which is more useful in 408446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd * general. 409446f24d1199e8a546ba7c97da3fbb9a505a94795Stephen Boyd */ 410867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern void copy_from_user_overflow(void) 411867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf __compiletime_warning("copy_from_user() size is not provably correct"); 412867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 413867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check copy_from_user(void *to, 414867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf const void __user *from, 415867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf unsigned long n) 416867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 417867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int sz = __compiletime_object_size(to); 418867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 419867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (likely(sz == -1 || sz >= n)) 420867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = _copy_from_user(to, from, n); 421867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf else 422867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf copy_from_user_overflow(); 423867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 424867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 425867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 426867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#else 427867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define copy_from_user _copy_from_user 428867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 429867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 430867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#ifdef __tilegx__ 431867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 432867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * __copy_in_user() - copy data within user space, with less checking. 433867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @to: Destination address, in user space. 43447d632f9f8f3ed62b21f725e98b726d65769b6d7Chris Metcalf * @from: Source address, in user space. 435867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @n: Number of bytes to copy. 436867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 437867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 438867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 439867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copy data from user space to user space. Caller must check 440867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * the specified blocks with access_ok() before calling this function. 441867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 442867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be copied. 443867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 444867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 445c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalfextern unsigned long __copy_in_user_inatomic( 446867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *to, const void __user *from, unsigned long n); 447867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 448867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 449867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf__copy_in_user(void __user *to, const void __user *from, unsigned long n) 450867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 451f8abe86cc4fbd4ba083fd151b88e02fb3ce88b9cMichael S. Tsirkin might_fault(); 452c745a8a11fa1df6078bfc61fc29492ed43f71c2bChris Metcalf return __copy_in_user_inatomic(to, from, n); 453867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 454867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 455867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check 456867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfcopy_in_user(void __user *to, const void __user *from, unsigned long n) 457867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 458867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, to, n) && access_ok(VERIFY_READ, from, n)) 459867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf n = __copy_in_user(to, from, n); 460867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return n; 461867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 462867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif 463867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 464867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 465867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 466867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * strlen_user: - Get the size of a string in user space. 467867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @str: The string to measure. 468867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 469867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Context: User context only. This function may sleep. 470867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 471867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Get the size of a NUL-terminated string in user space. 472867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 473867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns the size of the string INCLUDING the terminating NUL. 474867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On exception, returns 0. 475867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 476867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If there is a limit on the length of a valid string, you may wish to 477867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * consider using strnlen_user() instead. 478867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 479867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern long strnlen_user_asm(const char __user *str, long n); 480867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check strnlen_user(const char __user *str, long n) 481867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 482867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 483867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return strnlen_user_asm(str, n); 484867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 485867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#define strlen_user(str) strnlen_user(str, LONG_MAX) 486867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 487867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 488867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking. 489867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @dst: Destination address, in kernel space. This buffer must be at 490867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * least @count bytes long. 491867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @src: Source address, in user space. 492867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @count: Maximum number of bytes to copy, including the trailing NUL. 493867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 494867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Copies a NUL-terminated string from userspace to kernel space. 495867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Caller must check the specified block with access_ok() before calling 496867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * this function. 497867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 498867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, returns the length of the string (not including the trailing 499867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * NUL). 500867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 501867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If access to userspace fails, returns -EFAULT (some data may have been 502867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * copied). 503867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 504867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * If @count is smaller than the length of the string, copies @count bytes 505867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * and returns @count. 506867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 507867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern long strncpy_from_user_asm(char *dst, const char __user *src, long); 508867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check __strncpy_from_user( 509867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf char *dst, const char __user *src, long count) 510867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 511867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 512867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return strncpy_from_user_asm(dst, src, count); 513867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 514867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline long __must_check strncpy_from_user( 515867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf char *dst, const char __user *src, long count) 516867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 517867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_READ, src, 1)) 518867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __strncpy_from_user(dst, src, count); 519867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return -EFAULT; 520867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 521867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 522867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 523867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * clear_user: - Zero a block of memory in user space. 524867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 525867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to zero. 526867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 527867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Zero a block of memory in user space. 528867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 529867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be cleared. 530867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 531867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 532867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long clear_user_asm(void __user *mem, unsigned long len); 533867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __clear_user( 534867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 535867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 536867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 537867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return clear_user_asm(mem, len); 538867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 539867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check clear_user( 540867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 541867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 542867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 543867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __clear_user(mem, len); 544867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 545867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 546867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 547867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 548867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * flush_user: - Flush a block of memory in user space from cache. 549867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 550867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to flush. 551867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 552867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be flushed. 553867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 554867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 555867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long flush_user_asm(void __user *mem, unsigned long len); 556867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __flush_user( 557867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 558867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 559867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int retval; 560867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 561867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 562867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf retval = flush_user_asm(mem, len); 563867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf mb_incoherent(); 564867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return retval; 565867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 566867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 567867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check flush_user( 568867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 569867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 570867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 571867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __flush_user(mem, len); 572867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 573867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 574867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 575867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf/** 576867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * finv_user: - Flush-inval a block of memory in user space from cache. 577867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @mem: Destination address, in user space. 578867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * @len: Number of bytes to invalidate. 579867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * 580867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * Returns number of bytes that could not be flush-invalidated. 581867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf * On success, this will be zero. 582867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf */ 583867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfextern unsigned long finv_user_asm(void __user *mem, unsigned long len); 584867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check __finv_user( 585867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 586867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 587867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf int retval; 588867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 589867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf might_fault(); 590867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf retval = finv_user_asm(mem, len); 591867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf mb_incoherent(); 592867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return retval; 593867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 594867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalfstatic inline unsigned long __must_check finv_user( 595867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf void __user *mem, unsigned long len) 596867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf{ 597867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf if (access_ok(VERIFY_WRITE, mem, len)) 598867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return __finv_user(mem, len); 599867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf return len; 600867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf} 601867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf 602867e359b97c970a60626d5d76bbe2a8fadbf38fbChris Metcalf#endif /* _ASM_TILE_UACCESS_H */ 603