root/arch/mips/include/asm/uaccess.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. eva_kernel_access
  2. __access_ok
  3. raw_copy_to_user
  4. raw_copy_from_user
  5. raw_copy_in_user
  6. __clear_user
  7. strncpy_from_user
  8. strnlen_user

   1 /*
   2  * This file is subject to the terms and conditions of the GNU General Public
   3  * License.  See the file "COPYING" in the main directory of this archive
   4  * for more details.
   5  *
   6  * Copyright (C) 1996, 1997, 1998, 1999, 2000, 03, 04 by Ralf Baechle
   7  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   8  * Copyright (C) 2007  Maciej W. Rozycki
   9  * Copyright (C) 2014, Imagination Technologies Ltd.
  10  */
  11 #ifndef _ASM_UACCESS_H
  12 #define _ASM_UACCESS_H
  13 
  14 #include <linux/kernel.h>
  15 #include <linux/string.h>
  16 #include <asm/asm-eva.h>
  17 #include <asm/extable.h>
  18 
  19 /*
  20  * The fs value determines whether argument validity checking should be
  21  * performed or not.  If get_fs() == USER_DS, checking is performed, with
  22  * get_fs() == KERNEL_DS, checking is bypassed.
  23  *
  24  * For historical reasons, these macros are grossly misnamed.
  25  */
  26 #ifdef CONFIG_32BIT
  27 
  28 #ifdef CONFIG_KVM_GUEST
  29 #define __UA_LIMIT 0x40000000UL
  30 #else
  31 #define __UA_LIMIT 0x80000000UL
  32 #endif
  33 
  34 #define __UA_ADDR       ".word"
  35 #define __UA_LA         "la"
  36 #define __UA_ADDU       "addu"
  37 #define __UA_t0         "$8"
  38 #define __UA_t1         "$9"
  39 
  40 #endif /* CONFIG_32BIT */
  41 
  42 #ifdef CONFIG_64BIT
  43 
  44 extern u64 __ua_limit;
  45 
  46 #define __UA_LIMIT      __ua_limit
  47 
  48 #define __UA_ADDR       ".dword"
  49 #define __UA_LA         "dla"
  50 #define __UA_ADDU       "daddu"
  51 #define __UA_t0         "$12"
  52 #define __UA_t1         "$13"
  53 
  54 #endif /* CONFIG_64BIT */
  55 
  56 /*
  57  * USER_DS is a bitmask that has the bits set that may not be set in a valid
  58  * userspace address.  Note that we limit 32-bit userspace to 0x7fff8000 but
  59  * the arithmetic we're doing only works if the limit is a power of two, so
  60  * we use 0x80000000 here on 32-bit kernels.  If a process passes an invalid
  61  * address in this range it's the process's problem, not ours :-)
  62  */
  63 
  64 #ifdef CONFIG_KVM_GUEST
  65 #define KERNEL_DS       ((mm_segment_t) { 0x80000000UL })
  66 #define USER_DS         ((mm_segment_t) { 0xC0000000UL })
  67 #else
  68 #define KERNEL_DS       ((mm_segment_t) { 0UL })
  69 #define USER_DS         ((mm_segment_t) { __UA_LIMIT })
  70 #endif
  71 
  72 #define get_fs()        (current_thread_info()->addr_limit)
  73 #define set_fs(x)       (current_thread_info()->addr_limit = (x))
  74 
  75 #define segment_eq(a, b)        ((a).seg == (b).seg)
  76 
  77 /*
  78  * eva_kernel_access() - determine whether kernel memory access on an EVA system
  79  *
  80  * Determines whether memory accesses should be performed to kernel memory
  81  * on a system using Extended Virtual Addressing (EVA).
  82  *
  83  * Return: true if a kernel memory access on an EVA system, else false.
  84  */
  85 static inline bool eva_kernel_access(void)
  86 {
  87         if (!IS_ENABLED(CONFIG_EVA))
  88                 return false;
  89 
  90         return uaccess_kernel();
  91 }
  92 
  93 /*
  94  * Is a address valid? This does a straightforward calculation rather
  95  * than tests.
  96  *
  97  * Address valid if:
  98  *  - "addr" doesn't have any high-bits set
  99  *  - AND "size" doesn't have any high-bits set
 100  *  - AND "addr+size" doesn't have any high-bits set
 101  *  - OR we are in kernel mode.
 102  *
 103  * __ua_size() is a trick to avoid runtime checking of positive constant
 104  * sizes; for those we already know at compile time that the size is ok.
 105  */
 106 #define __ua_size(size)                                                 \
 107         ((__builtin_constant_p(size) && (signed long) (size) > 0) ? 0 : (size))
 108 
 109 /*
 110  * access_ok: - Checks if a user space pointer is valid
 111  * @addr: User space pointer to start of block to check
 112  * @size: Size of block to check
 113  *
 114  * Context: User context only. This function may sleep if pagefaults are
 115  *          enabled.
 116  *
 117  * Checks if a pointer to a block of memory in user space is valid.
 118  *
 119  * Returns true (nonzero) if the memory block may be valid, false (zero)
 120  * if it is definitely invalid.
 121  *
 122  * Note that, depending on architecture, this function probably just
 123  * checks that the pointer is in the user space range - after calling
 124  * this function, memory access functions may still return -EFAULT.
 125  */
 126 
 127 static inline int __access_ok(const void __user *p, unsigned long size)
 128 {
 129         unsigned long addr = (unsigned long)p;
 130         return (get_fs().seg & (addr | (addr + size) | __ua_size(size))) == 0;
 131 }
 132 
 133 #define access_ok(addr, size)                                   \
 134         likely(__access_ok((addr), (size)))
 135 
 136 /*
 137  * put_user: - Write a simple value into user space.
 138  * @x:   Value to copy to user space.
 139  * @ptr: Destination address, in user space.
 140  *
 141  * Context: User context only. This function may sleep if pagefaults are
 142  *          enabled.
 143  *
 144  * This macro copies a single simple value from kernel space to user
 145  * space.  It supports simple types like char and int, but not larger
 146  * data types like structures or arrays.
 147  *
 148  * @ptr must have pointer-to-simple-variable type, and @x must be assignable
 149  * to the result of dereferencing @ptr.
 150  *
 151  * Returns zero on success, or -EFAULT on error.
 152  */
 153 #define put_user(x,ptr) \
 154         __put_user_check((x), (ptr), sizeof(*(ptr)))
 155 
 156 /*
 157  * get_user: - Get a simple variable from user space.
 158  * @x:   Variable to store result.
 159  * @ptr: Source address, in user space.
 160  *
 161  * Context: User context only. This function may sleep if pagefaults are
 162  *          enabled.
 163  *
 164  * This macro copies a single simple variable from user space to kernel
 165  * space.  It supports simple types like char and int, but not larger
 166  * data types like structures or arrays.
 167  *
 168  * @ptr must have pointer-to-simple-variable type, and the result of
 169  * dereferencing @ptr must be assignable to @x without a cast.
 170  *
 171  * Returns zero on success, or -EFAULT on error.
 172  * On error, the variable @x is set to zero.
 173  */
 174 #define get_user(x,ptr) \
 175         __get_user_check((x), (ptr), sizeof(*(ptr)))
 176 
 177 /*
 178  * __put_user: - Write a simple value into user space, with less checking.
 179  * @x:   Value to copy to user space.
 180  * @ptr: Destination address, in user space.
 181  *
 182  * Context: User context only. This function may sleep if pagefaults are
 183  *          enabled.
 184  *
 185  * This macro copies a single simple value from kernel space to user
 186  * space.  It supports simple types like char and int, but not larger
 187  * data types like structures or arrays.
 188  *
 189  * @ptr must have pointer-to-simple-variable type, and @x must be assignable
 190  * to the result of dereferencing @ptr.
 191  *
 192  * Caller must check the pointer with access_ok() before calling this
 193  * function.
 194  *
 195  * Returns zero on success, or -EFAULT on error.
 196  */
 197 #define __put_user(x,ptr) \
 198         __put_user_nocheck((x), (ptr), sizeof(*(ptr)))
 199 
 200 /*
 201  * __get_user: - Get a simple variable from user space, with less checking.
 202  * @x:   Variable to store result.
 203  * @ptr: Source address, in user space.
 204  *
 205  * Context: User context only. This function may sleep if pagefaults are
 206  *          enabled.
 207  *
 208  * This macro copies a single simple variable from user space to kernel
 209  * space.  It supports simple types like char and int, but not larger
 210  * data types like structures or arrays.
 211  *
 212  * @ptr must have pointer-to-simple-variable type, and the result of
 213  * dereferencing @ptr must be assignable to @x without a cast.
 214  *
 215  * Caller must check the pointer with access_ok() before calling this
 216  * function.
 217  *
 218  * Returns zero on success, or -EFAULT on error.
 219  * On error, the variable @x is set to zero.
 220  */
 221 #define __get_user(x,ptr) \
 222         __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
 223 
 224 struct __large_struct { unsigned long buf[100]; };
 225 #define __m(x) (*(struct __large_struct __user *)(x))
 226 
 227 /*
 228  * Yuck.  We need two variants, one for 64bit operation and one
 229  * for 32 bit mode and old iron.
 230  */
 231 #ifndef CONFIG_EVA
 232 #define __get_kernel_common(val, size, ptr) __get_user_common(val, size, ptr)
 233 #else
 234 /*
 235  * Kernel specific functions for EVA. We need to use normal load instructions
 236  * to read data from kernel when operating in EVA mode. We use these macros to
 237  * avoid redefining __get_user_asm for EVA.
 238  */
 239 #undef _loadd
 240 #undef _loadw
 241 #undef _loadh
 242 #undef _loadb
 243 #ifdef CONFIG_32BIT
 244 #define _loadd                  _loadw
 245 #else
 246 #define _loadd(reg, addr)       "ld " reg ", " addr
 247 #endif
 248 #define _loadw(reg, addr)       "lw " reg ", " addr
 249 #define _loadh(reg, addr)       "lh " reg ", " addr
 250 #define _loadb(reg, addr)       "lb " reg ", " addr
 251 
 252 #define __get_kernel_common(val, size, ptr)                             \
 253 do {                                                                    \
 254         switch (size) {                                                 \
 255         case 1: __get_data_asm(val, _loadb, ptr); break;                \
 256         case 2: __get_data_asm(val, _loadh, ptr); break;                \
 257         case 4: __get_data_asm(val, _loadw, ptr); break;                \
 258         case 8: __GET_DW(val, _loadd, ptr); break;                      \
 259         default: __get_user_unknown(); break;                           \
 260         }                                                               \
 261 } while (0)
 262 #endif
 263 
 264 #ifdef CONFIG_32BIT
 265 #define __GET_DW(val, insn, ptr) __get_data_asm_ll32(val, insn, ptr)
 266 #endif
 267 #ifdef CONFIG_64BIT
 268 #define __GET_DW(val, insn, ptr) __get_data_asm(val, insn, ptr)
 269 #endif
 270 
 271 extern void __get_user_unknown(void);
 272 
 273 #define __get_user_common(val, size, ptr)                               \
 274 do {                                                                    \
 275         switch (size) {                                                 \
 276         case 1: __get_data_asm(val, user_lb, ptr); break;               \
 277         case 2: __get_data_asm(val, user_lh, ptr); break;               \
 278         case 4: __get_data_asm(val, user_lw, ptr); break;               \
 279         case 8: __GET_DW(val, user_ld, ptr); break;                     \
 280         default: __get_user_unknown(); break;                           \
 281         }                                                               \
 282 } while (0)
 283 
 284 #define __get_user_nocheck(x, ptr, size)                                \
 285 ({                                                                      \
 286         int __gu_err;                                                   \
 287                                                                         \
 288         if (eva_kernel_access()) {                                      \
 289                 __get_kernel_common((x), size, ptr);                    \
 290         } else {                                                        \
 291                 __chk_user_ptr(ptr);                                    \
 292                 __get_user_common((x), size, ptr);                      \
 293         }                                                               \
 294         __gu_err;                                                       \
 295 })
 296 
 297 #define __get_user_check(x, ptr, size)                                  \
 298 ({                                                                      \
 299         int __gu_err = -EFAULT;                                         \
 300         const __typeof__(*(ptr)) __user * __gu_ptr = (ptr);             \
 301                                                                         \
 302         might_fault();                                                  \
 303         if (likely(access_ok( __gu_ptr, size))) {               \
 304                 if (eva_kernel_access())                                \
 305                         __get_kernel_common((x), size, __gu_ptr);       \
 306                 else                                                    \
 307                         __get_user_common((x), size, __gu_ptr);         \
 308         } else                                                          \
 309                 (x) = 0;                                                \
 310                                                                         \
 311         __gu_err;                                                       \
 312 })
 313 
 314 #define __get_data_asm(val, insn, addr)                                 \
 315 {                                                                       \
 316         long __gu_tmp;                                                  \
 317                                                                         \
 318         __asm__ __volatile__(                                           \
 319         "1:     "insn("%1", "%3")"                              \n"     \
 320         "2:                                                     \n"     \
 321         "       .insn                                           \n"     \
 322         "       .section .fixup,\"ax\"                          \n"     \
 323         "3:     li      %0, %4                                  \n"     \
 324         "       move    %1, $0                                  \n"     \
 325         "       j       2b                                      \n"     \
 326         "       .previous                                       \n"     \
 327         "       .section __ex_table,\"a\"                       \n"     \
 328         "       "__UA_ADDR "\t1b, 3b                            \n"     \
 329         "       .previous                                       \n"     \
 330         : "=r" (__gu_err), "=r" (__gu_tmp)                              \
 331         : "0" (0), "o" (__m(addr)), "i" (-EFAULT));                     \
 332                                                                         \
 333         (val) = (__typeof__(*(addr))) __gu_tmp;                         \
 334 }
 335 
 336 /*
 337  * Get a long long 64 using 32 bit registers.
 338  */
 339 #define __get_data_asm_ll32(val, insn, addr)                            \
 340 {                                                                       \
 341         union {                                                         \
 342                 unsigned long long      l;                              \
 343                 __typeof__(*(addr))     t;                              \
 344         } __gu_tmp;                                                     \
 345                                                                         \
 346         __asm__ __volatile__(                                           \
 347         "1:     " insn("%1", "(%3)")"                           \n"     \
 348         "2:     " insn("%D1", "4(%3)")"                         \n"     \
 349         "3:                                                     \n"     \
 350         "       .insn                                           \n"     \
 351         "       .section        .fixup,\"ax\"                   \n"     \
 352         "4:     li      %0, %4                                  \n"     \
 353         "       move    %1, $0                                  \n"     \
 354         "       move    %D1, $0                                 \n"     \
 355         "       j       3b                                      \n"     \
 356         "       .previous                                       \n"     \
 357         "       .section        __ex_table,\"a\"                \n"     \
 358         "       " __UA_ADDR "   1b, 4b                          \n"     \
 359         "       " __UA_ADDR "   2b, 4b                          \n"     \
 360         "       .previous                                       \n"     \
 361         : "=r" (__gu_err), "=&r" (__gu_tmp.l)                           \
 362         : "0" (0), "r" (addr), "i" (-EFAULT));                          \
 363                                                                         \
 364         (val) = __gu_tmp.t;                                             \
 365 }
 366 
 367 #ifndef CONFIG_EVA
 368 #define __put_kernel_common(ptr, size) __put_user_common(ptr, size)
 369 #else
 370 /*
 371  * Kernel specific functions for EVA. We need to use normal load instructions
 372  * to read data from kernel when operating in EVA mode. We use these macros to
 373  * avoid redefining __get_data_asm for EVA.
 374  */
 375 #undef _stored
 376 #undef _storew
 377 #undef _storeh
 378 #undef _storeb
 379 #ifdef CONFIG_32BIT
 380 #define _stored                 _storew
 381 #else
 382 #define _stored(reg, addr)      "ld " reg ", " addr
 383 #endif
 384 
 385 #define _storew(reg, addr)      "sw " reg ", " addr
 386 #define _storeh(reg, addr)      "sh " reg ", " addr
 387 #define _storeb(reg, addr)      "sb " reg ", " addr
 388 
 389 #define __put_kernel_common(ptr, size)                                  \
 390 do {                                                                    \
 391         switch (size) {                                                 \
 392         case 1: __put_data_asm(_storeb, ptr); break;                    \
 393         case 2: __put_data_asm(_storeh, ptr); break;                    \
 394         case 4: __put_data_asm(_storew, ptr); break;                    \
 395         case 8: __PUT_DW(_stored, ptr); break;                          \
 396         default: __put_user_unknown(); break;                           \
 397         }                                                               \
 398 } while(0)
 399 #endif
 400 
 401 /*
 402  * Yuck.  We need two variants, one for 64bit operation and one
 403  * for 32 bit mode and old iron.
 404  */
 405 #ifdef CONFIG_32BIT
 406 #define __PUT_DW(insn, ptr) __put_data_asm_ll32(insn, ptr)
 407 #endif
 408 #ifdef CONFIG_64BIT
 409 #define __PUT_DW(insn, ptr) __put_data_asm(insn, ptr)
 410 #endif
 411 
 412 #define __put_user_common(ptr, size)                                    \
 413 do {                                                                    \
 414         switch (size) {                                                 \
 415         case 1: __put_data_asm(user_sb, ptr); break;                    \
 416         case 2: __put_data_asm(user_sh, ptr); break;                    \
 417         case 4: __put_data_asm(user_sw, ptr); break;                    \
 418         case 8: __PUT_DW(user_sd, ptr); break;                          \
 419         default: __put_user_unknown(); break;                           \
 420         }                                                               \
 421 } while (0)
 422 
 423 #define __put_user_nocheck(x, ptr, size)                                \
 424 ({                                                                      \
 425         __typeof__(*(ptr)) __pu_val;                                    \
 426         int __pu_err = 0;                                               \
 427                                                                         \
 428         __pu_val = (x);                                                 \
 429         if (eva_kernel_access()) {                                      \
 430                 __put_kernel_common(ptr, size);                         \
 431         } else {                                                        \
 432                 __chk_user_ptr(ptr);                                    \
 433                 __put_user_common(ptr, size);                           \
 434         }                                                               \
 435         __pu_err;                                                       \
 436 })
 437 
 438 #define __put_user_check(x, ptr, size)                                  \
 439 ({                                                                      \
 440         __typeof__(*(ptr)) __user *__pu_addr = (ptr);                   \
 441         __typeof__(*(ptr)) __pu_val = (x);                              \
 442         int __pu_err = -EFAULT;                                         \
 443                                                                         \
 444         might_fault();                                                  \
 445         if (likely(access_ok( __pu_addr, size))) {      \
 446                 if (eva_kernel_access())                                \
 447                         __put_kernel_common(__pu_addr, size);           \
 448                 else                                                    \
 449                         __put_user_common(__pu_addr, size);             \
 450         }                                                               \
 451                                                                         \
 452         __pu_err;                                                       \
 453 })
 454 
 455 #define __put_data_asm(insn, ptr)                                       \
 456 {                                                                       \
 457         __asm__ __volatile__(                                           \
 458         "1:     "insn("%z2", "%3")"     # __put_data_asm        \n"     \
 459         "2:                                                     \n"     \
 460         "       .insn                                           \n"     \
 461         "       .section        .fixup,\"ax\"                   \n"     \
 462         "3:     li      %0, %4                                  \n"     \
 463         "       j       2b                                      \n"     \
 464         "       .previous                                       \n"     \
 465         "       .section        __ex_table,\"a\"                \n"     \
 466         "       " __UA_ADDR "   1b, 3b                          \n"     \
 467         "       .previous                                       \n"     \
 468         : "=r" (__pu_err)                                               \
 469         : "0" (0), "Jr" (__pu_val), "o" (__m(ptr)),                     \
 470           "i" (-EFAULT));                                               \
 471 }
 472 
 473 #define __put_data_asm_ll32(insn, ptr)                                  \
 474 {                                                                       \
 475         __asm__ __volatile__(                                           \
 476         "1:     "insn("%2", "(%3)")"    # __put_data_asm_ll32   \n"     \
 477         "2:     "insn("%D2", "4(%3)")"                          \n"     \
 478         "3:                                                     \n"     \
 479         "       .insn                                           \n"     \
 480         "       .section        .fixup,\"ax\"                   \n"     \
 481         "4:     li      %0, %4                                  \n"     \
 482         "       j       3b                                      \n"     \
 483         "       .previous                                       \n"     \
 484         "       .section        __ex_table,\"a\"                \n"     \
 485         "       " __UA_ADDR "   1b, 4b                          \n"     \
 486         "       " __UA_ADDR "   2b, 4b                          \n"     \
 487         "       .previous"                                              \
 488         : "=r" (__pu_err)                                               \
 489         : "0" (0), "r" (__pu_val), "r" (ptr),                           \
 490           "i" (-EFAULT));                                               \
 491 }
 492 
 493 extern void __put_user_unknown(void);
 494 
 495 /*
 496  * We're generating jump to subroutines which will be outside the range of
 497  * jump instructions
 498  */
 499 #ifdef MODULE
 500 #define __MODULE_JAL(destination)                                       \
 501         ".set\tnoat\n\t"                                                \
 502         __UA_LA "\t$1, " #destination "\n\t"                            \
 503         "jalr\t$1\n\t"                                                  \
 504         ".set\tat\n\t"
 505 #else
 506 #define __MODULE_JAL(destination)                                       \
 507         "jal\t" #destination "\n\t"
 508 #endif
 509 
 510 #if defined(CONFIG_CPU_DADDI_WORKAROUNDS) || (defined(CONFIG_EVA) &&    \
 511                                               defined(CONFIG_CPU_HAS_PREFETCH))
 512 #define DADDI_SCRATCH "$3"
 513 #else
 514 #define DADDI_SCRATCH "$0"
 515 #endif
 516 
 517 extern size_t __copy_user(void *__to, const void *__from, size_t __n);
 518 
 519 #define __invoke_copy_from(func, to, from, n)                           \
 520 ({                                                                      \
 521         register void *__cu_to_r __asm__("$4");                         \
 522         register const void __user *__cu_from_r __asm__("$5");          \
 523         register long __cu_len_r __asm__("$6");                         \
 524                                                                         \
 525         __cu_to_r = (to);                                               \
 526         __cu_from_r = (from);                                           \
 527         __cu_len_r = (n);                                               \
 528         __asm__ __volatile__(                                           \
 529         ".set\tnoreorder\n\t"                                           \
 530         __MODULE_JAL(func)                                              \
 531         ".set\tnoat\n\t"                                                \
 532         __UA_ADDU "\t$1, %1, %2\n\t"                                    \
 533         ".set\tat\n\t"                                                  \
 534         ".set\treorder"                                                 \
 535         : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r)       \
 536         :                                                               \
 537         : "$8", "$9", "$10", "$11", "$12", "$14", "$15", "$24", "$31",  \
 538           DADDI_SCRATCH, "memory");                                     \
 539         __cu_len_r;                                                     \
 540 })
 541 
 542 #define __invoke_copy_to(func, to, from, n)                             \
 543 ({                                                                      \
 544         register void __user *__cu_to_r __asm__("$4");                  \
 545         register const void *__cu_from_r __asm__("$5");                 \
 546         register long __cu_len_r __asm__("$6");                         \
 547                                                                         \
 548         __cu_to_r = (to);                                               \
 549         __cu_from_r = (from);                                           \
 550         __cu_len_r = (n);                                               \
 551         __asm__ __volatile__(                                           \
 552         __MODULE_JAL(func)                                              \
 553         : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r)       \
 554         :                                                               \
 555         : "$8", "$9", "$10", "$11", "$12", "$14", "$15", "$24", "$31",  \
 556           DADDI_SCRATCH, "memory");                                     \
 557         __cu_len_r;                                                     \
 558 })
 559 
 560 #define __invoke_copy_from_kernel(to, from, n)                          \
 561         __invoke_copy_from(__copy_user, to, from, n)
 562 
 563 #define __invoke_copy_to_kernel(to, from, n)                            \
 564         __invoke_copy_to(__copy_user, to, from, n)
 565 
 566 #define ___invoke_copy_in_kernel(to, from, n)                           \
 567         __invoke_copy_from(__copy_user, to, from, n)
 568 
 569 #ifndef CONFIG_EVA
 570 #define __invoke_copy_from_user(to, from, n)                            \
 571         __invoke_copy_from(__copy_user, to, from, n)
 572 
 573 #define __invoke_copy_to_user(to, from, n)                              \
 574         __invoke_copy_to(__copy_user, to, from, n)
 575 
 576 #define ___invoke_copy_in_user(to, from, n)                             \
 577         __invoke_copy_from(__copy_user, to, from, n)
 578 
 579 #else
 580 
 581 /* EVA specific functions */
 582 
 583 extern size_t __copy_from_user_eva(void *__to, const void *__from,
 584                                    size_t __n);
 585 extern size_t __copy_to_user_eva(void *__to, const void *__from,
 586                                  size_t __n);
 587 extern size_t __copy_in_user_eva(void *__to, const void *__from, size_t __n);
 588 
 589 /*
 590  * Source or destination address is in userland. We need to go through
 591  * the TLB
 592  */
 593 #define __invoke_copy_from_user(to, from, n)                            \
 594         __invoke_copy_from(__copy_from_user_eva, to, from, n)
 595 
 596 #define __invoke_copy_to_user(to, from, n)                              \
 597         __invoke_copy_to(__copy_to_user_eva, to, from, n)
 598 
 599 #define ___invoke_copy_in_user(to, from, n)                             \
 600         __invoke_copy_from(__copy_in_user_eva, to, from, n)
 601 
 602 #endif /* CONFIG_EVA */
 603 
 604 static inline unsigned long
 605 raw_copy_to_user(void __user *to, const void *from, unsigned long n)
 606 {
 607         if (eva_kernel_access())
 608                 return __invoke_copy_to_kernel(to, from, n);
 609         else
 610                 return __invoke_copy_to_user(to, from, n);
 611 }
 612 
 613 static inline unsigned long
 614 raw_copy_from_user(void *to, const void __user *from, unsigned long n)
 615 {
 616         if (eva_kernel_access())
 617                 return __invoke_copy_from_kernel(to, from, n);
 618         else
 619                 return __invoke_copy_from_user(to, from, n);
 620 }
 621 
 622 #define INLINE_COPY_FROM_USER
 623 #define INLINE_COPY_TO_USER
 624 
 625 static inline unsigned long
 626 raw_copy_in_user(void __user*to, const void __user *from, unsigned long n)
 627 {
 628         if (eva_kernel_access())
 629                 return ___invoke_copy_in_kernel(to, from, n);
 630         else
 631                 return ___invoke_copy_in_user(to, from, n);
 632 }
 633 
 634 extern __kernel_size_t __bzero_kernel(void __user *addr, __kernel_size_t size);
 635 extern __kernel_size_t __bzero(void __user *addr, __kernel_size_t size);
 636 
 637 /*
 638  * __clear_user: - Zero a block of memory in user space, with less checking.
 639  * @to:   Destination address, in user space.
 640  * @n:    Number of bytes to zero.
 641  *
 642  * Zero a block of memory in user space.  Caller must check
 643  * the specified block with access_ok() before calling this function.
 644  *
 645  * Returns number of bytes that could not be cleared.
 646  * On success, this will be zero.
 647  */
 648 static inline __kernel_size_t
 649 __clear_user(void __user *addr, __kernel_size_t size)
 650 {
 651         __kernel_size_t res;
 652 
 653 #ifdef CONFIG_CPU_MICROMIPS
 654 /* micromips memset / bzero also clobbers t7 & t8 */
 655 #define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$15", "$24", "$31"
 656 #else
 657 #define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"
 658 #endif /* CONFIG_CPU_MICROMIPS */
 659 
 660         if (eva_kernel_access()) {
 661                 __asm__ __volatile__(
 662                         "move\t$4, %1\n\t"
 663                         "move\t$5, $0\n\t"
 664                         "move\t$6, %2\n\t"
 665                         __MODULE_JAL(__bzero_kernel)
 666                         "move\t%0, $6"
 667                         : "=r" (res)
 668                         : "r" (addr), "r" (size)
 669                         : bzero_clobbers);
 670         } else {
 671                 might_fault();
 672                 __asm__ __volatile__(
 673                         "move\t$4, %1\n\t"
 674                         "move\t$5, $0\n\t"
 675                         "move\t$6, %2\n\t"
 676                         __MODULE_JAL(__bzero)
 677                         "move\t%0, $6"
 678                         : "=r" (res)
 679                         : "r" (addr), "r" (size)
 680                         : bzero_clobbers);
 681         }
 682 
 683         return res;
 684 }
 685 
 686 #define clear_user(addr,n)                                              \
 687 ({                                                                      \
 688         void __user * __cl_addr = (addr);                               \
 689         unsigned long __cl_size = (n);                                  \
 690         if (__cl_size && access_ok(__cl_addr, __cl_size))               \
 691                 __cl_size = __clear_user(__cl_addr, __cl_size);         \
 692         __cl_size;                                                      \
 693 })
 694 
 695 extern long __strncpy_from_kernel_asm(char *__to, const char __user *__from, long __len);
 696 extern long __strncpy_from_user_asm(char *__to, const char __user *__from, long __len);
 697 
 698 /*
 699  * strncpy_from_user: - Copy a NUL terminated string from userspace.
 700  * @dst:   Destination address, in kernel space.  This buffer must be at
 701  *         least @count bytes long.
 702  * @src:   Source address, in user space.
 703  * @count: Maximum number of bytes to copy, including the trailing NUL.
 704  *
 705  * Copies a NUL-terminated string from userspace to kernel space.
 706  *
 707  * On success, returns the length of the string (not including the trailing
 708  * NUL).
 709  *
 710  * If access to userspace fails, returns -EFAULT (some data may have been
 711  * copied).
 712  *
 713  * If @count is smaller than the length of the string, copies @count bytes
 714  * and returns @count.
 715  */
 716 static inline long
 717 strncpy_from_user(char *__to, const char __user *__from, long __len)
 718 {
 719         long res;
 720 
 721         if (eva_kernel_access()) {
 722                 __asm__ __volatile__(
 723                         "move\t$4, %1\n\t"
 724                         "move\t$5, %2\n\t"
 725                         "move\t$6, %3\n\t"
 726                         __MODULE_JAL(__strncpy_from_kernel_asm)
 727                         "move\t%0, $2"
 728                         : "=r" (res)
 729                         : "r" (__to), "r" (__from), "r" (__len)
 730                         : "$2", "$3", "$4", "$5", "$6", __UA_t0, "$31", "memory");
 731         } else {
 732                 might_fault();
 733                 __asm__ __volatile__(
 734                         "move\t$4, %1\n\t"
 735                         "move\t$5, %2\n\t"
 736                         "move\t$6, %3\n\t"
 737                         __MODULE_JAL(__strncpy_from_user_asm)
 738                         "move\t%0, $2"
 739                         : "=r" (res)
 740                         : "r" (__to), "r" (__from), "r" (__len)
 741                         : "$2", "$3", "$4", "$5", "$6", __UA_t0, "$31", "memory");
 742         }
 743 
 744         return res;
 745 }
 746 
 747 extern long __strnlen_kernel_asm(const char __user *s, long n);
 748 extern long __strnlen_user_asm(const char __user *s, long n);
 749 
 750 /*
 751  * strnlen_user: - Get the size of a string in user space.
 752  * @str: The string to measure.
 753  *
 754  * Context: User context only. This function may sleep if pagefaults are
 755  *          enabled.
 756  *
 757  * Get the size of a NUL-terminated string in user space.
 758  *
 759  * Returns the size of the string INCLUDING the terminating NUL.
 760  * On exception, returns 0.
 761  * If the string is too long, returns a value greater than @n.
 762  */
 763 static inline long strnlen_user(const char __user *s, long n)
 764 {
 765         long res;
 766 
 767         might_fault();
 768         if (eva_kernel_access()) {
 769                 __asm__ __volatile__(
 770                         "move\t$4, %1\n\t"
 771                         "move\t$5, %2\n\t"
 772                         __MODULE_JAL(__strnlen_kernel_asm)
 773                         "move\t%0, $2"
 774                         : "=r" (res)
 775                         : "r" (s), "r" (n)
 776                         : "$2", "$4", "$5", __UA_t0, "$31");
 777         } else {
 778                 __asm__ __volatile__(
 779                         "move\t$4, %1\n\t"
 780                         "move\t$5, %2\n\t"
 781                         __MODULE_JAL(__strnlen_user_asm)
 782                         "move\t%0, $2"
 783                         : "=r" (res)
 784                         : "r" (s), "r" (n)
 785                         : "$2", "$4", "$5", __UA_t0, "$31");
 786         }
 787 
 788         return res;
 789 }
 790 
 791 #endif /* _ASM_UACCESS_H */

/* [<][>][^][v][top][bottom][index][help] */