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() (uaccess_kernel() ? 0 : mfsp(3))
17 #define get_kernel_space() (0)
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(), 1);
27 mtsp(get_user_space(), 2);
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(), 1);
36 mtsp(get_kernel_space(), 2);
37 return pa_memcpy(dst
, (void __force
*)src
, len
);
39 EXPORT_SYMBOL(raw_copy_from_user
);
41 unsigned long raw_copy_in_user(void __user
*dst
, const void __user
*src
, unsigned long len
)
43 mtsp(get_user_space(), 1);
44 mtsp(get_user_space(), 2);
45 return pa_memcpy((void __force
*)dst
, (void __force
*)src
, len
);
49 void * memcpy(void * dst
,const void *src
, size_t count
)
51 mtsp(get_kernel_space(), 1);
52 mtsp(get_kernel_space(), 2);
53 pa_memcpy(dst
, src
, count
);
57 EXPORT_SYMBOL(raw_copy_in_user
);
58 EXPORT_SYMBOL(memcpy
);
60 bool copy_from_kernel_nofault_allowed(const void *unsafe_src
, size_t size
)
62 if ((unsigned long)unsafe_src
< PAGE_SIZE
)
64 /* check for I/O space F_EXTEND(0xfff00000) access as well? */