about summary refs log tree commit diff
path: root/sysdeps/ia64/bits/byteswap.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-12-17 11:46:49 -0800
committerH.J. Lu <hjl.tools@gmail.com>2016-01-04 08:15:26 -0800
commit7c1c303f4ffa7eafe704c13d4f4549f007e3075d (patch)
tree62fb5f166334fd3d6140a69b2cb1a77a04b6b119 /sysdeps/ia64/bits/byteswap.h
parent78bd7499af46d739ce94410eaeea006e874ca9e5 (diff)
downloadglibc-hjl/pr19363/2.22.tar.gz
glibc-hjl/pr19363/2.22.tar.xz
glibc-hjl/pr19363/2.22.zip
Provide x32 times hjl/pr19363/2.22
Since times returns 64-bit clock_t on x32, we need to provide x32 times
by redefining INTERNAL_SYSCALL_NCS and INTERNAL_SYSCALL_ERROR_P with
64-bit return type for syscall.  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.  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/x86_64/x32/times.c: New file.
Diffstat (limited to 'sysdeps/ia64/bits/byteswap.h')
0 files changed, 0 insertions, 0 deletions