This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug time/19363] x32: times() return value wrongly truncates/sign extends from 32bit
- From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sourceware dot org
- Date: Tue, 15 Dec 2015 17:01:15 +0000
- Subject: [Bug time/19363] x32: times() return value wrongly truncates/sign extends from 32bit
- Auto-submitted: auto-generated
- References: <bug-19363-131 at http dot sourceware dot org/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=19363
--- Comment #8 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, hjl/pr19363/2.22 has been created
at 61297097311b652596ecb1e14fa5cdd64afd6422 (commit)
- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=61297097311b652596ecb1e14fa5cdd64afd6422
commit 61297097311b652596ecb1e14fa5cdd64afd6422
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Mon Dec 14 19:09:13 2015 -0800
Use INTERNAL_SYSCALL_TIMES* macros for Linux times
The Linux times function, which returns clock_t, is implemented with
INTERNAL_SYSCALL_DECL, INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P and
INTERNAL_SYSCALL_ERRNO. Since INTERNAL_SYSCALL* macros use 32-bit
integer and clock_t is 64-bit on x32, this is a mismatch on x32. All
system calls returning 64-bit integer, which are lseek, time and times,
must be handled specially for x32. lseek is handled by x32 lseek.S and
time doesn't check syscall return. times is the only missed one.
This patch replaces INTERNAL_SYSCALL* macros in Linux times.c with
INTERNAL_SYSCALL_TIMES* macros which are default to INTERNAL_SYSCALL*
macros and provides x32 times.c with proper INTERNAL_SYSCALL_TIMES*
macros.
There is no code change on times for i686 nor x86-64. For x32, before
this patch, there are
0000000 <__times>:
0: b8 64 00 00 40 mov $0x40000064,%eax
5: 0f 05 syscall
7: 48 63 d0 movslq %eax,%rdx
^^^^^^^^^^ Incorrect signed extension
a: 48 83 fa f2 cmp $0xfffffffffffffff2,%rdx
e: 75 07 jne 17 <__times+0x17>
10: 3d 00 f0 ff ff cmp $0xfffff000,%eax
^^^^^^^^^^^^^^^^^^^^^ 32-bit compare
15: 77 11 ja 28 <__times+0x28>
17: 48 83 fa ff cmp $0xffffffffffffffff,%rdx
1b: b8 00 00 00 00 mov $0x0,%eax
20: 48 0f 45 c2 cmovne %rdx,%rax
24: c3 retq
After this patch, there are
00000000 <__times>:
0: b8 64 00 00 40 mov $0x40000064,%eax
5: 0f 05 syscall
7: 48 83 f8 f2 cmp $0xfffffffffffffff2,%rax
b: 75 08 jne 15 <__times+0x15>
d: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax
13: 77 13 ja 28 <__times+0x28>
15: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
19: ba 00 00 00 00 mov $0x0,%edx
1e: 48 0f 44 c2 cmove %rdx,%rax
22: c3 retq
The incorrect signed extension and 32-bit compare are gone.
[BZ #19363]
* sysdeps/unix/sysv/linux/times.c (INTERNAL_SYSCALL_TIMES_DECL):
New.
(INTERNAL_SYSCALL_TIMES): Likewise.
(INTERNAL_SYSCALL_TIMES_ERROR_P): Likewise.
(INTERNAL_SYSCALL_TIMES_ERRNO): Likewise.
(__times): Replace INTERNAL_SYSCALL* macros with
INTERNAL_SYSCALL_TIMES* macros.
* sysdeps/unix/sysv/linux/x86_64/x32/times.c: New file.
-----------------------------------------------------------------------
--
You are receiving this mail because:
You are on the CC list for the bug.