From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <48D6A80F.1080206@domain.hid> Date: Sun, 21 Sep 2008 22:01:19 +0200 From: Gilles Chanteperdrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Xenomai-core] Handle SIGILL when kernel compiled without Xenomai. List-Id: "Xenomai life and development \(bug reports, patches, discussions\)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai-core Hi, on some (all ?) platforms, we get a SIGILL when trying to emit the first Xenomai syscall, instead of the -ENOSYS return value. This patches handles the SIGILL by printing an error message and exiting. Index: include/asm-generic/bits/bind.h =================================================================== --- include/asm-generic/bits/bind.h (revision 4175) +++ include/asm-generic/bits/bind.h (working copy) @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,8 @@ __attribute__ ((weak)) pthread_key_t xeno_current_key; __attribute__ ((weak)) pthread_once_t xeno_init_current_key_once = PTHREAD_ONCE_INIT; +__attribute__ ((weak)) +jmp_buf xeno_sigill_jmpbuf; __attribute__ ((weak)) void xeno_set_current(void) @@ -99,13 +102,28 @@ static void unmap_sem_heap(unsigned long } #endif /* CONFIG_XENO_FASTSEM */ +void __attribute__((weak)) xeno_sigill_handler(int sig) +{ + siglongjmp(xeno_sigill_jmpbuf, 1); +} + static inline int xeno_bind_skin(unsigned skin_magic, const char *skin, const char *module) { + sighandler_t old_sigill_handler; struct sigaction sa; xnfeatinfo_t finfo; int muxid; + old_sigill_handler = signal(SIGILL, xeno_sigill_handler); + if (old_sigill_handler == SIG_ERR) { + perror("signal(SIGILL)"); + exit(1); + } + + if (sigsetjmp(xeno_sigill_jmpbuf, 1)) + goto enosys; + muxid = XENOMAI_SYSBIND(skin_magic, XENOMAI_FEAT_DEP, XENOMAI_ABI_REV, &finfo); switch (muxid) { @@ -126,7 +144,7 @@ xeno_bind_skin(unsigned skin_magic, cons case -ENOSYS: case -ESRCH: - + enosys: fprintf(stderr, "Xenomai: %s skin or CONFIG_XENO_OPT_PERVASIVE disabled.\n" "(modprobe %s?)\n", skin, module); @@ -139,6 +157,8 @@ xeno_bind_skin(unsigned skin_magic, cons exit(1); } + signal(SIGILL, old_sigill_handler); + #ifdef xeno_arch_features_check xeno_arch_features_check(); #endif /* xeno_arch_features_check */ @@ -180,9 +200,19 @@ xeno_bind_skin(unsigned skin_magic, cons static inline int xeno_bind_skin_opt(unsigned skin_magic, const char *skin, const char *module) { + sighandler_t old_sigill_handler; xnfeatinfo_t finfo; int muxid; + old_sigill_handler = signal(SIGILL, xeno_sigill_handler); + if (old_sigill_handler == SIG_ERR) { + perror("signal(SIGILL)"); + exit(1); + } + + if (sigsetjmp(xeno_sigill_jmpbuf, 1)) + goto enosys; + muxid = XENOMAI_SYSBIND(skin_magic, XENOMAI_FEAT_DEP, XENOMAI_ABI_REV, &finfo); switch (muxid) { @@ -203,7 +233,7 @@ xeno_bind_skin_opt(unsigned skin_magic, case -ENOSYS: case -ESRCH: - + enosys: return -1; } @@ -213,6 +243,8 @@ xeno_bind_skin_opt(unsigned skin_magic, exit(1); } + signal(SIGILL, old_sigill_handler); + #ifdef xeno_arch_features_check xeno_arch_features_check(); #endif /* xeno_arch_features_check */ -- Gilles.