summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-06 09:25:23 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-24 13:44:30 +0100
commitfac5697318cb36135fc2df3dc3e0c2631983cd7a (patch)
tree7ff15d60e0b3aec651cad302955dab80f994664d
parentxilinx_zynq_a9_qemu: Avoid non-portable /dev/null (diff)
downloadrtems-testing-fac5697318cb36135fc2df3dc3e0c2631983cd7a.tar.bz2
gcc/rtems_gcc_main.c: Add signal() workaround
-rw-r--r--gcc/rtems_gcc_main.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/rtems_gcc_main.c b/gcc/rtems_gcc_main.c
index 6f56a11..b5b3d38 100644
--- a/gcc/rtems_gcc_main.c
+++ b/gcc/rtems_gcc_main.c
@@ -12,6 +12,7 @@
#include <bsp.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <pthread.h>
/*
* Set up first argument
@@ -22,8 +23,23 @@ static char *argv[20] = { arg0 };
int main(int argc, char **argv, char **environp);
+/*
+ * Tests like "gcc.c-torture/execute/20101011-1.c" use signal() and raise().
+ * RTEMS ignores signals installed via signal() by default. Enable SIGFPE for
+ * the initialization thread as a workaround.
+ */
+static void signal_workaround(void)
+{
+ sigset_t set;
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGFPE);
+ pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+}
+
rtems_task Init(rtems_task_argument ignored)
{
+ signal_workaround();
mkdir( "/tmp", 0777 );
main(argc, argv, NULL);
}