Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:21

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  *  @file
0005  *
0006  *  @brief POSIX Signals Manager Initialization
0007  *  @ingroup POSIX_SIGNALS
0008  */
0009 
0010 /*
0011  *  COPYRIGHT (c) 1989-2008.
0012  *  On-Line Applications Research Corporation (OAR).
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions
0016  * are met:
0017  * 1. Redistributions of source code must retain the above copyright
0018  *    notice, this list of conditions and the following disclaimer.
0019  * 2. Redistributions in binary form must reproduce the above copyright
0020  *    notice, this list of conditions and the following disclaimer in the
0021  *    documentation and/or other materials provided with the distribution.
0022  *
0023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0024  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0026  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0027  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0028  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0029  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0030  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0031  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0032  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0033  * POSSIBILITY OF SUCH DAMAGE.
0034  */
0035 
0036 #ifdef HAVE_CONFIG_H
0037 #include "config.h"
0038 #endif
0039 
0040 #include <errno.h>
0041 #include <signal.h>
0042 #include <string.h>
0043 #include <stdlib.h>
0044 
0045 #include <rtems/score/isrlevel.h>
0046 #include <rtems/score/threadimpl.h>
0047 #include <rtems/score/threadqimpl.h>
0048 #include <rtems/score/watchdogimpl.h>
0049 #include <rtems/posix/threadsup.h>
0050 #include <rtems/posix/psignalimpl.h>
0051 #include <rtems/posix/pthreadimpl.h>
0052 #include <rtems/config.h>
0053 #include <rtems/sysinit.h>
0054 
0055 /*
0056  *  Ensure we have the same number of vectors and default vector entries
0057  */
0058 RTEMS_STATIC_ASSERT(
0059   sizeof( _POSIX_signals_Vectors ) == sizeof( _POSIX_signals_Default_vectors ),
0060   posix_signals_vectors
0061 );
0062 
0063 /*** PROCESS WIDE STUFF ****/
0064 
0065 sigset_t  _POSIX_signals_Pending;
0066 
0067 void _POSIX_signals_Abnormal_termination_handler(
0068   int signo RTEMS_UNUSED )
0069 {
0070   exit( 1 );
0071 }
0072 
0073 #define SIG_ARRAY_MAX  (SIGRTMAX + 1)
0074 const struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
0075   /* NO SIGNAL 0 */  SIGACTION_IGNORE,
0076   /* SIGHUP    1 */  SIGACTION_TERMINATE,
0077   /* SIGINT    2 */  SIGACTION_TERMINATE,
0078   /* SIGQUIT   3 */  SIGACTION_TERMINATE,
0079   /* SIGILL    4 */  SIGACTION_TERMINATE,
0080   /* SIGTRAP   5 */  SIGACTION_TERMINATE,
0081   /* SIGIOT    6 */  SIGACTION_TERMINATE,
0082   /* SIGABRT   6     SIGACTION_TERMINATE, -- alias for SIGIOT */
0083   /* SIGEMT    7 */  SIGACTION_TERMINATE,
0084   /* SIGFPE    8 */  SIGACTION_TERMINATE,
0085   /* SIGKILL   9 */  SIGACTION_TERMINATE,
0086   /* SIGBUS   10 */  SIGACTION_TERMINATE,
0087   /* SIGSEGV  11 */  SIGACTION_TERMINATE,
0088   /* SIGSYS   12 */  SIGACTION_TERMINATE,
0089   /* SIGPIPE  13 */  SIGACTION_TERMINATE,
0090   /* SIGALRM  14 */  SIGACTION_TERMINATE,
0091   /* SIGTERM  15 */  SIGACTION_TERMINATE,
0092   /* SIGURG   16 */  SIGACTION_TERMINATE,
0093   /* SIGSTOP  17 */  SIGACTION_TERMINATE,
0094   /* SIGTSTP  18 */  SIGACTION_TERMINATE,
0095   /* SIGCONT  19 */  SIGACTION_TERMINATE,
0096   /* SIGCHLD  20 */  SIGACTION_TERMINATE,
0097   /* SIGTTIN  21 */  SIGACTION_TERMINATE,
0098   /* SIGTTOU  22 */  SIGACTION_TERMINATE,
0099   /* SIGIO    23 */  SIGACTION_TERMINATE,
0100   /* SIGWINCH 24 */  SIGACTION_TERMINATE,
0101   /* SIGUSR1  25 */  SIGACTION_TERMINATE,
0102   /* SIGUSR2  26 */  SIGACTION_TERMINATE,
0103   /* SIGRT    27 */  SIGACTION_TERMINATE,
0104   /* SIGRT    28 */  SIGACTION_TERMINATE,
0105   /* SIGRT    29 */  SIGACTION_TERMINATE,
0106   /* SIGRT    30 */  SIGACTION_TERMINATE,
0107   /* SIGRTMAX 31 */  SIGACTION_TERMINATE
0108 };
0109 
0110 struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];
0111 
0112 Thread_queue_Control _POSIX_signals_Wait_queue =
0113   THREAD_QUEUE_INITIALIZER( "POSIX Signals" );
0114 
0115 Chain_Control _POSIX_signals_Inactive_siginfo;
0116 Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];
0117 
0118 static void _POSIX_signals_Manager_Initialization(void)
0119 {
0120   uint32_t signo;
0121 
0122   memcpy(
0123     _POSIX_signals_Vectors,
0124     _POSIX_signals_Default_vectors,
0125     sizeof( _POSIX_signals_Vectors )
0126   );
0127 
0128   /*
0129    *  Initialize the set of pending signals for the entire process
0130    */
0131   sigemptyset( &_POSIX_signals_Pending );
0132 
0133   /* XXX status codes */
0134 
0135   /*
0136    *  Allocate the siginfo pools.
0137    */
0138   for ( signo=1 ; signo<= SIGRTMAX ; signo++ ) {
0139     _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
0140   }
0141 
0142   _Chain_Initialize(
0143     &_POSIX_signals_Inactive_siginfo,
0144     &_POSIX_signals_Siginfo_nodes[ 0 ],
0145     _POSIX_signals_Maximum_queued_signals,
0146     sizeof( _POSIX_signals_Siginfo_nodes[ 0 ] )
0147   );
0148 }
0149 
0150 RTEMS_SYSINIT_ITEM(
0151   _POSIX_signals_Manager_Initialization,
0152   RTEMS_SYSINIT_POSIX_SIGNALS,
0153   RTEMS_SYSINIT_ORDER_MIDDLE
0154 );