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