summaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/pgtable_32.c
diff options
context:
space:
mode:
authorRoland McGrath2008-02-29 04:57:07 +0100
committerIngo Molnar2008-03-11 17:11:54 +0100
commit40f0933d51f4cba26a5c009a26bb230f4514c1b6 (patch)
tree29a55b7ae8ca7488a9d84fb9de234cff9f8f80b4 /arch/x86/mm/pgtable_32.c
parentx86: ioremap, remove WARN_ON() (diff)
downloadkernel-qcow2-linux-40f0933d51f4cba26a5c009a26bb230f4514c1b6.tar.gz
kernel-qcow2-linux-40f0933d51f4cba26a5c009a26bb230f4514c1b6.tar.xz
kernel-qcow2-linux-40f0933d51f4cba26a5c009a26bb230f4514c1b6.zip
x86: ia32 syscall restart fix
The code to restart syscalls after signals depends on checking for a negative orig_ax, and for particular negative -ERESTART* values in ax. These fields are 64 bits and for a 32-bit task they get zero-extended. The syscall restart behavior is lost, a regression from a native 32-bit kernel and from 64-bit tasks' behavior. This patch fixes the problem by doing sign-extension where it matters. For orig_ax, the only time the value should be -1 but winds up as 0x0ffffffff is via a 32-bit ptrace call. So the patch changes ptrace to sign-extend the 32-bit orig_eax value when it's stored; it doesn't change the checks on orig_ax, though it uses the new current_syscall() inline to better document the subtle importance of the used of signedness there. The ax value is stored a lot of ways and it seems hard to get them all sign-extended at their origins. So for that, we use the current_syscall_ret() to sign-extend it only for 32-bit tasks at the time of the -ERESTART* comparisons. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm/pgtable_32.c')
0 files changed, 0 insertions, 0 deletions