memcpy.c (e5451c8f8330e03ad3cfa16048b4daf961af434f) memcpy.c (9e91db6b4abecd58647a5e984d538187f1c2ea09)
1/*
2 * Optimized memory copy routines.
3 *
4 * Copyright (C) 2004 Randolph Chung <tausq@debian.org>
5 * Copyright (C) 2013 Helge Deller <deller@gmx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 475 unchanged lines hidden (view full) ---

484
485 if (fault_addr >= reference)
486 return len - (fault_addr - reference);
487 else
488 return len;
489}
490
491#ifdef __KERNEL__
1/*
2 * Optimized memory copy routines.
3 *
4 * Copyright (C) 2004 Randolph Chung <tausq@debian.org>
5 * Copyright (C) 2013 Helge Deller <deller@gmx.de>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by

--- 475 unchanged lines hidden (view full) ---

484
485 if (fault_addr >= reference)
486 return len - (fault_addr - reference);
487 else
488 return len;
489}
490
491#ifdef __KERNEL__
492unsigned long copy_to_user(void __user *dst, const void *src, unsigned long len)
492unsigned long __copy_to_user(void __user *dst, const void *src,
493 unsigned long len)
493{
494 mtsp(get_kernel_space(), 1);
495 mtsp(get_user_space(), 2);
496 return pa_memcpy((void __force *)dst, src, len);
497}
494{
495 mtsp(get_kernel_space(), 1);
496 mtsp(get_user_space(), 2);
497 return pa_memcpy((void __force *)dst, src, len);
498}
499EXPORT_SYMBOL(__copy_to_user);
498
500
499EXPORT_SYMBOL(__copy_from_user);
500unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long len)
501unsigned long __copy_from_user(void *dst, const void __user *src,
502 unsigned long len)
501{
502 mtsp(get_user_space(), 1);
503 mtsp(get_kernel_space(), 2);
504 return pa_memcpy(dst, (void __force *)src, len);
505}
503{
504 mtsp(get_user_space(), 1);
505 mtsp(get_kernel_space(), 2);
506 return pa_memcpy(dst, (void __force *)src, len);
507}
508EXPORT_SYMBOL(__copy_from_user);
506
507unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned long len)
508{
509 mtsp(get_user_space(), 1);
510 mtsp(get_user_space(), 2);
511 return pa_memcpy((void __force *)dst, (void __force *)src, len);
512}
513
514
515void * memcpy(void * dst,const void *src, size_t count)
516{
517 mtsp(get_kernel_space(), 1);
518 mtsp(get_kernel_space(), 2);
519 pa_memcpy(dst, src, count);
520 return dst;
521}
522
509
510unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned long len)
511{
512 mtsp(get_user_space(), 1);
513 mtsp(get_user_space(), 2);
514 return pa_memcpy((void __force *)dst, (void __force *)src, len);
515}
516
517
518void * memcpy(void * dst,const void *src, size_t count)
519{
520 mtsp(get_kernel_space(), 1);
521 mtsp(get_kernel_space(), 2);
522 pa_memcpy(dst, src, count);
523 return dst;
524}
525
523EXPORT_SYMBOL(copy_to_user);
524EXPORT_SYMBOL(copy_from_user);
525EXPORT_SYMBOL(copy_in_user);
526EXPORT_SYMBOL(memcpy);
527
528long probe_kernel_read(void *dst, const void *src, size_t size)
529{
530 unsigned long addr = (unsigned long)src;
531
532 if (addr < PAGE_SIZE)
533 return -EFAULT;
534
535 /* check for I/O space F_EXTEND(0xfff00000) access as well? */
536
537 return __probe_kernel_read(dst, src, size);
538}
539
540#endif
526EXPORT_SYMBOL(copy_in_user);
527EXPORT_SYMBOL(memcpy);
528
529long probe_kernel_read(void *dst, const void *src, size_t size)
530{
531 unsigned long addr = (unsigned long)src;
532
533 if (addr < PAGE_SIZE)
534 return -EFAULT;
535
536 /* check for I/O space F_EXTEND(0xfff00000) access as well? */
537
538 return __probe_kernel_read(dst, src, size);
539}
540
541#endif