|  | /* | 
|  | * From code in arch/x86/lib/usercopy_64.c, copied to keep tools/ copy | 
|  | * of the kernel's arch/x86/lib/memcpy_64.s used in 'perf bench mem memcpy' | 
|  | * happy. | 
|  | */ | 
|  | #include <linux/types.h> | 
|  |  | 
|  | unsigned long __memcpy_mcsafe(void *dst, const void *src, size_t cnt); | 
|  | unsigned long mcsafe_handle_tail(char *to, char *from, unsigned len); | 
|  |  | 
|  | unsigned long mcsafe_handle_tail(char *to, char *from, unsigned len) | 
|  | { | 
|  | for (; len; --len, to++, from++) { | 
|  | /* | 
|  | * Call the assembly routine back directly since | 
|  | * memcpy_mcsafe() may silently fallback to memcpy. | 
|  | */ | 
|  | unsigned long rem = __memcpy_mcsafe(to, from, 1); | 
|  |  | 
|  | if (rem) | 
|  | break; | 
|  | } | 
|  | return len; | 
|  | } |