On December 1, 2018 11:09:58 AM GMT+13:00, Arnd Bergmann <arnd@xxxxxxxx> wrote: >On Fri, Nov 30, 2018 at 5:36 PM Andy Lutomirski <luto@xxxxxxxxxx> >wrote: >> >> On Fri, Nov 30, 2018 at 3:41 AM Arnd Bergmann <arnd@xxxxxxxx> wrote: >> > siginfo_t as it is now still has a number of other downsides, and >Andy in >> > particular didn't like the idea of having three new variants on x86 >> > (depending on how you count). His alternative suggestion of having >> > a single syscall entry point that takes a 'signfo_t __user *' but >interprets >> > it as compat_siginfo depending on >in_compat_syscall()/in_x32_syscall() >> > should work correctly, but feels wrong to me, or at least >inconsistent >> > with how we do this elsewhere. >> >> If everyone else is okay with it, I can get on board with three >> variants on x86. What I can't get on board with is *five* variants >on >> x86, which would be: >> >> procfd_signal via int80 / the 32-bit vDSO: the ia32 structure >> >> syscall64 with nr == 335 (presumably): 64-bit > >These seem unavoidable > >> syscall64 with nr == 548 | 0x40000000: x32 >> >> syscall64 with nr == 548: 64-bit entry but in_compat_syscall() == >> true, behavior is arbitrary >> >> syscall64 with nr == 335 | 0x40000000: x32 entry, but >> in_compat_syscall() == false, behavior is arbitrary > >Am I misreading the code? The way I understand it, setting the >0x40000000 bit means that both in_compat_syscall() and >in_x32_syscall become() true, based on > >static inline bool in_x32_syscall(void) >{ >#ifdef CONFIG_X86_X32_ABI > if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT) > return true; >#endif > return false; >} > >The '548 | 0x40000000' part seems to be the only sensible >way to handle x32 here. What exactly would you propose to >avoid defining the other entry points? > >> This mess isn't really Christian's fault -- it's been there for a >> while, but it's awful and I don't think we want to perpetuate it. > >I'm not convinced that not assigning an x32 syscall number >improves the situation, it just means that we now have one >syscall that behaves completely differently from all others, >in that the x32 version requires being called through a >SYSCALL_DEFINE() entry point rather than a >COMPAT_SYSCALL_DEFINE() one, and we have to >add more complexity to the copy_siginfo_from_user() >implementation to duplicate the hack that exists in >copy_siginfo_from_user32(). > >Of course, the nicest option would be to completely remove >x32 so we can stop worrying about it. One humble point I would like to make is that what I care about most is a sensible way forward without having to redo essential parts of how syscalls work. I don't want to introduce a sane, small syscall that ends up breaking all over the place because we decided to fix past mistakes that technically have nothing to do with the patch itself. However, I do sympathize and understand these concerns.