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
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index 2308ad9..f7a5afd 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -18,6 +18,7 @@
 #include "ScopedSignalHandler.h"
 #include "TemporaryFile.h"
 
+#include <fcntl.h>
 #include <stdint.h>
 #include <unistd.h>
 
@@ -88,3 +89,25 @@
   ASSERT_EQ(-1, pause());
   ASSERT_TRUE(gPauseTestFlag);
 }
+
+TEST(unistd, read) {
+  int fd = open("/proc/version", O_RDONLY);
+  ASSERT_TRUE(fd != -1);
+
+  char buf[5];
+  ASSERT_EQ(5, read(fd, buf, 5));
+  ASSERT_EQ(buf[0], 'L');
+  ASSERT_EQ(buf[1], 'i');
+  ASSERT_EQ(buf[2], 'n');
+  ASSERT_EQ(buf[3], 'u');
+  ASSERT_EQ(buf[4], 'x');
+  close(fd);
+}
+
+TEST(unistd, read_EBADF) {
+  // read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that
+  // our syscall stubs correctly return a 64-bit -1.
+  char buf[1];
+  ASSERT_EQ(-1, read(-1, buf, sizeof(buf)));
+  ASSERT_EQ(EBADF, errno);
+}