On Tue, Mar 24, 2015 at 4:17 PM, Denys Vlasenko <dvlas...@redhat.com> wrote: > On 03/24/2015 05:55 PM, Brian Gerst wrote: >>>> Might be nice to place a more generic description there, which >>>> registers are expected to be saved by user-space calling in here, etc. >>> >>> __kernel_vsyscall entry point has the same ABI in any 32-bit vDSO, >>> the good old int 0x80 calling convention: >>> >>> syscall# in eax, >>> params in ebx/ecx/edx/esi/edi/ebp, >>> all registers are preserved by the syscall. >>> >>> (I think we don't guarantee that all flags are preserved: >>> I have a testcase where DF gets cleared). >> >> DF should always be clear on any function call per the C ABI. But, >> eflags should be preserved, at least the non-privileged bits. I'd >> like to see that testcase. > > The testcase is a simplistic example of how to find and use > 32-bit vDSO to perform system calls. > > It also sets flags.DF before syscall, and checks whether registers > are preserved, including flags.DF. > > On 32-bit kernel (on Intel CPU, where vDSO uses SYSENTER), I see this: > > $ ./test32_syscall_vdso > Result:1 > > whereas on 64-bit it is > > ./test32_syscall_vdso > Result:0 > > "Result:1" means that DF was cleared. > > See attached source. >
It looks like 32-bit native does not restore eflags before sysexit, while 64-bit compat does. -- Brian Gerst -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/