[RTEMS Project] #2100: SIGFPE

RTEMS trac trac at rtems.org
Sun Nov 23 16:25:30 UTC 2014


#2100: SIGFPE
-----------------------------+----------------------------
 Reporter:  sebastian.huber  |       Owner:  joel.sherrill
     Type:  defect           |      Status:  new
 Priority:  normal           |   Milestone:  4.11
Component:  cpukit           |     Version:  HEAD
 Severity:  normal           |  Resolution:
 Keywords:                   |
-----------------------------+----------------------------

Old description:

> A GCC test uses the following mechanic:
>
> #include <assert.h>
> #include <stdlib.h>
> #include <signal.h>
> #include <pthread.h>
>
> void sigfpe(int signum)
> {
>         exit(0);
> }
>
> int main()
> {
>         signal(SIGFPE, sigfpe);
>
> #ifdef __rtems__
>         sigset_t set;
>         sigemptyset(&set);
>         sigaddset(&set, SIGFPE);
>         pthread_sigmask(SIG_UNBLOCK, &set, NULL);
> #endif
>
>         raise(SIGFPE);
>
>         assert(0);
> }
>
> The parts in the defined(__rtems__) section are necessary in RTEMS to get
> a behaviour similar to Linux.
>
> This is because RTEMS has a special treatment for some signals (in
> killinfo()):
>
>   /*
>    *  P1003.1c/Draft 10, p. 33 says that certain signals should always
>    *  be directed to the executing thread such as those caused by
> hardware
>    *  faults.
>    */
>   if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
>       return pthread_kill( pthread_self(), sig );
>
> We should evaluate if this works as intended.

New description:

 A GCC test uses the following mechanic:

 #include <assert.h>
 #include <stdlib.h>
 #include <signal.h>
 #include <pthread.h>

 void sigfpe(int signum)
 {
         exit(0);
 }

 int main()
 {
         signal(SIGFPE, sigfpe);

 #ifdef __rtems__
         sigset_t set;
         sigemptyset(&set);
         sigaddset(&set, SIGFPE);
         pthread_sigmask(SIG_UNBLOCK, &set, NULL);
 #endif

         raise(SIGFPE);

         assert(0);
 }

 The parts in the defined(__rtems__) section are necessary in RTEMS to get
 a behaviour similar to Linux.

 This is because RTEMS has a special treatment for some signals (in
 killinfo()):

   /*
    *  P1003.1c/Draft 10, p. 33 says that certain signals should always
    *  be directed to the executing thread such as those caused by hardware
    *  faults.
    */
   if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
       return pthread_kill( pthread_self(), sig );

 We should evaluate if this works as intended.

--

Comment (by joel.sherrill):

 What about the code in killinfo.c simply checking that it is inside an ISR
 before doing that test. What do you think Sebastian?

--
Ticket URL: <http://devel.rtems.org/ticket/2100#comment:2>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list