This is the mail archive of the 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]

[Bug time/19363] x32: times() return value wrongly truncates/sign extends from 32bit

--- Comment #6 from cvs-commit at gcc dot <cvs-commit at gcc dot> ---
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/master has been created
        at  e31f1cb4a363db73fe09d99f800907950aec7122 (commit)

- Log -----------------------------------------------------------------;h=e31f1cb4a363db73fe09d99f800907950aec7122

commit e31f1cb4a363db73fe09d99f800907950aec7122
Author: H.J. Lu <>
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
    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*

    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):
        (INTERNAL_SYSCALL_TIMES): Likewise.
        (__times): Replace INTERNAL_SYSCALL* macros with
        * 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.

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