about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/mips/sysdep.h
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2019-06-04 17:29:42 +0000
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2019-09-17 17:09:26 -0300
commit7c3eed786021ede69394fe371c9e7c8bd603f5a8 (patch)
tree3059e3966fb6230e8bdf2d05337b7958f97d8454 /sysdeps/unix/sysv/linux/mips/sysdep.h
parent986a506481d4edb3b5c50c8245e915e39d248c7d (diff)
downloadglibc-7c3eed786021ede69394fe371c9e7c8bd603f5a8.tar.gz
glibc-7c3eed786021ede69394fe371c9e7c8bd603f5a8.tar.xz
glibc-7c3eed786021ede69394fe371c9e7c8bd603f5a8.zip
mips: Consolidate INTERNAL_VSYSCALL_CALL
This patch consolidates the mips, mips64, and mips64-n32
INTERNAL_VSYSCALL_CALL on a single implementation.

No semantic changes. I checked against a build for mips-linux-gnu,
mips64-linux-gnu, and mips64-n32-linux-gnu.

	* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
	(INTERNAL_VSYSCALL_CALL): Remove.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
	(INTERNAL_VSYSCALL_CALL): Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
	(INTERNAL_VSYSCALL_CALL): Likewise.
	* sysdeps/unix/sysv/linux/mips/sysdep.h (INTERNAL_VSYSCALL_CALL):
	New macro.
Diffstat (limited to 'sysdeps/unix/sysv/linux/mips/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/mips/sysdep.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/mips/sysdep.h b/sysdeps/unix/sysv/linux/mips/sysdep.h
index 5d05c90780..b2045fcc55 100644
--- a/sysdeps/unix/sysv/linux/mips/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/sysdep.h
@@ -22,3 +22,19 @@
 /* List of system calls which are supported as vsyscalls.  */
 #define HAVE_CLOCK_GETTIME_VSYSCALL     "__vdso_gettimeofday"
 #define HAVE_GETTIMEOFDAY_VSYSCALL      "__vdso_clock_gettime"
+
+#ifndef __ASSEMBLER__
+
+/* Standard MIPS syscalls have an error flag, and return a positive errno
+   when the error flag is set. Emulate this behaviour for vsyscalls so that
+   the INTERNAL_SYSCALL_{ERROR_P,ERRNO} macros work correctly.  */
+#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...)		\
+  ({									\
+    long _ret = funcptr (args);						\
+    err = ((unsigned long) (_ret) >= (unsigned long) -4095L);		\
+    if (err)								\
+      _ret = -_ret;							\
+    _ret;								\
+  })
+
+#endif /* __ASSEMBLER__  */