|
@@ -60,6 +60,19 @@ extern struct syscall_metadata *__stop_syscalls_metadata[];
|
|
|
|
|
|
static struct syscall_metadata **syscalls_metadata;
|
|
static struct syscall_metadata **syscalls_metadata;
|
|
|
|
|
|
|
|
+#ifndef ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
|
|
|
+static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Only compare after the "sys" prefix. Archs that use
|
|
|
|
+ * syscall wrappers may have syscalls symbols aliases prefixed
|
|
|
|
+ * with "SyS" instead of "sys", leading to an unwanted
|
|
|
|
+ * mismatch.
|
|
|
|
+ */
|
|
|
|
+ return !strcmp(sym + 3, name + 3);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
static __init struct syscall_metadata *
|
|
static __init struct syscall_metadata *
|
|
find_syscall_meta(unsigned long syscall)
|
|
find_syscall_meta(unsigned long syscall)
|
|
{
|
|
{
|
|
@@ -73,13 +86,7 @@ find_syscall_meta(unsigned long syscall)
|
|
kallsyms_lookup(syscall, NULL, NULL, NULL, str);
|
|
kallsyms_lookup(syscall, NULL, NULL, NULL, str);
|
|
|
|
|
|
for ( ; start < stop; start++) {
|
|
for ( ; start < stop; start++) {
|
|
- /*
|
|
|
|
- * Only compare after the "sys" prefix. Archs that use
|
|
|
|
- * syscall wrappers may have syscalls symbols aliases prefixed
|
|
|
|
- * with "SyS" instead of "sys", leading to an unwanted
|
|
|
|
- * mismatch.
|
|
|
|
- */
|
|
|
|
- if ((*start)->name && !strcmp((*start)->name + 3, str + 3))
|
|
|
|
|
|
+ if ((*start)->name && arch_syscall_match_sym_name(str, (*start)->name))
|
|
return *start;
|
|
return *start;
|
|
}
|
|
}
|
|
return NULL;
|
|
return NULL;
|