This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] [BZ #19371] Properly handle x32 syscall
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Wed, 16 Dec 2015 13:21:19 -0800
- Subject: Re: [PATCH] [BZ #19371] Properly handle x32 syscall
- Authentication-results: sourceware.org; auth=none
- References: <20151216150139 dot GA24629 at gmail dot com> <20151216164812 dot GA23391 at altlinux dot org> <CAMe9rOrhxoFwpYyQ-6YAzThjt2-EFXsJjrbMk2C2AsCisCNQNw at mail dot gmail dot com> <20151216171751 dot GB23391 at altlinux dot org>
On Wed, Dec 16, 2015 at 9:17 AM, Dmitry V. Levin <ldv@altlinux.org> wrote:
> On Wed, Dec 16, 2015 at 08:52:34AM -0800, H.J. Lu wrote:
>> On Wed, Dec 16, 2015 at 8:48 AM, Dmitry V. Levin <ldv@altlinux.org> wrote:
>> > On Wed, Dec 16, 2015 at 07:01:39AM -0800, H.J. Lu wrote:
>> >> X32 syscall() may return 64-bit integer as lseek, time and times. Its
>> >> return type should be __syscall_slong_t instead of long int. We need
>> >> to properly return 64-bit error value.
>> > [...]
>> >> +#include <sysdep.h>
>> >> +
>> >> +/* Return -1LL in a full 64 bits. */
>> >> +#undef SYSCALL_ERROR_HANDLER
>> >> +#define SYSCALL_ERROR_HANDLER \
>> >> +0: \
>> >> + SYSCALL_SET_ERRNO; \
>> >> + orq $-1, %rax; \
>> >> + ret;
>> >> +
>> >> +/* Always use our own error handler. */
>> >> +#undef SYSCALL_ERROR_LABEL
>> >> +#define SYSCALL_ERROR_LABEL 0f
>> >> +
>> >> +#include <sysdeps/unix/sysv/linux/x86_64/syscall.S>
>> >
>> > While this looks technically OK, I don't understand why RAX_LP is used
>> > at all in default SYSCALL_ERROR_HANDLER in place for rax. Everything
>> > would be simpler if glibc finally admitted that return code of any
>> > x32 linux syscall is stored in %rax and not in %eax.
>>
>> Only 3 system calls return 64-bit value.
>
> What do you mean by saying that?
> Every bit of %rax is initialized on return from any syscall.
>
>> %eax is one-byte shorter.
>
> In your proposed fix for times syscall wrapper, the new __times is 2 bytes
> shorter than the old one. Could it happen that other syscall wrappers
> will also win after switching from %eax to %rax?
>
You are asking for trouble. How do you extend 64-bit syscall
return value, 0x80000000, to 64-bit?
--
H.J.