Merge tag 'platform-drivers-x86-v6.1-5' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / kernel / trace / trace_kprobe.c
index 23f7f0e..5a75b03 100644 (file)
@@ -20,6 +20,7 @@
 #include "trace_kprobe_selftest.h"
 #include "trace_probe.h"
 #include "trace_probe_tmpl.h"
+#include "trace_probe_kernel.h"
 
 #define KPROBE_EVENT_SYSTEM "kprobes"
 #define KRETPROBE_MAXACTIVE_MAX 4096
@@ -1223,29 +1224,14 @@ static const struct file_operations kprobe_profile_ops = {
 static nokprobe_inline int
 fetch_store_strlen_user(unsigned long addr)
 {
-       const void __user *uaddr =  (__force const void __user *)addr;
-
-       return strnlen_user_nofault(uaddr, MAX_STRING_SIZE);
+       return kern_fetch_store_strlen_user(addr);
 }
 
 /* Return the length of string -- including null terminal byte */
 static nokprobe_inline int
 fetch_store_strlen(unsigned long addr)
 {
-       int ret, len = 0;
-       u8 c;
-
-#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
-       if (addr < TASK_SIZE)
-               return fetch_store_strlen_user(addr);
-#endif
-
-       do {
-               ret = copy_from_kernel_nofault(&c, (u8 *)addr + len, 1);
-               len++;
-       } while (c && ret == 0 && len < MAX_STRING_SIZE);
-
-       return (ret < 0) ? ret : len;
+       return kern_fetch_store_strlen(addr);
 }
 
 /*
@@ -1255,21 +1241,7 @@ fetch_store_strlen(unsigned long addr)
 static nokprobe_inline int
 fetch_store_string_user(unsigned long addr, void *dest, void *base)
 {
-       const void __user *uaddr =  (__force const void __user *)addr;
-       int maxlen = get_loc_len(*(u32 *)dest);
-       void *__dest;
-       long ret;
-
-       if (unlikely(!maxlen))
-               return -ENOMEM;
-
-       __dest = get_loc_data(dest, base);
-
-       ret = strncpy_from_user_nofault(__dest, uaddr, maxlen);
-       if (ret >= 0)
-               *(u32 *)dest = make_data_loc(ret, __dest - base);
-
-       return ret;
+       return kern_fetch_store_string_user(addr, dest, base);
 }
 
 /*
@@ -1279,29 +1251,7 @@ fetch_store_string_user(unsigned long addr, void *dest, void *base)
 static nokprobe_inline int
 fetch_store_string(unsigned long addr, void *dest, void *base)
 {
-       int maxlen = get_loc_len(*(u32 *)dest);
-       void *__dest;
-       long ret;
-
-#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
-       if ((unsigned long)addr < TASK_SIZE)
-               return fetch_store_string_user(addr, dest, base);
-#endif
-
-       if (unlikely(!maxlen))
-               return -ENOMEM;
-
-       __dest = get_loc_data(dest, base);
-
-       /*
-        * Try to get string again, since the string can be changed while
-        * probing.
-        */
-       ret = strncpy_from_kernel_nofault(__dest, (void *)addr, maxlen);
-       if (ret >= 0)
-               *(u32 *)dest = make_data_loc(ret, __dest - base);
-
-       return ret;
+       return kern_fetch_store_string(addr, dest, base);
 }
 
 static nokprobe_inline int