  #endif /* defined(__CYGWIN__) */
  
  #if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
-@@ -357,6 +357,22 @@
+@@ -357,6 +440,22 @@
  #endif
  #endif
  

 
 #define SA_NOCLDSTOP 1  /* only value supported now for sa_flags */
 
@@ -124,7 +124,7 @@
 	sigset_t sa_mask;
 	int sa_flags;
 };

diff -Naur ../newlib-2.5.0.20170922/newlib/libc/include/sys/signal.h ./newlib/libc/include/sys/signal.h
--- ../newlib-2.5.0.20170922/newlib/libc/include/sys/signal.h
+++ ./newlib/libc/include/sys/signal.h
@@ -44,16 +44,47 @@
   void  *sival_ptr;    /* Pointer signal value */
 };
 
+#define __SI_MAX_SIZE     128
+#define __SIGEV_MAX_SIZE  64
+#if __WORDSIZE == 64
+#define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
+#define __SIGEV_PAD_SIZE  ((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
+#else
+#define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
+#define __SIGEV_PAD_SIZE  ((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
+#endif
+
+#if __WORDSIZE == 64
+#else
+#endif
+
+#if defined __x86_64__ && __WORDSIZE == 32
+typedef __clock_t __attribute__ ((__aligned__ (4))) __sigchld_clock_t;
+#define __SI_ALIGNMENT __attribute__ ((__aligned__ (8)))
+#else
+typedef __clock_t __sigchld_clock_t;
+#define __SI_ALIGNMENT
+#endif
+
 struct sigevent {
   int              sigev_notify;               /* Notification type */
   int              sigev_signo;                /* Signal number */
   union sigval     sigev_value;                /* Signal value */
 
-#if defined(_POSIX_THREADS)
-  void           (*sigev_notify_function)( union sigval );
-                                               /* Notification function */
-  pthread_attr_t  *sigev_notify_attributes;    /* Notification Attributes */
-#endif
+  union {
+    int _pad[__SIGEV_PAD_SIZE];
+
+    /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
+       thread to receive the signal.  */
+    __pid_t _tid;
+
+    #if defined(_POSIX_THREADS)
+    struct {
+      void (*sigev_notify_function)( union sigval ); /* Notification function */
+      pthread_attr_t  *sigev_notify_attributes;    /* Notification Attributes */
+    } _sigev_thread;
+    #endif
+  } _sigev_un;
 };
 
 /* Signal Actions, P1003.1b-1993, p. 64 */
@@ -69,10 +100,62 @@
   int          si_signo;    /* Signal number */
   int          si_code;     /* Cause of the signal */
   union sigval si_value;    /* Signal value */
-} siginfo_t;
+  union {
+    int _pad[__SI_PAD_SIZE];
+
+    /* kill().  */
+    struct {
+      __pid_t si_pid;  /* Sending process ID.  */
+      __uid_t si_uid;  /* Real user ID of sending process.  */
+    } _kill;
+
+    /* POSIX.1b timers.  */
+    struct {
+      int si_tid;              /* Timer ID.  */
+      int si_overrun;          /* Overrun count.  */
+      union sigval si_sigval;  /* Signal value.  */
+    } _timer;
+
+    /* POSIX.1b signals.  */
+    struct {
+      __pid_t si_pid;          /* Sending process ID.  */
+      __uid_t si_uid;          /* Real user ID of sending process.  */
+      union sigval si_sigval;  /* Signal value.  */
+    } _rt;
+
+    /* SIGCHLD.  */
+    struct {
+      __pid_t si_pid;    /* Which child.  */
+      __uid_t si_uid;    /* Real user ID of sending process.  */
+      int si_status;     /* Exit value or signal.  */
+      __sigchld_clock_t si_utime;
+      __sigchld_clock_t si_stime;
+    } _sigchld;
+
+    /* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
+    struct {
+      void *si_addr;          /* Faulting insn/memory ref.  */
+      short int si_addr_lsb;  /* Valid LSB of the reported address.  */
+    } _sigfault;
+
+    /* SIGPOLL.  */
+    struct {
+      long int si_band;  /* Band event for SIGPOLL.  */
+      int si_fd;
+    } _sigpoll;
+
+    /* SIGSYS.  */
+    struct {
+      void *_call_addr;    /* Calling user insn.  */
+      int _syscall;        /* Triggering system call number.  */
+      unsigned int _arch;  /* AUDIT_ARCH_* of syscall.  */
+    } _sigsys;
+  } _sifields;
+} siginfo_t __SI_ALIGNMENT;
+
 #endif /* defined(_POSIX_REALTIME_SIGNALS) || __POSIX_VISIBLE >= 199309 */
 
-#if defined(__rtems__)
