diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-12-14 19:09:13 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-12-14 20:34:31 -0800 |
commit | 8a4f1e5889edc41f97c861af81d0f0354d0bc75a (patch) | |
tree | c2d52613c1f72bd6ac14887a261a2b7b350f7198 /stdio-common/snprintf.c | |
parent | eed3e1eb79bcfa9b52609fd875fa2d522e2d6bce (diff) | |
download | glibc-8a4f1e5889edc41f97c861af81d0f0354d0bc75a.tar.gz glibc-8a4f1e5889edc41f97c861af81d0f0354d0bc75a.tar.xz glibc-8a4f1e5889edc41f97c861af81d0f0354d0bc75a.zip |
Use INTERNAL_SYSCALL_TIMES for Linux times
The Linux times function, which returns clock_t, is implemented with INTERNAL_SYSCALL. Since INTERNAL_SYSCALL returns 32-bit integer and and clock_t is 64-bit on x32, this is a mismatch on x32. times is the only such function. This patch replaces INTERNAL_SYSCALL in Linux times.c with INTERNAL_SYSCALL_TIMES which is default to INTERNAL_SYSCALL and provides x32 times.c with proper INTERNAL_SYSCALL_TIMES. 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 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 07 jne 14 <__times+0x14> d: 3d 00 f0 ff ff cmp $0xfffff000,%eax 12: 77 14 ja 28 <__times+0x28> 14: 48 83 f8 ff cmp $0xffffffffffffffff,%rax 18: ba 00 00 00 00 mov $0x0,%edx 1d: 48 0f 44 c2 cmove %rdx,%rax 21: c3 retq The incorrect signed extension is gone. [BZ #19363] * sysdeps/unix/sysv/linux/times.c (INTERNAL_SYSCALL_TIMES): New. (__times): Replace INTERNAL_SYSCALL with INTERNAL_SYSCALL_TIMES. * sysdeps/unix/sysv/linux/x86_64/x32/times.c: New file. xxx
Diffstat (limited to 'stdio-common/snprintf.c')
0 files changed, 0 insertions, 0 deletions