mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 22:44:27 +08:00
de6cc6515a
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation inc 675 mass ave cambridge ma 02139 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 77 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Armijn Hemel <armijn@tjaldur.nl> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.837555891@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
71 lines
1.8 KiB
C
71 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Optimized memory copy routines.
|
|
*
|
|
* Copyright (C) 2004 Randolph Chung <tausq@debian.org>
|
|
* Copyright (C) 2013-2017 Helge Deller <deller@gmx.de>
|
|
*
|
|
* Portions derived from the GNU C Library
|
|
* Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/uaccess.h>
|
|
|
|
#define get_user_space() (uaccess_kernel() ? 0 : mfsp(3))
|
|
#define get_kernel_space() (0)
|
|
|
|
/* Returns 0 for success, otherwise, returns number of bytes not transferred. */
|
|
extern unsigned long pa_memcpy(void *dst, const void *src,
|
|
unsigned long len);
|
|
|
|
unsigned long raw_copy_to_user(void __user *dst, const void *src,
|
|
unsigned long len)
|
|
{
|
|
mtsp(get_kernel_space(), 1);
|
|
mtsp(get_user_space(), 2);
|
|
return pa_memcpy((void __force *)dst, src, len);
|
|
}
|
|
EXPORT_SYMBOL(raw_copy_to_user);
|
|
|
|
unsigned long raw_copy_from_user(void *dst, const void __user *src,
|
|
unsigned long len)
|
|
{
|
|
mtsp(get_user_space(), 1);
|
|
mtsp(get_kernel_space(), 2);
|
|
return pa_memcpy(dst, (void __force *)src, len);
|
|
}
|
|
EXPORT_SYMBOL(raw_copy_from_user);
|
|
|
|
unsigned long raw_copy_in_user(void __user *dst, const void __user *src, unsigned long len)
|
|
{
|
|
mtsp(get_user_space(), 1);
|
|
mtsp(get_user_space(), 2);
|
|
return pa_memcpy((void __force *)dst, (void __force *)src, len);
|
|
}
|
|
|
|
|
|
void * memcpy(void * dst,const void *src, size_t count)
|
|
{
|
|
mtsp(get_kernel_space(), 1);
|
|
mtsp(get_kernel_space(), 2);
|
|
pa_memcpy(dst, src, count);
|
|
return dst;
|
|
}
|
|
|
|
EXPORT_SYMBOL(raw_copy_in_user);
|
|
EXPORT_SYMBOL(memcpy);
|
|
|
|
long probe_kernel_read(void *dst, const void *src, size_t size)
|
|
{
|
|
unsigned long addr = (unsigned long)src;
|
|
|
|
if (addr < PAGE_SIZE)
|
|
return -EFAULT;
|
|
|
|
/* check for I/O space F_EXTEND(0xfff00000) access as well? */
|
|
|
|
return __probe_kernel_read(dst, src, size);
|
|
}
|