This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] [BZ #19363] Use INTERNAL_SYSCALL_TIMES for Linux times


On Mon, Dec 14, 2015 at 07:27:33PM -0800, H.J. Lu wrote:
> 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, there is mismatch on x32.  times is the
> only such function since there is lseek.S for x32.  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.

Great.  

> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
> new file mode 100644
> index 0000000..c32324f
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
> @@ -0,0 +1,31 @@
> +/* Linux times.  X32 version.
[...]
> +/* Incline Linux times system calls.  */

Please fix spelling issues here.


-- 
ldv

Attachment: pgp7QbUw0L2kv.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]