All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC dwarves] syscall functions in BTF
@ 2023-03-10 10:07 Jiri Olsa
  2023-03-10 12:43 ` Alan Maguire
  0 siblings, 1 reply; 7+ messages in thread
From: Jiri Olsa @ 2023-03-10 10:07 UTC (permalink / raw)
  To: acme, Alan Maguire
  Cc: ast, daniel, andrii, martin.lau, song, yhs, john.fastabend,
	kpsingh, sdf, haoluo, bpf

hi,
with latest pahole fixes we get rid of some syscall functions (with
__x64_sys_ prefix) and it seems to fall down to 2 cases:

- weak syscall functions generated in kernel/sys_ni.c prevent these syscalls
  to be generated in BTF. The reason is the __COND_SYSCALL macro uses
  '__unused' for regs argument:

        #define __COND_SYSCALL(abi, name)                                      \
               __weak long __##abi##_##name(const struct pt_regs *__unused);   \
               __weak long __##abi##_##name(const struct pt_regs *__unused)    \
               {                                                               \
                       return sys_ni_syscall();                                \
               }

  and having weak function with different argument name will rule out the
  syscall from BTF functions

  the patch below workarounds this by using the same argument name,
  but I guess the real fix would be to check the whole type not just
  the argument name.. or ignore weak function if there's non weak one

  I guess there will be more cases like this in kernel


- we also do not get any syscall with no arguments, because they are
  generated as aliases to __do_<syscall> function:

        $ nm ./vmlinux | grep _sys_fork
        ffffffff81174890 t __do_sys_fork
        ffffffff81174890 T __ia32_sys_fork
        ffffffff81174880 T __pfx___x64_sys_fork
        ffffffff81174890 T __x64_sys_fork

  with:
        #define __SYS_STUB0(abi, name)                                          \
                long __##abi##_##name(const struct pt_regs *regs);              \
                ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO);                 \
                long __##abi##_##name(const struct pt_regs *regs)               \
                        __alias(__do_##name);

  the problem seems to be that there's no DWARF data for aliased symbol,
  so pahole won't see any __x64_sys_fork record
  I'm not sure how to fix this one

  technically we can always connect to __do_sys_fork, but we'd need to
  have special cases for such syscalls.. would be great to have all with
  '__x64_sys_' prefix


thoughts?

thanks,
jirka


---
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index fd2669b1cb2d..e02dab630577 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -80,8 +80,8 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
 	}
 
 #define __COND_SYSCALL(abi, name)					\
-	__weak long __##abi##_##name(const struct pt_regs *__unused);	\
-	__weak long __##abi##_##name(const struct pt_regs *__unused)	\
+	__weak long __##abi##_##name(const struct pt_regs *regs);	\
+	__weak long __##abi##_##name(const struct pt_regs *regs)	\
 	{								\
 		return sys_ni_syscall();				\
 	}

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-03-10 18:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-10 10:07 [RFC dwarves] syscall functions in BTF Jiri Olsa
2023-03-10 12:43 ` Alan Maguire
2023-03-10 15:03   ` Arnaldo Carvalho de Melo
2023-03-10 15:10     ` Arnaldo Carvalho de Melo
2023-03-10 18:34     ` Alan Maguire
2023-03-10 15:09   ` Jiri Olsa
2023-03-10 18:11     ` Alan Maguire

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.