[PATCH] linux/mips: handle wait status 0x7f specially for WIFSIGNALED and WIFSTOPPED
Xi Ruoyao
xry111@xry111.site
Thu Feb 12 06:42:41 GMT 2026
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>
---
.../unix/sysv/linux/mips/bits/waitstatus.h | 68 +++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 sysdeps/unix/sysv/linux/mips/bits/waitstatus.h
diff --git a/sysdeps/unix/sysv/linux/mips/bits/waitstatus.h b/sysdeps/unix/sysv/linux/mips/bits/waitstatus.h
new file mode 100644
index 0000000000..505af3c4b0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/waitstatus.h
@@ -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
--
2.53.0
More information about the Libc-alpha
mailing list