about summary refs log tree commit diff
path: root/stdio-common/stdio_lim.h.in
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-12-14 19:09:13 -0800
committerH.J. Lu <hjl.tools@gmail.com>2015-12-14 20:34:31 -0800
commit8a4f1e5889edc41f97c861af81d0f0354d0bc75a (patch)
treec2d52613c1f72bd6ac14887a261a2b7b350f7198 /stdio-common/stdio_lim.h.in
parenteed3e1eb79bcfa9b52609fd875fa2d522e2d6bce (diff)
downloadglibc-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/stdio_lim.h.in')
0 files changed, 0 insertions, 0 deletions