• Roland McGrath's avatar
    x86_64: make ptrace always sign-extend orig_ax to 64 bits · 84c6f604
    Roland McGrath authored
    This makes 64-bit ptrace calls setting the 64-bit orig_ax field for a
    32-bit task sign-extend the low 32 bits up to 64.  This matches what a
    64-bit debugger expects when tracing a 32-bit task.
    
    This follows on my "x86_64 ia32 syscall restart fix".  This didn't
    matter until that was fixed.
    
    The debugger ignores or zeros the high half of every register slot it
    sets (including the orig_rax pseudo-register) uniformly.  It expects
    that the setting of the low 32 bits always has the same meaning as a
    32-bit debugger setting those same 32 bits with native 32-bit
    facilities.
    
    This never arose before because the syscall restart check never
    matched any -ERESTART* values due to lack of sign extension.  Before
    that fix, even 32-bit ptrace setting orig_eax to -1 failed to trigger
    the restart check anyway.  So this was never noticed as a regression
    of 64-bit debuggers vs 32-bit debuggers on the same 64-bit kernel.
    Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
    [ Changed to just do the sign-extension unconditionally on x86-64,
      since orig_ax is always just a small integer and doesn't need
      the full 64-bit range ]
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    84c6f604
ptrace.c 38 KB