diff options
Diffstat (limited to 'arch/x86/lib/copy_mc.c')
| -rw-r--r-- | arch/x86/lib/copy_mc.c | 21 | 
1 files changed, 17 insertions, 4 deletions
diff --git a/arch/x86/lib/copy_mc.c b/arch/x86/lib/copy_mc.c index 6e8b7e600def..97e88e58567b 100644 --- a/arch/x86/lib/copy_mc.c +++ b/arch/x86/lib/copy_mc.c @@ -4,6 +4,7 @@  #include <linux/jump_label.h>  #include <linux/uaccess.h>  #include <linux/export.h> +#include <linux/instrumented.h>  #include <linux/string.h>  #include <linux/types.h> @@ -61,10 +62,20 @@ unsigned long copy_mc_enhanced_fast_string(void *dst, const void *src, unsigned   */  unsigned long __must_check copy_mc_to_kernel(void *dst, const void *src, unsigned len)  { -	if (copy_mc_fragile_enabled) -		return copy_mc_fragile(dst, src, len); -	if (static_cpu_has(X86_FEATURE_ERMS)) -		return copy_mc_enhanced_fast_string(dst, src, len); +	unsigned long ret; + +	if (copy_mc_fragile_enabled) { +		instrument_memcpy_before(dst, src, len); +		ret = copy_mc_fragile(dst, src, len); +		instrument_memcpy_after(dst, src, len, ret); +		return ret; +	} +	if (static_cpu_has(X86_FEATURE_ERMS)) { +		instrument_memcpy_before(dst, src, len); +		ret = copy_mc_enhanced_fast_string(dst, src, len); +		instrument_memcpy_after(dst, src, len, ret); +		return ret; +	}  	memcpy(dst, src, len);  	return 0;  } @@ -75,6 +86,7 @@ unsigned long __must_check copy_mc_to_user(void __user *dst, const void *src, un  	unsigned long ret;  	if (copy_mc_fragile_enabled) { +		instrument_copy_to_user(dst, src, len);  		__uaccess_begin();  		ret = copy_mc_fragile((__force void *)dst, src, len);  		__uaccess_end(); @@ -82,6 +94,7 @@ unsigned long __must_check copy_mc_to_user(void __user *dst, const void *src, un  	}  	if (static_cpu_has(X86_FEATURE_ERMS)) { +		instrument_copy_to_user(dst, src, len);  		__uaccess_begin();  		ret = copy_mc_enhanced_fast_string((__force void *)dst, src, len);  		__uaccess_end();  |