1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Optimized memory copy routines.
5 * Copyright (C) 2004 Randolph Chung <tausq@debian.org>
6 * Copyright (C) 2013-2017 Helge Deller <deller@gmx.de>
8 * Portions derived from the GNU C Library
9 * Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
12 #include <linux/module.h>
13 #include <linux/compiler.h>
14 #include <linux/uaccess.h>
16 #define get_user_space() mfsp(SR_USER)
17 #define get_kernel_space() SR_KERNEL
19 /* Returns 0 for success, otherwise, returns number of bytes not transferred. */
20 extern unsigned long pa_memcpy(void *dst
, const void *src
,
23 unsigned long raw_copy_to_user(void __user
*dst
, const void *src
,
26 mtsp(get_kernel_space(), SR_TEMP1
);
27 mtsp(get_user_space(), SR_TEMP2
);
28 return pa_memcpy((void __force
*)dst
, src
, len
);
30 EXPORT_SYMBOL(raw_copy_to_user
);
32 unsigned long raw_copy_from_user(void *dst
, const void __user
*src
,
35 mtsp(get_user_space(), SR_TEMP1
);
36 mtsp(get_kernel_space(), SR_TEMP2
);
37 return pa_memcpy(dst
, (void __force
*)src
, len
);
39 EXPORT_SYMBOL(raw_copy_from_user
);
41 void * memcpy(void * dst
,const void *src
, size_t count
)
43 mtsp(get_kernel_space(), SR_TEMP1
);
44 mtsp(get_kernel_space(), SR_TEMP2
);
45 pa_memcpy(dst
, src
, count
);
49 EXPORT_SYMBOL(memcpy
);
51 bool copy_from_kernel_nofault_allowed(const void *unsafe_src
, size_t size
)
53 if ((unsigned long)unsafe_src
< PAGE_SIZE
)
55 /* check for I/O space F_EXTEND(0xfff00000) access as well? */