Messages in this thread | | | Date | Mon, 4 Jan 2021 16:58:27 +0000 | From | Al Viro <> | Subject | Re: in_compat_syscall() on x86 |
| |
On Mon, Jan 04, 2021 at 12:16:56PM +0000, David Laight wrote: > On x86 in_compat_syscall() is defined as: > in_ia32_syscall() || in_x32_syscall() > > Now in_ia32_syscall() is a simple check of the TS_COMPAT flag. > However in_x32_syscall() is a horrid beast that has to indirect > through to the original %eax value (ie the syscall number) and > check for a bit there. > > So on a kernel with x32 support (probably most distro kernels) > the in_compat_syscall() check is rather more expensive than > one might expect. > > It would be muck better if both checks could be done together. > I think this would require the syscall entry code to set a > value in both the 64bit and x32 entry paths. > (Can a process make both 64bit and x32 system calls?)
Yes, it bloody well can.
And I see no benefit in pushing that logics into syscall entry, since anything that calls in_compat_syscall() more than once per syscall execution is doing the wrong thing. Moreover, in quite a few cases we don't call the sucker at all, and for all of those pushing that crap into syscall entry logics is pure loss.
What's the point, really?
| |