From c124baaf29a948fd8b93e7f1fefc20b659271026 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Thu, 12 Jul 2012 19:06:15 +0200 Subject: [PATCH] libc: Provide ucontext_t/mcontext_t/ This patch updates the C library headers to provide ucontext_t definitions for three architectures. + Fix to always define 'struct sigcontext'. The new declarations are announced with new macros defined in in order to make it easier to adapt client code that already defines its own, incompatible, versions of the structures seen here. http://code.google.com/p/android/issues/detail?id=34784 Change-Id: Ie78c48690a4ce61c50593f6c39639be7fead3596 --- libc/arch-arm/include/machine/signal.h | 79 +++++++++++++ libc/arch-arm/include/machine/ucontext.h | 170 +++++++++++++++++++++++++++ libc/arch-mips/bionic/_setjmp.S | 2 +- libc/arch-mips/bionic/setjmp.S | 2 +- libc/arch-mips/include/machine/setjmp.h | 58 +++++++++- libc/arch-mips/include/machine/signal.h | 165 ++++++--------------------- libc/arch-mips/include/machine/ucontext.h | 141 +++++++++++++++++++++++ libc/arch-x86/include/machine/signal.h | 67 +++++++++++ libc/arch-x86/include/machine/ucontext.h | 184 ++++++++++++++++++++++++++++++ libc/bionic/pthread.c | 8 +- libc/include/signal.h | 62 +++++++--- libc/include/sys/cdefs.h | 8 ++ libc/include/sys/ucontext.h | 43 +++++++ libc/include/time.h | 5 +- 14 files changed, 836 insertions(+), 158 deletions(-) create mode 100644 libc/arch-arm/include/machine/signal.h create mode 100644 libc/arch-arm/include/machine/ucontext.h create mode 100644 libc/arch-mips/include/machine/ucontext.h create mode 100644 libc/arch-x86/include/machine/signal.h create mode 100644 libc/arch-x86/include/machine/ucontext.h create mode 100644 libc/include/sys/ucontext.h diff --git a/libc/arch-arm/include/machine/signal.h b/libc/arch-arm/include/machine/signal.h new file mode 100644 index 000000000..ead980c80 --- /dev/null +++ b/libc/arch-arm/include/machine/signal.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ARCH_ARM_MACHINE_SIGNAL_H_ +#define _ARCH_ARM_MACHINE_SIGNAL_H_ + +#include +#include +#include + +__BEGIN_DECLS + +/* Include the kernel-specific definitions */ +#include +#include +#include + +#ifdef _ASM_GENERIC_SIGINFO_H +#error "You cannot include before !" +#endif +#define __ARCH_SI_UID_T __kernel_uid32_t +#include +#undef __ARCH_SI_UID_T + +#include + +/* Despite the fact that defines sigset_t as a 32-bit type, + * the ARM kernel *really* expects a 64-bit signal set type during syscalls. + * + * The reason for this is that the kernel headers have a different definition + * for sigset_t depending on the value of the __KERNEL__ macro. When we cleanup + * the headers, before placing them under bionic/libc/kernel/, this macro is + * optimized as undefined, to the 32-bit definition stays. + * + * Ironically, the reason the kernel headers do this is to accomodate old + * versions of GLibc. More recent versions provide complete wrappers for the + * corresponding kernel types so don't have this problem (their sigset_t can + * always hold up to 1024 signals, independent of the platform). + */ +typedef unsigned long __kernel_sigset_t[2]; + +/* _NSIG is used by the SIGRTMAX definition under , however + * its definition is part of a #if __KERNEL__ .. #endif block in the original + * kernel headers and is thus not part of our cleaned-up versions. + * + * Looking at the current kernel sources, it is defined as 64 for ARM. + */ +#ifndef _NSIG +# define _NSIG 64 +#endif + + +__END_DECLS + +#endif /* _ARCH_ARM_MACHINE_SIGNAL_H_ */ diff --git a/libc/arch-arm/include/machine/ucontext.h b/libc/arch-arm/include/machine/ucontext.h new file mode 100644 index 000000000..2d2884c1c --- /dev/null +++ b/libc/arch-arm/include/machine/ucontext.h @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ARCH_ARM_SYS_UCONTEXT_H_ +#define _ARCH_ARM_SYS_UCONTEXT_H_ + +#include +#include +#include +#include + +__BEGIN_DECLS + +/* Technical note: + * + * There are similarities and differences in the way GLibc and the ARM Linux + * kernel declare ucontext_t. Here are the details: + * + * - Both declare mcontext_t as a typedef for 'struct sigcontext'. This goes + * against the GLibc convention of providing a custom mcontext_t declaration + * for all other platforms. + * + * One notable difference on ARM is that to access register values, one + * has to use named fields like "arm_r0", "arm_sp", "arm_pc". + * + * On other platforms, GLibc mcontext_t provides a gregs[] array of + * 32-bit values to access the value of core registers instead. Plus + * some helper enums + macros to index it (e.g. REG_EBP on i386). + * + * Note that some client code, when ported to Android, provide custom + * mcontext_t declaration that use the gregs[] convention. For the sake + * of portability, this header follows the ARM GLibc convention of using + * explicit field names. This means that such client code will need to be + * adapted. Possibly by checking against __BIONIC_HAVE_UCONTEXT_T defined + * in + * + * - On ARM, the floating-point state is not stored in mcontext_t. + * Instead, it is stored in the ucontext_t structure, in the '_uc_regspace' + * field at the end, but both the Kernel and GLibc use a different + * convention for exact layout: + * + * * The state saved by the kernel (which would be accessible from the + * ucontext_t received from a SA_SIGINGO handler) has a layout that + * depends on the exact kernel configuration. For more details see + * the "struct aux_sigframe" declaration in the kernel's ucontext.h + * which defines the format. It is *not* exposed by this header. + * + * * The FP state saved by GLibc's getcontext()/setcontext() functions + * uses a different custom storage scheme that depends on the reported + * ELF HWCAPs. If VFP is enabled, only registers d8-d15 are saved to + * the storage space, in addition to some status/exception registers. + * This is not surprising because d0-d7 are callee-saved in the + * ARM EABI. + * + * It also looks like this implementation cannot handle VFPv3-D32/NEON + * by saving/restoring the state of d16-d31 available on these CPUs. + * + * Note that client code that needs to access the FP state typically + * does so through ptrace() using the special PTRACE_GETVFPREGS op. + * This is what gdbserver and debuggerd use to extract that information. + * + * In conclusion, there is no reliable way to extract the FP state from + * a ucontext_t on ARM. + * + * - The ARM GLibc ucontext.h defines a 'struct _libc_fpstate' structure + * that is never used by GLibc source code, and which doesn't seem to + * match either the kernel of getcontext/setcontext() layout. + * + * It was introduced by the following patch, reason is unclear but may be + * related to the GLibc test suite: + * + * http://www.cygwin.com/ml/libc-ports/2011-12/msg00032.html + * + * This header does *not* define this type, or fpregset_t either. + * + * Reference source files: + * $KERNEL/arch/arm/include/asm/fpstate.h + * $KERNEL/arch/arm/include/asm/sigcontext.h + * $KERNEL/arch/arm/include/asm/ucontext.h + * $KERNEL/arch/arm/include/asm/user.h + * + * $GLIBC/ports/sysdeps/unix/sysv/linux/arm/getcontext.S + * $GLIBC/ports/sysdeps/unix/sysv/linux/arm/setcontext.S + * $GLIBC/ports/sysdeps/unix/sysv/linux/arm/sys/ucontext.h + */ + +/* First, the kernel-compatible version, for reference. */ +typedef struct __kernel_ucontext { + unsigned long uc_flags; + struct __kernel_ucontext* uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + __kernel_sigset_t uc_sigmask; + /* The kernel reserves 1024 bits for the signal mask, even if it only + * uses the first 64 ones. */ + int _unused[32 - (sizeof(__kernel_sigset_t) / sizeof(int))]; + /* Used to store coprocessor + VFP register state on ARMv7-A */ + unsigned long uc_regspace[128] __attribute__((__aligned__(8))); +} __kernel_ucontext_t; + +/* Second, the GLibc-compatible version */ + +/* On ARM, GLibc mcontext_t is a simple typedef to 'struct sigcontext', + * just like the kernel does. This means that to access register values, + * you will need to use the specific named field (e.g. 'arm_r0', 'arm_pc'). + * + * Note that on all other platforms, GLibc uses a gregs[] array instead. + * Follow the GLibc logic, or lack of, for ease of portability. + * + * Curiously, GLibc also defines enums and macros for REG_R0 .. REG_R15, + * plus the gregset_t type, NREGS macro, fpregset_t types, etc.. while they + * are never used by any code. They are *not* declared here. + * + * This also means there is no 'official' or 'documented' way to access + * the state of the FP registers (while the GLibc implementation does + * save/restore them in getcontext()/swapcontext()). + */ +typedef struct sigcontext mcontext_t; + +/* Technical note: + * + * GLibc defines an ARM-specific 'struct _libc_fpstate' that seems to match + * the FPU state stored in uc_regspace[] below. However, its declaration does + * not match either the kernel declaration, or the actual GLibc + * implementation of *context() functions. + * + * It is suspected that this is a remnant of the obsolete VFPv1 era that + * was never updated. As such, client code shall *not* rely on this and + * there is no definition for it provided here. + */ + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + /* Only expose the 32 non-realtime signals in Bionic's 32-bit sigset_t + * The _unused field is required padding from the kernel. */ + sigset_t uc_sigmask; + int _unused[32 - sizeof(sigset_t)/sizeof(int)]; + uint32_t uc_regspace[128] __attribute__((__aligned__(8))); +} ucontext_t; + +__END_DECLS + +#endif /* _ARCH_ARM_SYS_UCONTEXT_H_ */ diff --git a/libc/arch-mips/bionic/_setjmp.S b/libc/arch-mips/bionic/_setjmp.S index e7083ae29..42a5aed27 100644 --- a/libc/arch-mips/bionic/_setjmp.S +++ b/libc/arch-mips/bionic/_setjmp.S @@ -31,7 +31,7 @@ #include #include -#include +#include /* * _setjmp, _longjmp (not restoring signal state) diff --git a/libc/arch-mips/bionic/setjmp.S b/libc/arch-mips/bionic/setjmp.S index 7c21195b6..0b1538c42 100644 --- a/libc/arch-mips/bionic/setjmp.S +++ b/libc/arch-mips/bionic/setjmp.S @@ -31,7 +31,7 @@ #include #include -#include +#include /* * setjmp, longjmp implementation for libc. this code depends diff --git a/libc/arch-mips/include/machine/setjmp.h b/libc/arch-mips/include/machine/setjmp.h index 55ba7bebb..0237002b4 100644 --- a/libc/arch-mips/include/machine/setjmp.h +++ b/libc/arch-mips/include/machine/setjmp.h @@ -1,10 +1,56 @@ -/* $OpenBSD: setjmp.h,v 1.2 2004/08/10 21:10:56 pefo Exp $ */ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ -/* Public domain */ +#ifndef _ARCH_MIPS_MACHINE_SETJMP_H_ +#define _ARCH_MIPS_MACHINE_SETJMP_H_ -#ifndef _MIPS_SETJMP_H_ -#define _MIPS_SETJMP_H_ +#define _JBLEN 157 /* size, in longs, of a jmp_buf */ -#define _JBLEN 157 /* size, in longs, of a jmp_buf */ +#define SC_REGMASK (0*REGSZ) +#define SC_STATUS (1*REGSZ) +#define SC_PC (2*REGSZ) +#define SC_REGS (SC_PC+8) +#define SC_FPREGS (SC_REGS+32*8) +#define SC_ACX (SC_FPREGS+32*REGSZ_FP) +#define SC_FPC_CSR (SC_ACX+1*REGSZ) +#define SC_FPC_EIR (SC_ACX+2*REGSZ) +#define SC_USED_MATH (SC_ACX+3*REGSZ) +#define SC_DSP (SC_ACX+4*REGSZ) +#define SC_MDHI (SC_ACX+5*REGSZ) +#define SC_MDLO (SC_MDHI+8) +#define SC_HI1 (SC_MDLO+8) +#define SC_LO1 (SC_HI1+1*REGSZ) +#define SC_HI2 (SC_HI1+2*REGSZ) +#define SC_LO2 (SC_HI1+3*REGSZ) +#define SC_HI3 (SC_HI1+4*REGSZ) +#define SC_LO3 (SC_HI1+5*REGSZ) +/* OpenBSD compatibility */ +#define SC_MASK SC_REGMASK +#define SC_FPUSED SC_USED_MATH -#endif /* !_MIPS_SETJMP_H_ */ +#endif /* !_ARCH_MIPS_INCLUDE_MACHINE_SETJMP_H_ */ diff --git a/libc/arch-mips/include/machine/signal.h b/libc/arch-mips/include/machine/signal.h index 4efb856f0..6378c61ed 100644 --- a/libc/arch-mips/include/machine/signal.h +++ b/libc/arch-mips/include/machine/signal.h @@ -1,147 +1,58 @@ -/* $OpenBSD: signal.h,v 1.8 2006/01/09 18:18:37 millert Exp $ */ - /* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - * 1. Redistributions of source code must retain the above copyright + * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * @(#)signal.h 8.1 (Berkeley) 6/10/93 */ - -#ifndef _MIPS_SIGNAL_H_ -#define _MIPS_SIGNAL_H_ +#ifndef _ARCH_MIPS_MACHINE_SIGNAL_H_ +#define _ARCH_MIPS_MACHINE_SIGNAL_H_ #include -#if !defined(__LANGUAGE_ASSEMBLY) -#include - -/* - * Machine-dependent signal definitions - */ -typedef int sig_atomic_t; - -#if __BSD_VISIBLE || __XPG_VISIBLE >= 420 - -/* - * Information pushed on stack when a signal is delivered. - * This is used by the kernel to restore state following - * execution of the signal handler. It is also made available - * to the handler to allow it to restore state properly if - * a non-standard exit is performed. - */ - -#if defined(__ANDROID__) - -/* - * The Linux and OpenBSD sigcontext structures are slightly different - * This is the Linux O32 ABI compatible sigcontext - */ - -struct sigcontext { - unsigned int sc_regmask; - unsigned int sc_status; - unsigned long long sc_pc; - unsigned long long sc_regs[32]; - unsigned long long sc_fpregs[32]; - unsigned int sc_acx; - unsigned int sc_fpc_csr; - unsigned int sc_fpc_eir; - unsigned int sc_used_math; - unsigned int sc_dsp; - unsigned long long sc_mdhi; - unsigned long long sc_mdlo; - unsigned long sc_hi1; - unsigned long sc_lo1; - unsigned long sc_hi2; - unsigned long sc_lo2; - unsigned long sc_hi3; - unsigned long sc_lo3; -}; +__BEGIN_DECLS -#else +#include +#include -struct sigcontext { - long sc_onstack; /* sigstack state to restore */ - long sc_mask; /* signal mask to restore */ - __register_t sc_pc; /* pc at time of signal */ - __register_t sc_regs[32]; /* processor regs 0 to 31 */ - __register_t mullo; /* mullo and mulhi registers... */ - __register_t mulhi; /* mullo and mulhi registers... */ - f_register_t sc_fpregs[33]; /* fp regs 0 to 31 and csr */ - long sc_fpused; /* fp has been used */ - long sc_fpc_eir; /* floating point exception instruction reg */ - long xxx[8]; /* XXX reserved */ -}; +#ifdef _ASM_GENERIC_SIGINFO_H +#error "You cannot include before !" #endif -#endif /* __BSD_VISIBLE || __XPG_VISIBLE >= 420 */ - -#else /* __LANGUAGE_ASSEMBLY */ - -#ifdef __ANDROID__ +#define __ARCH_SI_UID_T __kernel_uid32_t +#include +#undef __ARCH_SI_UID_T -#define SC_REGMASK (0*REGSZ) -#define SC_STATUS (1*REGSZ) -#define SC_PC (2*REGSZ) -#define SC_REGS (SC_PC+8) -#define SC_FPREGS (SC_REGS+32*8) -#define SC_ACX (SC_FPREGS+32*REGSZ_FP) -#define SC_FPC_CSR (SC_ACX+1*REGSZ) -#define SC_FPC_EIR (SC_ACX+2*REGSZ) -#define SC_USED_MATH (SC_ACX+3*REGSZ) -#define SC_DSP (SC_ACX+4*REGSZ) -#define SC_MDHI (SC_ACX+5*REGSZ) -#define SC_MDLO (SC_MDHI+8) -#define SC_HI1 (SC_MDLO+8) -#define SC_LO1 (SC_HI1+1*REGSZ) -#define SC_HI2 (SC_HI1+2*REGSZ) -#define SC_LO2 (SC_HI1+3*REGSZ) -#define SC_HI3 (SC_HI1+4*REGSZ) -#define SC_LO3 (SC_HI1+5*REGSZ) -/* OpenBSD compatibility */ -#define SC_MASK SC_REGMASK -#define SC_FPUSED SC_USED_MATH +#include -#else - -#define SC_ONSTACK (0 * REGSZ) -#define SC_MASK (1 * REGSZ) -#define SC_PC (2 * REGSZ) -#define SC_REGS (3 * REGSZ) -#define SC_MULLO (35 * REGSZ) -#define SC_MULHI (36 * REGSZ) -#define SC_FPREGS (37 * REGSZ) -#define SC_FPUSED (70 * REGSZ) -#define SC_FPC_EIR (71 * REGSZ) +/* See comment in arch-arm/include/machine/signal.h. + * The MIPS kernel also uses 128-bit signal masks while defining sigset-t + * as a 32-bit type. + */ +typedef unsigned long __kernel_sigset_t[4]; -#endif /* __ANDROID__ */ +/* Note: Unlike ARM and x86, the MIPS properly defines _NSIG + * and thus SIGRTMAX. */ -#endif /* __LANGUAGE_ASSEMBLY */ +__END_DECLS -#endif /* !_MIPS_SIGNAL_H_ */ +#endif /* _ARCH_MIPS_MACHINE_SIGNAL_H_ */ diff --git a/libc/arch-mips/include/machine/ucontext.h b/libc/arch-mips/include/machine/ucontext.h new file mode 100644 index 000000000..df3b64b7c --- /dev/null +++ b/libc/arch-mips/include/machine/ucontext.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ARCH_MIPS_SYS_UCONTEXT_H_ +#define _ARCH_MIPS_SYS_UCONTEXT_H_ + +#include +#include + +__BEGIN_DECLS + +/* Technical note: + * + * On MIPS, there are differences in the way GLibc and the Linux kernel declare + * ucontext_t: + * + * - The kernel implements 'uc_mcontext' with a 'struct sigcontext', + * while GLibc defines 'mcontext_t' in a binary-compatible way + * (same size, same binary layout), but with different field naming/access + * convention. + * + * The biggest difference is the naming of the fields. The kernel uses + * a 'sc_' prefix (e.g. "sc_gregs[]"), while GLibc does not ("gregs[]"). + * + * For maximum portability of existing client code, this header follows + * the GLibc convention. Client code, and the C library, should never + * try to include + * + * Apart from that, all floating point state is stored in uc_mcontext + * in the same way, which is much simpler than ARM and x86 schemes for it. + * As such, there is no _libc_fpstate. + * + * Reference source files: + * $KERNEL/arch/mips/include/asm/sigcontext.h + * $KERNEL/arch/mips/include/asm/ucontext.h + * + * $GLIBC/sysdeps/unix/sysv/linux/mips/getcontext.S + * $GLIBC/sysdeps/unix/sysv/linux/mips/setcontext.S + * $GLIBC/sysdeps/unix/sysv/linux/mips/sys/ucontext.h + */ + +/* First, the kernel-compatible version, for reference. */ +typedef struct __kernel_ucontext { + unsigned long uc_flags; + struct __kernel_ucontext* uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + __kernel_sigset_t uc_sigmask; +} __kernel_ucontext_t; + +/* Second, the GLibc-compatible version */ + +__extension__ /* Required to build in ANSI C mode */ +typedef unsigned long long greg_t; + +#define NGREG 32 +#define NFPREG 32 + +typedef greg_t gregset_t[NGREG]; + +typedef struct fpregset { + union { + double fp_dregs[NFPREG]; + struct { + float _fp_fregs; + unsigned _fp_pad; + } fp_fregs[NFPREG]; + } fp_r; +} fpregset_t; + +#ifndef _MIPS_SIM +#error "_MIPS_SIM should be defined by your Android MIPS toolchain!" +#endif + +#ifndef _OABI32 +#error "_OABI32 should be defined by your Android MIPS toolchain!" +#endif + +#if _MIPS_SIM != _OABI32 +#error "Only _OABI32 is supported on Android MIPS!" +#endif + +typedef struct { + unsigned regmask; + unsigned status; + greg_t pc; + gregset_t gregs; + fpregset_t fpregs; + unsigned fp_owned; + unsigned fpc_csr; + unsigned fpc_eir; + unsigned used_math; + unsigned dsp; + greg_t mdhi; + greg_t mdlo; + unsigned hi1; + unsigned lo1; + unsigned hi2; + unsigned lo2; + unsigned hi3; + unsigned lo3; +} mcontext_t; + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + /* Only expose the signals in Bionic's 32-bit sigset_t. + * The _unused field is required padding from the kernel. */ + sigset_t uc_sigmask; + char _unused[sizeof(__kernel_sigset_t) - sizeof(sigset_t)]; +} ucontext_t; + +__END_DECLS + +#endif /* _ARCH_MIPS_SYS_UCONTEXT_H_ */ diff --git a/libc/arch-x86/include/machine/signal.h b/libc/arch-x86/include/machine/signal.h new file mode 100644 index 000000000..ba3fe37a9 --- /dev/null +++ b/libc/arch-x86/include/machine/signal.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ARCH_X86_MACHINE_SIGNAL_H_ +#define _ARCH_X86_MACHINE_SIGNAL_H_ + +#include +#include +#include + +__BEGIN_DECLS + +#include +#include + +#ifdef _ASM_GENERIC_SIGINFO_H +#error "You cannot include before !" +#endif +#define __ARCH_SI_UID_T __kernel_uid32_t +#include +#undef __ARCH_SI_UID_T + +#include + +/* See comment in arch-arm/include/machine/signal.h. + * The x86 kernel also uses 64-bit signal masks while defining sigset-t + * as a 32-bit type. + */ +typedef unsigned long __kernel_sigset_t[2]; + +/* _NSIG is used by the SIGRTMAX definition under , however + * its definition is part of a #if __KERNEL__ .. #endif block in the original + * kernel headers and is thus not part of our cleaned-up versions. + * + * Looking at the current kernel sources, it is defined as 64 for x86. + */ +#ifndef _NSIG +# define _NSIG 64 +#endif + +__END_DECLS + +#endif /* _ARCH_X86_MACHINE_SIGNAL_H_ */ diff --git a/libc/arch-x86/include/machine/ucontext.h b/libc/arch-x86/include/machine/ucontext.h new file mode 100644 index 000000000..da226c99b --- /dev/null +++ b/libc/arch-x86/include/machine/ucontext.h @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ARCH_X86_SYS_UCONTEXT_H_ +#define _ARCH_X86_SYS_UCONTEXT_H_ + +#include +#include + +__BEGIN_DECLS + +/* Technical note: + * + * On x86, there are differences in the way GLibc and the Linux kernel declare + * ucontext_t. Here are the details (they differ from ARM significantly): + * + * - The kernel implements 'uc_mcontext' with a 'struct sigcontext', + * while GLibc defines 'mcontext_t' in a binary-compatible way + * (same size, same binary layout), but with different field naming/access + * conventions. + * + * The biggest difference is that 'struct sigcontext' requires named fields + * like "eax", or "ebp" to access the state of register values, while GLibc + * provides an array (gregs[]) of 32-bit values, that can be accessed + * through indexing, plus some enum/macros like REG_EAX or REG_ESP to get + * to specific register values. + * + * For maximum portability of existing client code, this header follows + * the GLibc convention. Client code, and the C library, should never + * try to include + * + * - The floating-point state is not stored in the mcontext_t. For historical + * reasons, the 'fpregs' field of 'mcontext_t' is really a pointer to a + * different block of memory. More specifically: + * + * * When passed to a signal handler, the pointer points to some memory + * on the signal stack, populated by the kernel before calling the + * handler in user space. + * + * * In GLibc's getcontext()/setcontext() implementation, the pointer will + * point to the ucontext_t structure (more specifically the __fpregs_mem + * field after uc_sigmask). + * + * * Note that in both cases, the pointer can be NULL if no floating-point + * operation has been performed on the current thread yet. + * + * - The 'struct _libc_fpstate' structure declared by GLibc corresponds to + * both the FP state managed by getcontext()/setcontext(), and the start + * of the FP state stored by the kernel and passed to a signal handler. + * + * This matches the data saved by the FNSTENV IA-32 instruction. + * + * IMPORTANT: GLibc does not save the MMX/SSE state, i.e. it does not use + * FXSAVE / FXRSTOR instructions in *context() functions. + * + * It is used by client code to retrieve the state of the FPU registers + * (e.g. Google Breakpad does that). + * + * Reference source files: + * $KERNEL/arch/x86/include/asm/sigcontext_32.h + * $KERNEL/arch/x86/include/asm/sigcontext.h + * $KERNEL/arch/x86/include/asm/ucontext.h + * + * $GLIBC/sysdeps/unix/sysv/linux/i386/getcontext.S + * $GLIBC/sysdeps/unix/sysv/linux/i386/setcontext.S + * $GLIBC/sysdeps/unix/sysv/linux/x86/sys/ucontext.h + */ + +/* First, the kernel-compatible version, for reference. */ +typedef struct __kernel_ucontext { + unsigned long uc_flags; + struct __kernel_ucontext* uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + __kernel_sigset_t uc_sigmask; +} __kernel_ucontext_t; + +/* Second, the GLibc-compatible version */ + +#define NGREG 19 +typedef int greg_t; +typedef greg_t gregset_t[NGREG]; + +enum { + REG_GS = 0, REG_FS, REG_ES, REG_DS, + REG_EDI, REG_ESI, REG_EBP, REG_ESP, + REG_EBX, REG_EDX, REG_ECX, REG_EAX, + REG_TRAPNO, REG_ERR, REG_EIP, REG_CS, + REG_EFL, REG_UESP, REG_SS +}; + +/* GLibc defines both macros and enums. Probably to let client do + * #ifdef REG_XXXX ... #endif. Do the same here. */ +#define REG_GS REG_GS +#define REG_FS REG_FS +#define REG_ES REG_ES +#define REG_DS REG_DS + +#define REG_EDI REG_EDI +#define REG_ESI REG_ESI +#define REG_EBP REG_EBP +#define REG_ESP REG_ESP + +#define REG_EBX REG_EBX +#define REG_EDX REG_EDX +#define REG_ECX REG_ECX +#define REG_EAX REG_EAX + +#define REG_TRAPNO REG_TRAPNO +#define REG_ERR REG_ERR +#define REG_EIP REG_EIP +#define REG_CS REG_CS +#define REG_EFL REG_EFL +#define REG_UESP REG_UESP +#define REG_SS REG_SS + +/* 80-bit floating-point register */ +struct _libc_fpreg { + unsigned short significand[4]; + unsigned short exponent; +}; + +/* Simple floating-point state, see FNSTENV instruction */ +struct _libc_fpstate { + unsigned long cw; + unsigned long sw; + unsigned long tag; + unsigned long ipoff; + unsigned long cssel; + unsigned long dataoff; + unsigned long datasel; + struct _libc_fpreg _st[8]; + unsigned long status; +}; + +typedef struct _libc_fpstate* fpregset_t; + +typedef struct { + gregset_t gregs; + fpregset_t fpregs; /* Really a pointer to _libc_fpstate! */ +} mcontext_t; + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + /* Only expose the 32 non-realtime signals in Bionic's 32-bit sigset_t + * The _unused field is required padding from the kernel. */ + sigset_t uc_sigmask; + char _unused[sizeof(__kernel_sigset_t) - sizeof(sigset_t)]; + /* Storage area for *context() functions only - private, don't use. */ + struct _libc_fpstate __fpregs_mem; + /* Growth opportunity - in case we want to save MMX/SSE stuff there too */ + int _unused2[128 - sizeof(struct _libc_fpstate)/sizeof(int)]; +} ucontext_t; + +__END_DECLS + +#endif /* _ARCH_X86_SYS_UCONTEXT_H_ */ diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c index da3a55152..a6c19087d 100644 --- a/libc/bionic/pthread.c +++ b/libc/bionic/pthread.c @@ -2106,8 +2106,8 @@ int pthread_kill(pthread_t tid, int sig) * the C library ABI, so perform a little runtime translation here. */ typedef union { - sigset_t bionic; - uint32_t kernel[2]; + sigset_t bionic; + __kernel_sigset_t kernel; } kernel_sigset_t; /* this is a private syscall stub */ @@ -2124,8 +2124,8 @@ int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) kernel_sigset_t in_set, *in_set_ptr; kernel_sigset_t out_set; - in_set.kernel[0] = in_set.kernel[1] = 0; - out_set.kernel[0] = out_set.kernel[1] = 0; + memset(&in_set.kernel, 0, sizeof(in_set.kernel)); + memset(&out_set.kernel, 0, sizeof(out_set.kernel)); /* 'in_set_ptr' is the second parameter to __rt_sigprocmask. It must be NULL * if 'set' is NULL to ensure correct semantics (which in this case would diff --git a/libc/include/signal.h b/libc/include/signal.h index 6432c189b..bcb58c265 100644 --- a/libc/include/signal.h +++ b/libc/include/signal.h @@ -29,29 +29,61 @@ #define _SIGNAL_H_ #include -#include /* For LONG_BIT */ -#include /* For memset() */ #include -#include +#include +#include -#define __ARCH_SI_UID_T __kernel_uid32_t -#include -#undef __ARCH_SI_UID_T +#include /* For LONG_BIT */ +#include /* For memset() */ __BEGIN_DECLS -typedef int sig_atomic_t; +/* Previous versions of didn't define 'struct sigcontext'. This + * has led client code to redefine the structure, sometimes in a custom and + * incompatible way. + * + * The __BIONIC_HAVE_STRUCT_SIGCONTEXT macro is defined in + * to indicate that does indeed define the structure. For + * maximum source compatibility, client code should follow these guidelines: + * + * - If client code is guaranteed to build against a recent NDK/platform + * version, just include as usual, and use the + * 'struct sigcontext'. + * + * - If client code wants to build against older NDK/platform versions, + * and only uses 'struct sigcontext' without accessing _any_ + * of its fields, just always include on Android + * to ensure maximum portability (i.e. to old platform/NDK releases). + * As in: + * + * #include + * #ifdef __BIONIC__ + * #include + * #endif + * + * - Otherwise, if the client has a custom sigcontext definition and wants to + * keep it to minimize source changes, use a macro trick as below to avoid + * naming conflicts: + * + * #include + * #ifdef __BIONIC__ + * # include + * # ifdef __BIONIC_HAVE_STRUCT_SIGCONTEXT + * # undef sigcontext + * # define sigcontext my_custom_sigcontext + * # endif + * #endif + */ -/* _NSIG is used by the SIGRTMAX definition under , however - * its definition is part of a #if __KERNEL__ .. #endif block in the original - * kernel headers and is thus not part of our cleaned-up versions. +/* Similarly, previous versions of the C library didn't define ucontext_t + * and mcontext_t in , or . Client code can check + * against the macro __BIONIC_HAVE_UCONTEXT_T to determine if it does. * - * Looking at the current kernel sources, it is defined as 64 for all - * architectures except for the 'mips' one which set it to 128. + * Beware, that does _not_ mean that and related functions are + * available. */ -#ifndef _NSIG -# define _NSIG 64 -#endif + +typedef int sig_atomic_t; extern const char * const sys_siglist[]; extern const char * const sys_signame[]; diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h index ca81cb666..6bae25c9e 100644 --- a/libc/include/sys/cdefs.h +++ b/libc/include/sys/cdefs.h @@ -510,4 +510,12 @@ #define __BIONIC_FORTIFY_UNKNOWN_SIZE ((size_t) -1) #endif +/* Indicates to client code that now defines 'struct sigcontext' + * properly. See comments in */ +#define __BIONIC_HAVE_STRUCT_SIGCONTEXT 1 + +/* Indicates to client code that now defines 'ucontext_t' */ +/* NOTE: That does not mean that is available! */ +#define __BIONIC_HAVE_UCONTEXT_T 1 + #endif /* !_SYS_CDEFS_H_ */ diff --git a/libc/include/sys/ucontext.h b/libc/include/sys/ucontext.h new file mode 100644 index 000000000..8c7b3d7e7 --- /dev/null +++ b/libc/include/sys/ucontext.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _SYS_UCONTEXT_H_ +#define _SYS_UCONTEXT_H_ + +/* While not standard, this header is typically provided by GLibc and the + * BSD C library to provide for the definition of ucontext_t and mcontext_t, + * without the declarations of the deprecated *context() functions in + * . + * + * Client code that directly includes this file exists. Note that + * the better, POSIX-compliant, way to get these declarations is to include + * . + */ + +#include + +#endif /* _SYS_UCONTEXT_H_ */ diff --git a/libc/include/time.h b/libc/include/time.h index e280e0af1..f65ac4e7c 100644 --- a/libc/include/time.h +++ b/libc/include/time.h @@ -30,10 +30,7 @@ #include #include - -#define __ARCH_SI_UID_T __kernel_uid32_t -#include -#undef __ARCH_SI_UID_T +#include /* for struct sigevent */ __BEGIN_DECLS -- 2.11.0