On Fri, Oct 13, 2017 at 1:39 PM, Dave Hansen <dave.han...@linux.intel.com> wrote: > > I noticed that we don't have tracepoints for sys_modify_ldt(). I > think that's because we define it directly instead of using the > normal SYSCALL_DEFINEx() macros. > > Is there a reason for that, or were they just missed when the > macros were created?
No, and it's a longstanding fsckup that I think you can't fix like this because... > > Cc: x...@kernel.org > Cc: Andy Lutomirski <l...@kernel.org> > > --- > > b/arch/x86/include/asm/syscalls.h | 2 +- > b/arch/x86/kernel/ldt.c | 5 +++-- > b/arch/x86/um/ldt.c | 3 ++- > 3 files changed, 6 insertions(+), 4 deletions(-) > > diff -puN arch/x86/kernel/ldt.c~x86-syscall-macros-modify_ldt > arch/x86/kernel/ldt.c > --- a/arch/x86/kernel/ldt.c~x86-syscall-macros-modify_ldt 2017-10-13 > 13:30:12.802553391 -0700 > +++ b/arch/x86/kernel/ldt.c 2017-10-13 13:30:12.817553391 -0700 > @@ -12,6 +12,7 @@ > #include <linux/string.h> > #include <linux/mm.h> > #include <linux/smp.h> > +#include <linux/syscalls.h> > #include <linux/slab.h> > #include <linux/vmalloc.h> > #include <linux/uaccess.h> > @@ -294,8 +295,8 @@ out: > return error; > } > > -asmlinkage int sys_modify_ldt(int func, void __user *ptr, > - unsigned long bytecount) > +SYSCALL_DEFINE3(modify_ldt, int , func , void __user * , ptr , > + unsigned long , bytecount) sys_modify_ldt() returns int, which is wrong, and it's visibly wrong to 64-bit user code. So I think you need to make sure that the return value is cast to int in all cases. --Andy