OSDN Git Service

bionic: fix __set_errno for arm64 syscalls that return a 64-bit value
authorColin Cross <ccross@android.com>
Sat, 15 Feb 2014 02:56:23 +0000 (18:56 -0800)
committerElliott Hughes <enh@google.com>
Tue, 18 Feb 2014 20:11:38 +0000 (12:11 -0800)
commit3d19a8319b9c27af8aa5cfbf495da0fe7fa62d3e
treea51591477e2f6f97ae56ae027d01ca1ff8c302ef
parentd4bc9ef83b36916d5e63c4c3e4a092381473ea52
bionic: fix __set_errno for arm64 syscalls that return a 64-bit value

bionic/libc/arch-arm64/syscalls/read.S ends with:
    b.hi __set_errno
    ret
END(read)

If __set_errno returns int, it will set w0 to 0xFFFFFFFF, which means
x0 is 0x00000000FFFFFFFF.  When interpreted as a ssize_t that is
INT_MAX, not -1.

Change __set_errno to return long, which will cause x0 to be set instead
of w0.

Change-Id: I9f9ea0f2995928d2ea240eb2ff7758ecdf0ff412
libc/bionic/__set_errno.cpp
tests/unistd_test.cpp