1*61e85e36SJonas Bonn /* 2*61e85e36SJonas Bonn * OpenRISC Linux 3*61e85e36SJonas Bonn * 4*61e85e36SJonas Bonn * Linux architectural port borrowing liberally from similar works of 5*61e85e36SJonas Bonn * others. All original copyrights apply as per the original source 6*61e85e36SJonas Bonn * declaration. 7*61e85e36SJonas Bonn * 8*61e85e36SJonas Bonn * OpenRISC implementation: 9*61e85e36SJonas Bonn * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10*61e85e36SJonas Bonn * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11*61e85e36SJonas Bonn * et al. 12*61e85e36SJonas Bonn * 13*61e85e36SJonas Bonn * This program is free software; you can redistribute it and/or modify 14*61e85e36SJonas Bonn * it under the terms of the GNU General Public License as published by 15*61e85e36SJonas Bonn * the Free Software Foundation; either version 2 of the License, or 16*61e85e36SJonas Bonn * (at your option) any later version. 17*61e85e36SJonas Bonn */ 18*61e85e36SJonas Bonn 19*61e85e36SJonas Bonn #ifndef __ASM_OPENRISC_UACCESS_H 20*61e85e36SJonas Bonn #define __ASM_OPENRISC_UACCESS_H 21*61e85e36SJonas Bonn 22*61e85e36SJonas Bonn /* 23*61e85e36SJonas Bonn * User space memory access functions 24*61e85e36SJonas Bonn */ 25*61e85e36SJonas Bonn #include <linux/errno.h> 26*61e85e36SJonas Bonn #include <linux/thread_info.h> 27*61e85e36SJonas Bonn #include <linux/prefetch.h> 28*61e85e36SJonas Bonn #include <linux/string.h> 29*61e85e36SJonas Bonn #include <linux/thread_info.h> 30*61e85e36SJonas Bonn #include <asm/page.h> 31*61e85e36SJonas Bonn 32*61e85e36SJonas Bonn #define VERIFY_READ 0 33*61e85e36SJonas Bonn #define VERIFY_WRITE 1 34*61e85e36SJonas Bonn 35*61e85e36SJonas Bonn /* 36*61e85e36SJonas Bonn * The fs value determines whether argument validity checking should be 37*61e85e36SJonas Bonn * performed or not. If get_fs() == USER_DS, checking is performed, with 38*61e85e36SJonas Bonn * get_fs() == KERNEL_DS, checking is bypassed. 39*61e85e36SJonas Bonn * 40*61e85e36SJonas Bonn * For historical reasons, these macros are grossly misnamed. 41*61e85e36SJonas Bonn */ 42*61e85e36SJonas Bonn 43*61e85e36SJonas Bonn /* addr_limit is the maximum accessible address for the task. we misuse 44*61e85e36SJonas Bonn * the KERNEL_DS and USER_DS values to both assign and compare the 45*61e85e36SJonas Bonn * addr_limit values through the equally misnamed get/set_fs macros. 46*61e85e36SJonas Bonn * (see above) 47*61e85e36SJonas Bonn */ 48*61e85e36SJonas Bonn 49*61e85e36SJonas Bonn #define KERNEL_DS (~0UL) 50*61e85e36SJonas Bonn #define get_ds() (KERNEL_DS) 51*61e85e36SJonas Bonn 52*61e85e36SJonas Bonn #define USER_DS (TASK_SIZE) 53*61e85e36SJonas Bonn #define get_fs() (current_thread_info()->addr_limit) 54*61e85e36SJonas Bonn #define set_fs(x) (current_thread_info()->addr_limit = (x)) 55*61e85e36SJonas Bonn 56*61e85e36SJonas Bonn #define segment_eq(a, b) ((a) == (b)) 57*61e85e36SJonas Bonn 58*61e85e36SJonas Bonn /* Ensure that the range from addr to addr+size is all within the process' 59*61e85e36SJonas Bonn * address space 60*61e85e36SJonas Bonn */ 61*61e85e36SJonas Bonn #define __range_ok(addr, size) (size <= get_fs() && addr <= (get_fs()-size)) 62*61e85e36SJonas Bonn 63*61e85e36SJonas Bonn /* Ensure that addr is below task's addr_limit */ 64*61e85e36SJonas Bonn #define __addr_ok(addr) ((unsigned long) addr < get_fs()) 65*61e85e36SJonas Bonn 66*61e85e36SJonas Bonn #define access_ok(type, addr, size) \ 67*61e85e36SJonas Bonn __range_ok((unsigned long)addr, (unsigned long)size) 68*61e85e36SJonas Bonn 69*61e85e36SJonas Bonn /* 70*61e85e36SJonas Bonn * The exception table consists of pairs of addresses: the first is the 71*61e85e36SJonas Bonn * address of an instruction that is allowed to fault, and the second is 72*61e85e36SJonas Bonn * the address at which the program should continue. No registers are 73*61e85e36SJonas Bonn * modified, so it is entirely up to the continuation code to figure out 74*61e85e36SJonas Bonn * what to do. 75*61e85e36SJonas Bonn * 76*61e85e36SJonas Bonn * All the routines below use bits of fixup code that are out of line 77*61e85e36SJonas Bonn * with the main instruction path. This means when everything is well, 78*61e85e36SJonas Bonn * we don't even have to jump over them. Further, they do not intrude 79*61e85e36SJonas Bonn * on our cache or tlb entries. 80*61e85e36SJonas Bonn */ 81*61e85e36SJonas Bonn 82*61e85e36SJonas Bonn struct exception_table_entry { 83*61e85e36SJonas Bonn unsigned long insn, fixup; 84*61e85e36SJonas Bonn }; 85*61e85e36SJonas Bonn 86*61e85e36SJonas Bonn /* Returns 0 if exception not found and fixup otherwise. */ 87*61e85e36SJonas Bonn extern unsigned long search_exception_table(unsigned long); 88*61e85e36SJonas Bonn extern void sort_exception_table(void); 89*61e85e36SJonas Bonn 90*61e85e36SJonas Bonn /* 91*61e85e36SJonas Bonn * These are the main single-value transfer routines. They automatically 92*61e85e36SJonas Bonn * use the right size if we just have the right pointer type. 93*61e85e36SJonas Bonn * 94*61e85e36SJonas Bonn * This gets kind of ugly. We want to return _two_ values in "get_user()" 95*61e85e36SJonas Bonn * and yet we don't want to do any pointers, because that is too much 96*61e85e36SJonas Bonn * of a performance impact. Thus we have a few rather ugly macros here, 97*61e85e36SJonas Bonn * and hide all the uglyness from the user. 98*61e85e36SJonas Bonn * 99*61e85e36SJonas Bonn * The "__xxx" versions of the user access functions are versions that 100*61e85e36SJonas Bonn * do not verify the address space, that must have been done previously 101*61e85e36SJonas Bonn * with a separate "access_ok()" call (this is used when we do multiple 102*61e85e36SJonas Bonn * accesses to the same area of user memory). 103*61e85e36SJonas Bonn * 104*61e85e36SJonas Bonn * As we use the same address space for kernel and user data on the 105*61e85e36SJonas Bonn * PowerPC, we can just do these as direct assignments. (Of course, the 106*61e85e36SJonas Bonn * exception handling means that it's no longer "just"...) 107*61e85e36SJonas Bonn */ 108*61e85e36SJonas Bonn #define get_user(x, ptr) \ 109*61e85e36SJonas Bonn __get_user_check((x), (ptr), sizeof(*(ptr))) 110*61e85e36SJonas Bonn #define put_user(x, ptr) \ 111*61e85e36SJonas Bonn __put_user_check((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 112*61e85e36SJonas Bonn 113*61e85e36SJonas Bonn #define __get_user(x, ptr) \ 114*61e85e36SJonas Bonn __get_user_nocheck((x), (ptr), sizeof(*(ptr))) 115*61e85e36SJonas Bonn #define __put_user(x, ptr) \ 116*61e85e36SJonas Bonn __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) 117*61e85e36SJonas Bonn 118*61e85e36SJonas Bonn extern long __put_user_bad(void); 119*61e85e36SJonas Bonn 120*61e85e36SJonas Bonn #define __put_user_nocheck(x, ptr, size) \ 121*61e85e36SJonas Bonn ({ \ 122*61e85e36SJonas Bonn long __pu_err; \ 123*61e85e36SJonas Bonn __put_user_size((x), (ptr), (size), __pu_err); \ 124*61e85e36SJonas Bonn __pu_err; \ 125*61e85e36SJonas Bonn }) 126*61e85e36SJonas Bonn 127*61e85e36SJonas Bonn #define __put_user_check(x, ptr, size) \ 128*61e85e36SJonas Bonn ({ \ 129*61e85e36SJonas Bonn long __pu_err = -EFAULT; \ 130*61e85e36SJonas Bonn __typeof__(*(ptr)) *__pu_addr = (ptr); \ 131*61e85e36SJonas Bonn if (access_ok(VERIFY_WRITE, __pu_addr, size)) \ 132*61e85e36SJonas Bonn __put_user_size((x), __pu_addr, (size), __pu_err); \ 133*61e85e36SJonas Bonn __pu_err; \ 134*61e85e36SJonas Bonn }) 135*61e85e36SJonas Bonn 136*61e85e36SJonas Bonn #define __put_user_size(x, ptr, size, retval) \ 137*61e85e36SJonas Bonn do { \ 138*61e85e36SJonas Bonn retval = 0; \ 139*61e85e36SJonas Bonn switch (size) { \ 140*61e85e36SJonas Bonn case 1: __put_user_asm(x, ptr, retval, "l.sb"); break; \ 141*61e85e36SJonas Bonn case 2: __put_user_asm(x, ptr, retval, "l.sh"); break; \ 142*61e85e36SJonas Bonn case 4: __put_user_asm(x, ptr, retval, "l.sw"); break; \ 143*61e85e36SJonas Bonn case 8: __put_user_asm2(x, ptr, retval); break; \ 144*61e85e36SJonas Bonn default: __put_user_bad(); \ 145*61e85e36SJonas Bonn } \ 146*61e85e36SJonas Bonn } while (0) 147*61e85e36SJonas Bonn 148*61e85e36SJonas Bonn struct __large_struct { 149*61e85e36SJonas Bonn unsigned long buf[100]; 150*61e85e36SJonas Bonn }; 151*61e85e36SJonas Bonn #define __m(x) (*(struct __large_struct *)(x)) 152*61e85e36SJonas Bonn 153*61e85e36SJonas Bonn /* 154*61e85e36SJonas Bonn * We don't tell gcc that we are accessing memory, but this is OK 155*61e85e36SJonas Bonn * because we do not write to any memory gcc knows about, so there 156*61e85e36SJonas Bonn * are no aliasing issues. 157*61e85e36SJonas Bonn */ 158*61e85e36SJonas Bonn #define __put_user_asm(x, addr, err, op) \ 159*61e85e36SJonas Bonn __asm__ __volatile__( \ 160*61e85e36SJonas Bonn "1: "op" 0(%2),%1\n" \ 161*61e85e36SJonas Bonn "2:\n" \ 162*61e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 163*61e85e36SJonas Bonn "3: l.addi %0,r0,%3\n" \ 164*61e85e36SJonas Bonn " l.j 2b\n" \ 165*61e85e36SJonas Bonn " l.nop\n" \ 166*61e85e36SJonas Bonn ".previous\n" \ 167*61e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 168*61e85e36SJonas Bonn " .align 2\n" \ 169*61e85e36SJonas Bonn " .long 1b,3b\n" \ 170*61e85e36SJonas Bonn ".previous" \ 171*61e85e36SJonas Bonn : "=r"(err) \ 172*61e85e36SJonas Bonn : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)) 173*61e85e36SJonas Bonn 174*61e85e36SJonas Bonn #define __put_user_asm2(x, addr, err) \ 175*61e85e36SJonas Bonn __asm__ __volatile__( \ 176*61e85e36SJonas Bonn "1: l.sw 0(%2),%1\n" \ 177*61e85e36SJonas Bonn "2: l.sw 4(%2),%H1\n" \ 178*61e85e36SJonas Bonn "3:\n" \ 179*61e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 180*61e85e36SJonas Bonn "4: l.addi %0,r0,%3\n" \ 181*61e85e36SJonas Bonn " l.j 3b\n" \ 182*61e85e36SJonas Bonn " l.nop\n" \ 183*61e85e36SJonas Bonn ".previous\n" \ 184*61e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 185*61e85e36SJonas Bonn " .align 2\n" \ 186*61e85e36SJonas Bonn " .long 1b,4b\n" \ 187*61e85e36SJonas Bonn " .long 2b,4b\n" \ 188*61e85e36SJonas Bonn ".previous" \ 189*61e85e36SJonas Bonn : "=r"(err) \ 190*61e85e36SJonas Bonn : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)) 191*61e85e36SJonas Bonn 192*61e85e36SJonas Bonn #define __get_user_nocheck(x, ptr, size) \ 193*61e85e36SJonas Bonn ({ \ 194*61e85e36SJonas Bonn long __gu_err, __gu_val; \ 195*61e85e36SJonas Bonn __get_user_size(__gu_val, (ptr), (size), __gu_err); \ 196*61e85e36SJonas Bonn (x) = (__typeof__(*(ptr)))__gu_val; \ 197*61e85e36SJonas Bonn __gu_err; \ 198*61e85e36SJonas Bonn }) 199*61e85e36SJonas Bonn 200*61e85e36SJonas Bonn #define __get_user_check(x, ptr, size) \ 201*61e85e36SJonas Bonn ({ \ 202*61e85e36SJonas Bonn long __gu_err = -EFAULT, __gu_val = 0; \ 203*61e85e36SJonas Bonn const __typeof__(*(ptr)) * __gu_addr = (ptr); \ 204*61e85e36SJonas Bonn if (access_ok(VERIFY_READ, __gu_addr, size)) \ 205*61e85e36SJonas Bonn __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ 206*61e85e36SJonas Bonn (x) = (__typeof__(*(ptr)))__gu_val; \ 207*61e85e36SJonas Bonn __gu_err; \ 208*61e85e36SJonas Bonn }) 209*61e85e36SJonas Bonn 210*61e85e36SJonas Bonn extern long __get_user_bad(void); 211*61e85e36SJonas Bonn 212*61e85e36SJonas Bonn #define __get_user_size(x, ptr, size, retval) \ 213*61e85e36SJonas Bonn do { \ 214*61e85e36SJonas Bonn retval = 0; \ 215*61e85e36SJonas Bonn switch (size) { \ 216*61e85e36SJonas Bonn case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \ 217*61e85e36SJonas Bonn case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \ 218*61e85e36SJonas Bonn case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \ 219*61e85e36SJonas Bonn case 8: __get_user_asm2(x, ptr, retval); \ 220*61e85e36SJonas Bonn default: (x) = __get_user_bad(); \ 221*61e85e36SJonas Bonn } \ 222*61e85e36SJonas Bonn } while (0) 223*61e85e36SJonas Bonn 224*61e85e36SJonas Bonn #define __get_user_asm(x, addr, err, op) \ 225*61e85e36SJonas Bonn __asm__ __volatile__( \ 226*61e85e36SJonas Bonn "1: "op" %1,0(%2)\n" \ 227*61e85e36SJonas Bonn "2:\n" \ 228*61e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 229*61e85e36SJonas Bonn "3: l.addi %0,r0,%3\n" \ 230*61e85e36SJonas Bonn " l.addi %1,r0,0\n" \ 231*61e85e36SJonas Bonn " l.j 2b\n" \ 232*61e85e36SJonas Bonn " l.nop\n" \ 233*61e85e36SJonas Bonn ".previous\n" \ 234*61e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 235*61e85e36SJonas Bonn " .align 2\n" \ 236*61e85e36SJonas Bonn " .long 1b,3b\n" \ 237*61e85e36SJonas Bonn ".previous" \ 238*61e85e36SJonas Bonn : "=r"(err), "=r"(x) \ 239*61e85e36SJonas Bonn : "r"(addr), "i"(-EFAULT), "0"(err)) 240*61e85e36SJonas Bonn 241*61e85e36SJonas Bonn #define __get_user_asm2(x, addr, err) \ 242*61e85e36SJonas Bonn __asm__ __volatile__( \ 243*61e85e36SJonas Bonn "1: l.lwz %1,0(%2)\n" \ 244*61e85e36SJonas Bonn "2: l.lwz %H1,4(%2)\n" \ 245*61e85e36SJonas Bonn "3:\n" \ 246*61e85e36SJonas Bonn ".section .fixup,\"ax\"\n" \ 247*61e85e36SJonas Bonn "4: l.addi %0,r0,%3\n" \ 248*61e85e36SJonas Bonn " l.addi %1,r0,0\n" \ 249*61e85e36SJonas Bonn " l.addi %H1,r0,0\n" \ 250*61e85e36SJonas Bonn " l.j 3b\n" \ 251*61e85e36SJonas Bonn " l.nop\n" \ 252*61e85e36SJonas Bonn ".previous\n" \ 253*61e85e36SJonas Bonn ".section __ex_table,\"a\"\n" \ 254*61e85e36SJonas Bonn " .align 2\n" \ 255*61e85e36SJonas Bonn " .long 1b,4b\n" \ 256*61e85e36SJonas Bonn " .long 2b,4b\n" \ 257*61e85e36SJonas Bonn ".previous" \ 258*61e85e36SJonas Bonn : "=r"(err), "=&r"(x) \ 259*61e85e36SJonas Bonn : "r"(addr), "i"(-EFAULT), "0"(err)) 260*61e85e36SJonas Bonn 261*61e85e36SJonas Bonn /* more complex routines */ 262*61e85e36SJonas Bonn 263*61e85e36SJonas Bonn extern unsigned long __must_check 264*61e85e36SJonas Bonn __copy_tofrom_user(void *to, const void *from, unsigned long size); 265*61e85e36SJonas Bonn 266*61e85e36SJonas Bonn #define __copy_from_user(to, from, size) \ 267*61e85e36SJonas Bonn __copy_tofrom_user(to, from, size) 268*61e85e36SJonas Bonn #define __copy_to_user(to, from, size) \ 269*61e85e36SJonas Bonn __copy_tofrom_user(to, from, size) 270*61e85e36SJonas Bonn 271*61e85e36SJonas Bonn #define __copy_to_user_inatomic __copy_to_user 272*61e85e36SJonas Bonn #define __copy_from_user_inatomic __copy_from_user 273*61e85e36SJonas Bonn 274*61e85e36SJonas Bonn static inline unsigned long 275*61e85e36SJonas Bonn copy_from_user(void *to, const void *from, unsigned long n) 276*61e85e36SJonas Bonn { 277*61e85e36SJonas Bonn unsigned long over; 278*61e85e36SJonas Bonn 279*61e85e36SJonas Bonn if (access_ok(VERIFY_READ, from, n)) 280*61e85e36SJonas Bonn return __copy_tofrom_user(to, from, n); 281*61e85e36SJonas Bonn if ((unsigned long)from < TASK_SIZE) { 282*61e85e36SJonas Bonn over = (unsigned long)from + n - TASK_SIZE; 283*61e85e36SJonas Bonn return __copy_tofrom_user(to, from, n - over) + over; 284*61e85e36SJonas Bonn } 285*61e85e36SJonas Bonn return n; 286*61e85e36SJonas Bonn } 287*61e85e36SJonas Bonn 288*61e85e36SJonas Bonn static inline unsigned long 289*61e85e36SJonas Bonn copy_to_user(void *to, const void *from, unsigned long n) 290*61e85e36SJonas Bonn { 291*61e85e36SJonas Bonn unsigned long over; 292*61e85e36SJonas Bonn 293*61e85e36SJonas Bonn if (access_ok(VERIFY_WRITE, to, n)) 294*61e85e36SJonas Bonn return __copy_tofrom_user(to, from, n); 295*61e85e36SJonas Bonn if ((unsigned long)to < TASK_SIZE) { 296*61e85e36SJonas Bonn over = (unsigned long)to + n - TASK_SIZE; 297*61e85e36SJonas Bonn return __copy_tofrom_user(to, from, n - over) + over; 298*61e85e36SJonas Bonn } 299*61e85e36SJonas Bonn return n; 300*61e85e36SJonas Bonn } 301*61e85e36SJonas Bonn 302*61e85e36SJonas Bonn extern unsigned long __clear_user(void *addr, unsigned long size); 303*61e85e36SJonas Bonn 304*61e85e36SJonas Bonn static inline __must_check unsigned long 305*61e85e36SJonas Bonn clear_user(void *addr, unsigned long size) 306*61e85e36SJonas Bonn { 307*61e85e36SJonas Bonn 308*61e85e36SJonas Bonn if (access_ok(VERIFY_WRITE, addr, size)) 309*61e85e36SJonas Bonn return __clear_user(addr, size); 310*61e85e36SJonas Bonn if ((unsigned long)addr < TASK_SIZE) { 311*61e85e36SJonas Bonn unsigned long over = (unsigned long)addr + size - TASK_SIZE; 312*61e85e36SJonas Bonn return __clear_user(addr, size - over) + over; 313*61e85e36SJonas Bonn } 314*61e85e36SJonas Bonn return size; 315*61e85e36SJonas Bonn } 316*61e85e36SJonas Bonn 317*61e85e36SJonas Bonn extern int __strncpy_from_user(char *dst, const char *src, long count); 318*61e85e36SJonas Bonn 319*61e85e36SJonas Bonn static inline long strncpy_from_user(char *dst, const char *src, long count) 320*61e85e36SJonas Bonn { 321*61e85e36SJonas Bonn if (access_ok(VERIFY_READ, src, 1)) 322*61e85e36SJonas Bonn return __strncpy_from_user(dst, src, count); 323*61e85e36SJonas Bonn return -EFAULT; 324*61e85e36SJonas Bonn } 325*61e85e36SJonas Bonn 326*61e85e36SJonas Bonn /* 327*61e85e36SJonas Bonn * Return the size of a string (including the ending 0) 328*61e85e36SJonas Bonn * 329*61e85e36SJonas Bonn * Return 0 for error 330*61e85e36SJonas Bonn */ 331*61e85e36SJonas Bonn 332*61e85e36SJonas Bonn extern int __strnlen_user(const char *str, long len, unsigned long top); 333*61e85e36SJonas Bonn 334*61e85e36SJonas Bonn /* 335*61e85e36SJonas Bonn * Returns the length of the string at str (including the null byte), 336*61e85e36SJonas Bonn * or 0 if we hit a page we can't access, 337*61e85e36SJonas Bonn * or something > len if we didn't find a null byte. 338*61e85e36SJonas Bonn * 339*61e85e36SJonas Bonn * The `top' parameter to __strnlen_user is to make sure that 340*61e85e36SJonas Bonn * we can never overflow from the user area into kernel space. 341*61e85e36SJonas Bonn */ 342*61e85e36SJonas Bonn static inline long strnlen_user(const char __user *str, long len) 343*61e85e36SJonas Bonn { 344*61e85e36SJonas Bonn unsigned long top = (unsigned long)get_fs(); 345*61e85e36SJonas Bonn unsigned long res = 0; 346*61e85e36SJonas Bonn 347*61e85e36SJonas Bonn if (__addr_ok(str)) 348*61e85e36SJonas Bonn res = __strnlen_user(str, len, top); 349*61e85e36SJonas Bonn 350*61e85e36SJonas Bonn return res; 351*61e85e36SJonas Bonn } 352*61e85e36SJonas Bonn 353*61e85e36SJonas Bonn #define strlen_user(str) strnlen_user(str, TASK_SIZE-1) 354*61e85e36SJonas Bonn 355*61e85e36SJonas Bonn #endif /* __ASM_OPENRISC_UACCESS_H */ 356