1 /* 2 * User address space access functions. 3 * The non inlined parts of asm-i386/uaccess.h are here. 4 * 5 * Copyright 1997 Andi Kleen <ak@muc.de> 6 * Copyright 1997 Linus Torvalds 7 */ 8 #include <linux/mm.h> 9 #include <linux/highmem.h> 10 #include <linux/blkdev.h> 11 #include <linux/module.h> 12 #include <linux/backing-dev.h> 13 #include <linux/interrupt.h> 14 #include <asm/uaccess.h> 15 #include <asm/mmx.h> 16 17 static inline int __movsl_is_ok(unsigned long a1, unsigned long a2, unsigned long n) 18 { 19 #ifdef CONFIG_X86_INTEL_USERCOPY 20 if (n >= 64 && ((a1 ^ a2) & movsl_mask.mask)) 21 return 0; 22 #endif 23 return 1; 24 } 25 #define movsl_is_ok(a1,a2,n) \ 26 __movsl_is_ok((unsigned long)(a1),(unsigned long)(a2),(n)) 27 28 /* 29 * Copy a null terminated string from userspace. 30 */ 31 32 #define __do_strncpy_from_user(dst,src,count,res) \ 33 do { \ 34 int __d0, __d1, __d2; \ 35 might_sleep(); \ 36 __asm__ __volatile__( \ 37 " testl %1,%1\n" \ 38 " jz 2f\n" \ 39 "0: lodsb\n" \ 40 " stosb\n" \ 41 " testb %%al,%%al\n" \ 42 " jz 1f\n" \ 43 " decl %1\n" \ 44 " jnz 0b\n" \ 45 "1: subl %1,%0\n" \ 46 "2:\n" \ 47 ".section .fixup,\"ax\"\n" \ 48 "3: movl %5,%0\n" \ 49 " jmp 2b\n" \ 50 ".previous\n" \ 51 ".section __ex_table,\"a\"\n" \ 52 " .align 4\n" \ 53 " .long 0b,3b\n" \ 54 ".previous" \ 55 : "=d"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1), \ 56 "=&D" (__d2) \ 57 : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \ 58 : "memory"); \ 59 } while (0) 60 61 /** 62 * __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking. 63 * @dst: Destination address, in kernel space. This buffer must be at 64 * least @count bytes long. 65 * @src: Source address, in user space. 66 * @count: Maximum number of bytes to copy, including the trailing NUL. 67 * 68 * Copies a NUL-terminated string from userspace to kernel space. 69 * Caller must check the specified block with access_ok() before calling 70 * this function. 71 * 72 * On success, returns the length of the string (not including the trailing 73 * NUL). 74 * 75 * If access to userspace fails, returns -EFAULT (some data may have been 76 * copied). 77 * 78 * If @count is smaller than the length of the string, copies @count bytes 79 * and returns @count. 80 */ 81 long 82 __strncpy_from_user(char *dst, const char __user *src, long count) 83 { 84 long res; 85 __do_strncpy_from_user(dst, src, count, res); 86 return res; 87 } 88 EXPORT_SYMBOL(__strncpy_from_user); 89 90 /** 91 * strncpy_from_user: - Copy a NUL terminated string from userspace. 92 * @dst: Destination address, in kernel space. This buffer must be at 93 * least @count bytes long. 94 * @src: Source address, in user space. 95 * @count: Maximum number of bytes to copy, including the trailing NUL. 96 * 97 * Copies a NUL-terminated string from userspace to kernel space. 98 * 99 * On success, returns the length of the string (not including the trailing 100 * NUL). 101 * 102 * If access to userspace fails, returns -EFAULT (some data may have been 103 * copied). 104 * 105 * If @count is smaller than the length of the string, copies @count bytes 106 * and returns @count. 107 */ 108 long 109 strncpy_from_user(char *dst, const char __user *src, long count) 110 { 111 long res = -EFAULT; 112 if (access_ok(VERIFY_READ, src, 1)) 113 __do_strncpy_from_user(dst, src, count, res); 114 return res; 115 } 116 EXPORT_SYMBOL(strncpy_from_user); 117 118 /* 119 * Zero Userspace 120 */ 121 122 #define __do_clear_user(addr,size) \ 123 do { \ 124 int __d0; \ 125 might_sleep(); \ 126 __asm__ __volatile__( \ 127 "0: rep; stosl\n" \ 128 " movl %2,%0\n" \ 129 "1: rep; stosb\n" \ 130 "2:\n" \ 131 ".section .fixup,\"ax\"\n" \ 132 "3: lea 0(%2,%0,4),%0\n" \ 133 " jmp 2b\n" \ 134 ".previous\n" \ 135 ".section __ex_table,\"a\"\n" \ 136 " .align 4\n" \ 137 " .long 0b,3b\n" \ 138 " .long 1b,2b\n" \ 139 ".previous" \ 140 : "=&c"(size), "=&D" (__d0) \ 141 : "r"(size & 3), "0"(size / 4), "1"(addr), "a"(0)); \ 142 } while (0) 143 144 /** 145 * clear_user: - Zero a block of memory in user space. 146 * @to: Destination address, in user space. 147 * @n: Number of bytes to zero. 148 * 149 * Zero a block of memory in user space. 150 * 151 * Returns number of bytes that could not be cleared. 152 * On success, this will be zero. 153 */ 154 unsigned long 155 clear_user(void __user *to, unsigned long n) 156 { 157 might_sleep(); 158 if (access_ok(VERIFY_WRITE, to, n)) 159 __do_clear_user(to, n); 160 return n; 161 } 162 EXPORT_SYMBOL(clear_user); 163 164 /** 165 * __clear_user: - Zero a block of memory in user space, with less checking. 166 * @to: Destination address, in user space. 167 * @n: Number of bytes to zero. 168 * 169 * Zero a block of memory in user space. Caller must check 170 * the specified block with access_ok() before calling this function. 171 * 172 * Returns number of bytes that could not be cleared. 173 * On success, this will be zero. 174 */ 175 unsigned long 176 __clear_user(void __user *to, unsigned long n) 177 { 178 __do_clear_user(to, n); 179 return n; 180 } 181 EXPORT_SYMBOL(__clear_user); 182 183 /** 184 * strnlen_user: - Get the size of a string in user space. 185 * @s: The string to measure. 186 * @n: The maximum valid length 187 * 188 * Get the size of a NUL-terminated string in user space. 189 * 190 * Returns the size of the string INCLUDING the terminating NUL. 191 * On exception, returns 0. 192 * If the string is too long, returns a value greater than @n. 193 */ 194 long strnlen_user(const char __user *s, long n) 195 { 196 unsigned long mask = -__addr_ok(s); 197 unsigned long res, tmp; 198 199 might_sleep(); 200 201 __asm__ __volatile__( 202 " testl %0, %0\n" 203 " jz 3f\n" 204 " andl %0,%%ecx\n" 205 "0: repne; scasb\n" 206 " setne %%al\n" 207 " subl %%ecx,%0\n" 208 " addl %0,%%eax\n" 209 "1:\n" 210 ".section .fixup,\"ax\"\n" 211 "2: xorl %%eax,%%eax\n" 212 " jmp 1b\n" 213 "3: movb $1,%%al\n" 214 " jmp 1b\n" 215 ".previous\n" 216 ".section __ex_table,\"a\"\n" 217 " .align 4\n" 218 " .long 0b,2b\n" 219 ".previous" 220 :"=r" (n), "=D" (s), "=a" (res), "=c" (tmp) 221 :"0" (n), "1" (s), "2" (0), "3" (mask) 222 :"cc"); 223 return res & mask; 224 } 225 EXPORT_SYMBOL(strnlen_user); 226 227 #ifdef CONFIG_X86_INTEL_USERCOPY 228 static unsigned long 229 __copy_user_intel(void __user *to, const void *from, unsigned long size) 230 { 231 int d0, d1; 232 __asm__ __volatile__( 233 " .align 2,0x90\n" 234 "1: movl 32(%4), %%eax\n" 235 " cmpl $67, %0\n" 236 " jbe 3f\n" 237 "2: movl 64(%4), %%eax\n" 238 " .align 2,0x90\n" 239 "3: movl 0(%4), %%eax\n" 240 "4: movl 4(%4), %%edx\n" 241 "5: movl %%eax, 0(%3)\n" 242 "6: movl %%edx, 4(%3)\n" 243 "7: movl 8(%4), %%eax\n" 244 "8: movl 12(%4),%%edx\n" 245 "9: movl %%eax, 8(%3)\n" 246 "10: movl %%edx, 12(%3)\n" 247 "11: movl 16(%4), %%eax\n" 248 "12: movl 20(%4), %%edx\n" 249 "13: movl %%eax, 16(%3)\n" 250 "14: movl %%edx, 20(%3)\n" 251 "15: movl 24(%4), %%eax\n" 252 "16: movl 28(%4), %%edx\n" 253 "17: movl %%eax, 24(%3)\n" 254 "18: movl %%edx, 28(%3)\n" 255 "19: movl 32(%4), %%eax\n" 256 "20: movl 36(%4), %%edx\n" 257 "21: movl %%eax, 32(%3)\n" 258 "22: movl %%edx, 36(%3)\n" 259 "23: movl 40(%4), %%eax\n" 260 "24: movl 44(%4), %%edx\n" 261 "25: movl %%eax, 40(%3)\n" 262 "26: movl %%edx, 44(%3)\n" 263 "27: movl 48(%4), %%eax\n" 264 "28: movl 52(%4), %%edx\n" 265 "29: movl %%eax, 48(%3)\n" 266 "30: movl %%edx, 52(%3)\n" 267 "31: movl 56(%4), %%eax\n" 268 "32: movl 60(%4), %%edx\n" 269 "33: movl %%eax, 56(%3)\n" 270 "34: movl %%edx, 60(%3)\n" 271 " addl $-64, %0\n" 272 " addl $64, %4\n" 273 " addl $64, %3\n" 274 " cmpl $63, %0\n" 275 " ja 1b\n" 276 "35: movl %0, %%eax\n" 277 " shrl $2, %0\n" 278 " andl $3, %%eax\n" 279 " cld\n" 280 "99: rep; movsl\n" 281 "36: movl %%eax, %0\n" 282 "37: rep; movsb\n" 283 "100:\n" 284 ".section .fixup,\"ax\"\n" 285 "101: lea 0(%%eax,%0,4),%0\n" 286 " jmp 100b\n" 287 ".previous\n" 288 ".section __ex_table,\"a\"\n" 289 " .align 4\n" 290 " .long 1b,100b\n" 291 " .long 2b,100b\n" 292 " .long 3b,100b\n" 293 " .long 4b,100b\n" 294 " .long 5b,100b\n" 295 " .long 6b,100b\n" 296 " .long 7b,100b\n" 297 " .long 8b,100b\n" 298 " .long 9b,100b\n" 299 " .long 10b,100b\n" 300 " .long 11b,100b\n" 301 " .long 12b,100b\n" 302 " .long 13b,100b\n" 303 " .long 14b,100b\n" 304 " .long 15b,100b\n" 305 " .long 16b,100b\n" 306 " .long 17b,100b\n" 307 " .long 18b,100b\n" 308 " .long 19b,100b\n" 309 " .long 20b,100b\n" 310 " .long 21b,100b\n" 311 " .long 22b,100b\n" 312 " .long 23b,100b\n" 313 " .long 24b,100b\n" 314 " .long 25b,100b\n" 315 " .long 26b,100b\n" 316 " .long 27b,100b\n" 317 " .long 28b,100b\n" 318 " .long 29b,100b\n" 319 " .long 30b,100b\n" 320 " .long 31b,100b\n" 321 " .long 32b,100b\n" 322 " .long 33b,100b\n" 323 " .long 34b,100b\n" 324 " .long 35b,100b\n" 325 " .long 36b,100b\n" 326 " .long 37b,100b\n" 327 " .long 99b,101b\n" 328 ".previous" 329 : "=&c"(size), "=&D" (d0), "=&S" (d1) 330 : "1"(to), "2"(from), "0"(size) 331 : "eax", "edx", "memory"); 332 return size; 333 } 334 335 static unsigned long 336 __copy_user_zeroing_intel(void *to, const void __user *from, unsigned long size) 337 { 338 int d0, d1; 339 __asm__ __volatile__( 340 " .align 2,0x90\n" 341 "0: movl 32(%4), %%eax\n" 342 " cmpl $67, %0\n" 343 " jbe 2f\n" 344 "1: movl 64(%4), %%eax\n" 345 " .align 2,0x90\n" 346 "2: movl 0(%4), %%eax\n" 347 "21: movl 4(%4), %%edx\n" 348 " movl %%eax, 0(%3)\n" 349 " movl %%edx, 4(%3)\n" 350 "3: movl 8(%4), %%eax\n" 351 "31: movl 12(%4),%%edx\n" 352 " movl %%eax, 8(%3)\n" 353 " movl %%edx, 12(%3)\n" 354 "4: movl 16(%4), %%eax\n" 355 "41: movl 20(%4), %%edx\n" 356 " movl %%eax, 16(%3)\n" 357 " movl %%edx, 20(%3)\n" 358 "10: movl 24(%4), %%eax\n" 359 "51: movl 28(%4), %%edx\n" 360 " movl %%eax, 24(%3)\n" 361 " movl %%edx, 28(%3)\n" 362 "11: movl 32(%4), %%eax\n" 363 "61: movl 36(%4), %%edx\n" 364 " movl %%eax, 32(%3)\n" 365 " movl %%edx, 36(%3)\n" 366 "12: movl 40(%4), %%eax\n" 367 "71: movl 44(%4), %%edx\n" 368 " movl %%eax, 40(%3)\n" 369 " movl %%edx, 44(%3)\n" 370 "13: movl 48(%4), %%eax\n" 371 "81: movl 52(%4), %%edx\n" 372 " movl %%eax, 48(%3)\n" 373 " movl %%edx, 52(%3)\n" 374 "14: movl 56(%4), %%eax\n" 375 "91: movl 60(%4), %%edx\n" 376 " movl %%eax, 56(%3)\n" 377 " movl %%edx, 60(%3)\n" 378 " addl $-64, %0\n" 379 " addl $64, %4\n" 380 " addl $64, %3\n" 381 " cmpl $63, %0\n" 382 " ja 0b\n" 383 "5: movl %0, %%eax\n" 384 " shrl $2, %0\n" 385 " andl $3, %%eax\n" 386 " cld\n" 387 "6: rep; movsl\n" 388 " movl %%eax,%0\n" 389 "7: rep; movsb\n" 390 "8:\n" 391 ".section .fixup,\"ax\"\n" 392 "9: lea 0(%%eax,%0,4),%0\n" 393 "16: pushl %0\n" 394 " pushl %%eax\n" 395 " xorl %%eax,%%eax\n" 396 " rep; stosb\n" 397 " popl %%eax\n" 398 " popl %0\n" 399 " jmp 8b\n" 400 ".previous\n" 401 ".section __ex_table,\"a\"\n" 402 " .align 4\n" 403 " .long 0b,16b\n" 404 " .long 1b,16b\n" 405 " .long 2b,16b\n" 406 " .long 21b,16b\n" 407 " .long 3b,16b\n" 408 " .long 31b,16b\n" 409 " .long 4b,16b\n" 410 " .long 41b,16b\n" 411 " .long 10b,16b\n" 412 " .long 51b,16b\n" 413 " .long 11b,16b\n" 414 " .long 61b,16b\n" 415 " .long 12b,16b\n" 416 " .long 71b,16b\n" 417 " .long 13b,16b\n" 418 " .long 81b,16b\n" 419 " .long 14b,16b\n" 420 " .long 91b,16b\n" 421 " .long 6b,9b\n" 422 " .long 7b,16b\n" 423 ".previous" 424 : "=&c"(size), "=&D" (d0), "=&S" (d1) 425 : "1"(to), "2"(from), "0"(size) 426 : "eax", "edx", "memory"); 427 return size; 428 } 429 430 /* 431 * Non Temporal Hint version of __copy_user_zeroing_intel. It is cache aware. 432 * hyoshiok@miraclelinux.com 433 */ 434 435 static unsigned long __copy_user_zeroing_intel_nocache(void *to, 436 const void __user *from, unsigned long size) 437 { 438 int d0, d1; 439 440 __asm__ __volatile__( 441 " .align 2,0x90\n" 442 "0: movl 32(%4), %%eax\n" 443 " cmpl $67, %0\n" 444 " jbe 2f\n" 445 "1: movl 64(%4), %%eax\n" 446 " .align 2,0x90\n" 447 "2: movl 0(%4), %%eax\n" 448 "21: movl 4(%4), %%edx\n" 449 " movnti %%eax, 0(%3)\n" 450 " movnti %%edx, 4(%3)\n" 451 "3: movl 8(%4), %%eax\n" 452 "31: movl 12(%4),%%edx\n" 453 " movnti %%eax, 8(%3)\n" 454 " movnti %%edx, 12(%3)\n" 455 "4: movl 16(%4), %%eax\n" 456 "41: movl 20(%4), %%edx\n" 457 " movnti %%eax, 16(%3)\n" 458 " movnti %%edx, 20(%3)\n" 459 "10: movl 24(%4), %%eax\n" 460 "51: movl 28(%4), %%edx\n" 461 " movnti %%eax, 24(%3)\n" 462 " movnti %%edx, 28(%3)\n" 463 "11: movl 32(%4), %%eax\n" 464 "61: movl 36(%4), %%edx\n" 465 " movnti %%eax, 32(%3)\n" 466 " movnti %%edx, 36(%3)\n" 467 "12: movl 40(%4), %%eax\n" 468 "71: movl 44(%4), %%edx\n" 469 " movnti %%eax, 40(%3)\n" 470 " movnti %%edx, 44(%3)\n" 471 "13: movl 48(%4), %%eax\n" 472 "81: movl 52(%4), %%edx\n" 473 " movnti %%eax, 48(%3)\n" 474 " movnti %%edx, 52(%3)\n" 475 "14: movl 56(%4), %%eax\n" 476 "91: movl 60(%4), %%edx\n" 477 " movnti %%eax, 56(%3)\n" 478 " movnti %%edx, 60(%3)\n" 479 " addl $-64, %0\n" 480 " addl $64, %4\n" 481 " addl $64, %3\n" 482 " cmpl $63, %0\n" 483 " ja 0b\n" 484 " sfence \n" 485 "5: movl %0, %%eax\n" 486 " shrl $2, %0\n" 487 " andl $3, %%eax\n" 488 " cld\n" 489 "6: rep; movsl\n" 490 " movl %%eax,%0\n" 491 "7: rep; movsb\n" 492 "8:\n" 493 ".section .fixup,\"ax\"\n" 494 "9: lea 0(%%eax,%0,4),%0\n" 495 "16: pushl %0\n" 496 " pushl %%eax\n" 497 " xorl %%eax,%%eax\n" 498 " rep; stosb\n" 499 " popl %%eax\n" 500 " popl %0\n" 501 " jmp 8b\n" 502 ".previous\n" 503 ".section __ex_table,\"a\"\n" 504 " .align 4\n" 505 " .long 0b,16b\n" 506 " .long 1b,16b\n" 507 " .long 2b,16b\n" 508 " .long 21b,16b\n" 509 " .long 3b,16b\n" 510 " .long 31b,16b\n" 511 " .long 4b,16b\n" 512 " .long 41b,16b\n" 513 " .long 10b,16b\n" 514 " .long 51b,16b\n" 515 " .long 11b,16b\n" 516 " .long 61b,16b\n" 517 " .long 12b,16b\n" 518 " .long 71b,16b\n" 519 " .long 13b,16b\n" 520 " .long 81b,16b\n" 521 " .long 14b,16b\n" 522 " .long 91b,16b\n" 523 " .long 6b,9b\n" 524 " .long 7b,16b\n" 525 ".previous" 526 : "=&c"(size), "=&D" (d0), "=&S" (d1) 527 : "1"(to), "2"(from), "0"(size) 528 : "eax", "edx", "memory"); 529 return size; 530 } 531 532 static unsigned long __copy_user_intel_nocache(void *to, 533 const void __user *from, unsigned long size) 534 { 535 int d0, d1; 536 537 __asm__ __volatile__( 538 " .align 2,0x90\n" 539 "0: movl 32(%4), %%eax\n" 540 " cmpl $67, %0\n" 541 " jbe 2f\n" 542 "1: movl 64(%4), %%eax\n" 543 " .align 2,0x90\n" 544 "2: movl 0(%4), %%eax\n" 545 "21: movl 4(%4), %%edx\n" 546 " movnti %%eax, 0(%3)\n" 547 " movnti %%edx, 4(%3)\n" 548 "3: movl 8(%4), %%eax\n" 549 "31: movl 12(%4),%%edx\n" 550 " movnti %%eax, 8(%3)\n" 551 " movnti %%edx, 12(%3)\n" 552 "4: movl 16(%4), %%eax\n" 553 "41: movl 20(%4), %%edx\n" 554 " movnti %%eax, 16(%3)\n" 555 " movnti %%edx, 20(%3)\n" 556 "10: movl 24(%4), %%eax\n" 557 "51: movl 28(%4), %%edx\n" 558 " movnti %%eax, 24(%3)\n" 559 " movnti %%edx, 28(%3)\n" 560 "11: movl 32(%4), %%eax\n" 561 "61: movl 36(%4), %%edx\n" 562 " movnti %%eax, 32(%3)\n" 563 " movnti %%edx, 36(%3)\n" 564 "12: movl 40(%4), %%eax\n" 565 "71: movl 44(%4), %%edx\n" 566 " movnti %%eax, 40(%3)\n" 567 " movnti %%edx, 44(%3)\n" 568 "13: movl 48(%4), %%eax\n" 569 "81: movl 52(%4), %%edx\n" 570 " movnti %%eax, 48(%3)\n" 571 " movnti %%edx, 52(%3)\n" 572 "14: movl 56(%4), %%eax\n" 573 "91: movl 60(%4), %%edx\n" 574 " movnti %%eax, 56(%3)\n" 575 " movnti %%edx, 60(%3)\n" 576 " addl $-64, %0\n" 577 " addl $64, %4\n" 578 " addl $64, %3\n" 579 " cmpl $63, %0\n" 580 " ja 0b\n" 581 " sfence \n" 582 "5: movl %0, %%eax\n" 583 " shrl $2, %0\n" 584 " andl $3, %%eax\n" 585 " cld\n" 586 "6: rep; movsl\n" 587 " movl %%eax,%0\n" 588 "7: rep; movsb\n" 589 "8:\n" 590 ".section .fixup,\"ax\"\n" 591 "9: lea 0(%%eax,%0,4),%0\n" 592 "16: jmp 8b\n" 593 ".previous\n" 594 ".section __ex_table,\"a\"\n" 595 " .align 4\n" 596 " .long 0b,16b\n" 597 " .long 1b,16b\n" 598 " .long 2b,16b\n" 599 " .long 21b,16b\n" 600 " .long 3b,16b\n" 601 " .long 31b,16b\n" 602 " .long 4b,16b\n" 603 " .long 41b,16b\n" 604 " .long 10b,16b\n" 605 " .long 51b,16b\n" 606 " .long 11b,16b\n" 607 " .long 61b,16b\n" 608 " .long 12b,16b\n" 609 " .long 71b,16b\n" 610 " .long 13b,16b\n" 611 " .long 81b,16b\n" 612 " .long 14b,16b\n" 613 " .long 91b,16b\n" 614 " .long 6b,9b\n" 615 " .long 7b,16b\n" 616 ".previous" 617 : "=&c"(size), "=&D" (d0), "=&S" (d1) 618 : "1"(to), "2"(from), "0"(size) 619 : "eax", "edx", "memory"); 620 return size; 621 } 622 623 #else 624 625 /* 626 * Leave these declared but undefined. They should not be any references to 627 * them 628 */ 629 unsigned long __copy_user_zeroing_intel(void *to, const void __user *from, 630 unsigned long size); 631 unsigned long __copy_user_intel(void __user *to, const void *from, 632 unsigned long size); 633 unsigned long __copy_user_zeroing_intel_nocache(void *to, 634 const void __user *from, unsigned long size); 635 #endif /* CONFIG_X86_INTEL_USERCOPY */ 636 637 /* Generic arbitrary sized copy. */ 638 #define __copy_user(to,from,size) \ 639 do { \ 640 int __d0, __d1, __d2; \ 641 __asm__ __volatile__( \ 642 " cmp $7,%0\n" \ 643 " jbe 1f\n" \ 644 " movl %1,%0\n" \ 645 " negl %0\n" \ 646 " andl $7,%0\n" \ 647 " subl %0,%3\n" \ 648 "4: rep; movsb\n" \ 649 " movl %3,%0\n" \ 650 " shrl $2,%0\n" \ 651 " andl $3,%3\n" \ 652 " .align 2,0x90\n" \ 653 "0: rep; movsl\n" \ 654 " movl %3,%0\n" \ 655 "1: rep; movsb\n" \ 656 "2:\n" \ 657 ".section .fixup,\"ax\"\n" \ 658 "5: addl %3,%0\n" \ 659 " jmp 2b\n" \ 660 "3: lea 0(%3,%0,4),%0\n" \ 661 " jmp 2b\n" \ 662 ".previous\n" \ 663 ".section __ex_table,\"a\"\n" \ 664 " .align 4\n" \ 665 " .long 4b,5b\n" \ 666 " .long 0b,3b\n" \ 667 " .long 1b,2b\n" \ 668 ".previous" \ 669 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \ 670 : "3"(size), "0"(size), "1"(to), "2"(from) \ 671 : "memory"); \ 672 } while (0) 673 674 #define __copy_user_zeroing(to,from,size) \ 675 do { \ 676 int __d0, __d1, __d2; \ 677 __asm__ __volatile__( \ 678 " cmp $7,%0\n" \ 679 " jbe 1f\n" \ 680 " movl %1,%0\n" \ 681 " negl %0\n" \ 682 " andl $7,%0\n" \ 683 " subl %0,%3\n" \ 684 "4: rep; movsb\n" \ 685 " movl %3,%0\n" \ 686 " shrl $2,%0\n" \ 687 " andl $3,%3\n" \ 688 " .align 2,0x90\n" \ 689 "0: rep; movsl\n" \ 690 " movl %3,%0\n" \ 691 "1: rep; movsb\n" \ 692 "2:\n" \ 693 ".section .fixup,\"ax\"\n" \ 694 "5: addl %3,%0\n" \ 695 " jmp 6f\n" \ 696 "3: lea 0(%3,%0,4),%0\n" \ 697 "6: pushl %0\n" \ 698 " pushl %%eax\n" \ 699 " xorl %%eax,%%eax\n" \ 700 " rep; stosb\n" \ 701 " popl %%eax\n" \ 702 " popl %0\n" \ 703 " jmp 2b\n" \ 704 ".previous\n" \ 705 ".section __ex_table,\"a\"\n" \ 706 " .align 4\n" \ 707 " .long 4b,5b\n" \ 708 " .long 0b,3b\n" \ 709 " .long 1b,6b\n" \ 710 ".previous" \ 711 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \ 712 : "3"(size), "0"(size), "1"(to), "2"(from) \ 713 : "memory"); \ 714 } while (0) 715 716 unsigned long __copy_to_user_ll(void __user *to, const void *from, 717 unsigned long n) 718 { 719 #ifndef CONFIG_X86_WP_WORKS_OK 720 if (unlikely(boot_cpu_data.wp_works_ok == 0) && 721 ((unsigned long )to) < TASK_SIZE) { 722 /* 723 * When we are in an atomic section (see 724 * mm/filemap.c:file_read_actor), return the full 725 * length to take the slow path. 726 */ 727 if (in_atomic()) 728 return n; 729 730 /* 731 * CPU does not honor the WP bit when writing 732 * from supervisory mode, and due to preemption or SMP, 733 * the page tables can change at any time. 734 * Do it manually. Manfred <manfred@colorfullife.com> 735 */ 736 while (n) { 737 unsigned long offset = ((unsigned long)to)%PAGE_SIZE; 738 unsigned long len = PAGE_SIZE - offset; 739 int retval; 740 struct page *pg; 741 void *maddr; 742 743 if (len > n) 744 len = n; 745 746 survive: 747 down_read(¤t->mm->mmap_sem); 748 retval = get_user_pages(current, current->mm, 749 (unsigned long )to, 1, 1, 0, &pg, NULL); 750 751 if (retval == -ENOMEM && is_global_init(current)) { 752 up_read(¤t->mm->mmap_sem); 753 congestion_wait(WRITE, HZ/50); 754 goto survive; 755 } 756 757 if (retval != 1) { 758 up_read(¤t->mm->mmap_sem); 759 break; 760 } 761 762 maddr = kmap_atomic(pg, KM_USER0); 763 memcpy(maddr + offset, from, len); 764 kunmap_atomic(maddr, KM_USER0); 765 set_page_dirty_lock(pg); 766 put_page(pg); 767 up_read(¤t->mm->mmap_sem); 768 769 from += len; 770 to += len; 771 n -= len; 772 } 773 return n; 774 } 775 #endif 776 if (movsl_is_ok(to, from, n)) 777 __copy_user(to, from, n); 778 else 779 n = __copy_user_intel(to, from, n); 780 return n; 781 } 782 EXPORT_SYMBOL(__copy_to_user_ll); 783 784 unsigned long __copy_from_user_ll(void *to, const void __user *from, 785 unsigned long n) 786 { 787 if (movsl_is_ok(to, from, n)) 788 __copy_user_zeroing(to, from, n); 789 else 790 n = __copy_user_zeroing_intel(to, from, n); 791 return n; 792 } 793 EXPORT_SYMBOL(__copy_from_user_ll); 794 795 unsigned long __copy_from_user_ll_nozero(void *to, const void __user *from, 796 unsigned long n) 797 { 798 if (movsl_is_ok(to, from, n)) 799 __copy_user(to, from, n); 800 else 801 n = __copy_user_intel((void __user *)to, 802 (const void *)from, n); 803 return n; 804 } 805 EXPORT_SYMBOL(__copy_from_user_ll_nozero); 806 807 unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from, 808 unsigned long n) 809 { 810 #ifdef CONFIG_X86_INTEL_USERCOPY 811 if ( n > 64 && cpu_has_xmm2) 812 n = __copy_user_zeroing_intel_nocache(to, from, n); 813 else 814 __copy_user_zeroing(to, from, n); 815 #else 816 __copy_user_zeroing(to, from, n); 817 #endif 818 return n; 819 } 820 EXPORT_SYMBOL(__copy_from_user_ll_nocache); 821 822 unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *from, 823 unsigned long n) 824 { 825 #ifdef CONFIG_X86_INTEL_USERCOPY 826 if ( n > 64 && cpu_has_xmm2) 827 n = __copy_user_intel_nocache(to, from, n); 828 else 829 __copy_user(to, from, n); 830 #else 831 __copy_user(to, from, n); 832 #endif 833 return n; 834 } 835 EXPORT_SYMBOL(__copy_from_user_ll_nocache_nozero); 836 837 /** 838 * copy_to_user: - Copy a block of data into user space. 839 * @to: Destination address, in user space. 840 * @from: Source address, in kernel space. 841 * @n: Number of bytes to copy. 842 * 843 * Context: User context only. This function may sleep. 844 * 845 * Copy data from kernel space to user space. 846 * 847 * Returns number of bytes that could not be copied. 848 * On success, this will be zero. 849 */ 850 unsigned long 851 copy_to_user(void __user *to, const void *from, unsigned long n) 852 { 853 if (access_ok(VERIFY_WRITE, to, n)) 854 n = __copy_to_user(to, from, n); 855 return n; 856 } 857 EXPORT_SYMBOL(copy_to_user); 858 859 /** 860 * copy_from_user: - Copy a block of data from user space. 861 * @to: Destination address, in kernel space. 862 * @from: Source address, in user space. 863 * @n: Number of bytes to copy. 864 * 865 * Context: User context only. This function may sleep. 866 * 867 * Copy data from user space to kernel space. 868 * 869 * Returns number of bytes that could not be copied. 870 * On success, this will be zero. 871 * 872 * If some data could not be copied, this function will pad the copied 873 * data to the requested size using zero bytes. 874 */ 875 unsigned long 876 copy_from_user(void *to, const void __user *from, unsigned long n) 877 { 878 if (access_ok(VERIFY_READ, from, n)) 879 n = __copy_from_user(to, from, n); 880 else 881 memset(to, 0, n); 882 return n; 883 } 884 EXPORT_SYMBOL(copy_from_user); 885