From: Xi Ruoyao Date: Thu, 26 Feb 2026 10:50:53 +0000 (+0100) Subject: linux/mips: handle wait status 0x7f specially for WIFSIGNALED and WIFSTOPPED X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=c19cdbf66ff62a4578ac2117d43ebb306ae36aeb;p=thirdparty%2Fglibc.git linux/mips: handle wait status 0x7f specially for WIFSIGNALED and WIFSTOPPED 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 Reviewed-by: Florian Weimer --- 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..de938153dd --- /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 + . */ + +#if !defined _SYS_WAIT_H && !defined _STDLIB_H +# error "Never include directly; use 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 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