]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
linux/mips: handle wait status 0x7f specially for WIFSIGNALED and WIFSTOPPED
authorXi Ruoyao <xry111@xry111.site>
Thu, 26 Feb 2026 10:50:53 +0000 (11:50 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 26 Feb 2026 10:50:53 +0000 (11:50 +0100)
MIPS Linux has SIGRTMAX=127, thus the wait status 0x7f means the program
is terminated by SIGRTMAX, not stopped.

This cannot happen on other ports so make a special version of
waitstatus.h for MIPS to avoid adding redundant calculation to others.
I cannot find a way to use status only once in the expression, so use
inline functions instead of macros to avoid double-evaluating status.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
sysdeps/unix/sysv/linux/mips/bits/waitstatus.h [new file with mode: 0644]

diff --git a/sysdeps/unix/sysv/linux/mips/bits/waitstatus.h b/sysdeps/unix/sysv/linux/mips/bits/waitstatus.h
new file mode 100644 (file)
index 0000000..de93815
--- /dev/null
@@ -0,0 +1,68 @@
+/* Definitions of status bits for `wait' et al.
+   MIPS version, based on the generic version (bits/waitstatus.h).
+
+   Copyright (C) 1992-2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#if !defined _SYS_WAIT_H && !defined _STDLIB_H
+# error "Never include <bits/waitstatus.h> directly; use <sys/wait.h> instead."
+#endif
+
+
+/* On MIPS SIGRTMAX is 127, so we need to handle the status code 127
+   which is impossible on other ports.  */
+
+/* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
+#define        __WEXITSTATUS(status)   (((status) & 0xff00) >> 8)
+
+/* If WIFSIGNALED(STATUS), the terminating signal.  */
+#define        __WTERMSIG(status)      ((status) & 0x7f)
+
+/* If WIFSTOPPED(STATUS), the signal that stopped the child.  */
+#define        __WSTOPSIG(status)      __WEXITSTATUS(status)
+
+/* Nonzero if STATUS indicates normal termination.  */
+#define        __WIFEXITED(status)     (__WTERMSIG(status) == 0)
+
+/* Nonzero if STATUS indicates termination by a signal.  */
+static __inline int
+__WIFSIGNALED (int __status)
+{
+  return ((signed char) ((__status & 0x7f) + 1) >> 1) > 0 || __status == 0x7f;
+}
+
+/* Nonzero if STATUS indicates the child is stopped.  */
+static __inline int
+__WIFSTOPPED (int __status)
+{
+  return (__status & 0xff) == 0x7f && __status != 0x7f;
+}
+
+/* Nonzero if STATUS indicates the child continued after a stop.  We only
+   define this if <bits/waitflags.h> provides the WCONTINUED flag bit.  */
+#ifdef WCONTINUED
+# define __WIFCONTINUED(status)        ((status) == __W_CONTINUED)
+#endif
+
+/* Nonzero if STATUS indicates the child dumped core.  */
+#define        __WCOREDUMP(status)     ((status) & __WCOREFLAG)
+
+/* Macros for constructing status values.  */
+#define        __W_EXITCODE(ret, sig)  ((ret) << 8 | (sig))
+#define        __W_STOPCODE(sig)       ((sig) << 8 | 0x7f)
+#define __W_CONTINUED          0xffff
+#define        __WCOREFLAG             0x80