• H. Peter Anvin (Intel)'s avatar
    x86/entry/64: Sign-extend system calls on entry to int · 05954948
    H. Peter Anvin (Intel) authored
    
    
    Right now, *some* code will treat e.g. 0x0000000100000001 as a system
    call and some will not. Some of the code, notably in ptrace, will
    treat 0x000000018000000 as a system call and some will not. Finally,
    right now, e.g. 335 for x86-64 will force the exit code to be set to
    -ENOSYS even if poked by ptrace, but 548 will not, because there is an
    observable difference between an out of range system call and a system
    call number that falls outside the range of the table.
    
    This is visible to the user: for example, the syscall_numbering_64
    test fails if run under strace, because as strace uses ptrace, it ends
    up clobbering the upper half of the 64-bit system call number.
    
    The architecture independent code all assumes that a system call is "int"
    that the value -1 specifically and not just any negative value is used for
    a non-system call. This is the case on x86 as well when arch-independent
    code is involved. The arch-independent API is defined/documented (but not
    *implemented*!) in <asm-generic/syscall.h>.
    
    This is an ABI change, but is in fact a revert to the original x86-64
    ABI. The original assembly entry code would zero-extend the system call
    number;
    
    Use sign extend to be explicit that this is treated as a signed number
    (although in practice it makes no difference, of course) and to avoid
    people getting the idea of "optimizing" it, as has happened on at least
    two(!) separate occasions.
    
    Do not store the extended value into regs->orig_ax, however: on x86-64, the
    ABI is that the callee is responsible for extending parameters, so only
    examining the lower 32 bits is fully consistent with any "int" argument to
    any system call, e.g. regs->di for write(2). The full value of %rax on
    entry to the kernel is thus still available.
    
    [ tglx: Add a comment to the ASM code ]
    Signed-off-by: default avatarH. Peter Anvin (Intel) <hpa@zytor.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20210518191303.4135296-5-hpa@zytor.com
    05954948
entry_64.S 40.9 KB