| From 7ca0758cdb7c241cb4e0490a8d95f0eb5b861daf Mon Sep 17 00:00:00 2001 |
| From: "H. Peter Anvin" <hpa@linux.intel.com> |
| Date: Mon, 22 Aug 2011 13:27:06 -0700 |
| Subject: x86-32, vdso: On system call restart after SYSENTER, use int |
| $0x80 |
| |
| From: "H. Peter Anvin" <hpa@linux.intel.com> |
| |
| commit 7ca0758cdb7c241cb4e0490a8d95f0eb5b861daf upstream. |
| |
| When we enter a 32-bit system call via SYSENTER or SYSCALL, we shuffle |
| the arguments to match the int $0x80 calling convention. This was |
| probably a design mistake, but it's what it is now. This causes |
| errors if the system call as to be restarted. |
| |
| For SYSENTER, we have to invoke the instruction from the vdso as the |
| return address is hardcoded. Accordingly, we can simply replace the |
| jump in the vdso with an int $0x80 instruction and use the slower |
| entry point for a post-restart. |
| |
| Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Link: http://lkml.kernel.org/r/CA%2B55aFztZ=r5wa0x26KJQxvZOaQq8s2v3u50wCyJcA-Sc4g8gQ@mail.gmail.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/vdso/vdso32/sysenter.S | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/vdso/vdso32/sysenter.S |
| +++ b/arch/x86/vdso/vdso32/sysenter.S |
| @@ -43,7 +43,7 @@ __kernel_vsyscall: |
| .space 7,0x90 |
| |
| /* 14: System call restart point is here! (SYSENTER_RETURN-2) */ |
| - jmp .Lenter_kernel |
| + int $0x80 |
| /* 16: System call normal return point is here! */ |
| VDSO32_SYSENTER_RETURN: /* Symbol used by sysenter.c via vdso32-syms.h */ |
| pop %ebp |