161e85e36SJonas Bonn /* 261e85e36SJonas Bonn * OpenRISC Linux 361e85e36SJonas Bonn * 461e85e36SJonas Bonn * Linux architectural port borrowing liberally from similar works of 561e85e36SJonas Bonn * others. All original copyrights apply as per the original source 661e85e36SJonas Bonn * declaration. 761e85e36SJonas Bonn * 861e85e36SJonas Bonn * OpenRISC implementation: 961e85e36SJonas Bonn * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 1061e85e36SJonas Bonn * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 1161e85e36SJonas Bonn * et al. 1261e85e36SJonas Bonn * 1361e85e36SJonas Bonn * This program is free software; you can redistribute it and/or modify 1461e85e36SJonas Bonn * it under the terms of the GNU General Public License as published by 1561e85e36SJonas Bonn * the Free Software Foundation; either version 2 of the License, or 1661e85e36SJonas Bonn * (at your option) any later version. 1761e85e36SJonas Bonn */ 1861e85e36SJonas Bonn 1961e85e36SJonas Bonn #ifndef __ASM_OPENRISC_UACCESS_H 2061e85e36SJonas Bonn #define __ASM_OPENRISC_UACCESS_H 2161e85e36SJonas Bonn 2261e85e36SJonas Bonn /* 2361e85e36SJonas Bonn * User space memory access functions 2461e85e36SJonas Bonn */ 2561e85e36SJonas Bonn #include <linux/prefetch.h> 2661e85e36SJonas Bonn #include <linux/string.h> 2761e85e36SJonas Bonn #include <asm/page.h> 28*6c36a4ebSAl Viro #include <asm/extable.h> 2961e85e36SJonas Bonn 3061e85e36SJonas Bonn /* 3161e85e36SJonas Bonn * The fs value determines whether argument validity checking should be 3261e85e36SJonas Bonn * performed or not. If get_fs() == USER_DS, checking is performed, with 3361e85e36SJonas Bonn * get_fs() == KERNEL_DS, checking is bypassed. 3461e85e36SJonas Bonn * 3561e85e36SJonas Bonn * For historical reasons, these macros are grossly misnamed. 3661e85e36SJonas Bonn */ 3761e85e36SJonas Bonn 3861e85e36SJonas Bonn /* addr_limit is the maximum accessible address for the task. we misuse 3961e85e36SJonas Bonn * the KERNEL_DS and USER_DS values to both assign and compare the 4061e85e36SJonas Bonn * addr_limit values through the equally misnamed get/set_fs macros. 4161e85e36SJonas Bonn * (see above) 4261e85e36SJonas Bonn */ 4361e85e36SJonas Bonn 4461e85e36SJonas Bonn #define KERNEL_DS (~0UL) 4561e85e36SJonas Bonn #define get_ds() (KERNEL_DS) 4661e85e36SJonas Bonn 4761e85e36SJonas Bonn #define USER_DS (TASK_SIZE) 4861e85e36SJonas Bonn #define get_fs() (current_thread_info()->addr_limit) 4961e85e36SJonas Bonn #define set_fs(x) (current_thread_info()->addr_limit = (x)) 5061e85e36SJonas Bonn 5161e85e36SJonas Bonn #define segment_eq(a, b) ((a) == (b)) 5261e85e36SJonas Bonn 5361e85e36SJonas Bonn /* Ensure that the range from addr to addr+size is all within the process' 5461e85e36SJonas Bonn * address space 5561e85e36SJonas Bonn */ 5661e85e36SJonas Bonn #define __range_ok(addr, size) (size <= get_fs() && addr <= (get_fs()-size)) 5761e85e36SJonas Bonn 5861e85e36SJonas Bonn /* Ensure that addr is below task's addr_limit */ 5961e85e36SJonas Bonn #define __addr_ok(addr) ((unsigned long) addr < get_fs()) 6061e85e36SJonas Bonn 6161e85e36SJonas Bonn #define access_ok(type, addr, size) \ 6261e85e36SJonas Bonn __range_ok((unsigned long)addr, (unsigned long)size) 6361e85e36SJonas Bonn 6461e85e36SJonas Bonn /* 6561e85e36SJonas Bonn * These are the main single-value transfer routines. They automatically 6661e85e36SJonas Bonn * use the right size if we just have the right pointer type. 6761e85e36SJonas Bonn * 6861e85e36SJonas Bonn * This gets kind of ugly. We want to return _two_ values in "get_user()" 6961e85e36SJonas Bonn * and yet we don't want to do any pointers, because that is too much 7061e85e36SJonas Bonn * of a performance impact. Thus we have a few rather ugly macros here, 7161e85e36SJonas Bonn * and hide all the uglyness from the user. 7261e85e36SJonas Bonn * 7361e85e36SJonas Bonn * The "__xxx" versions of the user access functions are versions that 7461e85e36SJonas Bonn * do not verify the address space, that must have been done previously 7561e85e36SJonas Bonn * with a separate "access_ok()" call (this is used when we do multiple 7661e85e36SJonas Bonn * accesses to the same area of user memory). 7761e85e36SJonas Bonn * 7861e85e36SJonas Bonn * As we use the same address space for kernel and user data on the 7961e85e36SJonas Bonn * PowerPC, we can just do these as direct assignments. (Of course, the 8061e85e36SJonas Bonn * exception handling means that it's no longer "just"...) 8161e85e36SJonas Bonn */ 8261e85e36SJonas Bonn #define get_user(x, ptr) \ 8361e85e36SJonas Bonn __get_user_check((x), (ptr), sizeof(*(ptr))) 8461e85e36SJonas Bonn #define put_user(x, ptr) \ 8561e85e36SJonas Bonn __put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 8661e85e36SJonas Bonn 8761e85e36SJonas Bonn #define __get_user(x, ptr) \ 8861e85e36SJonas Bonn __get_user_nocheck((x), (ptr), sizeof(*(ptr))) 8961e85e36SJonas Bonn #define __put_user(x, ptr) \ 9061e85e36SJonas Bonn __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 9161e85e36SJonas Bonn 9261e85e36SJonas Bonn extern long __put_user_bad(void); 9361e85e36SJonas Bonn 9461e85e36SJonas Bonn #define __put_user_nocheck(x, ptr, size) \ 9561e85e36SJonas Bonn ({ \ 9661e85e36SJonas Bonn long __pu_err; \ 9761e85e36SJonas Bonn __put_user_size((x), (ptr), (size), __pu_err); \ 9861e85e36SJonas Bonn __pu_err; \ 9961e85e36SJonas Bonn }) 10061e85e36SJonas Bonn 10161e85e36SJonas Bonn #define __put_user_check(x, ptr, size) \ 10261e85e36SJonas Bonn ({ \ 10361e85e36SJonas Bonn long __pu_err = -EFAULT; \ 10461e85e36SJonas Bonn __typeof__(*(ptr)) *__pu_addr = (ptr); \ 10561e85e36SJonas Bonn if (access_ok(VERIFY_WRITE, __pu_addr, size)) \ 10661e85e36SJonas Bonn __put_user_size((x), __pu_addr, (size), __pu_err); \ 10761e85e36SJonas Bonn __pu_err; \ 10861e85e36SJonas Bonn }) 10961e85e36SJonas Bonn 11061e85e36SJonas Bonn #define __put_user_size(x, ptr, size, retval) \ 11161e85e36SJonas Bonn do { \ 11261e85e36SJonas Bonn retval = 0; \ 11361e85e36SJonas Bonn switch (size) { \ 11461e85e36SJonas Bonn case 1: __put_user_asm(x, ptr, retval, "l.sb"); break; \ 11561e85e36SJonas Bonn case 2: __put_user_asm(x, ptr, retval, "l.sh"); break; \ 11661e85e36SJonas Bonn case 4: __put_user_asm(x, ptr, retval, "l.sw"); break; \ 11761e85e36SJonas Bonn case 8: __put_user_asm2(x, ptr, retval); break; \ 11861e85e36SJonas Bonn default: __put_user_bad(); \ 11961e85e36SJonas Bonn } \ 12061e85e36SJonas Bonn } while (0) 12161e85e36SJonas Bonn 12261e85e36SJonas Bonn struct __large_struct { 12361e85e36SJonas Bonn unsigned long buf[100]; 12461e85e36SJonas Bonn }; 12561e85e36SJonas Bonn #define __m(x) (*(struct __large_struct *)(x)) 12661e85e36SJonas Bonn 12761e85e36SJonas Bonn /* 12861e85e36SJonas Bonn * We don't tell gcc that we are accessing memory, but this is OK 12961e85e36SJonas Bonn * because we do not write to any memory gcc knows about, so there 13061e85e36SJonas Bonn * are no aliasing issues. 13161e85e36SJonas Bonn */ 13261e85e36SJonas Bonn #define __put_user_asm(x, addr, err, op) \ 13361e85e36SJonas Bonn __asm__ __volatile__( \ 13461e85e36SJonas Bonn "1: "op" 0(%2),%1\n" \ 13561e85e36SJonas Bonn "2:\n" \ 13661e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 13761e85e36SJonas Bonn "3: l.addi %0,r0,%3\n" \ 13861e85e36SJonas Bonn " l.j 2b\n" \ 13961e85e36SJonas Bonn " l.nop\n" \ 14061e85e36SJonas Bonn ".previous\n" \ 14161e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 14261e85e36SJonas Bonn " .align 2\n" \ 14361e85e36SJonas Bonn " .long 1b,3b\n" \ 14461e85e36SJonas Bonn ".previous" \ 14561e85e36SJonas Bonn : "=r"(err) \ 14661e85e36SJonas Bonn : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)) 14761e85e36SJonas Bonn 14861e85e36SJonas Bonn #define __put_user_asm2(x, addr, err) \ 14961e85e36SJonas Bonn __asm__ __volatile__( \ 15061e85e36SJonas Bonn "1: l.sw 0(%2),%1\n" \ 15161e85e36SJonas Bonn "2: l.sw 4(%2),%H1\n" \ 15261e85e36SJonas Bonn "3:\n" \ 15361e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 15461e85e36SJonas Bonn "4: l.addi %0,r0,%3\n" \ 15561e85e36SJonas Bonn " l.j 3b\n" \ 15661e85e36SJonas Bonn " l.nop\n" \ 15761e85e36SJonas Bonn ".previous\n" \ 15861e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 15961e85e36SJonas Bonn " .align 2\n" \ 16061e85e36SJonas Bonn " .long 1b,4b\n" \ 16161e85e36SJonas Bonn " .long 2b,4b\n" \ 16261e85e36SJonas Bonn ".previous" \ 16361e85e36SJonas Bonn : "=r"(err) \ 16461e85e36SJonas Bonn : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)) 16561e85e36SJonas Bonn 16661e85e36SJonas Bonn #define __get_user_nocheck(x, ptr, size) \ 16761e85e36SJonas Bonn ({ \ 16861e85e36SJonas Bonn long __gu_err, __gu_val; \ 16961e85e36SJonas Bonn __get_user_size(__gu_val, (ptr), (size), __gu_err); \ 170582a6783SMichael S. Tsirkin (x) = (__force __typeof__(*(ptr)))__gu_val; \ 17161e85e36SJonas Bonn __gu_err; \ 17261e85e36SJonas Bonn }) 17361e85e36SJonas Bonn 17461e85e36SJonas Bonn #define __get_user_check(x, ptr, size) \ 17561e85e36SJonas Bonn ({ \ 17661e85e36SJonas Bonn long __gu_err = -EFAULT, __gu_val = 0; \ 17761e85e36SJonas Bonn const __typeof__(*(ptr)) * __gu_addr = (ptr); \ 17861e85e36SJonas Bonn if (access_ok(VERIFY_READ, __gu_addr, size)) \ 17961e85e36SJonas Bonn __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ 180582a6783SMichael S. Tsirkin (x) = (__force __typeof__(*(ptr)))__gu_val; \ 18161e85e36SJonas Bonn __gu_err; \ 18261e85e36SJonas Bonn }) 18361e85e36SJonas Bonn 18461e85e36SJonas Bonn extern long __get_user_bad(void); 18561e85e36SJonas Bonn 18661e85e36SJonas Bonn #define __get_user_size(x, ptr, size, retval) \ 18761e85e36SJonas Bonn do { \ 18861e85e36SJonas Bonn retval = 0; \ 18961e85e36SJonas Bonn switch (size) { \ 19061e85e36SJonas Bonn case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \ 19161e85e36SJonas Bonn case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \ 19261e85e36SJonas Bonn case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \ 19361e85e36SJonas Bonn case 8: __get_user_asm2(x, ptr, retval); \ 19461e85e36SJonas Bonn default: (x) = __get_user_bad(); \ 19561e85e36SJonas Bonn } \ 19661e85e36SJonas Bonn } while (0) 19761e85e36SJonas Bonn 19861e85e36SJonas Bonn #define __get_user_asm(x, addr, err, op) \ 19961e85e36SJonas Bonn __asm__ __volatile__( \ 20061e85e36SJonas Bonn "1: "op" %1,0(%2)\n" \ 20161e85e36SJonas Bonn "2:\n" \ 20261e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 20361e85e36SJonas Bonn "3: l.addi %0,r0,%3\n" \ 20461e85e36SJonas Bonn " l.addi %1,r0,0\n" \ 20561e85e36SJonas Bonn " l.j 2b\n" \ 20661e85e36SJonas Bonn " l.nop\n" \ 20761e85e36SJonas Bonn ".previous\n" \ 20861e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 20961e85e36SJonas Bonn " .align 2\n" \ 21061e85e36SJonas Bonn " .long 1b,3b\n" \ 21161e85e36SJonas Bonn ".previous" \ 21261e85e36SJonas Bonn : "=r"(err), "=r"(x) \ 21361e85e36SJonas Bonn : "r"(addr), "i"(-EFAULT), "0"(err)) 21461e85e36SJonas Bonn 21561e85e36SJonas Bonn #define __get_user_asm2(x, addr, err) \ 21661e85e36SJonas Bonn __asm__ __volatile__( \ 21761e85e36SJonas Bonn "1: l.lwz %1,0(%2)\n" \ 21861e85e36SJonas Bonn "2: l.lwz %H1,4(%2)\n" \ 21961e85e36SJonas Bonn "3:\n" \ 22061e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 22161e85e36SJonas Bonn "4: l.addi %0,r0,%3\n" \ 22261e85e36SJonas Bonn " l.addi %1,r0,0\n" \ 22361e85e36SJonas Bonn " l.addi %H1,r0,0\n" \ 22461e85e36SJonas Bonn " l.j 3b\n" \ 22561e85e36SJonas Bonn " l.nop\n" \ 22661e85e36SJonas Bonn ".previous\n" \ 22761e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 22861e85e36SJonas Bonn " .align 2\n" \ 22961e85e36SJonas Bonn " .long 1b,4b\n" \ 23061e85e36SJonas Bonn " .long 2b,4b\n" \ 23161e85e36SJonas Bonn ".previous" \ 23261e85e36SJonas Bonn : "=r"(err), "=&r"(x) \ 23361e85e36SJonas Bonn : "r"(addr), "i"(-EFAULT), "0"(err)) 23461e85e36SJonas Bonn 23561e85e36SJonas Bonn /* more complex routines */ 23661e85e36SJonas Bonn 23761e85e36SJonas Bonn extern unsigned long __must_check 23861e85e36SJonas Bonn __copy_tofrom_user(void *to, const void *from, unsigned long size); 23961e85e36SJonas Bonn 24061e85e36SJonas Bonn #define __copy_from_user(to, from, size) \ 24161e85e36SJonas Bonn __copy_tofrom_user(to, from, size) 24261e85e36SJonas Bonn #define __copy_to_user(to, from, size) \ 24361e85e36SJonas Bonn __copy_tofrom_user(to, from, size) 24461e85e36SJonas Bonn 24561e85e36SJonas Bonn #define __copy_to_user_inatomic __copy_to_user 24661e85e36SJonas Bonn #define __copy_from_user_inatomic __copy_from_user 24761e85e36SJonas Bonn 24861e85e36SJonas Bonn static inline unsigned long 24961e85e36SJonas Bonn copy_from_user(void *to, const void *from, unsigned long n) 25061e85e36SJonas Bonn { 251acb2505dSAl Viro unsigned long res = n; 25261e85e36SJonas Bonn 253acb2505dSAl Viro if (likely(access_ok(VERIFY_READ, from, n))) 2548e4b7205SGuenter Roeck res = __copy_tofrom_user(to, from, n); 255acb2505dSAl Viro if (unlikely(res)) 256acb2505dSAl Viro memset(to + (n - res), 0, res); 257acb2505dSAl Viro return res; 25861e85e36SJonas Bonn } 25961e85e36SJonas Bonn 26061e85e36SJonas Bonn static inline unsigned long 26161e85e36SJonas Bonn copy_to_user(void *to, const void *from, unsigned long n) 26261e85e36SJonas Bonn { 263acb2505dSAl Viro if (likely(access_ok(VERIFY_WRITE, to, n))) 264acb2505dSAl Viro n = __copy_tofrom_user(to, from, n); 26561e85e36SJonas Bonn return n; 26661e85e36SJonas Bonn } 26761e85e36SJonas Bonn 26861e85e36SJonas Bonn extern unsigned long __clear_user(void *addr, unsigned long size); 26961e85e36SJonas Bonn 27061e85e36SJonas Bonn static inline __must_check unsigned long 27161e85e36SJonas Bonn clear_user(void *addr, unsigned long size) 27261e85e36SJonas Bonn { 273acb2505dSAl Viro if (likely(access_ok(VERIFY_WRITE, addr, size))) 274acb2505dSAl Viro size = __clear_user(addr, size); 27561e85e36SJonas Bonn return size; 27661e85e36SJonas Bonn } 27761e85e36SJonas Bonn 278603d6637SJonas Bonn #define user_addr_max() \ 279db68ce10SAl Viro (uaccess_kernel() ? ~0UL : TASK_SIZE) 28061e85e36SJonas Bonn 281603d6637SJonas Bonn extern long strncpy_from_user(char *dest, const char __user *src, long count); 28261e85e36SJonas Bonn 283b48b2c3eSJonas Bonn extern __must_check long strlen_user(const char __user *str); 284b48b2c3eSJonas Bonn extern __must_check long strnlen_user(const char __user *str, long n); 28561e85e36SJonas Bonn 28661e85e36SJonas Bonn #endif /* __ASM_OPENRISC_UACCESS_H */ 287